ICU-8021 tag ICU tools for 4.6 release

X-SVN-Rev: 29133
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..14ce5af
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,140 @@
+* text=auto !eol
+
+*.c text !eol
+*.cc text !eol
+*.classpath text !eol
+*.cpp text !eol
+*.css text !eol
+*.dsp text !eol
+*.dsw text !eol
+*.filters text !eol
+*.h text !eol
+*.htm text !eol
+*.html text !eol
+*.in text !eol
+*.java text !eol
+*.launch text !eol
+*.mak text !eol
+*.md text !eol
+*.MF text !eol
+*.mk text !eol
+*.pl text !eol
+*.pm text !eol
+*.project text !eol
+*.properties text !eol
+*.py text !eol
+*.rc text !eol
+*.sh text eol=lf
+*.sln text !eol
+*.stub text !eol
+*.txt text !eol
+*.ucm text !eol
+*.vcproj text !eol
+*.vcxproj text !eol
+*.xml text !eol
+*.xsl text !eol
+*.xslt text !eol
+Makefile text !eol
+configure text !eol
+LICENSE text !eol
+README text !eol
+
+*.bin -text
+*.brk -text
+*.cnv -text
+*.icu -text
+*.res -text
+*.nrm -text
+*.spp -text
+*.tri2 -text
+
+multi/c/Makefile-c.inc -text
+multi/c/patch/3_0 -text
+multi/c/patch/3_2 -text
+multi/c/patch/3_4_1 -text
+multi/common/Makefile-multi.inc -text
+multi/j/Makefile-j.inc -text
+multi/proj/provider/Makefile.local-sample -text
+multi/proj/provider/icu-config.sed -text
+multi/proj/provider/readme.txt -text
+release/java/.classpath -text
+release/java/.project -text
+release/java/Makefile -text
+release/java/icu4c.css -text
+release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc_xml.xslt -text
+release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc_xml.xslt -text
+release/java/src/com/ibm/icu/dev/tools/docs/genreport_xml.xslt -text
+trac/IcuCodeTools/icucodetools/__init__.py -text
+trac/IcuCodeTools/icucodetools/dcut.py -text
+trac/IcuCodeTools/icucodetools/htdocs/css/icuxtn.css -text
+trac/IcuCodeTools/icucodetools/review.py -text
+trac/IcuCodeTools/icucodetools/templates/nothing.html -text
+trac/IcuCodeTools/icucodetools/templates/review.html -text
+trac/IcuCodeTools/icucodetools/ticketmgr.py -text
+trac/IcuCodeTools/icucodetools/tktlist.py -text
+trac/IcuCodeTools/license.html -text
+trac/IcuCodeTools/readme.txt -text
+trac/IcuCodeTools/setup.cfg -text
+trac/IcuCodeTools/setup.py -text
+unicodetools/com/ibm/rbm/docs/images/TitleLogo_transparent.gif -text
+unicodetools/com/ibm/rbm/docs/images/arrow_bullet.gif -text
+unicodetools/com/ibm/rbm/docs/images/diamond_bullet.gif -text
+unicodetools/com/ibm/rbm/docs/images/ibm_logo_small_white.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/RBReporter.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/basic_file.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/basic_group.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/basic_resource.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/basic_translation.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/basic_untranslated.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/create_group.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/empty_group.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/empty_resource.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/empty_screen.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/empty_with_preferences.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/laf_metal.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/laf_motif.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/laf_windows.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/lookup_resource.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/main_page.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_export.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_import.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_help.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_options.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/menu_popup_tree.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/new_baseclass.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/new_bundle.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/preferences_dialog.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_bundle.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_file.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_search.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_bundle.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_file.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_tree_basic.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_bundle.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_dialog0.gif -text
+unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_file.gif -text
+unicodetools/com/ibm/rbm/docs/images/spacer.gif -text
+unicodetools/com/ibm/rbm/docs/images/template_l.gif -text
+unicodetools/com/ibm/rbm/docs/images/template_line.gif -text
+unicodetools/com/ibm/rbm/docs/images/template_ll.gif -text
+unicodetools/com/ibm/rbm/docs/images/template_u.gif -text
+unicodetools/com/ibm/rbm/docs/images/template_ul.gif -text
+unicodetools/com/ibm/rbm/gui/images/TitleLogo_transparent.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_bundle.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_country.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_file.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_group.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_item.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_language.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_project.gif -text
+unicodetools/com/ibm/rbm/gui/images/tree_icon_variant.gif -text
+
+# The following file types are stored in Git-LFS.
+*.jar filter=lfs diff=lfs merge=lfs -text
+*.dat filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.gz filter=lfs diff=lfs merge=lfs -text
+*.bz2 filter=lfs diff=lfs merge=lfs -text
+*.gif filter=lfs diff=lfs merge=lfs -text
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e5fb71
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,118 @@
+multi/c/Makefile.local
+multi/packages/*.jar
+multi/packages/*.tgz
+multi/proj/chello/out
+multi/proj/provider/Makefile.local
+multi/proj/provider/out
+multi/tmp
+release/java/APIChangeReport*
+release/java/Makefile.local
+release/java/classes
+release/java/lib
+release/java/src/com/ibm/icu/dev/tools/misc/*.class
+trac/IcuCodeTools/*.egg-info
+trac/IcuCodeTools/build
+trac/IcuCodeTools/icucodetools/*.pyc
+unicode/c/genbidi/*.d
+unicode/c/genbidi/*.o
+unicode/c/genbidi/*.pdb
+unicode/c/genbidi/*.plg
+unicode/c/genbidi/Debug
+unicode/c/genbidi/Makefile
+unicode/c/genbidi/Release
+unicode/c/genbidi/debug
+unicode/c/genbidi/genbidi
+unicode/c/genbidi/genbidi.[0-9]
+unicode/c/genbidi/genbidi.vcproj.*.*.user
+unicode/c/genbidi/release
+unicode/c/genbidi/x64
+unicode/c/genbidi/x86
+unicode/c/gencase/*.d
+unicode/c/gencase/*.ncb
+unicode/c/gencase/*.o
+unicode/c/gencase/*.opt
+unicode/c/gencase/*.pdb
+unicode/c/gencase/*.plg
+unicode/c/gencase/Debug
+unicode/c/gencase/Makefile
+unicode/c/gencase/Release
+unicode/c/gencase/debug
+unicode/c/gencase/gencase
+unicode/c/gencase/gencase.[0-9]
+unicode/c/gencase/gencase.vcproj.*.*.user
+unicode/c/gencase/release
+unicode/c/gencase/x64
+unicode/c/gencase/x86
+unicode/c/gennames/*.d
+unicode/c/gennames/*.ncb
+unicode/c/gennames/*.o
+unicode/c/gennames/*.opt
+unicode/c/gennames/*.pdb
+unicode/c/gennames/*.plg
+unicode/c/gennames/Debug
+unicode/c/gennames/Makefile
+unicode/c/gennames/Release
+unicode/c/gennames/debug
+unicode/c/gennames/gennames
+unicode/c/gennames/gennames.[0-9]
+unicode/c/gennames/gennames.vcproj.*.*.user
+unicode/c/gennames/release
+unicode/c/gennames/x64
+unicode/c/gennames/x86
+unicode/c/gennorm/*.d
+unicode/c/gennorm/*.o
+unicode/c/gennorm/*.pdb
+unicode/c/gennorm/*.plg
+unicode/c/gennorm/Debug
+unicode/c/gennorm/Makefile
+unicode/c/gennorm/Release
+unicode/c/gennorm/debug
+unicode/c/gennorm/gennorm
+unicode/c/gennorm/gennorm.[0-9]
+unicode/c/gennorm/gennorm.vcproj.*.*.user
+unicode/c/gennorm/release
+unicode/c/gennorm/x64
+unicode/c/gennorm/x86
+unicode/c/genpname/*.d
+unicode/c/genpname/*.o
+unicode/c/genpname/*.pdb
+unicode/c/genpname/*.plg
+unicode/c/genpname/Debug
+unicode/c/genpname/Makefile
+unicode/c/genpname/Release
+unicode/c/genpname/debug
+unicode/c/genpname/genpname
+unicode/c/genpname/genpname.vcproj.*.*.user
+unicode/c/genpname/release
+unicode/c/genpname/x64
+unicode/c/genpname/x86
+unicode/c/genprops/*.d
+unicode/c/genprops/*.ncb
+unicode/c/genprops/*.o
+unicode/c/genprops/*.opt
+unicode/c/genprops/*.pdb
+unicode/c/genprops/*.plg
+unicode/c/genprops/Debug
+unicode/c/genprops/Makefile
+unicode/c/genprops/Release
+unicode/c/genprops/debug
+unicode/c/genprops/genprops
+unicode/c/genprops/genprops.[0-9]
+unicode/c/genprops/genprops.vcproj.*.*.user
+unicode/c/genprops/release
+unicode/c/genprops/x64
+unicode/c/genprops/x86
+unicode/c/genuca/*.d
+unicode/c/genuca/*.o
+unicode/c/genuca/*.pdb
+unicode/c/genuca/Debug
+unicode/c/genuca/Makefile
+unicode/c/genuca/Release
+unicode/c/genuca/debug
+unicode/c/genuca/genuca
+unicode/c/genuca/genuca.8
+unicode/c/genuca/genuca.vcproj.*.*.user
+unicode/c/genuca/release
+unicode/c/genuca/x64
+unicode/c/genuca/x86
+unicodetools/com/ibm/rbm/lib
diff --git a/colprobe/Makefile.in b/colprobe/Makefile.in
new file mode 100644
index 0000000..c6beffd
--- /dev/null
+++ b/colprobe/Makefile.in
@@ -0,0 +1,81 @@
+## Makefile.in for ICU - extra/colprobe
+## Copyright (c) 2001, International Business Machines Corporation and
+## others. All Rights Reserved.
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = extra/colprobe
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS)
+
+## Target information
+TARGET = colprobe 
+LONGNAME = longname
+
+CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/io
+LIBS = $(LIBICUI18N) $(LIBICUUC) $(LIBUSTDIO) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = colprobeNew.o line.o sortedlines.o strengthprobe.o uprinter.o 
+LONGNAME_OBJ = longname.o
+
+DEPS = $(OBJECTS:.o=.d)
+LONGNAME_DEPS = $(LONGNAME_OBJ:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET)
+
+install-local:
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(OBJECTS) $(TARGET)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) -o $@ $^ $(LIBS)
+
+$(LONGNAME) : $(LONGNAME_OBJ)
+	$(LINK.cc) -o $@ $^ $(LIBS)
+
+invoke:
+	ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION)
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
diff --git a/colprobe/colprobe.cpp b/colprobe/colprobe.cpp
new file mode 100644
index 0000000..d1751be
--- /dev/null
+++ b/colprobe/colprobe.cpp
@@ -0,0 +1,1730 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File colprobe.cpp
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+#include "uoptions.h"
+#include "unicode/ucol.h"
+#include "unicode/ucoleitr.h"
+#include "unicode/ures.h"
+#include "unicode/uniset.h"
+#include "unicode/usetiter.h"
+#include "unicode/ustring.h"
+#include "unicode/uchar.h"
+#include "unicode/uscript.h"
+#include "uprops.h"
+#include "hash.h"
+#include "ucol_imp.h"
+
+#include "unicode/ustdio.h"
+#include "unicode/utrans.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <io.h>
+#include <fcntl.h>
+
+#include "colprobe.h"
+
+
+#ifdef WIN32
+#include <windows.h>
+#else
+//
+//  Stubs for Windows API functions when building on UNIXes.
+//
+typedef int DWORD;
+inline int CompareStringW(DWORD, DWORD, UChar *, int, UChar *, int) {return 0;};
+#include <sys/time.h>
+unsigned long timeGetTime() {
+    struct timeval t;
+    gettimeofday(&t, 0);
+    unsigned long val = t.tv_sec * 1000;  // Let it overflow.  Who cares.
+    val += t.tv_usec / 1000;
+    return val;
+};
+inline int LCMapStringW(DWORD, DWORD, UChar *, int, UChar *, int) {return 0;};
+const int LCMAP_SORTKEY = 0;
+#define MAKELCID(a,b) 0
+const int SORT_DEFAULT = 0;
+#endif
+
+#include "line.h"
+
+static UBool gVerbose = FALSE;
+static UBool gDebug = FALSE;
+static UBool gQuiet = FALSE;
+static UBool gExemplar = FALSE;
+
+DWORD          gWinLCID;
+int            gCount;
+Line          **gICULines;
+UCollator     *gCol;
+UCollator     *gUCA;
+Line          source;
+Line          target;
+Line          *gSource = &source;
+Line          *gTarget = &target;
+Hashtable     gElements(FALSE);
+Hashtable     gExpansions(FALSE);
+CompareFn gComparer;
+
+const UChar separatorChar = 0x0030;
+
+UFILE *out = NULL;
+UFILE *err = NULL;
+UFILE *log = NULL; 
+
+const char *progName = "colprobe";
+
+const char *gLocale = NULL;
+//char platform[256];
+int32_t platformIndex = -1;
+int32_t gPlatformNo = 0;
+int32_t gPlatformIndexes[10];
+int32_t gLocaleNo = 0;
+const char* gLocales[100];
+UBool gRulesStdin = FALSE;
+
+enum {
+  HELP1,
+    HELP2,
+    VERBOSE,
+    QUIET,
+    VERSION,
+    ICUDATADIR,
+    COPYRIGHT,
+    LOCALE,
+    PLATFORM,
+    DEBUG, 
+    EXEMPLAR,
+    RULESSTDIN
+};
+
+UOption options[]={
+  /*0*/ UOPTION_HELP_H,
+  /*1*/ UOPTION_HELP_QUESTION_MARK,
+  /*2*/ UOPTION_VERBOSE,
+  /*3*/ UOPTION_QUIET,
+  /*4*/ UOPTION_VERSION,
+  /*5*/ UOPTION_ICUDATADIR,
+  /*6*/ UOPTION_COPYRIGHT,
+  /*7*/ UOPTION_DEF("locale", 'l', UOPT_REQUIRES_ARG),
+  /*8*/ UOPTION_DEF("platform", 'p', UOPT_REQUIRES_ARG),
+  /*9*/ UOPTION_DEF("debug", 'D', UOPT_NO_ARG),
+  /*10*/ UOPTION_DEF("exemplar", 'E', UOPT_NO_ARG),
+  /*11*/ UOPTION_DEF("rulesstdin", 'R', UOPT_NO_ARG)
+};
+
+int Winstrcmp(const void *a, const void *b) {
+    gCount++;
+    int t;
+    t = CompareStringW(gWinLCID, 0, 
+      (*(Line **)a)->name, (*(Line **)a)->len, 
+      (*(Line **)b)->name, (*(Line **)b)->len);
+    return t-2;
+}
+
+int ICUstrcmp(const void *a, const void *b) {
+    gCount++;
+    UCollationResult t;
+    t = ucol_strcoll(gCol, 
+      (*(Line **)a)->name, (*(Line **)a)->len,  
+      (*(Line **)b)->name, (*(Line **)b)->len);
+    if (t == UCOL_LESS) return -1;
+    if (t == UCOL_GREATER) return +1;
+    return 0;
+}
+
+struct {
+  const char* name;
+  CompareFn comparer;
+} platforms[] = {
+  { "icu", ICUstrcmp },
+  { "win", Winstrcmp}
+};
+
+
+void deleteLineElement(void *line) {
+  delete((Line *)line);
+}
+
+void stringToLower(char *string) {
+  uint32_t i = 0;
+  for(i = 0; i < strlen(string); i++) {
+    string[i] = tolower(string[i]);
+  }
+}
+
+void usage(const char *name) {
+  u_fprintf(out, "Usage: %s --locale loc_name --platform platform\n", name);
+}
+
+void listKnownPlatforms() {
+  int32_t i = 0;
+  u_fprintf(err, "Known platforms:\n");
+  for(i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
+    u_fprintf(err, "\t%s\n", platforms[i]);
+  }
+}
+
+void addPlatform(const char *platform) {
+  int32_t i;
+  //stringToLower(platform);
+  int32_t oldPlatformNo = gPlatformNo;
+
+  for(i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
+    if(strcmp(platform, platforms[i].name) == 0) {
+      gPlatformIndexes[gPlatformNo++] = i;
+    }
+  }
+  if(gPlatformNo == oldPlatformNo) {
+    u_fprintf(err, "Unknown platform %s\n", platform);
+    listKnownPlatforms();
+  }
+}
+
+void processArgs(int argc, char* argv[], UErrorCode &status)
+{
+  int32_t i = 0;
+  U_MAIN_INIT_ARGS(argc, argv);
+
+  argc = u_parseArgs(argc, argv, (int32_t)(sizeof(options)/sizeof(options[0])), options);
+
+  if(argc < 0) {
+    u_fprintf(err, "Unknown option: %s\n", argv[-argc]);
+    usage(progName);
+    return;
+  }
+
+  if(options[0].doesOccur || options[1].doesOccur) {
+    usage(progName);
+    return;
+  }
+  if(options[VERBOSE].doesOccur) {
+    gVerbose = TRUE;
+  }
+  if(options[DEBUG].doesOccur) {
+    gDebug = TRUE;
+    gVerbose = TRUE;
+  }
+  if(options[EXEMPLAR].doesOccur) {
+    gExemplar = TRUE;
+  }
+  if(options[QUIET].doesOccur) {
+    gQuiet = TRUE;
+  }
+/*
+  for(i = 8; i < 9; i++) {
+    if(!options[i].doesOccur) {
+      u_fprintf(err, "Option %s is required!\n", options[i].longName);
+      usage(progName);
+      status = U_ILLEGAL_ARGUMENT_ERROR;
+    }
+    if(options[i].value == NULL) {
+      u_fprintf(err, "Option %s needs an argument!\n", options[i].longName);
+      usage(progName);
+      status = U_ILLEGAL_ARGUMENT_ERROR;
+    }
+  }
+*/
+  // ASCII based options specified on the command line
+  // this is for testing purposes, will allow to load
+  // up ICU rules and then poke through them.
+  // In that case, we test only ICU and don't need 
+  // a locale.
+  if(options[RULESSTDIN].doesOccur) {
+    gRulesStdin = TRUE;
+    addPlatform("icu");
+    return;
+  } 
+
+  if(options[LOCALE].doesOccur) {
+    gLocale = options[LOCALE].value;
+  } else {
+    for(i = 1; i < argc; i++) {
+      gLocales[gLocaleNo++] = argv[i];
+    }
+  }
+  if(options[PLATFORM].doesOccur) {
+    //strcpy(platform, options[PLATFORM].value);
+    //addPlatform("icu");
+    addPlatform(options[PLATFORM].value);
+  } else { // there is a list of platforms 
+    u_fprintf(err, "Option %s is required!\n", options[i].longName);
+    usage(progName);
+    status = U_ILLEGAL_ARGUMENT_ERROR;
+  }
+
+  //
+  //  Set up a Windows LCID
+  //
+  gWinLCID = uloc_getLCID(gLocale);
+  /*
+  if (gLocale != 0) {
+      gWinLCID = MAKELCID(gLocale, SORT_DEFAULT);
+  }
+  else {
+      gWinLCID = uloc_getLCID(gLocale);
+  }
+  */
+
+}
+
+void printRules(const UChar *name, int32_t len, UFILE *file) {
+  // very rudimentary pretty rules print
+  int32_t i = 0;
+  UChar toPrint[16384];
+  int32_t toPrintIndex = 0;
+  for(i = 0; i < len; i++) {
+    if(name[i] == 0x0026) {
+      if(toPrintIndex) {
+        toPrint[toPrintIndex] = 0;
+        u_fprintf(file, "%U\n", toPrint);
+        toPrintIndex = 0;
+        toPrint[toPrintIndex++] = name[i];
+      } else {
+        toPrint[toPrintIndex++] = name[i];
+      } 
+    } else {
+      toPrint[toPrintIndex++] = name[i];
+    }
+  }
+  if(toPrintIndex) {
+    toPrint[toPrintIndex] = 0;
+    u_fprintf(file, "%U\n", toPrint);
+    toPrintIndex = 0;
+  }
+
+
+}
+
+void escapeString(const UChar *name, int32_t len, UFILE *file) {
+  u_fprintf(file, "%U", name);
+/*
+  int32_t j = 0;
+  for(j = 0; j < len; j++) {
+    if(name[j] >= 0x20 && name[j] < 0x80) {
+      u_fprintf(file, "%c", name[j]);
+    } else {
+      u_fprintf(file, "\\u%04X", name[j]);
+    }
+  }
+*/
+}
+void escapeALine(Line *line, UFILE *file) {
+  escapeString(line->name, line->len, file);
+}
+
+void escapeExpansion(Line *line, UFILE *file) {
+  escapeString(line->expansionString, line->expLen, file);
+}
+
+void showNames(Line *line, UFILE *file) {
+  UErrorCode status = U_ZERO_ERROR;
+  int32_t j = 0;
+  char charName[256];
+  for(j = 0; j < line->len; j++) {
+    u_charName(line->name[j], U_EXTENDED_CHAR_NAME, charName, 256, &status);
+    u_fprintf(file, "%s ", charName);
+  }
+}
+
+void setArray(Line **array, Line *contents, int32_t size) {
+  int32_t i = 0;
+  for(i = 0; i < size; i++) {
+    array[i] = contents+i;
+  }
+}
+
+// set an array from a Hashtable
+int32_t 
+setArray(Line **array, Hashtable *table = &gElements) {
+  int32_t size = table->count();
+  int32_t hashIndex = -1;
+  const UHashElement *hashElement = NULL;
+  int32_t count = 0;
+  while((hashElement = table->nextElement(hashIndex)) != NULL) {
+    array[count++] = (Line *)hashElement->value.pointer;
+  }
+  return size;
+}
+
+UBool trySwamped(Line **smaller, Line **greater, UChar chars[2], CompareFn comparer) {
+  u_strcpy(gSource->name, (*smaller)->name);
+  gSource->name[(*smaller)->len] = separatorChar;
+  gSource->name[(*smaller)->len+1] = chars[0];
+  gSource->name[(*smaller)->len+2] = 0;
+  gSource->len = (*smaller)->len+2;
+
+  u_strcpy(gTarget->name, (*greater)->name);
+  gTarget->name[(*greater)->len] = separatorChar;
+  gTarget->name[(*greater)->len+1] = chars[1];
+  gTarget->name[(*greater)->len+2] = 0;
+  gTarget->len = (*greater)->len+2;
+
+  if(comparer(&gSource, &gTarget) > 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UBool trySwamps(Line **smaller, Line **greater, UChar chars[2], CompareFn comparer) {
+  gSource->name[0] = chars[0];
+  gSource->name[1] = separatorChar;
+  u_strcpy(gSource->name+2, (*smaller)->name);
+  gSource->len = (*smaller)->len+2;
+
+  gTarget->name[0] = chars[1];
+  gTarget->name[1] = separatorChar;
+  u_strcpy(gTarget->name+2, (*greater)->name);
+  gTarget->len = (*greater)->len+2;
+
+  if(comparer(&gSource, &gTarget) < 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UColAttributeValue 
+probeStrength(Line** prevLine, Line **currLine, CompareFn comparer) {
+  // Primary swamps secondary
+  // have pairs where [0] 2> [1]
+  UChar primSwamps[][2] = {
+    { 0x00E0, 0x0061 },
+    { 0x0450, 0x0435 },
+    { 0x31a3, 0x310d }
+  };
+  // Secondary swamps tertiary
+  // have pairs where [0] 3> [1]
+  UChar secSwamps[][2] = {
+    { 0x0053, 0x0073 },
+    { 0x0415, 0x0435 },
+    { 0x31b6, 0x310e }
+  };
+  // Secondary is swamped by primary
+  // have pairs where [0] 1> [1]
+  UChar secSwamped[][2] = {
+    { 0x0062, 0x0061 },
+    { 0x0436, 0x0454 },
+    { 0x310e, 0x310d }
+  };
+  // Tertiary is swamped by secondary
+  // have pairs where [0] 2> [1]
+  UChar terSwamped[][2] = {
+    { 0x00E0, 0x0061 },
+    { 0x0450, 0x0435 },
+    { 0x31a3, 0x310d }
+  };
+  int32_t i = 0;
+  // Tertiary swamps equal?
+  int result = 0;
+  // Choose the pair
+  i = 0;
+  /*
+  if((*prevLine)->name[0] > 0xFF && (*currLine)->name[0] > 0xFF) {
+    i = 0;
+  } else if((*prevLine)->name[0] < 0x0400 && (*currLine)->name[0] < 0x0400) {
+    i = 1;
+  } else {
+    i = 2;
+  }
+  */
+  // are they equal?
+  if((result = comparer(prevLine, currLine)) == 0) {
+    return UCOL_IDENTICAL;
+  } else if(result > 0) {
+    //fprintf(stderr, "lines should be ordered!");
+    return UCOL_OFF;
+  } else if(trySwamps(prevLine, currLine, primSwamps[i], comparer)) {
+    return UCOL_PRIMARY;
+  } else if(trySwamps(prevLine, currLine, secSwamps[i], comparer)) {
+    return UCOL_SECONDARY;
+  } else if(trySwamped(prevLine, currLine, terSwamped[i], comparer)) {
+    // is there a tertiary difference
+    return UCOL_TERTIARY;
+  } else {
+    //fprintf(stderr, "Unknown strength!\n");
+    return UCOL_ON;
+  }
+}
+
+// This function tries to probe the set of lines 
+// (already sorted by qsort) and deduct the strengths
+void 
+analyzeStrength(Line **lines, int32_t size, CompareFn comparer) {
+  int32_t i = 0;
+
+  for(i = 1; i < size; i++) {
+    Line **prevLine = lines+i-1;
+    Line **currLine = lines+i;
+    (*currLine)->strength = probeStrength(prevLine, currLine, comparer);
+    (*currLine)->sortedIndex = i;
+    (*currLine)->previous = *prevLine;
+    (*prevLine)->next = *currLine;
+
+  }
+
+}
+
+void printStrength(UColAttributeValue strength, UFILE *file) {
+  u_fprintf(file, " ");
+  switch(strength) {
+  case UCOL_IDENTICAL:
+    u_fprintf(file, "=");
+    break;
+  case UCOL_TERTIARY:
+    //u_fprintf(file, "<3");
+    u_fprintf(file, "<<<");
+    break;
+  case UCOL_SECONDARY:
+    //u_fprintf(file, "<2");
+    u_fprintf(file, "<<");
+    break;
+  case UCOL_PRIMARY:
+    //u_fprintf(file, "<1");
+    u_fprintf(file, "<");
+    break;
+  case UCOL_OFF:
+    u_fprintf(file, ">?");
+  default:
+    u_fprintf(file, "?!");
+    break;
+  }
+  u_fprintf(file, " ");
+}
+
+void printStrength(Line *line, UFILE *file) {
+  printStrength(line->strength, file);
+}
+
+void printLine(Line *line, UFILE *file) {
+  escapeALine(line, file);
+  if(line->isExpansion) {
+    u_fprintf(file, "/");
+    escapeExpansion(line, file);
+  }
+}
+
+void printOrdering(Line **lines, int32_t size, UFILE *file, UBool useLinks = FALSE) {
+  int32_t i = 0;
+
+  //printLine(*lines);
+  //escapeALine(*lines); // Print first line
+
+  Line *line = NULL;
+  Line *previous = *lines;
+  if(previous->isReset) {
+    u_fprintf(file, "\n& ");
+    escapeALine(previous, file);
+  } else if(!previous->isRemoved) {
+    printLine(previous, file);
+  }
+  i = 1;
+  while(i < size && previous->next) {
+    if(useLinks) {
+      line = previous->next;
+    } else {
+      line = *(lines+i);
+    }
+    if(line->isReset) {
+      u_fprintf(file, "\n& ");
+      escapeALine(line, file);
+    } else if(!line->isRemoved) {
+      if(file == out) {
+        u_fprintf(file, "\n");
+      }
+      if(i > 0) {
+        printStrength(line, file);
+      }
+      printLine(line, file);
+      //escapeALine(line, file);
+    }
+    previous = line;
+    i++;
+  }
+  u_fprintf(file, "\n");
+}
+
+
+void setIndexes(Line **lines, int32_t size) {
+  int32_t i = 0;
+  (*lines)->sortedIndex = 0;
+  for(i = 1; i < size; i++) {
+    Line *line = *(lines+i);
+    Line *prev = *(lines+i-1);
+    line->previous = prev;
+    prev->next = line;
+    line->sortedIndex = i;
+  }
+}
+
+
+// this seems to be a dead end
+void
+noteExpansion(Line **gLines, Line *line, int32_t size, CompareFn comparer) {
+  UErrorCode status = U_ZERO_ERROR;
+
+  UnicodeString key(line->name, line->len);
+  //Line *toInsert = (Line *)gElements.get(key);
+  Line *toInsert = (Line *)gExpansions.get(key);
+  if(toInsert != NULL) {
+    toInsert->isExpansion = TRUE;
+    u_strcpy(toInsert->expansionString, line->expansionString);
+    toInsert->expLen = line->expLen;
+    toInsert->previous->next = toInsert->next;
+    toInsert->next->previous = toInsert->previous;
+    gElements.remove(key);
+  } else {
+    toInsert = new Line(*line); 
+    toInsert->isExpansion = TRUE;
+    gElements.put(UnicodeString(toInsert->name, toInsert->len), toInsert, status);
+  }
+
+  int32_t i = 0;
+  Line testLine;
+  Line *l = &testLine;
+  for(i = 0; i < size; i++) {
+    u_strcpy(testLine.name, (*(gLines+i))->name);
+    u_strcat(testLine.name, line->expansionString);
+    testLine.len = (*(gLines+i))->len + line->expLen;
+    if(comparer(&l, &line) > 0) {
+      toInsert->previous = *(gLines+i-1);
+      toInsert->next = *(gLines+i);
+      toInsert->previous->next = toInsert;
+      toInsert->next->previous = toInsert;
+      break;
+    }
+  }
+  if(gVerbose) {
+    u_fprintf(log, "Adding expansion\n");
+    escapeALine(line, log);
+    u_fprintf(log, "/");
+    escapeExpansion(line, log);
+    u_fprintf(log, " ");
+  }
+}
+
+void
+positionExpansions(Line **gLines, int32_t size, CompareFn comparer) {
+  int result = 0;
+  Line *line = NULL;
+  Line *toMove = NULL;
+  int32_t i = 0, j = 0;
+  Line **sortedExpansions = new Line*[gExpansions.count()];
+  int32_t sortedExpansionsSize = setArray(sortedExpansions, &gExpansions);
+  qsort(sortedExpansions, sortedExpansionsSize, sizeof(Line *), comparer);
+  // Make a list of things in the vincinity of expansion candidate
+  for(j = 0; j < sortedExpansionsSize; j++) {
+    line = *(sortedExpansions+j);
+    UnicodeString key(line->name, line->len);
+    toMove = (Line *)gElements.get(key);
+    int32_t i = 0;
+    Line testLine, prevTestLine;
+    Line *l = &testLine;
+    Line *prevL = &prevTestLine;
+    // This can be further optimized, since we now know that we have a 
+    // sorted list of expansions, so current can start from toMove, since all
+    // the elements before it are already smaller. In the beggining it needs to 
+    // be on gLines, though.
+    Line *current = *gLines;
+    while(current) {
+      if(current == toMove) {
+        // we are wading through a sorted list
+        // if we found ourselves, it means that we 
+        // are already in a right place, so no moving
+        // is needed, but we need to make sure we have
+        // the right strength.
+        toMove->strength = probeStrength(&prevL, &toMove, comparer);
+        if(0) {
+          u_fprintf(log, "Positioned expansion without moving ");
+          printLine(toMove, log);
+          u_fprintf(log, " new ordering: \n");
+          printOrdering(gLines, size, log, TRUE);
+        }
+        break;
+      } else {
+        u_strcpy(testLine.name, current->name);
+        if(!current->isExpansion) {
+          u_strcat(testLine.name, line->expansionString);
+          testLine.len = current->len + line->expLen;
+        } else {
+          testLine.len = current->len;
+        }
+        if(comparer(&l, &line) > 0) {
+          // remove from chain
+          if(toMove->next) {
+            toMove->next->strength = probeStrength(&(toMove->previous), &(toMove->next), comparer);
+            toMove->next->previous = toMove->previous;
+          }
+          if(toMove->previous) {
+            toMove->previous->next = toMove->next;
+          }
+
+          // insert
+          toMove->previous = current->previous;
+          toMove->next = current;
+
+          if(current->previous) {
+            current->previous->next = toMove;
+          }
+          current->previous = toMove;
+
+          toMove->strength = probeStrength(&prevL, &toMove, comparer);
+          toMove->next->strength = probeStrength(&toMove, &l, comparer);
+          if(0) {
+            u_fprintf(log, "Positioned expansion ");
+            printLine(toMove, log);
+            u_fprintf(log, " new ordering: \n");
+            printOrdering(gLines, size, log, TRUE);
+          }
+          if(toMove->strength == UCOL_IDENTICAL) {
+            // check for craziness such as s = ss/s
+            // such line would consist of previous (or next) concatenated with the expansion value
+            // make a test
+            UChar fullString[256];
+            u_strcpy(fullString, toMove->previous->name);
+            u_strcat(fullString, toMove->expansionString);
+            if(u_strcmp(fullString, toMove->name) == 0) {
+              toMove->previous->next = toMove->next;
+              toMove->next->previous = toMove->previous;
+              toMove->isRemoved = TRUE;
+              u_fprintf(log, "Removed: ");
+              printLine(toMove, log);
+              u_fprintf(log, "\n");
+            } 
+          } else if(toMove->next->strength == UCOL_IDENTICAL) {
+            UChar fullString[256];
+            u_strcpy(fullString, toMove->next->name);
+            u_strcat(fullString, toMove->expansionString);
+            if(u_strcmp(fullString, toMove->name) == 0) {
+              toMove->next->strength = toMove->strength;
+              toMove->previous->next = toMove->next;
+              toMove->next->previous = toMove->previous;
+              toMove->isRemoved = TRUE;
+              u_fprintf(log, "Removed because of back: ");
+              printLine(toMove, log);
+              u_fprintf(log, "\n");
+            } 
+          }
+          break;
+        }
+        prevTestLine = testLine;
+      }
+      current = current->next;
+    }
+  }
+  delete[] sortedExpansions;
+}
+
+
+void
+noteExpansion(Line *line) {
+  UErrorCode status = U_ZERO_ERROR;
+  UnicodeString key(line->name, line->len);
+  Line *el = (Line *)gElements.get(key);
+  if(el != NULL) {
+    el->isExpansion = TRUE;
+    u_strcpy(el->expansionString, line->expansionString);
+    el->expLen = line->expLen;
+  } else {
+    Line *toInsert = new Line(*line); 
+    toInsert->isExpansion = TRUE;
+    gElements.put(UnicodeString(line->name, line->len), toInsert, status);
+  }
+
+  Line *el2 = (Line *)gExpansions.get(key);
+  el2->isExpansion = TRUE;
+  u_strcpy(el2->expansionString, line->expansionString);
+  el2->expLen = line->expLen;
+
+  if(gDebug) {
+    u_fprintf(log, "Adding expansion\n");
+    printLine(line, log);
+    u_fprintf(log, "\n");
+  }
+}
+
+void 
+noteContraction(Line *line) {
+  UErrorCode status = U_ZERO_ERROR;
+  Line *toInsert = new Line(*line); 
+  toInsert->isContraction = TRUE;
+  gElements.put(UnicodeString(line->name, line->len), toInsert, status);
+  if(gVerbose) {
+    u_fprintf(log, "Adding contraction\n");
+    escapeALine(line, log);
+    u_fprintf(log, " ");
+  }
+}
+
+void
+noteElement(Line *line) {
+  UErrorCode status = U_ZERO_ERROR;
+  Line *toInsert = new Line(*line);
+  gElements.put(UnicodeString(line->name, line->len), toInsert, status);
+  if(0) { //if(gDebug) 
+    escapeALine(line, log);
+    u_fprintf(log, " ");
+  }
+}
+
+
+
+// This function checks if a combination of characters has changed place with the 
+// adjacent elements. If so, these are most probably contractions.
+// However, it still needs to be checked if these contractions are fake - the 
+// test is simple - if xy is suspected contraction, if we get that x/y is expansion, then
+// xy is a fake contraction.
+int32_t 
+analyzeContractions(Line** lines, int32_t size, CompareFn comparer) {
+  int32_t i = 0, j = 0;
+  int32_t outOfOrder = 0;
+  UColAttributeValue strength = UCOL_OFF;
+  UColAttributeValue currStrength = UCOL_OFF;
+  Line **prevLine = lines;
+  Line **currLine = NULL;
+  Line **backupLine = NULL;
+  UBool prevIsContraction = FALSE, currIsContraction = FALSE;
+  // Problem here is detecting a contraction that is at the very end of the sorted list
+  for(i = 1; i < size; i++) {
+    currLine = lines+i;
+    strength = probeStrength(prevLine, currLine, comparer);
+    if(strength == UCOL_OFF || strength != (*currLine)->strength) {
+      prevIsContraction = FALSE;
+      currIsContraction = FALSE;
+      if(!outOfOrder) {
+        if(gVerbose) {
+          u_fprintf(log, "Possible contractions: ");
+        }
+      }
+      // now we have two elements that are different. The question is, 
+      // which one of them is the contraction - which one has moved. 
+      // Could be the previous, but could also be the current.
+
+      outOfOrder++;
+
+      // First, lets check whether the previous has jumped back
+      j = i+1;
+      // skip all the nexts that have smaller strength, they don't have an effect
+      while(j < size && (*(lines+j))->strength > (*currLine)->strength) {
+        j++;
+      }
+      // check if there are other elements of same or greater strength
+      while(j < size && 
+        (strength = probeStrength(prevLine, (backupLine = lines+j), comparer)) == UCOL_OFF) {
+        j++;
+        // if we skipped more than one, it might be in fact a contraction
+        prevIsContraction = TRUE;
+      }
+      if(prevIsContraction) {
+        noteContraction(*prevLine);
+        j = i-2;
+        // add all the previous elements with smaller strength, since they also
+        // will jump over and are contractions
+        while(j >= 0 && (*(lines+j+1))->strength > (*currLine)->strength) {
+          strength = probeStrength(lines+j, currLine, comparer);
+          if(strength == UCOL_OFF) {
+            noteContraction(*(lines+j));
+          }
+          j--;
+        }
+      }
+
+      // now we check if the current element is jumping forward,
+      // the dance steps are analogous to above.
+      j = i - 2;
+      while(j >= 0 && (*(lines+j+1))->strength > (*currLine)->strength) {
+        j--;
+      }
+      while(j >= 0 && 
+        (strength = probeStrength((backupLine = lines+j), currLine, comparer)) == UCOL_OFF) {
+        j--;
+        currIsContraction = TRUE;
+      }
+      if(currIsContraction) {
+        if(gVerbose) {
+          escapeALine(*currLine, log);
+          u_fprintf(log, " ");
+        }
+        j = i+1;
+        while(j < size && (*(lines+j))->strength > (*currLine)->strength) {
+          strength = probeStrength(prevLine, lines+j, comparer);
+          if(strength == UCOL_OFF) {
+            noteContraction(*(lines+j));
+          }
+          j++;
+        }
+      }
+
+      // Not sure about either. List both and then check
+      if(!(prevIsContraction || currIsContraction)) {
+        noteContraction(*prevLine);
+        noteContraction(*currLine);
+      }
+    }
+    prevLine = currLine;
+  }
+  if(outOfOrder) {
+    if(gVerbose) {
+      u_fprintf(log, "\n");
+    }
+  }
+  return outOfOrder;
+}
+
+int32_t
+detectContractions(Line **gLines, Line *lines, int32_t size, CompareFn comparer) {
+  int32_t i = 0, j = 0;
+  int32_t noContractions = 0;
+  // Create and compare doubles:
+  Line *backupLines = new Line[size]; 
+  Line::copyArray(backupLines, lines, size); 
+  // detect contractions
+
+  Line **gLinesBackup = NULL; //new Line*[size]; 
+
+  for(i = 0; i < size; i++) {
+    // preserve index and previous
+    Line::copyArray(lines, backupLines, size); 
+    for(j = 0; j < size; j++) {
+      u_strcpy(lines[j].name, backupLines[i].name);
+      u_strcat(lines[j].name, backupLines[j].name);
+      lines[j].len = backupLines[i].len+backupLines[j].len;     
+    }
+
+    if((noContractions += analyzeContractions(gLines, size, comparer)) && gDebug) {
+      if(gLinesBackup == NULL) {
+        gLinesBackup = new Line*[size];
+      }
+      // Show the sorted doubles, for debugging
+      setArray(gLinesBackup, lines, size);
+      qsort(gLinesBackup, size, sizeof(Line *), comparer);
+      //setIndexes(gLinesBackup, size);
+      analyzeStrength(gLinesBackup, size, comparer);
+      printOrdering(gLinesBackup, size, log);
+    }
+    if(!gQuiet) {
+      u_fprintf(log, ".");
+    }
+  }
+  if(!gQuiet) {
+    u_fprintf(log, "\n");
+  }
+  delete[] backupLines; 
+  if(gLinesBackup) {
+    delete[] gLinesBackup; 
+  }
+  return noContractions;
+}
+
+// gLines in this function is an array of sorted pointers.
+// Contractions are already included. 
+int32_t
+detectExpansions(Line **gLines, int32_t size, CompareFn comparer) {
+  UErrorCode status = U_ZERO_ERROR;
+  // detect expansions
+
+  UColAttributeValue startStrength = UCOL_OFF, endStrength = UCOL_OFF, 
+    strength = UCOL_OFF, previousStrength = UCOL_OFF;
+  Line start, end, src;
+  Line *startP = &start, *endP = &end, *srcP = &src;
+  Line *current = NULL;
+  memset(startP, 0, sizeof(Line));
+  memset(endP, 0, sizeof(Line));
+  memset(srcP, 0, sizeof(Line));
+  int32_t srcLen;
+  int32_t i = 0, j = 0, k = 0;
+  for(i = 0; i < size; i++) {
+    u_strcpy(start.name, (*(gLines+i))->name);
+    u_strcpy(end.name, (*(gLines+i))->name);
+    srcLen = (*(gLines+i))->len;
+    u_strcpy(start.name+srcLen, (*(gLines))->name);
+    start.len = srcLen + (*(gLines))->len;
+    u_strcpy(end.name+srcLen, (*(gLines+size-1))->name);
+    end.len = srcLen + (*(gLines+size-1))->len;
+
+    for(k = 0; k < size; k++) { // k is index of a thing that is not doubled
+      current = *(gLines+k);
+      // see if we have moved to front
+      // has it moved to the very beggining
+      if((startStrength = probeStrength((gLines+k), &startP, comparer)) != UCOL_OFF) {
+        continue; // this one is in the front
+      }
+      // has it moved to the very end?
+      if((endStrength = probeStrength(&endP, (gLines+k), comparer)) != UCOL_OFF) {
+        continue; // this one is in the back
+      }
+      // Potential Expansion     
+      if(gDebug) { //gVerbose
+        u_fprintf(log, "Possible expansion: ");
+        escapeALine(*(gLines+k), log);
+        u_fprintf(log, " ");
+      }
+      // Now we have to make sure that this is really an expansion
+      // First, we have to find it
+      u_strcpy(src.name, (*(gLines+i))->name);
+      for(j = 0; j < size; j++) {
+        u_strcpy(src.name+srcLen, (*(gLines+j))->name);
+        src.len = srcLen + (*(gLines+j))->len;
+        if((strength = probeStrength(&srcP, (gLines+k), comparer)) == UCOL_OFF) {
+          strength = probeStrength((gLines+k), &srcP, comparer);
+          // we found it *(gLines+j-1) is the element that is interesting
+          // since gLines+j-1 < gLines+k < gLines+j
+          if(gDebug) { //gVerbose
+            u_fprintf(log, "i = %i, k = %i, j = %i ", i, k, j);
+            escapeALine(*(gLines+i), log);
+            escapeALine(*(gLines+j-1), log);
+            printStrength(previousStrength, log);
+            escapeALine(current, log);
+            printStrength(strength, log);
+            escapeALine(*(gLines+i), log);
+            escapeALine(*(gLines+j), log);
+            u_fprintf(log, "\n");
+          }
+          // check whether it is a contraction that is the same as an expansion
+          // or a multi character that doesn't do anything
+          current->addExpansionHit(i, j);
+          current->isExpansion = TRUE;
+          current->expIndex = k;
+          // cache expansion
+          gExpansions.put(UnicodeString(current->name, current->len), current, status); //new Line(*current)
+          break;
+        }
+        previousStrength = strength;
+      }
+    }
+    if(!gQuiet) {
+      u_fprintf(log, ".");
+    }
+  }  
+  if(!gQuiet) {
+    u_fprintf(log, "\n");
+  }
+  // now we have identified possible expansions. We need to find out how do they expand. 
+  // Let's iterate over expansions cache - it's easier.
+  const UHashElement *el = NULL;
+  int32_t hashIndex = -1;
+  Line *doubles = new Line[size*10]; 
+  Line **sorter = new Line*[size*10];
+  int32_t currSize = 0;
+  int32_t newSize = 0;
+  Line *prev = NULL;
+  Line *next = NULL;
+  Line *origin = NULL;
+  int result = 0;
+  // Make a list of things in the vincinity of expansion candidate
+  // in expansionPrefixes and expansionAfter we have stored the
+  // prefixes of stuff that caused the detection of an expansion
+  // and a position where the expansion was. 
+  // For example (icu, de__PHONEBOOK), we had:
+  // aE <<< \u00E4 < af
+  // AD < \u00E4 <<< Ae
+  // From that we will construct the following sequence:
+  // AD < aE <<< \u00E4/ <<< Ae < af
+  // then we will take the vincinity of \u00E4:
+  // aE <<< \u00E4/ <<< Ae
+  // then we will choose the smallest expansion to be the expansion
+  // part: 'e'.
+  // if there is equality, we choose the equal part:
+  // (win32, de__PHONEBOOK):
+  // AD < \u00E4/ = ae <<< aE <<< Ae
+  // we choose 'e'.
+
+  while((el = gExpansions.nextElement(hashIndex)) != NULL) {
+    newSize = 0;
+    current = (Line *)el->value.pointer;
+    currSize = size*current->expansionPrefixesSize;
+    if(gDebug) {
+      escapeALine(current, log);
+      u_fprintf(log, " Number: %i\n", current->expansionPrefixesSize);
+    }
+    // construct the doubles 
+    for(i = 0; i < current->expansionPrefixesSize; i++) {
+      doubles[newSize].suffix = current->expansionAfter[i]-1;
+      doubles[newSize++].setToConcat(*(gLines+current->expansionPrefixes[i]), *(gLines+current->expansionAfter[i]-1));
+      doubles[newSize].suffix = current->expansionAfter[i];
+      doubles[newSize++].setToConcat(*(gLines+current->expansionPrefixes[i]), *(gLines+current->expansionAfter[i]));
+    }
+    // add the expansion we're observing
+    doubles[newSize++] = *current;
+    setArray(sorter, doubles, newSize);
+    qsort(sorter, newSize, sizeof(Line*), comparer);
+    analyzeStrength(sorter, newSize, comparer);
+    if(gDebug) {
+      printOrdering(sorter, newSize, log);
+    }
+    i = 0;
+    while(**(sorter+i) != *current) {
+      i++;
+    }
+    // find the two additions
+    if((*(sorter+i))->strength == UCOL_IDENTICAL) {
+      // if we ae id
+      origin = *(gLines+((*(sorter+i-1))->suffix));
+      u_strcpy(current->expansionString, origin->name);
+      current->expLen = origin->len;
+    } else if(i < newSize-1 && (*(sorter+i+1))->strength == UCOL_IDENTICAL) {
+      origin = *(gLines+((*(sorter+i+1))->suffix));
+      u_strcpy(current->expansionString, origin->name);
+      current->expLen = origin->len;
+    } else {
+      if(i > 0) {
+        prev = *(gLines+(*(sorter+i-1))->suffix);
+        if(i < newSize-1) {
+          next = *(gLines+(*(sorter+i+1))->suffix);
+          result = comparer(&prev, &next);
+          if(result <= 0) {
+            u_strcpy(current->expansionString, prev->name);
+            current->expLen = prev->len;
+          } else {
+            u_strcpy(current->expansionString, next->name);
+            current->expLen = next->len;
+          }
+        }      
+      }
+      if(0) { //if(gDebug)
+        u_fprintf(log, "Expansion is: ");
+        escapeALine(current, log);
+        u_fprintf(log, "/");
+        escapeExpansion(current, log);
+        u_fprintf(log, "\n");
+      }
+    }
+    noteExpansion(current);
+    //noteExpansion(gLines, current, size, comparer);
+    if(!gQuiet) {
+      u_fprintf(log, ".");
+    }
+  }
+  if(!gQuiet) {
+    u_fprintf(log, "\n");
+  }
+  delete[] doubles;
+  delete[] sorter;
+  return gExpansions.count();
+}
+
+UBool
+isTailored(Line *line, UErrorCode &status) {
+  UBool result = FALSE;
+  UCollationElements *tailoring = ucol_openElements(gCol, line->name, line->len, &status);
+  UCollationElements *uca = ucol_openElements(gUCA, line->name, line->len, &status);
+
+  int32_t tailElement = UCOL_NULLORDER;
+  int32_t ucaElement = UCOL_NULLORDER;
+
+  do {
+    do {
+      tailElement = ucol_next(tailoring, &status);
+    } while(tailElement == 0);
+    do {
+      ucaElement = ucol_next(uca, &status);
+    } while(ucaElement == 0);
+    if(tailElement != ucaElement) {
+      result = TRUE;
+      break;
+    }
+  } while (tailElement != UCOL_NULLORDER && ucaElement != UCOL_NULLORDER);
+
+  ucol_closeElements(tailoring);
+  ucol_closeElements(uca);
+  return result;
+}
+
+void
+reduceUntailored(Line **gLines, int32_t size){
+  UErrorCode status = U_ZERO_ERROR;
+  Line *current = *(gLines);
+  Line *previous = NULL;
+  while(current) {
+    // if the current line is not tailored according to the UCA
+    if(!isTailored(current, status)) {
+      // we remove it
+      current->isRemoved = TRUE;
+    } else {
+      // if it's tailored 
+      if(current->previous && current->previous->isRemoved == TRUE) {
+        previous = current->previous;
+        while(previous && (previous->strength > current->strength || previous->isExpansion || previous->isContraction) && previous->isRemoved) {
+          if(previous->previous && previous->previous->isRemoved) {
+            previous = previous->previous;
+          } else {
+            break;
+          }
+        }
+        if(previous) {
+          previous->isReset = TRUE;
+        } else {
+          (*(gLines))->isReset = TRUE;
+        }
+      }
+    }
+    current = current->next;
+  }
+}
+
+void
+constructAndAnalyze(Line **gLines, Line *lines, int32_t size, CompareFn comparer) {
+  int32_t i = 0, j = 0, k = 0;
+  // setup our compare arrays to point to single set.
+
+  // For contractions we need a block of data
+  setArray(gLines, lines, size);
+  //size = setArray(gLines);
+
+  qsort(gLines, size, sizeof(Line *), comparer);
+
+  // Establish who is previous according to the sort order
+  //setIndexes(gLines, size);
+
+  analyzeStrength(gLines, size, comparer);
+  if(gVerbose) {
+    u_fprintf(log, "Ordering:\n");
+    printOrdering(gLines, size, log);
+  }
+
+  //showDifferences(exemplarSetSize);
+  //dumpData(exemplarSetSize);
+
+  if(!gQuiet) {
+    u_fprintf(log, "Detecting contractions?\n");
+  }
+  int32_t noContractions = 0;
+  noContractions = detectContractions(gLines, lines, size, comparer);
+  if(!gQuiet) {
+    u_fprintf(log, "Detected %i contractions\n", noContractions);
+  }
+
+  // now we have suspected contractions in the table
+  // we have to re-sort the things 
+  size = setArray(gLines);
+  qsort(gLines, size, sizeof(Line *), comparer);
+  analyzeStrength(gLines, size, comparer);
+
+  if(!gQuiet) {
+    u_fprintf(log, "Detecting expansions\n");
+  }
+  int32_t noExpansions = detectExpansions(gLines, size, comparer);
+  if(!gQuiet) {
+    u_fprintf(log, "Detected %i expansions\n", noExpansions);
+  }
+
+  positionExpansions(gLines, size, comparer);
+
+  if(gVerbose) {
+    u_fprintf(log, "After positioning expansions:\n");
+    printOrdering(gLines, size, log, TRUE);
+  }
+  //reduceUntailored(gLines, size);
+  if(!gQuiet) {
+    u_fprintf(out, "Final result\n");
+  }
+  printOrdering(gLines, size, out, TRUE);
+  printOrdering(gLines, size, log, TRUE);
+}
+
+// Check whether upper case comes before lower case or vice-versa
+int32_t 
+checkCaseOrdering(void) {
+  UChar stuff[][3] = {
+    { 0x0061, separatorChar, 0x0061}, //"aa",
+    { 0x0061, separatorChar, 0x0041 }, //"a\\u00E0",
+    { 0x0041, separatorChar, 0x0061 }, //"\\u00E0a",
+    { 0x0041, separatorChar, 0x0041 }, //"\\u00E0a",
+    //{ 0x00E0, separatorChar, 0x00E0 }  //"\\u00E0\\u00E0"
+  };
+  const int32_t size = sizeof(stuff)/sizeof(stuff[0]);
+
+  Line **sortedLines = new Line*[size];
+  Line lines[size];
+
+  int32_t i = 0;
+  int32_t ordered = 0, reversed = 0;
+
+  for(i = 0; i < size; i++) {
+    lines[i].setName(stuff[i], 3);
+  }
+  setArray(sortedLines, lines, size);
+  qsort(sortedLines, size, sizeof(Line*), gComparer);
+
+  for(i = 0; i < size; i++) {
+    if(*(sortedLines+i) == &lines[i]) {
+      ordered++;
+    }
+    if(*(sortedLines+i) == &lines[size-i-1]) {
+      reversed++;
+    }
+  }
+
+  delete[] sortedLines;
+  if(ordered == size) {
+    return 0; // in normal order
+  } else if(reversed == size) {
+    return 1; // in reversed order
+  } else {
+    return -1; // unknown order
+  }
+}
+
+
+// Check whether the secondaries are in the straight or reversed order
+int32_t 
+checkSecondaryOrdering(void) {
+  UChar stuff[][5] = {
+    { 0x0061, separatorChar, 0x0061, separatorChar, 0x00E0 }, //"aa",
+    { 0x0061, separatorChar, 0x00E0, separatorChar, 0x0061 }, //"a\\u00E0",
+    { 0x00E0, separatorChar, 0x0061, separatorChar, 0x0061 }, //"\\u00E0a",
+    //{ 0x00E0, separatorChar, 0x00E0 }  //"\\u00E0\\u00E0"
+  };
+  const int32_t size = sizeof(stuff)/sizeof(stuff[0]);
+
+  Line **sortedLines = new Line*[size];
+  Line lines[size];
+
+  int32_t i = 0;
+  int32_t ordered = 0, reversed = 0;
+
+  for(i = 0; i < size; i++) {
+    lines[i].setName(stuff[i], 5);
+  }
+  setArray(sortedLines, lines, size);
+  qsort(sortedLines, size, sizeof(Line*), gComparer);
+
+  for(i = 0; i < size; i++) {
+    if(*(sortedLines+i) == &lines[i]) {
+      ordered++;
+    }
+    if(*(sortedLines+i) == &lines[size-i-1]) {
+      reversed++;
+    }
+  }
+
+  delete[] sortedLines;
+  if(ordered == size) {
+    return 0; // in normal order
+  } else if(reversed == size) {
+    return 1; // in reversed order
+  } else {
+    return -1; // unknown order
+  }
+}
+
+// We have to remove ignorable characters from the exemplar set,
+// otherwise, we get messed up results
+void removeIgnorableChars(UnicodeSet &exemplarUSet, CompareFn comparer, UErrorCode &status) {
+  UnicodeSet ignorables, primaryIgnorables;
+  UnicodeSetIterator exemplarUSetIter(exemplarUSet);
+  exemplarUSetIter.reset();
+  Line empty;
+  Line *emptyP = &empty;
+  Line current;
+  Line *currLine = &current;
+  UColAttributeValue strength = UCOL_OFF;
+
+
+  while(exemplarUSetIter.next()) {
+    if(exemplarUSetIter.isString()) { // process a string
+      u_memcpy(currLine->name, exemplarUSetIter.getString().getBuffer(), exemplarUSetIter.getString().length());
+      currLine->len = exemplarUSetIter.getString().length();
+      strength = probeStrength(&emptyP, &currLine, comparer);
+      if(strength == UCOL_IDENTICAL) {
+        ignorables.add(exemplarUSetIter.getString());
+      } else if(strength > UCOL_PRIMARY) {
+        primaryIgnorables.add(exemplarUSetIter.getString());
+      }
+    } else { // process code point
+      UBool isError = FALSE;
+      UChar32 codePoint = exemplarUSetIter.getCodepoint();
+      currLine->len = 0;
+      U16_APPEND(currLine->name, currLine->len, 25, codePoint, isError);
+      strength = probeStrength(&emptyP, &currLine, comparer);
+      if(strength == UCOL_IDENTICAL) {
+        ignorables.add(codePoint);
+      } else if(strength > UCOL_PRIMARY) {
+        primaryIgnorables.add(codePoint);
+      }
+    }
+  }
+
+
+
+  exemplarUSet.removeAll(ignorables);
+  exemplarUSet.removeAll(primaryIgnorables);
+
+  UnicodeString removedPattern;
+  if(ignorables.size()) {
+    u_fprintf(log, "Ignorables:\n");
+    ignorables.toPattern(removedPattern, TRUE);
+    removedPattern.setCharAt(removedPattern.length(), 0);
+    escapeString(removedPattern.getBuffer(), removedPattern.length(), log);
+    u_fprintf(log, "\n");
+  }
+  if(primaryIgnorables.size()) {
+    u_fprintf(log, "Primary ignorables:\n");
+    primaryIgnorables.toPattern(removedPattern, TRUE);
+    removedPattern.setCharAt(removedPattern.length(), 0);
+    escapeString(removedPattern.getBuffer(), removedPattern.length(), log);
+    u_fprintf(log, "\n");
+  }
+
+}
+
+// TODO: develop logic for choosing boundary characters - right now it is hardcoded
+// It should be a function of used scripts. Also, check whether we need to save 
+// used script names
+void addUtilityChars(UnicodeSet &exemplarUSet, UErrorCode &status) {
+
+  // in order to get nice rules, we need to add some characters to the
+  // starting set. These are mostly parts of compatibity composed characters,
+  // such as L-middle dot (middle dot is 0x00B7). If we don't add these, we would
+  // get a reset at a funky character, such as L-middle dot. This list will probably
+  // grow.
+  exemplarUSet.add(0x00B7);
+
+  // these things represent a script before the target script and 
+  // a script after. More logic should be added so that these characters are
+  // chosen automatically
+
+  exemplarUSet.add(0x0038);
+  exemplarUSet.add(0x0039);
+
+  //exemplarUSet.add(0x0433);
+  //exemplarUSet.add(0x0436);
+  exemplarUSet.add(0xfa29);
+  exemplarUSet.add(0xfa28);
+}
+
+void
+getExemplars(const char *locale, UnicodeSet &exemplars, UErrorCode &status) {
+  // first we fill out structures with exemplar characters.
+  UResourceBundle *res = ures_open(NULL, locale, &status);
+  int32_t exemplarLength = 0;
+  UnicodeString exemplarString = ures_getUnicodeStringByKey(res, "ExemplarCharacters", &status);
+  exemplars.clear();
+  exemplars.applyPattern(exemplarString, status);
+  ures_close(res);
+}
+
+void
+prepareStartingSet(UnicodeSet &exemplarUSet, CompareFn comparer, UErrorCode &status) {
+  int32_t i = 0;
+  UnicodeString exemplarString;
+  exemplarUSet.toPattern(exemplarString);
+  // Produce case closure of exemplar characters
+  // Then we want to figure out what is the script of the exemplar characters
+  // just pick several and see their script
+  const char* usedScriptNames[USCRIPT_CODE_LIMIT];
+  int32_t numberOfUsedScripts = 0;
+  char scriptSetPattern[256];
+  UnicodeString pattern; // for debugging
+  UChar32 exChar = -1;
+  while(exemplarUSet.size() != 0 && (exChar = exemplarUSet.charAt(0)) != -1) { 
+    int32_t scriptNo = u_getIntPropertyValue(exChar, UCHAR_SCRIPT);
+    usedScriptNames[numberOfUsedScripts] = u_getPropertyValueName(UCHAR_SCRIPT, scriptNo, U_SHORT_PROPERTY_NAME);
+    sprintf(scriptSetPattern, "[:%s:]", usedScriptNames[numberOfUsedScripts]);
+    numberOfUsedScripts++;
+    UnicodeSet scriptSet(UnicodeString(scriptSetPattern, ""), status);
+    exemplarUSet.removeAll(scriptSet);
+    exemplarUSet.toPattern(pattern, TRUE);
+  }
+  exemplarUSet.clear();
+
+  // always add ASCII
+  //exemplarUSet.addAll(UnicodeSet(UnicodeString("[\\u0020-\\u007f]", ""), status));
+  exemplarUSet.addAll(UnicodeSet(UnicodeString("[\\u0041-\\u005b]", ""), status));
+  if(gExemplar) {
+    exemplarUSet.applyPattern(exemplarString, status);
+    exemplarUSet.closeOver(USET_CASE);
+    if(!gQuiet) {
+      u_fprintf(out, "ICU exemplar characters:\n");
+      escapeString(exemplarString.getBuffer(), exemplarString.length(), out);
+      u_fprintf(out, "\n");
+    }
+  } else {
+    if(!gQuiet) {
+      u_fprintf(out, "Using scripts:\n");
+    }
+    // add interesting scripts
+    for(i = 0; i < numberOfUsedScripts; i++) {
+      sprintf(scriptSetPattern, "[:%s:]", usedScriptNames[i]);
+      exemplarUSet.addAll(UnicodeSet(UnicodeString(scriptSetPattern, ""), status));
+      if(!gQuiet) {
+        u_fprintf(out, "%s\n", scriptSetPattern);
+      }
+    }
+  }
+
+
+  removeIgnorableChars(exemplarUSet, comparer, status);
+
+  addUtilityChars(exemplarUSet, status);
+
+/*
+  // try to check whether tailored set and exemplar characters match.
+  USet *tailored = ucol_getTailoredSet(gCol, &status);
+  UBool tailoredContained = exemplarUSet.containsAll(*((UnicodeSet *)tailored));
+  if(!tailoredContained) {
+    ((UnicodeSet *)tailored)->removeAll(exemplarUSet);
+    UnicodeString pattern;
+    ((UnicodeSet *)tailored)->toPattern(pattern, TRUE);
+  }
+  uset_close(tailored);
+*/
+
+  //return exemplarUSet;
+}
+
+void 
+setOutputFile(const char *name, UErrorCode &status) {
+  int32_t i = 0;
+  char filename[256];
+  strcpy(filename, name);
+  for(i = 0; i < gPlatformNo; i++) {
+    strcat(filename, "_");
+    strcat(filename, platforms[gPlatformIndexes[i]].name);
+  }
+  if(gExemplar) {
+    strcat(filename, "_exemplar");
+  } else {
+    strcat(filename, "_script");
+  }
+  strcat(filename, ".utf16.txt");
+  out = u_fopen(filename, "wb", "en", "utf-16");
+}
+
+void
+processCollator(UCollator *col, UErrorCode &status) {
+  int32_t i = 0;
+  gCol = col;
+  UChar ruleString[16384];
+  int32_t ruleStringLength = ucol_getRulesEx(gCol, UCOL_TAILORING_ONLY, ruleString, 16384);
+  if(!gQuiet) {
+    u_fprintf(out, "ICU rules:\n");
+    printRules(ruleString, ruleStringLength, out);
+    printRules(ruleString, ruleStringLength, log);
+    //escapeString(ruleString, ruleStringLength, out);
+    u_fprintf(out, "\n");
+  }
+  const char *locale = ucol_getLocale(gCol, ULOC_REQUESTED_LOCALE, &status);
+  UnicodeSet exemplarUSet;
+  if(locale) {
+    getExemplars(locale, exemplarUSet, status);
+  } else {
+    exemplarUSet = *((UnicodeSet *)ucol_getTailoredSet(gCol, &status));
+  }
+
+
+  for(i = 0; i < gPlatformNo; i++) {
+    u_fprintf(out, "\nGenerating order for platform: %s\n", platforms[gPlatformIndexes[i]].name);
+    gComparer = platforms[gPlatformIndexes[i]].comparer;
+
+    prepareStartingSet(exemplarUSet, gComparer, status);
+    int32_t itemLen = 0;
+    // get the number of all the items from the set (both codepoints and strings)
+    int32_t exemplarSetSize = exemplarUSet.size();
+    UnicodeSetIterator exemplarUSetIter(exemplarUSet);
+
+    // allocate ICU lines
+    gICULines = new Line*[exemplarSetSize*5]; 
+    int32_t j = 0;
+    int32_t linesCount = 0;
+    Line *lines = new Line[exemplarSetSize]; 
+
+    int32_t reversedSecondary = checkSecondaryOrdering();
+    if(reversedSecondary == 0) {
+      u_fprintf(out, "Secondaries do not seem to be reversed\n");
+    } else if(reversedSecondary == 1) {
+      u_fprintf(out, "Secondaries are reversed\n");
+      if(gComparer == ICUstrcmp) {
+        ucol_setAttribute(gCol, UCOL_FRENCH_COLLATION, UCOL_OFF, &status);
+      }
+    } else {
+      u_fprintf(out, "Cannot conclude if secondaries are reversed\n");
+    }
+
+    int32_t reversedCase = checkCaseOrdering();
+    if(reversedCase == 0) {
+      u_fprintf(out, "Case does not seem to be reversed\n");
+    } else if(reversedCase == 1) {
+      u_fprintf(out, "Case is reversed\n");
+      if(gComparer == ICUstrcmp) {
+        ucol_setAttribute(gCol, UCOL_CASE_FIRST, UCOL_OFF, &status);
+      }
+    } else {
+      u_fprintf(out, "Cannot conclude if case is reversed\n");
+    }
+      
+    exemplarUSetIter.reset();
+    gElements.removeAll();
+    gExpansions.removeAll();
+    linesCount = 0;
+
+    while(exemplarUSetIter.next()) {
+      Line *currLine = lines+linesCount;
+      if(exemplarUSetIter.isString()) { // process a string
+        u_memcpy(currLine->name, exemplarUSetIter.getString().getBuffer(), exemplarUSetIter.getString().length());
+        currLine->len = exemplarUSetIter.getString().length();
+      } else { // process code point
+        UBool isError = FALSE;
+        currLine->len = 0;
+        U16_APPEND(currLine->name, currLine->len, 25, exemplarUSetIter.getCodepoint(), isError);
+      }
+      currLine->name[currLine->len] = 0; // zero terminate, for our evil ways
+      currLine->index = linesCount;
+      linesCount++;
+      noteElement(currLine);
+    }
+    constructAndAnalyze(gICULines, lines, exemplarSetSize, gComparer);
+
+    delete[] lines; 
+  }
+
+
+  // cleanup globals
+  delete[] gICULines; 
+  u_fflush(out);
+  u_fclose(out);
+  ucol_close(gCol);
+}
+
+void
+processLocale(const char *locale, UErrorCode &status) {
+  gWinLCID = uloc_getLCID(locale);
+
+  UCollator *col = ucol_open(locale, &status);
+
+  setOutputFile(locale, status);
+
+  u_fprintf(out, "Locale %s (LCID:%06X)\n", locale, gWinLCID);
+
+  processCollator(col, status);
+}
+
+UBool 
+hasCollationElements(const char *locName) {
+
+  UErrorCode status = U_ZERO_ERROR;
+  UResourceBundle *ColEl = NULL;
+
+  UResourceBundle *loc = ures_open(NULL, locName, &status);;
+
+  if(U_SUCCESS(status)) {
+    status = U_ZERO_ERROR;
+    ColEl = ures_getByKey(loc, "CollationElements", ColEl, &status);
+    if(status == U_ZERO_ERROR) { /* do the test - there are real elements */
+      ures_close(ColEl);
+      ures_close(loc);
+      return TRUE;
+    }
+    ures_close(ColEl);
+    ures_close(loc);
+  }
+  return FALSE;
+}
+
+int
+main(int argc,
+     char* argv[])
+{
+  UErrorCode status = U_ZERO_ERROR;
+  err = u_finit(stderr, "en", "latin-1");
+  log = u_finit(stdout, "en", "latin-1");
+
+/*
+  USet *wsp = uprv_openRuleWhiteSpaceSet(&status);
+  uset_add(wsp, 0x0041);
+  uset_remove(wsp, 0x0041);
+  UnicodeString pat;
+  ((UnicodeSet *)wsp)->toPattern(pat, TRUE);
+  pat.setCharAt(pat.length(), 0);
+  escapeString(pat.getBuffer(), pat.length(), log);
+  u_fflush(log);
+*/
+
+  UTransliterator *anyHex = utrans_open("[^\\u000a\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status);
+  u_fsettransliterator(log, U_WRITE, anyHex, &status);
+
+  processArgs(argc, argv, status);
+  int32_t i = 0;
+
+
+  gElements.setValueDeleter(deleteLineElement);
+
+
+  if(U_FAILURE(status) || gPlatformNo == 0) {
+    return -1;
+  }
+
+  gUCA = ucol_open("root", &status);
+
+  if(gRulesStdin) {
+    char buffer[1024];
+    UChar ruleBuffer[16384];
+    UChar *rules = ruleBuffer;
+    int32_t maxRuleLen = 16384;
+    int32_t rLen = 0;
+    while(gets(buffer)) {
+      if(buffer[0] != '/' && buffer[1] != '/') {
+        rLen = u_unescape(buffer, rules, maxRuleLen);
+        rules += rLen;
+        maxRuleLen -= rLen;
+      }
+    }
+    UParseError parseError;
+    //escapeString(ruleBuffer, rules-ruleBuffer, log);//
+    u_fprintf(log, "%U\n", ruleBuffer);
+
+    UCollator *col = ucol_openRules(ruleBuffer, rules-ruleBuffer, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status);
+    if(U_SUCCESS(status)) {
+      setOutputFile("stdinRules", status);
+      processCollator(col, status);
+    } else {
+      u_fprintf(err, "Error %s\n", u_errorName(status));
+    }
+  } else {
+
+    if(gLocale) {
+      processLocale(gLocale, status);
+    } else if(gLocaleNo) {
+      for(i = 0; i < gLocaleNo; i++) {
+        processLocale(gLocales[i], status);
+      }
+    } else { // do the loop through all the locales
+      int32_t noOfLoc = uloc_countAvailable();
+      const char *locName = NULL;
+      for(i = 0; i<noOfLoc; i++) {
+        status = U_ZERO_ERROR;
+        locName = uloc_getAvailable(i);
+        if(hasCollationElements(locName)) {
+          processLocale(locName, status);
+        }
+      }
+    }
+  }
+
+
+  ucol_close(gUCA);
+
+  u_fflush(log);
+  u_fclose(log);
+  u_fflush(err);
+  u_fclose(err);
+
+  return 0;
+}
\ No newline at end of file
diff --git a/colprobe/colprobe.dsp b/colprobe/colprobe.dsp
new file mode 100644
index 0000000..d274c85
--- /dev/null
+++ b/colprobe/colprobe.dsp
@@ -0,0 +1,148 @@
+# Microsoft Developer Studio Project File - Name="colprobe" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=colprobe - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "colprobe.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "colprobe.mak" CFG="colprobe - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "colprobe - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "colprobe - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "colprobe - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+MTL=midl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /I "../../tools/toolutil" /I "../../common" /I "../../i18n" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 icuio.lib icuuc.lib icuin.lib icutu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"../../../lib"
+
+!ELSEIF  "$(CFG)" == "colprobe - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+MTL=midl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /I "../../tools/toolutil" /I "../../common" /I "../../i18n" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 icuiod.lib icuucd.lib icuind.lib icutud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"../../../lib"
+
+!ENDIF 
+
+# Begin Target
+
+# Name "colprobe - Win32 Release"
+# Name "colprobe - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\colprobeNew.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\line.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\sortedlines.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\strengthprobe.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\targetsetgenerator.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\uprinter.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\colprobe.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\line.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\sortedlines.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\strengthprobe.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\targetsetgenerator.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\uprinter.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/colprobe/colprobe.h b/colprobe/colprobe.h
new file mode 100644
index 0000000..ca12c44
--- /dev/null
+++ b/colprobe/colprobe.h
@@ -0,0 +1,15 @@
+#ifndef COLPROBE_H
+#define COLPROBE_H
+
+#include "unicode/uniset.h"
+#include "unicode/normlzr.h"
+
+typedef int (*CompareFn) (const void *elem1, const void *elem2);
+typedef int (*GetSortKeyFn) (const UChar *string, int32_t len, uint8_t *buffer, int32_t buffCapacity);
+//typedef int (__cdecl *CompareFn)(const void *elem1, const void *elem2);
+void generateRepertoire(const char *locale, UnicodeSet &rep, UBool &hanAppears, UErrorCode &status);
+UnicodeSet flatten(const UnicodeSet &source, UErrorCode &status);
+
+//UnicodeSet generateRepertoire(const char *locale);
+
+#endif
diff --git a/colprobe/colprobeNew.cpp b/colprobe/colprobeNew.cpp
new file mode 100644
index 0000000..6bcfc51
--- /dev/null
+++ b/colprobe/colprobeNew.cpp
@@ -0,0 +1,1078 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File colprobe.cpp
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+#include "uoptions.h"
+#include "unicode/ucol.h"
+#include "unicode/ucoleitr.h"
+#include "unicode/ures.h"
+#include "unicode/uniset.h"
+#include "unicode/usetiter.h"
+#include "unicode/ustring.h"
+#include "unicode/uchar.h"
+#include "unicode/uscript.h"
+#include "unicode/locid.h"
+#include "unicode/ucnv.h"
+#include "uprops.h"
+#include "hash.h"
+#include "ucol_imp.h"
+
+#include "unicode/ustdio.h"
+#include "unicode/utrans.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+
+// unix tolower
+#include <ctype.h>
+// unix setlocale
+#include <locale.h>
+
+#include "colprobe.h"
+
+#include "line.h"
+#include "sortedlines.h"
+#include "strengthprobe.h"
+
+void testWin(StrengthProbe &probe, UErrorCode &status) ;
+
+#if defined WIN32
+#include <io.h>
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <direct.h>
+
+int createDir(const char* dirName) {
+  struct _stat myStat;
+  int result = _stat(dirName, &myStat);
+ 
+  if(result == -1) {
+    result = _mkdir(dirName);
+    return result;
+  } else if(myStat.st_mode & _S_IFDIR) {
+    return 0;
+  } else {
+    return 1;
+  }
+}
+
+//#elif defined POSIX
+#else
+#include <sys/stat.h>
+#include <unistd.h>
+
+int createDir(const char* dirName) {
+  struct stat myStat;
+  int result = stat(dirName, &myStat);
+ 
+  if(result == -1) {
+    result = mkdir(dirName, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
+    return result;
+  } else if(S_ISDIR(myStat.st_mode)) {
+    return 0;
+  } else {
+    return 1;
+  }
+}
+//
+//  Stubs for Windows API functions when building on UNIXes.
+//
+typedef int DWORD;
+inline int CompareStringW(DWORD, DWORD, UChar *, int, UChar *, int) {return 0;};
+//#else
+//#error "Not POSIX or Windows. Won't work."
+#endif
+
+#include "line.h"
+
+static UBool gVerbose = FALSE;
+static UBool gDebug = FALSE;
+static UBool gQuiet = FALSE;
+static UBool gExemplar = FALSE;
+
+DWORD          gWinLCID;
+int            gCount;
+UCollator     *gCol;
+UCollator     *gUCA;
+UConverter    *utf8cnv;
+CompareFn gComparer;
+int       gRefNum;
+UnicodeSet gExcludeSet;
+UnicodeSet gRepertoire;
+
+const UChar separatorChar = 0x0030;
+
+UPrinter *logger;
+UPrinter *debug;
+UPrinter *tailoringBundle;
+UPrinter *referenceBundle;
+UPrinter *bundle;
+FILE     *fTailoringDump;
+FILE     *fDefaultDump;
+
+const char *progName = "colprobe";
+
+const char *gLocale = NULL;
+int32_t platformIndex = -1;
+int32_t gPlatformNo = 0;
+int32_t gPlatformIndexes[10];
+int32_t gLocaleNo = 0;
+const char* gLocales[100];
+UBool gRulesStdin = FALSE;
+const char *outputFormat = "HTML";
+const char *outExtension = "html";
+
+enum {
+  HELP1,
+    HELP2,
+    VERBOSE,
+    QUIET,
+    VERSION,
+    ICUDATADIR,
+    COPYRIGHT,
+    LOCALE,
+    PLATFORM,
+    DEBUG, 
+    EXEMPLAR,
+    RULESSTDIN,
+    REFERENCE,
+    EXCLUDESET,
+    REPERTOIRE,
+  INTERACTIVE,
+  PRINTREF,
+  DIFF, 
+  OUTPUT
+};
+
+UOption options[]={
+  /*0*/ UOPTION_HELP_H,
+  /*1*/ UOPTION_HELP_QUESTION_MARK,
+  /*2*/ UOPTION_VERBOSE,
+  /*3*/ UOPTION_QUIET,
+  /*4*/ UOPTION_VERSION,
+  /*5*/ UOPTION_ICUDATADIR,
+  /*6*/ UOPTION_COPYRIGHT,
+  /*7*/ UOPTION_DEF("locale", 'l', UOPT_REQUIRES_ARG),
+  /*8*/ UOPTION_DEF("platform", 'p', UOPT_REQUIRES_ARG),
+  /*9*/ UOPTION_DEF("debug", 'D', UOPT_NO_ARG),
+  /*10*/ UOPTION_DEF("exemplar", 'E', UOPT_NO_ARG),
+  /*11*/ UOPTION_DEF("rulesstdin", 'R', UOPT_NO_ARG),
+  /*12*/ UOPTION_DEF("ref", 'c', UOPT_REQUIRES_ARG),
+  /*13*/ UOPTION_DEF("excludeset", 'x', UOPT_REQUIRES_ARG),
+  /*14*/ UOPTION_DEF("repertoire", 't', UOPT_REQUIRES_ARG),
+  /*15*/ UOPTION_DEF("interactive", 'I', UOPT_NO_ARG),
+  /*16*/ UOPTION_DEF("printref", 0, UOPT_NO_ARG),
+  /*17*/ UOPTION_DEF("diff", 0, UOPT_NO_ARG),
+  /*18*/ UOPTION_DEF("output", 0, UOPT_REQUIRES_ARG)
+};
+
+UChar compA[256];
+UChar compB[256];
+int32_t compALen = 0;
+int32_t compBLen = 0;
+
+char compUTF8A[256];
+char compUTF8B[256];
+int32_t compUTF8ALen = 0;
+int32_t compUTF8BLen = 0;
+
+int UNIXstrcmp(const void *a, const void *b) {
+  UErrorCode status = U_ZERO_ERROR;
+    gCount++;
+    int t;
+    compALen = unorm_normalize((*(Line **)a)->name, (*(Line **)a)->len, UNORM_NFC, 0, compA, 256, &status);
+    compBLen = unorm_normalize((*(Line **)b)->name, (*(Line **)b)->len, UNORM_NFC, 0, compB, 256, &status);
+    compUTF8ALen = ucnv_fromUChars(utf8cnv, compUTF8A, 256, compA, compALen, &status);
+    compUTF8A[compUTF8ALen] = 0;
+    compUTF8BLen = ucnv_fromUChars(utf8cnv, compUTF8B, 256, compB, compBLen, &status);
+    compUTF8B[compUTF8BLen] = 0;
+    t = strcoll(compUTF8A, compUTF8B);
+    return t;
+}
+
+int UNIXgetSortKey(const UChar *string, int32_t len, uint8_t *buffer, int32_t buffCapacity) {
+  UErrorCode status = U_ZERO_ERROR;
+  compALen = unorm_normalize(string, len, UNORM_NFC, 0, compA, 256, &status);
+  compUTF8ALen = ucnv_fromUChars(utf8cnv, compUTF8A, 256, compA, compALen, &status);
+  compUTF8A[compUTF8ALen] = 0;
+  return (strxfrm((char *)buffer, compUTF8A, buffCapacity)+1);
+}
+
+#ifdef WIN32
+int Winstrcmp(const void *a, const void *b) {
+  UErrorCode status = U_ZERO_ERROR;
+    gCount++;
+    int t;
+    //compALen = unorm_compose(compA, 256, (*(Line **)a)->name, (*(Line **)a)->len, FALSE, 0, &status);
+    //compBLen = unorm_compose(compB, 256, (*(Line **)b)->name, (*(Line **)b)->len, FALSE, 0, &status);
+    compALen = unorm_normalize((*(Line **)a)->name, (*(Line **)a)->len, UNORM_NFC, 0, compA, 256, &status);
+    compBLen = unorm_normalize((*(Line **)b)->name, (*(Line **)b)->len, UNORM_NFC, 0, compB, 256, &status);
+    t = CompareStringW(gWinLCID,  SORT_STRINGSORT, //0,
+      compA, compALen, 
+      compB, compBLen);
+
+/*    
+    t = CompareStringW(gWinLCID, 0, 
+      (*(Line **)a)->name, (*(Line **)a)->len, 
+      (*(Line **)b)->name, (*(Line **)b)->len);
+*/
+    return t-2;
+}
+
+int WingetSortKey(const UChar *string, int32_t len, uint8_t *buffer, int32_t buffCapacity) {
+  UErrorCode status = U_ZERO_ERROR;
+  compALen = unorm_normalize(string, len, UNORM_NFC, 0, compA, 256, &status);
+  return LCMapStringW(gWinLCID, LCMAP_SORTKEY | SORT_STRINGSORT, compA, compALen, (unsigned short *)buffer, buffCapacity);
+}
+
+#if 0
+int Winstrcmp(const void *a, const void *b) {
+  UErrorCode status = U_ZERO_ERROR;
+  uint8_t b1[256], b2[256];
+  int32_t b1Len, b2Len;
+  b1Len = WingetSortKey((*(Line **)a)->name, (*(Line **)a)->len, b1, 256);
+  b2Len = WingetSortKey((*(Line **)b)->name, (*(Line **)b)->len, b2, 256);
+
+  b1[b1Len] = 0;
+  b2[b2Len] = 0;
+  
+  return strcmp((const char *)b1, (const char *)b2);
+}
+#endif
+
+#else
+int Winstrcmp(const void *a, const void *b) {
+  if(a == b);
+  return 0;
+}
+int WingetSortKey(const UChar *, int32_t , uint8_t *, int32_t ) {
+  return 0;
+}
+#endif
+
+int ICUstrcmp(const void *a, const void *b) {
+    gCount++;
+    UCollationResult t;
+    t = ucol_strcoll(gCol, 
+      (*(Line **)a)->name, (*(Line **)a)->len,  
+      (*(Line **)b)->name, (*(Line **)b)->len);
+    if (t == UCOL_LESS) return -1;
+    if (t == UCOL_GREATER) return +1;
+    return 0;
+}
+
+int ICUgetSortKey(const UChar *string, int32_t len, uint8_t *buffer, int32_t buffCapacity) {
+  return ucol_getSortKey(gCol, string, len, buffer, buffCapacity);
+}
+
+struct {
+  const char* name;
+  CompareFn comparer;
+  GetSortKeyFn skgetter;
+} platforms[] = {
+  { "icu", ICUstrcmp, ICUgetSortKey },
+  { "w2k", Winstrcmp, WingetSortKey},
+  { "winxp", Winstrcmp, WingetSortKey},
+  { "aix", UNIXstrcmp, UNIXgetSortKey},
+  { "linux", UNIXstrcmp, UNIXgetSortKey}
+};
+
+
+void stringToLower(char *string) {
+  uint32_t i = 0;
+  for(i = 0; i < strlen(string); i++) {
+    string[i] = tolower(string[i]);
+  }
+}
+
+void usage(const char *name) {
+  logger->log("Usage: %s --locale loc_name --platform platform\n", name);
+}
+
+void listKnownPlatforms() {
+  uint32_t i = 0;
+  logger->log("Known platforms:\n");
+  for(i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
+    logger->log("\t%s\n", platforms[i]);
+  }
+}
+
+void addPlatform(const char *platform) {
+  uint32_t i;
+  //stringToLower(platform);
+  int32_t oldPlatformNo = gPlatformNo;
+
+  for(i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
+    if(strcmp(platform, platforms[i].name) == 0) {
+      gPlatformIndexes[gPlatformNo++] = i;
+    }
+  }
+  if(gPlatformNo == oldPlatformNo) {
+    logger->log("Unknown platform %s\n", platform);
+    listKnownPlatforms();
+  }
+}
+
+void processArgs(int argc, char* argv[], UErrorCode &status)
+{
+  int32_t i = 0;
+  U_MAIN_INIT_ARGS(argc, argv);
+
+  argc = u_parseArgs(argc, argv, (int32_t)(sizeof(options)/sizeof(options[0])), options);
+
+  if(argc < 0) {
+    logger->log("Unknown option: %s\n", argv[-argc]);
+    usage(progName);
+    return;
+  }
+
+  if(options[0].doesOccur || options[1].doesOccur) {
+    usage(progName);
+    return;
+  }
+  if(options[VERBOSE].doesOccur) {
+    gVerbose = TRUE;
+  }
+  if(options[DEBUG].doesOccur) {
+    gDebug = TRUE;
+    gVerbose = TRUE;
+  }
+  if(options[EXEMPLAR].doesOccur) {
+    gExemplar = TRUE;
+  }
+  if(options[QUIET].doesOccur) {
+    gQuiet = TRUE;
+  }
+
+  // ASCII based options specified on the command line
+  // this is for testing purposes, will allow to load
+  // up ICU rules and then poke through them.
+  // In that case, we test only ICU and don't need 
+  // a locale.
+  if(options[RULESSTDIN].doesOccur) {
+    gRulesStdin = TRUE;
+    addPlatform("icu");
+    return;
+  } 
+
+  if(options[LOCALE].doesOccur) {
+    gLocale = options[LOCALE].value;
+  } else {
+    gLocale = argv[1];
+    //for(i = 1; i < argc; i++) {
+    //gLocales[gLocaleNo++] = argv[i];
+    //}
+  }
+
+  if(options[PLATFORM].doesOccur) {
+    addPlatform(options[PLATFORM].value);
+  } else { // there is a list of platforms 
+    addPlatform("icu");
+  }
+
+  if(options[REFERENCE].doesOccur) {
+    for(i = 0; i < (int32_t)(sizeof(platforms)/sizeof(platforms[0])); i++) {
+      if(strcmp(options[REFERENCE].value, platforms[i].name) == 0) {
+        gRefNum = i;
+        break;
+      }
+    }
+    if(i == sizeof(platforms)/sizeof(platforms[0])) {
+      logger->log("Unknown reference %s!\n", options[REFERENCE].value);
+      status = U_ILLEGAL_ARGUMENT_ERROR;
+      return;
+    }
+  } else {
+    gRefNum = 0;
+  }
+
+  if(options[EXCLUDESET].doesOccur) {
+    gExcludeSet.applyPattern(UnicodeString(options[EXCLUDESET].value), status);
+    if(U_FAILURE(status)) {
+      logger->log("Cannot construct exclude set from argument %s. Error %s\n", options[EXCLUDESET].value, u_errorName(status));
+      return;
+    } else {
+      UnicodeString pattern;
+      logger->log(gExcludeSet.toPattern(pattern, TRUE), TRUE);
+    }
+  }
+
+  if(options[REPERTOIRE].doesOccur)  {
+    gRepertoire.applyPattern(UnicodeString(options[REPERTOIRE].value), status);
+    if(U_FAILURE(status)) {
+      logger->log("Cannot construct repertoire from argument %s. Error %s\n", options[REPERTOIRE].value, u_errorName(status));
+      return;
+    }
+  }
+
+  if(options[OUTPUT].doesOccur) {
+    outputFormat = options[OUTPUT].value;
+    if(strcmp(outputFormat, "HTML") == 0) {
+      outExtension = "html";
+    } else if(strcmp(outputFormat, "XML") == 0) {
+      outExtension = "xml";
+    } else {
+      outExtension = "txt";
+    }
+  }
+
+}
+
+// Check whether upper case comes before lower case or vice-versa
+int32_t 
+checkCaseOrdering(void) {
+  UChar stuff[][3] = {
+    { 0x0061, separatorChar, 0x0061}, //"aa",
+    { 0x0061, separatorChar, 0x0041 }, //"a\\u00E0",
+    { 0x0041, separatorChar, 0x0061 }, //"\\u00E0a",
+    { 0x0041, separatorChar, 0x0041 }, //"\\u00E0a",
+    //{ 0x00E0, separatorChar, 0x00E0 }  //"\\u00E0\\u00E0"
+  };
+  const int32_t size = sizeof(stuff)/sizeof(stuff[0]);
+
+  Line **sortedLines = new Line*[size];
+  Line lines[size];
+
+  int32_t i = 0;
+  int32_t ordered = 0, reversed = 0;
+
+  for(i = 0; i < size; i++) {
+    lines[i].setName(stuff[i], 3);
+  }
+  //setArray(sortedLines, lines, size);
+  qsort(sortedLines, size, sizeof(Line*), gComparer);
+
+  for(i = 0; i < size; i++) {
+    if(*(sortedLines+i) == &lines[i]) {
+      ordered++;
+    }
+    if(*(sortedLines+i) == &lines[size-i-1]) {
+      reversed++;
+    }
+  }
+
+  delete[] sortedLines;
+  if(ordered == size) {
+    return 0; // in normal order
+  } else if(reversed == size) {
+    return 1; // in reversed order
+  } else {
+    return -1; // unknown order
+  }
+}
+
+void
+getExemplars(const char *locale, UnicodeSet &exemplars, UErrorCode &status) {
+  // first we fill out structures with exemplar characters.
+  UResourceBundle *res = ures_open(NULL, locale, &status);
+  UnicodeString exemplarString = ures_getUnicodeStringByKey(res, "ExemplarCharacters", &status);
+  exemplars.clear();
+  exemplars.applyPattern(exemplarString, status);
+  ures_close(res);
+}
+
+
+void
+getFileNames(const char *name, char *tailoringName, char *tailoringDumpName, char *defaultName, char *defaultDumpName, char *diffName) {
+  if(tailoringName) {
+    strcpy(tailoringName, platforms[gPlatformIndexes[0]].name);
+    strcat(tailoringName, "/");
+    strcat(tailoringName, name);
+    strcat(tailoringName, "_raw.");
+    strcat(tailoringName, outExtension);
+  }
+  if(tailoringDumpName) {
+    strcpy(tailoringDumpName, platforms[gPlatformIndexes[0]].name);
+    strcat(tailoringDumpName, "/");
+    strcat(tailoringDumpName, name);
+    strcat(tailoringDumpName, ".dump");
+  }
+
+  if(diffName) {
+    strcpy(diffName, platforms[gPlatformIndexes[0]].name);
+    strcat(diffName, "/");
+    strcat(diffName, name);
+    strcat(diffName, "_collation.");
+    strcat(diffName, outExtension);
+  }
+
+  if(defaultName) {
+    strcpy(defaultName, platforms[gRefNum].name);
+    strcat(defaultName, "/");
+    strcat(defaultName, name);
+    strcat(defaultName, "_default_raw.");
+    strcat(defaultName, outExtension);
+  }
+
+  if(defaultDumpName) {
+    strcpy(defaultDumpName, platforms[gRefNum].name);
+    strcat(defaultDumpName, "/");
+    strcat(defaultDumpName, name);
+    strcat(defaultDumpName, "_default.dump");
+  }
+}
+
+void 
+setFiles(const char *name, UErrorCode &status) {
+  if(U_FAILURE(status)) {
+    return;
+  }
+  int32_t i = 0;
+  char tailoringName[256];
+  char tailoringDumpName[256];
+  char defaultName[256];
+  char defaultDumpName[256];
+  char diffName[256];
+
+  getFileNames(name, tailoringName, tailoringDumpName, defaultName, defaultDumpName, diffName);
+  if(options[PLATFORM].doesOccur && !options[DIFF].doesOccur) {  
+    if(createDir(platforms[gPlatformIndexes[0]].name) == 0) {
+      tailoringBundle = new UPrinter(tailoringName, "en", "utf-8", NULL, FALSE);
+      fTailoringDump = fopen(tailoringDumpName, "wb");
+    } else {
+      status = U_FILE_ACCESS_ERROR;
+      return;
+    }
+  }
+
+  if(options[REFERENCE].doesOccur && !options[DIFF].doesOccur) {
+    if(createDir(platforms[gRefNum].name) == 0) {
+      referenceBundle = new UPrinter(defaultName, "en", "utf-8", NULL, FALSE);
+      fDefaultDump = fopen(defaultDumpName, "wb");
+    } else {
+      status = U_FILE_ACCESS_ERROR;
+      return;
+    }
+  }
+
+  if((options[PLATFORM].doesOccur && options[REFERENCE].doesOccur) || options[DIFF].doesOccur) {
+    if(createDir(platforms[gPlatformIndexes[0]].name) == 0) {
+      bundle = new UPrinter(diffName, "en", "utf-8", NULL, FALSE);
+    }
+  }
+  if(options[DIFF].doesOccur) {
+    fTailoringDump = fopen(tailoringDumpName, "rb");
+    fDefaultDump = fopen(defaultDumpName, "rb");
+  }
+}
+
+
+UErrorCode status = U_ZERO_ERROR;
+static UnicodeSet UNASSIGNED(UnicodeString("[:Cn:]"), status);
+static UnicodeSet GENERAL_ACCENTS(UnicodeString("[[:block=Combining Diacritical Marks:]-[:Cn:]]"), status);
+//static UnicodeSet ASCII_BASE(UnicodeString("[[:ASCII:]-[:L:]-[:N:]]"), status);
+static UnicodeSet ASCII_BASE(UnicodeString("[[:ASCII:]]"), status);
+static UnicodeSet ALPHABETIC(UnicodeString("[:alphabetic:]"), status);
+//static UnicodeSet CONTROL(UnicodeString("[[:control:][\\u0000-\\u002F]]"), status);
+static UnicodeSet BMP(UnicodeString("[\\u0000-\\uFFFF]"), status);
+
+static UnicodeSet CONTROL(UnicodeString("[:control:]"), status);
+
+UCollator *
+setLocale(const char* locale, UErrorCode &status)
+{
+  gWinLCID = uloc_getLCID(locale);
+  setlocale(LC_COLLATE, locale);
+
+  if(gCol) {
+    ucol_close(gCol);
+  }
+  gCol = ucol_open(locale, &status);
+  ucol_setAttribute(gCol, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
+  //ucol_setAttribute(col, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
+  //ucol_setAttribute(col, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
+
+  return gCol;
+}
+
+
+
+UCollator *
+setReference(UErrorCode &status) 
+{
+  gWinLCID = uloc_getLCID("en");
+  setlocale(LC_COLLATE, "en_US.UTF-8");
+  if(gCol) {
+    ucol_close(gCol);
+  }
+  gCol = ucol_open("root", &status);
+  ucol_setAttribute(gCol, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
+  return gCol;
+}
+
+void
+processInteractive() {
+  char command[256];
+  while(fgets(command, 256, stdin)) {
+
+  }
+}
+
+UChar probeChars[][4] = {
+  { 0x0061, 0x0062, 0x00E1, 0x0041 }, // latin with a-grave
+  { 0x0041, 0x0042, 0x00C1, 0x0061 }, // upper first
+  { 0x006E, 0x006F, 0x00F1, 0x004E }, // latin with n-tilda
+  { 0x004E, 0x004F, 0x00D1, 0x006E }, // upper first
+  { 0x0433, 0x0493, 0x0491, 0x0413 }, // Cyrillic
+  { 0x0413, 0x0492, 0x0490, 0x0433 }, // upper first
+  { 0x3045, 0x3047, 0x3094, 0x3046 }  // Hiragana/Katakana (last resort)
+
+};
+
+void
+processCollator(UCollator *col, UErrorCode &status) {
+  int32_t i = 0;
+  uint32_t j = 0;
+  gCol = col;
+  UChar ruleString[16384];
+  char myLoc[256];
+
+  int32_t ruleStringLength = ucol_getRulesEx(gCol, UCOL_TAILORING_ONLY, ruleString, 16384);
+  logger->log(UnicodeString(ruleString, ruleStringLength), TRUE);
+  const char *locale = ucol_getLocale(gCol, ULOC_REQUESTED_LOCALE, &status);
+  if(locale == NULL) {
+    locale = "en";
+  }
+  strcpy(myLoc, locale);
+  UnicodeSet exemplarUSet;
+  UnicodeSet RefRepertoire;
+
+  UnicodeSet tailored;
+
+  tailored = *((UnicodeSet *)ucol_getTailoredSet(gCol, &status));
+  tailored.removeAll(CONTROL);
+
+
+  UnicodeString pattern;
+  int sanityResult;
+
+  UnicodeSet hanSet;
+  UBool hanAppears = FALSE;
+
+  debug->log("\nGenerating order for platform: %s\n", platforms[gPlatformIndexes[0]].name);
+  gComparer = platforms[gPlatformIndexes[0]].comparer;
+
+  StrengthProbe probe(platforms[gPlatformIndexes[0]].comparer, platforms[gPlatformIndexes[0]].skgetter, 0x0030, probeChars[0][0], probeChars[0][1], probeChars[0][2], probeChars[0][3]);
+  sanityResult = probe.checkSanity();
+  j = 0;
+  while(sanityResult && j+1 < sizeof(probeChars)/sizeof(probeChars[0])) {
+   j++;
+   sanityResult =  probe.setProbeChars(probeChars[j][0], probeChars[j][1], probeChars[j][2], probeChars[j][3]);
+  }
+  if(sanityResult) {
+    logger->log("Bad choice of probe characters! Sanity returned %i. Exiting\n", sanityResult, sanityResult);
+    return;
+  }
+  logger->log("Probe chars: %C, %C, %C, %C\n", probeChars[j][0], probeChars[j][1], probeChars[j][2], probeChars[j][3]); 
+
+  debug->off();
+
+  if(gRepertoire.size()) {
+    exemplarUSet = gRepertoire;
+  } else {
+    generateRepertoire(locale, exemplarUSet, hanAppears, status);
+  }
+  exemplarUSet.addAll(tailored);
+  hanSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_HAN, status);
+  exemplarUSet.removeAll(hanSet);
+  
+  logger->log(exemplarUSet.toPattern(pattern, TRUE), TRUE);
+
+  exemplarUSet = flatten(exemplarUSet, status);
+  logger->log(exemplarUSet.toPattern(pattern, TRUE), TRUE);
+
+  if(!options[PRINTREF].doesOccur) {
+
+    logger->log("\n*** Detecting ordering for the locale\n\n");
+
+    debug->on();
+    SortedLines lines(exemplarUSet, gExcludeSet, probe, logger, debug);
+    lines.analyse(status);
+    lines.calculateSortKeys();
+    debug->log("\n*** Final order\n\n");
+    debug->log(lines.toPrettyString(TRUE, TRUE), TRUE);
+    lines.toFile(fTailoringDump, TRUE, status);
+    tailoringBundle->log(lines.toOutput(outputFormat, myLoc, platforms[gPlatformIndexes[0]].name, NULL, TRUE, TRUE, hanAppears), TRUE);
+    //debug->off();
+
+    if(options[REFERENCE].doesOccur) {
+      status = U_ZERO_ERROR;
+      lines.getRepertoire(RefRepertoire);
+      setReference(status);
+
+      logger->log(exemplarUSet.toPattern(pattern, TRUE), TRUE);
+      logger->log(RefRepertoire.toPattern(pattern, TRUE), TRUE);
+
+      StrengthProbe RefProbe(platforms[gRefNum].comparer, platforms[gRefNum].skgetter);
+      logger->log("\n*** Detecting ordering for reference\n\n");
+      SortedLines RefLines(exemplarUSet, gExcludeSet, RefProbe, logger, debug);
+      RefLines.analyse(status);
+      referenceBundle->log(RefLines.toOutput(outputFormat, myLoc, platforms[gRefNum].name, NULL, TRUE, TRUE, FALSE), TRUE);
+      RefLines.toFile(fDefaultDump, TRUE, status);
+
+      lines.reduceDifference(RefLines);
+      logger->log("\n*** Final rules\n\n");
+      logger->log(lines.toPrettyString(TRUE), TRUE);
+      bundle->log(lines.toOutput(outputFormat, myLoc, platforms[gPlatformIndexes[0]].name, platforms[gRefNum].name, TRUE, TRUE, hanAppears), TRUE);
+    }
+  } else {
+    setReference(status);
+    StrengthProbe RefProbe(platforms[gRefNum].comparer, platforms[gRefNum].skgetter);
+    logger->log("\n*** Detecting ordering for reference\n\n");
+    SortedLines RefLines(exemplarUSet, gExcludeSet, RefProbe, logger, debug);
+    RefLines.analyse(status);
+    logger->log(RefLines.toPrettyString(TRUE), TRUE);
+    referenceBundle->log(RefLines.toOutput(outputFormat, myLoc, platforms[gRefNum].name, NULL, TRUE, TRUE, FALSE), TRUE);
+  }
+  if(hanAppears) {
+    // there are Han characters. This is a huge block. The best we can do is to just sort it, compare to empty
+    // and spit it out. Anything else would be a suicide (actually is - kernel just kills you :)
+    logger->log("\n*** Detecting order for Han\n");
+    debug->off();
+    setLocale(gLocale, status);
+    exemplarUSet.clear();
+    exemplarUSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_HAN, status);
+    exemplarUSet = flatten(exemplarUSet, status);
+    SortedLines han(exemplarUSet, gExcludeSet, probe, logger, debug);
+    han.sort(TRUE, TRUE);
+    han.classifyRepertoire();
+    han.getBounds(status);
+    tailoringBundle->log("Han ordering:<br>\n");
+    tailoringBundle->log(han.toOutput(outputFormat, myLoc, platforms[gPlatformIndexes[0]].name, NULL, TRUE, FALSE, FALSE), TRUE);
+    bundle->log(han.toOutput(outputFormat, myLoc, platforms[gPlatformIndexes[0]].name, NULL, TRUE, FALSE, FALSE), TRUE);
+  }
+  ucol_close(gCol);
+}
+
+void
+processLocale(const char *locale, UErrorCode &status) {
+  setLocale(locale, status);
+  setFiles(locale, status);
+  if(U_FAILURE(status)) {
+    return;
+  }
+
+  debug->log("Locale %s (LCID:%06X, unix:%s)\n", locale, gWinLCID, setlocale(LC_COLLATE, NULL));
+  tailoringBundle->log("// Ordering for locale %s (LCID:%06X, unix:%s), platform %s reference %s<br>\n", 
+    locale, gWinLCID, setlocale(LC_COLLATE, NULL), 
+    platforms[gPlatformIndexes[0]].name, platforms[gRefNum].name);
+  if(options[REFERENCE].doesOccur) {
+    referenceBundle->log("// Reference for locale %s (LCID:%06X, unix:%s), platform %s reference %s<br>\n", 
+      locale, gWinLCID, setlocale(LC_COLLATE, NULL), 
+      platforms[gPlatformIndexes[0]].name, platforms[gRefNum].name);
+  }
+
+
+  processCollator(gCol, status);
+}
+
+
+
+UBool 
+hasCollationElements(const char *locName) {
+
+  UErrorCode status = U_ZERO_ERROR;
+  UResourceBundle *ColEl = NULL;
+
+  UResourceBundle *loc = ures_open(NULL, locName, &status);;
+
+  if(U_SUCCESS(status)) {
+    status = U_ZERO_ERROR;
+    ColEl = ures_getByKey(loc, "CollationElements", ColEl, &status);
+    if(status == U_ZERO_ERROR) { /* do the test - there are real elements */
+      ures_close(ColEl);
+      ures_close(loc);
+      return TRUE;
+    }
+    ures_close(ColEl);
+    ures_close(loc);
+  }
+  return FALSE;
+}
+
+int
+main(int argc,
+     char* argv[])
+{
+  UErrorCode status = U_ZERO_ERROR;
+  logger = new UPrinter(stdout, "en", "latin-1");
+  debug =  new UPrinter(stderr, "en", "latin-1");
+
+/*
+  USet *wsp = uprv_openRuleWhiteSpaceSet(&status);
+  uset_add(wsp, 0x0041);
+  uset_remove(wsp, 0x0041);
+  UnicodeString pat;
+  ((UnicodeSet *)wsp)->toPattern(pat, TRUE);
+  pat.setCharAt(pat.length(), 0);
+  escapeString(pat.getBuffer(), pat.length(), log);
+  u_fflush(log);
+*/
+
+  processArgs(argc, argv, status);
+  int32_t i = 0;
+
+
+
+  if(U_FAILURE(status) || gPlatformNo == 0) {
+    return -1;
+  }
+
+  utf8cnv = ucnv_open("utf-8", &status);    // we are just doing UTF-8 locales for now.
+  gUCA = ucol_open("root", &status);
+
+  if(options[INTERACTIVE].doesOccur) {
+    processInteractive();
+  } else {
+    if(gRulesStdin) {
+      char buffer[1024];
+      UChar ruleBuffer[16384];
+      UChar *rules = ruleBuffer;
+      int32_t maxRuleLen = 16384;
+      int32_t rLen = 0;
+      while(fgets(buffer, 1024, stdin)) {
+        if(buffer[0] != '/' && buffer[1] != '/') {
+          rLen = u_unescape(buffer, rules, maxRuleLen);
+          rules += rLen;
+          maxRuleLen -= rLen;
+        }
+      }
+      UParseError parseError;
+      //escapeString(ruleBuffer, rules-ruleBuffer, log);//
+      debug->log("%U\n", ruleBuffer);
+
+      UCollator *col = ucol_openRules(ruleBuffer, rules-ruleBuffer, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status);
+      if(U_SUCCESS(status)) {
+        setFiles("stdinRules", status);
+        processCollator(col, status);
+      } else {
+        logger->log("Error %s\n", u_errorName(status));
+      }
+    } else if(options[DIFF].doesOccur) {
+      logger->log("Diffing two dumps\n");
+      // must have locale, platform and ref in order to be 
+      // able to find dump files.
+      setFiles(gLocale, status);
+  
+      if(fTailoringDump && fDefaultDump) {
+	    SortedLines tailoring(fTailoringDump, logger, debug, status);
+	    logger->log(tailoring.toString(TRUE), TRUE);
+	    SortedLines reference(fDefaultDump, logger, debug, status);
+	    logger->log(reference.toString(TRUE), TRUE);
+	    tailoring.reduceDifference(reference);
+	    logger->log("\n*** Final rules\n\n");
+	    logger->log(tailoring.toPrettyString(TRUE), TRUE);
+	    //result->log(lines.toPrettyString(TRUE), TRUE);
+	    bundle->log(tailoring.toOutput(outputFormat, gLocale, platforms[gPlatformIndexes[0]].name, platforms[gRefNum].name, TRUE, TRUE, FALSE), TRUE);
+      }
+
+    } else {
+      if(gLocale) {
+        processLocale(gLocale, status);
+      } else if(gLocaleNo) {
+        for(i = 0; i < gLocaleNo; i++) {
+          processLocale(gLocales[i], status);
+        }
+      } else { // do the loop through all the locales
+        int32_t noOfLoc = uloc_countAvailable();
+        const char *locName = NULL;
+        for(i = 0; i<noOfLoc; i++) {
+          status = U_ZERO_ERROR;
+          locName = uloc_getAvailable(i);
+          if(hasCollationElements(locName)) {
+            processLocale(locName, status);
+          }
+        }
+      }
+    }
+  }
+
+
+  ucol_close(gUCA);
+  ucnv_close(utf8cnv);
+
+  delete logger;
+  delete debug;
+  if(tailoringBundle) {
+    delete tailoringBundle;
+  }
+  if(referenceBundle) {
+    delete referenceBundle;
+  }
+  if(bundle) {
+    delete bundle;
+  }
+  if(fTailoringDump) {
+    fclose(fTailoringDump);
+  }
+  if(fDefaultDump) {
+    fclose(fDefaultDump);
+  }
+  return 0;
+}
+
+
+UnicodeString propertyAndValueName(UProperty prop, int32_t i) {
+  UnicodeString result;
+  result.append(u_getPropertyName(prop, U_LONG_PROPERTY_NAME));
+  result.append("=");
+  result.append(u_getPropertyValueName(prop, i, U_LONG_PROPERTY_NAME));
+
+    //+ "(" + prop + "," + i + ") ";
+  return result;
+}
+
+
+void generateRepertoire(const char *locale, UnicodeSet &rep, UBool &hanAppears, UErrorCode &status) {
+    UnicodeString dispName;
+    debug->log("Getting repertoire for %s\n", locale);
+    tailoringBundle->log("// Scripts in repertoire: ");
+    if(options[REFERENCE].doesOccur) {
+      referenceBundle->log("// Scripts in repertoire: ");
+    }
+	rep.clear();
+    UnicodeSet delta;
+    
+    UScriptCode script[256];
+    int32_t i = 0;
+    // now add the scripts for the locale
+    UProperty prop = UCHAR_SCRIPT;
+	int32_t scriptLength = uscript_getCode(locale, script, 256, &status);
+    if(scriptLength) {
+	  for (i = 0; i < scriptLength; ++i) {
+        if(script[i] == USCRIPT_HAN) {
+          hanAppears = TRUE;
+          continue;
+        }
+        delta.applyIntPropertyValue(prop, script[i], status);
+        debug->log("Adding ");
+        debug->log(propertyAndValueName(prop, script[i]), TRUE);
+        tailoringBundle->log("// ");
+        tailoringBundle->log(propertyAndValueName(prop, script[i]), TRUE);
+        if(options[REFERENCE].doesOccur) {
+          referenceBundle->log("// ");
+          referenceBundle->log(propertyAndValueName(prop, script[i]), TRUE);
+        }
+		rep.addAll(delta);
+	  }
+    } else {
+      delta.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_LATIN, status);
+      rep.addAll(delta);
+    }
+    
+    // now see which blocks those overlap, and add
+    prop = UCHAR_BLOCK;
+    int32_t min = u_getIntPropertyMinValue(prop);
+    int32_t max = u_getIntPropertyMaxValue(prop);
+    UnicodeSet checkDelta;
+    for (i = min; i <= max; ++i) {
+        // skip certain blocks
+        const char *name = u_getPropertyValueName(prop, i, U_LONG_PROPERTY_NAME);
+        if (strcmp(name, "Superscripts_and_Subscripts") == 0
+        || strcmp(name, "Letterlike_Symbols") == 0
+        || strcmp(name, "Alphabetic_Presentation_Forms") == 0
+        || strcmp(name, "Halfwidth_and_Fullwidth_Forms") == 0) continue;
+
+        delta.applyIntPropertyValue(prop, i, status).removeAll(UNASSIGNED);
+        if (!rep.containsSome(delta)) continue;
+        if (rep.containsAll(delta)) continue; // just to see what we are adding
+        debug->log("Adding ");
+        debug->log(propertyAndValueName(prop, i), TRUE);                
+        tailoringBundle->log("// ");
+        tailoringBundle->log(propertyAndValueName(prop, i), TRUE);
+        if(options[REFERENCE].doesOccur) {
+          referenceBundle->log("// ");
+          referenceBundle->log(propertyAndValueName(prop, i), TRUE);
+        }
+        rep.addAll(delta);
+    }
+    
+    // add ASCII and general accents
+    rep.addAll(GENERAL_ACCENTS).addAll(ASCII_BASE);
+    rep.removeAll(CONTROL);
+    //delta.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_HAN, status);
+    //rep.removeAll(delta);
+
+    // now add the exemplar characters
+    // can't get at them from Java right now
+    tailoringBundle->log("<br>\n");
+    if(options[REFERENCE].doesOccur) {
+      referenceBundle->log("<br>\n");
+    }
+}
+
+UnicodeSet flatten(const UnicodeSet &source, UErrorCode &status) {
+    UnicodeSet result;
+    UnicodeSetIterator it(source);
+    UnicodeString item, itemNFKD, toNormalize;
+    while (it.next()) {
+        // would be nicer if UnicodeSetIterator had a getString function
+        if (it.isString()) {
+          Normalizer::normalize(it.getString(), UNORM_NFD, 0, item, status);
+          Normalizer::normalize(it.getString(), UNORM_NFKD, 0, itemNFKD, status);
+        } else {
+          toNormalize.setTo(it.getCodepoint());
+          Normalizer::normalize(toNormalize, UNORM_NFD, 0, item, status);
+          Normalizer::normalize(toNormalize, UNORM_NFKD, 0, itemNFKD, status);
+        }
+        result.addAll(item);
+        result.addAll(itemNFKD);
+    }
+    return result;
+}
+
+
+void testWin(StrengthProbe &probe, UErrorCode &status) 
+{
+  UnicodeSet trailings(UnicodeString("[\\uFE7D\\uFE7C\\u30FD\\uFF70\\u30FC\\u309D\\u3032\\u3031\\u3005\\u0651]"), status);
+  char intChar[] = "\\uFE7D\\uFE7C\\u30FD\\uFF70\\u30FC\\u309D\\u3032\\u3031\\u3005\\u0651";
+  UChar interesting[256];
+  int32_t intLen = u_unescape(intChar, interesting, 256);
+  UChar i = 0;
+  UChar j = 0,  k = 0;
+  int32_t count;
+  Line myCh, combo, trial, inter, kLine;
+  for(i = 0; i < intLen; i++) {
+    inter.setTo(interesting[i]);
+    logger->log(inter.toString(TRUE), TRUE);
+    logger->log("----------------------\n");
+    for(j = 0; j < 0xFFFF; j++) {
+      myCh.setTo(j);
+      if(probe.distanceFromEmptyString(myCh) == UCOL_IDENTICAL) {
+        continue;
+      }
+      logger->log(myCh.toString(TRUE));
+      combo.setTo(j);
+      combo.append(interesting[i]);
+      count = 0;
+      for(k = 0; k < 0xFFFF; k++) {
+        kLine.setTo(k);
+        trial.setTo(j);
+        trial.append(k);
+        if(probe.compare(kLine, inter) < 0) {
+          if(probe.compare(trial, combo) >= 0) {
+            count++;
+          }
+        }
+      }
+      logger->log("%i %i\n", count, count);
+    }
+  }
+}
+
diff --git a/colprobe/createComparisonTables.pl b/colprobe/createComparisonTables.pl
new file mode 100755
index 0000000..18f6a14
--- /dev/null
+++ b/colprobe/createComparisonTables.pl
@@ -0,0 +1,164 @@
+#! /usr/bin/perl -w
+
+use strict;
+
+
+my $locale = $ARGV[0];
+
+
+my $long_name = `/home/weiv/src/icu/source/extra/colprobe/longname $locale`;
+my $pageTitle = $locale."_collation";
+my $filename = $pageTitle.".html";
+
+open TABLE, ">$filename";
+
+
+print TABLE <<"EndOfTemplate";
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>$pageTitle</title>
+<style>
+         <!--
+         table        { border-spacing: 0; border-collapse: collapse; width: 100%; 
+               border: 1px solid black }
+td, th       { width: 10%; border-spacing: 0; border-collapse: collapse; color: black; 
+               vertical-align: top; border: 1px solid black }
+-->
+     </style>
+</head>
+
+<body bgcolor="#FFFFFF">
+
+<p><b><font color="#FF0000">Collation:</font> $locale ($long_name) <a href="http://oss.software.ibm.com/cgi-bin/icu/lx/en/?_=$locale">Demo</a>, 
+
+<a href="../all_diff_xml/comparison_charts.html">Cover 
+Page</a>, <a href="../all_diff_xml/index.html">Index</a></b></p>
+<table>
+  <tr>
+EndOfTemplate
+
+my $dirCommon = "common";
+my $refCommon = $dirCommon."/UCARules.txt";
+my $nameCommon = $dirCommon."/".$locale."_collation.html";
+my $colorCommon = "#AD989D";
+
+my $loc;
+
+if(!(-e $nameCommon)) {
+  $locale =~ /_/;
+  $loc = $`;
+  $nameCommon = "$dirCommon/$loc"."_collation.html";
+}
+print TABLE "    <th bgcolor=\"$colorCommon\">COMMON (<a href=\"$refCommon\">UCA</a> <a href=\"../$dirCommon/xml/$locale.xml\">xml</a>)</th>\n";
+
+my $dirLinux = "linux";
+my $refLinux = $dirLinux."/".$locale.".utf8_default_raw.html";
+my $rawLinux = $dirLinux."/".$locale.".utf8_raw.html";
+my $defLinux = $dirLinux."/".$locale;
+my $nameLinux = "$dirLinux/$locale".".utf8_collation.html";
+my $colorLinux = "#1191F1";
+
+print TABLE "    <th bgcolor=\"$colorLinux\">LINUX (";
+if (!(-e $nameLinux)) {
+#try the variant that has @euro stuck in
+  $nameLinux = "$dirLinux/$locale".'.utf8@euro_collation.html';
+  if(-e $nameLinux) {
+    $refLinux = $dirLinux."/".$locale.'.utf8@euro_default_raw.html';
+    $rawLinux = $dirLinux."/".$locale.'.utf8@euro_raw.html';
+  }
+}
+if (-e $nameLinux) {
+    print TABLE "<a href=\"$rawLinux\">Ordering</a> <a href=\"$defLinux\">Definition</a> <a href=\"$refLinux\">base</a>";
+} 
+
+print TABLE " <a href=\"../$dirLinux/xml/$locale.xml\">xml</a>)</th>\n";
+
+my $dirWin = "winxp";
+my $refWin = $dirWin."/".$locale."_default_raw.html";
+my $rawWin = $dirWin."/".$locale."_raw.html";
+my $nameWin = "$dirWin/$locale"."_collation.html";
+my $colorWin = "#98FB98";
+
+print TABLE "    <th bgcolor=\"$colorWin\">WINDOWS ("; 
+if (-e $nameWin) {
+   print TABLE "<a href=\"$rawWin\">Ordering</a> <a href=\"$refWin\">base</a> ";
+} 
+print TABLE "<a href=\"../windows/xml/$locale.xml\">xml</a>)</th>\n";
+
+print TABLE "  </tr>\n  <tr>";
+
+
+readRules($nameCommon, "#AD989D", "Same as the UCA.");
+readRules($nameLinux, "#1191F1", "No data available.");      
+readRules($nameWin, "#98FB98", "No data available.");
+
+
+print TABLE <<"EndOfFooter";
+  </tr>
+</table>
+
+</body>
+</html>
+EndOfFooter
+
+
+sub readRules {
+  # readRules($file, $color)
+  my $filename  = shift;
+  my $color = shift;
+  my $comment = shift;
+  my $noLines = 0;
+  my $printOut = 0;
+
+  my $file;
+
+  if(-e $filename) {
+    open($file, "<$filename") || die "something very strange happened\n";
+    print TABLE "<td bgcolor=\"$color\">\n";
+    while (<$file>) {
+      if (/\}\<br\>$/) {
+        $printOut = 0;
+
+      }
+      if ($printOut) {
+        print TABLE $_;
+        $noLines++;
+      }
+      if (/Sequence/) {
+        $printOut = 1;
+        print "found sequence\n";
+        $noLines = 0;
+      }
+
+    }
+    if (!$noLines) {
+      print TABLE "Same ordering as base\n";
+    }
+    print TABLE "</td>\n";
+  } else {
+    print TABLE "<td bgcolor=\"$color\">\n$comment</td>\n";
+  }    
+}
+
+
+# Tasting of food product
+# 650-574-4551 $50 1 hour
+
+
+#     <td bgcolor="#AD989D">1.0-alpha</td>
+#     <td bgcolor="#FF6633">1.0</td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FF6633"><span title="006E {LATIN SMALL LETTER N}">&amp;n</span><br>
+#       <span title="006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&lt;&nbsp;ny</span><br>
+
+#       <span title="006E 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y} / 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;nny&nbsp;/&nbsp;ny</span><br>
+#       <span title="006E 0059 {LATIN SMALL LETTER N} {LATIN CAPITAL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&nbsp;nY</span><br>
+#     </td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FFFF33">1.2</td>
+
+#     <td bgcolor="#98FB98">Windows XP</td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FF6633">=</td>
diff --git a/colprobe/doComparisonTable.pl b/colprobe/doComparisonTable.pl
new file mode 100755
index 0000000..7a02ef34
--- /dev/null
+++ b/colprobe/doComparisonTable.pl
@@ -0,0 +1,209 @@
+#! /usr/bin/perl -w
+
+use strict;
+use IO::File;
+
+
+my $locale = $ARGV[0];
+
+
+my $long_name = `/home/weiv/src/icu/source/extra/colprobe/longname $locale`;
+print "Long name is $long_name\n";
+my $pageTitle = $locale." collation";
+my $filename = $locale.".html";
+
+open TABLE, ">$filename";
+
+
+print TABLE <<"EndOfTemplate";
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>$pageTitle</title>
+<style>
+         <!--
+         table        { border-spacing: 0; border-collapse: collapse; width: 100%; 
+               border: 1px solid black }
+td, th       { width: 10%; border-spacing: 0; border-collapse: collapse; color: black; 
+               vertical-align: top; border: 1px solid black }
+-->
+     </style>
+</head>
+
+<body bgcolor="#FFFFFF">
+
+<p><b><font color="#FF0000">Collation:</font> $locale ($long_name) <a href="http://oss.software.ibm.com/cgi-bin/icu/lx/en/?_=$locale">Demo</a>, 
+
+<a href="../../comparison_charts.html">Cover 
+Page</a>, <a href="../main/index.html">Locale Diffs Index</a>, <a href="index.html">Collation Diffs Index</a></b></p>
+<table>
+  <tr>
+EndOfTemplate
+
+my $dirCommon = "icucollations";
+my $refCommon = $dirCommon."/UCARules.txt";
+my $nameCommon = $dirCommon."/".$locale."_collation.html";
+my $colorCommon = "#AD989D";
+
+my $loc = $locale;
+
+if(!(-e $nameCommon)) {
+  $locale =~ /_/;
+  $loc = $`;
+  $nameCommon = "$dirCommon/$loc"."_collation.html";
+}
+
+print "Common is $nameCommon\n";
+
+print TABLE "    <th bgcolor=\"$colorCommon\">COMMON (";
+if(-e $nameCommon) {
+  print TABLE "<a href=\"../../common/collation/$loc.xml\">xml</a> ";
+}
+print TABLE "<a href=\"../../common/collation/root.xml\">UCA</a>)</th>\n";
+
+my $dirLinux = "linuxcollations";
+my $refLinux = $dirLinux."/".$locale.".utf8_default_raw.html";
+my $rawLinux = $dirLinux."/".$locale.".utf8_raw.html";
+my $defLinux = $dirLinux."/".$locale;
+my $nameLinux = "$dirLinux/$locale"."_collation.html";
+my $colorLinux = "#1191F1";
+
+print TABLE "    <th bgcolor=\"$colorLinux\">LINUX";
+if (!(-e $nameLinux)) {
+#try the variant that has @euro stuck in
+  $nameLinux = "$dirLinux/$locale".'.utf8@euro_collation.html';
+  if(-e $nameLinux) {
+    $refLinux = $dirLinux."/".$locale.'.utf8@euro_default_raw.html';
+    $rawLinux = $dirLinux."/".$locale.'.utf8@euro_raw.html';
+  }
+}
+if (-e $nameLinux) {
+  print TABLE " (<a href=\"../../linux/collation/$locale.xml\">xml</a>";
+  my $linuxBase = &getBaseLocale("$dirLinux/base", $locale);
+  if($linuxBase ne "") {
+    print TABLE " <a href=\"../../linux/collation/$linuxBase.xml\">Base ($linuxBase)</a>";
+  }
+  print TABLE ")";
+} 
+print TABLE "</th>\n";
+
+
+my $dirWin = "w2kcollations";
+my $refWin = $dirWin."/".$locale."_default_raw.html";
+my $rawWin = $dirWin."/".$locale."_raw.html";
+my $nameWin = "$dirWin/$locale"."_collation.html";
+my $colorWin = "#98FB98";
+$loc = $locale;
+#try fallback for windows
+print TABLE "    <th bgcolor=\"$colorWin\">WINDOWS"; 
+if(!(-e $nameWin)) {
+  $locale =~ /_/;
+  $loc = $`;
+  $nameWin = "$dirWin/$loc"."_collation.html";
+}
+
+print "Windows loc is $loc\n";
+
+if (-e $nameWin) {
+  print TABLE " (<a href=\"../../windows/collation/$loc.xml\">xml</a>";
+  my $winBase = &getBaseLocale("$dirWin/base", $locale);
+  if($winBase ne "") {
+    print TABLE "<a href=\"../../windows/collation/$winBase.xml\">base ($winBase)</a>";
+  }
+  print TABLE ")";
+} 
+print TABLE "</th>\n";
+print TABLE "  </tr>\n  <tr>";
+
+
+readRules($nameCommon, "#AD989D", "Same as the UCA.");
+readRules($nameLinux, "#1191F1", "No data available.");      
+readRules($nameWin, "#98FB98", "No data available.");
+
+
+print TABLE <<"EndOfFooter";
+  </tr>
+</table>
+
+</body>
+</html>
+EndOfFooter
+
+
+sub readRules {
+  # readRules($file, $color)
+  my $filename  = shift;
+  my $color = shift;
+  my $comment = shift;
+  my $noLines = 0;
+  my $printOut = 0;
+
+  my $file;
+
+  if(-e $filename) {
+    open($file, "<$filename") || die "something very strange happened\n";
+    print TABLE "<td bgcolor=\"$color\">\n";
+    while (<$file>) {
+      if (/\}\<br\>$/) {
+        $printOut = 0;
+
+      }
+      if ($printOut) {
+        if(!/^$/ && !/&nbsp;<br>$/) {
+          print TABLE $_;
+          $noLines++;
+        }
+      }
+      if (/Sequence/) {
+        $printOut = 1;
+        print "found sequence\n";
+        $noLines = 0;
+      }
+
+    }
+    if (!$noLines) {
+      print TABLE "Same ordering as base\n";
+    }
+    print TABLE "</td>\n";
+  } else {
+    print TABLE "<td bgcolor=\"$color\">\n$comment</td>\n";
+  }    
+}
+
+sub getBaseLocale(){
+    my $basefile = shift;
+    my $locale = shift;
+    my $baseFH = IO::File->new($basefile,"r")
+            or die  "could not open the file $basefile for reading: $! \n";
+    my $bse;
+    my $loc;
+    while(defined ( my $line = <$baseFH>)){
+        if( $line =~ /\<$locale\>/){
+            ($loc,$bse) = split (/\>/, $line);
+             $bse =~ s/^\s+\<//;
+             return $bse;
+        }
+    }
+}
+
+
+# Tasting of food product
+# 650-574-4551 $50 1 hour
+
+
+#     <td bgcolor="#AD989D">1.0-alpha</td>
+#     <td bgcolor="#FF6633">1.0</td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FF6633"><span title="006E {LATIN SMALL LETTER N}">&amp;n</span><br>
+#       <span title="006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&lt;&nbsp;ny</span><br>
+
+#       <span title="006E 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y} / 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;nny&nbsp;/&nbsp;ny</span><br>
+#       <span title="006E 0059 {LATIN SMALL LETTER N} {LATIN CAPITAL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&nbsp;nY</span><br>
+#     </td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FFFF33">1.2</td>
+
+#     <td bgcolor="#98FB98">Windows XP</td>
+#     <td bgcolor="#FF6633">=</td>
+#     <td bgcolor="#FF6633">=</td>
diff --git a/colprobe/extractCollationData.pl b/colprobe/extractCollationData.pl
new file mode 100755
index 0000000..f7079be
--- /dev/null
+++ b/colprobe/extractCollationData.pl
@@ -0,0 +1,246 @@
+#!/usr/bin/perl
+
+use strict;
+use Unicode::UCD 'charinfo';
+use Unicode::Normalize;
+use utf8;
+use open ':utf8';
+
+my $printout = 0;
+my $braces = 0;
+my $colls = 0;
+my $aliased = 0;
+my $newName = "";
+my $filename;
+my $suffix;
+my $locale;
+
+NEW_FILE:
+foreach my $arg (@ARGV) {
+  if($newName =~ /^$/) {
+    $locale = $arg;
+    $locale =~ s#^.*/##g;
+    $locale =~ s/\.txt//;
+  } else {
+    $newName = "";
+  }
+  my $command = "/home/weiv/build/current/bin/uconv -x hex-any/Java -f utf8 -t utf8 $arg";
+  print $command."\n";
+  my @bundle = `$command`;
+  foreach $_ (@bundle) {
+ #while(<>) {
+   #print $ARGV if eof;
+   if(/^\/\//) {
+     next;
+   }
+   if(/collations/) {
+     print "found Collations\n";
+     $colls = 1;
+     if(/alias/) {
+       print "collations are aliased\n";
+       $aliased = 1;
+     }
+   }
+   if($aliased) {
+     print "processing aliased data: $_\n";
+     if(/\{/) {
+       print "Braces opened\n";
+       $braces = 1;
+     }
+     if($braces && /\"(.*)\"/) {
+       $newName = $1;
+       print "Aliasing to $newName\n";
+     }
+     if($braces && /\}/) {
+       $braces = 0;
+       print "Braces closed\n";
+       $aliased = 0;
+       print "Switching from $filename to $newName\n";
+       $arg =~ s/$locale\.txt$/$newName\.txt/;
+       print "$arg\n";
+       redo NEW_FILE;
+     }
+
+   }
+   if(/standard|phonebook|traditional|pinyin|stroke|direct/ && $colls) {
+     print "found $& collation\n";
+     $suffix = "_".uc($&);
+     if(/standard/) {
+       $suffix = "";
+     }
+   }
+   if(/Sequence/ && $colls) {
+     #binmode ARGV, ":utf8";
+     $printout = 1;
+     #$filename = $ARGV;
+     $filename = $locale;
+     if($suffix) {
+       $filename .= "_".$suffix;
+     }
+     $filename .= "_collation.html";
+     print "filename is $filename\n";
+     #open(OUT, ">:utf8", "$filename");
+     open(OUT, ">$filename");
+     printHeading($arg);
+     #next;
+   }
+   my $line = $_;
+   if($line =~ /\{/ && $printout) {
+     $braces++;
+   }
+   if($printout) {
+     print OUT processLine($line);
+     print OUT "\n";
+   }
+   if( $line =~ /\}/ && $printout) {
+     $braces--;
+     if($braces == 0) {
+       $printout = 0;
+       printFooting();
+       close(OUT);
+     }
+   }
+ } 
+}
+
+sub processLine {
+  my $line = shift;
+  $_ = $line;
+  my $i = 0;
+  my $j = 0;
+  my $result;
+# remove comments
+  s#//.*$##g;
+# remove "Sequence" if present
+  s/Sequence\s*//;
+# remove leading brace if present
+  s/^\s*{//;
+# remove trailing brace if present
+  s/}\s*$//;
+# remove trailing quote
+  s/"\s*$//;
+#remove lead quote
+  s/^\s*"//;
+#separate options
+  s/(\[.*\])/\n\1/g;
+#separate resets
+  s/\s*\&\s*/\n\& /g;
+#separate strengths and insert spaces
+  s/\s*(<{1,4})\s*/\n\1 /g;
+#separate equals and insert spaces
+  s/\s*=\s*/\n= /g;
+
+# break into individual reset/strength/setting lines
+  my @lines = split(/\n/);
+
+  my $line;
+  my $name;
+  my $spanEnd = "";
+  my $result = "";
+  my $names = "";
+  my $codes = "";
+  my $lrm = "";
+
+  foreach $line (@lines) {
+    # skip empty lines
+    if($line =~ /^$/) {
+      next;
+    }
+    $spanEnd = "";
+    $name = "";
+    $lrm = "";
+    $line = NFC($line);
+    # for resets and strengths we will get name for elements
+    if($line =~ /<{1,4} |= |& \[.*\]|& /) {
+      $name = "<span title=\"";
+      $names = "";
+      $codes = "";
+      my $start = $&;
+      my $rest = $';
+      for ($j = 0; $j < length($rest); $j++) {
+	my $char = substr($rest, $j, 1);
+	my $charVal = ord($char);
+	# some of elements are part of the syntax, so they are
+	# entered without translation to the name
+	if($charVal == 0x002F || $charVal == 0x007C) {
+	  $name .= $codes.$names." $char ";
+	  $codes = "";
+	  $names = "";
+	} elsif($charVal == 0x0027) { #quote requires more processing
+	  #$name .= "'";
+	} else {
+	  my $charinfo = charinfo($charVal);
+	  $codes .= $charinfo->{'code'}." ";
+	  $names .= "{".$charinfo->{'name'}."} ";
+          if($charinfo->{'bidi'} eq "R" || $charinfo->{'bidi'} eq "AL") {
+            $lrm = "&lrm;";
+          }
+	  #$name .= $charinfo->{'code'}." {".$charinfo->{'name'}."} ";
+	}
+      }
+      $name .= $codes.$names."\" >";
+      $spanEnd = "</span>";
+    }
+    #print $name."\n";
+    if($line =~ /^<<<</) {
+      $line = "    $line";
+    } elsif($line =~ /^<<</) {
+      $line = "   $line";
+    } elsif($line =~ /^<</) {
+      $line = "  $line";
+    } elsif($line =~ /^</) {
+      $line = " $line";
+    } elsif($line =~ /^=/) {
+      $line = "    $line";
+    }
+    # insert spaces around vertical bars (fix prefixes)
+
+    # insert spaces around slashes (fix expansions)
+    $line =~ s#/# / #g;
+    # replace &
+    $line =~ s/\&/&amp;/g;
+    # replace spaces
+    $line =~ s/ /&nbsp;/g;
+    # replace <
+    $line =~ s/</&lt;/g;
+    # replace >
+    $line =~ s/>/&gt;/g;
+
+    #$lines[$i] = $name.$lrm.$line."</span><br>"; 
+    #$i++;
+    $result .=  $name.$lrm.$line.$spanEnd."<br>\n";
+  }
+
+  #$_ = join("\n", @lines);
+  return $result;
+
+}
+ 
+sub printHeading {
+my $filename = shift;
+$filename =~ s/\.txt//;
+print OUT <<"EndOfHeading";
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+</head>
+# Collation data resource bundle generated for locale: $filename<br>
+# For platform icu reference platform UCA<br><br>
+
+
+$filename&nbsp;{<br>
+&nbsp;&nbsp;CollationElements&nbsp;{<br>
+&nbsp;&nbsp;&nbsp;&nbsp;Sequence&nbsp;{<br>
+EndOfHeading
+}
+
+sub printFooting {
+print OUT <<"EndOfFooting";
+&nbsp;&nbsp;&nbsp;&nbsp;}<br>
+&nbsp;&nbsp;}<br>
+}<br>
+
+</pre>
+</html>
+EndOfFooting
+}
diff --git a/colprobe/gcd2.pl b/colprobe/gcd2.pl
new file mode 100755
index 0000000..c8e5f87
--- /dev/null
+++ b/colprobe/gcd2.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+#my $localeMinusA = `locale -a`;
+my $localeMinusA = `cat ~/src/icu/source/extra/colprobe/locale.txt`;
+my @locales = split(/\n/, $localeMinusA);
+my $locale;
+my $command;
+
+my $platform = $ARGV[0];
+
+mkdir $platform."logs2";
+mkdir $platform;
+
+foreach $locale (@locales) {
+  $command = "~/src/icu/source/extra/colprobe/colprobe --platform $platform --ref $platform --diff $locale >$platform"."logs2/$locale"."Log.txt 2>&1";
+  ($locale, $_) = split(/\./, $locale);
+  $command .= "; cp /usr/share/i18n/locales/$locale $platform/";
+  print "$command\n";
+  `$command`;
+  #chdir "..";
+
+}
diff --git a/colprobe/genCollData.pl b/colprobe/genCollData.pl
new file mode 100755
index 0000000..2f46184
--- /dev/null
+++ b/colprobe/genCollData.pl
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my $localeMinusA = `locale -a`;
+my @locales = split(/\n/, $localeMinusA);
+my $locale;
+my $command;
+
+my $platform = $ARGV[0];
+
+mkdir $platform."logs";
+mkdir $platform;
+
+foreach $locale (@locales) {
+  $command = "~/src/icu/source/extra/colprobe/colprobe --output resb --platform linux --ref linux $locale >$platform"."logs/$locale"."Log.txt 2>&1";
+  ($locale, $_) = split(/\./, $locale);
+  $command .= "; cp /usr/share/i18n/locales/$locale $platform/";
+  print "$command\n";
+  `$command`;
+  #chdir "..";
+
+}
diff --git a/colprobe/line.cpp b/colprobe/line.cpp
new file mode 100644
index 0000000..d8829d9
--- /dev/null
+++ b/colprobe/line.cpp
@@ -0,0 +1,701 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File line.cpp
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+#include "line.h"
+#include <stdio.h>
+
+UnicodeSet * Line::needsQuoting = NULL;
+
+void
+Line::init()
+{
+        len = 0;
+        expLen = 0;
+        strength = UCOL_OFF;
+        strengthFromEmpty = UCOL_OFF;
+        cumulativeStrength = UCOL_OFF;
+        expStrength = UCOL_OFF;
+        previous = NULL;
+        next = NULL;
+        left = NULL;
+        right = NULL;
+        isContraction = FALSE;
+        isExpansion = FALSE;
+        isRemoved = FALSE;
+        isReset = FALSE;
+        expIndex = 0;
+        firstCC = 0;
+        lastCC = 0;
+        sortKey = NULL;
+}
+
+Line::Line()
+{
+  init();
+  memset(name, 0, 25*sizeof(UChar));
+  memset(expansionString, 0, 25*sizeof(UChar));
+}
+
+Line::Line(const UChar* name, int32_t len)
+{
+  init();
+  this->len = len;
+  u_memcpy(this->name, name, len);
+  memset(expansionString, 0, 25*sizeof(UChar));
+  UChar32 c;
+  U16_GET(name, 0, 0, len, c);
+  firstCC = u_getCombiningClass(c);
+  U16_GET(name, 0, len-1, len, c);
+  lastCC = u_getCombiningClass(c);
+}
+
+Line::Line(const UChar name)
+{
+    init();
+    len = 1;
+    this->name[0] = name;
+    this->name[1] = 0;
+  memset(expansionString, 0, 25*sizeof(UChar));
+  firstCC = u_getCombiningClass(name);
+  lastCC = firstCC;
+}
+
+Line::Line(const UnicodeString &string)
+{
+  init();
+  setTo(string);
+}
+
+Line::Line(const char *buff, int32_t buffLen, UErrorCode &status) :
+previous(NULL),
+next(NULL),
+left(NULL),
+right(NULL)
+{
+  initFromString(buff, buffLen, status);
+}
+
+Line::Line(const Line &other) :
+  previous(NULL),
+  next(NULL),
+left(NULL),
+right(NULL)
+{
+  *this = other;
+}
+         
+Line &
+Line::operator=(const Line &other) {
+  len = other.len;
+  expLen = other.expLen;
+  strength = other.strength;
+  strengthFromEmpty = other.strengthFromEmpty;
+  cumulativeStrength = other.cumulativeStrength;
+  expStrength = other.expStrength;
+  isContraction = other.isContraction;
+  isExpansion = other.isExpansion;
+  isRemoved = other.isRemoved;
+  isReset = other.isReset;
+  expIndex = other.expIndex;
+  firstCC = other.firstCC;
+  lastCC = other.lastCC;
+  u_strcpy(name, other.name);
+  u_strcpy(expansionString, other.expansionString);
+  sortKey = other.sortKey;
+  left = other.left;
+  right = other.right;
+  return *this;
+}
+
+UBool 
+Line::operator==(const Line &other) const {
+  if(this == &other) {
+    return TRUE;
+  }
+  if(len != other.len) {
+    return FALSE;
+  }
+  if(u_strcmp(name, other.name) != 0) {
+    return FALSE;
+  }
+  return TRUE;
+}
+
+UBool 
+Line::equals(const Line &other) const {
+  if(this == &other) {
+    return TRUE;
+  }
+  if(len != other.len) {
+    return FALSE;
+  }
+  if(u_strcmp(name, other.name) != 0) {
+    return FALSE;
+  }
+  if(strength != other.strength) {
+    return FALSE;
+  }
+  if(expLen != other.expLen) {
+    return FALSE;
+  }
+  if(u_strcmp(expansionString, other.expansionString)) {
+    return FALSE;
+  }
+  return TRUE;
+}
+
+UBool
+Line::operator!=(const Line &other) const {
+  return !(*this == other);
+}
+
+
+Line::~Line() {
+}
+
+void
+Line::copyArray(Line *dest, const Line *src, int32_t size) {
+  int32_t i = 0;
+  for(i = 0; i < size; i++) {
+    dest[i] = src[i];
+  }
+}
+
+void
+Line::setName(const UChar* name, int32_t len) {
+  this->len = len;
+  u_memcpy(this->name, name, len);
+  UChar32 c;
+  U16_GET(name, 0, 0, len, c);
+  firstCC = u_getCombiningClass(c);
+  U16_GET(name, 0, len-1, len, c);
+  lastCC = u_getCombiningClass(c);
+}
+
+void 
+Line::setToConcat(const Line *first, const Line *second) {
+  u_strcpy(name, first->name);
+  u_strcat(name, second->name);
+  len = first->len + second->len;
+  firstCC = first->firstCC;
+  lastCC = second->lastCC;
+}
+
+UnicodeString
+Line::stringToName(UChar *string, int32_t len) {
+  UErrorCode status = U_ZERO_ERROR;
+  UnicodeString result;
+  char buffer[256];
+  int32_t i = 0;
+  UChar32 c; 
+  while(i < len) {
+    U16_NEXT(string, i, len, c);
+    if(c < 0x10000) {
+      sprintf(buffer, "%04X ", c);
+    } else {
+      sprintf(buffer, "%06X ", c);
+    }
+    result.append(buffer);
+  }
+  i = 0;
+  while(i < len) {
+    U16_NEXT(string, i, len, c);
+    u_charName(c, U_EXTENDED_CHAR_NAME, buffer, 256, &status);
+    result.append("{");
+    result.append(buffer);
+    result.append("} ");
+  }
+/*
+  for(i = 0; i < len; i++) {
+    sprintf(buffer, "%04X ", string[i]);
+    result.append(buffer);
+  }
+  for(i = 0; i < len; i++) {
+    u_charName(string[i], U_EXTENDED_CHAR_NAME, buffer, 256, &status);
+    result.append("{");
+    result.append(buffer);
+    result.append("} ");
+  }
+*/  
+  return result;
+}
+
+UnicodeString
+Line::toBundleString() 
+{
+
+  UnicodeString result;
+  UErrorCode status = U_ZERO_ERROR;
+  if(!needsQuoting) {
+    needsQuoting = new UnicodeSet("[[:whitespace:][:c:][:z:][[:ascii:]-[a-zA-Z0-9]]]", status);
+  }
+  UChar NFC[50];
+  int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status);
+  result.append("\"");
+  if(isReset) {
+    result.append("&");
+  } else {
+    result.append(strengthToString(strength, FALSE, FALSE));
+  }
+  UBool quote = needsQuoting->containsSome(name) || needsQuoting->containsSome(NFC);
+  if(quote) {
+    result.append("'");
+  }
+  if(NFC[0] == 0x22) {
+    result.append("\\u0022");
+  } else {
+    result.append(NFC, NFCLen);
+  }
+  if(quote && NFC[0] != 0x0027) {
+    result.append("'");
+  }
+  if(expLen && !isReset) {
+    quote = needsQuoting->containsSome(expansionString);
+    result.append(" / ");
+    if(quote) {
+      result.append("'");
+    }
+    result.append(expansionString);
+    if(quote) {
+      result.append("'");
+    }
+  }
+  result.append("\" //");
+
+  result.append(stringToName(NFC, NFCLen));
+  if(expLen && !isReset) {
+    result.append(" / ");
+    result.append(stringToName(expansionString, expLen));
+  }
+  result.append("\n");
+  return result;
+}
+
+UnicodeString
+Line::toHTMLString() 
+{
+  UnicodeString result;
+  UErrorCode status = U_ZERO_ERROR;
+  UChar NFC[50];
+  int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status);
+  result.append("<span title=\"");
+  result.append(stringToName(NFC, NFCLen));
+  if(expLen && !isReset) {
+    result.append(" / ");
+    result.append(stringToName(expansionString, expLen));
+  }
+  result.append("\">");
+  if(isReset) {
+    result.append("&amp;");
+  } else {
+    result.append(strengthToString(strength, FALSE, TRUE));
+  }
+  result.append(NFC, NFCLen);
+  if(expLen && !isReset) {
+    result.append("&nbsp;/&nbsp;");
+    result.append(expansionString);
+  }
+  result.append("</span><br>\n");
+  return result;
+}
+
+UnicodeString
+Line::toString(UBool pretty) {
+  UnicodeString result;
+  if(!pretty) {
+    result.setTo(name);
+    if(expLen) {
+      result.append("/");
+      result.append(expansionString);
+    }
+  } else {
+    UErrorCode status = U_ZERO_ERROR;
+    UChar NFC[50];
+    int32_t NFCLen = unorm_normalize(name, len, UNORM_NFC, 0, NFC, 50, &status);
+    result.setTo(NFC, NFCLen);
+    if(expLen) {
+      result.append("/");
+      result.append(expansionString);
+    }
+    /*
+    if(NFCLen != len || u_strncmp(name, NFC, len) != 0) {
+      result.append("(NFC: ");
+      result.append(NFC, NFCLen);
+      result.append(stringToName(NFC, NFCLen));
+      result.append(")");
+    }
+    */
+    result.append("    # ");
+    result.append(stringToName(NFC, NFCLen));
+    if(expLen) {
+      result.append("/ ");
+      result.append(stringToName(expansionString, expLen));
+    }
+  }
+  return result;
+}
+
+
+void
+Line::setTo(const UnicodeString &string) {
+  int32_t len = string.length();
+  u_strncpy(name, string.getBuffer(), len);
+  name[len] = 0;
+  this->len = len;
+  UChar32 c;
+  U16_GET(name, 0, 0, len, c);
+  firstCC = u_getCombiningClass(c);
+  U16_GET(name, 0, len-1, len, c);
+  lastCC = u_getCombiningClass(c);
+}
+
+void 
+Line::setTo(const UChar32 n) {
+  UBool isError = FALSE;
+  len = 0; // we are setting the line to char, not appending
+  U16_APPEND(name, len, 25, n, isError);
+  name[len] = 0;
+  firstCC = u_getCombiningClass(n);
+  lastCC = firstCC;
+}
+
+
+UnicodeString
+Line::strengthIndent(UColAttributeValue strength, int indentSize, UnicodeString &result) 
+{
+  int i;
+  int numIndents = strength+1;
+  if(strength > UCOL_IDENTICAL) {
+    return result;
+  } else if(strength == UCOL_IDENTICAL) {
+    numIndents = 5;
+  }
+  for(i = 0; i < numIndents*indentSize; i++) {
+    result.append(" ");
+  }
+  return result;
+}
+
+UnicodeString 
+Line::strengthToString(UColAttributeValue strength, UBool pretty, UBool html) {
+  UnicodeString result;
+  if(html) {
+    switch(strength) {
+    case UCOL_IDENTICAL:
+      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;");
+      break;
+    case UCOL_QUATERNARY:
+      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&lt;&nbsp;");
+      break;
+    case UCOL_TERTIARY:
+      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&nbsp;");
+      break;
+    case UCOL_SECONDARY:
+      result.append("&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;");
+      break;
+    case UCOL_PRIMARY:
+      result.append("&nbsp;&nbsp;&lt;&nbsp;");
+      break;
+    case UCOL_OFF:
+      result.append("&nbsp;&gt;?&nbsp;");
+      break;
+    default:
+      result.append("&nbsp;?!&nbsp;");
+      break;
+    }
+  } else {
+    switch(strength) {
+    case UCOL_IDENTICAL:
+      if(pretty) {
+        result.append("        ");
+      }
+      result.append(" = ");
+      break;
+    case UCOL_QUATERNARY:
+      if(pretty) {
+        result.append("        ");
+      }
+      result.append(" <<<< ");
+      break;
+    case UCOL_TERTIARY:
+      //u_fprintf(file, "<3");
+      if(pretty) {
+        result.append("      ");
+      }
+      result.append(" <<< ");
+      break;
+    case UCOL_SECONDARY:
+      //u_fprintf(file, "<2");
+      if(pretty) {
+        result.append("    ");
+      }
+      result.append(" << ");
+      break;
+    case UCOL_PRIMARY:
+      //u_fprintf(file, "<1");
+      if(pretty) {
+        result.append("  ");
+      }
+      result.append(" < ");
+      break;
+    case UCOL_OFF:
+      result.append(" >? ");
+      break;
+    default:
+      result.append(" ?! ");
+      break;
+    }
+  }
+  return result;
+}
+
+Line *
+Line::nextInteresting() {
+  Line *result = this->next;
+  while(result && result->strength != UCOL_IDENTICAL) {
+    result = result->next;
+  }
+  return result;
+}
+
+void
+Line::append(const UChar* n, int32_t length) 
+{
+  u_strncat(name, n, length);
+  name[len+length] = 0;
+  len += length;
+  UChar32 end;
+  U16_GET(n, 0, length-1, length, end);
+  lastCC = u_getCombiningClass(end);
+}
+
+void
+Line::append(const UChar n) 
+{
+  name[len] = n;
+  name[len+1] = 0;
+  len++;
+  lastCC = u_getCombiningClass(n);
+}
+
+void
+Line::append(const Line &l)
+{
+  append(l.name, l.len);
+  lastCC = l.lastCC;
+}
+
+void
+Line::clear()
+{
+  name[0] = 0;
+  len = 0;
+}
+
+int32_t
+Line::write(char *buff, int32_t, UErrorCode &) 
+{
+  /*
+    UChar     name[25];
+    int32_t   len;
+    UChar     expansionString[25];
+    int32_t   expLen;
+
+    UColAttributeValue strength;
+    UColAttributeValue strengthFromEmpty;
+    UColAttributeValue cumulativeStrength;
+    UColAttributeValue expStrength;
+
+    Line *previous;
+    Line *next;
+
+    UBool   isContraction;
+    UBool   isExpansion;
+    UBool   isRemoved;
+    UBool   isReset;
+
+    int32_t expIndex;
+    uint8_t firstCC;
+    uint8_t lastCC;
+*/
+  int32_t resLen = 0;
+  int32_t i = 0;
+  sprintf(buff+resLen, "%04X", name[0]);
+  resLen += 4;
+  for(i = 1; i < len; i++) {
+    sprintf(buff+resLen, " %04X", name[i]);
+    resLen += 5;
+  }
+  sprintf(buff+resLen, "/");
+  resLen += 1;
+
+  i = 0;
+  if(expLen) {
+    sprintf(buff+resLen, "%04X", expansionString[0]);
+    resLen += 4;
+    for(i = 1; i < expLen; i++) {
+      sprintf(buff+resLen, " %04X", expansionString[i]);
+      resLen += 5;
+    }
+  }
+  sprintf(buff+resLen, "; ");
+  resLen += 2;
+
+  sprintf(buff+resLen, "%02i ", strength);
+  resLen += 3;
+  sprintf(buff+resLen, "%02i", strengthFromEmpty);
+  resLen += 2;
+  sprintf(buff+resLen, "%02i", cumulativeStrength);
+  resLen += 2;
+  sprintf(buff+resLen, "%02i", expStrength);
+  resLen += 2;
+
+  // Various flags. The only interesting ones are isReset and isRemoved. We will not output removed lines
+  //sprintf(buff+resLen, "%1i%1i%1i%1i ", isContraction, isExpansion, isRemoved, isReset);
+  //resLen += 5;
+  sprintf(buff+resLen, "%1i%1i ", isRemoved, isReset);
+  resLen += 3;
+
+  // first and last CC
+  // can be calculated on reading
+  //sprintf(buff+resLen, "%03i %03i ", firstCC, lastCC);
+  //resLen += 8;
+
+  sprintf(buff+resLen, "%08X", expIndex);
+  resLen += 8;
+
+  buff[resLen] = 0;
+
+  return resLen;
+}
+
+void
+Line::initFromString(const char *buff, int32_t, UErrorCode &)
+{
+  int32_t bufIndex = 0;
+  int32_t i = 0;
+
+  sscanf(buff+bufIndex, "%04X", &name[i]);
+  i++;
+  bufIndex += 4;
+  while(buff[bufIndex] != '/') {
+    sscanf(buff+bufIndex, " %04X", &name[i]);
+    i++;
+    bufIndex += 5;
+  }
+  len = i;
+  name[len] = 0;
+  bufIndex++;
+
+  if(i > 1) {
+    isContraction = TRUE;
+  } else {
+    isContraction = FALSE;
+  }
+
+  if(buff[bufIndex] == ';') {
+    isExpansion = FALSE;
+    bufIndex += 2;
+    expansionString[0] = 0;
+    expLen = 0;
+  } else {
+    i = 0;
+    sscanf(buff+bufIndex, "%04X", &expansionString[i]);
+    i++;
+    bufIndex += 4;
+    while(buff[bufIndex] != ';') {
+      sscanf(buff+bufIndex, " %04X", &expansionString[i]);
+      i++;
+      bufIndex += 5;
+    }
+    expLen = i;
+    expansionString[expLen] = 0;
+    bufIndex += 2;
+  }
+  sscanf(buff+bufIndex, "%02i ", &strength);
+  bufIndex += 3;
+  sscanf(buff+bufIndex, "%02i", &strengthFromEmpty);
+  bufIndex += 2;
+  sscanf(buff+bufIndex, "%02i", &cumulativeStrength);
+  bufIndex += 2;
+  sscanf(buff+bufIndex, "%02i", &expStrength);
+  bufIndex += 2;
+
+  sscanf(buff+bufIndex, "%1i%1i ", &isRemoved, &isReset);
+  bufIndex += 3;
+
+  sscanf(buff+bufIndex, "%08X", &expIndex);
+  bufIndex += 8;
+
+  // calculate first and last CC
+  UChar32 c;
+  U16_GET(name, 0, 0, len, c);
+  firstCC = u_getCombiningClass(c);
+  U16_GET(name, 0, len-1, len, c);
+  lastCC = u_getCombiningClass(c);
+}
+
+void
+Line::swapCase(UChar *string, int32_t &sLen)
+{
+  UChar32 c = 0;
+  int32_t i = 0, j = 0;
+  UChar buff[256];
+  UBool isError = FALSE;
+  while(i < sLen) {
+    U16_NEXT(string, i, sLen, c);
+    if(u_isUUppercase(c)) {
+      c = u_tolower(c);
+    } else if(u_isULowercase(c)) {
+      c = u_toupper(c);
+    }
+    U16_APPEND(buff, j, 256, c, isError);
+  }
+  buff[j] = 0;
+  u_strcpy(string, buff);
+  sLen = j;
+}
+
+
+void
+Line::swapCase()
+{
+  swapCase(name, len);
+  swapCase(expansionString, expLen);
+}
+
+UnicodeString
+Line::dumpSortkey() 
+{
+
+  char buffer[256];
+  char *buff = buffer;
+  *buff = 0;
+  uint8_t *key = sortKey;
+  if(sortKey) {
+    while(*key) {
+      sprintf(buff, "%02X ", *key);
+      key++;
+      buff += 3;
+      if(buff - buffer > 252) {
+        break;
+      }
+    }
+  }
+  return UnicodeString(buffer);
+}
+
diff --git a/colprobe/line.h b/colprobe/line.h
new file mode 100644
index 0000000..31ce204
--- /dev/null
+++ b/colprobe/line.h
@@ -0,0 +1,113 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File line.h
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+//
+//   class Line
+//
+//      Each line from the source file (containing a name, presumably) gets
+//      one of these structs.
+//
+
+#ifndef COLPROBE_LINE_H
+#define COLPROBE_LINE_H
+#include "unicode/utypes.h"
+#include "unicode/ucol.h"
+#include "unicode/ustring.h"
+#include "unicode/unistr.h"
+#include "unicode/uchar.h"
+#include "unicode/uniset.h"
+#include "colprobe.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+static const int MAX_EXPANSION_PREFIXES = 10;
+
+class  Line {
+public:
+  static void copyArray(Line *dest, const Line *src, int32_t size);
+  Line();
+  Line(const Line &other);
+  Line(const UChar* name, int32_t len);
+  Line(const UnicodeString &string);
+  Line(const UChar name);
+  Line(const char *buff, int32_t buffLen, UErrorCode &status);
+  ~Line();
+  Line & operator=(const Line &other);
+  UBool operator==(const Line &other) const;
+  UBool operator!=(const Line &other) const;
+  void setToConcat(const Line *first, const Line *second);
+  void setName(const UChar* name, int32_t len);
+  UnicodeString toString(UBool pretty = FALSE);
+  UnicodeString toBundleString();
+  UnicodeString toHTMLString();
+  int32_t write(char *buff, int32_t buffLen, UErrorCode &status);
+  void initFromString(const char *buff, int32_t buffLen, UErrorCode &status);
+  
+
+  UnicodeString strengthIndent(UColAttributeValue strength, int indentSize, UnicodeString &result);
+  UnicodeString strengthToString(UColAttributeValue strength, UBool pretty, UBool html = FALSE);
+  UnicodeString stringToName(UChar *string, int32_t len);
+  void setTo(const UnicodeString &string);
+  void setTo(const UChar32 n);
+  UBool equals(const Line &other) const;
+  Line *nextInteresting();
+  void append(const UChar n);
+  void append(const UChar* n, int32_t length);
+  void append(const Line &l);
+  void clear();
+  void swapCase();
+  void swapCase(UChar *string, int32_t &sLen);
+  UnicodeString dumpSortkey();
+  void init();
+
+  
+public:
+    UChar     name[25];
+    int32_t   len;
+    UChar     expansionString[25];
+    int32_t   expLen;
+
+    UColAttributeValue strength;
+    UColAttributeValue strengthFromEmpty;
+    UColAttributeValue cumulativeStrength;
+    UColAttributeValue expStrength;
+
+    Line *previous;
+    Line *next;
+
+    // In case this element is a contraction
+    // we keep a pointer at which lines were components
+    Line *left;
+    Line *right;
+
+    UBool   isContraction;
+    UBool   isExpansion;
+    UBool   isRemoved;
+    UBool   isReset;
+
+    int32_t expIndex;
+    uint8_t firstCC;
+    uint8_t lastCC;
+
+    uint8_t   *sortKey;
+public:
+  static UnicodeSet *needsQuoting;
+};
+
+
+#endif //COLPROBE_LINE_H
diff --git a/colprobe/locale.txt b/colprobe/locale.txt
new file mode 100644
index 0000000..324ab56
--- /dev/null
+++ b/colprobe/locale.txt
@@ -0,0 +1,241 @@
+af
+af_ZA
+am
+am_ET
+ar
+ar_AE
+ar_BH
+ar_DZ
+ar_EG
+ar_IN
+ar_IQ
+ar_JO
+ar_KW
+ar_LB
+ar_LY
+ar_MA
+ar_OM
+ar_QA
+ar_SA
+ar_SD
+ar_SY
+ar_TN
+ar_YE
+be
+be_BY
+bg
+bg_BG
+bn
+bn_IN
+ca
+ca_ES
+#ca_ES_PREEURO
+cs
+cs_CZ
+da
+da_DK
+de
+de_AT
+#de_AT_PREEURO
+de_BE
+de_CH
+de_DE
+#de_DE_PREEURO
+de_LU
+#de_LU_PREEURO
+de__PHONEBOOK
+el
+el_GR
+#el_GR_PREEURO
+en
+en_AU
+en_BE
+#en_BE_PREEURO
+en_BW
+en_CA
+en_GB
+#en_GB_EURO
+en_HK
+en_IE
+#en_IE_PREEURO
+en_IN
+en_MT
+en_NZ
+en_PH
+en_SG
+en_US
+en_US_POSIX
+en_VI
+en_ZA
+en_ZW
+eo
+es
+es_AR
+es_BO
+es_CL
+es_CO
+es_CR
+es_DO
+es_EC
+es_ES
+#es_ES_PREEURO
+es_GT
+es_HN
+es_MX
+es_NI
+es_PA
+es_PE
+es_PR
+es_PY
+es_SV
+es_US
+es_UY
+es_VE
+es__TRADITIONAL
+et
+et_EE
+eu
+eu_ES
+#eu_ES_PREEURO
+fa
+fa_AF
+fa_IR
+fi
+fi_FI
+#fi_FI_PREEURO
+fo
+fo_FO
+fr
+fr_BE
+#fr_BE_PREEURO
+fr_CA
+fr_CH
+fr_FR
+#fr_FR_PREEURO
+fr_LU
+#fr_LU_PREEURO
+ga
+ga_IE
+#ga_IE_PREEURO
+gl
+gl_ES
+#gl_ES_PREEURO
+gu
+gu_IN
+gv
+gv_GB
+he
+he_IL
+hi
+hi_IN
+hi__DIRECT
+hr
+hr_HR
+hu
+hu_HU
+hy
+hy_AM
+hy_AM_REVISED
+id
+id_ID
+is
+is_IS
+it
+it_CH
+it_IT
+#it_IT_PREEURO
+ja
+ja_JP
+#ja_JP_TRADITIONAL
+kk_KZ
+kl
+kl_GL
+kn
+kn_IN
+ko
+ko_KR
+kok
+kok_IN
+kw
+kw_GB
+lt
+lt_LT
+lv
+lv_LV
+mk
+mk_MK
+mr
+mr_IN
+ms_MY
+mt
+mt_MT
+nb
+nb_NO
+nl
+nl_BE
+#nl_BE_PREEURO
+nl_NL
+#nl_NL_PREEURO
+nn
+nn_NO
+om
+om_ET
+om_KE
+pl
+pl_PL
+ps
+ps_AF
+pt
+pt_BR
+pt_PT
+#pt_PT_PREEURO
+ro
+ro_RO
+ru
+ru_RU
+ru_UA
+sh
+sh_YU
+sk
+sk_SK
+sl
+sl_SI
+so
+so_DJ
+so_ET
+so_KE
+so_SO
+sq
+sq_AL
+sr
+sr_YU
+sv
+sv_FI
+sv_SE
+sw
+sw_KE
+sw_TZ
+ta
+ta_IN
+te
+te_IN
+th
+th_TH
+#th_TH_TRADITIONAL
+ti
+ti_ER
+ti_ET
+tr
+tr_TR
+uk
+uk_UA
+vi
+vi_VN
+zh
+zh_CN
+zh_HK
+zh_MO
+zh_SG
+zh_TW
+zh_TW_STROKE
+zh__PINYIN
diff --git a/colprobe/longname.cpp b/colprobe/longname.cpp
new file mode 100644
index 0000000..71ba45d
--- /dev/null
+++ b/colprobe/longname.cpp
@@ -0,0 +1,48 @@
+#include "unicode/unistr.h"
+#include "unicode/locid.h"
+#include "unicode/ucnv.h"
+#include <stdio.h>
+
+int main(int argc,
+     char* argv[])
+{
+  UErrorCode status = U_ZERO_ERROR;
+  const char *loc = argv[1];
+  int32_t hasCountry;
+  UConverter *conv = ucnv_open("utf8", &status);
+
+  
+  UChar UBuffer[256];
+  int32_t uBufLen = 0;
+  char buffer[256];
+  int32_t bufLen = 0;
+
+  uBufLen = uloc_getDisplayLanguage(loc, "en", UBuffer, 256, &status);
+  bufLen = ucnv_fromUChars(conv, buffer, 256, UBuffer, uBufLen, &status);
+  //u_UCharsToChars(UBuffer,  buffer, uBufLen);
+  buffer[bufLen] = 0;
+  printf("%s", buffer);
+
+  if(hasCountry = uloc_getCountry(loc, buffer, 256, &status)) {
+    uBufLen = uloc_getDisplayCountry(loc, "en", UBuffer, 256, &status);
+    bufLen = ucnv_fromUChars(conv, buffer, 256, UBuffer, uBufLen, &status);
+    //u_UCharsToChars(UBuffer,  buffer, uBufLen);
+    buffer[bufLen] = 0;
+    printf("_%s", buffer);
+  }
+
+  if(uloc_getVariant(loc, buffer, 256, &status)) {
+    uBufLen = uloc_getDisplayVariant(loc, "en", UBuffer, 256, &status);
+    bufLen = ucnv_fromUChars(conv, buffer, 256, UBuffer, uBufLen, &status);
+    //u_UCharsToChars(UBuffer,  buffer, uBufLen);
+    buffer[bufLen] = 0;
+    if(!hasCountry) {
+      printf("_");
+    }
+    printf("_%s", buffer);
+  }
+  printf("\n");
+
+
+  return 0;
+}
diff --git a/colprobe/readme.txt b/colprobe/readme.txt
new file mode 100644
index 0000000..fd2914a
--- /dev/null
+++ b/colprobe/readme.txt
@@ -0,0 +1,4 @@
+There are several tools in this directory that should make it easier to generate collation data:
+extractCollationData.pl - perl script that reads ICU resource bundle files and outputs a locale_collation.html file if collation elements are present in the locale. Arguments are the list of locale source files (*.txt) that need to be processed.
+createComparisonTables.pl - takes a locale name. Looks in directories that should contain the html data produced by colprobe or extractCollationData.
+tableStarter.pl - invokes createComparisonTables.pl with a list of locales. 
diff --git a/colprobe/sortedlines.cpp b/colprobe/sortedlines.cpp
new file mode 100644
index 0000000..a4f3dfe
--- /dev/null
+++ b/colprobe/sortedlines.cpp
@@ -0,0 +1,2067 @@
+#include "sortedlines.h"
+
+static int codePointCmp(const void *a, const void *b) {
+  return u_strcmp((*(Line **)a)->name, (*(Line **)b)->name);
+}
+
+SortedLines::SortedLines(const UnicodeSet &set, const UnicodeSet &excludeBounds, const StrengthProbe &probe, 
+                         UPrinter *logger, UPrinter *debug) :
+toSort(NULL),
+toSortCapacity(0),
+lines(NULL),
+size(0),
+capacity(0),
+repertoire(set),
+excludeBounds(excludeBounds),
+probe(probe),
+first(NULL),
+last(NULL),
+logger(logger),
+debug(debug),
+contractionsTable(NULL),
+duplicators(NULL),
+maxExpansionPrefixSize(0),
+wordSort(FALSE),
+frenchSecondary(FALSE),
+upperFirst(FALSE),
+sortkeys(NULL),
+sortkeyOffset(0)
+{
+  memset(UB, 0, sizeof(UB));
+  int32_t i = 0;
+  for(i = 0; i < UCOL_OFF; i++) {
+    UB[i] = &empty;
+  }
+  init();
+}
+
+SortedLines::~SortedLines()
+{
+  delete[] lines;
+  if(sortkeys) {
+    delete[] sortkeys;
+  }
+  if(toSort) {
+    delete[] toSort;
+  }
+  if(contractionsTable) {
+    delete contractionsTable;
+  }
+  if(duplicators) {
+    delete duplicators;
+  }
+}
+
+void
+SortedLines::getBounds(UErrorCode &status) {
+  // first sort through the set
+  debug->log(toString(), TRUE);
+  int32_t i = 0, j = 0;
+  UColAttributeValue strength = UCOL_OFF;
+  for(i = 0; i < size; i++) {
+    if(toSort[i]->strengthFromEmpty < strength) {
+      if(i && strength < UCOL_OFF) {
+        //u_strcpy(UB[strength], toSort[i-1]->name);
+        j = 1;
+        while(excludeBounds.contains(UnicodeString(toSort[i-j]->name, toSort[i-j]->len))) {
+          j++;
+        }
+        UB[strength] = toSort[i-j];
+      }
+      strength = toSort[i]->strengthFromEmpty;
+      if(strength == UCOL_PRIMARY) {
+        probe.SE = toSort[i]->name[0];
+      }
+    }
+  }
+  //u_strcpy(UB[strength], toSort[size-1]->name);
+  // a different solution for bounds: go from end and see if the guys on the top
+  // cause duplication for things
+  UChar dupch[] = { 0x0020, 0x0030, 0x0042, 0x0051, 0x0062, 0x0071, 0x0391, 0x0396, 0x03b1, 0x03b6 };
+  j = 1;
+  Line dup;
+  Line bound;
+  int32_t dups = 0;
+  while(j < size) {
+    dups = 0;
+    for(i = 0; i < sizeof(dupch)/sizeof(dupch[0]); i++) {
+      dup.setTo(dupch[i]);
+      dup.append(dupch[i]);
+      bound.setTo(dupch[i]);
+      bound.append(toSort[size-j]->name, toSort[size-j]->len);
+      if(probe.getStrength(dup, bound) >= UCOL_IDENTICAL) {
+        dups++;
+      }
+    }
+    if(dups == 0) {
+      break;
+    } else {
+      if(!duplicators) {
+        duplicators = new Hashtable();
+      }
+      duplicators->put(UnicodeString(toSort[size-j]->name, toSort[size-j]->len), &toSort[size-j], status);
+      debug->log(toSort[size-j]->toString());
+      debug->log(" is not good enough to be an upper bound\n");
+      j++;
+    }
+  }
+  if(j == size) {
+    debug->log("Oi! I'm hallucinating. Will use the first upper bound");
+    delete duplicators;
+    duplicators = NULL;
+    j = 1;
+  }
+/*
+  j = 1;
+  while(excludeBounds.contains(UnicodeString(toSort[size-j]->name, toSort[size-j]->len))) {
+    j++;
+  }
+*/
+  UB[strength] = toSort[size-j];
+  for(i = 0; i < UCOL_OFF; i++) {
+    if(UB[i]) {
+      //debug->log(UB[i], TRUE);
+      debug->log(UB[i]->toString(TRUE), TRUE);
+    }
+  }
+}
+
+// classifies repertoire according to the strength of their difference
+// from the empty string
+void
+SortedLines::classifyRepertoire() {
+  UColAttributeValue strongestStrengthFromEmpty = UCOL_OFF;
+  int32_t lastChange = 0;
+  int32_t i = 0, j = 0;
+  while(i < size) // && probe.distanceFromEmptyString(*toSort[i]) > UCOL_PRIMARY) 
+  {
+    toSort[i]->strengthFromEmpty = probe.distanceFromEmptyString(*toSort[i]);
+    if(toSort[i]->strengthFromEmpty < strongestStrengthFromEmpty) {
+      strongestStrengthFromEmpty = toSort[i]->strengthFromEmpty;
+      lastChange = i;
+    } else if (toSort[i]->strengthFromEmpty > strongestStrengthFromEmpty) { 
+      // there is a problem in detection. Most probably a quaternary.
+      // why don't we try to interpolate
+      UColAttributeValue nextStrength = UCOL_OFF;
+      UColAttributeValue prevStrength = UCOL_OFF;
+      UColAttributeValue st = UCOL_OFF;
+
+      logger->log("Interpolating to get the distance from empty for Line ");
+      logger->log(toSort[i]->toString(TRUE), TRUE);
+
+      if(i) {
+        st = probe.getStrength(*toSort[i-1], *toSort[i]);
+        if(st == UCOL_OFF) {
+          logger->log("Cannot deduce distance from empty using previous element. Something is very wrong! Line:");
+          logger->log(toSort[i]->toString(TRUE), TRUE);
+        } else if(st == UCOL_IDENTICAL || st >= toSort[i-1]->strengthFromEmpty) {
+          prevStrength  = toSort[i-1]->strengthFromEmpty;
+        } else if(st < toSort[i-1]->strengthFromEmpty) { 
+          prevStrength = st;
+        }
+        toSort[i]->strengthFromEmpty = prevStrength;
+      }
+      if(i < size-2) {
+        toSort[i+1]->strengthFromEmpty = probe.distanceFromEmptyString(*toSort[i+1]);
+        st = probe.getStrength(*toSort[i+1], *toSort[i]);
+        if(st == UCOL_OFF) {
+          logger->log("Cannot deduce distance from empty using next element. Something is very wrong! Line:");
+          logger->log(toSort[i]->toString(TRUE), TRUE);
+        } else if(st == UCOL_IDENTICAL || st < toSort[i+1]->strengthFromEmpty) {
+          nextStrength = toSort[i+1]->strengthFromEmpty;
+        } else if(st >= toSort[i+1]->strengthFromEmpty) { 
+          nextStrength = st;
+        }        
+        if(i) {
+          if(prevStrength != nextStrength) {
+            logger->log("Inconsistent results from interpolation! Results will most likely be wrong\n");
+          }
+        }
+        toSort[i]->strengthFromEmpty = nextStrength;
+      }
+      /*
+      UColAttributeValue problemStrength = UCOL_PRIMARY;
+      for(j = lastChange; j < i ; j++) {
+        if(toSort[j]->strength > problemStrength) {
+          problemStrength = toSort[j]->strength;
+        }
+      }
+      for(j = lastChange; j < i ; j++) {
+        toSort[j]->strengthFromEmpty = problemStrength;
+      }
+      strongestStrengthFromEmpty = toSort[i]->strengthFromEmpty;
+      lastChange = i;
+      debug->log("Problem detected in distances from empty. Most probably word sort is on\n");
+      */
+      wordSort = TRUE;
+    }
+    i++;
+  }
+  debug->log("Distances from empty string\n");
+  debug->log(toStringFromEmpty(), TRUE);
+}
+
+void
+SortedLines::analyse(UErrorCode &status) {
+  frenchSecondary = probe.isFrenchSecondary(status);
+  if(U_FAILURE(status)) {
+    logger->log("Test for French secondary failed. Bailing out!\n");
+    return;
+  }
+  logger->log("French secondary value is %i\n", frenchSecondary, frenchSecondary);
+  upperFirst = probe.isUpperFirst(status);
+  if(U_FAILURE(status)) {
+    logger->log("Test for upper first failed. Bailing out!\n");
+    return;
+  }
+  logger->log("upper first value is %i\n", upperFirst, upperFirst);
+  sort(TRUE, TRUE);
+  classifyRepertoire();
+  getBounds(status);
+  //sort(TRUE, TRUE);
+  addContractionsToRepertoire(status);
+  //sort(TRUE, TRUE);
+  debug->log("\n*** Order after detecting contractions\n\n");
+  calculateSortKeys();
+  debug->log(toPrettyString(FALSE, TRUE), TRUE);
+  detectExpansions();
+}
+
+void SortedLines::init() 
+{
+  size = repertoire.size();
+  capacity = 5*size;
+  lines = new Line[capacity];
+  init(repertoire, lines);
+}
+
+void SortedLines::init(UnicodeSet &rep, Line *lin)
+{
+
+  UnicodeSetIterator exemplarUSetIter(rep);
+  int32_t size = 0;
+
+  while(exemplarUSetIter.next()) {
+    Line *currLine = lin+size;
+    if(exemplarUSetIter.isString()) { // process a string
+      currLine->setTo(exemplarUSetIter.getString());
+    } else { // process code point
+      currLine->setTo(exemplarUSetIter.getCodepoint());
+    }
+    currLine->name[currLine->len] = 0; // zero terminate, for our evil ways
+    //currLine->index = size;
+    size++;
+  }
+}
+
+void 
+SortedLines::setSortingArray(Line **sortingArray, Line *elements, int32_t sizeToSort) {
+  int32_t i = 0;
+  for(i = 0; i < sizeToSort; i++) {
+    sortingArray[i] = &elements[i];
+  }
+}
+
+int32_t
+SortedLines::setSortingArray(Line **sortingArray, Hashtable *table) {
+  int32_t size = table->count();
+  int32_t hashIndex = -1;
+  const UHashElement *hashElement = NULL;
+  int32_t count = 0;
+  while((hashElement = table->nextElement(hashIndex)) != NULL) {
+    sortingArray[count++] = (Line *)hashElement->value.pointer;
+  }
+  return size;
+}
+
+void
+SortedLines::sort(Line **sortingArray, int32_t sizeToSort, UBool setStrengths, UBool link) {
+  int32_t i = 0;
+  int32_t equalStart = 0;
+  UColAttributeValue equalStrength = UCOL_OFF;
+
+  qsort(sortingArray, sizeToSort, sizeof(Line *), probe.comparer);
+
+  if(setStrengths) { // analyze strengths
+    for(i = 1; i < sizeToSort; i++) {
+      sortingArray[i]->strength = probe.getStrength(*sortingArray[i-1], *sortingArray[i]);
+    }
+    // for equal guys, do the code point ordering
+    
+    i = 1;
+    while(i < sizeToSort) 
+    {
+      if(sortingArray[i]->strength == UCOL_IDENTICAL) {
+        equalStart = i - 1;
+        equalStrength = sortingArray[equalStart]->strength;
+        sortingArray[equalStart]->strength = UCOL_IDENTICAL;
+        while(i < sizeToSort && sortingArray[i]->strength == UCOL_IDENTICAL) {
+          i++;
+        }
+        qsort(sortingArray+equalStart, i-equalStart, sizeof(Line *), codePointCmp);
+        sortingArray[equalStart]->strength = equalStrength;
+      } else {
+        i++;
+      }
+    }
+    
+  }
+
+
+
+  if(link) { // do the linking
+    for(i = 0; i < sizeToSort - 1; i++) {
+      Line *curr = *(sortingArray+i);
+      curr->next = *(sortingArray+i+1);
+      (*(sortingArray+i+1))->previous = curr;
+    }
+  }
+}
+
+void
+SortedLines::sort(UBool setStrengths, UBool link) {
+  if(toSortCapacity < size || !toSort) {
+    if(toSort) {
+      delete[] toSort;
+    }
+    toSort = new Line*[size*2];
+    toSortCapacity = size*2;
+  }
+
+  setSortingArray(toSort, lines, size);
+  sort(toSort, size, setStrengths, link);
+
+  first = last = NULL;
+
+  if(link) { // do the linking
+    first = *toSort;
+    last = *(toSort+size-1);
+  }
+}
+
+void
+SortedLines::updateBounds(UnicodeSet &set) {
+  Line line;
+  UnicodeString s1;
+  UnicodeSetIterator it1(set); 
+  while(it1.next()) {
+    if(!debug->isOn()) {
+      logger->log(".");
+    }
+    if(it1.isString()) { // process a string
+      s1.setTo(it1.getString());
+    } else { // process code point
+      s1.setTo(it1.getCodepoint());
+    }
+    //line.setTo(s1);
+    UColAttributeValue strength = probe.distanceFromEmptyString(s1);
+    if(probe.compare(UnicodeString(UB[strength]->name), s1) < 0) {
+      // TODO: leak here - fixit!
+      UB[strength] = new Line(s1);
+      //u_strcpy(UB[strength], s1.getTerminatedBuffer());
+    }
+  }
+
+
+
+}
+
+void SortedLines::addAll(Line* toAdd, int32_t toAddSize) 
+{
+  if(size+toAddSize > capacity) {
+    int32_t doGrowingBreakpoint = 0;
+    // we need to do growing here
+  }
+  int32_t i = 0;
+
+  for(i = 0; i < toAddSize; i++) {
+    lines[size+i] = toAdd[i];
+  }
+  size += toAddSize;
+}
+
+void SortedLines::setDistancesFromEmpty(Line* array, int32_t arraySize)
+{
+  int32_t i = 0;
+  for(i = 0; i < arraySize; i++) {
+    array[i].strengthFromEmpty = probe.distanceFromEmptyString(array[i]);
+  }
+}
+
+
+// adds contractions in to repertoire
+int32_t SortedLines::addContractionsToRepertoire(UErrorCode &status) 
+{
+  logger->log("\n*** Detecting contractions\n\n");
+  contractionsTable = new Hashtable();
+  int32_t noConts = 0;
+  int32_t allocateSize = 50*size;
+  // first check for simple contractions
+  Line* delta = new Line[allocateSize];
+  Line** deltaSorted = new Line*[allocateSize];
+  Line* lesserToAddTo = new Line[allocateSize];
+  Line* newDelta = new Line[allocateSize];
+  Line** newDeltaSorted = new Line*[allocateSize];
+  Line* deltaP = delta; 
+  Line** deltaPP = deltaSorted;
+  Line* newDeltaP = newDelta;
+  int32_t deltaSize = 0, lesserToAddToSize = 0, newDeltaSize = 0;
+  logger->log("++ Contraction detection generation 0\n");
+  noConts = detectContractions(toSort, size, toSort, size, 
+			       delta, deltaSize, lesserToAddTo, lesserToAddToSize, 3*size, status);
+  setSortingArray(deltaSorted, delta, deltaSize);
+  sort(deltaSorted, deltaSize, TRUE);
+
+  setDistancesFromEmpty(delta, deltaSize);
+  int32_t deltaPSize = deltaSize;
+  //updateBounds(delta);
+
+  int32_t generation = 0;
+  // if we found any, we have to try multiple contractions
+  // However, we want to prevent the contractions explosion
+  // if the number of simple contractions is greater than the
+  // starting size, chances are that we either have an algorithmic
+  // contraction (like iteration marks on w2k) or something
+  // is seriosly wrong.
+  if(deltaPSize < size/2) {
+    while (deltaPSize && generation < 1) {
+      generation++;
+      logger->log("\n++ Contraction detection generation %i\n", generation, generation);
+      // find more, but avoid testing the combinations we already have
+      noConts += detectContractions(toSort, size, deltaPP, deltaPSize,
+				    newDeltaP, newDeltaSize, lesserToAddTo, lesserToAddToSize, 3*size, status);
+      noConts += detectContractions(deltaPP, deltaPSize, toSort, size, 
+				    newDeltaP, newDeltaSize, lesserToAddTo, lesserToAddToSize, 3*size, status);
+      calculateSortKeys();
+
+      addAll(deltaP, deltaPSize);
+      setSortingArray(toSort, lines, size);
+      sort(TRUE, TRUE);
+      setSortingArray(newDeltaSorted, newDeltaP, newDeltaSize);
+      sort(newDeltaSorted, newDeltaSize, TRUE);
+	  
+      // if no new ones, bail
+      //if (newDeltaSize == 0) break;
+
+      deltaPSize = newDeltaSize;
+      newDeltaSize = 0;
+      if(deltaP == delta) {
+        deltaP = newDelta;
+        deltaPP = newDeltaSorted;
+        newDeltaP = delta;
+      } else {
+        deltaP = delta;
+        deltaPP = deltaSorted;
+        newDeltaP = newDelta;
+      }
+      setDistancesFromEmpty(deltaP, deltaPSize);
+    }
+  }
+  status = U_ZERO_ERROR;
+  // add stuff from the last batch
+  addAll(deltaP, deltaPSize);
+
+  // warning: we don't add the lesser ones in recursively, since they will
+  // infinitely loop
+  setDistancesFromEmpty(lesserToAddTo, lesserToAddToSize);
+  addAll(lesserToAddTo, lesserToAddToSize);
+  setSortingArray(toSort, lines, size);
+  sort(TRUE, TRUE);
+
+  delete[] deltaSorted;
+  delete[] delta;
+  delete[] lesserToAddTo;
+  delete[] newDeltaSorted;
+  delete[] newDelta;
+  return noConts;
+}
+
+
+int32_t SortedLines::detectContractions(Line **firstRep, int32_t firstSize,
+                                        Line **secondRep, int32_t secondSize,
+                                        Line *toAddTo, int32_t &toAddToSize, 
+                                        Line *lesserToAddTo, int32_t &lesserToAddToSize,
+                                        int32_t capacity, UErrorCode &status) 
+{
+  int32_t noConts = 0;
+  int i = 0, j = 0, k = 0;
+  Line lower, upper, trial, toAdd, helper;
+  UChar32 firstStart, firstEnd, secondStart;
+  UChar NFCTrial[256];
+  int32_t NFCTrialLen = 0;
+  UBool thai;
+  i = -1;
+  while(i < firstSize-1 && U_SUCCESS(status)) {
+    i++;
+    if(!debug->isOn()) {
+      logger->log("\rTesting %05i/%05i. Found %05i conts.", i, firstSize, noConts);
+    }
+    U16_GET(firstRep[i]->name, 0, 0, firstRep[i]->len, firstStart);
+    if(uscript_getScript(firstStart, &status) == USCRIPT_HAN || firstRep[i]->strengthFromEmpty > UCOL_PRIMARY) //UCOL_TERTIARY) 
+      {
+        continue;
+      }
+    lower = *firstRep[i];
+    for(j = 0; j < secondSize; j++) {
+      if(noConts == capacity) {
+        return noConts;
+      }
+      U16_GET(secondRep[j]->name, 0, 0, secondRep[j]->len, secondStart);
+      if(firstStart == 0x41 && secondStart == 0x308) {
+      int32_t putBreakPointHere = 0;
+    }
+      if(uscript_getScript(secondStart, &status) == USCRIPT_HAN) // || secondRep[j]->strengthFromEmpty > UCOL_TERTIARY) 
+	{
+          continue;
+        }
+      	if(duplicators && duplicators->get(UnicodeString(secondRep[j]->name, secondRep[j]->len)) != NULL) {
+          debug->log("Skipping duplicator ");
+          debug->log(secondRep[j]->toString(), TRUE);
+		  continue;
+		}
+
+      if(firstRep[i]->name[0] == 0x61 && secondRep[j]->name[0] == 0x308) {
+	    int32_t putBreakpointhere = 0;
+      }
+      upper.setToConcat(firstRep[i], UB[UCOL_PRIMARY]);
+      //upper.setToConcat(firstRep[i], UB[secondRep[j]->strengthFromEmpty]);
+      toAdd.setToConcat(firstRep[i], secondRep[j]);          
+      U16_GET(firstRep[i]->name, 0, firstRep[i]->len-1, firstRep[i]->len, firstEnd);
+      if((thai = u_hasBinaryProperty(firstEnd, UCHAR_LOGICAL_ORDER_EXCEPTION))) {
+	// this means that the lower is single reordering character
+	// if we do the lower test without taking this into account,
+	// we'll comparing the secondRep directly to Thai. We add UB[UCOL_PRIMARY] to
+	// end of lower and in the middle of trial, so we will have 
+	// lower = Thai + UB, trial Thai + UB + x, resolving to
+	// UB + Thai vs UB + Thai + x.
+	// for upper bound, we do the similar, so we have
+	// upper = Thai + UB + UB, trial = Thai + UB + x,
+	// resolving to UB + Thai + UB vs UB + Thai + x
+	if(secondRep[j]->firstCC) {
+	  UChar32 UBChar;
+	  U16_GET(UB[UCOL_SECONDARY]->name, 0, 0, UB[UCOL_SECONDARY]->len, UBChar);
+	  if(secondRep[j]->firstCC > u_getCombiningClass(UBChar)) {
+	    continue;
+	  }
+	} 
+	upper = *firstRep[i];
+	upper.append(*UB[UCOL_PRIMARY]);
+	//upper.append(*UB[secondRep[j]->strengthFromEmpty]);
+	upper.append(*UB[UCOL_PRIMARY]);
+	lower.append(*UB[UCOL_PRIMARY]);
+	trial = *firstRep[i];
+	trial.append(*UB[UCOL_PRIMARY]);
+	trial.append(*secondRep[j]);
+      } else if((firstRep[i]->lastCC > secondRep[j]->firstCC && secondRep[j]->firstCC && !frenchSecondary) 
+		|| (firstRep[i]->firstCC < secondRep[j]->lastCC && firstRep[i]->firstCC && frenchSecondary)) {
+	// Skip because normalization will reorder
+	// there will be a chance to check this again, since if we
+	// try a+b, we will also try b+a
+	    continue;
+      } else if(frenchSecondary && (firstRep[i]->strengthFromEmpty > UCOL_PRIMARY && secondRep[j]->strengthFromEmpty > UCOL_PRIMARY)) {
+	    continue;
+      }else if(firstRep[i]->lastCC && secondRep[j]->firstCC && frenchSecondary) {
+	    trial.setToConcat(secondRep[j], firstRep[i]);
+      } else {
+    	trial.setToConcat(firstRep[i], secondRep[j]);          
+      }
+      // Now let's check the trial. The problem is that when you combine characters, 
+      // you can end up with concatenation that is unknown for the examined API.
+      NFCTrialLen = unorm_normalize(trial.name, trial.len, UNORM_NFC, 0, NFCTrial, 256, &status);
+      if((u_strcmp(trial.name, NFCTrial) == 0) || u_strFindLast(NFCTrial, NFCTrialLen, secondRep[j]->name, secondRep[j]->len)) {
+	   if(secondRep[j]->strengthFromEmpty > UCOL_TERTIARY) {
+	     continue;
+	   }
+	 }
+      UChar32 c;
+      U16_GET(NFCTrial, 0, 0, NFCTrialLen, c);
+      helper.setTo(c);
+      if(probe.distanceFromEmptyString(helper) > UCOL_TERTIARY) {
+	    continue;
+      }
+      if(NFCTrialLen > 1) {
+	    U16_GET(NFCTrial, 0, NFCTrialLen-1, NFCTrialLen, c);
+	    helper.setTo(c);
+        if(probe.distanceFromEmptyString(helper) > UCOL_TERTIARY) {
+	      continue;
+	    }
+      }
+
+      if (probe.compare(lower, trial) >= 0) { // if lower is bigger than trial
+        // this might be ok, but I'm having doubts. Here is an additional check:
+        if(firstRep[i]->len == 1 || secondRep[j]->strengthFromEmpty == UCOL_PRIMARY) {
+          // I'm basically saying that I'll add this kind of contraction for cases where I combine
+          // one letter with an accent OR when I'm combining more than one symbol with a letter.
+          noteContraction("L", lesserToAddTo, lesserToAddToSize, firstRep[i], secondRep[j], noConts, status);
+        }
+      } 
+      else if (probe.compare(trial, upper) > 0) { // trial is bigger than upper??
+        noteContraction("U", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+      } 
+#if 0
+      else if(firstRep[i]->strengthFromEmpty == UCOL_PRIMARY)
+      {
+        Line expansionLine;
+        if(getExpansionLine(trial, *firstRep[i], *secondRep[j], expansionLine) &&
+        expansionLine.len && !(expansionLine == *secondRep[j])) {
+          noteContraction("D", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+        }            
+      }
+#endif
+      else if(firstRep[i]->strengthFromEmpty == UCOL_PRIMARY && probe.getStrength(lower, trial) < secondRep[j]->strengthFromEmpty) {
+        noteContraction("D1", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+      } 
+      else if (firstRep[i]->strengthFromEmpty == UCOL_PRIMARY && secondRep[j]->strengthFromEmpty == UCOL_PRIMARY) 
+      {
+        // I have added an additional check. The checks versus upper and lower bound should be sufficient
+        // when the right side is a combining mark. There might be a reordering of combining marks, but
+        // that should be already visible in their order.
+	// compare the sequence 
+	// Y- <? Y <? Y+
+	// and 
+	// XY- <? XY <? XY+
+	Line xym, xyp, xy;
+	UBool xymIsContraction = FALSE, toAddIsContraction = FALSE;
+    if(j) {
+	  if(((!secondRep[j-1]->firstCC || firstRep[i]->lastCC < secondRep[j-1]->firstCC) && !frenchSecondary) 
+             ||((!firstRep[i]->firstCC || firstRep[i]->firstCC > secondRep[j-1]->lastCC) && frenchSecondary)) {
+	    xym.setToConcat(firstRep[i], secondRep[j-1]);
+	    toAdd.strength = probe.getStrength(xym, toAdd);
+	    if(secondRep[j]->strength != toAdd.strength) {
+	      // there is possibility that either xym or xy are contractions
+	      // There are two situations:
+	      // xym > xy or xym <n xy and ym <k y but n != k
+	      // if they are reordered, we are going to see if each of them 
+	      // is further reordered
+	      if(toAdd.strength == UCOL_OFF) {
+		// check whether toAdd shifted more down
+		k = j - 2;
+		while(k>=0 && secondRep[k]->strength > secondRep[j]->strength) {
+		  k--;
+		}
+		while(!toAddIsContraction && k>=0) {
+		  xyp.setToConcat(firstRep[i], secondRep[k]);
+		  if(contractionsTable->get(UnicodeString(xyp.name, xyp.len)) != NULL) {
+		    k--;
+		    continue;
+		  }
+		  if(probe.compare(xyp, xym) >= 0) {
+		    // xyp looks like a contraction
+		    noteContraction("!1", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+		    toAddIsContraction = TRUE;
+		  } else {
+		    break;
+		  }
+		}
+          // first let's see if xym has moved beyond
+          if(contractionsTable->get(UnicodeString(xym.name, xym.len)) == NULL) {
+            k = j+1;
+            // ignore weaker strengths
+            while(k < secondSize && secondRep[k]->strength > secondRep[j]->strength) {
+              k++;
+            }
+            // check if we skipped the following guy
+            if(k < secondSize) {
+              xyp.setToConcat(firstRep[i], secondRep[k]);
+              if(probe.compare(xyp, xym) <= 0) {
+	            // xyp looks like a contraction
+	            noteContraction("!2", toAddTo, toAddToSize, firstRep[i], secondRep[j-1], noConts, status);
+	            xymIsContraction = TRUE;
+              }
+            }
+          } else {
+            xymIsContraction = TRUE;
+          }
+          // if they have reordered, but none has moved, then we add them both
+          // and hope for the best
+          if(!xymIsContraction && !toAddIsContraction) {
+              // it is possible that there is an NFC version version of one of the 
+              // strings. If we have XY > XZ, but NFC(XZ) = W and X < W, we might have
+              // have a false contraction.
+              trial.len = unorm_normalize(toAdd.name, toAdd.len, UNORM_NFC, 0, trial.name, 25, &status);
+              //UColAttributeValue strength = probe.getStrength(*firstRep[i], trial);
+              if(trial == toAdd) {
+                noteContraction("!3", toAddTo, toAddToSize, firstRep[i], secondRep[j-1], noConts, status);
+                noteContraction("!3", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+              } else {
+                noteContraction("!4", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+              }
+            }
+	      } else { // only the strength has changed
+            // check whether the previous is contraction and if not, add the current
+            if(contractionsTable->get(UnicodeString(xym.name, xym.len)) == NULL) {
+              noteContraction("!5", toAddTo, toAddToSize, firstRep[i], secondRep[j], noConts, status);
+            }                  
+	      }
+	    }
+	  }
+	}
+      }
+      if(thai) { // restore lower
+        lower = *firstRep[i];
+      }
+    }
+  }
+  return noConts;
+}
+
+void
+SortedLines::noteContraction(const char* msg, Line *toAddTo, int32_t &toAddToSize, Line *left, Line *right, int32_t &noConts, UErrorCode &status) 
+{
+  Line toAdd;
+  toAdd.setToConcat(left, right);
+  toAdd.left = left;
+  toAdd.right = right;
+  // if we're adding an accent to an existing contraction, we want to check
+#if 0
+  Line test, trial1, trial2;
+  if(right->strengthFromEmpty > UCOL_PRIMARY) {
+    if(left->right && left->right->previous && left->right->next) {
+      test.setToConcat(left->left, left->right->previous);
+      trial1.setToConcat(&test, right);
+
+      test.setToConcat(left->left, left->right->next);
+      trial2.setToConcat(&test, right);
+      if(probe.compare(trial1, toAdd) < 0 && probe.compare(toAdd, trial2) < 0) {
+        // this means that the contraction has been broken by the newly added accent
+        // so while 'ch' is contraction, 'ch'+dot_above sorts between 'cg'+dot_above and 'ci'+dot_above
+        debug->log("Con -");
+        debug->log(msg);
+        debug->log(toAdd.toString(FALSE), TRUE);
+        return;
+      }
+    } else {
+      if(right->previous && right->next) {
+        trial1.setToConcat(left, right->previous);
+        trial2.setToConcat(left, right->next);
+        if(probe.compare(trial1, toAdd) < 0 && probe.compare(toAdd, trial2) < 0) {
+          // this means that the contraction has been broken by the newly added accent
+          // so while 'ch' is contraction, 'ch'+dot_above sorts between 'cg'+dot_above and 'ci'+dot_above
+          debug->log("Con -");
+          debug->log(msg);
+          debug->log(toAdd.toString(FALSE), TRUE);
+          return;
+        }
+      }
+      if(left->previous && left->next) {
+        trial1.setToConcat(left->previous, right);
+        trial2.setToConcat(left->next, right);
+        if(probe.compare(trial1, toAdd) < 0 && probe.compare(toAdd, trial2) < 0) {
+          // this means that the contraction has been broken by the newly added accent
+          // so while 'ch' is contraction, 'ch'+dot_above sorts between 'cg'+dot_above and 'ci'+dot_above
+          debug->log("Con -");
+          debug->log(msg);
+          debug->log(toAdd.toString(FALSE), TRUE);
+          return;
+        }
+      }
+
+    }
+  }
+  if(right->right && right->right->strengthFromEmpty > UCOL_PRIMARY && right->left->previous && right->left->next) { // maybe we already had a contraction with an accent
+    test.setToConcat(right->left->previous, right->right);
+    trial1.setToConcat(left, &test);
+    test.setToConcat(right->left->next, right->right);
+    trial2.setToConcat(left, &test);
+    if(probe.compare(trial1, toAdd) < 0 && probe.compare(toAdd, trial2) < 0) {
+      // this means that the contraction has been broken by the newly added accent
+      // so while 'ch' is contraction, 'ch'+dot_above sorts between 'cg'+dot_above and 'ci'+dot_above
+      debug->log("Con -");
+      debug->log(msg);
+      debug->log(toAdd.toString(FALSE), TRUE);
+      return;
+    }
+  }
+#endif
+  if(contractionsTable->get(UnicodeString(toAdd.name, toAdd.len)) == NULL) {
+    if(probe.distanceFromEmptyString(toAdd) <= UCOL_TERTIARY) {
+      toAddTo[toAddToSize++] = toAdd;
+      contractionsTable->put(UnicodeString(toAdd.name, toAdd.len), &toAdd, status);
+      noConts++;
+      debug->log(msg);
+      debug->log(" Con + ");
+      debug->log(toAdd.toString(FALSE), TRUE);
+
+      if(!left->sortKey) {
+        calculateSortKey(*left);
+      }
+      debug->log(left->dumpSortkey());
+      debug->log(" + ");
+
+      if(!right->sortKey) {
+        calculateSortKey(*right);
+      }
+      debug->log(right->dumpSortkey());
+      debug->log(" = ");
+
+      calculateSortKey(toAdd);
+      debug->log(toAdd.dumpSortkey(), TRUE);
+      if(noConts > size/2) {
+        status = U_BUFFER_OVERFLOW_ERROR;
+      }
+    }
+  }
+}
+
+
+UBool
+SortedLines::getExpansionLine(const Line &expansion, const Line &previous, const Line &exp, Line &expansionLine) 
+{
+  int expIndexSize = 0;
+  UColAttributeValue expStrength = UCOL_OFF;
+  int32_t comparisonResult = 0;
+  int32_t i = 0, k = 0, prevK = 0;
+  Line trial;
+  UBool sequenceCompleted = FALSE;
+  int32_t expIndexes[256];
+  int32_t expIndexesSize = 0;
+
+  if(!sequenceCompleted) {
+    expIndexSize = 0;
+    expansionLine.clear();
+
+    // we will start from strength between the expansion
+    // and the target (toSort[i] and toSort[j]. First we
+    // will add as many primaries as possible. Then we will
+    // try to add secondary pieces and then tertiary. 
+    // found an expansion - what is the expanding sequence?
+  
+    expStrength = UCOL_PRIMARY;
+    while(!sequenceCompleted) {
+      k = 0;
+      prevK = 0;
+      while(k < size) {
+        if(expansionLine.len > 15) {
+          sequenceCompleted = TRUE;
+          break;
+        }
+        while(k < size && toSort[k]->strength != UCOL_PRIMARY) 
+        {
+          k++;
+        }
+        // nothing found
+        if(k == size) {
+          break;
+        }
+        // we need to skip over reordering things. If they were worthy, they would
+        // have been detected in the previous iteration.
+        //if(expansionLine.lastCC && toSort[k]->firstCC && expansionLine.lastCC > toSort[k]->firstCC) {
+          //k++;
+          //continue;
+        //}
+        trial = previous;
+        trial.append(expansionLine);
+        trial.append(*toSort[k]);        
+        if(toSort[k]->name[0] == 0x0067) {
+          int32_t putBreakPointHere = 0;
+        }
+        comparisonResult = probe.compare(trial, expansion);
+        if(comparisonResult == 0) {
+          expansionLine = *toSort[k];
+          return TRUE;
+        } else if (comparisonResult > 0) {
+          if(prevK) {
+            if(exp == *toSort[prevK]) {
+              expansionLine = exp;
+              return TRUE;
+            }
+            i = prevK;
+            while(i < k-1) {
+              i++;
+              if(toSort[i]->strength > exp.strength) {
+                continue;
+              }
+              trial = previous;
+              trial.append(expansionLine);
+              trial.append(*toSort[i]);
+              if(probe.compare(trial, expansion) > 0) {
+                break;
+              }
+            }
+            // we got into situation where we have ch > ch+dot-below
+            // however, ch is a contraction and therefore we cannot use
+            // it properly. If we have hit on a contraction, we'll just try
+            // to continue. Probably need more logic here.
+            if(contractionsTable->get(UnicodeString(trial.name, trial.len)) == NULL) {
+              expansionLine.append(*toSort[i-1]);
+              expIndexes[expIndexSize++] = i-1;
+              break;
+            } else {
+              int32_t putBreakPointHere = 0;
+            }
+          } else {
+            sequenceCompleted = TRUE;
+            break;
+          }
+          //break;
+        }
+        prevK = k;
+        k++;
+      }
+      if(!prevK || k == size) {
+        break;
+      }
+    }
+  }
+  return expIndexSize > 0;
+}
+
+int32_t
+SortedLines::gooseUp(int32_t resetIndex, int32_t expansionIndex, Line &expLine, int32_t *expIndexes, int32_t &expIndexSize, UColAttributeValue strength) 
+{
+  int32_t i = expansionIndex, k = resetIndex+1, n = 0, m = 0, start = 0;
+  UBool haveChanges = FALSE;
+  Line trial, prefix, suffix;
+  // we will first try goosing up the reset index
+  //while(toSort[k]->strength >= strength)
+  for( ; toSort[k]->strength == strength; k++) 
+  {
+    //if(toSort[k]->strength > strength) {
+      //continue;
+    //}
+    trial.setToConcat(toSort[k], &expLine);
+    if(probe.compare(trial, *toSort[i]) > 0) {
+      break;
+    }
+  }
+  resetIndex = k-1;
+
+  // goose up individual characters
+  prefix = *toSort[resetIndex];
+  for(n = 0; n < expIndexSize; n++) {
+    suffix.clear();
+    for(m = n+1; m < expIndexSize; m++) {
+      suffix.append(*toSort[expIndexes[m]]);
+    }
+    k = expIndexes[n]+1;
+    //while(toSort[k]->strength >= strength)
+    for( ; toSort[k]->strength == strength; k++) 
+    {
+      //if(toSort[k]->strength > strength) {
+        //continue;
+      //}
+      trial.setToConcat(&prefix, toSort[k]);
+      trial.append(suffix);
+      if(probe.compare(trial, *toSort[i]) > 0) {
+        break;
+      }
+    }
+    if(k > expIndexes[n]+1) {
+      haveChanges = TRUE;
+      expIndexes[n] = k-1;
+    }
+    prefix.append(*toSort[expIndexes[n]]);
+  }
+
+  // try inserting ingorables
+  UColAttributeValue lastStr = UCOL_OFF;
+  k = 0;
+  while(toSort[k]->strengthFromEmpty > strength) {
+    k++;
+  }
+  if(toSort[k]->strengthFromEmpty == strength) {
+    start = k;
+    prefix = *toSort[resetIndex];
+    n = 0;
+    while(n <= expIndexSize) {
+      suffix.clear();
+      for(m = n; m < expIndexSize; m++) {
+        suffix.append(*toSort[expIndexes[m]]);
+      }
+      k = start;
+      while(toSort[k]->strengthFromEmpty == strength) {
+        trial.setToConcat(&prefix, toSort[k]);
+        trial.append(suffix);
+        lastStr = probe.getStrength(trial, *toSort[i]);
+        if(lastStr == UCOL_OFF) { // shot over - we won't find anything here
+          break;
+        } else if(lastStr > strength) {
+          for(m = expIndexSize; m > n; m--) {
+            expIndexes[m] = expIndexes[m-1];
+          }
+          expIndexes[n] = k;
+          expIndexSize++;
+          haveChanges = TRUE;
+          break;
+        }
+#if 0
+        if(probe.compare(trial, *toSort[i]) > 0) {
+          // if the first one skips, that means that
+          // this position doesn't work
+          if(k > start) {
+            // insert an ignorable on position n
+            for(m = expIndexSize; m > n; m--) {
+              expIndexes[m] = expIndexes[m-1];
+            }
+            expIndexes[n] = k-1;
+            expIndexSize++;
+            haveChanges = TRUE;
+            if(n == expIndexSize-1) { // added to the end of the string
+              UColAttributeValue str = probe.getStrength(trial, *toSort[i]);
+              int32_t putBreakHere = 0;
+            }
+          }
+          break;
+        } else {
+          lastStr = probe.getStrength(trial, *toSort[i]);
+        }
+#endif
+        k++;
+      }
+      prefix.append(*toSort[expIndexes[n]]);
+      n++;
+    }
+  }
+
+  if(haveChanges) {
+    expLine.clear();
+    for(m = 0; m < expIndexSize; m++) {
+      expLine.append(*toSort[expIndexes[m]]);
+    }
+  }
+  return resetIndex;
+}
+
+int32_t 
+SortedLines::detectExpansions() 
+{
+  logger->log("\n*** Detecting expansions\n\n");
+  int32_t exCount = 0;
+  int32_t i = 0, j = 0, k = 0, prevK = 0;
+  Line *previous, trial, expansionLine;
+  UBool foundExp = FALSE, sequenceCompleted = FALSE;
+  UColAttributeValue strength = UCOL_OFF;
+  UColAttributeValue maxStrength = UCOL_IDENTICAL;
+  UColAttributeValue expStrength = UCOL_OFF;
+  int32_t expIndexes[256];
+  int32_t expIndexSize = 0;
+  memset(expIndexes, 0, sizeof(expIndexes));
+
+  // for each element, we look back to find whether there is such a q for which
+  // q <n x < qUBn. These are possible expansions. When going backwards we skip 
+  // over already detected expansions.
+  i = 0;
+  // it turns out that looking at accents as possible expansions is
+  // quite a stupid thing to do, especially on non ICU platforms.
+  // Previously this line skipped over identicals only, but 
+  // now we are going to skip all the way to non-ignorables.
+  while(toSort[i]->strengthFromEmpty > UCOL_PRIMARY) {
+    i++;
+  }
+  i++;
+  for( ; i < size; i++) {
+    if(toSort[i]->name[0]==0x0063 && toSort[i]->name[1] == 0x68) // && toSort[i]->name[1] == 0x308)0043 0043 0219
+    { 
+      int32_t putBreakpointhere = 0;
+    }
+    foundExp = FALSE;
+    sequenceCompleted = FALSE;
+    strength = toSort[i]->strength;
+    if(strength == UCOL_IDENTICAL && toSort[i-1]->isExpansion == TRUE) {
+      u_strcpy(toSort[i]->expansionString, toSort[i-1]->expansionString);
+      toSort[i]->expLen = toSort[i-1]->expLen;
+      toSort[i]->isExpansion = TRUE;
+      toSort[i]->expIndex = toSort[i-1]->expIndex;
+      toSort[i]->expStrength = UCOL_IDENTICAL;
+      //toSort[i]->expStrength = toSort[i-1]->expStrength;
+      foundExp = TRUE;
+      sequenceCompleted = TRUE;
+    }
+    //logger->log("%i %i\n", i, j);
+    while(!foundExp && strength <= maxStrength) {
+      j = i-1;
+      while(j && (toSort[j]->isExpansion == TRUE || toSort[j]->isRemoved == TRUE)) {
+        //if(toSort[j]->strength < strength) {
+          //strength = toSort[j]->strength;
+        //}
+        j--;
+      }
+
+      //while(j && toSort[j]->strength > strength)
+      while(j && toSort[j]->strength > probe.getStrength(*toSort[j], *toSort[i]))
+      {
+        j--;
+      }
+      //if(toSort[j]->strength == strength) {
+        previous = toSort[j];
+        if(previous->strengthFromEmpty >= UCOL_IDENTICAL ||
+          (previous->strengthFromEmpty == UCOL_SECONDARY
+          && strength == UCOL_SECONDARY
+          && previous->lastCC > UB[strength]->firstCC)) {
+          break;
+          //continue;
+        }
+        //trial.setToConcat(previous, UB[strength]);
+        trial.setToConcat(previous, UB[probe.getStrength(*toSort[j], *toSort[i])]);
+        if(probe.compare(trial, *toSort[i]) > 0) {
+          foundExp = TRUE;
+        }
+      //}
+      if(strength == UCOL_QUATERNARY) {
+        strength = UCOL_IDENTICAL;
+      } else {
+        strength = (UColAttributeValue)(strength + 1);
+      }
+    }
+    // calculate the expanding sequence
+    if(foundExp && !sequenceCompleted) {
+      expIndexSize = 0;
+      expansionLine.clear();
+      exCount++;
+      // we will start from strength between the expansion
+      // and the target (toSort[i] and toSort[j]. First we
+      // will add as many primaries as possible. Then we will
+      // try to add secondary pieces and then tertiary. 
+      // found an expansion - what is the expanding sequence?
+      
+      expStrength = UCOL_PRIMARY;
+      while(!sequenceCompleted) {
+        k = 0;
+        prevK = 0;
+        while(k < size) {
+          if(expansionLine.len > 15) {
+            sequenceCompleted = TRUE;
+            break;
+          }
+          while(k < size && toSort[k]->strength != UCOL_PRIMARY) {
+            k++;
+          }
+          // nothing found
+          if(k == size) {
+            break;
+          }
+          // we need to skip over reordering things. If they were worthy, they would
+          // have been detected in the previous iteration.
+          //if(expansionLine.lastCC && toSort[k]->firstCC && expansionLine.lastCC > toSort[k]->firstCC) {
+            //k++;
+            //continue;
+          //}
+          trial = *previous;
+          trial.append(expansionLine);
+          trial.append(*toSort[k]);        
+          if(toSort[k]->name[0] == 0x0067) {
+            int32_t putBreakPointHere = 0;
+          }
+          if(probe.compare(trial, *toSort[i]) > 0) {
+            if(prevK) {
+              // we got into situation where we have ch > ch+dot-below
+              // however, ch is a contraction and therefore we cannot use
+              // it properly. If we have hit on a contraction, we'll just try
+              // to continue. Probably need more logic here.
+              if(contractionsTable->get(UnicodeString(trial.name, trial.len)) == NULL) {
+                expansionLine.append(*toSort[prevK]);
+                expIndexes[expIndexSize++] = prevK;
+                break;
+              } else {
+                int32_t putBreakPointHere = 0;
+              }
+            } else {
+              sequenceCompleted = TRUE;
+              break;
+            }
+            //break;
+          }
+          prevK = k;
+          k++;
+        }
+        if(!prevK || k == size) {
+          break;
+        }
+      }
+      // after this we have primaries lined up.
+      // we are going to goose up with secondaries and 
+      // tertiaries
+      trial.setToConcat(toSort[j], &expansionLine);
+      expStrength = probe.getStrength(trial, *toSort[i]);
+      if(expStrength > UCOL_PRIMARY) {
+        if(expStrength == UCOL_SECONDARY || expStrength == UCOL_OFF) {
+          j = gooseUp(j, i, expansionLine, expIndexes, expIndexSize, UCOL_SECONDARY);
+          trial.setToConcat(toSort[j], &expansionLine);
+          expStrength = probe.getStrength(trial, *toSort[i]);
+          if(expStrength == UCOL_TERTIARY) {
+            j = gooseUp(j, i, expansionLine, expIndexes, expIndexSize, UCOL_TERTIARY);
+          }
+        } else if(expStrength == UCOL_TERTIARY) {
+          j = gooseUp(j, i, expansionLine, expIndexes, expIndexSize, UCOL_TERTIARY);
+        }
+      }
+      trial.setToConcat(toSort[j], &expansionLine);
+      expStrength = probe.getStrength(trial, *toSort[i]);
+      if(expansionLine.len) {
+        if(expansionLine.name[0] == 0x73 && expansionLine.name[1] == 0x7a) {
+          int32_t putBreakpointhere = 0;
+        }
+        UBool isExpansionLineAContraction = (contractionsTable->get(UnicodeString(expansionLine.name, expansionLine.len)) != NULL);
+        // we have an expansion line and an expansion. There could be some expansions where 
+        // the difference between expansion line and the end of expansion sequence is less or 
+        // equal than the expansion strength. These should probably be removed.
+        int32_t diffLen = toSort[i]->len - expansionLine.len;
+        if(diffLen > 0) {
+          trial.setTo(UnicodeString(toSort[i]->name + diffLen, toSort[i]->len - diffLen));
+        } else {
+          trial = *toSort[i];
+        }
+        UColAttributeValue s1 = probe.getStrength(trial, expansionLine);
+        if(s1 == UCOL_OFF) {
+          s1 = probe.getStrength(expansionLine, trial);
+        }
+        if((!isExpansionLineAContraction && s1 >= expStrength) || (diffLen <= 0 && s1 == UCOL_IDENTICAL)) {
+          contractionsTable->remove(UnicodeString(toSort[i]->name, toSort[i]->len));
+          toSort[i]->isRemoved = TRUE;
+          if(toSort[i]->next && toSort[i]->previous) {
+            toSort[i]->previous->next = toSort[i]->next;
+          }
+          if(toSort[i]->previous && toSort[i]->next) {
+            toSort[i]->next->previous = toSort[i]->previous;
+          }
+	      debug->log("Exp -N: ");
+	      debug->log(toSort[i]->toString(FALSE));
+	      debug->log(" / ");
+	      debug->log(expansionLine.toString(FALSE), TRUE);
+        }
+        else
+        {         
+          u_strncat(toSort[i]->expansionString, expansionLine.name, expansionLine.len);
+          toSort[i]->isExpansion = TRUE;
+          toSort[i]->expStrength = expStrength;
+          toSort[i]->expLen = expansionLine.len;
+          toSort[i]->expansionString[toSort[i]->expLen] = 0;
+          toSort[i]->expIndex = j;
+        }
+      }
+    }
+    if(toSort[i]->isExpansion == TRUE) {
+      if(debug->isOn()) {
+        debug->log("Exp + : &");
+        debug->log(toSort[j]->toString(FALSE));
+        debug->log(toSort[i]->strengthToString(toSort[i]->expStrength, TRUE));
+        debug->log(toSort[i]->toString(FALSE));
+        debug->log(" ");
+        if(!toSort[j]->sortKey) {
+          calculateSortKey(*toSort[j]);
+        }
+        debug->log(toSort[j]->dumpSortkey());
+        debug->log(" ... ");
+        if(!toSort[i]->sortKey) {
+          calculateSortKey(*toSort[i]);
+        }
+        debug->log(toSort[i]->dumpSortkey());
+        calculateSortKey(expansionLine);
+        debug->log("/");
+        debug->log(expansionLine.dumpSortkey(), TRUE);
+      }
+      
+    }
+  }
+  // after detecting expansions, we want to position them. 
+  // it is better to position expansions after all have been detected,
+  // since otherwise we will change the ordering.
+  for(i = size-1; i >= 0; i--) {
+    if(toSort[i]->isExpansion) {
+      if(toSort[i]->name[0] == 0x2A3) {
+        int32_t putBreakPointHere = 0;
+      }
+      if(i) {
+        if(toSort[i]->previous) {
+          toSort[i]->previous->next = toSort[i]->next;
+        }
+      }
+      if(i < size-1) {
+        if(toSort[i]->next) {
+          toSort[i]->next->previous = toSort[i]->previous;
+        }
+      }
+      j = toSort[i]->expIndex;
+      toSort[i]->next = toSort[j]->next;
+      toSort[i]->previous = toSort[j];
+      toSort[j]->next = toSort[i];
+      if(toSort[i]->next) {
+        toSort[i]->next->previous = toSort[i];
+      }
+      toSort[i]->strength = toSort[i]->expStrength;
+    }
+  }
+  return exCount;
+}
+
+
+Line *
+SortedLines::getFirst() {
+  current = first;
+  return current;
+}
+
+Line *
+SortedLines::getLast() {
+  current = last;
+  return current;
+}
+
+void 
+SortedLines::add(Line *line, UBool linkIn) {
+  if(size++ == capacity) {
+    // grow
+  }
+  lines[size] = *line;
+  Line *toAdd = &lines[size];
+  if(linkIn && first) {
+    Line *current = first;
+    while(current != NULL && probe.comparer(&current, &toAdd) < 0) {
+      current = current->next;
+    }
+    if(current == NULL) {
+      toAdd->previous = last;
+      toAdd->next = NULL;
+      if(last != NULL) {
+        last->next = toAdd;
+      }
+      last = toAdd;
+      if(first == NULL) {
+        first = toAdd;
+      }
+    } else { // current != NULL
+      toAdd->next = current;
+      toAdd->previous = current->previous;
+      if(current->previous) {
+        current->previous->next = toAdd;
+      } else {
+        first = toAdd;
+      }
+      current->previous = toAdd;
+    }
+  }
+}
+
+
+Line *
+SortedLines::getNext()
+{
+  if(current != NULL) {
+    current=current->next;
+  }
+  return current;
+}
+
+Line *
+SortedLines::getPrevious()
+{
+  if(current != NULL) {
+    current=current->previous;
+  }
+  return current;
+}
+
+Line *
+SortedLines::operator[](int32_t index)
+{
+  int32_t i = 0;
+  Line *c = first;
+  for(i = 0; i < index; i++) {
+    if(c != NULL) {
+      c = c->next;
+    }
+  }
+  return c;
+}
+
+UnicodeString
+SortedLines::arrayToString(Line** sortedLines, int32_t linesSize, UBool pretty, UBool useLinks, UBool printSortKeys) {
+  UnicodeString result;
+  int32_t i = 0;
+
+  Line *line = NULL;
+  Line *previous = sortedLines[0];
+  if(printSortKeys && !sortkeys) {
+    printSortKeys = FALSE;
+  }
+  if(previous->isReset) {
+    result.append(" & ");
+    result.append(previous->name, previous->len);
+    if(pretty) {
+      result.append("        # ");
+      result.append(previous->stringToName(previous->name, previous->len));
+      result.append("\n");
+    }
+  } else if(!previous->isRemoved) {
+    result.append(previous->toString(pretty));
+    if(pretty) {
+      result.append("\n");
+    }
+  }
+  i = 1;
+  while((i < linesSize && !useLinks) || (previous->next && useLinks)) {
+    if(useLinks) {
+      line = previous->next;
+    } else {
+      line = sortedLines[i];
+    }
+    if(line->isReset) {
+      result.append(" &");
+      result.append(line->name, line->len);
+      if(pretty) {
+        result.append("        # ");
+        result.append(line->stringToName(line->name, line->len));
+        result.append("\n");
+      }
+    } else if(!line->isRemoved) {
+      if(i > 0) {
+        result.append(line->strengthToString(line->strength, pretty));
+      }
+      result.append(line->toString(pretty));
+      if(printSortKeys) {
+        result.append(line->dumpSortkey());
+      }
+      if(pretty) {
+        result.append("\n");
+      }
+    }
+    previous = line;
+    i++;
+  }
+  return result;
+}
+
+SortedLines::SortedLines(FILE *file, UPrinter *logger, UPrinter *debug, UErrorCode &status) :
+toSort(NULL),
+toSortCapacity(0),
+lines(NULL),
+size(0),
+capacity(0),
+first(NULL),
+last(NULL),
+logger(logger),
+debug(debug),
+contractionsTable(NULL),
+duplicators(NULL),
+maxExpansionPrefixSize(0),
+wordSort(FALSE),
+frenchSecondary(FALSE),
+upperFirst(FALSE),
+sortkeys(NULL),
+sortkeyOffset(0)
+{
+  debug->log("*** loading a dump\n");
+  memset(UB, 0, sizeof(UB));
+  int32_t i = 0;
+  for(i = 0; i < UCOL_OFF; i++) {
+    UB[i] = &empty;
+  }
+
+  int32_t newFrench, newUpperFirst;
+  fscanf(file, "%i,%i,%i\n", &size, &newFrench, &newUpperFirst);
+  debug->log("Read size %i, frenchSecondary %i and upperFirst %i\n", size, newFrench, newUpperFirst);
+  frenchSecondary = (UBool)newFrench;
+  upperFirst = (UBool)newUpperFirst;
+  capacity = size;
+  lines = new Line[capacity];
+  i = 0;
+
+  char buff[256];
+
+  while(fgets(buff, 256, file)) {
+    if(i % 20 == 0) {
+      logger->log("\rLine: %04i", i, buff);
+    }
+    lines[i].initFromString(buff, 256, status);
+    if(i) {
+      lines[i].previous = &lines[i-1];
+      lines[i-1].next = &lines[i];
+    }
+    i++;
+  }
+  size = i;
+  toSort = new Line*[size];
+  setSortingArray(toSort, lines, size);
+  first = &lines[0];
+  last = &lines[size-1];
+}
+
+void
+SortedLines::toFile(FILE *file, UBool useLinks, UErrorCode &status) 
+{
+  fprintf(file, "%i,%i,%i\n", size, frenchSecondary, upperFirst);
+  int32_t i = 1;
+  Line *previous = toSort[0];
+  Line *line = NULL;
+  char buff[256];
+  previous->write(buff, 256, status);
+  fprintf(file, "%s\n", buff);
+  fflush(file);
+  while(previous->next) {
+    if(useLinks) {
+      line = previous->next;
+    } else {
+      line = toSort[i];
+    }
+    line->write(buff, 256, status);
+    fprintf(file, "%s\n", buff);
+    i++;
+    previous = line;
+  }
+}
+
+
+
+UnicodeString 
+SortedLines::toStringFromEmpty() {
+  UBool useLinks = FALSE;
+  UBool pretty = FALSE;
+  UnicodeString result;
+  int32_t i = 0;
+
+  Line *line = NULL;
+  Line *previous = toSort[0];
+  if(previous->isReset) {
+    result.append(" & ");
+    if(pretty) {
+      result.append("\n");
+    }
+    result.append(previous->name, previous->len);
+  } else if(!previous->isRemoved) {
+    result.append(previous->toString(pretty));
+    if(pretty) {
+      result.append("\n");
+    }
+  }
+  i = 1;
+  while(i < size || previous->next) {
+    if(useLinks) {
+      line = previous->next;
+    } else {
+      line = toSort[i];
+    }
+    if(line->isReset) {
+      result.append(" &");
+      result.append(line->name, line->len);
+      if(pretty) {
+        result.append("        # ");
+        result.append(line->stringToName(line->name, line->len));
+        result.append("\n");
+      }
+    } else if(!line->isRemoved) {
+      if(i > 0) {
+        result.append(line->strengthToString(line->strengthFromEmpty, pretty));
+      }
+      result.append(line->toString(pretty));
+      if(pretty) {
+        result.append("\n");
+      }
+    }
+    previous = line;
+    i++;
+  }
+  return result;
+}
+
+UnicodeString 
+SortedLines::toString(UBool useLinks) 
+{
+  return arrayToString(toSort, size, FALSE, useLinks, FALSE);
+}
+
+
+UnicodeString 
+SortedLines::toPrettyString(UBool useLinks, UBool printSortKeys) 
+{
+  return arrayToString(toSort, size, TRUE, useLinks, printSortKeys);
+}
+
+UnicodeString 
+SortedLines::toOutput(const char *format, 
+                       const char *locale, const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome) {
+  if(strcmp(format, "HTML") == 0) {
+    return toHTML(locale, platform, reference, useLinks, initialize, moreToCome);
+  } else if(strcmp(format, "XML") == 0) {
+    return toXML(locale, platform, reference, useLinks, initialize, moreToCome);
+  } else {
+    return toBundle(locale, platform, reference, useLinks, initialize, moreToCome);
+  }
+}
+
+
+UnicodeString 
+SortedLines::toHTML(const char *locale, 
+                       const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome)
+{
+  UnicodeString result;
+  int32_t i = 0;
+  if(initialize) {
+    result.append("<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n</head>\n");
+    result.append("# Collation data resource bundle generated for locale: ");
+    result.append(locale);
+    result.append("<br>\n# For platform ");
+    result.append(platform);
+    result.append(" reference platform ");
+    result.append(reference);
+    result.append("<br><br>\n\n\n");
+
+    result.append(locale);
+    if(platform) {
+      result.append("_");
+      result.append(platform);
+    }
+    if(reference) {
+      result.append("_vs_");
+      result.append(reference);
+    }
+    result.append("&nbsp;{<br>\n");
+
+    result.append("&nbsp;&nbsp;collations&nbsp;{<br>\n&nbsp;&nbsp;&nbsp;&nbsp;standard&nbsp;{<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sequence&nbsp;{<br>\n");
+  }
+
+  if(frenchSecondary) {
+    result.append("[backwards 2]<br>\n");
+  }
+  if(upperFirst) {
+    result.append("[casefirst upper]<br>\n");
+  }
+
+  Line *line = toSort[0];
+
+  i = 0;
+  while((i < size && !useLinks) || (line->next && useLinks)) {
+    if(line->isReset || !line->isRemoved) {
+      result.append(line->toHTMLString());
+    }
+    i++;
+    if(useLinks) {
+      line = line->next;
+    } else {
+      line = toSort[i];
+    }
+  }
+  if(!moreToCome) {
+    result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br>\n&nbsp;&nbsp;}<br>\n}<br>\n");
+
+    result.append("</html>\n");
+  }
+
+  return result;
+}
+
+UnicodeString 
+SortedLines::toXML(const char *locale, 
+                       const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome)
+{
+  UnicodeString result;
+  int32_t i = 0;
+  if(initialize) {
+    result.append("<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n</head>\n");
+    result.append("# Collation data resource bundle generated for locale: ");
+    result.append(locale);
+    result.append("<br>\n# For platform ");
+    result.append(platform);
+    result.append(" reference platform ");
+    result.append(reference);
+    result.append("<br><br>\n\n\n");
+
+    result.append(locale);
+    if(platform) {
+      result.append("_");
+      result.append(platform);
+    }
+    if(reference) {
+      result.append("_vs_");
+      result.append(reference);
+    }
+    result.append("&nbsp;{<br>\n");
+
+    result.append("&nbsp;&nbsp;collations&nbsp;{<br>\n&nbsp;&nbsp;&nbsp;&nbsp;standard&nbsp;{<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sequence&nbsp;{<br>\n");
+  }
+
+  if(frenchSecondary) {
+    result.append("[backwards 2]<br>\n");
+  }
+  if(upperFirst) {
+    result.append("[casefirst upper]<br>\n");
+  }
+
+  Line *line = toSort[0];
+
+  i = 0;
+  while((i < size && !useLinks) || (line->next && useLinks)) {
+    if(line->isReset || !line->isRemoved) {
+      result.append(line->toHTMLString());
+    }
+    i++;
+    if(useLinks) {
+      line = line->next;
+    } else {
+      line = toSort[i];
+    }
+  }
+  if(!moreToCome) {
+    result.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br>\n&nbsp;&nbsp;}<br>\n}<br>\n");
+
+    result.append("</html>\n");
+  }
+
+  return result;
+}
+
+UnicodeString 
+SortedLines::toBundle(const char *locale, 
+                       const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome)
+{
+  UnicodeString result;
+  int32_t i = 0;
+
+  if(initialize) {
+    result.append("// Collation data resource bundle generated for locale: ");
+    result.append(locale);
+    result.append("\n// For platform ");
+    result.append(platform);
+    result.append(" reference platform ");
+    result.append(reference);
+    result.append("\n\n\n");
+
+    result.append(locale);
+    /*
+    if(platform) {
+      result.append("_");
+      result.append(platform);
+    }
+    if(reference) {
+      result.append("_vs_");
+      result.append(reference);
+    }
+    */
+    result.append(" {\n");
+
+    result.append("  collations {\n   standard {\n    Sequence {\n");
+  }
+
+  if(frenchSecondary) {
+    result.append("[backwards 2]\n");
+  }
+  if(upperFirst) {
+    result.append("[casefirst upper]\n");
+  }
+
+  Line *line = toSort[0];
+
+  i = 0;
+  while((i < size && !useLinks) || (line->next && useLinks)) {
+    if(line->isReset || !line->isRemoved) {
+      result.append(line->toBundleString());
+    }
+    i++;
+    if(useLinks) {
+      line = line->next;
+    } else {
+      line = toSort[i];
+    }
+  }
+
+  if(!moreToCome) {
+    result.append("    }\n   }\n  }\n}\n");
+  }
+
+  return result;
+}
+
+
+int32_t 
+SortedLines::getSize() const {
+  return repertoire.size();
+}
+
+void
+SortedLines::reduceDifference(SortedLines& reference) {
+  UErrorCode status = U_ZERO_ERROR;
+  if(upperFirst) {
+    swapCase();
+  }
+  // both sorted lines structures need to have established links and strengths
+  // We walk down both structures and note differences. These
+  // differences will modify this by removng elements, setting resets
+  // etc...
+  // we will prefer insertions from tailoring to reference, then deletions
+  // there are two tables that keep seen elements.
+  Hashtable *seenThis = new Hashtable();
+  Hashtable *seenReference = new Hashtable();
+
+
+  UBool found = FALSE;
+  UBool finished = FALSE;
+  const int32_t lookForward = 20;
+  int32_t tailoringMove = 0;
+  //int32_t referenceSize = reference.getSize();
+  Line *refLine = reference.getFirst();
+  Line *refLatestEqual = refLine;
+  refLine = refLine->next;
+  Line *myLine = getFirst();
+  Line *myLatestEqual = myLine;
+  myLatestEqual->isRemoved = TRUE;
+  myLine = myLine->next;
+  while(myLine && refLine) {
+    found = FALSE;
+    while(myLine && refLine && myLine->equals(*refLine)) {
+      myLatestEqual = myLine;
+      myLatestEqual->isRemoved = TRUE;
+      myLine = myLine->next;
+      refLatestEqual = refLine;
+      refLine = refLine->next;
+      if(refLine == NULL && myLine == NULL) {
+        finished = TRUE;
+      }
+    }
+    if(myLine) {
+      myLine->cumulativeStrength = myLine->strength;  
+    }
+    if(refLine) {
+      refLine->cumulativeStrength = refLine->strength;
+    }
+ 
+    // here is the difference
+    while(!found && !finished) {
+      tailoringMove = 0;
+      if(myLine && refLine) {
+        if(myLine->cumulativeStrength > refLine->cumulativeStrength) { 
+          // tailoring z <<< x, UCA z < y
+          while(myLine->cumulativeStrength > refLine->cumulativeStrength) {
+            myLine = myLine->next;
+            if(myLine) {
+              transferCumulativeStrength(myLine->previous, myLine);
+            } else {
+              break;
+            }
+          }
+        } else if(myLine->cumulativeStrength < refLine->cumulativeStrength) {  
+          // tailoring z < x, UCA z <<< y
+          while(myLine->cumulativeStrength < refLine->cumulativeStrength) {
+            seenReference->put(UnicodeString(refLine->name, refLine->len), refLine, status);
+            refLine = refLine->next;
+            if(refLine) {
+              transferCumulativeStrength(refLine->previous, refLine);
+            } else {
+              break;
+            }
+          }
+        }
+        // this is the interesting point. Now we search for character match
+        while(myLine && refLine && (!myLine->equals(*refLine) || myLine->strength == UCOL_IDENTICAL)
+          && tailoringMove < lookForward) {
+          if(seenThis->get(UnicodeString(refLine->name, refLine->len))) {
+            // we are not interested in stuff from the reference that is already accounted
+            // for in the tailoring.
+            refLine = refLine->next;
+            if(refLine) {
+              transferCumulativeStrength(refLine->previous, refLine);
+            }
+          } else {
+            myLine = myLine->next;
+            if(myLine) {
+              transferCumulativeStrength(myLine->previous, myLine);
+              if(!seenReference->get(UnicodeString(myLine->name, myLine->len))) {
+                tailoringMove++;
+              }
+            }
+          }
+        }
+      }
+      if(refLine == NULL) { // ran out of reference
+        // this is the tail of tailoring - the last insertion
+        myLine  = NULL;
+        found = TRUE;
+      } else if(tailoringMove == lookForward || myLine == NULL) { // run over treshold or out of tailoring
+        tailoringMove = 0;
+        // we didn't find insertion after all
+        // we will try substitution next
+        // reset the tailoring pointer
+        myLine = myLatestEqual->next;
+        // move the reference
+        refLine = refLine->next;
+        if(refLine) {
+          transferCumulativeStrength(refLine->previous, refLine);
+        }
+      } else { // we found an insertion
+        tailoringMove = 0;
+        if(myLine->strength != refLine->strength) {
+          while(myLine && refLine && *myLine == *refLine 
+            && (myLine->strength != refLine->strength 
+            || myLine->strength == UCOL_IDENTICAL)) {
+            myLine = myLine->next;
+            refLine = refLine->next;
+          }
+          if(*myLine != *refLine) {
+            continue;
+          }
+        }
+        if(myLine && refLine && myLine->previous->strength < myLine->strength) {
+          myLine = myLine->next;
+          refLine = refLine->next;
+          if(*myLine != *refLine) {
+            continue;
+          }
+        }
+        found = TRUE;
+      }
+      if(found) {
+        if(myLatestEqual->next != myLine || refLine == NULL) {
+          Line *myStart = NULL;
+          // this is a reset and a sequence
+          // myLatestEqual points at the last point that was the same
+          // This point will be a reset
+          if(myLine && refLine) { // if there is anything more to do - it might be worth saving it
+            myStart = myLatestEqual;
+            while(myStart != myLine) {
+              seenThis->put(UnicodeString(myStart->name, myStart->len), myStart, status);
+              myStart = myStart->next;
+            }
+          }
+          // Try to weed out stuff that is not affected, like:
+          // Tailoring:
+          // <<<S<<\u017F<\u0161<<<\u0160<t
+          // UCA:
+          // <<<S<<\u0161<<<\u0160<<\u017F<t
+          // Result:
+          // &S<<\u017F<\u0161<<<\u0160
+          // we have a sequence that spans from myLatestEqual to myLine (that one could be NULL, 
+          // so we have to go down from myLatestEqual. 
+          // Basically, for every element, we want to see the strongest cumulative difference 
+          // from the reset point. If the cumulative difference is the same in both the reference and
+          // tailoring, that element could be removed.
+          calculateCumulativeStrengths(myLatestEqual, myLine);
+          calculateCumulativeStrengths(refLatestEqual, refLine);
+          myStart = myLatestEqual;
+          int32_t removed = 0;
+          int32_t traversed = 0;
+          while(myStart && myStart != myLine) {
+            Line *refStart = refLatestEqual;
+            while(refStart && refStart != refLine) {
+              if(*myStart == *refStart) {
+                if(myStart->cumulativeStrength == refStart->cumulativeStrength) {
+                  myStart->isRemoved = TRUE;
+                  removed++;
+                }
+              }
+              refStart = refStart->next;
+            }
+            myStart = myStart->next;
+            traversed++;
+          }
+          if(removed < traversed) {
+            myLatestEqual->isReset = TRUE;
+            myLatestEqual->isRemoved = FALSE;
+          }
+
+          myLatestEqual = myLine;
+        }
+      }
+    }
+  }
+
+  if(upperFirst) {
+    //swapCase();
+  }
+
+  delete seenThis;
+  delete seenReference;
+
+}
+
+void
+SortedLines::transferCumulativeStrength(Line *previous, Line *that) {
+  if(that->strength > previous->cumulativeStrength) {
+    that->cumulativeStrength = previous->cumulativeStrength;
+  } else {
+    that->cumulativeStrength = that->strength;
+  }
+}
+
+void
+SortedLines::calculateCumulativeStrengths(Line *start, Line *end) {
+  // start is a reset - end may be NULL
+  start = start->next;
+  UColAttributeValue cumulativeStrength = UCOL_OFF;
+  while(start && start != end) {
+    if(start->strength < cumulativeStrength) {
+      cumulativeStrength = start->strength;
+    }
+    start->cumulativeStrength = cumulativeStrength;
+    start = start->next;
+  }
+}
+
+
+void 
+SortedLines::getRepertoire(UnicodeSet &fillIn) {
+  fillIn.clear();
+  fillIn.addAll(repertoire);
+}
+
+
+void
+SortedLines::removeDecompositionsFromRepertoire() {
+  UnicodeSetIterator repertoireIter(repertoire);
+  UErrorCode status = U_ZERO_ERROR;
+  UChar string[256];
+  UChar composed[256];
+  int32_t len = 0, compLen = 0;
+  UnicodeString compString;
+  UnicodeSet toRemove;
+
+  while(repertoireIter.next()) {
+    len = 0;
+    if(repertoireIter.isString()) { // process a string
+      len = repertoireIter.getString().length();
+      u_memcpy(string, repertoireIter.getString().getBuffer(), len);
+    } else { // process code point
+      UBool isError = FALSE;
+      U16_APPEND(string, len, 25, repertoireIter.getCodepoint(), isError);
+    }
+    string[len] = 0; // zero terminate, for our evil ways
+    compLen = unorm_normalize(string, len, UNORM_NFC, 0, composed, 256, &status);
+    if(compLen != len || u_strcmp(string, composed) != 0) {
+      compString.setTo(composed, compLen);
+      if(repertoire.contains(compString)) {
+        toRemove.add(UnicodeString(string, len));
+      }
+    }
+  }
+  debug->log("\nRemoving\n");
+  debug->log(toRemove.toPattern(compString, TRUE), TRUE);
+  repertoire.removeAll(toRemove);
+}
+
+
+void
+SortedLines::swapCase() 
+{
+  int32_t i = 0;
+  for(i = 0; i < size; i++) {
+    toSort[i]->swapCase();
+  }
+}
+
+void
+SortedLines::calculateSortKey(Line &line) 
+{
+  if(!sortkeys) {
+    sortkeys = new uint8_t[size*1024];
+    memset(sortkeys, 0, size*1024);
+  }
+  line.sortKey = sortkeys+sortkeyOffset;
+  sortkeyOffset += probe.getSortKey(line, sortkeys+sortkeyOffset, size*256-sortkeyOffset);
+}
+
+
+void 
+SortedLines::calculateSortKeys()
+{
+  if(sortkeys) {
+    delete[] sortkeys;
+  }
+  sortkeyOffset = 0;
+  sortkeys = new uint8_t[size*256];
+  memset(sortkeys, 0, size*256);
+  int32_t i = 0;
+  for(i = 0; i < size; i++) {
+    calculateSortKey(*toSort[i]);
+  }
+}
diff --git a/colprobe/sortedlines.h b/colprobe/sortedlines.h
new file mode 100644
index 0000000..5f37006
--- /dev/null
+++ b/colprobe/sortedlines.h
@@ -0,0 +1,120 @@
+#ifndef COLPROBE_SORTEDLINES_H
+#define COLPROBE_SORTEDLINES_H
+
+// colprobe includes
+#include "colprobe.h"
+#include "line.h"
+#include "uprinter.h"
+#include "strengthprobe.h"
+
+
+// ICU includes
+#include "unicode/uniset.h"
+#include "unicode/usetiter.h"
+#include "unicode/uscript.h"
+#include "hash.h"
+
+class SortedLines {
+  Line empty;
+  Line *UB[UCOL_OFF];
+  UnicodeSet ignorables[UCOL_OFF];
+
+  Line **toSort;
+  int32_t toSortCapacity;
+  Line *lines;
+  int32_t size;
+  int32_t capacity;
+
+  UnicodeSet repertoire;
+  UnicodeSet excludeBounds;
+
+  StrengthProbe probe;
+
+  Line *first;
+  Line *last;
+  Line *current;
+  SortedLines() {};
+
+  UPrinter *logger;
+  UPrinter *debug;
+
+  Hashtable *contractionsTable;
+  Hashtable *duplicators; // elements that duplicate preceding characters
+  int32_t maxExpansionPrefixSize;
+
+  // Properties of the sort
+  UBool wordSort;
+  UBool frenchSecondary;
+  UBool upperFirst;
+
+  uint8_t *sortkeys;
+  int32_t sortkeyOffset;
+public:
+  SortedLines(const UnicodeSet &set, const UnicodeSet &excludeBounds, const StrengthProbe &probe, UPrinter *logger, UPrinter *debug);
+  SortedLines(FILE *file, UPrinter *logger, UPrinter *debug, UErrorCode &status);
+  ~SortedLines();
+  void analyse(UErrorCode &status);
+
+  void sort(UBool setStrengths = TRUE, UBool link = FALSE);
+  void sort(Line **sortingArray, int32_t sizeToSort, UBool setStrengths = TRUE, UBool link = FALSE);
+
+  Line *getFirst();
+  Line *getLast();
+  void add(Line *line, UBool linkIn = FALSE);
+  void insert(Line *line, int32_t index);
+  Line *getNext();
+  Line *getPrevious();
+  Line *operator[](int32_t index);
+  int32_t addContractionsToRepertoire(UErrorCode &status);
+
+  int32_t getSize() const;
+
+  int32_t detectExpansions();
+  
+  UnicodeString toString(UBool useLinks = FALSE);
+  UnicodeString toStringFromEmpty();
+  UnicodeString toPrettyString(UBool useLinks, UBool printSortKeys = FALSE);
+  UnicodeString toOutput(const char *format, 
+                         const char *locale, const char *platform, const char *reference, 
+                         UBool useLinks, UBool initialize, UBool moreToCome);
+  UnicodeString toBundle(const char *locale, const char *platform, const char *reference, 
+                         UBool useLinks, UBool initialize, UBool moreToCome);
+  UnicodeString toHTML(const char *locale, const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome);
+  UnicodeString toXML(const char *locale, const char *platform, const char *reference, 
+                       UBool useLinks, UBool initialize, UBool moreToCome);
+  UnicodeString arrayToString(Line** sortedLines, int32_t linesSize, UBool pretty, UBool useLinks, UBool printSortKeys);
+  void setSortingArray(Line **sortingArray, Line *elements, int32_t sizeToSort);
+  int32_t setSortingArray(Line **sortingArray, Hashtable *table);
+
+  void reduceDifference(SortedLines& reference);
+  void getRepertoire(UnicodeSet &fillIn);
+  void removeDecompositionsFromRepertoire();
+  void getBounds(UErrorCode &status);
+  void classifyRepertoire();
+  void toFile(FILE *file, UBool useLinks, UErrorCode &status);
+  void swapCase();
+  void calculateSortKeys();
+  void calculateSortKey(Line &line);
+private:
+  void init();
+  void init(UnicodeSet &rep, Line *lin);
+  int32_t detectContractions(Line **firstRep, int32_t firstSize,
+                                        Line **secondRep, int32_t secondSize,
+                                        Line *toAddTo, int32_t &toAddToSize, 
+                                        Line *lesserToAddTo, int32_t &lesserToAddToSize,
+                                        int32_t capacity, UErrorCode &status);
+
+  void calculateCumulativeStrengths(Line *start, Line *end);
+  void transferCumulativeStrength(Line *previous, Line *that);
+  void updateBounds(UnicodeSet &set);
+  void addAll(Line* toAdd, int32_t toAddSize);
+  void setDistancesFromEmpty(Line* array, int32_t arraySize);
+  void noteContraction(const char* msg, Line *toAddTo, int32_t &toAddToSize, Line *left, Line *right, int32_t &noConts, UErrorCode &status);
+  int32_t gooseUp(int32_t resetIndex, int32_t expansionIndex, Line &expLine, int32_t *expIndexes, int32_t &expIndexSize, UColAttributeValue strength);
+  UBool getExpansionLine(const Line &expansion, const Line &previous, const Line &exp, Line &expansionLine);
+
+
+};
+
+#endif  // #ifndef COLPROBE_SORTEDLINES_H
diff --git a/colprobe/strengthprobe.cpp b/colprobe/strengthprobe.cpp
new file mode 100644
index 0000000..afa94b6
--- /dev/null
+++ b/colprobe/strengthprobe.cpp
@@ -0,0 +1,402 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File line.h
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   07/07/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+//
+//   class Line
+//
+//      Each line from the source file (containing a name, presumably) gets
+//      one of these structs.
+//
+
+#include "strengthprobe.h"
+
+StrengthProbe::StrengthProbe(CompareFn comparer, GetSortKeyFn getter, UChar SE, 
+                             UChar B0, UChar B1, UChar B2, UChar B3) :
+SE(SE),
+B0(B0), B1(B1), B2(B2), B3(B3),
+utilFirstP(&utilFirst), utilSecondP(&utilSecond),
+frenchSecondary(FALSE),
+comparer(comparer), skgetter(getter)
+{
+}
+
+int
+StrengthProbe::setProbeChars(UChar B0, UChar B1, UChar B2, UChar B3)
+{
+  this->B0 = B0;
+  this->B1 = B1;
+  this->B2 = B2;
+  this->
+B3 = B3;
+  return checkSanity();
+}
+
+int
+StrengthProbe::checkSanity() 
+{
+  int sanityRes;
+  utilFirst.setTo(B0);
+  utilSecond.setTo(B3);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 3;
+  }
+  utilSecond.setTo(B2);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 2;
+  }
+  utilSecond.setTo(B1);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 1;
+  }
+  utilFirst.setTo(B3);
+  utilSecond.setTo(B2);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 5;
+  }
+  utilSecond.setTo(B1);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 4;
+  }
+  utilFirst.setTo(B2);
+  if((sanityRes = comparer(&utilFirstP, &utilSecondP)) >= 0) {
+    return sanityRes*10 + 6;
+  }
+  utilFirst.setTo(B0);
+  if(distanceFromEmptyString(utilFirst) > UCOL_PRIMARY) {
+    return 1000;
+  }
+  utilFirst.setTo(B1);
+  if(distanceFromEmptyString(utilFirst) > UCOL_PRIMARY) {
+    return 1001;
+  }
+  utilFirst.setTo(B2);
+  if(distanceFromEmptyString(utilFirst) > UCOL_PRIMARY) {
+    return 1002;
+  }
+  utilFirst.setTo(B3);
+  if(distanceFromEmptyString(utilFirst) > UCOL_PRIMARY) {
+    return 1003;
+  }
+  return 0;
+}
+
+UBool 
+StrengthProbe::probePrefix(const Line &x, const Line &y, UChar first, UChar second) {
+  utilFirst.name[0] = first;
+  utilFirst.name[1] = SE;
+  u_strcpy(utilFirst.name+2, x.name);
+  utilFirst.name[x.len+2] = 0;
+  utilFirst.len = x.len+2;
+
+  utilSecond.name[0] = second;
+  utilSecond.name[1] = SE;
+  u_strcpy(utilSecond.name+2, y.name);
+  utilSecond.name[y.len+2] = 0;
+  utilSecond.len = y.len+2;
+
+  if(comparer(&utilFirstP, &utilSecondP) < 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UBool 
+StrengthProbe::probeSuffix(const Line &x, const Line &y, UChar first, UChar second) {
+  u_strcpy(utilFirst.name, x.name);
+  utilFirst.name[x.len] = SE;
+  utilFirst.name[x.len+1] = first;
+  utilFirst.name[x.len+2] = 0;
+  utilFirst.len = x.len + 2;
+  u_strcpy(utilSecond.name, y.name);
+  utilSecond.name[y.len] = SE;
+  utilSecond.name[y.len+1] = second;
+  utilSecond.name[y.len+2] = 0;
+  utilSecond.len = y.len + 2;
+
+  if(comparer(&utilFirstP, &utilSecondP) < 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UBool 
+StrengthProbe::probePrefixNoSep(const Line &x, const Line &y, UChar first, UChar second) {
+  utilFirst.name[0] = first;
+  u_strcpy(utilFirst.name+1, x.name);
+  utilFirst.name[x.len+1] = 0;
+  utilFirst.len = x.len + 1;
+
+  utilSecond.name[0] = second;
+  u_strcpy(utilSecond.name+1, y.name);
+  utilSecond.name[y.len+1] = 0;
+  utilSecond.len = y.len + 1;
+
+  if(comparer(&utilFirstP, &utilSecondP) < 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UBool 
+StrengthProbe::probeSuffixNoSep(const Line &x, const Line &y, UChar first, UChar second) {
+  u_strcpy(utilFirst.name, x.name);
+  utilFirst.name[x.len] = first;
+  utilFirst.name[x.len+1] = 0;
+  utilFirst.len = x.len + 1;
+  u_strcpy(utilSecond.name, y.name);
+  utilSecond.name[y.len] = second;
+  utilSecond.name[y.len+1] = 0;
+  utilSecond.len = y.len + 1;
+
+  if(comparer(&utilFirstP, &utilSecondP) < 0) {
+    return TRUE;
+  } else {
+    return FALSE;
+  }
+}
+
+UColAttributeValue 
+StrengthProbe::getStrength(const Line &x, const Line &y) {
+  const Line *xp = &x;
+  const Line *yp = &y;
+
+  Line empty;
+  Line *emptyP = &empty;
+  if(comparer(&emptyP, &xp) == 0) {
+    return distanceFromEmptyString(y);
+  }
+
+  int32_t result = comparer(&xp, &yp);
+
+  if(result == 0) {
+    return UCOL_IDENTICAL;
+  } else if(result > 0) {
+    return UCOL_OFF; // bad situation
+  } else { // we need to probe strength
+    if(probeSuffix(x, y, B1, B0)) {
+    //if(probePrefix(x, y, B2, B0)) { // swamps secondary difference
+      return UCOL_PRIMARY;
+    } else if(probePrefix(x, y, B3, B0)) { // swamps tertiary difference
+      return UCOL_SECONDARY;
+    } else if(probeSuffix(x, y, B3, B0)) { // swamped by tertiary difference
+      return UCOL_TERTIARY;
+    } else if(!probePrefix(x, y, B3, B0)) {
+      return UCOL_QUATERNARY;
+    }
+    /*
+    //if(probeSuffix(x, y, B1, B0)) {
+    if(probePrefix(x, y, B2, B0)) { // swamps secondary difference
+      return UCOL_PRIMARY;
+    } else if(probePrefix(x, y, B3, B0)) { // swamps tertiary difference
+      return UCOL_SECONDARY;
+    } else if(probeSuffix(x, y, B3, B0)) { // swamped by tertiary difference
+      return UCOL_TERTIARY;
+    } else if(!probePrefix(x, y, B3, B0)) {
+      return UCOL_QUATERNARY;
+    }
+    */
+  }
+  return UCOL_OFF; // bad
+}
+
+UColAttributeValue 
+StrengthProbe::getStrength(const UnicodeString &sx, const UnicodeString &sy) {
+  Line x(sx);
+  Line y(sy);
+  return getStrength(x, y);
+}
+
+int32_t 
+StrengthProbe::compare(const UnicodeString &sx, const UnicodeString &sy) {
+  Line x(sx);
+  Line y(sy);
+  const Line *xp = &x;
+  const Line *yp = &y;
+  return comparer(&xp, &yp);
+}
+
+int32_t 
+StrengthProbe::compare(const Line &x, const Line &y) {
+  const Line *xp = &x;
+  const Line *yp = &y;
+  return comparer(&xp, &yp);
+}
+
+UColAttributeValue 
+StrengthProbe::distanceFromEmptyString(const Line &x) {
+  if(x.name[0] == 0x30D) {
+    int32_t putBreakPointHere = 0;
+  }
+  Line empty;
+  Line *emptyP = &empty;
+  uint8_t buff[256];
+  getSortKey(empty.name, empty.len, buff, 256);
+  Line B0Line(B0);
+  Line *B0LineP = &B0Line;
+  const Line *xp = &x;
+  int32_t result = comparer(&emptyP, &xp);
+  if(result == 0) {
+    return UCOL_IDENTICAL;
+  } else if(result > 0) {
+    return UCOL_OFF;
+  }
+  result = comparer(&B0LineP, &xp);
+  if(result <= 0) {
+    return UCOL_PRIMARY;
+  }
+  Line sexb0(SE);
+  sexb0.append(x.name, x.len);
+  sexb0.append(B0);
+
+  Line seb0(SE);
+  seb0.append(B0);
+  uint8_t seb0K[256];
+  uint8_t sexb0K[256];
+  uint8_t seb2K[256];
+  uint8_t seb3K[256];
+  memset(seb0K, 0, 256);
+  memset(sexb0K, 0, 256);
+  memset(seb2K, 0, 256);
+  memset(seb3K, 0, 256);
+
+  getSortKey(seb0, seb0K, 256);
+  getSortKey(sexb0, sexb0K, 256);
+
+  if(compare(seb0, sexb0) <= 0) {
+    Line seb2(SE);
+    seb2.append(B2);
+    getSortKey(seb2, seb2K, 256);
+    result = compare(seb2, sexb0);
+    if((result <= 0 && !frenchSecondary) || (result >= 0 && frenchSecondary)) { // swamps tertiary difference
+      return UCOL_SECONDARY;
+    }
+    Line seb3(SE);
+    seb3.append(B3);
+    getSortKey(seb3, seb3K, 256);
+    if(compare(seb3, sexb0) < 0) {
+      return UCOL_TERTIARY;
+    }
+    return UCOL_QUATERNARY;
+  } else {
+    // if this was UCA, we would have a primary difference.
+    // however, this might not be so, since not everybody 
+    // makes well formed CEs.
+    // in cs_CZ on linux, space is tertiary ignorable, but
+    // its quaternary level strength is lower than quad 
+    // strengths for non-ignorables. oh well, more testing
+    // required
+    // I think that we can only have quaternary difference
+    // here (in addition to primary difference).
+    //if(!probePrefix(x, empty, B3, B0)) {
+      //return UCOL_QUATERNARY;
+    //} else {
+      return UCOL_PRIMARY;
+    //}
+  }
+}
+
+UColAttributeValue 
+StrengthProbe::distanceFromEmptyString(const UnicodeString &x) {
+  const Line xp(x);
+  return distanceFromEmptyString(xp);
+}
+
+
+UColAttributeValue 
+StrengthProbe::getPrefixedStrength(const Line &prefix, const Line &x, const Line &y) {
+  contractionUtilFirst.setToConcat(&prefix, &x);
+  contractionUtilSecond.setToConcat(&prefix, &y);
+  return getStrength(contractionUtilFirst, contractionUtilSecond);
+}
+
+
+StrengthProbe::StrengthProbe(const StrengthProbe &that) {
+  *this = that;
+}
+
+StrengthProbe &
+StrengthProbe::operator=(const StrengthProbe &that) {
+  if(this != &that) {
+    B0 = that.B0;
+    B1 = that.B1;
+    B2 = that.B2;
+    B3 = that.B3;
+    SE = that.SE;
+    frenchSecondary = that.frenchSecondary;
+    comparer = that.comparer;
+    skgetter = that.skgetter;
+
+    utilFirstP = &utilFirst;
+    utilSecondP = &utilSecond;
+  }
+
+  return *this;
+}
+
+UBool
+StrengthProbe::isFrenchSecondary(UErrorCode &status) {
+  utilFirst.setTo(B0);
+  utilFirst.append(SE);
+  utilFirst.append(B2);
+  utilSecond.setTo(B2);
+  utilSecond.append(SE);
+  utilSecond.append(B0);
+
+  int32_t result = compare(utilFirst, utilSecond);
+
+  if(result < 0) {
+    return FALSE;
+  } else if(result > 0) {
+    frenchSecondary = TRUE;
+    return TRUE;
+  } else {
+    status = U_INTERNAL_PROGRAM_ERROR;
+    return FALSE;
+  }
+}
+
+UBool
+StrengthProbe::isUpperFirst(UErrorCode &status) {
+  UChar i = 0;
+  int32_t result = 0;
+  int32_t upper = 0, lower = 0, equal = 0;
+  for(i = 0x41; i < 0x5B; i++) {
+    utilFirst.setTo(i);
+    utilSecond.setTo(i+0x20);
+    result = compare(utilFirst, utilSecond);
+    if(result < 0) {
+      upper++;
+    } else if(result > 0) {
+      lower++;
+    } else {
+      equal++;
+    }
+  }
+  
+  if(lower == 0 && equal == 0) {
+    return TRUE;
+  }
+  if(upper == 0 && equal == 0) {
+    return FALSE;
+  }
+  status = U_INTERNAL_PROGRAM_ERROR;
+  return FALSE;
+}
+
diff --git a/colprobe/strengthprobe.h b/colprobe/strengthprobe.h
new file mode 100644
index 0000000..ec925b2
--- /dev/null
+++ b/colprobe/strengthprobe.h
@@ -0,0 +1,85 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File line.h
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   07/07/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+//
+//   class Line
+//
+//      Each line from the source file (containing a name, presumably) gets
+//      one of these structs.
+//
+
+#ifndef COLPROBE_STRENGTHPROBE_H
+#define COLPROBE_STRENGTHPROBE_H
+
+#include "colprobe.h"
+#include "line.h"
+#include "unicode/uniset.h"
+#include "unicode/usetiter.h"
+
+class StrengthProbe {
+public:
+  UChar SE;
+  UChar B0;
+  UChar B1;
+  UChar B2;
+  UChar B3;
+private:
+  Line utilFirst;
+  Line utilSecond;
+  Line *utilFirstP;
+  Line *utilSecondP;
+  Line contractionUtilFirst;
+  Line contractionUtilSecond;
+  UBool probePrefix(const Line &x, const Line &y, UChar first, UChar second);
+  UBool probeSuffix(const Line &x, const Line &y, UChar first, UChar second);
+  UBool probePrefixNoSep(const Line &x, const Line &y, UChar first, UChar second);
+  UBool probeSuffixNoSep(const Line &x, const Line &y, UChar first, UChar second);
+
+  UBool frenchSecondary;
+
+public:
+  CompareFn comparer;
+  GetSortKeyFn skgetter;
+  
+  StrengthProbe() {};
+  StrengthProbe(CompareFn comparer, GetSortKeyFn getter, UChar SE = 0x0030, UChar B0 = 0x0061, UChar B1 = 0x0062, UChar B2 = 0x00E1, UChar B3 = 0x0041); //, UChar LB = 0x0039, UChar UB = 0xfa29);
+  int setProbeChars(UChar B0, UChar B1, UChar B2, UChar B3);
+  int checkSanity();
+  StrengthProbe(const StrengthProbe &that);
+  StrengthProbe &operator=(const StrengthProbe &that);
+  UColAttributeValue getStrength(const Line &x, const Line &y);
+  UColAttributeValue getStrength(const UnicodeString &x, const UnicodeString &y);
+  UColAttributeValue getPrefixedStrength(const Line &prefix, const Line &x, const Line &y);
+  int32_t compare(const UnicodeString &x, const UnicodeString &y);
+  int32_t compare(const Line &x, const Line &y);
+  UColAttributeValue distanceFromEmptyString(const Line &x);
+  UColAttributeValue distanceFromEmptyString(const UnicodeString &x);
+  UBool isFrenchSecondary(UErrorCode &status);
+  UBool isUpperFirst(UErrorCode &status);
+  int getSortKey(const Line &l, uint8_t *buffer, int32_t buffCap) {
+    return skgetter(l.name, l.len, buffer, buffCap);
+  };
+
+  int getSortKey(UChar *string, int32_t sLen, uint8_t *buffer, int32_t buffCap) {
+    return skgetter(string, sLen, buffer, buffCap);
+  };
+ 
+};
+
+
+#endif //#ifndef COLPROBE_STRENGTHPROBE_H
+
diff --git a/colprobe/tableStarter.pl b/colprobe/tableStarter.pl
new file mode 100755
index 0000000..d1b7fbb
--- /dev/null
+++ b/colprobe/tableStarter.pl
@@ -0,0 +1,16 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my $localeMinusA = `cat /home/weiv/src/icu/source/extra/colprobe/locale.txt`;
+my @locales = split(/\n/, $localeMinusA);
+my $locale;
+my $command;
+
+foreach $locale (@locales) {
+  if($locale =~ /_/ && !($locale =~ /^#/)) {
+    $command = "/home/weiv/src/icu/source/extra/colprobe/doComparisonTable.pl $locale";
+    print "$command\n";
+    `$command`;
+  }
+}
diff --git a/colprobe/targetsetgenerator.cpp b/colprobe/targetsetgenerator.cpp
new file mode 100644
index 0000000..e3dcbe8
--- /dev/null
+++ b/colprobe/targetsetgenerator.cpp
@@ -0,0 +1,8 @@
+#include "targetsetgenerator.h"
+
+TargetSetGenerator::TargetSetGenerator(UnicodeSet &startingSet, CompareFn comparer) :
+ comparer(comparer),
+ set(startingSet)
+{
+   addAll(startingSet);
+}
diff --git a/colprobe/targetsetgenerator.h b/colprobe/targetsetgenerator.h
new file mode 100644
index 0000000..cd89734
--- /dev/null
+++ b/colprobe/targetsetgenerator.h
@@ -0,0 +1,15 @@
+#ifndef TARGETSETGENERATOR_H
+#define TARGETSETGENERATOR_H
+
+#include "colprobe.h"
+#include "unicode/uniset.h"
+
+class TargetSetGenerator : public UnicodeSet {
+public:
+  TargetSetGenerator(UnicodeSet &startingSet, CompareFn comparer);
+private:
+  CompareFn comparer;
+  UnicodeSet set;
+};
+
+#endif
\ No newline at end of file
diff --git a/colprobe/template b/colprobe/template
new file mode 100644
index 0000000..1a1aa91
--- /dev/null
+++ b/colprobe/template
@@ -0,0 +1,48 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>$locale</title>
+<style>
+         <!--
+         table        { border-spacing: 0; border-collapse: collapse; width: 100%; 
+               border: 1px solid black }
+td, th       { width: 10%; border-spacing: 0; border-collapse: collapse; color: black; 
+               vertical-align: top; border: 1px solid black }
+-->
+     </style>
+</head>
+
+<body bgcolor="#FFFFFF">
+
+<p><b><font color="#FF0000">Collation:</font> $locale <a href="http://oss.software.ibm.com/cgi-bin/icu/lx/en/?_=$locale">Demo</a>, 
+
+<a href="http://oss.software.ibm.com/cvs/icu/~checkout~/locale/all_diff_xml/comparison_charts.html">Cover 
+Page</a>, <a href="http://oss.software.ibm.com/cvs/icu/~checkout~/locale/all_diff_xml/index.html">Index</a></b></p>
+<table>
+  <tr>
+    <th bgcolor="#AD989D">COMMON (<a href="http://oss.software.ibm.com/cvs/icu/~checkout~/locale/common/xml/$locale.xml">xml</a>)</th>
+    <th bgcolor="#1191F1">LINUX (<a href="http://oss.software.ibm.com/cvs/icu/~checkout~/locale/linux/xml/$locale.xml">xml</a>)</th>
+    <th bgcolor="#98FB98">WINDOWS (<a href="http://oss.software.ibm.com/cvs/icu/~checkout~/locale/windows/xml/$locale.xml">xml</a>)</th>
+  </tr>
+
+  <tr>
+    <td bgcolor="#AD989D">1.0-alpha</td>
+    <td bgcolor="#FF6633">1.0</td>
+    <td bgcolor="#FF6633">=</td>
+    <td bgcolor="#FF6633"><span title="006E {LATIN SMALL LETTER N}">&amp;n</span><br>
+      <span title="006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&lt;&nbsp;ny</span><br>
+
+      <span title="006E 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y} / 006E 0079 {LATIN SMALL LETTER N} {LATIN SMALL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;nny&nbsp;/&nbsp;ny</span><br>
+      <span title="006E 0059 {LATIN SMALL LETTER N} {LATIN CAPITAL LETTER Y}">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&lt;&nbsp;nY</span><br>
+    </td>
+    <td bgcolor="#FF6633">=</td>
+    <td bgcolor="#FFFF33">1.2</td>
+
+    <td bgcolor="#98FB98">Windows XP</td>
+    <td bgcolor="#FF6633">=</td>
+    <td bgcolor="#FF6633">=</td>
+  </tr>
+</table>
+
+</body>
diff --git a/colprobe/uniqueFiles.pl b/colprobe/uniqueFiles.pl
new file mode 100755
index 0000000..67da54e
--- /dev/null
+++ b/colprobe/uniqueFiles.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+
+use strict;
+
+my $file;
+my $secondfile;
+my %secondfilelist;
+my @same;
+my %list;
+my $samefile;
+
+foreach $secondfile (@ARGV) {
+  $secondfilelist{$secondfile} = "";
+}
+
+foreach $file (sort keys(%secondfilelist)) {
+  if(exists $secondfilelist{$file}) {
+    delete $secondfilelist{$file};
+    foreach $secondfile (sort(keys %secondfilelist)) {
+      #print "diffing: $file and $secondfile\n";
+      if (!`diff $file $secondfile`) {
+        #print "$file and $secondfile are the same\n";
+        push @same, $secondfile;
+      }
+    }
+#    if ($#same > -1) {
+      print "Adding @same to $file\n";
+      $list{$file} =  [@same] ;
+      foreach $samefile (@same) {
+        delete $secondfilelist{$samefile};
+      }
+      delete @same[0..$#same];
+#    }
+  }
+}
+
+
+my $i = 0;
+my $j = 0;
+ foreach $file (sort( keys %list)) {
+   #print "$file -> "; #@{list{$file}}\n";
+   print "<$file> <$j>\n";
+   foreach $i ( 0 .. $#{ $list{$file} } ) {
+     #print "$list{$file}[$i] ";
+     print "<$list{$file}[$i]> <$j>\n ";
+   }
+   $j++;
+ }
+
diff --git a/colprobe/uprinter.cpp b/colprobe/uprinter.cpp
new file mode 100644
index 0000000..fd9ab9c
--- /dev/null
+++ b/colprobe/uprinter.cpp
@@ -0,0 +1,116 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File uprinter.cpp
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+#include "uprinter.h"
+
+UPrinter::UPrinter(FILE *file, const char *locale, const char *encoding, UBool transliterateNonPrintable) {
+  _on = TRUE;
+  out = u_finit(file, locale, encoding);
+  strcpy(_locale, locale);
+  if(transliterateNonPrintable) {
+    UErrorCode status = U_ZERO_ERROR;
+    UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status);
+    u_fsettransliterator(out, U_WRITE, anyHex, &status);
+  }
+};
+
+UPrinter::UPrinter(const char *name, const char *locale, const char *encoding, UTransliterator *trans, UBool transliterateNonPrintable) {
+  _on = TRUE;
+  out = u_fopen(name, "wb", locale, encoding);
+  u_fputc(0xFEFF, out); // emit a BOM
+  strcpy(_locale, locale);
+  if(transliterateNonPrintable) {
+    UErrorCode status = U_ZERO_ERROR;
+    if(trans == NULL) {
+      UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status);
+      u_fsettransliterator(out, U_WRITE, anyHex, &status);
+    } else {
+      u_fsettransliterator(out, U_WRITE, trans, &status);
+    }
+  }
+};
+
+UPrinter::~UPrinter() {
+  u_fclose(out);
+}
+
+void 
+UPrinter::log(const UnicodeString &string, UBool nl) {
+  if(_on) {
+    log(((UnicodeString)string).getTerminatedBuffer(), nl);
+  }
+}
+
+void 
+UPrinter::log(const UChar *string, UBool nl) {
+  if(_on) {
+    u_fprintf(out, "%S", string);
+    if(nl) {
+      u_fprintf(out, "\n");
+    }
+    u_fflush(out);
+  }
+}
+/*
+void 
+UPrinter::log(const char *string, UBool nl) {
+  if(_on) {
+    u_fprintf(out, "%s", string);
+    if(nl) {
+      u_fprintf(out, "\n");
+    }
+  }
+}
+*/
+void 
+UPrinter::log(const Line *line, UBool nl) {
+  if(_on) {
+    log(line->name);
+    if(line->expLen) {
+      log("/");
+      log(line->expansionString);
+    }
+    if(nl) {
+      u_fprintf(out, "\n");
+      u_fflush(out);
+    }
+  }
+}
+
+void UPrinter::log(const char *fmt, ...)
+{
+    UChar buffer[4000];
+    va_list ap;
+
+    va_start(ap, fmt);
+    /* sprintf it just to make sure that the information is valid */
+    u_vsprintf(buffer, _locale, fmt, ap);
+    va_end(ap);
+    if( _on ) {
+        log(buffer);
+    }
+}
+
+void
+UPrinter::on(void) {
+  _on = TRUE;
+}
+
+void
+UPrinter::off(void) {
+  _on = FALSE;
+}
diff --git a/colprobe/uprinter.h b/colprobe/uprinter.h
new file mode 100644
index 0000000..c242104
--- /dev/null
+++ b/colprobe/uprinter.h
@@ -0,0 +1,51 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*
+* File uprinter.h
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   03/18/2003  weiv        Creation.
+*******************************************************************************
+*/
+
+#ifndef COLPROBE_UPRINTER_H
+#define COLPROBE_UPRINTER_H
+
+#include "line.h"
+
+#include "unicode/ustdio.h"
+#include "unicode/unistr.h"
+#include "unicode/ustring.h"
+
+
+class UPrinter {
+  UFILE *out;
+  UChar buffer[256];
+  UBool _on;
+  char _locale[256];
+public:
+  UPrinter(FILE *file, const char *locale, const char *encoding, UBool transliterateNonPrintable=TRUE);
+  UPrinter(const char *name, const char *locale, const char *encoding, UTransliterator *trans, UBool transliterateNonPrintable);
+  ~UPrinter();
+  void log(const UnicodeString &string, UBool nl = FALSE);
+  void log(const UChar *string, UBool nl = FALSE);
+  //void log(const char *string, UBool nl = FALSE);
+  void log(const Line *line, UBool nl = FALSE);
+  void log(const char *fmt, ...);
+  void off(void);
+  void on(void);
+  UBool isOn(void) {
+    return _on;
+  };
+};
+
+
+
+#endif // #ifndef COLPROBE_UPRINTER_H
diff --git a/colprobe/winGenCollData.pl b/colprobe/winGenCollData.pl
new file mode 100755
index 0000000..e77464c
--- /dev/null
+++ b/colprobe/winGenCollData.pl
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+#my $localeMinusA = `locale -a`;
+my $localeMinusA = `cat locale.txt`;
+
+my @locales = split(/\r\n/, $localeMinusA);
+my $locale;
+my $command;
+
+#my $commandPath = "~/src/icu/source/extra/colprobe/";
+my $commandPath = "c:/dev/0_icu/source/extra/colprobe/release/";
+
+
+my $platform = $ARGV[0];
+
+mkdir $platform."logs";
+mkdir $platform;
+
+foreach $locale (@locales) {
+  $_ = $locale;
+  chomp;
+  if(!/^\#/) { # && /\_/) {
+    $command = $commandPath."colprobe --platform $platform --ref $platform --output resb $locale >$platform"."logs/$locale"."_log.txt 2>&1";
+ 
+    print "$command\n";
+    `$command`;
+  }
+}
diff --git a/multi/Makefile b/multi/Makefile
new file mode 100644
index 0000000..457dbe6
--- /dev/null
+++ b/multi/Makefile
@@ -0,0 +1,3 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+clean:
+	-rm -rf ./tmp
diff --git a/multi/c/Makefile b/multi/c/Makefile
new file mode 100644
index 0000000..521e8e6
--- /dev/null
+++ b/multi/c/Makefile
@@ -0,0 +1,102 @@
+# Copyright (c) 2009-2010 IBM Corp. and Others. All Rights Reserved
+# multicu/c makefile
+
+all:
+	@echo To build all ICUs:  $(MAKE) all-icus
+	@echo "Using the -k option may be a good idea if some are not building properly."
+	@echo ICUVERS: $(ICUVERS)
+
+info:
+
+#ICUCONF=sh ./configure
+ICUCONF=$(MULTICU_ROOT)/c/superconf.sh
+DOT=$(shell pwd)
+MULTICU_ROOT=$(DOT)/..
+include $(MULTICU_ROOT)/common/Makefile-multi.inc
+-include Makefile.local
+
+ICUVERS:=$(shell cd $(ICUS); ls icu4c*.tgz | cut -d- -f2 | sort | uniq | fgrep -v -f $(MULTICU_ROOT)/c/old-icu.txt)
+ICU4JVERS:=$(shell cd $(ICUS); ls icu4j*.jar | cut -d- -f2 | cut -d. -f1 |  sort | uniq | fgrep -v -f $(MULTICU_ROOT)/j/old-icu4j.txt)
+
+BLD=$(C_BLD)
+INS=$(C_INS)
+SRC=$(C_SRC)
+
+ALLICUS=$(ICUVERS:%=$(BLD)/%/$(S_BLD)) $(ICUVERS:%=$(BLD)/r%/$(S_BLD))
+RICUS=$(ICUVERS:%=$(INS)/r%/$(S_INS))
+IICUS=$(ICUVERS:%=$(INS)/%/$(S_INS)) $(RICUS)
+
+
+APRECIOUS=$(ICUVERS:%=$(BLD)/%/$(S_SRC)) $(ICUVERS:%=$(BLD)/r%/$(S_SRC)) $(ICUVERS:%=$(BLD)/%/$(S_BLD)) $(ICUVERS:%=$(INS)/%/$(S_INS)) $(ICUVERS:%=$(BLD)/r%/$(S_BLD)) $(ICUVERS:%=$(INS)/r%/$(S_INS))
+
+.PRECIOUS: $(APRECIOUS)
+
+tehprecious:
+	echo $(APRECIOUS)
+
+$(M_TMP) $(BLD) $(INS):
+	mkdir $(M_TMP)
+	mkdir $(BLD) $(SRC)  $(INS)
+
+$(INS)/%/$(S_INS): $(BLD)/%/$(S_BLD)
+	@if [ -f $(BLD)/$*/build.err ]; then echo '###' Error for $* stored in $(BLD)/$*/build.err - remove if you want me to retry; false;  fi
+	( make $(MAKE_OPTS) -C $(BLD)/$*/icu/source 2>&1 all install | tee $(BLD)/$*/build.log ) || ( mv $(BLD)/$*/build.log $(BLD)/$*/build.err ; false )
+	touch -c $@
+
+$(INS)/r%/$(S_INS): $(BLD)/r%/$(S_BLD)
+	@if [ -f $(BLD)/r$*/build.err ]; then echo '###' Error for $* stored in $(BLD)/r$*/build.err - remove if you want me to retry; false;  fi
+	( make $(MAKE_OPTS) -C $(BLD)/r$*/icu/source 2>&1 all install | tee $(BLD)/r$*/build.log ) || ( mv $(BLD)/r$*/build.log $(BLD)/r$*/build.err ; false )
+	touch -c $@
+
+$(BLD)/r%/$(S_SRC): $(ICUS)/icu4c-%-src.tgz
+	-mv $(BLD)/r$* $(BLD)/r$*.old
+	-( rm -rf ./$(BLD)/r$*.old& )
+	mkdir -p $(BLD)/r$*
+	( cd $(BLD)/r$* ; gunzip -d < $^ | tar xfp - )
+	([ -f $(DOT)/patch/$* ] && patch -d $(BLD)/r$* -p1 < $(DOT)/patch/$*) || true
+	touch -c $@
+
+$(BLD)/%/$(S_SRC): $(ICUS)/icu4c-%-src.tgz
+	-mv $(BLD)/$* $(BLD)/$*.old
+	-( rm -rf ./$(BLD)/$*.old& )
+	mkdir -p $(BLD)/$*
+	( cd $(BLD)/$* ; gunzip -d < $^ | tar xfp - )
+	([ -f $(DOT)/patch/$* ] && patch -d $(BLD)/$* -p1 < $(DOT)/patch/$*) || true
+	touch -c $@
+
+
+$(BLD)/r%/$(S_BLD): $(BLD)/r%/$(S_SRC)
+	-mkdir -p $(INS)
+	-chmod a+rx $(BLD)/r$*/icu/source/configure $(BLD)/r$*/icu/source/runConfigureICU
+	( cd $(BLD)/r$*/icu/source ; `$(ICUCONF) "$(BLD)/r$*/icu/source" "$*"` --enable-renaming --enable-shared --disable-static --enable-release --disable-debug --prefix=$(INS)/r$* )
+	touch -c $@
+
+$(BLD)/%/$(S_BLD): $(BLD)/%/$(S_SRC)
+	-mkdir -p $(INS)
+	-chmod a+rx $(BLD)/$*/icu/source/configure $(BLD)/$*/icu/source/runConfigureICU
+	( cd $(BLD)/$*/icu/source ; `$(ICUCONF) "$(BLD)/$*/icu/source" "$*"` --disable-renaming --enable-shared --disable-static --enable-release --disable-debug --prefix=$(INS)/$* )
+	touch -c $@
+
+
+$(INS)/%/bin/$(TARGET): $(INS)/%/$(S_INS) $(SRCS)
+	-rm -rf ./$(BLD)/$*/tmp
+	mkdir ./$(BLD)/$*/tmp
+	@for file in $(OBJECTS); \
+	do \
+		what=`basename $$file .o` ; \
+		echo compiling $*/$$what ; \
+		$(CXX) -c -o ./$(BLD)/$*/tmp/$$what.o $$what.cpp -I $(INS)/$*/include -I $(BLD)/$*/icu/source/tools/toolutil ; \
+	done
+	$(CXX) -o $@ $(OBJECTS:%.o=./$(BLD)/$*/tmp/%.o)  -licudata -licuuc -licutu -licui18n -L$(INS)/$*/lib 
+
+foo:
+	echo $(ALLICUS)
+
+allicus: $(BLD) $(ALLICUS)
+
+
+all-icus: iicus
+
+iicus: $(BLD) $(IICUS)
+
+ricus: $(RICUS)
diff --git a/multi/c/Makefile-c.inc b/multi/c/Makefile-c.inc
new file mode 100644
index 0000000..dde7755
--- /dev/null
+++ b/multi/c/Makefile-c.inc
@@ -0,0 +1,45 @@
+# Copyright (c) 2008-2010 IBM Corp. and Others. All Rights Reserved
+
+include $(MULTICU_ROOT)/common/Makefile-multi.inc
+
+C_GOOD:=$(shell [ -d $(C_INS) ] && (cd $(C_INS) ; ls -d */$(S_INS) 2>/dev/null | cut -d/ -f1))
+
+C_CLEAN_TARGET=$(C_GOOD:%=$(C_INS)/%/bin/$(TARGET))
+
+SOURCES=$(C_SOURCES) $(CXX_SOURCES)
+C_OBJECTS=$(C_SOURCES:%.c=%.o)
+CXX_OBJECTS=$(CXX_SOURCES:%.cpp=%.o)
+OBJECTS=$(C_OBJECTS) $(CXX_OBJECTS)
+DEBUGOPT=-g
+
+# list of ICUs to be built	
+ICU_TARBALLS=$(shell cd $(ICUS) ; ls icu4c-*-src.tgz)
+# list of versions ( form "3_8  4_0" etc. )
+ICU_TARBALLS_VERS=$(ICU_TARBALLS:icu4c-%-src.tgz=%)
+
+
+$(C_INS)/%/bin/$(TARGET):	$(SOURCES) $(HEADERS)
+	-rm -rf $(C_INS)/$*/tmp
+	mkdir $(C_INS)/$*/tmp
+ifneq (,$(CXX_OBJECTS))
+	@for file in $(CXX_OBJECTS); \
+	do \
+		what=`basename $$file .o` ; \
+		echo compiling '(C++)' $*/$$what ; \
+		`$(C_INS)/$*/bin/icu-config --cxx` `$(C_INS)/$*/bin/icu-config --cxxflags` $(DEBUGOPT)  -c -o $(C_INS)/$*/tmp/$$what.o $$what.cpp -I $(C_INS)/$*/include -I $(C_BLD)/$*/icu/source/tools/toolutil  || \
+		$(CXX) $(DEBUGOPT) -c -o $(C_INS)/$*/tmp/$$what.o $${what}.cpp -I $(C_INS)/$*/include -I $(C_BLD)/$*/icu/source/tools/toolutil ; \
+	done
+endif
+ifneq (,$(C_OBJECTS))
+	@for file in $(C_OBJECTS); \
+	do \
+		what=`basename $$file .o` ; \
+		echo compiling '(C  )' $*/$$what ; \
+		$(CC) $(DEBUGOPT) -c -o $(C_INS)/$*/tmp/$$what.o $${what}.c -I $(C_INS)/$*/include -I $(C_BLD)/$*/icu/source/tools/toolutil ; \
+	done
+endif
+	@echo linking $*/$$what
+	@`$(C_INS)/$*/bin/icu-config --cxx` `$(C_INS)/$*/bin/icu-config --ldflags `  $(DEBUGOPT) -o $@ $(OBJECTS:%.o=$(C_INS)/$*/tmp/%.o)  -licudata -licuuc -licutu -licui18n -licuio -L$(C_INS)/$*/lib || \
+	 $(CXX) $(DEBUGOPT) -o $@ $(OBJECTS:%.o=$(C_INS)/$*/tmp/%.o)  -licudata -licuuc -licutu -licui18n -licuio -L$(C_INS)/$*/lib 
+
+
diff --git a/multi/c/old-icu.txt b/multi/c/old-icu.txt
new file mode 100644
index 0000000..8867e7d
--- /dev/null
+++ b/multi/c/old-icu.txt
@@ -0,0 +1,2 @@
+# Copyright (c) 2009 IBM Corp. and Others. All Rights Reserved
+# a list of ICU4Cs too old to build with the current patchset.
diff --git a/multi/c/patch/3_0 b/multi/c/patch/3_0
new file mode 100644
index 0000000..ea33801
--- /dev/null
+++ b/multi/c/patch/3_0
@@ -0,0 +1,12775 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+Only in 3_0/icu/source: bin
+Only in 3_0.orig/icu/source: confdefs.h
+diff -ru 3_0.orig/icu/source/config/mh-darwin 3_0/icu/source/config/mh-darwin
+--- 3_0.orig/icu/source/config/mh-darwin	2008-10-20 14:57:52.000000000 -0700
++++ 3_0/icu/source/config/mh-darwin	2008-10-20 15:57:28.000000000 -0700
+@@ -15,6 +15,8 @@
+ ## Commands to generate dependency files
+ GEN_DEPS.c=	$(CC) -E -MMD  $(DEFS) $(CPPFLAGS)
+ GEN_DEPS.cc=	$(CXX) -E -MMD  $(DEFS) $(CPPFLAGS)
++GEN_DEPS.c=	echo
++GEN_DEPS.cc=	echo
+ 
+ ## Commands to compile
+ COMPILE.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -fno-common -c
+Only in 3_0.orig/icu/source: config.cache
+Only in 3_0.orig/icu/source: config.log
+diff -ru 3_0.orig/icu/source/configure 3_0/icu/source/configure
+--- 3_0.orig/icu/source/configure	2008-10-20 14:58:10.000000000 -0700
++++ 3_0/icu/source/configure	2008-10-20 15:54:46.000000000 -0700
+@@ -1,65 +1,822 @@
+ #! /bin/sh
+-
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated automatically using autoconf version 2.13 
+-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
++# Generated by GNU Autoconf 2.63.
+ #
++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ # This configure script is free software; the Free Software Foundation
+ # gives unlimited permission to copy, distribute and modify it.
++## --------------------- ##
++## M4sh Initialization.  ##
++## --------------------- ##
++
++# Be more Bourne compatible
++DUALCASE=1; export DUALCASE # for MKS sh
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++  emulate sh
++  NULLCMD=:
++  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++  # is contrary to our usage.  Disable this feature.
++  alias -g '${1+"$@"}'='"$@"'
++  setopt NO_GLOB_SUBST
++else
++  case `(set -o) 2>/dev/null` in
++  *posix*) set -o posix ;;
++esac
++
++fi
++
++
++
++
++# PATH needs CR
++# Avoid depending upon Character Ranges.
++as_cr_letters='abcdefghijklmnopqrstuvwxyz'
++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
++as_cr_Letters=$as_cr_letters$as_cr_LETTERS
++as_cr_digits='0123456789'
++as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++as_nl='
++'
++export as_nl
++# Printing a long string crashes Solaris 7 /usr/bin/printf.
++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
++if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
++  as_echo='printf %s\n'
++  as_echo_n='printf %s'
++else
++  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
++    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
++    as_echo_n='/usr/ucb/echo -n'
++  else
++    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
++    as_echo_n_body='eval
++      arg=$1;
++      case $arg in
++      *"$as_nl"*)
++	expr "X$arg" : "X\\(.*\\)$as_nl";
++	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
++      esac;
++      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
++    '
++    export as_echo_n_body
++    as_echo_n='sh -c $as_echo_n_body as_echo'
++  fi
++  export as_echo_body
++  as_echo='sh -c $as_echo_body as_echo'
++fi
++
++# The user is always right.
++if test "${PATH_SEPARATOR+set}" != set; then
++  PATH_SEPARATOR=:
++  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
++    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
++      PATH_SEPARATOR=';'
++  }
++fi
++
++# Support unset when possible.
++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
++  as_unset=unset
++else
++  as_unset=false
++fi
++
++
++# IFS
++# We need space, tab and new line, in precisely that order.  Quoting is
++# there to prevent editors from complaining about space-tab.
++# (If _AS_PATH_WALK were called with IFS unset, it would disable word
++# splitting by setting IFS to empty value.)
++IFS=" ""	$as_nl"
++
++# Find who we are.  Look in the path if we contain no directory separator.
++case $0 in
++  *[\\/]* ) as_myself=$0 ;;
++  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
++done
++IFS=$as_save_IFS
++
++     ;;
++esac
++# We did not find ourselves, most probably we were run as `sh COMMAND'
++# in which case we are not to be found in the path.
++if test "x$as_myself" = x; then
++  as_myself=$0
++fi
++if test ! -f "$as_myself"; then
++  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++  { (exit 1); exit 1; }
++fi
++
++# Work around bugs in pre-3.0 UWIN ksh.
++for as_var in ENV MAIL MAILPATH
++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++done
++PS1='$ '
++PS2='> '
++PS4='+ '
++
++# NLS nuisances.
++LC_ALL=C
++export LC_ALL
++LANGUAGE=C
++export LANGUAGE
++
++# Required to use basename.
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++   test "X`expr 00001 : '.*\(...\)'`" = X001; then
++  as_expr=expr
++else
++  as_expr=false
++fi
++
++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
++  as_basename=basename
++else
++  as_basename=false
++fi
++
++
++# Name of the executable.
++as_me=`$as_basename -- "$0" ||
++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++	 X"$0" : 'X\(//\)$' \| \
++	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X/"$0" |
++    sed '/^.*\/\([^/][^/]*\)\/*$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\/\(\/\/\)$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\/\(\/\).*/{
++	    s//\1/
++	    q
++	  }
++	  s/.*/./; q'`
++
++# CDPATH.
++$as_unset CDPATH
++
++
++if test "x$CONFIG_SHELL" = x; then
++  if (eval ":") 2>/dev/null; then
++  as_have_required=yes
++else
++  as_have_required=no
++fi
++
++  if test $as_have_required = yes &&	 (eval ":
++(as_func_return () {
++  (exit \$1)
++}
++as_func_success () {
++  as_func_return 0
++}
++as_func_failure () {
++  as_func_return 1
++}
++as_func_ret_success () {
++  return 0
++}
++as_func_ret_failure () {
++  return 1
++}
++
++exitcode=0
++if as_func_success; then
++  :
++else
++  exitcode=1
++  echo as_func_success failed.
++fi
++
++if as_func_failure; then
++  exitcode=1
++  echo as_func_failure succeeded.
++fi
++
++if as_func_ret_success; then
++  :
++else
++  exitcode=1
++  echo as_func_ret_success failed.
++fi
++
++if as_func_ret_failure; then
++  exitcode=1
++  echo as_func_ret_failure succeeded.
++fi
++
++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
++  :
++else
++  exitcode=1
++  echo positional parameters were not saved.
++fi
++
++test \$exitcode = 0) || { (exit 1); exit 1; }
++
++(
++  as_lineno_1=\$LINENO
++  as_lineno_2=\$LINENO
++  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
++  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
++") 2> /dev/null; then
++  :
++else
++  as_candidate_shells=
++    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  case $as_dir in
++	 /*)
++	   for as_base in sh bash ksh sh5; do
++	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
++	   done;;
++       esac
++done
++IFS=$as_save_IFS
++
++
++      for as_shell in $as_candidate_shells $SHELL; do
++	 # Try only shells that exist, to save several forks.
++	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
++		{ ("$as_shell") 2> /dev/null <<\_ASEOF
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++  emulate sh
++  NULLCMD=:
++  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++  # is contrary to our usage.  Disable this feature.
++  alias -g '${1+"$@"}'='"$@"'
++  setopt NO_GLOB_SUBST
++else
++  case `(set -o) 2>/dev/null` in
++  *posix*) set -o posix ;;
++esac
++
++fi
++
++
++:
++_ASEOF
++}; then
++  CONFIG_SHELL=$as_shell
++	       as_have_required=yes
++	       if { "$as_shell" 2> /dev/null <<\_ASEOF
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++  emulate sh
++  NULLCMD=:
++  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++  # is contrary to our usage.  Disable this feature.
++  alias -g '${1+"$@"}'='"$@"'
++  setopt NO_GLOB_SUBST
++else
++  case `(set -o) 2>/dev/null` in
++  *posix*) set -o posix ;;
++esac
++
++fi
++
++
++:
++(as_func_return () {
++  (exit $1)
++}
++as_func_success () {
++  as_func_return 0
++}
++as_func_failure () {
++  as_func_return 1
++}
++as_func_ret_success () {
++  return 0
++}
++as_func_ret_failure () {
++  return 1
++}
++
++exitcode=0
++if as_func_success; then
++  :
++else
++  exitcode=1
++  echo as_func_success failed.
++fi
++
++if as_func_failure; then
++  exitcode=1
++  echo as_func_failure succeeded.
++fi
++
++if as_func_ret_success; then
++  :
++else
++  exitcode=1
++  echo as_func_ret_success failed.
++fi
++
++if as_func_ret_failure; then
++  exitcode=1
++  echo as_func_ret_failure succeeded.
++fi
++
++if ( set x; as_func_ret_success y && test x = "$1" ); then
++  :
++else
++  exitcode=1
++  echo positional parameters were not saved.
++fi
++
++test $exitcode = 0) || { (exit 1); exit 1; }
++
++(
++  as_lineno_1=$LINENO
++  as_lineno_2=$LINENO
++  test "x$as_lineno_1" != "x$as_lineno_2" &&
++  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
++
++_ASEOF
++}; then
++  break
++fi
++
++fi
++
++      done
++
++      if test "x$CONFIG_SHELL" != x; then
++  for as_var in BASH_ENV ENV
++	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++	done
++	export CONFIG_SHELL
++	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
++fi
++
++
++    if test $as_have_required = no; then
++  echo This script requires a shell more modern than all the
++      echo shells that I found on your system.  Please install a
++      echo modern shell, or manually run the script under such a
++      echo shell if you do have one.
++      { (exit 1); exit 1; }
++fi
++
++
++fi
++
++fi
++
++
++
++(eval "as_func_return () {
++  (exit \$1)
++}
++as_func_success () {
++  as_func_return 0
++}
++as_func_failure () {
++  as_func_return 1
++}
++as_func_ret_success () {
++  return 0
++}
++as_func_ret_failure () {
++  return 1
++}
++
++exitcode=0
++if as_func_success; then
++  :
++else
++  exitcode=1
++  echo as_func_success failed.
++fi
++
++if as_func_failure; then
++  exitcode=1
++  echo as_func_failure succeeded.
++fi
++
++if as_func_ret_success; then
++  :
++else
++  exitcode=1
++  echo as_func_ret_success failed.
++fi
++
++if as_func_ret_failure; then
++  exitcode=1
++  echo as_func_ret_failure succeeded.
++fi
++
++if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
++  :
++else
++  exitcode=1
++  echo positional parameters were not saved.
++fi
++
++test \$exitcode = 0") || {
++  echo No shell found that supports shell functions.
++  echo Please tell bug-autoconf@gnu.org about your system,
++  echo including any error possibly output before this message.
++  echo This can help us improve future autoconf versions.
++  echo Configuration will now proceed without shell functions.
++}
++
++
++
++  as_lineno_1=$LINENO
++  as_lineno_2=$LINENO
++  test "x$as_lineno_1" != "x$as_lineno_2" &&
++  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
++
++  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
++  # uniformly replaced by the line number.  The first 'sed' inserts a
++  # line-number line after each line using $LINENO; the second 'sed'
++  # does the real work.  The second script uses 'N' to pair each
++  # line-number line with the line containing $LINENO, and appends
++  # trailing '-' during substitution so that $LINENO is not a special
++  # case at line end.
++  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
++  # scripts with optimization help from Paolo Bonzini.  Blame Lee
++  # E. McMahon (1931-1989) for sed's syntax.  :-)
++  sed -n '
++    p
++    /[$]LINENO/=
++  ' <$as_myself |
++    sed '
++      s/[$]LINENO.*/&-/
++      t lineno
++      b
++      :lineno
++      N
++      :loop
++      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
++      t loop
++      s/-\n.*//
++    ' >$as_me.lineno &&
++  chmod +x "$as_me.lineno" ||
++    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
++   { (exit 1); exit 1; }; }
++
++  # Don't try to exec as it changes $[0], causing all sort of problems
++  # (the dirname of $[0] is not the place where we might find the
++  # original and so on.  Autoconf is especially sensitive to this).
++  . "./$as_me.lineno"
++  # Exit status is that of the last command.
++  exit
++}
++
++
++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
++  as_dirname=dirname
++else
++  as_dirname=false
++fi
++
++ECHO_C= ECHO_N= ECHO_T=
++case `echo -n x` in
++-n*)
++  case `echo 'x\c'` in
++  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
++  *)   ECHO_C='\c';;
++  esac;;
++*)
++  ECHO_N='-n';;
++esac
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++   test "X`expr 00001 : '.*\(...\)'`" = X001; then
++  as_expr=expr
++else
++  as_expr=false
++fi
++
++rm -f conf$$ conf$$.exe conf$$.file
++if test -d conf$$.dir; then
++  rm -f conf$$.dir/conf$$.file
++else
++  rm -f conf$$.dir
++  mkdir conf$$.dir 2>/dev/null
++fi
++if (echo >conf$$.file) 2>/dev/null; then
++  if ln -s conf$$.file conf$$ 2>/dev/null; then
++    as_ln_s='ln -s'
++    # ... but there are two gotchas:
++    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++    # In both cases, we have to default to `cp -p'.
++    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
++      as_ln_s='cp -p'
++  elif ln conf$$.file conf$$ 2>/dev/null; then
++    as_ln_s=ln
++  else
++    as_ln_s='cp -p'
++  fi
++else
++  as_ln_s='cp -p'
++fi
++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
++rmdir conf$$.dir 2>/dev/null
++
++if mkdir -p . 2>/dev/null; then
++  as_mkdir_p=:
++else
++  test -d ./-p && rmdir ./-p
++  as_mkdir_p=false
++fi
+ 
+-# Defaults:
+-ac_help=
++if test -x / >/dev/null 2>&1; then
++  as_test_x='test -x'
++else
++  if ls -dL / >/dev/null 2>&1; then
++    as_ls_L_option=L
++  else
++    as_ls_L_option=
++  fi
++  as_test_x='
++    eval sh -c '\''
++      if test -d "$1"; then
++	test -d "$1/.";
++      else
++	case $1 in
++	-*)set "./$1";;
++	esac;
++	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
++	???[sx]*):;;*)false;;esac;fi
++    '\'' sh
++  '
++fi
++as_executable_p=$as_test_x
++
++# Sed expression to map a string onto a valid CPP name.
++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
++
++# Sed expression to map a string onto a valid variable name.
++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
++
++
++
++exec 7<&0 </dev/null 6>&1
++
++# Name of the host.
++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
++# so uname gets run too.
++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
++
++#
++# Initializations.
++#
+ ac_default_prefix=/usr/local
+-# Any additions from configure.in:
+-ac_help="$ac_help
+-  --enable-strict         compile with strict compiler options [default=no]"
+-ac_help="$ac_help
+-  --enable-64bit-libs     build 64-bit libraries [default=yes]"
+-ac_help="$ac_help
+-  --enable-shared         build shared libraries [default=yes]"
+-ac_help="$ac_help
+-  --enable-static         build static libraries [default=no]"
+-ac_help="$ac_help
+-  --enable-debug          build debug libraries [default=no]"
+-ac_help="$ac_help
+-  --enable-release        build release libraries [default=yes]"
+-ac_help="$ac_help
+-  --enable-renaming       add a version suffix to symbols [default=yes]"
+-ac_help="$ac_help
+-  --enable-tracing        enable function and data tracing [default=yes]"
+-ac_help="$ac_help
+-  --enable-rpath          use rpath when linking [default is only if necessary]"
+-ac_help="$ac_help
+-  --enable-threads        build ICU with thread safety [default=yes]"
+-ac_help="$ac_help
+-  --with-iostream=version specify the version of iostream to use (none, old, std, auto) [default=auto]"
+-ac_help="$ac_help
+-  --enable-extras         build ICU extras [default=yes]"
+-ac_help="$ac_help
+-  --enable-icuio          build ICU's icuio library [default=yes]"
+-ac_help="$ac_help
+-  --enable-layout         build ICU's layout library [default=yes]"
+-ac_help="$ac_help
+-  --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) [default=auto]"
+-ac_help="$ac_help
+-"
+-ac_help="$ac_help
+-  --with-library-suffix=suffix    tag a suffix to the library names [default=]"
+-ac_help="$ac_help
+-  --enable-tests          build ICU tests [default=yes]"
+-ac_help="$ac_help
+-  --enable-samples        build ICU samples [default=yes]  
+-Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries."
++ac_clean_files=
++ac_config_libobj_dir=.
++LIBOBJS=
++cross_compiling=no
++subdirs=
++MFLAGS=
++MAKEFLAGS=
++SHELL=${CONFIG_SHELL-/bin/sh}
++
++# Identity of this package.
++PACKAGE_NAME=
++PACKAGE_TARNAME=
++PACKAGE_VERSION=
++PACKAGE_STRING=
++PACKAGE_BUGREPORT=
++
++ac_unique_file="common/unicode/utypes.h"
++# Factoring default headers for most tests.
++ac_includes_default="\
++#include <stdio.h>
++#ifdef HAVE_SYS_TYPES_H
++# include <sys/types.h>
++#endif
++#ifdef HAVE_SYS_STAT_H
++# include <sys/stat.h>
++#endif
++#ifdef STDC_HEADERS
++# include <stdlib.h>
++# include <stddef.h>
++#else
++# ifdef HAVE_STDLIB_H
++#  include <stdlib.h>
++# endif
++#endif
++#ifdef HAVE_STRING_H
++# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
++#  include <memory.h>
++# endif
++# include <string.h>
++#endif
++#ifdef HAVE_STRINGS_H
++# include <strings.h>
++#endif
++#ifdef HAVE_INTTYPES_H
++# include <inttypes.h>
++#endif
++#ifdef HAVE_STDINT_H
++# include <stdint.h>
++#endif
++#ifdef HAVE_UNISTD_H
++# include <unistd.h>
++#endif"
++
++ac_subst_vars='LTLIBOBJS
++LIBOBJS
++AIX_SHLIB
++ld_rpath_suf
++platform_make_fragment
++platform_make_fragment_name
++platform
++ICUDATA_CHAR
++SAMPLES_TRUE
++TESTS_TRUE
++ICULIBSUFFIXCNAME
++U_HAVE_LIB_SUFFIX
++ICULIBSUFFIX
++DATA_PACKAGING_MODE
++DATA_PACKAGING_CPPFLAGS
++thepkgicudatadir
++pkgicudatadir
++thelibdir
++thedatadir
++thesysconfdir
++LAYOUT_TRUE
++ICUIO_TRUE
++EXTRAS_TRUE
++U_SIZEOF_WCHAR_T
++U_HAVE_WCSCPY
++U_HAVE_WCHAR_H
++HAVE_UINT64_T
++HAVE_INT64_T
++HAVE_UINT32_T
++HAVE_INT32_T
++HAVE_UINT16_T
++HAVE_INT16_T
++HAVE_UINT8_T
++HAVE_INT8_T
++U_TIMEZONE
++U_HAVE_TIMEZONE
++U_TZNAME
++U_TZSET
++U_HAVE_POPEN
++U_HAVE_PLACEMENT_NEW
++U_OVERRIDE_CXX_ALLOCATION
++U_HAVE_NAMESPACE
++U_NL_LANGINFO_CODESET
++U_HAVE_NL_LANGINFO_CODESET
++U_HAVE_NL_LANGINFO
++U_IS_BIG_ENDIAN
++U_IOSTREAM_SOURCE
++CXXCPP
++U_HAVE_INTTYPES_H
++EGREP
++GREP
++CPP
++GENCCODE_ASSEMBLY
++HAVE_MMAP
++ICU_USE_THREADS
++THREADS_TRUE
++U_INLINE
++ENABLE_RPATH
++U_ENABLE_TRACING
++U_DISABLE_RENAMING
++AR
++RANLIB
++ENABLE_RELEASE
++ENABLE_DEBUG
++ENABLE_STATIC
++ENABLE_SHARED
++LIB_M
++COMPILE_LINK_ENVVAR
++ARFLAGS
++host_os
++host_vendor
++host_cpu
++host
++build_os
++build_vendor
++build_cpu
++build
++DOXYGEN
++U_MAKE
++STRIP
++INSTALL_DATA
++INSTALL_SCRIPT
++INSTALL_PROGRAM
++ac_ct_CXX
++CXXFLAGS
++CXX
++OBJEXT
++EXEEXT
++ac_ct_CC
++LDFLAGS
++CFLAGS
++CC
++CPPFLAGS
++UNICODE_VERSION
++LIB_VERSION_MAJOR
++LIB_VERSION
++VERSION
++PACKAGE
++target_alias
++host_alias
++build_alias
++LIBS
++ECHO_T
++ECHO_N
++ECHO_C
++DEFS
++mandir
++localedir
++libdir
++psdir
++pdfdir
++dvidir
++htmldir
++infodir
++docdir
++oldincludedir
++includedir
++localstatedir
++sharedstatedir
++sysconfdir
++datadir
++datarootdir
++libexecdir
++sbindir
++bindir
++program_transform_name
++prefix
++exec_prefix
++PACKAGE_BUGREPORT
++PACKAGE_STRING
++PACKAGE_VERSION
++PACKAGE_TARNAME
++PACKAGE_NAME
++PATH_SEPARATOR
++SHELL'
++ac_subst_files=''
++ac_user_opts='
++enable_option_checking
++enable_strict
++enable_64bit_libs
++enable_shared
++enable_static
++enable_debug
++enable_release
++enable_renaming
++enable_tracing
++enable_rpath
++enable_threads
++with_iostream
++enable_extras
++enable_layout
++with_data_packaging
++enable_mapped
++with_library_suffix
++enable_tests
++enable_samples
++'
++      ac_precious_vars='build_alias
++host_alias
++target_alias
++CC
++CFLAGS
++LDFLAGS
++LIBS
++CPPFLAGS
++CXX
++CXXFLAGS
++CCC
++CPP
++CXXCPP'
++
+ 
+ # Initialize some variables set by options.
++ac_init_help=
++ac_init_version=false
++ac_unrecognized_opts=
++ac_unrecognized_sep=
+ # The variables have the same names as the options, with
+ # dashes changed to underlines.
+-build=NONE
+-cache_file=./config.cache
++cache_file=/dev/null
+ exec_prefix=NONE
+-host=NONE
+ no_create=
+-nonopt=NONE
+ no_recursion=
+ prefix=NONE
+ program_prefix=NONE
+@@ -68,94 +825,133 @@
+ silent=
+ site=
+ srcdir=
+-target=NONE
+ verbose=
+ x_includes=NONE
+ x_libraries=NONE
++
++# Installation directory options.
++# These are left unexpanded so users can "make install exec_prefix=/foo"
++# and all the variables that are supposed to be based on exec_prefix
++# by default will actually change.
++# Use braces instead of parens because sh, perl, etc. also accept them.
++# (The list follows the same order as the GNU Coding Standards.)
+ bindir='${exec_prefix}/bin'
+ sbindir='${exec_prefix}/sbin'
+ libexecdir='${exec_prefix}/libexec'
+-datadir='${prefix}/share'
++datarootdir='${prefix}/share'
++datadir='${datarootdir}'
+ sysconfdir='${prefix}/etc'
+ sharedstatedir='${prefix}/com'
+ localstatedir='${prefix}/var'
+-libdir='${exec_prefix}/lib'
+ includedir='${prefix}/include'
+ oldincludedir='/usr/include'
+-infodir='${prefix}/info'
+-mandir='${prefix}/man'
+-
+-# Initialize some other variables.
+-subdirs=
+-MFLAGS= MAKEFLAGS=
+-SHELL=${CONFIG_SHELL-/bin/sh}
+-# Maximum number of lines to put in a shell here document.
+-ac_max_here_lines=12
++docdir='${datarootdir}/doc/${PACKAGE}'
++infodir='${datarootdir}/info'
++htmldir='${docdir}'
++dvidir='${docdir}'
++pdfdir='${docdir}'
++psdir='${docdir}'
++libdir='${exec_prefix}/lib'
++localedir='${datarootdir}/locale'
++mandir='${datarootdir}/man'
+ 
+ ac_prev=
++ac_dashdash=
+ for ac_option
+ do
+-
+   # If the previous option needs an argument, assign it.
+   if test -n "$ac_prev"; then
+-    eval "$ac_prev=\$ac_option"
++    eval $ac_prev=\$ac_option
+     ac_prev=
+     continue
+   fi
+ 
+-  case "$ac_option" in
+-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+-  *) ac_optarg= ;;
++  case $ac_option in
++  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
++  *)	ac_optarg=yes ;;
+   esac
+ 
+   # Accept the important Cygnus configure options, so we can diagnose typos.
+ 
+-  case "$ac_option" in
++  case $ac_dashdash$ac_option in
++  --)
++    ac_dashdash=yes ;;
+ 
+   -bindir | --bindir | --bindi | --bind | --bin | --bi)
+     ac_prev=bindir ;;
+   -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+-    bindir="$ac_optarg" ;;
++    bindir=$ac_optarg ;;
+ 
+   -build | --build | --buil | --bui | --bu)
+-    ac_prev=build ;;
++    ac_prev=build_alias ;;
+   -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+-    build="$ac_optarg" ;;
++    build_alias=$ac_optarg ;;
+ 
+   -cache-file | --cache-file | --cache-fil | --cache-fi \
+   | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+     ac_prev=cache_file ;;
+   -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+   | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+-    cache_file="$ac_optarg" ;;
++    cache_file=$ac_optarg ;;
+ 
+-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
++  --config-cache | -C)
++    cache_file=config.cache ;;
++
++  -datadir | --datadir | --datadi | --datad)
+     ac_prev=datadir ;;
+-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+-  | --da=*)
+-    datadir="$ac_optarg" ;;
++  -datadir=* | --datadir=* | --datadi=* | --datad=*)
++    datadir=$ac_optarg ;;
++
++  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
++  | --dataroo | --dataro | --datar)
++    ac_prev=datarootdir ;;
++  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
++  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
++    datarootdir=$ac_optarg ;;
+ 
+   -disable-* | --disable-*)
+-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
++    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+     # Reject names that are not valid shell variable names.
+-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+-    fi
+-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+-    eval "enable_${ac_feature}=no" ;;
++    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
++   { (exit 1); exit 1; }; }
++    ac_useropt_orig=$ac_useropt
++    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++    case $ac_user_opts in
++      *"
++"enable_$ac_useropt"
++"*) ;;
++      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
++	 ac_unrecognized_sep=', ';;
++    esac
++    eval enable_$ac_useropt=no ;;
++
++  -docdir | --docdir | --docdi | --doc | --do)
++    ac_prev=docdir ;;
++  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
++    docdir=$ac_optarg ;;
++
++  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
++    ac_prev=dvidir ;;
++  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
++    dvidir=$ac_optarg ;;
+ 
+   -enable-* | --enable-*)
+-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
++    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+     # Reject names that are not valid shell variable names.
+-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+-    fi
+-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+-    case "$ac_option" in
+-      *=*) ;;
+-      *) ac_optarg=yes ;;
++    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
++   { (exit 1); exit 1; }; }
++    ac_useropt_orig=$ac_useropt
++    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++    case $ac_user_opts in
++      *"
++"enable_$ac_useropt"
++"*) ;;
++      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
++	 ac_unrecognized_sep=', ';;
+     esac
+-    eval "enable_${ac_feature}='$ac_optarg'" ;;
++    eval enable_$ac_useropt=\$ac_optarg ;;
+ 
+   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+@@ -164,116 +960,77 @@
+   -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+   | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+   | --exec=* | --exe=* | --ex=*)
+-    exec_prefix="$ac_optarg" ;;
++    exec_prefix=$ac_optarg ;;
+ 
+   -gas | --gas | --ga | --g)
+     # Obsolete; use --with-gas.
+     with_gas=yes ;;
+ 
+-  -help | --help | --hel | --he)
+-    # Omit some internal or obsolete options to make the list less imposing.
+-    # This message is too long to be a string in the A/UX 3.1 sh.
+-    cat << EOF
+-Usage: configure [options] [host]
+-Options: [defaults in brackets after descriptions]
+-Configuration:
+-  --cache-file=FILE       cache test results in FILE
+-  --help                  print this message
+-  --no-create             do not create output files
+-  --quiet, --silent       do not print \`checking...' messages
+-  --version               print the version of autoconf that created configure
+-Directory and file names:
+-  --prefix=PREFIX         install architecture-independent files in PREFIX
+-                          [$ac_default_prefix]
+-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+-                          [same as prefix]
+-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+-  --datadir=DIR           read-only architecture-independent data in DIR
+-                          [PREFIX/share]
+-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+-                          [PREFIX/com]
+-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+-  --includedir=DIR        C header files in DIR [PREFIX/include]
+-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+-  --infodir=DIR           info documentation in DIR [PREFIX/info]
+-  --mandir=DIR            man documentation in DIR [PREFIX/man]
+-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+-  --program-prefix=PREFIX prepend PREFIX to installed program names
+-  --program-suffix=SUFFIX append SUFFIX to installed program names
+-  --program-transform-name=PROGRAM
+-                          run sed PROGRAM on installed program names
+-EOF
+-    cat << EOF
+-Host type:
+-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+-  --host=HOST             configure for HOST [guessed]
+-  --target=TARGET         configure for TARGET [TARGET=HOST]
+-Features and packages:
+-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+-  --x-includes=DIR        X include files are in DIR
+-  --x-libraries=DIR       X library files are in DIR
+-EOF
+-    if test -n "$ac_help"; then
+-      echo "--enable and --with options recognized:$ac_help"
+-    fi
+-    exit 0 ;;
++  -help | --help | --hel | --he | -h)
++    ac_init_help=long ;;
++  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
++    ac_init_help=recursive ;;
++  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
++    ac_init_help=short ;;
+ 
+   -host | --host | --hos | --ho)
+-    ac_prev=host ;;
++    ac_prev=host_alias ;;
+   -host=* | --host=* | --hos=* | --ho=*)
+-    host="$ac_optarg" ;;
++    host_alias=$ac_optarg ;;
++
++  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
++    ac_prev=htmldir ;;
++  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
++  | --ht=*)
++    htmldir=$ac_optarg ;;
+ 
+   -includedir | --includedir | --includedi | --included | --include \
+   | --includ | --inclu | --incl | --inc)
+     ac_prev=includedir ;;
+   -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+   | --includ=* | --inclu=* | --incl=* | --inc=*)
+-    includedir="$ac_optarg" ;;
++    includedir=$ac_optarg ;;
+ 
+   -infodir | --infodir | --infodi | --infod | --info | --inf)
+     ac_prev=infodir ;;
+   -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+-    infodir="$ac_optarg" ;;
++    infodir=$ac_optarg ;;
+ 
+   -libdir | --libdir | --libdi | --libd)
+     ac_prev=libdir ;;
+   -libdir=* | --libdir=* | --libdi=* | --libd=*)
+-    libdir="$ac_optarg" ;;
++    libdir=$ac_optarg ;;
+ 
+   -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+   | --libexe | --libex | --libe)
+     ac_prev=libexecdir ;;
+   -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+   | --libexe=* | --libex=* | --libe=*)
+-    libexecdir="$ac_optarg" ;;
++    libexecdir=$ac_optarg ;;
++
++  -localedir | --localedir | --localedi | --localed | --locale)
++    ac_prev=localedir ;;
++  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
++    localedir=$ac_optarg ;;
+ 
+   -localstatedir | --localstatedir | --localstatedi | --localstated \
+-  | --localstate | --localstat | --localsta | --localst \
+-  | --locals | --local | --loca | --loc | --lo)
++  | --localstate | --localstat | --localsta | --localst | --locals)
+     ac_prev=localstatedir ;;
+   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+-    localstatedir="$ac_optarg" ;;
++  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
++    localstatedir=$ac_optarg ;;
+ 
+   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+     ac_prev=mandir ;;
+   -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+-    mandir="$ac_optarg" ;;
++    mandir=$ac_optarg ;;
+ 
+   -nfp | --nfp | --nf)
+     # Obsolete; use --without-fp.
+     with_fp=no ;;
+ 
+   -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+-  | --no-cr | --no-c)
++  | --no-cr | --no-c | -n)
+     no_create=yes ;;
+ 
+   -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+@@ -287,26 +1044,26 @@
+   -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+   | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+   | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+-    oldincludedir="$ac_optarg" ;;
++    oldincludedir=$ac_optarg ;;
+ 
+   -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+     ac_prev=prefix ;;
+   -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+-    prefix="$ac_optarg" ;;
++    prefix=$ac_optarg ;;
+ 
+   -program-prefix | --program-prefix | --program-prefi | --program-pref \
+   | --program-pre | --program-pr | --program-p)
+     ac_prev=program_prefix ;;
+   -program-prefix=* | --program-prefix=* | --program-prefi=* \
+   | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+-    program_prefix="$ac_optarg" ;;
++    program_prefix=$ac_optarg ;;
+ 
+   -program-suffix | --program-suffix | --program-suffi | --program-suff \
+   | --program-suf | --program-su | --program-s)
+     ac_prev=program_suffix ;;
+   -program-suffix=* | --program-suffix=* | --program-suffi=* \
+   | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+-    program_suffix="$ac_optarg" ;;
++    program_suffix=$ac_optarg ;;
+ 
+   -program-transform-name | --program-transform-name \
+   | --program-transform-nam | --program-transform-na \
+@@ -323,7 +1080,17 @@
+   | --program-transfo=* | --program-transf=* \
+   | --program-trans=* | --program-tran=* \
+   | --progr-tra=* | --program-tr=* | --program-t=*)
+-    program_transform_name="$ac_optarg" ;;
++    program_transform_name=$ac_optarg ;;
++
++  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
++    ac_prev=pdfdir ;;
++  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
++    pdfdir=$ac_optarg ;;
++
++  -psdir | --psdir | --psdi | --psd | --ps)
++    ac_prev=psdir ;;
++  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
++    psdir=$ac_optarg ;;
+ 
+   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+   | -silent | --silent | --silen | --sile | --sil)
+@@ -333,7 +1100,7 @@
+     ac_prev=sbindir ;;
+   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+   | --sbi=* | --sb=*)
+-    sbindir="$ac_optarg" ;;
++    sbindir=$ac_optarg ;;
+ 
+   -sharedstatedir | --sharedstatedir | --sharedstatedi \
+   | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+@@ -344,58 +1111,69 @@
+   | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+   | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+   | --sha=* | --sh=*)
+-    sharedstatedir="$ac_optarg" ;;
++    sharedstatedir=$ac_optarg ;;
+ 
+   -site | --site | --sit)
+     ac_prev=site ;;
+   -site=* | --site=* | --sit=*)
+-    site="$ac_optarg" ;;
++    site=$ac_optarg ;;
+ 
+   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+     ac_prev=srcdir ;;
+   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+-    srcdir="$ac_optarg" ;;
++    srcdir=$ac_optarg ;;
+ 
+   -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+   | --syscon | --sysco | --sysc | --sys | --sy)
+     ac_prev=sysconfdir ;;
+   -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+   | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+-    sysconfdir="$ac_optarg" ;;
++    sysconfdir=$ac_optarg ;;
+ 
+   -target | --target | --targe | --targ | --tar | --ta | --t)
+-    ac_prev=target ;;
++    ac_prev=target_alias ;;
+   -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+-    target="$ac_optarg" ;;
++    target_alias=$ac_optarg ;;
+ 
+   -v | -verbose | --verbose | --verbos | --verbo | --verb)
+     verbose=yes ;;
+ 
+-  -version | --version | --versio | --versi | --vers)
+-    echo "configure generated by autoconf version 2.13"
+-    exit 0 ;;
++  -version | --version | --versio | --versi | --vers | -V)
++    ac_init_version=: ;;
+ 
+   -with-* | --with-*)
+-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
++    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+     # Reject names that are not valid shell variable names.
+-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+-    fi
+-    ac_package=`echo $ac_package| sed 's/-/_/g'`
+-    case "$ac_option" in
+-      *=*) ;;
+-      *) ac_optarg=yes ;;
++    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
++   { (exit 1); exit 1; }; }
++    ac_useropt_orig=$ac_useropt
++    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++    case $ac_user_opts in
++      *"
++"with_$ac_useropt"
++"*) ;;
++      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
++	 ac_unrecognized_sep=', ';;
+     esac
+-    eval "with_${ac_package}='$ac_optarg'" ;;
++    eval with_$ac_useropt=\$ac_optarg ;;
+ 
+   -without-* | --without-*)
+-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
++    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+     # Reject names that are not valid shell variable names.
+-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+-    fi
+-    ac_package=`echo $ac_package| sed 's/-/_/g'`
+-    eval "with_${ac_package}=no" ;;
++    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
++      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
++   { (exit 1); exit 1; }; }
++    ac_useropt_orig=$ac_useropt
++    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
++    case $ac_user_opts in
++      *"
++"with_$ac_useropt"
++"*) ;;
++      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
++	 ac_unrecognized_sep=', ';;
++    esac
++    eval with_$ac_useropt=no ;;
+ 
+   --x)
+     # Obsolete; use --with-x.
+@@ -406,167 +1184,735 @@
+     ac_prev=x_includes ;;
+   -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+   | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+-    x_includes="$ac_optarg" ;;
++    x_includes=$ac_optarg ;;
+ 
+   -x-libraries | --x-libraries | --x-librarie | --x-librari \
+   | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+     ac_prev=x_libraries ;;
+   -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+-    x_libraries="$ac_optarg" ;;
++    x_libraries=$ac_optarg ;;
+ 
+-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
++  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
++Try \`$0 --help' for more information." >&2
++   { (exit 1); exit 1; }; }
+     ;;
+ 
++  *=*)
++    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
++    # Reject names that are not valid shell variable names.
++    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
++      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
++   { (exit 1); exit 1; }; }
++    eval $ac_envvar=\$ac_optarg
++    export $ac_envvar ;;
++
+   *)
+-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+-      echo "configure: warning: $ac_option: invalid host type" 1>&2
+-    fi
+-    if test "x$nonopt" != xNONE; then
+-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+-    fi
+-    nonopt="$ac_option"
++    # FIXME: should be removed in autoconf 3.0.
++    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
++    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
++    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+     ;;
+ 
+   esac
+ done
+ 
+ if test -n "$ac_prev"; then
+-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
++  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
++  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
++   { (exit 1); exit 1; }; }
+ fi
+ 
+-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+-
+-# File descriptor usage:
+-# 0 standard input
+-# 1 file creation
+-# 2 errors and warnings
+-# 3 some systems may open it to /dev/tty
+-# 4 used on the Kubota Titan
+-# 6 checking for... messages and results
+-# 5 compiler messages saved in config.log
+-if test "$silent" = yes; then
+-  exec 6>/dev/null
+-else
+-  exec 6>&1
++if test -n "$ac_unrecognized_opts"; then
++  case $enable_option_checking in
++    no) ;;
++    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
++   { (exit 1); exit 1; }; } ;;
++    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
++  esac
+ fi
+-exec 5>./config.log
+-
+-echo "\
+-This file contains any messages produced by compilers while
+-running configure, to aid debugging if configure makes a mistake.
+-" 1>&5
+ 
+-# Strip out --no-create and --no-recursion so they do not pile up.
+-# Also quote any args containing shell metacharacters.
+-ac_configure_args=
+-for ac_arg
++# Check all directory arguments for consistency.
++for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
++		datadir sysconfdir sharedstatedir localstatedir includedir \
++		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
++		libdir localedir mandir
+ do
+-  case "$ac_arg" in
+-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+-  | --no-cr | --no-c) ;;
+-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+-  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
++  eval ac_val=\$$ac_var
++  # Remove trailing slashes.
++  case $ac_val in
++    */ )
++      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
++      eval $ac_var=\$ac_val;;
+   esac
++  # Be sure to have absolute directory names.
++  case $ac_val in
++    [\\/$]* | ?:[\\/]* )  continue;;
++    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
++  esac
++  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
++   { (exit 1); exit 1; }; }
+ done
+ 
+-# NLS nuisances.
+-# Only set these to C if already set.  These must not be set unconditionally
+-# because not all systems understand e.g. LANG=C (notably SCO).
+-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+-# Non-C LC_CTYPE values break the ctype check.
+-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
++# There might be people who depend on the old broken behavior: `$host'
++# used to hold the argument of --host etc.
++# FIXME: To remove some day.
++build=$build_alias
++host=$host_alias
++target=$target_alias
++
++# FIXME: To remove some day.
++if test "x$host_alias" != x; then
++  if test "x$build_alias" = x; then
++    cross_compiling=maybe
++    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
++    If a cross compiler is detected then cross compile mode will be used." >&2
++  elif test "x$build_alias" != "x$host_alias"; then
++    cross_compiling=yes
++  fi
++fi
++
++ac_tool_prefix=
++test -n "$host_alias" && ac_tool_prefix=$host_alias-
++
++test "$silent" = yes && exec 6>/dev/null
++
++
++ac_pwd=`pwd` && test -n "$ac_pwd" &&
++ac_ls_di=`ls -di .` &&
++ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
++  { $as_echo "$as_me: error: working directory cannot be determined" >&2
++   { (exit 1); exit 1; }; }
++test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
++  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
++   { (exit 1); exit 1; }; }
+ 
+-# confdefs.h avoids OS command line length limits that DEFS can exceed.
+-rm -rf conftest* confdefs.h
+-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+-echo > confdefs.h
+-
+-# A filename unique to this package, relative to the directory that
+-# configure is in, which we can look for to find out if srcdir is correct.
+-ac_unique_file=common/unicode/utypes.h
+ 
+ # Find the source files, if location was not specified.
+ if test -z "$srcdir"; then
+   ac_srcdir_defaulted=yes
+-  # Try the directory containing this script, then its parent.
+-  ac_prog=$0
+-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
++  # Try the directory containing this script, then the parent directory.
++  ac_confdir=`$as_dirname -- "$as_myself" ||
++$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++	 X"$as_myself" : 'X\(//\)[^/]' \| \
++	 X"$as_myself" : 'X\(//\)$' \| \
++	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$as_myself" |
++    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)[^/].*/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\).*/{
++	    s//\1/
++	    q
++	  }
++	  s/.*/./; q'`
+   srcdir=$ac_confdir
+-  if test ! -r $srcdir/$ac_unique_file; then
++  if test ! -r "$srcdir/$ac_unique_file"; then
+     srcdir=..
+   fi
+ else
+   ac_srcdir_defaulted=no
+ fi
+-if test ! -r $srcdir/$ac_unique_file; then
+-  if test "$ac_srcdir_defaulted" = yes; then
+-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+-  else
+-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+-  fi
+-fi
+-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+-
+-# Prefer explicitly selected file to automatically selected ones.
+-if test -z "$CONFIG_SITE"; then
+-  if test "x$prefix" != xNONE; then
+-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+-  else
+-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+-  fi
+-fi
+-for ac_site_file in $CONFIG_SITE; do
+-  if test -r "$ac_site_file"; then
+-    echo "loading site script $ac_site_file"
+-    . "$ac_site_file"
+-  fi
++if test ! -r "$srcdir/$ac_unique_file"; then
++  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
++  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
++   { (exit 1); exit 1; }; }
++fi
++ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
++ac_abs_confdir=`(
++	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
++   { (exit 1); exit 1; }; }
++	pwd)`
++# When building in place, set srcdir=.
++if test "$ac_abs_confdir" = "$ac_pwd"; then
++  srcdir=.
++fi
++# Remove unnecessary trailing slashes from srcdir.
++# Double slashes in file names in object file debugging info
++# mess up M-x gdb in Emacs.
++case $srcdir in
++*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
++esac
++for ac_var in $ac_precious_vars; do
++  eval ac_env_${ac_var}_set=\${${ac_var}+set}
++  eval ac_env_${ac_var}_value=\$${ac_var}
++  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
++  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+ done
+ 
+-if test -r "$cache_file"; then
+-  echo "loading cache $cache_file"
+-  . $cache_file
+-else
+-  echo "creating cache $cache_file"
+-  > $cache_file
++#
++# Report the --help message.
++#
++if test "$ac_init_help" = "long"; then
++  # Omit some internal or obsolete options to make the list less imposing.
++  # This message is too long to be a string in the A/UX 3.1 sh.
++  cat <<_ACEOF
++\`configure' configures this package to adapt to many kinds of systems.
++
++Usage: $0 [OPTION]... [VAR=VALUE]...
++
++To assign environment variables (e.g., CC, CFLAGS...), specify them as
++VAR=VALUE.  See below for descriptions of some of the useful variables.
++
++Defaults for the options are specified in brackets.
++
++Configuration:
++  -h, --help              display this help and exit
++      --help=short        display options specific to this package
++      --help=recursive    display the short help of all the included packages
++  -V, --version           display version information and exit
++  -q, --quiet, --silent   do not print \`checking...' messages
++      --cache-file=FILE   cache test results in FILE [disabled]
++  -C, --config-cache      alias for \`--cache-file=config.cache'
++  -n, --no-create         do not create output files
++      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
++
++Installation directories:
++  --prefix=PREFIX         install architecture-independent files in PREFIX
++                          [$ac_default_prefix]
++  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
++                          [PREFIX]
++
++By default, \`make install' will install all the files in
++\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
++an installation prefix other than \`$ac_default_prefix' using \`--prefix',
++for instance \`--prefix=\$HOME'.
++
++For better control, use the options below.
++
++Fine tuning of the installation directories:
++  --bindir=DIR            user executables [EPREFIX/bin]
++  --sbindir=DIR           system admin executables [EPREFIX/sbin]
++  --libexecdir=DIR        program executables [EPREFIX/libexec]
++  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
++  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
++  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
++  --libdir=DIR            object code libraries [EPREFIX/lib]
++  --includedir=DIR        C header files [PREFIX/include]
++  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
++  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
++  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
++  --infodir=DIR           info documentation [DATAROOTDIR/info]
++  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
++  --mandir=DIR            man documentation [DATAROOTDIR/man]
++  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
++  --htmldir=DIR           html documentation [DOCDIR]
++  --dvidir=DIR            dvi documentation [DOCDIR]
++  --pdfdir=DIR            pdf documentation [DOCDIR]
++  --psdir=DIR             ps documentation [DOCDIR]
++_ACEOF
++
++  cat <<\_ACEOF
++
++System types:
++  --build=BUILD     configure for building on BUILD [guessed]
++  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
++_ACEOF
+ fi
+ 
+-ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
+-
+-ac_exeext=
+-ac_objext=o
+-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+-    ac_n= ac_c='
+-' ac_t='	'
+-  else
+-    ac_n=-n ac_c= ac_t=
++if test -n "$ac_init_help"; then
++
++  cat <<\_ACEOF
++
++Optional Features:
++  --disable-option-checking  ignore unrecognized --enable/--with options
++  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
++  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
++  --enable-strict         compile with strict compiler options default=no
++  --enable-64bit-libs     build 64-bit libraries default=yes
++  --enable-shared         build shared libraries default=yes
++  --enable-static         build static libraries default=no
++  --enable-debug          build debug libraries default=no
++  --enable-release        build release libraries default=yes
++  --enable-renaming       add a version suffix to symbols default=yes
++  --enable-tracing        enable function and data tracing default=yes
++  --enable-rpath          use rpath when linking default is only if necessary
++  --enable-threads        build ICU with thread safety default=yes
++  --enable-extras         build ICU extras default=yes
++  --enable-icuio          build ICU's icuio library default=yes
++  --enable-layout         build ICU's layout library default=yes
++
++  --enable-tests          build ICU tests default=yes
++  --enable-samples        build ICU samples default=yes
++Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.
++
++Optional Packages:
++  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
++  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
++  --with-iostream=version specify the version of iostream to use (none, old, std, auto) default=auto
++  --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) default=auto
++  --with-library-suffix=suffix    tag a suffix to the library names default=
++
++Some influential environment variables:
++  CC          C compiler command
++  CFLAGS      C compiler flags
++  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
++              nonstandard directory <lib dir>
++  LIBS        libraries to pass to the linker, e.g. -l<library>
++  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
++              you have headers in a nonstandard directory <include dir>
++  CXX         C++ compiler command
++  CXXFLAGS    C++ compiler flags
++  CPP         C preprocessor
++  CXXCPP      C++ preprocessor
++
++Use these variables to override the choices made by `configure' or to help
++it to find libraries and programs with nonstandard names/locations.
++
++_ACEOF
++ac_status=$?
++fi
++
++if test "$ac_init_help" = "recursive"; then
++  # If there are subdirs, report their specific --help.
++  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
++    test -d "$ac_dir" ||
++      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
++      continue
++    ac_builddir=.
++
++case "$ac_dir" in
++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++*)
++  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++  # A ".." for each directory in $ac_dir_suffix.
++  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++  case $ac_top_builddir_sub in
++  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++  esac ;;
++esac
++ac_abs_top_builddir=$ac_pwd
++ac_abs_builddir=$ac_pwd$ac_dir_suffix
++# for backward compatibility:
++ac_top_builddir=$ac_top_build_prefix
++
++case $srcdir in
++  .)  # We are building in place.
++    ac_srcdir=.
++    ac_top_srcdir=$ac_top_builddir_sub
++    ac_abs_top_srcdir=$ac_pwd ;;
++  [\\/]* | ?:[\\/]* )  # Absolute name.
++    ac_srcdir=$srcdir$ac_dir_suffix;
++    ac_top_srcdir=$srcdir
++    ac_abs_top_srcdir=$srcdir ;;
++  *) # Relative name.
++    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
++    ac_top_srcdir=$ac_top_build_prefix$srcdir
++    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
++esac
++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
++
++    cd "$ac_dir" || { ac_status=$?; continue; }
++    # Check for guested configure.
++    if test -f "$ac_srcdir/configure.gnu"; then
++      echo &&
++      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
++    elif test -f "$ac_srcdir/configure"; then
++      echo &&
++      $SHELL "$ac_srcdir/configure" --help=recursive
++    else
++      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
++    fi || ac_status=$?
++    cd "$ac_pwd" || { ac_status=$?; break; }
++  done
++fi
++
++test -n "$ac_init_help" && exit $ac_status
++if $ac_init_version; then
++  cat <<\_ACEOF
++configure
++generated by GNU Autoconf 2.63
++
++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
++This configure script is free software; the Free Software Foundation
++gives unlimited permission to copy, distribute and modify it.
++_ACEOF
++  exit
++fi
++cat >config.log <<_ACEOF
++This file contains any messages produced by compilers while
++running configure, to aid debugging if configure makes a mistake.
++
++It was created by $as_me, which was
++generated by GNU Autoconf 2.63.  Invocation command line was
++
++  $ $0 $@
++
++_ACEOF
++exec 5>>config.log
++{
++cat <<_ASUNAME
++## --------- ##
++## Platform. ##
++## --------- ##
++
++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
++uname -m = `(uname -m) 2>/dev/null || echo unknown`
++uname -r = `(uname -r) 2>/dev/null || echo unknown`
++uname -s = `(uname -s) 2>/dev/null || echo unknown`
++uname -v = `(uname -v) 2>/dev/null || echo unknown`
++
++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
++/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
++
++/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
++/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
++/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
++/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
++/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
++/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
++
++_ASUNAME
++
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  $as_echo "PATH: $as_dir"
++done
++IFS=$as_save_IFS
++
++} >&5
++
++cat >&5 <<_ACEOF
++
++
++## ----------- ##
++## Core tests. ##
++## ----------- ##
++
++_ACEOF
++
++
++# Keep a trace of the command line.
++# Strip out --no-create and --no-recursion so they do not pile up.
++# Strip out --silent because we don't want to record it for future runs.
++# Also quote any args containing shell meta-characters.
++# Make two passes to allow for proper duplicate-argument suppression.
++ac_configure_args=
++ac_configure_args0=
++ac_configure_args1=
++ac_must_keep_next=false
++for ac_pass in 1 2
++do
++  for ac_arg
++  do
++    case $ac_arg in
++    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
++    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++    | -silent | --silent | --silen | --sile | --sil)
++      continue ;;
++    *\'*)
++      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
++    esac
++    case $ac_pass in
++    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
++    2)
++      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
++      if test $ac_must_keep_next = true; then
++	ac_must_keep_next=false # Got value, back to normal.
++      else
++	case $ac_arg in
++	  *=* | --config-cache | -C | -disable-* | --disable-* \
++	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
++	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
++	  | -with-* | --with-* | -without-* | --without-* | --x)
++	    case "$ac_configure_args0 " in
++	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
++	    esac
++	    ;;
++	  -* ) ac_must_keep_next=true ;;
++	esac
++      fi
++      ac_configure_args="$ac_configure_args '$ac_arg'"
++      ;;
++    esac
++  done
++done
++$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
++$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
++
++# When interrupted or exit'd, cleanup temporary files, and complete
++# config.log.  We remove comments because anyway the quotes in there
++# would cause problems or look ugly.
++# WARNING: Use '\'' to represent an apostrophe within the trap.
++# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
++trap 'exit_status=$?
++  # Save into config.log some information that might help in debugging.
++  {
++    echo
++
++    cat <<\_ASBOX
++## ---------------- ##
++## Cache variables. ##
++## ---------------- ##
++_ASBOX
++    echo
++    # The following way of writing the cache mishandles newlines in values,
++(
++  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
++    eval ac_val=\$$ac_var
++    case $ac_val in #(
++    *${as_nl}*)
++      case $ac_var in #(
++      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++      esac
++      case $ac_var in #(
++      _ | IFS | as_nl) ;; #(
++      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++      *) $as_unset $ac_var ;;
++      esac ;;
++    esac
++  done
++  (set) 2>&1 |
++    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
++    *${as_nl}ac_space=\ *)
++      sed -n \
++	"s/'\''/'\''\\\\'\'''\''/g;
++	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
++      ;; #(
++    *)
++      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
++      ;;
++    esac |
++    sort
++)
++    echo
++
++    cat <<\_ASBOX
++## ----------------- ##
++## Output variables. ##
++## ----------------- ##
++_ASBOX
++    echo
++    for ac_var in $ac_subst_vars
++    do
++      eval ac_val=\$$ac_var
++      case $ac_val in
++      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++      esac
++      $as_echo "$ac_var='\''$ac_val'\''"
++    done | sort
++    echo
++
++    if test -n "$ac_subst_files"; then
++      cat <<\_ASBOX
++## ------------------- ##
++## File substitutions. ##
++## ------------------- ##
++_ASBOX
++      echo
++      for ac_var in $ac_subst_files
++      do
++	eval ac_val=\$$ac_var
++	case $ac_val in
++	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++	esac
++	$as_echo "$ac_var='\''$ac_val'\''"
++      done | sort
++      echo
++    fi
++
++    if test -s confdefs.h; then
++      cat <<\_ASBOX
++## ----------- ##
++## confdefs.h. ##
++## ----------- ##
++_ASBOX
++      echo
++      cat confdefs.h
++      echo
++    fi
++    test "$ac_signal" != 0 &&
++      $as_echo "$as_me: caught signal $ac_signal"
++    $as_echo "$as_me: exit $exit_status"
++  } >&5
++  rm -f core *.core core.conftest.* &&
++    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
++    exit $exit_status
++' 0
++for ac_signal in 1 2 13 15; do
++  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
++done
++ac_signal=0
++
++# confdefs.h avoids OS command line length limits that DEFS can exceed.
++rm -f -r conftest* confdefs.h
++
++# Predefined preprocessor variables.
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_NAME "$PACKAGE_NAME"
++_ACEOF
++
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
++_ACEOF
++
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_VERSION "$PACKAGE_VERSION"
++_ACEOF
++
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_STRING "$PACKAGE_STRING"
++_ACEOF
++
++
++cat >>confdefs.h <<_ACEOF
++#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
++_ACEOF
++
++
++# Let the site file select an alternate cache file if it wants to.
++# Prefer an explicitly selected file to automatically selected ones.
++ac_site_file1=NONE
++ac_site_file2=NONE
++if test -n "$CONFIG_SITE"; then
++  ac_site_file1=$CONFIG_SITE
++elif test "x$prefix" != xNONE; then
++  ac_site_file1=$prefix/share/config.site
++  ac_site_file2=$prefix/etc/config.site
++else
++  ac_site_file1=$ac_default_prefix/share/config.site
++  ac_site_file2=$ac_default_prefix/etc/config.site
++fi
++for ac_site_file in "$ac_site_file1" "$ac_site_file2"
++do
++  test "x$ac_site_file" = xNONE && continue
++  if test -r "$ac_site_file"; then
++    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
++$as_echo "$as_me: loading site script $ac_site_file" >&6;}
++    sed 's/^/| /' "$ac_site_file" >&5
++    . "$ac_site_file"
++  fi
++done
++
++if test -r "$cache_file"; then
++  # Some versions of bash will fail to source /dev/null (special
++  # files actually), so we avoid doing that.
++  if test -f "$cache_file"; then
++    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
++$as_echo "$as_me: loading cache $cache_file" >&6;}
++    case $cache_file in
++      [\\/]* | ?:[\\/]* ) . "$cache_file";;
++      *)                      . "./$cache_file";;
++    esac
+   fi
+ else
+-  ac_n= ac_c='\c' ac_t=
++  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
++$as_echo "$as_me: creating cache $cache_file" >&6;}
++  >$cache_file
++fi
++
++# Check that the precious variables saved in the cache have kept the same
++# value.
++ac_cache_corrupted=false
++for ac_var in $ac_precious_vars; do
++  eval ac_old_set=\$ac_cv_env_${ac_var}_set
++  eval ac_new_set=\$ac_env_${ac_var}_set
++  eval ac_old_val=\$ac_cv_env_${ac_var}_value
++  eval ac_new_val=\$ac_env_${ac_var}_value
++  case $ac_old_set,$ac_new_set in
++    set,)
++      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
++$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
++      ac_cache_corrupted=: ;;
++    ,set)
++      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
++$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
++      ac_cache_corrupted=: ;;
++    ,);;
++    *)
++      if test "x$ac_old_val" != "x$ac_new_val"; then
++	# differences in whitespace do not lead to failure.
++	ac_old_val_w=`echo x $ac_old_val`
++	ac_new_val_w=`echo x $ac_new_val`
++	if test "$ac_old_val_w" != "$ac_new_val_w"; then
++	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
++$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
++	  ac_cache_corrupted=:
++	else
++	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
++$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
++	  eval $ac_var=\$ac_old_val
++	fi
++	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
++$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
++	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
++$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
++      fi;;
++  esac
++  # Pass precious variables to config.status.
++  if test "$ac_new_set" = set; then
++    case $ac_new_val in
++    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
++    *) ac_arg=$ac_var=$ac_new_val ;;
++    esac
++    case " $ac_configure_args " in
++      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
++      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
++    esac
++  fi
++done
++if $ac_cache_corrupted; then
++  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
++$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
++  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
++$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
++   { (exit 1); exit 1; }; }
+ fi
+ 
+ 
+ 
+ 
++
++
++
++
++
++
++
++
++
++
++
++
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++
++ac_config_headers="$ac_config_headers common/icucfg.h"
++
+ PACKAGE="icu"
+ 
+ 
+-echo $ac_n "checking for ICU version numbers""... $ac_c" 1>&6
+-echo "configure:570: checking for ICU version numbers" >&5
++{ $as_echo "$as_me:$LINENO: checking for ICU version numbers" >&5
++$as_echo_n "checking for ICU version numbers... " >&6; }
+ 
+ geticuversion() {
+     sed -n 's/^[ 	]*#[ 	]*define[ 	]*U_ICU_VERSION[ 	]*"\([^"]*\)".*/\1/p' "$@"
+@@ -575,7 +1921,9 @@
+ if test x"$VERSION" = x; then
+     VERSION=`geticuversion $srcdir/common/unicode/*.h`
+     if test x"$VERSION" = x; then
+-        { echo "configure: error: Cannot determine ICU version number from header files" 1>&2; exit 1; }
++        { { $as_echo "$as_me:$LINENO: error: Cannot determine ICU version number from header files" >&5
++$as_echo "$as_me: error: Cannot determine ICU version number from header files" >&2;}
++   { (exit 1); exit 1; }; }
+     fi
+ fi
+ LIB_VERSION=`echo $VERSION | sed -e 's/\.//' -e 's/^\([^.]*\)$/\1.0/'`
+@@ -583,7 +1931,8 @@
+ 
+ 
+ 
+-echo "$ac_t""release $VERSION, library $LIB_VERSION" 1>&6
++{ $as_echo "$as_me:$LINENO: result: release $VERSION, library $LIB_VERSION" >&5
++$as_echo "release $VERSION, library $LIB_VERSION" >&6; }
+ 
+ UNICODE_VERSION="4.0.1"
+ 
+@@ -591,214 +1940,804 @@
+ 
+ #AC_SUBST(CINTLTST_CPPFLAGS)
+ 
+-# Extract the first word of "gcc", so it can be a program name with args.
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++if test -n "$ac_tool_prefix"; then
++  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
++set dummy ${ac_tool_prefix}gcc; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test -n "$CC"; then
++  ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_CC="${ac_tool_prefix}gcc"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
++fi
++fi
++CC=$ac_cv_prog_CC
++if test -n "$CC"; then
++  { $as_echo "$as_me:$LINENO: result: $CC" >&5
++$as_echo "$CC" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_CC"; then
++  ac_ct_CC=$CC
++  # Extract the first word of "gcc", so it can be a program name with args.
+ set dummy gcc; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:598: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test -n "$ac_ct_CC"; then
++  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_ac_ct_CC="gcc"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_CC=$ac_cv_prog_ac_ct_CC
++if test -n "$ac_ct_CC"; then
++  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
++$as_echo "$ac_ct_CC" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++  if test "x$ac_ct_CC" = x; then
++    CC=""
++  else
++    case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++    CC=$ac_ct_CC
++  fi
++else
++  CC="$ac_cv_prog_CC"
++fi
++
++if test -z "$CC"; then
++          if test -n "$ac_tool_prefix"; then
++    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
++set dummy ${ac_tool_prefix}cc; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_prog_CC="gcc"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_CC="${ac_tool_prefix}cc"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+ fi
+ fi
+-CC="$ac_cv_prog_CC"
++CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+-  echo "$ac_t""$CC" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $CC" >&5
++$as_echo "$CC" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
++
++  fi
++fi
+ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
+ set dummy cc; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:628: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+   ac_prog_rejected=no
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+-        ac_prog_rejected=yes
+-	continue
+-      fi
+-      ac_cv_prog_CC="cc"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
++       ac_prog_rejected=yes
++       continue
++     fi
++    ac_cv_prog_CC="cc"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+ if test $ac_prog_rejected = yes; then
+   # We found a bogon in the path, so make sure we never use it.
+   set dummy $ac_cv_prog_CC
+   shift
+-  if test $# -gt 0; then
++  if test $# != 0; then
+     # We chose a different compiler from the bogus one.
+     # However, it has the same basename, so the bogon will be chosen
+     # first if we set CC to just the basename; use the full file name.
+     shift
+-    set dummy "$ac_dir/$ac_word" "$@"
+-    shift
+-    ac_cv_prog_CC="$@"
++    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+   fi
+ fi
+ fi
+ fi
+-CC="$ac_cv_prog_CC"
++CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+-  echo "$ac_t""$CC" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $CC" >&5
++$as_echo "$CC" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+-  if test -z "$CC"; then
+-    case "`uname -s`" in
+-    *win32* | *WIN32*)
+-      # Extract the first word of "cl", so it can be a program name with args.
+-set dummy cl; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:679: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++
++fi
++if test -z "$CC"; then
++  if test -n "$ac_tool_prefix"; then
++  for ac_prog in cl.exe
++  do
++    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
++set dummy $ac_tool_prefix$ac_prog; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_prog_CC="cl"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+ fi
+ fi
+-CC="$ac_cv_prog_CC"
++CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+-  echo "$ac_t""$CC" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $CC" >&5
++$as_echo "$CC" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+- ;;
+-    esac
++
++
++    test -n "$CC" && break
++  done
++fi
++if test -z "$CC"; then
++  ac_ct_CC=$CC
++  for ac_prog in cl.exe
++do
++  # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test -n "$ac_ct_CC"; then
++  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_ac_ct_CC="$ac_prog"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
+   fi
+-  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
++done
++done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_CC=$ac_cv_prog_ac_ct_CC
++if test -n "$ac_ct_CC"; then
++  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
++$as_echo "$ac_ct_CC" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+-echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+ 
+-ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
+-
+-cat > conftest.$ac_ext << EOF
+-
+-#line 722 "configure"
+-#include "confdefs.h"
+-
+-main(){return(0);}
+-EOF
+-if { (eval echo configure:727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  ac_cv_prog_cc_works=yes
+-  # If we can't run a trivial program, we are probably using a cross compiler.
+-  if (./conftest; exit) 2>/dev/null; then
+-    ac_cv_prog_cc_cross=no
++  test -n "$ac_ct_CC" && break
++done
++
++  if test "x$ac_ct_CC" = x; then
++    CC=""
+   else
+-    ac_cv_prog_cc_cross=yes
++    case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++    CC=$ac_ct_CC
+   fi
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  ac_cv_prog_cc_works=no
+ fi
+-rm -fr conftest*
+-ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
+ 
+-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+-if test $ac_cv_prog_cc_works = no; then
+-  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+ fi
+-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+-echo "configure:753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+-cross_compiling=$ac_cv_prog_cc_cross
+ 
+-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+-echo "configure:758: checking whether we are using GNU C" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.c <<EOF
+-#ifdef __GNUC__
+-  yes;
+-#endif
+-EOF
+-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:767: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+-  ac_cv_prog_gcc=yes
++
++test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++
++# Provide some information about the compiler.
++$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
++set X $ac_compile
++ac_compiler=$2
++{ (ac_try="$ac_compiler --version >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler --version >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++{ (ac_try="$ac_compiler -v >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler -v >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++{ (ac_try="$ac_compiler -V >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler -V >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++ac_clean_files_save=$ac_clean_files
++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
++# Try to create an executable without -o first, disregard a.out.
++# It will help us diagnose broken compilers, and finding out an intuition
++# of exeext.
++{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
++$as_echo_n "checking for C compiler default output file name... " >&6; }
++ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
++
++# The possible output files:
++ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
++
++ac_rmfiles=
++for ac_file in $ac_files
++do
++  case $ac_file in
++    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
++  esac
++done
++rm -f $ac_rmfiles
++
++if { (ac_try="$ac_link_default"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link_default") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; then
++  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
++# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
++# in a Makefile.  We should not override ac_cv_exeext if it was cached,
++# so that the user can short-circuit this test for compilers unknown to
++# Autoconf.
++for ac_file in $ac_files ''
++do
++  test -f "$ac_file" || continue
++  case $ac_file in
++    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
++	;;
++    [ab].out )
++	# We found the default executable, but exeext='' is most
++	# certainly right.
++	break;;
++    *.* )
++        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
++	then :; else
++	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
++	fi
++	# We set ac_cv_exeext here because the later test for it is not
++	# safe: cross compilers may not add the suffix if given an `-o'
++	# argument, so we may need to know it at that point already.
++	# Even if this section looks crufty: it has the advantage of
++	# actually working.
++	break;;
++    * )
++	break;;
++  esac
++done
++test "$ac_cv_exeext" = no && ac_cv_exeext=
++
+ else
+-  ac_cv_prog_gcc=no
++  ac_file=''
+ fi
++
++{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
++$as_echo "$ac_file" >&6; }
++if test -z "$ac_file"; then
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: C compiler cannot create executables
++See \`config.log' for more details." >&2;}
++   { (exit 77); exit 77; }; }; }
++fi
++
++ac_exeext=$ac_cv_exeext
++
++# Check that the compiler produces executables we can run.  If not, either
++# the compiler is broken, or we cross compile.
++{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
++$as_echo_n "checking whether the C compiler works... " >&6; }
++# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
++# If not cross compiling, check that we can run a simple program.
++if test "$cross_compiling" != yes; then
++  if { ac_try='./$ac_file'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
++    cross_compiling=no
++  else
++    if test "$cross_compiling" = maybe; then
++	cross_compiling=yes
++    else
++	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
++If you meant to cross compile, use \`--host'.
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: cannot run C compiled programs.
++If you meant to cross compile, use \`--host'.
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++    fi
++  fi
+ fi
++{ $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }
++
++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
++ac_clean_files=$ac_clean_files_save
++# Check that the compiler produces executables we can run.  If not, either
++# the compiler is broken, or we cross compile.
++{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
++$as_echo_n "checking whether we are cross compiling... " >&6; }
++{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
++$as_echo "$cross_compiling" >&6; }
++
++{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
++$as_echo_n "checking for suffix of executables... " >&6; }
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; then
++  # If both `conftest.exe' and `conftest' are `present' (well, observable)
++# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
++# work properly (i.e., refer to `conftest.exe'), while it won't with
++# `rm'.
++for ac_file in conftest.exe conftest conftest.*; do
++  test -f "$ac_file" || continue
++  case $ac_file in
++    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
++	  break;;
++    * ) break;;
++  esac
++done
++else
++  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++fi
++
++rm -f conftest$ac_cv_exeext
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
++$as_echo "$ac_cv_exeext" >&6; }
++
++rm -f conftest.$ac_ext
++EXEEXT=$ac_cv_exeext
++ac_exeext=$EXEEXT
++{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
++$as_echo_n "checking for suffix of object files... " >&6; }
++if test "${ac_cv_objext+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ 
+-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.o conftest.obj
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; then
++  for ac_file in conftest.o conftest.obj conftest.*; do
++  test -f "$ac_file" || continue;
++  case $ac_file in
++    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
++    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
++       break;;
++  esac
++done
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++fi
++
++rm -f conftest.$ac_cv_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
++$as_echo "$ac_cv_objext" >&6; }
++OBJEXT=$ac_cv_objext
++ac_objext=$OBJEXT
++{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
++$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
++if test "${ac_cv_c_compiler_gnu+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ 
+-if test $ac_cv_prog_gcc = yes; then
++int
++main ()
++{
++#ifndef __GNUC__
++       choke me
++#endif
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_compiler_gnu=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_compiler_gnu=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ac_cv_c_compiler_gnu=$ac_compiler_gnu
++
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
++$as_echo "$ac_cv_c_compiler_gnu" >&6; }
++if test $ac_compiler_gnu = yes; then
+   GCC=yes
+ else
+   GCC=
+ fi
++ac_test_CFLAGS=${CFLAGS+set}
++ac_save_CFLAGS=$CFLAGS
++{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
++$as_echo_n "checking whether $CC accepts -g... " >&6; }
++if test "${ac_cv_prog_cc_g+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_save_c_werror_flag=$ac_c_werror_flag
++   ac_c_werror_flag=yes
++   ac_cv_prog_cc_g=no
++   CFLAGS="-g"
++   cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_cv_prog_cc_g=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
+ 
+-ac_test_CFLAGS="${CFLAGS+set}"
+-ac_save_CFLAGS="$CFLAGS"
+-CFLAGS=
+-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+-echo "configure:786: checking whether ${CC-cc} accepts -g" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++	CFLAGS=""
++      cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
+ else
+-  echo 'void f(){}' > conftest.c
+-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_c_werror_flag=$ac_save_c_werror_flag
++	 CFLAGS="-g"
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_prog_cc_g=yes
+ else
+-  ac_cv_prog_cc_g=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+-rm -f conftest*
+ 
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++   ac_c_werror_flag=$ac_save_c_werror_flag
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
++$as_echo "$ac_cv_prog_cc_g" >&6; }
+ if test "$ac_test_CFLAGS" = set; then
+-  CFLAGS="$ac_save_CFLAGS"
++  CFLAGS=$ac_save_CFLAGS
+ elif test $ac_cv_prog_cc_g = yes; then
+   if test "$GCC" = yes; then
+     CFLAGS="-g -O2"
+@@ -812,136 +2751,481 @@
+     CFLAGS=
+   fi
+ fi
++{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
++$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
++if test "${ac_cv_prog_cc_c89+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_cv_prog_cc_c89=no
++ac_save_CC=$CC
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <stdarg.h>
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
++struct buf { int x; };
++FILE * (*rcsopen) (struct buf *, struct stat *, int);
++static char *e (p, i)
++     char **p;
++     int i;
++{
++  return p[i];
++}
++static char *f (char * (*g) (char **, int), char **p, ...)
++{
++  char *s;
++  va_list v;
++  va_start (v,p);
++  s = g (p, va_arg (v,int));
++  va_end (v);
++  return s;
++}
+ 
+-for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
++   function prototypes and stuff, but not '\xHH' hex character constants.
++   These don't provoke an error unfortunately, instead are silently treated
++   as 'x'.  The following induces an error, until -std is added to get
++   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
++   array size at least.  It's necessary to write '\x00'==0 to get something
++   that's true only with -std.  */
++int osf4_cc_array ['\x00' == 0 ? 1 : -1];
++
++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
++   inside strings and character constants.  */
++#define FOO(x) 'x'
++int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
++
++int test (int i, double x);
++struct s1 {int (*f) (int a);};
++struct s2 {int (*f) (double a);};
++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
++int argc;
++char **argv;
++int
++main ()
++{
++return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
++  ;
++  return 0;
++}
++_ACEOF
++for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
++	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+ do
+-# Extract the first word of "$ac_prog", so it can be a program name with args.
+-set dummy $ac_prog; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:822: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++  CC="$ac_save_CC $ac_arg"
++  rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_cv_prog_cc_c89=$ac_arg
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -f core conftest.err conftest.$ac_objext
++  test "x$ac_cv_prog_cc_c89" != "xno" && break
++done
++rm -f conftest.$ac_ext
++CC=$ac_save_CC
++
++fi
++# AC_CACHE_VAL
++case "x$ac_cv_prog_cc_c89" in
++  x)
++    { $as_echo "$as_me:$LINENO: result: none needed" >&5
++$as_echo "none needed" >&6; } ;;
++  xno)
++    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
++$as_echo "unsupported" >&6; } ;;
++  *)
++    CC="$CC $ac_cv_prog_cc_c89"
++    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
++$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
++esac
++
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++if test -z "$CXX"; then
++  if test -n "$CCC"; then
++    CXX=$CCC
++  else
++    if test -n "$ac_tool_prefix"; then
++  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
++  do
++    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
++set dummy $ac_tool_prefix$ac_prog; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_CXX+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CXX"; then
+   ac_cv_prog_CXX="$CXX" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_prog_CXX="$ac_prog"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+ fi
+ fi
+-CXX="$ac_cv_prog_CXX"
++CXX=$ac_cv_prog_CXX
+ if test -n "$CXX"; then
+-  echo "$ac_t""$CXX" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $CXX" >&5
++$as_echo "$CXX" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+-test -n "$CXX" && break
++
++    test -n "$CXX" && break
++  done
++fi
++if test -z "$CXX"; then
++  ac_ct_CXX=$CXX
++  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
++do
++  # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test -n "$ac_ct_CXX"; then
++  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_ac_ct_CXX="$ac_prog"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
+ done
+-test -n "$CXX" || CXX="gcc"
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
++if test -n "$ac_ct_CXX"; then
++  { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
++$as_echo "$ac_ct_CXX" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
+ 
+ 
+-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+-echo "configure:854: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
++  test -n "$ac_ct_CXX" && break
++done
+ 
+-ac_ext=C
+-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cxx_cross
+-
+-cat > conftest.$ac_ext << EOF
+-
+-#line 865 "configure"
+-#include "confdefs.h"
+-
+-int main(){return(0);}
+-EOF
+-if { (eval echo configure:870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  ac_cv_prog_cxx_works=yes
+-  # If we can't run a trivial program, we are probably using a cross compiler.
+-  if (./conftest; exit) 2>/dev/null; then
+-    ac_cv_prog_cxx_cross=no
++  if test "x$ac_ct_CXX" = x; then
++    CXX="g++"
+   else
+-    ac_cv_prog_cxx_cross=yes
++    case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++    CXX=$ac_ct_CXX
+   fi
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  ac_cv_prog_cxx_works=no
+ fi
+-rm -fr conftest*
+-ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
+ 
+-echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+-if test $ac_cv_prog_cxx_works = no; then
+-  { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
++  fi
+ fi
+-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+-echo "configure:896: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+-echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+-cross_compiling=$ac_cv_prog_cxx_cross
++# Provide some information about the compiler.
++$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5
++set X $ac_compile
++ac_compiler=$2
++{ (ac_try="$ac_compiler --version >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler --version >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++{ (ac_try="$ac_compiler -v >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler -v >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++{ (ac_try="$ac_compiler -V >&5"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compiler -V >&5") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }
++
++{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
++$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
++if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ 
+-echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+-echo "configure:901: checking whether we are using GNU C++" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.C <<EOF
+-#ifdef __GNUC__
+-  yes;
++int
++main ()
++{
++#ifndef __GNUC__
++       choke me
+ #endif
+-EOF
+-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+-  ac_cv_prog_gxx=yes
+-else
+-  ac_cv_prog_gxx=no
+-fi
+-fi
+ 
+-echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+-
+-if test $ac_cv_prog_gxx = yes; then
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_compiler_gnu=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_compiler_gnu=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
++
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
++$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
++if test $ac_compiler_gnu = yes; then
+   GXX=yes
+ else
+   GXX=
+ fi
++ac_test_CXXFLAGS=${CXXFLAGS+set}
++ac_save_CXXFLAGS=$CXXFLAGS
++{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
++$as_echo_n "checking whether $CXX accepts -g... " >&6; }
++if test "${ac_cv_prog_cxx_g+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
++   ac_cxx_werror_flag=yes
++   ac_cv_prog_cxx_g=no
++   CXXFLAGS="-g"
++   cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_cv_prog_cxx_g=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	CXXFLAGS=""
++      cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
+ 
+-ac_test_CXXFLAGS="${CXXFLAGS+set}"
+-ac_save_CXXFLAGS="$CXXFLAGS"
+-CXXFLAGS=
+-echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+-echo "configure:929: checking whether ${CXX-g++} accepts -g" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
+ else
+-  echo 'void f(){}' > conftest.cc
+-if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
++	 CXXFLAGS="-g"
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_prog_cxx_g=yes
+ else
+-  ac_cv_prog_cxx_g=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+-rm -f conftest*
+ 
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
++$as_echo "$ac_cv_prog_cxx_g" >&6; }
+ if test "$ac_test_CXXFLAGS" = set; then
+-  CXXFLAGS="$ac_save_CXXFLAGS"
++  CXXFLAGS=$ac_save_CXXFLAGS
+ elif test $ac_cv_prog_cxx_g = yes; then
+   if test "$GXX" = yes; then
+     CXXFLAGS="-g -O2"
+@@ -955,76 +3239,42 @@
+     CXXFLAGS=
+   fi
+ fi
+-
+-for ac_declaration in \
+-   ''\
+-   '#include <stdlib.h>' \
+-   'extern "C" void std::exit (int) throw (); using std::exit;' \
+-   'extern "C" void std::exit (int); using std::exit;' \
+-   'extern "C" void exit (int) throw ();' \
+-   'extern "C" void exit (int);' \
+-   'void exit (int);'
+-do
+-  cat > conftest.$ac_ext <<EOF
+-#line 970 "configure"
+-#include "confdefs.h"
+-#include <stdlib.h>
+-$ac_declaration
+-int main() {
+-exit (42);
+-; return 0; }
+-EOF
+-if { (eval echo configure:978: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  :
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  continue
+-fi
+-rm -f conftest*
+-  cat > conftest.$ac_ext <<EOF
+-#line 988 "configure"
+-#include "confdefs.h"
+-$ac_declaration
+-int main() {
+-exit (42);
+-; return 0; }
+-EOF
+-if { (eval echo configure:995: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
+-  break
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-fi
+-rm -f conftest*
+-done
+-if test -n "$ac_declaration"; then
+-  echo '#ifdef __cplusplus' >>confdefs.h
+-  echo $ac_declaration      >>confdefs.h
+-  echo '#endif'             >>confdefs.h
+-fi
+-
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ ac_aux_dir=
+-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+-  if test -f $ac_dir/install-sh; then
++for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
++  if test -f "$ac_dir/install-sh"; then
+     ac_aux_dir=$ac_dir
+     ac_install_sh="$ac_aux_dir/install-sh -c"
+     break
+-  elif test -f $ac_dir/install.sh; then
++  elif test -f "$ac_dir/install.sh"; then
+     ac_aux_dir=$ac_dir
+     ac_install_sh="$ac_aux_dir/install.sh -c"
+     break
++  elif test -f "$ac_dir/shtool"; then
++    ac_aux_dir=$ac_dir
++    ac_install_sh="$ac_aux_dir/shtool install -c"
++    break
+   fi
+ done
+ if test -z "$ac_aux_dir"; then
+-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
++  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
++$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
++   { (exit 1); exit 1; }; }
+ fi
+-ac_config_guess=$ac_aux_dir/config.guess
+-ac_config_sub=$ac_aux_dir/config.sub
+-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
++
++# These three variables are undocumented and unsupported,
++# and are intended to be withdrawn in a future Autoconf release.
++# They can cause serious problems if a builder's source tree is in a directory
++# whose full name contains unusual characters.
++ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
++ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
++ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
++
+ 
+ # Find a good install program.  We prefer a C program (faster),
+ # so one script is as good as another.  But avoid the broken or
+@@ -1033,60 +3283,89 @@
+ # SunOS /usr/etc/install
+ # IRIX /sbin/install
+ # AIX /bin/install
++# AmigaOS /C/install, which installs bootblocks on floppy discs
+ # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+ # AFS /usr/afsws/bin/install, which mishandles nonexistent args
+ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
++# OS/2's system install, which has a completely different semantic
+ # ./install, which can be erroneously created by make from ./install.sh.
+-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+-echo "configure:1042: checking for a BSD compatible install" >&5
++# Reject install programs that cannot install multiple files.
++{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
++$as_echo_n "checking for a BSD-compatible install... " >&6; }
+ if test -z "$INSTALL"; then
+-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++if test "${ac_cv_path_install+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
+-  for ac_dir in $PATH; do
+-    # Account for people who put trailing slashes in PATH elements.
+-    case "$ac_dir/" in
+-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+-    *)
+-      # OSF1 and SCO ODT 3.0 have their own names for install.
+-      # Don't use installbsd from OSF since it installs stuff as root
+-      # by default.
+-      for ac_prog in ginstall scoinst install; do
+-        if test -f $ac_dir/$ac_prog; then
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  # Account for people who put trailing slashes in PATH elements.
++case $as_dir/ in
++  ./ | .// | /cC/* | \
++  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
++  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
++  /usr/ucb/* ) ;;
++  *)
++    # OSF1 and SCO ODT 3.0 have their own names for install.
++    # Don't use installbsd from OSF since it installs stuff as root
++    # by default.
++    for ac_prog in ginstall scoinst install; do
++      for ac_exec_ext in '' $ac_executable_extensions; do
++	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ 	  if test $ac_prog = install &&
+-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
++	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ 	    # AIX install.  It has an incompatible calling convention.
+ 	    :
++	  elif test $ac_prog = install &&
++	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
++	    # program-specific install script used by HP pwplus--don't use.
++	    :
+ 	  else
+-	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+-	    break 2
++	    rm -rf conftest.one conftest.two conftest.dir
++	    echo one > conftest.one
++	    echo two > conftest.two
++	    mkdir conftest.dir
++	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
++	      test -s conftest.one && test -s conftest.two &&
++	      test -s conftest.dir/conftest.one &&
++	      test -s conftest.dir/conftest.two
++	    then
++	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
++	      break 3
++	    fi
+ 	  fi
+ 	fi
+       done
+-      ;;
+-    esac
+-  done
+-  IFS="$ac_save_IFS"
++    done
++    ;;
++esac
++
++done
++IFS=$as_save_IFS
++
++rm -rf conftest.one conftest.two conftest.dir
+ 
+ fi
+   if test "${ac_cv_path_install+set}" = set; then
+-    INSTALL="$ac_cv_path_install"
++    INSTALL=$ac_cv_path_install
+   else
+-    # As a last resort, use the slow shell script.  We don't cache a
+-    # path for INSTALL within a source directory, because that will
++    # As a last resort, use the slow shell script.  Don't cache a
++    # value for INSTALL within a source directory, because that will
+     # break other packages using the cache if that directory is
+-    # removed, or if the path is relative.
+-    INSTALL="$ac_install_sh"
++    # removed, or if the value is a relative name.
++    INSTALL=$ac_install_sh
+   fi
+ fi
+-echo "$ac_t""$INSTALL" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
++$as_echo "$INSTALL" >&6; }
+ 
+ # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+ # It thinks the first close brace ends the variable substitution.
+ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+ 
+-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+ 
+ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+ 
+@@ -1102,73 +3381,86 @@
+ #AC_CHECK_PROG(AUTOCONF, autoconf, autoconf, true)
+ # Extract the first word of "strip", so it can be a program name with args.
+ set dummy strip; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1107: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_STRIP+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$STRIP"; then
+   ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_prog_STRIP="strip"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_STRIP="strip"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+   test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP="true"
+ fi
+ fi
+-STRIP="$ac_cv_prog_STRIP"
++STRIP=$ac_cv_prog_STRIP
+ if test -n "$STRIP"; then
+-  echo "$ac_t""$STRIP" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
++$as_echo "$STRIP" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+ 
++
+ for ac_prog in gmake gnumake
+ do
+-# Extract the first word of "$ac_prog", so it can be a program name with args.
++  # Extract the first word of "$ac_prog", so it can be a program name with args.
+ set dummy $ac_prog; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1140: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_path_U_MAKE'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_U_MAKE+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  case "$U_MAKE" in
+-  /*)
++  case $U_MAKE in
++  [\\/]* | ?:[\\/]*)
+   ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a path.
+   ;;
+-  ?:/*)			 
+-  ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a dos path.
+-  ;;
+   *)
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do 
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_path_U_MAKE="$ac_dir/$ac_word"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_path_U_MAKE="$as_dir/$ac_word$ac_exec_ext"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+   ;;
+ esac
+ fi
+-U_MAKE="$ac_cv_path_U_MAKE"
++U_MAKE=$ac_cv_path_U_MAKE
+ if test -n "$U_MAKE"; then
+-  echo "$ac_t""$U_MAKE" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $U_MAKE" >&5
++$as_echo "$U_MAKE" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+-test -n "$U_MAKE" && break
++
++  test -n "$U_MAKE" && break
+ done
+ test -n "$U_MAKE" || U_MAKE="make"
+ 
+@@ -1176,182 +3468,150 @@
+ 
+ # Extract the first word of "doxygen", so it can be a program name with args.
+ set dummy doxygen; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1181: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_DOXYGEN+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  case "$DOXYGEN" in
+-  /*)
++  case $DOXYGEN in
++  [\\/]* | ?:[\\/]*)
+   ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path.
+   ;;
+-  ?:/*)			 
+-  ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a dos path.
+-  ;;
+   *)
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH:/usr/local/bin:/usr/bin"
+-  for ac_dir in $ac_dummy; do 
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_path_DOXYGEN="$ac_dir/$ac_word"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++as_dummy="$PATH:/usr/local/bin:/usr/bin"
++for as_dir in $as_dummy
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+   ;;
+ esac
+ fi
+-DOXYGEN="$ac_cv_path_DOXYGEN"
++DOXYGEN=$ac_cv_path_DOXYGEN
+ if test -n "$DOXYGEN"; then
+-  echo "$ac_t""$DOXYGEN" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $DOXYGEN" >&5
++$as_echo "$DOXYGEN" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+ 
+ 
+ # Make sure we can run config.sub.
+-if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+-else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+-fi
+-
+-echo $ac_n "checking host system type""... $ac_c" 1>&6
+-echo "configure:1221: checking host system type" >&5
+-
+-host_alias=$host
+-case "$host_alias" in
+-NONE)
+-  case $nonopt in
+-  NONE)
+-    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+-    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+-    fi ;;
+-  *) host_alias=$nonopt ;;
+-  esac ;;
++$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
++  { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
++$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
++   { (exit 1); exit 1; }; }
++
++{ $as_echo "$as_me:$LINENO: checking build system type" >&5
++$as_echo_n "checking build system type... " >&6; }
++if test "${ac_cv_build+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_build_alias=$build_alias
++test "x$ac_build_alias" = x &&
++  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
++test "x$ac_build_alias" = x &&
++  { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
++$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
++   { (exit 1); exit 1; }; }
++ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
++  { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
++$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
++   { (exit 1); exit 1; }; }
++
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
++$as_echo "$ac_cv_build" >&6; }
++case $ac_cv_build in
++*-*-*) ;;
++*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
++$as_echo "$as_me: error: invalid value of canonical build" >&2;}
++   { (exit 1); exit 1; }; };;
+ esac
+-
+-host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+-echo "$ac_t""$host" 1>&6
+-
+-echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+-echo "configure:1242: checking for Cygwin environment" >&5
+-if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 1247 "configure"
+-#include "confdefs.h"
+-
+-int main() {
+-
+-#ifndef __CYGWIN__
+-#define __CYGWIN__ __CYGWIN32__
+-#endif
+-return __CYGWIN__;
+-; return 0; }
+-EOF
+-if { (eval echo configure:1258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
+-  ac_cv_cygwin=yes
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_cygwin=no
+-fi
+-rm -f conftest*
+-rm -f conftest*
++build=$ac_cv_build
++ac_save_IFS=$IFS; IFS='-'
++set x $ac_cv_build
++shift
++build_cpu=$1
++build_vendor=$2
++shift; shift
++# Remember, the first character of IFS is used to create $*,
++# except with old shells:
++build_os=$*
++IFS=$ac_save_IFS
++case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
++
++
++{ $as_echo "$as_me:$LINENO: checking host system type" >&5
++$as_echo_n "checking host system type... " >&6; }
++if test "${ac_cv_host+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test "x$host_alias" = x; then
++  ac_cv_host=$ac_cv_build
++else
++  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
++    { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
++$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
++   { (exit 1); exit 1; }; }
+ fi
+ 
+-echo "$ac_t""$ac_cv_cygwin" 1>&6
+-CYGWIN=
+-test "$ac_cv_cygwin" = yes && CYGWIN=yes
+-echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+-echo "configure:1275: checking for mingw32 environment" >&5
+-if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 1280 "configure"
+-#include "confdefs.h"
+-
+-int main() {
+-return __MINGW32__;
+-; return 0; }
+-EOF
+-if { (eval echo configure:1287: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
+-  ac_cv_mingw32=yes
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_mingw32=no
+-fi
+-rm -f conftest*
+-rm -f conftest*
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
++$as_echo "$ac_cv_host" >&6; }
++case $ac_cv_host in
++*-*-*) ;;
++*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
++$as_echo "$as_me: error: invalid value of canonical host" >&2;}
++   { (exit 1); exit 1; }; };;
++esac
++host=$ac_cv_host
++ac_save_IFS=$IFS; IFS='-'
++set x $ac_cv_host
++shift
++host_cpu=$1
++host_vendor=$2
++shift; shift
++# Remember, the first character of IFS is used to create $*,
++# except with old shells:
++host_os=$*
++IFS=$ac_save_IFS
++case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+ 
+-echo "$ac_t""$ac_cv_mingw32" 1>&6
+-MINGW32=
+-test "$ac_cv_mingw32" = yes && MINGW32=yes
+-
+-
+-echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+-echo "configure:1306: checking for executable suffix" >&5
+-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+-  ac_cv_exeext=.exe
+-else
+-  rm -f conftest*
+-  echo 'int main () { return 0; }' > conftest.$ac_ext
+-  ac_cv_exeext=
+-  if { (eval echo configure:1316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+-    for file in conftest.*; do
+-      case $file in
+-      *.c | *.o | *.obj) ;;
+-      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+-      esac
+-    done
+-  else
+-    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+-  fi
+-  rm -f conftest*
+-  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+-fi
+-fi
+ 
+-EXEEXT=""
+-test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+-echo "$ac_t""${ac_cv_exeext}" 1>&6
+-ac_exeext=$EXEEXT
+ 
+ 
+ 
+-    echo $ac_n "checking whether strict compiling is on""... $ac_c" 1>&6
+-echo "configure:1339: checking whether strict compiling is on" >&5
+-    # Check whether --enable-strict or --disable-strict was given.
++    { $as_echo "$as_me:$LINENO: checking whether strict compiling is on" >&5
++$as_echo_n "checking whether strict compiling is on... " >&6; }
++    # Check whether --enable-strict was given.
+ if test "${enable_strict+set}" = set; then
+-  enableval="$enable_strict"
+-  
++  enableval=$enable_strict;
+         if test "$enableval" = no
+         then
+             ac_use_strict_options=no
+         else
+             ac_use_strict_options=yes
+         fi
+-      
++
+ else
+   ac_use_strict_options=no
+ fi
+ 
+-    echo "$ac_t""$ac_use_strict_options" 1>&6
++    { $as_echo "$as_me:$LINENO: result: $ac_use_strict_options" >&5
++$as_echo "$ac_use_strict_options" >&6; }
+ 
+     if test "$ac_use_strict_options" = yes
+     then
+@@ -1391,17 +3651,17 @@
+ 
+ 
+ 
+-    # Check whether --enable-64bit-libs or --disable-64bit-libs was given.
++
++    # Check whether --enable-64bit-libs was given.
+ if test "${enable_64bit_libs+set}" = set; then
+-  enableval="$enable_64bit_libs"
+-  ENABLE_64BIT_LIBS=${enableval}
++  enableval=$enable_64bit_libs; ENABLE_64BIT_LIBS=${enableval}
+ else
+   ENABLE_64BIT_LIBS=yes
+-    
++
+ fi
+ 
+-        echo $ac_n "checking for 64-bit executable support""... $ac_c" 1>&6
+-echo "configure:1405: checking for 64-bit executable support" >&5
++        { $as_echo "$as_me:$LINENO: checking for 64-bit executable support" >&5
++$as_echo_n "checking for 64-bit executable support... " >&6; }
+     if test "$ENABLE_64BIT_LIBS" = no; then
+         case "${host}" in
+         *-*-hpux*)
+@@ -1465,7 +3725,7 @@
+             fi
+             ;;
+         *-*-aix*)
+-            if test "$ac_cv_prog_gcc" = no; then
++            if test "$ac_cv_c_compiler_gnu" = no; then
+                 # Note: Have not tested 64-bitness with gcc.
+                 # Maybe the flag "-maix64" could be used with gcc?
+                 OLD_CFLAGS="${CFLAGS}"
+@@ -1477,23 +3737,50 @@
+                 if test "$cross_compiling" = yes; then
+   ENABLE_64BIT_LIBS=no
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 1482 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ int main(void) {return 0;}
+-EOF
+-if { (eval echo configure:1486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
+   ENABLE_64BIT_LIBS=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
+-  ENABLE_64BIT_LIBS=no
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ENABLE_64BIT_LIBS=no
+ fi
+-rm -fr conftest*
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
++
+                 if test "$ENABLE_64BIT_LIBS" = no; then
+                     CFLAGS="${OLD_CFLAGS}"
+                     CXXFLAGS="${OLD_CXXFLAGS}"
+@@ -1504,7 +3791,7 @@
+             fi
+             ;;
+         *-*-hpux*)
+-                        
++
+             OLD_CFLAGS="${CFLAGS}"
+             OLD_CXXFLAGS="${CXXFLAGS}"
+             CFLAGS="${CFLAGS} +DD64"
+@@ -1512,23 +3799,50 @@
+             if test "$cross_compiling" = yes; then
+   ENABLE_64BIT_LIBS=no
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 1517 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ int main(void) {return 0;}
+-EOF
+-if { (eval echo configure:1521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
+   ENABLE_64BIT_LIBS=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
+-  ENABLE_64BIT_LIBS=no
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ENABLE_64BIT_LIBS=no
+ fi
+-rm -fr conftest*
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
++
+             if test "$ENABLE_64BIT_LIBS" = no; then
+                 CFLAGS="${OLD_CFLAGS}"
+                 CXXFLAGS="${OLD_CXXFLAGS}"
+@@ -1537,23 +3851,50 @@
+                 if test "$cross_compiling" = yes; then
+   ENABLE_64BIT_LIBS=no
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 1542 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ int main(void) {return 0;}
+-EOF
+-if { (eval echo configure:1546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
+   ENABLE_64BIT_LIBS=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
+-  ENABLE_64BIT_LIBS=no
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ENABLE_64BIT_LIBS=no
+ fi
+-rm -fr conftest*
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
++
+                 if test "$ENABLE_64BIT_LIBS" = no; then
+                     CFLAGS="${OLD_CFLAGS}"
+                     CXXFLAGS="${OLD_CXXFLAGS}"
+@@ -1565,34 +3906,35 @@
+             ;;
+         esac
+     fi
+-        echo "$ac_t""$ENABLE_64BIT_LIBS" 1>&6
++        { $as_echo "$as_me:$LINENO: result: $ENABLE_64BIT_LIBS" >&5
++$as_echo "$ENABLE_64BIT_LIBS" >&6; }
+ 
+ 
+ 
+ 
+ 
+-	echo $ac_n "checking which Makefile fragment to use""... $ac_c" 1>&6
+-echo "configure:1576: checking which Makefile fragment to use" >&5
+-if eval "test \"`echo '$''{'icu_cv_host_frag'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++	{ $as_echo "$as_me:$LINENO: checking which Makefile fragment to use" >&5
++$as_echo_n "checking which Makefile fragment to use... " >&6; }
++if test "${icu_cv_host_frag+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  
++
+ case "${host}" in
+ *-*-solaris*)
+-	if test "$GCC" = yes; then	
+-		icu_cv_host_frag=mh-solaris-gcc 
++	if test "$GCC" = yes; then
++		icu_cv_host_frag=mh-solaris-gcc
+ 	else
+ 		icu_cv_host_frag=mh-solaris
+ 	fi ;;
+ alpha*-*-linux-gnu)
+ 	if test "$GCC" = yes; then
+ 		icu_cv_host_frag=mh-alpha-linux-gcc
+-	else  
++	else
+ 		icu_cv_host_frag=mh-alpha-linux-cc
+ 	fi ;;
+ *-*-linux*) icu_cv_host_frag=mh-linux ;;
+ *-*-cygwin)
+-	if test "$ac_cv_prog_gcc" = yes; then
++	if test "$ac_cv_c_compiler_gnu" = yes; then
+ 	  	icu_cv_host_frag=mh-cygwin
+ 	else
+ 	  	icu_cv_host_frag=mh-cygwin-msvc
+@@ -1629,113 +3971,169 @@
+ *-sequent-*) 	icu_cv_host_frag=mh-ptx ;;
+ *) 		icu_cv_host_frag=mh-unknown ;;
+ esac
+-		
+-	
+-fi
+ 
+-echo "$ac_t""$icu_cv_host_frag" 1>&6
++
++fi
++{ $as_echo "$as_me:$LINENO: result: $icu_cv_host_frag" >&5
++$as_echo "$icu_cv_host_frag" >&6; }
+ 
+ 
+ case "${host}" in
+-	*-*-hpux*) 	echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
+-echo "configure:1642: checking for floor in -lm" >&5
+-ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
+-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++	*-*-hpux*) 	{ $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
++$as_echo_n "checking for floor in -lm... " >&6; }
++if test "${ac_cv_lib_m_floor+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  ac_save_LIBS="$LIBS"
++  ac_check_lib_save_LIBS=$LIBS
+ LIBS="-lm  $LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 1650 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char floor();
+-
+-int main() {
+-floor()
+-; return 0; }
+-EOF
+-if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=no"
+-fi
+-rm -f conftest*
+-LIBS="$ac_save_LIBS"
+-
+-fi
+-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char floor ();
++int
++main ()
++{
++return floor ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_lib_m_floor=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_lib_m_floor=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
++$as_echo "$ac_cv_lib_m_floor" >&6; }
++if test "x$ac_cv_lib_m_floor" = x""yes; then
+   LIB_M="-lm"
+-else
+-  echo "$ac_t""no" 1>&6
+ fi
+  ;;
+-	
+-	*) 		echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
+-echo "configure:1683: checking for floor in -lm" >&5
+-ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
+-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++
++	*)
++{ $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
++$as_echo_n "checking for floor in -lm... " >&6; }
++if test "${ac_cv_lib_m_floor+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  ac_save_LIBS="$LIBS"
++  ac_check_lib_save_LIBS=$LIBS
+ LIBS="-lm  $LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 1691 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char floor();
+-
+-int main() {
+-floor()
+-; return 0; }
+-EOF
+-if { (eval echo configure:1702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=no"
+-fi
+-rm -f conftest*
+-LIBS="$ac_save_LIBS"
+-
+-fi
+-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-    ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+-  cat >> confdefs.h <<EOF
+-#define $ac_tr_lib 1
+-EOF
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char floor ();
++int
++main ()
++{
++return floor ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_lib_m_floor=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_lib_m_floor=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
++$as_echo "$ac_cv_lib_m_floor" >&6; }
++if test "x$ac_cv_lib_m_floor" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_LIBM 1
++_ACEOF
+ 
+   LIBS="-lm $LIBS"
+ 
+-else
+-  echo "$ac_t""no" 1>&6
+ fi
+- 
++
+ 			LIB_M="" ;;
+ esac
+ 
+ 
+-echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6
+-echo "configure:1734: checking whether to build shared libraries" >&5
++{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
++$as_echo_n "checking whether to build shared libraries... " >&6; }
+ enabled=no
+-# Check whether --enable-shared or --disable-shared was given.
++# Check whether --enable-shared was given.
+ if test "${enable_shared+set}" = set; then
+-  enableval="$enable_shared"
+-   case "${enableval}" in
++  enableval=$enable_shared;  case "${enableval}" in
+ 	     yes|"") enabled=yes; ENABLE_SHARED=YES ;;
+ 	     no);;
+ 	     *) ;;
+@@ -1745,162 +4143,230 @@
+ 
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6
+-echo "configure:1753: checking whether to build static libraries" >&5
++{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
++$as_echo_n "checking whether to build static libraries... " >&6; }
+ enabled=no
+-# Check whether --enable-static or --disable-static was given.
++# Check whether --enable-static was given.
+ if test "${enable_static+set}" = set; then
+-  enableval="$enable_static"
+-   case "${enableval}" in
++  enableval=$enable_static;  case "${enableval}" in
+ 	     yes|"") enabled=yes; ENABLE_STATIC=YES ;;
+ 	     no) ;;
+ 	     *) ;;
+     esac
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-echo $ac_n "checking whether to build debug libraries""... $ac_c" 1>&6
+-echo "configure:1769: checking whether to build debug libraries" >&5
++{ $as_echo "$as_me:$LINENO: checking whether to build debug libraries" >&5
++$as_echo_n "checking whether to build debug libraries... " >&6; }
+ enabled=no
+ ENABLE_DEBUG=0
+-# Check whether --enable-debug or --disable-debug was given.
++# Check whether --enable-debug was given.
+ if test "${enable_debug+set}" = set; then
+-  enableval="$enable_debug"
+-   case "${enableval}" in
++  enableval=$enable_debug;  case "${enableval}" in
+          yes|"") enabled=yes; ENABLE_DEBUG=1 ;;
+          *) ;;
+     esac
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-echo $ac_n "checking whether to build release libraries""... $ac_c" 1>&6
+-echo "configure:1785: checking whether to build release libraries" >&5
++{ $as_echo "$as_me:$LINENO: checking whether to build release libraries" >&5
++$as_echo_n "checking whether to build release libraries... " >&6; }
+ enabled=yes
+ ENABLE_RELEASE=1
+-# Check whether --enable-release or --disable-release was given.
++# Check whether --enable-release was given.
+ if test "${enable_release+set}" = set; then
+-  enableval="$enable_release"
+-   case "${enableval}" in
++  enableval=$enable_release;  case "${enableval}" in
+          no) enabled=no; ENABLE_RELEASE=0 ;;
+          *) ;;
+     esac
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-# Extract the first word of "ranlib", so it can be a program name with args.
+-set dummy ranlib; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1803: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++if test -n "$ac_tool_prefix"; then
++  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
++set dummy ${ac_tool_prefix}ranlib; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_RANLIB+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test -n "$RANLIB"; then
+   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+ else
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH"
+-  for ac_dir in $ac_dummy; do
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_prog_RANLIB="ranlib"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
+-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+ fi
+ fi
+-RANLIB="$ac_cv_prog_RANLIB"
++RANLIB=$ac_cv_prog_RANLIB
+ if test -n "$RANLIB"; then
+-  echo "$ac_t""$RANLIB" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5
++$as_echo "$RANLIB" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++fi
++if test -z "$ac_cv_prog_RANLIB"; then
++  ac_ct_RANLIB=$RANLIB
++  # Extract the first word of "ranlib", so it can be a program name with args.
++set dummy ranlib; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test -n "$ac_ct_RANLIB"; then
++  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_prog_ac_ct_RANLIB="ranlib"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
++fi
++fi
++ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
++if test -n "$ac_ct_RANLIB"; then
++  { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
++$as_echo "$ac_ct_RANLIB" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++  if test "x$ac_ct_RANLIB" = x; then
++    RANLIB=":"
++  else
++    case $cross_compiling:$ac_tool_warned in
++yes:)
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ac_tool_warned=yes ;;
++esac
++    RANLIB=$ac_ct_RANLIB
++  fi
+ else
+-  echo "$ac_t""no" 1>&6
++  RANLIB="$ac_cv_prog_RANLIB"
+ fi
+ 
+ # Extract the first word of "ar", so it can be a program name with args.
+ set dummy ar; ac_word=$2
+-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1833: checking for $ac_word" >&5
+-if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_AR+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  case "$AR" in
+-  /*)
++  case $AR in
++  [\\/]* | ?:[\\/]*)
+   ac_cv_path_AR="$AR" # Let the user override the test with a path.
+   ;;
+-  ?:/*)			 
+-  ac_cv_path_AR="$AR" # Let the user override the test with a dos path.
+-  ;;
+   *)
+-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+-  ac_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
+-  for ac_dir in $ac_dummy; do 
+-    test -z "$ac_dir" && ac_dir=.
+-    if test -f $ac_dir/$ac_word; then
+-      ac_cv_path_AR="$ac_dir/$ac_word"
+-      break
+-    fi
+-  done
+-  IFS="$ac_save_ifs"
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++as_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
++for as_dir in $as_dummy
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
+   test -z "$ac_cv_path_AR" && ac_cv_path_AR="echo archiver ar not found re-run configure ; false"
+   ;;
+ esac
+ fi
+-AR="$ac_cv_path_AR"
++AR=$ac_cv_path_AR
+ if test -n "$AR"; then
+-  echo "$ac_t""$AR" 1>&6
++  { $as_echo "$as_me:$LINENO: result: $AR" >&5
++$as_echo "$AR" >&6; }
+ else
+-  echo "$ac_t""no" 1>&6
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
+ fi
+ 
+ 
+-echo $ac_n "checking whether to enable renaming of symbols""... $ac_c" 1>&6
+-echo "configure:1868: checking whether to enable renaming of symbols" >&5
++
++{ $as_echo "$as_me:$LINENO: checking whether to enable renaming of symbols" >&5
++$as_echo_n "checking whether to enable renaming of symbols... " >&6; }
+ enabled=yes
+ U_DISABLE_RENAMING=0
+-# Check whether --enable-renaming or --disable-renaming was given.
++# Check whether --enable-renaming was given.
+ if test "${enable_renaming+set}" = set; then
+-  enableval="$enable_renaming"
+-   case "${enableval}" in
++  enableval=$enable_renaming;  case "${enableval}" in
+ 	     yes|"") enabled=yes ;;
+ 	     no) enabled=no; U_DISABLE_RENAMING=1 ;;
+ 	     *) ;;
+     esac
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-echo $ac_n "checking whether to enable function and data tracing""... $ac_c" 1>&6
+-echo "configure:1885: checking whether to enable function and data tracing" >&5
++{ $as_echo "$as_me:$LINENO: checking whether to enable function and data tracing" >&5
++$as_echo_n "checking whether to enable function and data tracing... " >&6; }
+ enabled=yes
+ U_ENABLE_TRACING=1
+-# Check whether --enable-tracing or --disable-tracing was given.
++# Check whether --enable-tracing was given.
+ if test "${enable_tracing+set}" = set; then
+-  enableval="$enable_tracing"
+-   case "${enableval}" in
++  enableval=$enable_tracing;  case "${enableval}" in
+ 	     yes|"") enabled=yes ;;
+ 	     no) enabled=no; U_ENABLE_TRACING=0 ;;
+ 	     *) ;;
+     esac
+ fi
+ 
+-echo "$ac_t""$enabled" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $enabled" >&5
++$as_echo "$enabled" >&6; }
+ 
+ 
+-# Check whether --enable-rpath or --disable-rpath was given.
++# Check whether --enable-rpath was given.
+ if test "${enable_rpath+set}" = set; then
+-  enableval="$enable_rpath"
+-   case "${enableval}" in
++  enableval=$enable_rpath;  case "${enableval}" in
+ 	     yes|"") ENABLE_RPATH=YES ;;
+ 	     no) ;;
+ 	     *) ;;
+@@ -1913,34 +4379,60 @@
+ 
+ 
+ 
+-echo $ac_n "checking for definition of U_INLINE for C""... $ac_c" 1>&6
+-echo "configure:1918: checking for definition of U_INLINE for C" >&5
+-if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking for definition of U_INLINE for C" >&5
++$as_echo_n "checking for definition of U_INLINE for C... " >&6; }
++if test "${ac_cv_c_inline+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   ac_cv_c_inline=no
+ for ac_kw in inline __inline__ __inline; do
+-  cat > conftest.$ac_ext <<EOF
+-#line 1925 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ 
+-int main() {
++int
++main ()
++{
+ } $ac_kw foo() {
+-; return 0; }
+-EOF
+-if { (eval echo configure:1932: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_c_inline=$ac_kw; break
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   done
+-  
+-fi
+ 
+-echo "$ac_t""$ac_cv_c_inline" 1>&6
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
++$as_echo "$ac_cv_c_inline" >&6; }
+ case "$ac_cv_c_inline" in
+       yes)       U_INLINE= "inline" ;;
+ 	  no )       U_INLINE= ;;
+@@ -1950,13 +4442,14 @@
+ 
+ threads=true
+ 
+-# Check whether --enable-threads or --disable-threads was given.
++# Check whether --enable-threads was given.
+ if test "${enable_threads+set}" = set; then
+-  enableval="$enable_threads"
+-  case "${enableval}" in
++  enableval=$enable_threads; case "${enableval}" in
+ 		yes) threads=true ;;
+ 		no)  threads=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-threads" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-threads" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-threads" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   threads=true
+@@ -1972,171 +4465,295 @@
+ ICU_USE_THREADS=0
+ 
+ if test $threads = true; then
+-           
+-  echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
+-echo "configure:1978: checking for pthread_attr_init in -lpthread" >&5
+-ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'`
+-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++
++
++{ $as_echo "$as_me:$LINENO: checking for pthread_attr_init in -lpthread" >&5
++$as_echo_n "checking for pthread_attr_init in -lpthread... " >&6; }
++if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  ac_save_LIBS="$LIBS"
++  ac_check_lib_save_LIBS=$LIBS
+ LIBS="-lpthread  $LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 1986 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char pthread_attr_init();
+-
+-int main() {
+-pthread_attr_init()
+-; return 0; }
+-EOF
+-if { (eval echo configure:1997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=no"
+-fi
+-rm -f conftest*
+-LIBS="$ac_save_LIBS"
+-
+-fi
+-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-    ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+-  cat >> confdefs.h <<EOF
+-#define $ac_tr_lib 1
+-EOF
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_attr_init ();
++int
++main ()
++{
++return pthread_attr_init ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_lib_pthread_pthread_attr_init=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_lib_pthread_pthread_attr_init=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_attr_init" >&5
++$as_echo "$ac_cv_lib_pthread_pthread_attr_init" >&6; }
++if test "x$ac_cv_lib_pthread_pthread_attr_init" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_LIBPTHREAD 1
++_ACEOF
+ 
+   LIBS="-lpthread $LIBS"
+ 
+-else
+-  echo "$ac_t""no" 1>&6
+ fi
+ 
+   if test $ac_cv_lib_pthread_pthread_attr_init = yes; then
+    ICU_USE_THREADS=1
+   else
+-               
+-   
+-echo $ac_n "checking for library containing pthread_mutex_destroy""... $ac_c" 1>&6
+-echo "configure:2030: checking for library containing pthread_mutex_destroy" >&5
+-if eval "test \"`echo '$''{'ac_cv_search_pthread_mutex_destroy'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++
++
++{ $as_echo "$as_me:$LINENO: checking for library containing pthread_mutex_destroy" >&5
++$as_echo_n "checking for library containing pthread_mutex_destroy... " >&6; }
++if test "${ac_cv_search_pthread_mutex_destroy+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   ac_func_search_save_LIBS="$LIBS"
+ ac_cv_search_pthread_mutex_destroy="no"
+ for i in pthread pthreads c_r ; do
+ LIBS="-l$i  $ac_func_search_save_LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 2039 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char pthread_mutex_destroy();
+-
+-int main() {
+-pthread_mutex_destroy()
+-; return 0; }
+-EOF
+-if { (eval echo configure:2050: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_mutex_destroy ();
++int
++main ()
++{
++return pthread_mutex_destroy ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_search_pthread_mutex_destroy="-l$i"
+ break
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ done
+ if test "$ac_cv_search_pthread_mutex_destroy" = "no"; then
+-cat > conftest.$ac_ext <<EOF
+-#line 2062 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char pthread_mutex_destroy();
+-
+-int main() {
+-pthread_mutex_destroy()
+-; return 0; }
+-EOF
+-if { (eval echo configure:2073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_mutex_destroy ();
++int
++main ()
++{
++return pthread_mutex_destroy ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_search_pthread_mutex_destroy="none required"
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ LIBS="$ac_func_search_save_LIBS"
+ fi
+-
+-echo "$ac_t""$ac_cv_search_pthread_mutex_destroy" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_pthread_mutex_destroy" >&5
++$as_echo "$ac_cv_search_pthread_mutex_destroy" >&6; }
+ if test "$ac_cv_search_pthread_mutex_destroy" != "no"; then
+   test "$ac_cv_search_pthread_mutex_destroy" = "none required" || LIBS="$ac_cv_search_pthread_mutex_destroy $LIBS"
+-  
++
+ else :
+-  
++
+ fi
+ 
+    if test "$ac_cv_search_pthread_mutex_destroy" != no; then
+     ICU_USE_THREADS=1
+    else
+-        echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
+-echo "configure:2097: checking for pthread_mutex_init in -lpthread" >&5
+-ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
+-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++
++{ $as_echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthread" >&5
++$as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; }
++if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  ac_save_LIBS="$LIBS"
++  ac_check_lib_save_LIBS=$LIBS
+ LIBS="-lpthread  $LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 2105 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char pthread_mutex_init();
+-
+-int main() {
+-pthread_mutex_init()
+-; return 0; }
+-EOF
+-if { (eval echo configure:2116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_lib_$ac_lib_var=no"
+-fi
+-rm -f conftest*
+-LIBS="$ac_save_LIBS"
+-
+-fi
+-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-    ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+-  cat >> confdefs.h <<EOF
+-#define $ac_tr_lib 1
+-EOF
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_mutex_init ();
++int
++main ()
++{
++return pthread_mutex_init ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_lib_pthread_pthread_mutex_init=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_lib_pthread_pthread_mutex_init=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5
++$as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; }
++if test "x$ac_cv_lib_pthread_pthread_mutex_init" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_LIBPTHREAD 1
++_ACEOF
+ 
+   LIBS="-lpthread $LIBS"
+ 
+-else
+-  echo "$ac_t""no" 1>&6
+ fi
+ 
+     if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then
+@@ -2144,53 +4761,91 @@
+     fi
+    fi
+ 
+-   echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6
+-echo "configure:2149: checking for pthread_mutex_lock" >&5
+-if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2154 "configure"
+-#include "confdefs.h"
++   { $as_echo "$as_me:$LINENO: checking for pthread_mutex_lock" >&5
++$as_echo_n "checking for pthread_mutex_lock... " >&6; }
++if test "${ac_cv_func_pthread_mutex_lock+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++/* Define pthread_mutex_lock to an innocuous variant, in case <limits.h> declares pthread_mutex_lock.
++   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
++#define pthread_mutex_lock innocuous_pthread_mutex_lock
++
+ /* System header to define __stub macros and hopefully few prototypes,
+-    which can conflict with char pthread_mutex_lock(); below.  */
+-#include <assert.h>
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char pthread_mutex_lock();
++    which can conflict with char pthread_mutex_lock (); below.
++    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++    <limits.h> exists even on freestanding compilers.  */
++
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
+ 
+-int main() {
++#undef pthread_mutex_lock
+ 
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char pthread_mutex_lock ();
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+-#if defined (__stub_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
++#if defined __stub_pthread_mutex_lock || defined __stub___pthread_mutex_lock
+ choke me
+-#else
+-pthread_mutex_lock();
+ #endif
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:2177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_func_pthread_mutex_lock=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_func_pthread_mutex_lock=no"
+-fi
+-rm -f conftest*
+-fi
+-
+-if eval "test \"`echo '$ac_cv_func_'pthread_mutex_lock`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-  :
+-else
+-  echo "$ac_t""no" 1>&6
++int
++main ()
++{
++return pthread_mutex_lock ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_func_pthread_mutex_lock=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func_pthread_mutex_lock=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_pthread_mutex_lock" >&5
++$as_echo "$ac_cv_func_pthread_mutex_lock" >&6; }
+ 
+ 
+    if test $ac_cv_func_pthread_mutex_lock = yes; then
+@@ -2198,7 +4853,7 @@
+    fi
+       case "${host}" in
+    *-pc-cygwin*|*-pc-mingw*)
+-     if test "$ac_cv_prog_gcc" = no; then
++     if test "$ac_cv_c_compiler_gnu" = no; then
+               ICU_USE_THREADS=1
+      fi ;;
+    *-*-hpux*)
+@@ -2222,37 +4877,67 @@
+ # The AC_FUNC_MMAP macro doesn't work properly.  It seems to be too specific.
+ # Do this check instead.
+ HAVE_MMAP=0
+-echo $ac_n "checking for mmap""... $ac_c" 1>&6
+-echo "configure:2227: checking for mmap" >&5
+-if eval "test \"`echo '$''{'ac_cv_func_mmap_ok'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2232 "configure"
+-#include "confdefs.h"
+-    
++{ $as_echo "$as_me:$LINENO: checking for mmap" >&5
++$as_echo_n "checking for mmap... " >&6; }
++if test "${ac_cv_func_mmap_ok+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
+ #include <unistd.h>
+ #include <sys/mman.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+-    
+-int main() {
++
++int
++main ()
++{
+     mmap((void *)0, 0, PROT_READ, 0, 0, 0);
+-; return 0; }
+-EOF
+-if { (eval echo configure:2244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_func_mmap_ok=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_func_mmap_ok=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func_mmap_ok=no
+ fi
+-rm -f conftest* 
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_func_mmap_ok" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_mmap_ok" >&5
++$as_echo "$ac_cv_func_mmap_ok" >&6; }
+ if test $ac_cv_func_mmap_ok = yes
+ then
+     HAVE_MMAP=1
+@@ -2269,124 +4954,772 @@
+ 
+ 
+ 
+-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+-echo "configure:2274: checking how to run the C preprocessor" >&5
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
++$as_echo_n "checking how to run the C preprocessor... " >&6; }
+ # On Suns, sometimes $CPP names a directory.
+ if test -n "$CPP" && test -d "$CPP"; then
+   CPP=
+ fi
+ if test -z "$CPP"; then
+-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++  if test "${ac_cv_prog_CPP+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++      # Double quotes because CPP needs to be expanded
++    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
++    do
++      ac_preproc_ok=false
++for ac_c_preproc_warn_flag in '' yes
++do
++  # Use a header file that comes with gcc, so configuring glibc
++  # with a fresh cross-compiler works.
++  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++  # <limits.h> exists even on freestanding compilers.
++  # On the NeXT, cc -E runs the code through the compiler's parser,
++  # not just through cpp. "Syntax error" is here to catch this case.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++		     Syntax error
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Broken: fails on valid input.
++continue
++fi
++
++rm -f conftest.err conftest.$ac_ext
++
++  # OK, works on sane cases.  Now check whether nonexistent headers
++  # can be detected and how.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <ac_nonexistent.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  # Broken: success on invalid input.
++continue
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Passes both tests.
++ac_preproc_ok=:
++break
++fi
++
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then
++  break
++fi
++
++    done
++    ac_cv_prog_CPP=$CPP
++
++fi
++  CPP=$ac_cv_prog_CPP
+ else
+-    # This must be in double quotes, not single quotes, because CPP may get
+-  # substituted into the Makefile and "${CC-cc}" will confuse make.
+-  CPP="${CC-cc} -E"
++  ac_cv_prog_CPP=$CPP
++fi
++{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
++$as_echo "$CPP" >&6; }
++ac_preproc_ok=false
++for ac_c_preproc_warn_flag in '' yes
++do
++  # Use a header file that comes with gcc, so configuring glibc
++  # with a fresh cross-compiler works.
++  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++  # <limits.h> exists even on freestanding compilers.
+   # On the NeXT, cc -E runs the code through the compiler's parser,
+-  # not just through cpp.
+-  cat > conftest.$ac_ext <<EOF
+-#line 2289 "configure"
+-#include "confdefs.h"
+-#include <assert.h>
+-Syntax Error
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2295: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
++  # not just through cpp. "Syntax error" is here to catch this case.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++		     Syntax error
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
+   :
+ else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  CPP="${CC-cc} -E -traditional-cpp"
+-  cat > conftest.$ac_ext <<EOF
+-#line 2306 "configure"
+-#include "confdefs.h"
+-#include <assert.h>
+-Syntax Error
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2312: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Broken: fails on valid input.
++continue
++fi
++
++rm -f conftest.err conftest.$ac_ext
++
++  # OK, works on sane cases.  Now check whether nonexistent headers
++  # can be detected and how.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <ac_nonexistent.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  # Broken: success on invalid input.
++continue
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Passes both tests.
++ac_preproc_ok=:
++break
++fi
++
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then
+   :
+ else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  CPP="${CC-cc} -nologo -E"
+-  cat > conftest.$ac_ext <<EOF
+-#line 2323 "configure"
+-#include "confdefs.h"
+-#include <assert.h>
+-Syntax Error
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2329: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
++  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++fi
++
++ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++{ $as_echo "$as_me:$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 test "${ac_cv_path_GREP+set}" = set; 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
++    ac_count=`expr $ac_count + 1`
++    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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
++$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
++   { (exit 1); exit 1; }; }
++  fi
++else
++  ac_cv_path_GREP=$GREP
++fi
++
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
++$as_echo "$ac_cv_path_GREP" >&6; }
++ GREP="$ac_cv_path_GREP"
++
++
++{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
++$as_echo_n "checking for egrep... " >&6; }
++if test "${ac_cv_path_EGREP+set}" = set; 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
++    ac_count=`expr $ac_count + 1`
++    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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
++$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
++   { (exit 1); exit 1; }; }
++  fi
++else
++  ac_cv_path_EGREP=$EGREP
++fi
++
++   fi
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
++$as_echo "$ac_cv_path_EGREP" >&6; }
++ EGREP="$ac_cv_path_EGREP"
++
++
++{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
++$as_echo_n "checking for ANSI C header files... " >&6; }
++if test "${ac_cv_header_stdc+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <stdlib.h>
++#include <stdarg.h>
++#include <string.h>
++#include <float.h>
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_cv_header_stdc=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_header_stdc=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++
++if test $ac_cv_header_stdc = yes; then
++  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <string.h>
++
++_ACEOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  $EGREP "memchr" >/dev/null 2>&1; then
+   :
+ else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  CPP=/lib/cpp
++  ac_cv_header_stdc=no
+ fi
+ rm -f conftest*
++
+ fi
+-rm -f conftest*
++
++if test $ac_cv_header_stdc = yes; then
++  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <stdlib.h>
++
++_ACEOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  $EGREP "free" >/dev/null 2>&1; then
++  :
++else
++  ac_cv_header_stdc=no
+ fi
+ rm -f conftest*
+-  ac_cv_prog_CPP="$CPP"
++
+ fi
+-  CPP="$ac_cv_prog_CPP"
++
++if test $ac_cv_header_stdc = yes; then
++  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
++  if test "$cross_compiling" = yes; then
++  :
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <ctype.h>
++#include <stdlib.h>
++#if ((' ' & 0x0FF) == 0x020)
++# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
++# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
++#else
++# define ISLOWER(c) \
++		   (('a' <= (c) && (c) <= 'i') \
++		     || ('j' <= (c) && (c) <= 'r') \
++		     || ('s' <= (c) && (c) <= 'z'))
++# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
++#endif
++
++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
++int
++main ()
++{
++  int i;
++  for (i = 0; i < 256; i++)
++    if (XOR (islower (i), ISLOWER (i))
++	|| toupper (i) != TOUPPER (i))
++      return 2;
++  return 0;
++}
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
++  :
+ else
+-  ac_cv_prog_CPP="$CPP"
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ac_cv_header_stdc=no
++fi
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
++fi
++
++
++fi
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
++$as_echo "$ac_cv_header_stdc" >&6; }
++if test $ac_cv_header_stdc = yes; then
++
++cat >>confdefs.h <<\_ACEOF
++#define STDC_HEADERS 1
++_ACEOF
++
+ fi
+-echo "$ac_t""$CPP" 1>&6
+ 
+-for ac_hdr in inttypes.h
++# On IRIX 5.3, sys/types and inttypes.h are conflicting.
++
++
++
++
++
++
++
++
++
++for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
++		  inttypes.h stdint.h unistd.h
+ do
+-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+-echo "configure:2357: checking for $ac_hdr" >&5
+-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2362 "configure"
+-#include "confdefs.h"
+-#include <$ac_hdr>
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2367: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=yes"
+-else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=no"
+-fi
+-rm -f conftest*
++as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
++$as_echo_n "checking for $ac_header... " >&6; }
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++
++#include <$ac_header>
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  eval "$as_ac_Header=yes"
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	eval "$as_ac_Header=no"
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++ac_res=`eval 'as_val=${'$as_ac_Header'}
++		 $as_echo "$as_val"'`
++	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++as_val=`eval 'as_val=${'$as_ac_Header'}
++		 $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++_ACEOF
++
+ fi
+-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+-  cat >> confdefs.h <<EOF
+-#define $ac_tr_hdr 1
+-EOF
+- 
+-else
+-  echo "$ac_t""no" 1>&6
++
++done
++
++
++
++for ac_header in inttypes.h
++do
++as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
++  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
++$as_echo_n "checking for $ac_header... " >&6; }
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
++  $as_echo_n "(cached) " >&6
++fi
++ac_res=`eval 'as_val=${'$as_ac_Header'}
++		 $as_echo "$as_val"'`
++	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++else
++  # Is the header compilable?
++{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
++$as_echo_n "checking $ac_header usability... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++#include <$ac_header>
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_header_compiler=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_header_compiler=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
++$as_echo "$ac_header_compiler" >&6; }
++
++# Is the header present?
++{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
++$as_echo_n "checking $ac_header presence... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <$ac_header>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  ac_header_preproc=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  ac_header_preproc=no
++fi
++
++rm -f conftest.err conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
++$as_echo "$ac_header_preproc" >&6; }
++
++# So?  What about this header?
++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
++  yes:no: )
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
++$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
++$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
++    ac_header_preproc=yes
++    ;;
++  no:yes:* )
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
++$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
++$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
++$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
++$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
++$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
++$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
++
++    ;;
++esac
++{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
++$as_echo_n "checking for $ac_header... " >&6; }
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
++  $as_echo_n "(cached) " >&6
++else
++  eval "$as_ac_Header=\$ac_header_preproc"
++fi
++ac_res=`eval 'as_val=${'$as_ac_Header'}
++		 $as_echo "$as_val"'`
++	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++
++fi
++as_val=`eval 'as_val=${'$as_ac_Header'}
++		 $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++_ACEOF
++
+ fi
++
+ done
+ 
+ if test $ac_cv_header_inttypes_h = no; then
+@@ -2395,7 +5728,8 @@
+  U_HAVE_INTTYPES_H=1
+ fi
+ if test "$CC" = ccc; then
+- echo "$ac_t"""C compiler set to CCC ${CC}" " 1>&6
++ { $as_echo "$as_me:$LINENO: result: \"C compiler set to CCC ${CC}\" " >&5
++$as_echo "\"C compiler set to CCC ${CC}\" " >&6; }
+  case "${host}" in
+         alpha*-*-*) U_HAVE_INTTYPES_H=0;
+  esac
+@@ -2403,15 +5737,17 @@
+ 
+ 
+ 
+-# Check whether --with-iostream or --without-iostream was given.
++
++# Check whether --with-iostream was given.
+ if test "${with_iostream+set}" = set; then
+-  withval="$with_iostream"
+-  case "${withval}" in
++  withval=$with_iostream; case "${withval}" in
+ 		none) streams=none ;;
+ 		old) streams=198506 ;;
+ 		std) streams=199711 ;;
+ 		auto) streams= ;;
+-		*) { echo "configure: error: bad value ${withval} for --with-iostream" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-iostream" >&5
++$as_echo "$as_me: error: bad value ${withval} for --with-iostream" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   streams=
+@@ -2421,13 +5757,12 @@
+ U_IOSTREAM_SOURCE=0
+ if test x$streams != xnone
+ then
+-    
+-    ac_ext=C
+-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
++
++    ac_ext=cpp
+ ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cxx_cross
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ 
+     OLD_CXXFLAGS="${CXXFLAGS}"
+     case "${icu_cv_host_frag}" in
+@@ -2435,139 +5770,481 @@
+             CXXFLAGS="${CXXFLAGS} -AA"
+         ;;
+     esac
+-    echo $ac_n "checking iostream usability""... $ac_c" 1>&6
+-echo "configure:2440: checking iostream usability" >&5
+-    cat > conftest.$ac_ext <<EOF
+-#line 2442 "configure"
+-#include "confdefs.h"
++    { $as_echo "$as_me:$LINENO: checking iostream usability" >&5
++$as_echo_n "checking iostream usability... " >&6; }
++
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #include <iostream>
+-int main() {
++int
++main ()
++{
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:2449: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_header_iostream=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_header_iostream=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_header_iostream=no
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     if test $icu_cv_host_frag = mh-cygwin-msvc
+     then
+                                 ac_cv_header_iostream=yes
+     fi
+-    echo "$ac_t""$ac_cv_header_iostream" 1>&6
++    { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream" >&5
++$as_echo "$ac_cv_header_iostream" >&6; }
+     if test $ac_cv_header_iostream = yes
+     then
+         U_IOSTREAM_SOURCE=199711
+     else
+         CXXFLAGS="${OLD_CXXFLAGS}"
+-        echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
+-echo "configure:2470: checking how to run the C++ preprocessor" >&5
++        ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
++$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+ if test -z "$CXXCPP"; then
+-if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++  if test "${ac_cv_prog_CXXCPP+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  ac_ext=C
+-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cxx_cross
+-  CXXCPP="${CXX-g++} -E"
+-  cat > conftest.$ac_ext <<EOF
+-#line 2483 "configure"
+-#include "confdefs.h"
+-#include <stdlib.h>
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
++      # Double quotes because CXXCPP needs to be expanded
++    for CXXCPP in "$CXX -E" "/lib/cpp"
++    do
++      ac_preproc_ok=false
++for ac_cxx_preproc_warn_flag in '' yes
++do
++  # Use a header file that comes with gcc, so configuring glibc
++  # with a fresh cross-compiler works.
++  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++  # <limits.h> exists even on freestanding compilers.
++  # On the NeXT, cc -E runs the code through the compiler's parser,
++  # not just through cpp. "Syntax error" is here to catch this case.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++		     Syntax error
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
+   :
+ else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  CXXCPP=/lib/cpp
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Broken: fails on valid input.
++continue
+ fi
+-rm -f conftest*
+-  ac_cv_prog_CXXCPP="$CXXCPP"
+-ac_ext=C
+-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+-ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cxx_cross
+-fi
+-fi
+-CXXCPP="$ac_cv_prog_CXXCPP"
+-echo "$ac_t""$CXXCPP" 1>&6
+-
+-ac_safe=`echo "iostream.h" | sed 'y%./+-%__p_%'`
+-echo $ac_n "checking for iostream.h""... $ac_c" 1>&6
+-echo "configure:2514: checking for iostream.h" >&5
+-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2519 "configure"
+-#include "confdefs.h"
+-#include <iostream.h>
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2524: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=yes"
+-else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=no"
++
++rm -f conftest.err conftest.$ac_ext
++
++  # OK, works on sane cases.  Now check whether nonexistent headers
++  # can be detected and how.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <ac_nonexistent.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  # Broken: success on invalid input.
++continue
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Passes both tests.
++ac_preproc_ok=:
++break
+ fi
+-rm -f conftest*
++
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then
++  break
++fi
++
++    done
++    ac_cv_prog_CXXCPP=$CXXCPP
++
++fi
++  CXXCPP=$ac_cv_prog_CXXCPP
++else
++  ac_cv_prog_CXXCPP=$CXXCPP
++fi
++{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5
++$as_echo "$CXXCPP" >&6; }
++ac_preproc_ok=false
++for ac_cxx_preproc_warn_flag in '' yes
++do
++  # Use a header file that comes with gcc, so configuring glibc
++  # with a fresh cross-compiler works.
++  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++  # <limits.h> exists even on freestanding compilers.
++  # On the NeXT, cc -E runs the code through the compiler's parser,
++  # not just through cpp. "Syntax error" is here to catch this case.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
++		     Syntax error
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Broken: fails on valid input.
++continue
++fi
++
++rm -f conftest.err conftest.$ac_ext
++
++  # OK, works on sane cases.  Now check whether nonexistent headers
++  # can be detected and how.
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <ac_nonexistent.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  # Broken: success on invalid input.
++continue
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  # Passes both tests.
++ac_preproc_ok=:
++break
+ fi
+-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
++
++rm -f conftest.err conftest.$ac_ext
++
++done
++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
++rm -f conftest.err conftest.$ac_ext
++if $ac_preproc_ok; then
+   :
+ else
+-  echo "$ac_t""no" 1>&6
++  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
++See \`config.log' for more details." >&5
++$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
++See \`config.log' for more details." >&2;}
++   { (exit 1); exit 1; }; }; }
++fi
++
++ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++
++
++if test "${ac_cv_header_iostream_h+set}" = set; then
++  { $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
++$as_echo_n "checking for iostream.h... " >&6; }
++if test "${ac_cv_header_iostream_h+set}" = set; then
++  $as_echo_n "(cached) " >&6
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
++$as_echo "$ac_cv_header_iostream_h" >&6; }
++else
++  # Is the header compilable?
++{ $as_echo "$as_me:$LINENO: checking iostream.h usability" >&5
++$as_echo_n "checking iostream.h usability... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++#include <iostream.h>
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_header_compiler=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_header_compiler=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
++$as_echo "$ac_header_compiler" >&6; }
++
++# Is the header present?
++{ $as_echo "$as_me:$LINENO: checking iostream.h presence" >&5
++$as_echo_n "checking iostream.h presence... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <iostream.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  ac_header_preproc=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  ac_header_preproc=no
++fi
++
++rm -f conftest.err conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
++$as_echo "$ac_header_preproc" >&6; }
++
++# So?  What about this header?
++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
++  yes:no: )
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&5
++$as_echo "$as_me: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the compiler's result" >&5
++$as_echo "$as_me: WARNING: iostream.h: proceeding with the compiler's result" >&2;}
++    ac_header_preproc=yes
++    ;;
++  no:yes:* )
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: present but cannot be compiled" >&5
++$as_echo "$as_me: WARNING: iostream.h: present but cannot be compiled" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     check for missing prerequisite headers?" >&5
++$as_echo "$as_me: WARNING: iostream.h:     check for missing prerequisite headers?" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: see the Autoconf documentation" >&5
++$as_echo "$as_me: WARNING: iostream.h: see the Autoconf documentation" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&5
++$as_echo "$as_me: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the preprocessor's result" >&5
++$as_echo "$as_me: WARNING: iostream.h: proceeding with the preprocessor's result" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: iostream.h: in the future, the compiler will take precedence" >&5
++$as_echo "$as_me: WARNING: iostream.h: in the future, the compiler will take precedence" >&2;}
++
++    ;;
++esac
++{ $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
++$as_echo_n "checking for iostream.h... " >&6; }
++if test "${ac_cv_header_iostream_h+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_cv_header_iostream_h=$ac_header_preproc
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
++$as_echo "$ac_cv_header_iostream_h" >&6; }
++
+ fi
+ 
++
+         if test $ac_cv_header_iostream_h = yes; then
+-            echo $ac_n "checking whether ostream is really defined""... $ac_c" 1>&6
+-echo "configure:2547: checking whether ostream is really defined" >&5
+-            if eval "test \"`echo '$''{'ac_cv_iostream_ok'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2552 "configure"
+-#include "confdefs.h"
++            { $as_echo "$as_me:$LINENO: checking whether ostream is really defined" >&5
++$as_echo_n "checking whether ostream is really defined... " >&6; }
++            if test "${ac_cv_iostream_ok+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #include <iostream.h>
+-int main() {
++int
++main ()
++{
+ ostream &testout = cout; testout << "test" << endl;
+-; return 0; }
+-EOF
+-if { (eval echo configure:2559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_iostream_ok=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_iostream_ok=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_iostream_ok=no
+ fi
+-rm -f conftest*
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ 
+-            echo "$ac_t""$ac_cv_iostream_ok" 1>&6
++            { $as_echo "$as_me:$LINENO: result: $ac_cv_iostream_ok" >&5
++$as_echo "$ac_cv_iostream_ok" >&6; }
+             if test $ac_cv_iostream_ok = yes
+             then
+                 U_IOSTREAM_SOURCE=198506
+@@ -2587,108 +6264,425 @@
+                 ;;
+             esac
+         else
+-            { echo "configure: error: ${withval} iostream is not available" 1>&2; exit 1; }
++            { { $as_echo "$as_me:$LINENO: error: ${withval} iostream is not available" >&5
++$as_echo "$as_me: error: ${withval} iostream is not available" >&2;}
++   { (exit 1); exit 1; }; }
+         fi
+     fi
+ fi
+ 
+ ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
+ 
+ 
+-echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+-echo "configure:2605: checking whether byte ordering is bigendian" >&5
+-if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++ { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
++$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
++if test "${ac_cv_c_bigendian+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   ac_cv_c_bigendian=unknown
+-# See if sys/param.h defines the BYTE_ORDER macro.
+-cat > conftest.$ac_ext <<EOF
+-#line 2612 "configure"
+-#include "confdefs.h"
++    # See if we're dealing with a universal compiler.
++    cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#ifndef __APPLE_CC__
++	       not a universal capable compiler
++	     #endif
++	     typedef int dummy;
++
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++
++	# Check for potential -arch flags.  It is not universal unless
++	# there are some -arch flags.  Note that *ppc* also matches
++	# ppc64.  This check is also rather less than ideal.
++	case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in  #(
++	  *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;;
++	esac
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    if test $ac_cv_c_bigendian = unknown; then
++      # See if sys/param.h defines the BYTE_ORDER macro.
++      cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #include <sys/types.h>
+-#include <sys/param.h>
+-int main() {
++	     #include <sys/param.h>
+ 
+-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+- bogus endian macros
+-#endif
+-; return 0; }
+-EOF
+-if { (eval echo configure:2623: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
++int
++main ()
++{
++#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
++		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
++		     && LITTLE_ENDIAN)
++	      bogus endian macros
++	     #endif
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   # It does; now see whether it defined to BIG_ENDIAN or not.
+-cat > conftest.$ac_ext <<EOF
+-#line 2627 "configure"
+-#include "confdefs.h"
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #include <sys/types.h>
+-#include <sys/param.h>
+-int main() {
++		#include <sys/param.h>
+ 
++int
++main ()
++{
+ #if BYTE_ORDER != BIG_ENDIAN
+- not big endian
+-#endif
+-; return 0; }
+-EOF
+-if { (eval echo configure:2638: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+-  rm -rf conftest*
++		 not big endian
++		#endif
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_c_bigendian=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_c_bigendian=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_c_bigendian=no
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
+-if test $ac_cv_c_bigendian = unknown; then
+-if test "$cross_compiling" = yes; then
+-    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2658 "configure"
+-#include "confdefs.h"
+-main () {
+-  /* Are we little or big endian?  From Harbison&Steele.  */
+-  union
+-  {
+-    long l;
+-    char c[sizeof (long)];
+-  } u;
+-  u.l = 1;
+-  exit (u.c[sizeof (long) - 1] == 1);
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    fi
++    if test $ac_cv_c_bigendian = unknown; then
++      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
++      cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <limits.h>
++
++int
++main ()
++{
++#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
++	      bogus endian macros
++	     #endif
++
++  ;
++  return 0;
+ }
+-EOF
+-if { (eval echo configure:2671: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
+-  ac_cv_c_bigendian=no
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  # It does; now see whether it defined to _BIG_ENDIAN or not.
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <limits.h>
++
++int
++main ()
++{
++#ifndef _BIG_ENDIAN
++		 not big endian
++		#endif
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   ac_cv_c_bigendian=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_c_bigendian=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -fr conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    fi
++    if test $ac_cv_c_bigendian = unknown; then
++      # Compile a test program.
++      if test "$cross_compiling" = yes; then
++  # Try to guess by grepping values from an object file.
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++short int ascii_mm[] =
++		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
++		short int ascii_ii[] =
++		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
++		int use_ascii (int i) {
++		  return ascii_mm[i] + ascii_ii[i];
++		}
++		short int ebcdic_ii[] =
++		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
++		short int ebcdic_mm[] =
++		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
++		int use_ebcdic (int i) {
++		  return ebcdic_mm[i] + ebcdic_ii[i];
++		}
++		extern int foo;
++
++int
++main ()
++{
++return use_ascii (foo) == use_ebcdic (foo);
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
++	      ac_cv_c_bigendian=yes
++	    fi
++	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
++	      if test "$ac_cv_c_bigendian" = unknown; then
++		ac_cv_c_bigendian=no
++	      else
++		# finding both strings is unlikely to happen, but who knows?
++		ac_cv_c_bigendian=unknown
++	      fi
++	    fi
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+ 
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++
++	     /* Are we little or big endian?  From Harbison&Steele.  */
++	     union
++	     {
++	       long int l;
++	       char c[sizeof (long int)];
++	     } u;
++	     u.l = 1;
++	     return u.c[sizeof (long int) - 1] == 1;
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
++  ac_cv_c_bigendian=no
++else
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ac_cv_c_bigendian=yes
+ fi
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+-if test $ac_cv_c_bigendian = yes; then
+-  cat >> confdefs.h <<\EOF
+-#define WORDS_BIGENDIAN 1
+-EOF
+ 
++    fi
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
++$as_echo "$ac_cv_c_bigendian" >&6; }
++ case $ac_cv_c_bigendian in #(
++   yes)
++     cat >>confdefs.h <<\_ACEOF
++#define WORDS_BIGENDIAN 1
++_ACEOF
++;; #(
++   no)
++      ;; #(
++   universal)
++
++cat >>confdefs.h <<\_ACEOF
++#define AC_APPLE_UNIVERSAL_BUILD 1
++_ACEOF
++
++     ;; #(
++   *)
++     { { $as_echo "$as_me:$LINENO: error: unknown endianness
++ presetting ac_cv_c_bigendian=no (or yes) will help" >&5
++$as_echo "$as_me: error: unknown endianness
++ presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
++   { (exit 1); exit 1; }; } ;;
++ esac
+ 
+ if test $ac_cv_c_bigendian = no; then
+ U_IS_BIG_ENDIAN=0
+@@ -2701,84 +6695,157 @@
+ 
+ U_HAVE_NL_LANGINFO_CODESET=0
+ U_NL_LANGINFO_CODESET=-1
+-echo $ac_n "checking for nl_langinfo""... $ac_c" 1>&6
+-echo "configure:2706: checking for nl_langinfo" >&5
+-if eval "test \"`echo '$''{'ac_cv_func_nl_langinfo'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2711 "configure"
+-#include "confdefs.h"
++{ $as_echo "$as_me:$LINENO: checking for nl_langinfo" >&5
++$as_echo_n "checking for nl_langinfo... " >&6; }
++if test "${ac_cv_func_nl_langinfo+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++/* Define nl_langinfo to an innocuous variant, in case <limits.h> declares nl_langinfo.
++   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
++#define nl_langinfo innocuous_nl_langinfo
++
+ /* System header to define __stub macros and hopefully few prototypes,
+-    which can conflict with char nl_langinfo(); below.  */
+-#include <assert.h>
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char nl_langinfo();
++    which can conflict with char nl_langinfo (); below.
++    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++    <limits.h> exists even on freestanding compilers.  */
+ 
+-int main() {
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
+ 
++#undef nl_langinfo
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char nl_langinfo ();
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+-#if defined (__stub_nl_langinfo) || defined (__stub___nl_langinfo)
++#if defined __stub_nl_langinfo || defined __stub___nl_langinfo
+ choke me
+-#else
+-nl_langinfo();
+ #endif
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:2734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_func_nl_langinfo=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_func_nl_langinfo=no"
+-fi
+-rm -f conftest*
+-fi
+-
+-if eval "test \"`echo '$ac_cv_func_'nl_langinfo`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
++int
++main ()
++{
++return nl_langinfo ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_func_nl_langinfo=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func_nl_langinfo=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_nl_langinfo" >&5
++$as_echo "$ac_cv_func_nl_langinfo" >&6; }
++if test "x$ac_cv_func_nl_langinfo" = x""yes; then
+   U_HAVE_NL_LANGINFO=1
+ else
+-  echo "$ac_t""no" 1>&6
+-U_HAVE_NL_LANGINFO=0
++  U_HAVE_NL_LANGINFO=0
+ fi
+ 
+ 
+ if test $U_HAVE_NL_LANGINFO -eq 1; then
+-  echo $ac_n "checking for nl_langinfo's argument to obtain the codeset""... $ac_c" 1>&6
+-echo "configure:2757: checking for nl_langinfo's argument to obtain the codeset" >&5
+-if eval "test \"`echo '$''{'ac_cv_nl_langinfo_codeset'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++  { $as_echo "$as_me:$LINENO: checking for nl_langinfo's argument to obtain the codeset" >&5
++$as_echo_n "checking for nl_langinfo's argument to obtain the codeset... " >&6; }
++if test "${ac_cv_nl_langinfo_codeset+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   ac_cv_nl_langinfo_codeset="unknown"
+   for a in CODESET _NL_CTYPE_CODESET_NAME; do
+-  cat > conftest.$ac_ext <<EOF
+-#line 2764 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #include <langinfo.h>
+-int main() {
++int
++main ()
++{
+ nl_langinfo($a);
+-; return 0; }
+-EOF
+-if { (eval echo configure:2771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_nl_langinfo_codeset="$a"; break
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+   done
+ fi
+-
+-echo "$ac_t""$ac_cv_nl_langinfo_codeset" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_nl_langinfo_codeset" >&5
++$as_echo "$ac_cv_nl_langinfo_codeset" >&6; }
+   if test x$ac_cv_nl_langinfo_codeset != xunknown
+   then
+       U_HAVE_NL_LANGINFO_CODESET=1
+@@ -2788,42 +6855,71 @@
+ 
+ 
+ 
+-ac_ext=C
+-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
++ac_ext=cpp
+ ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cxx_cross
+-
+-echo $ac_n "checking for namespace support""... $ac_c" 1>&6
+-echo "configure:2800: checking for namespace support" >&5
+-if eval "test \"`echo '$''{'ac_cv_namespace_ok'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2805 "configure"
+-#include "confdefs.h"
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++
++{ $as_echo "$as_me:$LINENO: checking for namespace support" >&5
++$as_echo_n "checking for namespace support... " >&6; }
++if test "${ac_cv_namespace_ok+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+     namespace x_version {void f(){}};
+     namespace x = x_version;
+     using namespace x_version;
+-    
+-int main() {
++
++int
++main ()
++{
+     f();
+-; return 0; }
+-EOF
+-if { (eval echo configure:2815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_namespace_ok=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_namespace_ok=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_namespace_ok=no
+ fi
+-rm -f conftest* 
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_namespace_ok" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_namespace_ok" >&5
++$as_echo "$ac_cv_namespace_ok" >&6; }
+ U_HAVE_NAMESPACE=1
+ if test $ac_cv_namespace_ok = no
+ then
+@@ -2831,16 +6927,19 @@
+ fi
+ 
+ 
+-echo $ac_n "checking for properly overriding new and delete""... $ac_c" 1>&6
+-echo "configure:2836: checking for properly overriding new and delete" >&5
++{ $as_echo "$as_me:$LINENO: checking for properly overriding new and delete" >&5
++$as_echo_n "checking for properly overriding new and delete... " >&6; }
+ U_OVERRIDE_CXX_ALLOCATION=0
+ U_HAVE_PLACEMENT_NEW=0
+-if eval "test \"`echo '$''{'ac_cv_override_cxx_allocation_ok'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++if test "${ac_cv_override_cxx_allocation_ok+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2843 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+     #include <stdlib.h>
+     class UObject {
+     void *operator new(size_t size) {return malloc(size);}
+@@ -2848,35 +6947,65 @@
+     void operator delete(void *p) {free(p);}
+     void operator delete[](void *p) {free(p);}
+     };
+-    
+-int main() {
+-    
+-; return 0; }
+-EOF
+-if { (eval echo configure:2857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_override_cxx_allocation_ok=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_override_cxx_allocation_ok=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_override_cxx_allocation_ok=no
+ fi
+-rm -f conftest* 
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ 
+-echo "$ac_t""$ac_cv_override_cxx_allocation_ok" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_override_cxx_allocation_ok" >&5
++$as_echo "$ac_cv_override_cxx_allocation_ok" >&6; }
+ if test $ac_cv_override_cxx_allocation_ok = yes
+ then
+     U_OVERRIDE_CXX_ALLOCATION=1
+-    echo $ac_n "checking for placement new and delete""... $ac_c" 1>&6
+-echo "configure:2874: checking for placement new and delete" >&5
+-    if eval "test \"`echo '$''{'ac_cv_override_placement_new_ok'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2879 "configure"
+-#include "confdefs.h"
++    { $as_echo "$as_me:$LINENO: checking for placement new and delete" >&5
++$as_echo_n "checking for placement new and delete... " >&6; }
++    if test "${ac_cv_override_placement_new_ok+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+         #include <stdlib.h>
+         class UObject {
+         void *operator new(size_t size) {return malloc(size);}
+@@ -2886,24 +7015,51 @@
+         void * operator new(size_t, void *ptr) { return ptr; }
+         void operator delete(void *, void *) {}
+         };
+-        
+-int main() {
+-        
+-; return 0; }
+-EOF
+-if { (eval echo configure:2895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_cxx_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_override_placement_new_ok=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_override_placement_new_ok=no
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_override_placement_new_ok=no
+ fi
+-rm -f conftest* 
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
+ 
+-    echo "$ac_t""$ac_cv_override_placement_new_ok" 1>&6
++    { $as_echo "$as_me:$LINENO: result: $ac_cv_override_placement_new_ok" >&5
++$as_echo "$ac_cv_override_placement_new_ok" >&6; }
+     if test $ac_cv_override_placement_new_ok = yes
+     then
+         U_HAVE_PLACEMENT_NEW=1
+@@ -2913,59 +7069,96 @@
+ 
+ 
+ ac_ext=c
+-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+-cross_compiling=$ac_cv_prog_cc_cross
+-
+-echo $ac_n "checking for popen""... $ac_c" 1>&6
+-echo "configure:2924: checking for popen" >&5
+-if eval "test \"`echo '$''{'ac_cv_func_popen'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2929 "configure"
+-#include "confdefs.h"
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++{ $as_echo "$as_me:$LINENO: checking for popen" >&5
++$as_echo_n "checking for popen... " >&6; }
++if test "${ac_cv_func_popen+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++/* Define popen to an innocuous variant, in case <limits.h> declares popen.
++   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
++#define popen innocuous_popen
++
+ /* System header to define __stub macros and hopefully few prototypes,
+-    which can conflict with char popen(); below.  */
+-#include <assert.h>
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char popen();
++    which can conflict with char popen (); below.
++    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++    <limits.h> exists even on freestanding compilers.  */
++
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
+ 
+-int main() {
++#undef popen
+ 
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char popen ();
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+-#if defined (__stub_popen) || defined (__stub___popen)
++#if defined __stub_popen || defined __stub___popen
+ choke me
+-#else
+-popen();
+ #endif
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:2952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_func_popen=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_func_popen=no"
+-fi
+-rm -f conftest*
+-fi
+-
+-if eval "test \"`echo '$ac_cv_func_'popen`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-  :
+-else
+-  echo "$ac_t""no" 1>&6
++int
++main ()
++{
++return popen ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_func_popen=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func_popen=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_popen" >&5
++$as_echo "$ac_cv_func_popen" >&6; }
+ 
+ if test x$ac_cv_func_popen = xyes
+ then
+@@ -2975,105 +7168,181 @@
+ fi
+ 
+ 
+-echo $ac_n "checking for tzset""... $ac_c" 1>&6
+-echo "configure:2980: checking for tzset" >&5
+-if eval "test \"`echo '$''{'ac_cv_func_tzset'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 2985 "configure"
+-#include "confdefs.h"
++{ $as_echo "$as_me:$LINENO: checking for tzset" >&5
++$as_echo_n "checking for tzset... " >&6; }
++if test "${ac_cv_func_tzset+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++/* Define tzset to an innocuous variant, in case <limits.h> declares tzset.
++   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
++#define tzset innocuous_tzset
++
+ /* System header to define __stub macros and hopefully few prototypes,
+-    which can conflict with char tzset(); below.  */
+-#include <assert.h>
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char tzset();
++    which can conflict with char tzset (); below.
++    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++    <limits.h> exists even on freestanding compilers.  */
+ 
+-int main() {
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
+ 
++#undef tzset
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char tzset ();
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+-#if defined (__stub_tzset) || defined (__stub___tzset)
++#if defined __stub_tzset || defined __stub___tzset
+ choke me
+-#else
+-tzset();
+ #endif
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:3008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_func_tzset=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_func_tzset=no"
+-fi
+-rm -f conftest*
+-fi
+-
+-if eval "test \"`echo '$ac_cv_func_'tzset`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-  :
+-else
+-  echo "$ac_t""no" 1>&6
++int
++main ()
++{
++return tzset ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_func_tzset=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func_tzset=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_tzset" >&5
++$as_echo "$ac_cv_func_tzset" >&6; }
+ 
+ if test x$ac_cv_func_tzset = xyes
+ then
+     U_TZSET=tzset
+ else
+-    echo $ac_n "checking for _tzset""... $ac_c" 1>&6
+-echo "configure:3032: checking for _tzset" >&5
+-if eval "test \"`echo '$''{'ac_cv_func__tzset'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3037 "configure"
+-#include "confdefs.h"
++    { $as_echo "$as_me:$LINENO: checking for _tzset" >&5
++$as_echo_n "checking for _tzset... " >&6; }
++if test "${ac_cv_func__tzset+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++/* Define _tzset to an innocuous variant, in case <limits.h> declares _tzset.
++   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
++#define _tzset innocuous__tzset
++
+ /* System header to define __stub macros and hopefully few prototypes,
+-    which can conflict with char _tzset(); below.  */
+-#include <assert.h>
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char _tzset();
++    which can conflict with char _tzset (); below.
++    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
++    <limits.h> exists even on freestanding compilers.  */
++
++#ifdef __STDC__
++# include <limits.h>
++#else
++# include <assert.h>
++#endif
+ 
+-int main() {
++#undef _tzset
+ 
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char _tzset ();
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+-#if defined (__stub__tzset) || defined (__stub____tzset)
++#if defined __stub__tzset || defined __stub____tzset
+ choke me
+-#else
+-_tzset();
+ #endif
+ 
+-; return 0; }
+-EOF
+-if { (eval echo configure:3060: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  eval "ac_cv_func__tzset=yes"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_func__tzset=no"
+-fi
+-rm -f conftest*
+-fi
+-
+-if eval "test \"`echo '$ac_cv_func_'_tzset`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-  :
+-else
+-  echo "$ac_t""no" 1>&6
++int
++main ()
++{
++return _tzset ();
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_func__tzset=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_func__tzset=no
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func__tzset" >&5
++$as_echo "$ac_cv_func__tzset" >&6; }
+ 
+     if test x$ac_cv_func__tzset = xyes
+     then
+@@ -3081,14 +7350,17 @@
+     fi
+ fi
+ 
+-echo $ac_n "checking for tzname""... $ac_c" 1>&6
+-echo "configure:3086: checking for tzname" >&5
+-if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3091 "configure"
+-#include "confdefs.h"
++{ $as_echo "$as_me:$LINENO: checking for tzname" >&5
++$as_echo_n "checking for tzname... " >&6; }
++if test "${ac_cv_var_tzname+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #ifndef __USE_POSIX
+ #define __USE_POSIX
+ #endif
+@@ -3096,68 +7368,126 @@
+ #ifndef tzname /* For SGI.  */
+ extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
+ #endif
+-int main() {
++int
++main ()
++{
+ atoi(*tzname);
+-; return 0; }
+-EOF
+-if { (eval echo configure:3104: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_var_tzname=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_var_tzname=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_var_tzname=no
+ fi
+ 
+-echo "$ac_t""$ac_cv_var_tzname" 1>&6
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
++$as_echo "$ac_cv_var_tzname" >&6; }
+ if test $ac_cv_var_tzname = yes; then
+   U_TZNAME=tzname
+ else
+-  echo $ac_n "checking for _tzname""... $ac_c" 1>&6
+-echo "configure:3121: checking for _tzname" >&5
+-if eval "test \"`echo '$''{'ac_cv_var__tzname'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3126 "configure"
+-#include "confdefs.h"
++  { $as_echo "$as_me:$LINENO: checking for _tzname" >&5
++$as_echo_n "checking for _tzname... " >&6; }
++if test "${ac_cv_var__tzname+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+   #include <time.h>
+   extern char *_tzname[];
+-  
+-int main() {
++
++int
++main ()
++{
+   atoi(*_tzname);
+-; return 0; }
+-EOF
+-if { (eval echo configure:3135: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_var__tzname=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_var__tzname=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_var__tzname=no
+ fi
+ 
+-echo "$ac_t""$ac_cv_var__tzname" 1>&6
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_var__tzname" >&5
++$as_echo "$ac_cv_var__tzname" >&6; }
+     if test $ac_cv_var__tzname = yes; then
+       U_TZNAME=_tzname
+     fi
+ fi
+ 
+ 
+-echo $ac_n "checking for timezone""... $ac_c" 1>&6
+-echo "configure:3155: checking for timezone" >&5
+-if eval "test \"`echo '$''{'ac_cv_var_timezone'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3160 "configure"
+-#include "confdefs.h"
++{ $as_echo "$as_me:$LINENO: checking for timezone" >&5
++$as_echo_n "checking for timezone... " >&6; }
++if test "${ac_cv_var_timezone+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #ifndef __USE_POSIX
+ #define __USE_POSIX
+ #endif
+@@ -3166,86 +7496,170 @@
+ #endif
+ #include <time.h>
+ 
+-int main() {
++int
++main ()
++{
+ timezone = 1;
+-; return 0; }
+-EOF
+-if { (eval echo configure:3174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_var_timezone=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_var_timezone=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_var_timezone=no
+ fi
+ 
+-echo "$ac_t""$ac_cv_var_timezone" 1>&6
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_var_timezone" >&5
++$as_echo "$ac_cv_var_timezone" >&6; }
+ U_HAVE_TIMEZONE=0
+ if test $ac_cv_var_timezone = yes; then
+   U_TIMEZONE=timezone
+   U_HAVE_TIMEZONE=1
+ else
+-  echo $ac_n "checking for __timezone""... $ac_c" 1>&6
+-echo "configure:3193: checking for __timezone" >&5
+-if eval "test \"`echo '$''{'ac_cv_var___timezone'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3198 "configure"
+-#include "confdefs.h"
++  { $as_echo "$as_me:$LINENO: checking for __timezone" >&5
++$as_echo_n "checking for __timezone... " >&6; }
++if test "${ac_cv_var___timezone+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+   #include <time.h>
+-  
+-int main() {
++
++int
++main ()
++{
+   __timezone = 1;
+-; return 0; }
+-EOF
+-if { (eval echo configure:3206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_var___timezone=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_var___timezone=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_var___timezone=no
+ fi
+ 
+-echo "$ac_t""$ac_cv_var___timezone" 1>&6
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_var___timezone" >&5
++$as_echo "$ac_cv_var___timezone" >&6; }
+   if test $ac_cv_var___timezone = yes; then
+     U_TIMEZONE=__timezone
+     U_HAVE_TIMEZONE=1
+   else
+-    echo $ac_n "checking for _timezone""... $ac_c" 1>&6
+-echo "configure:3224: checking for _timezone" >&5
+-if eval "test \"`echo '$''{'ac_cv_var__timezone'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3229 "configure"
+-#include "confdefs.h"
++    { $as_echo "$as_me:$LINENO: checking for _timezone" >&5
++$as_echo_n "checking for _timezone... " >&6; }
++if test "${ac_cv_var__timezone+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+     #include <time.h>
+-    
+-int main() {
++
++int
++main ()
++{
+     _timezone = 1;
+-; return 0; }
+-EOF
+-if { (eval echo configure:3237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
+   ac_cv_var__timezone=yes
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_var__timezone=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_var__timezone=no
+ fi
+ 
+-echo "$ac_t""$ac_cv_var__timezone" 1>&6
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_var__timezone" >&5
++$as_echo "$ac_cv_var__timezone" >&6; }
+     if test $ac_cv_var__timezone = yes; then
+       U_TIMEZONE=_timezone
+       U_HAVE_TIMEZONE=1
+@@ -3255,371 +7669,835 @@
+ 
+ 
+ 
+-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+-echo "configure:3260: checking for ANSI C header files" >&5
+-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3265 "configure"
+-#include "confdefs.h"
+-#include <stdlib.h>
+-#include <stdarg.h>
+-#include <string.h>
+-#include <float.h>
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:3273: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
+-  rm -rf conftest*
+-  ac_cv_header_stdc=yes
++{ $as_echo "$as_me:$LINENO: checking for int8_t" >&5
++$as_echo_n "checking for int8_t... " >&6; }
++if test "${ac_cv_type_int8_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  ac_cv_header_stdc=no
+-fi
+-rm -f conftest*
+-
+-if test $ac_cv_header_stdc = yes; then
+-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+-cat > conftest.$ac_ext <<EOF
+-#line 3290 "configure"
+-#include "confdefs.h"
+-#include <string.h>
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "memchr" >/dev/null 2>&1; then
++  ac_cv_type_int8_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (int8_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((int8_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
+   :
+ else
+-  rm -rf conftest*
+-  ac_cv_header_stdc=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
+ 
++	ac_cv_type_int8_t=yes
+ fi
+ 
+-if test $ac_cv_header_stdc = yes; then
+-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+-cat > conftest.$ac_ext <<EOF
+-#line 3308 "configure"
+-#include "confdefs.h"
+-#include <stdlib.h>
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "free" >/dev/null 2>&1; then
+-  :
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ else
+-  rm -rf conftest*
+-  ac_cv_header_stdc=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+ 
+-if test $ac_cv_header_stdc = yes; then
+-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+-if test "$cross_compiling" = yes; then
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5
++$as_echo "$ac_cv_type_int8_t" >&6; }
++if test "x$ac_cv_type_int8_t" = x""yes; then
+   :
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3329 "configure"
+-#include "confdefs.h"
+-#include <ctype.h>
+-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+-int main () { int i; for (i = 0; i < 256; i++)
+-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+-exit (0); }
+ 
+-EOF
+-if { (eval echo configure:3340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
+-  :
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
+-  ac_cv_header_stdc=no
+-fi
+-rm -fr conftest*
+-fi
++cat >>confdefs.h <<_ACEOF
++#define int8_t signed char
++_ACEOF
+ 
+ fi
+-fi
+ 
+-echo "$ac_t""$ac_cv_header_stdc" 1>&6
+-if test $ac_cv_header_stdc = yes; then
+-  cat >> confdefs.h <<\EOF
+-#define STDC_HEADERS 1
+-EOF
++{ $as_echo "$as_me:$LINENO: checking for uint8_t" >&5
++$as_echo_n "checking for uint8_t... " >&6; }
++if test "${ac_cv_type_uint8_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_cv_type_uint8_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (uint8_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((uint8_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
+ 
++	ac_cv_type_uint8_t=yes
+ fi
+ 
+-echo $ac_n "checking for int8_t""... $ac_c" 1>&6
+-echo "configure:3364: checking for int8_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_int8_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3369 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])int8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_int8_t=yes
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ else
+-  rm -rf conftest*
+-  ac_cv_type_int8_t=no
+-fi
+-rm -f conftest*
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
+ 
+-fi
+-echo "$ac_t""$ac_cv_type_int8_t" 1>&6
+-if test $ac_cv_type_int8_t = no; then
+-  cat >> confdefs.h <<\EOF
+-#define int8_t signed char
+-EOF
+ 
+ fi
+ 
+-echo $ac_n "checking for uint8_t""... $ac_c" 1>&6
+-echo "configure:3397: checking for uint8_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_uint8_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3402 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])uint8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_uint8_t=yes
+-else
+-  rm -rf conftest*
+-  ac_cv_type_uint8_t=no
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+-rm -f conftest*
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5
++$as_echo "$ac_cv_type_uint8_t" >&6; }
++if test "x$ac_cv_type_uint8_t" = x""yes; then
++  :
++else
+ 
+-fi
+-echo "$ac_t""$ac_cv_type_uint8_t" 1>&6
+-if test $ac_cv_type_uint8_t = no; then
+-  cat >> confdefs.h <<\EOF
++cat >>confdefs.h <<_ACEOF
+ #define uint8_t unsigned char
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for int16_t""... $ac_c" 1>&6
+-echo "configure:3430: checking for int16_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3435 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])int16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_int16_t=yes
++{ $as_echo "$as_me:$LINENO: checking for int16_t" >&5
++$as_echo_n "checking for int16_t... " >&6; }
++if test "${ac_cv_type_int16_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_int16_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (int16_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((int16_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_int16_t=yes
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+-echo "$ac_t""$ac_cv_type_int16_t" 1>&6
+-if test $ac_cv_type_int16_t = no; then
+-  cat >> confdefs.h <<\EOF
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5
++$as_echo "$ac_cv_type_int16_t" >&6; }
++if test "x$ac_cv_type_int16_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define int16_t signed short
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for uint16_t""... $ac_c" 1>&6
+-echo "configure:3463: checking for uint16_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_uint16_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3468 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])uint16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_uint16_t=yes
++{ $as_echo "$as_me:$LINENO: checking for uint16_t" >&5
++$as_echo_n "checking for uint16_t... " >&6; }
++if test "${ac_cv_type_uint16_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_uint16_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (uint16_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((uint16_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_uint16_t=yes
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+-echo "$ac_t""$ac_cv_type_uint16_t" 1>&6
+-if test $ac_cv_type_uint16_t = no; then
+-  cat >> confdefs.h <<\EOF
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5
++$as_echo "$ac_cv_type_uint16_t" >&6; }
++if test "x$ac_cv_type_uint16_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define uint16_t unsigned short
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for int32_t""... $ac_c" 1>&6
+-echo "configure:3496: checking for int32_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3501 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_int32_t=yes
++{ $as_echo "$as_me:$LINENO: checking for int32_t" >&5
++$as_echo_n "checking for int32_t... " >&6; }
++if test "${ac_cv_type_int32_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_int32_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (int32_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((int32_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_int32_t=yes
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+-echo "$ac_t""$ac_cv_type_int32_t" 1>&6
+-if test $ac_cv_type_int32_t = no; then
+-  cat >> confdefs.h <<\EOF
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
++$as_echo "$ac_cv_type_int32_t" >&6; }
++if test "x$ac_cv_type_int32_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define int32_t signed long
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for uint32_t""... $ac_c" 1>&6
+-echo "configure:3529: checking for uint32_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_uint32_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3534 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_uint32_t=yes
++{ $as_echo "$as_me:$LINENO: checking for uint32_t" >&5
++$as_echo_n "checking for uint32_t... " >&6; }
++if test "${ac_cv_type_uint32_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_uint32_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (uint32_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((uint32_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_uint32_t=yes
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+-echo "$ac_t""$ac_cv_type_uint32_t" 1>&6
+-if test $ac_cv_type_uint32_t = no; then
+-  cat >> confdefs.h <<\EOF
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
++$as_echo "$ac_cv_type_uint32_t" >&6; }
++if test "x$ac_cv_type_uint32_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define uint32_t unsigned long
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for int64_t""... $ac_c" 1>&6
+-echo "configure:3562: checking for int64_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_int64_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3567 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])int64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_int64_t=yes
++{ $as_echo "$as_me:$LINENO: checking for int64_t" >&5
++$as_echo_n "checking for int64_t... " >&6; }
++if test "${ac_cv_type_int64_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_int64_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (int64_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((int64_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_int64_t=yes
+ fi
+-rm -f conftest*
+ 
+-fi
+-echo "$ac_t""$ac_cv_type_int64_t" 1>&6
+-if test $ac_cv_type_int64_t = no; then
+-  cat >> confdefs.h <<\EOF
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5
++$as_echo "$ac_cv_type_int64_t" >&6; }
++if test "x$ac_cv_type_int64_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define int64_t signed long long
+-EOF
++_ACEOF
+ 
+ fi
+ 
+-echo $ac_n "checking for uint64_t""... $ac_c" 1>&6
+-echo "configure:3595: checking for uint64_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_type_uint64_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3600 "configure"
+-#include "confdefs.h"
+-#include <sys/types.h>
+-#if STDC_HEADERS
+-#include <stdlib.h>
+-#include <stddef.h>
+-#endif
+-EOF
+-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+-  egrep "(^|[^a-zA-Z_0-9])uint64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+-  rm -rf conftest*
+-  ac_cv_type_uint64_t=yes
++{ $as_echo "$as_me:$LINENO: checking for uint64_t" >&5
++$as_echo_n "checking for uint64_t... " >&6; }
++if test "${ac_cv_type_uint64_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  rm -rf conftest*
+   ac_cv_type_uint64_t=no
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof (uint64_t))
++       return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
++int
++main ()
++{
++if (sizeof ((uint64_t)))
++	  return 0;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  :
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_cv_type_uint64_t=yes
+ fi
+-rm -f conftest*
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
+ 
+ fi
+-echo "$ac_t""$ac_cv_type_uint64_t" 1>&6
+-if test $ac_cv_type_uint64_t = no; then
+-  cat >> confdefs.h <<\EOF
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
++$as_echo "$ac_cv_type_uint64_t" >&6; }
++if test "x$ac_cv_type_uint64_t" = x""yes; then
++  :
++else
++
++cat >>confdefs.h <<_ACEOF
+ #define uint64_t unsigned long long
+-EOF
++_ACEOF
+ 
+ fi
+ 
+@@ -3680,111 +8558,232 @@
+ fi
+ 
+ 
+-ac_safe=`echo "wchar.h" | sed 'y%./+-%__p_%'`
+-echo $ac_n "checking for wchar.h""... $ac_c" 1>&6
+-echo "configure:3686: checking for wchar.h" >&5
+-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3691 "configure"
+-#include "confdefs.h"
++if test "${ac_cv_header_wchar_h+set}" = set; then
++  { $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
++$as_echo_n "checking for wchar.h... " >&6; }
++if test "${ac_cv_header_wchar_h+set}" = set; then
++  $as_echo_n "(cached) " >&6
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
++$as_echo "$ac_cv_header_wchar_h" >&6; }
++else
++  # Is the header compilable?
++{ $as_echo "$as_me:$LINENO: checking wchar.h usability" >&5
++$as_echo_n "checking wchar.h usability... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++$ac_includes_default
+ #include <wchar.h>
+-EOF
+-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:3696: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+-if test -z "$ac_err"; then
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=yes"
+-else
+-  echo "$ac_err" >&5
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -rf conftest*
+-  eval "ac_cv_header_$ac_safe=no"
+-fi
+-rm -f conftest*
+-fi
+-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+-  echo "$ac_t""yes" 1>&6
+-  :
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_header_compiler=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++	ac_header_compiler=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
++$as_echo "$ac_header_compiler" >&6; }
++
++# Is the header present?
++{ $as_echo "$as_me:$LINENO: checking wchar.h presence" >&5
++$as_echo_n "checking wchar.h presence... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <wchar.h>
++_ACEOF
++if { (ac_try="$ac_cpp conftest.$ac_ext"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } >/dev/null && {
++	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       }; then
++  ac_header_preproc=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++  ac_header_preproc=no
++fi
++
++rm -f conftest.err conftest.$ac_ext
++{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
++$as_echo "$ac_header_preproc" >&6; }
++
++# So?  What about this header?
++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
++  yes:no: )
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&5
++$as_echo "$as_me: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the compiler's result" >&5
++$as_echo "$as_me: WARNING: wchar.h: proceeding with the compiler's result" >&2;}
++    ac_header_preproc=yes
++    ;;
++  no:yes:* )
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: present but cannot be compiled" >&5
++$as_echo "$as_me: WARNING: wchar.h: present but cannot be compiled" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     check for missing prerequisite headers?" >&5
++$as_echo "$as_me: WARNING: wchar.h:     check for missing prerequisite headers?" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: see the Autoconf documentation" >&5
++$as_echo "$as_me: WARNING: wchar.h: see the Autoconf documentation" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&5
++$as_echo "$as_me: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the preprocessor's result" >&5
++$as_echo "$as_me: WARNING: wchar.h: proceeding with the preprocessor's result" >&2;}
++    { $as_echo "$as_me:$LINENO: WARNING: wchar.h: in the future, the compiler will take precedence" >&5
++$as_echo "$as_me: WARNING: wchar.h: in the future, the compiler will take precedence" >&2;}
++
++    ;;
++esac
++{ $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
++$as_echo_n "checking for wchar.h... " >&6; }
++if test "${ac_cv_header_wchar_h+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+-  echo "$ac_t""no" 1>&6
++  ac_cv_header_wchar_h=$ac_header_preproc
+ fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
++$as_echo "$ac_cv_header_wchar_h" >&6; }
++
++fi
++
+ 
+ if test "$ac_cv_header_wchar_h" = no
+ then
+     U_HAVE_WCHAR_H=0
+     U_HAVE_WCSCPY=0
+ else
+-    cat >> confdefs.h <<\EOF
++    cat >>confdefs.h <<\_ACEOF
+ #define HAVE_WCHAR_H 1
+-EOF
++_ACEOF
+ 
+     U_HAVE_WCHAR_H=1
+-        
+-echo $ac_n "checking for library containing wcscpy""... $ac_c" 1>&6
+-echo "configure:3729: checking for library containing wcscpy" >&5
+-if eval "test \"`echo '$''{'ac_cv_search_wcscpy'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
+-else
+-  ac_func_search_save_LIBS="$LIBS"
+-ac_cv_search_wcscpy="no"
+-cat > conftest.$ac_ext <<EOF
+-#line 3736 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char wcscpy();
+-
+-int main() {
+-wcscpy()
+-; return 0; }
+-EOF
+-if { (eval echo configure:3747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  ac_cv_search_wcscpy="none required"
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++        { $as_echo "$as_me:$LINENO: checking for library containing wcscpy" >&5
++$as_echo_n "checking for library containing wcscpy... " >&6; }
++if test "${ac_cv_search_wcscpy+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  ac_func_search_save_LIBS=$LIBS
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char wcscpy ();
++int
++main ()
++{
++return wcscpy ();
++  ;
++  return 0;
++}
++_ACEOF
++for ac_lib in '' wcs w; do
++  if test -z "$ac_lib"; then
++    ac_res="none required"
++  else
++    ac_res=-l$ac_lib
++    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
++  fi
++  rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++	 test -z "$ac_c_werror_flag" ||
++	 test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++	 test "$cross_compiling" = yes ||
++	 $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_search_wcscpy=$ac_res
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
+ fi
+-rm -f conftest*
+-test "$ac_cv_search_wcscpy" = "no" && for i in wcs w; do
+-LIBS="-l$i  $ac_func_search_save_LIBS"
+-cat > conftest.$ac_ext <<EOF
+-#line 3758 "configure"
+-#include "confdefs.h"
+-/* Override any gcc2 internal prototype to avoid an error.  */
+-/* We use char because int might match the return type of a gcc2
+-    builtin and then its argument prototype would still apply.  */
+-char wcscpy();
+-
+-int main() {
+-wcscpy()
+-; return 0; }
+-EOF
+-if { (eval echo configure:3769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+-  rm -rf conftest*
+-  ac_cv_search_wcscpy="-l$i"
+-break
+-else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext
++  if test "${ac_cv_search_wcscpy+set}" = set; then
++  break
+ fi
+-rm -f conftest*
+ done
+-LIBS="$ac_func_search_save_LIBS"
++if test "${ac_cv_search_wcscpy+set}" = set; then
++  :
++else
++  ac_cv_search_wcscpy=no
+ fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_wcscpy" >&5
++$as_echo "$ac_cv_search_wcscpy" >&6; }
++ac_res=$ac_cv_search_wcscpy
++if test "$ac_res" != no; then
++  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ 
+-echo "$ac_t""$ac_cv_search_wcscpy" 1>&6
+-if test "$ac_cv_search_wcscpy" != "no"; then
+-  test "$ac_cv_search_wcscpy" = "none required" || LIBS="$ac_cv_search_wcscpy $LIBS"
+-  
+-else :
+-  
+ fi
++
+     if test "$ac_cv_search_wcscpy" != no; then
+       U_HAVE_WCSCPY=1
+     else
+@@ -3795,17 +8794,20 @@
+ 
+ 
+ ac_default_sizeof_wchar_t=4
+-echo $ac_n "checking size of wchar_t""... $ac_c" 1>&6
+-echo "configure:3800: checking size of wchar_t" >&5
+-if eval "test \"`echo '$''{'ac_cv_sizeof_wchar_t'+set}'`\" = set"; then
+-  echo $ac_n "(cached) $ac_c" 1>&6
++{ $as_echo "$as_me:$LINENO: checking size of wchar_t" >&5
++$as_echo_n "checking size of wchar_t... " >&6; }
++if test "${ac_cv_sizeof_wchar_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
+ else
+   if test "$cross_compiling" = yes; then
+   ac_cv_sizeof_wchar_t=$ac_default_sizeof_wchar_t
+ else
+-  cat > conftest.$ac_ext <<EOF
+-#line 3808 "configure"
+-#include "confdefs.h"
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
+ #if STDC_HEADERS
+ #include <stddef.h>
+ #endif
+@@ -3821,30 +8823,57 @@
+   fprintf(f, "%d\n", sizeof(wchar_t));
+   exit(0);
+ }
+-EOF
+-if { (eval echo configure:3826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+-then
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
+   ac_cv_sizeof_wchar_t=`cat conftestval`
+ else
+-  echo "configure: failed program was:" >&5
+-  cat conftest.$ac_ext >&5
+-  rm -fr conftest*
+-  ac_cv_sizeof_wchar_t=0
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++( exit $ac_status )
++ac_cv_sizeof_wchar_t=0
+ fi
+-rm -fr conftest*
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+ 
++
+ fi
+-echo "$ac_t""$ac_cv_sizeof_wchar_t" 1>&6
+-cat >> confdefs.h <<EOF
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_wchar_t" >&5
++$as_echo "$ac_cv_sizeof_wchar_t" >&6; }
++cat >>confdefs.h <<_ACEOF
+ #define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t
+-EOF
++_ACEOF
+ 
+ 
+ U_SIZEOF_WCHAR_T=$ac_cv_sizeof_wchar_t
+ if test $U_SIZEOF_WCHAR_T = 0; then
+ 	if test $U_HAVE_WCHAR_H=1; then
+-	   { echo "configure: error: There is wchar.h but the size of wchar_t is 0" 1>&2; exit 1; }
++	   { { $as_echo "$as_me:$LINENO: error: There is wchar.h but the size of wchar_t is 0" >&5
++$as_echo "$as_me: error: There is wchar.h but the size of wchar_t is 0" >&2;}
++   { (exit 1); exit 1; }; }
+ 	fi
+ fi
+ 
+@@ -3855,13 +8884,14 @@
+ #AC_SUBST(ECHO_N)
+ #AC_SUBST(ECHO_C)
+ 
+-# Check whether --enable-extras or --disable-extras was given.
++# Check whether --enable-extras was given.
+ if test "${enable_extras+set}" = set; then
+-  enableval="$enable_extras"
+-  case "${enableval}" in
++  enableval=$enable_extras; case "${enableval}" in
+ 		yes) extras=true ;;
+ 		no)  extras=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-extras" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-extras" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-extras" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   extras=true
+@@ -3873,13 +8903,14 @@
+ else
+   EXTRAS_TRUE='#'
+ fi
+-# Check whether --enable-extras or --disable-extras was given.
++# Check whether --enable-extras was given.
+ if test "${enable_extras+set}" = set; then
+-  enableval="$enable_extras"
+-  case "${enableval}" in
++  enableval=$enable_extras; case "${enableval}" in
+ 		yes) icuio=true ;;
+ 		no)  icuio=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-icuio" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-icuio" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-icuio" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   icuio=true
+@@ -3892,13 +8923,14 @@
+   ICUIO_TRUE='#'
+ fi
+ 
+-# Check whether --enable-layout or --disable-layout was given.
++# Check whether --enable-layout was given.
+ if test "${enable_layout+set}" = set; then
+-  enableval="$enable_layout"
+-  case "${enableval}" in
++  enableval=$enable_layout; case "${enableval}" in
+ 		yes) layout=true ;;
+ 		no)  layout=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-layout" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-layout" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-layout" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   layout=true
+@@ -3911,16 +8943,18 @@
+   LAYOUT_TRUE='#'
+ fi
+ 
+-# Check whether --with-data-packaging or --without-data-packaging was given.
++
++# Check whether --with-data-packaging was given.
+ if test "${with_data_packaging+set}" = set; then
+-  withval="$with_data_packaging"
+-  case "${withval}" in
++  withval=$with_data_packaging; case "${withval}" in
+                 files|archive|library) datapackaging=$withval ;;
+ 		auto) datapackaging=$withval ;;
+ 		common) datapackaging=archive ;;
+ 		dll) datapackaging=library ;;
+ 		static) datapackaging=static ;;
+-		*) { echo "configure: error: bad value ${withval} for --with-data-packaging" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-data-packaging" >&5
++$as_echo "$as_me: error: bad value ${withval} for --with-data-packaging" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   datapackaging=
+@@ -3939,13 +8973,14 @@
+ 
+ 
+ 
+-# Check whether --enable-mapped or --disable-mapped was given.
++# Check whether --enable-mapped was given.
+ if test "${enable_mapped+set}" = set; then
+-  enableval="$enable_mapped"
+-  case "${enableval}" in
++  enableval=$enable_mapped; case "${enableval}" in
+                yes) mapped=archive ;;
+                no)  mapped=library ;;
+-               *) { echo "configure: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" 1>&2; exit 1; } ;;
++               *) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 	esac
+ else
+   mapped=
+@@ -3955,14 +8990,18 @@
+ if test x"$mapped" != x; then
+     case $mapped in
+ 	archive)
+-    	    echo "configure: warning: use --with-data-packaging=archive instead of --enable-mapped" 1>&2
++    	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&5
++$as_echo "$as_me: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&2;}
+ 	    ;;
+ 	library)
+-    	    echo "configure: warning: use --with-data-packaging=library instead of --disable-mapped" 1>&2
++    	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&5
++$as_echo "$as_me: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&2;}
+ 	    ;;
+     esac
+     if test x"$datapackaging" != x -a x"$mapped" != x"$datapackaging"; then
+-	{ echo "configure: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" 1>&2; exit 1; }
++	{ { $as_echo "$as_me:$LINENO: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&5
++$as_echo "$as_me: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&2;}
++   { (exit 1); exit 1; }; }
+     fi
+     datapackaging=$mapped
+ fi
+@@ -3988,12 +9027,12 @@
+ 
+ 
+ 
+-echo $ac_n "checking for a library suffix to use""... $ac_c" 1>&6
+-echo "configure:3993: checking for a library suffix to use" >&5
+-# Check whether --with-library-suffix or --without-library-suffix was given.
++{ $as_echo "$as_me:$LINENO: checking for a library suffix to use" >&5
++$as_echo_n "checking for a library suffix to use... " >&6; }
++
++# Check whether --with-library-suffix was given.
+ if test "${with_library_suffix+set}" = set; then
+-  withval="$with_library_suffix"
+-  ICULIBSUFFIX="${withval}"
++  withval=$with_library_suffix; ICULIBSUFFIX="${withval}"
+ else
+   ICULIBSUFFIX=
+ fi
+@@ -4002,7 +9041,8 @@
+ if test "$msg" = ""; then
+     msg=none
+ fi
+-echo "$ac_t""$msg" 1>&6
++{ $as_echo "$as_me:$LINENO: result: $msg" >&5
++$as_echo "$msg" >&6; }
+ 
+ if test "$ICULIBSUFFIX" != ""
+ then
+@@ -4014,13 +9054,14 @@
+ 
+ 
+ 
+-# Check whether --enable-tests or --disable-tests was given.
++# Check whether --enable-tests was given.
+ if test "${enable_tests+set}" = set; then
+-  enableval="$enable_tests"
+-  case "${enableval}" in
++  enableval=$enable_tests; case "${enableval}" in
+ 		yes) tests=true ;;
+ 		no)  tests=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-tests" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-tests" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-tests" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   tests=true
+@@ -4033,13 +9074,14 @@
+   TESTS_TRUE='#'
+ fi
+ 
+-# Check whether --enable-samples or --disable-samples was given.
++# Check whether --enable-samples was given.
+ if test "${enable_samples+set}" = set; then
+-  enableval="$enable_samples"
+-  case "${enableval}" in
++  enableval=$enable_samples; case "${enableval}" in
+ 		yes) samples=true ;;
+ 		no)  samples=false ;;
+-		*) { echo "configure: error: bad value ${enableval} for --enable-samples" 1>&2; exit 1; } ;;
++		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-samples" >&5
++$as_echo "$as_me: error: bad value ${enableval} for --enable-samples" >&2;}
++   { (exit 1); exit 1; }; } ;;
+ 		esac
+ else
+   samples=true
+@@ -4096,7 +9138,7 @@
+ 
+ 
+ case "${host}" in
+-	*-*-hpux*) 	
++	*-*-hpux*)
+ 		if test "${icu_cv_host_frag}" = "mh-hpux-cc"; then
+ 			for file in samples/date/date \
+ 			  samples/cal/cal test/cintltst/cintltst \
+@@ -4141,517 +9183,1299 @@
+     CXXFLAGS="$CXXFLAGS \$(THREADSCXXFLAGS)"
+ fi
+ 
+-trap '' 1 2 15
+-cat > confcache <<\EOF
++ac_config_files="$ac_config_files icudefs.mk Makefile data/Makefile data/icupkg.inc common/Makefile config/Makefile.inc i18n/Makefile layout/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/scrptrun/Makefile stubdata/Makefile tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genuca/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gennames/Makefile tools/gentest/Makefile tools/gennorm/Makefile tools/genprops/Makefile tools/genpname/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/toolutil/Makefile tools/dumpce/Makefile test/Makefile test/testdata/Makefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/thaitest/Makefile test/testmap/Makefile test/letest/Makefile test/threadtest/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile common/unicode/platform.h"
++
++cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+ # tests run on this system so they can be shared between configure
+-# scripts and configure runs.  It is not useful on other systems.
+-# If it contains results you don't want to keep, you may remove or edit it.
++# scripts and configure runs, see configure's option --config-cache.
++# It is not useful on other systems.  If it contains results you don't
++# want to keep, you may remove or edit it.
+ #
+-# By default, configure uses ./config.cache as the cache file,
+-# creating it if it does not exist already.  You can give configure
+-# the --cache-file=FILE option to use a different cache file; that is
+-# what configure does when it calls configure scripts in
+-# subdirectories, so they share the cache.
+-# Giving --cache-file=/dev/null disables caching, for debugging configure.
+-# config.status only pays attention to the cache file if you give it the
+-# --recheck option to rerun configure.
++# config.status only pays attention to the cache file if you give it
++# the --recheck option to rerun configure.
+ #
+-EOF
++# `ac_cv_env_foo' variables (set or unset) will be overridden when
++# loading this file, other *unset* `ac_cv_foo' will be assigned the
++# following values.
++
++_ACEOF
++
+ # The following way of writing the cache mishandles newlines in values,
+ # but we know of no workaround that is simple, portable, and efficient.
+-# So, don't put newlines in cache variables' values.
++# So, we kill variables containing newlines.
+ # Ultrix sh set writes to stderr and can't be redirected directly,
+ # and sets the high bit in the cache file unless we assign to the vars.
+-(set) 2>&1 |
+-  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+-  *ac_space=\ *)
+-    # `set' does not quote correctly, so add quotes (double-quote substitution
+-    # turns \\\\ into \\, and sed turns \\ into \).
+-    sed -n \
+-      -e "s/'/'\\\\''/g" \
+-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+-    ;;
+-  *)
+-    # `set' quotes correctly as required by POSIX, so do not add quotes.
+-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+-    ;;
+-  esac >> confcache
+-if cmp -s $cache_file confcache; then
+-  :
+-else
+-  if test -w $cache_file; then
+-    echo "updating cache $cache_file"
+-    cat confcache > $cache_file
++(
++  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
++    eval ac_val=\$$ac_var
++    case $ac_val in #(
++    *${as_nl}*)
++      case $ac_var in #(
++      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++      esac
++      case $ac_var in #(
++      _ | IFS | as_nl) ;; #(
++      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++      *) $as_unset $ac_var ;;
++      esac ;;
++    esac
++  done
++
++  (set) 2>&1 |
++    case $as_nl`(ac_space=' '; set) 2>&1` in #(
++    *${as_nl}ac_space=\ *)
++      # `set' does not quote correctly, so add quotes (double-quote
++      # substitution turns \\\\ into \\, and sed turns \\ into \).
++      sed -n \
++	"s/'/'\\\\''/g;
++	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
++      ;; #(
++    *)
++      # `set' quotes correctly as required by POSIX, so do not add quotes.
++      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
++      ;;
++    esac |
++    sort
++) |
++  sed '
++     /^ac_cv_env_/b end
++     t clear
++     :clear
++     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
++     t end
++     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
++     :end' >>confcache
++if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
++  if test -w "$cache_file"; then
++    test "x$cache_file" != "x/dev/null" &&
++      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
++$as_echo "$as_me: updating cache $cache_file" >&6;}
++    cat confcache >$cache_file
+   else
+-    echo "not updating unwritable cache $cache_file"
++    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
++$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+   fi
+ fi
+ rm -f confcache
+ 
+-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+-
+ test "x$prefix" = xNONE && prefix=$ac_default_prefix
+ # Let make expand exec_prefix.
+ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+ 
+-# Any assignment to VPATH causes Sun make to only execute
+-# the first set of double-colon rules, so remove it if not needed.
+-# If there is a colon in the path, we need to keep it.
+-if test "x$srcdir" = x.; then
+-  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+-fi
++DEFS=-DHAVE_CONFIG_H
+ 
+-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
++ac_libobjs=
++ac_ltlibobjs=
++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
++  # 1. Remove the extension, and $U if already installed.
++  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
++  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
++  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
++  #    will be set to the directory where LIBOBJS objects are built.
++  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
++  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
++done
++LIBOBJS=$ac_libobjs
+ 
+-DEFS=-DHAVE_CONFIG_H
++LTLIBOBJS=$ac_ltlibobjs
+ 
+-# Without the "./", some shells look in PATH for config.status.
+-: ${CONFIG_STATUS=./config.status}
+ 
+-echo creating $CONFIG_STATUS
+-rm -f $CONFIG_STATUS
+-cat > $CONFIG_STATUS <<EOF
+-#! /bin/sh
+-# Generated automatically by configure.
++
++
++: ${CONFIG_STATUS=./config.status}
++ac_write_fail=0
++ac_clean_files_save=$ac_clean_files
++ac_clean_files="$ac_clean_files $CONFIG_STATUS"
++{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
++$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
++cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++#! $SHELL
++# Generated by $as_me.
+ # Run this file to recreate the current configuration.
+-# This directory was configured as follows,
+-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+-#
+-# $0 $ac_configure_args
+-#
+ # Compiler output produced by configure, useful for debugging
+-# configure, is in ./config.log if it exists.
++# configure, is in config.log if it exists.
+ 
+-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+-for ac_option
++debug=false
++ac_cs_recheck=false
++ac_cs_silent=false
++SHELL=\${CONFIG_SHELL-$SHELL}
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++## --------------------- ##
++## M4sh Initialization.  ##
++## --------------------- ##
++
++# Be more Bourne compatible
++DUALCASE=1; export DUALCASE # for MKS sh
++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++  emulate sh
++  NULLCMD=:
++  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++  # is contrary to our usage.  Disable this feature.
++  alias -g '${1+"$@"}'='"$@"'
++  setopt NO_GLOB_SUBST
++else
++  case `(set -o) 2>/dev/null` in
++  *posix*) set -o posix ;;
++esac
++
++fi
++
++
++
++
++# PATH needs CR
++# Avoid depending upon Character Ranges.
++as_cr_letters='abcdefghijklmnopqrstuvwxyz'
++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
++as_cr_Letters=$as_cr_letters$as_cr_LETTERS
++as_cr_digits='0123456789'
++as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++as_nl='
++'
++export as_nl
++# Printing a long string crashes Solaris 7 /usr/bin/printf.
++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
++if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
++  as_echo='printf %s\n'
++  as_echo_n='printf %s'
++else
++  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
++    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
++    as_echo_n='/usr/ucb/echo -n'
++  else
++    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
++    as_echo_n_body='eval
++      arg=$1;
++      case $arg in
++      *"$as_nl"*)
++	expr "X$arg" : "X\\(.*\\)$as_nl";
++	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
++      esac;
++      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
++    '
++    export as_echo_n_body
++    as_echo_n='sh -c $as_echo_n_body as_echo'
++  fi
++  export as_echo_body
++  as_echo='sh -c $as_echo_body as_echo'
++fi
++
++# The user is always right.
++if test "${PATH_SEPARATOR+set}" != set; then
++  PATH_SEPARATOR=:
++  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
++    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
++      PATH_SEPARATOR=';'
++  }
++fi
++
++# Support unset when possible.
++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
++  as_unset=unset
++else
++  as_unset=false
++fi
++
++
++# IFS
++# We need space, tab and new line, in precisely that order.  Quoting is
++# there to prevent editors from complaining about space-tab.
++# (If _AS_PATH_WALK were called with IFS unset, it would disable word
++# splitting by setting IFS to empty value.)
++IFS=" ""	$as_nl"
++
++# Find who we are.  Look in the path if we contain no directory separator.
++case $0 in
++  *[\\/]* ) as_myself=$0 ;;
++  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
+ do
+-  case "\$ac_option" in
+-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+-    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+-    exit 0 ;;
+-  -help | --help | --hel | --he | --h)
+-    echo "\$ac_cs_usage"; exit 0 ;;
+-  *) echo "\$ac_cs_usage"; exit 1 ;;
+-  esac
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
++IFS=$as_save_IFS
+ 
+-ac_given_srcdir=$srcdir
+-ac_given_INSTALL="$INSTALL"
++     ;;
++esac
++# We did not find ourselves, most probably we were run as `sh COMMAND'
++# in which case we are not to be found in the path.
++if test "x$as_myself" = x; then
++  as_myself=$0
++fi
++if test ! -f "$as_myself"; then
++  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++  { (exit 1); exit 1; }
++fi
+ 
+-trap 'rm -fr `echo "icudefs.mk \
+-		Makefile \
+-		data/Makefile data/icupkg.inc \
+-		common/Makefile config/Makefile.inc i18n/Makefile \
+-		layout/Makefile \
+-		layoutex/Makefile \
+-		io/Makefile \
+-		extra/Makefile \
+-		extra/uconv/Makefile extra/scrptrun/Makefile
+-		stubdata/Makefile \
+-		tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \
+-		tools/genrb/Makefile \
+-		tools/genuca/Makefile \
+-		tools/genccode/Makefile \
+-		tools/gencmn/Makefile \
+-		tools/gencnval/Makefile \
+-		tools/gennames/Makefile \
+-		tools/gentest/Makefile \
+-		tools/gennorm/Makefile \
+-		tools/genprops/Makefile \
+-		tools/genpname/Makefile \
+-		tools/genbrk/Makefile \
+-		tools/gensprep/Makefile \
+-		tools/icuswap/Makefile \
+-		tools/pkgdata/Makefile \
+-		tools/toolutil/Makefile \
+-		tools/dumpce/Makefile \
+-		test/Makefile test/testdata/Makefile \
+-		test/hdrtst/Makefile \
+-		test/intltest/Makefile \
+-		test/cintltst/Makefile \
+-		test/iotest/Makefile \
+-		test/thaitest/Makefile \
+-		test/testmap/Makefile \
+-		test/letest/Makefile \
+-		test/threadtest/Makefile \
+-		samples/Makefile samples/date/Makefile \
+-		samples/cal/Makefile samples/layout/Makefile \
+-		common/unicode/platform.h common/icucfg.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+-EOF
+-cat >> $CONFIG_STATUS <<EOF
+-
+-# Protect against being on the right side of a sed subst in config.status.
+-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+-$ac_vpsub
+-$extrasub
+-s%@SHELL@%$SHELL%g
+-s%@CFLAGS@%$CFLAGS%g
+-s%@CPPFLAGS@%$CPPFLAGS%g
+-s%@CXXFLAGS@%$CXXFLAGS%g
+-s%@FFLAGS@%$FFLAGS%g
+-s%@DEFS@%$DEFS%g
+-s%@LDFLAGS@%$LDFLAGS%g
+-s%@LIBS@%$LIBS%g
+-s%@exec_prefix@%$exec_prefix%g
+-s%@prefix@%$prefix%g
+-s%@program_transform_name@%$program_transform_name%g
+-s%@bindir@%$bindir%g
+-s%@sbindir@%$sbindir%g
+-s%@libexecdir@%$libexecdir%g
+-s%@datadir@%$datadir%g
+-s%@sysconfdir@%$sysconfdir%g
+-s%@sharedstatedir@%$sharedstatedir%g
+-s%@localstatedir@%$localstatedir%g
+-s%@libdir@%$libdir%g
+-s%@includedir@%$includedir%g
+-s%@oldincludedir@%$oldincludedir%g
+-s%@infodir@%$infodir%g
+-s%@mandir@%$mandir%g
+-s%@PACKAGE@%$PACKAGE%g
+-s%@VERSION@%$VERSION%g
+-s%@LIB_VERSION@%$LIB_VERSION%g
+-s%@LIB_VERSION_MAJOR@%$LIB_VERSION_MAJOR%g
+-s%@UNICODE_VERSION@%$UNICODE_VERSION%g
+-s%@CC@%$CC%g
+-s%@CXX@%$CXX%g
+-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+-s%@INSTALL_DATA@%$INSTALL_DATA%g
+-s%@STRIP@%$STRIP%g
+-s%@U_MAKE@%$U_MAKE%g
+-s%@DOXYGEN@%$DOXYGEN%g
+-s%@host@%$host%g
+-s%@host_alias@%$host_alias%g
+-s%@host_cpu@%$host_cpu%g
+-s%@host_vendor@%$host_vendor%g
+-s%@host_os@%$host_os%g
+-s%@EXEEXT@%$EXEEXT%g
+-s%@ARFLAGS@%$ARFLAGS%g
+-s%@COMPILE_LINK_ENVVAR@%$COMPILE_LINK_ENVVAR%g
+-s%@LIB_M@%$LIB_M%g
+-s%@ENABLE_SHARED@%$ENABLE_SHARED%g
+-s%@ENABLE_STATIC@%$ENABLE_STATIC%g
+-s%@ENABLE_DEBUG@%$ENABLE_DEBUG%g
+-s%@ENABLE_RELEASE@%$ENABLE_RELEASE%g
+-s%@RANLIB@%$RANLIB%g
+-s%@AR@%$AR%g
+-s%@U_DISABLE_RENAMING@%$U_DISABLE_RENAMING%g
+-s%@U_ENABLE_TRACING@%$U_ENABLE_TRACING%g
+-s%@ENABLE_RPATH@%$ENABLE_RPATH%g
+-s%@U_INLINE@%$U_INLINE%g
+-s%@THREADS_TRUE@%$THREADS_TRUE%g
+-s%@ICU_USE_THREADS@%$ICU_USE_THREADS%g
+-s%@HAVE_MMAP@%$HAVE_MMAP%g
+-s%@GENCCODE_ASSEMBLY@%$GENCCODE_ASSEMBLY%g
+-s%@CPP@%$CPP%g
+-s%@U_HAVE_INTTYPES_H@%$U_HAVE_INTTYPES_H%g
+-s%@CXXCPP@%$CXXCPP%g
+-s%@U_IOSTREAM_SOURCE@%$U_IOSTREAM_SOURCE%g
+-s%@U_IS_BIG_ENDIAN@%$U_IS_BIG_ENDIAN%g
+-s%@U_HAVE_NL_LANGINFO@%$U_HAVE_NL_LANGINFO%g
+-s%@U_HAVE_NL_LANGINFO_CODESET@%$U_HAVE_NL_LANGINFO_CODESET%g
+-s%@U_NL_LANGINFO_CODESET@%$U_NL_LANGINFO_CODESET%g
+-s%@U_HAVE_NAMESPACE@%$U_HAVE_NAMESPACE%g
+-s%@U_OVERRIDE_CXX_ALLOCATION@%$U_OVERRIDE_CXX_ALLOCATION%g
+-s%@U_HAVE_PLACEMENT_NEW@%$U_HAVE_PLACEMENT_NEW%g
+-s%@U_HAVE_POPEN@%$U_HAVE_POPEN%g
+-s%@U_TZSET@%$U_TZSET%g
+-s%@U_TZNAME@%$U_TZNAME%g
+-s%@U_HAVE_TIMEZONE@%$U_HAVE_TIMEZONE%g
+-s%@U_TIMEZONE@%$U_TIMEZONE%g
+-s%@HAVE_INT8_T@%$HAVE_INT8_T%g
+-s%@HAVE_UINT8_T@%$HAVE_UINT8_T%g
+-s%@HAVE_INT16_T@%$HAVE_INT16_T%g
+-s%@HAVE_UINT16_T@%$HAVE_UINT16_T%g
+-s%@HAVE_INT32_T@%$HAVE_INT32_T%g
+-s%@HAVE_UINT32_T@%$HAVE_UINT32_T%g
+-s%@HAVE_INT64_T@%$HAVE_INT64_T%g
+-s%@HAVE_UINT64_T@%$HAVE_UINT64_T%g
+-s%@U_HAVE_WCHAR_H@%$U_HAVE_WCHAR_H%g
+-s%@U_HAVE_WCSCPY@%$U_HAVE_WCSCPY%g
+-s%@U_SIZEOF_WCHAR_T@%$U_SIZEOF_WCHAR_T%g
+-s%@EXTRAS_TRUE@%$EXTRAS_TRUE%g
+-s%@ICUIO_TRUE@%$ICUIO_TRUE%g
+-s%@LAYOUT_TRUE@%$LAYOUT_TRUE%g
+-s%@thesysconfdir@%$thesysconfdir%g
+-s%@thedatadir@%$thedatadir%g
+-s%@thelibdir@%$thelibdir%g
+-s%@pkgicudatadir@%$pkgicudatadir%g
+-s%@thepkgicudatadir@%$thepkgicudatadir%g
+-s%@DATA_PACKAGING_CPPFLAGS@%$DATA_PACKAGING_CPPFLAGS%g
+-s%@DATA_PACKAGING_MODE@%$DATA_PACKAGING_MODE%g
+-s%@ICULIBSUFFIX@%$ICULIBSUFFIX%g
+-s%@U_HAVE_LIB_SUFFIX@%$U_HAVE_LIB_SUFFIX%g
+-s%@ICULIBSUFFIXCNAME@%$ICULIBSUFFIXCNAME%g
+-s%@TESTS_TRUE@%$TESTS_TRUE%g
+-s%@SAMPLES_TRUE@%$SAMPLES_TRUE%g
+-s%@ICUDATA_CHAR@%$ICUDATA_CHAR%g
+-s%@platform@%$platform%g
+-s%@platform_make_fragment_name@%$platform_make_fragment_name%g
+-s%@platform_make_fragment@%$platform_make_fragment%g
+-s%@ld_rpath_suf@%$ld_rpath_suf%g
+-s%@AIX_SHLIB@%$AIX_SHLIB%g
+-
+-CEOF
+-EOF
+-
+-cat >> $CONFIG_STATUS <<\EOF
+-
+-# Split the substitutions into bite-sized pieces for seds with
+-# small command number limits, like on Digital OSF/1 and HP-UX.
+-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+-ac_file=1 # Number of current file.
+-ac_beg=1 # First line for current file.
+-ac_end=$ac_max_sed_cmds # Line after last line for current file.
+-ac_more_lines=:
+-ac_sed_cmds=""
+-while $ac_more_lines; do
+-  if test $ac_beg -gt 1; then
+-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
++# Work around bugs in pre-3.0 UWIN ksh.
++for as_var in ENV MAIL MAILPATH
++do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++done
++PS1='$ '
++PS2='> '
++PS4='+ '
++
++# NLS nuisances.
++LC_ALL=C
++export LC_ALL
++LANGUAGE=C
++export LANGUAGE
++
++# Required to use basename.
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++   test "X`expr 00001 : '.*\(...\)'`" = X001; then
++  as_expr=expr
++else
++  as_expr=false
++fi
++
++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
++  as_basename=basename
++else
++  as_basename=false
++fi
++
++
++# Name of the executable.
++as_me=`$as_basename -- "$0" ||
++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++	 X"$0" : 'X\(//\)$' \| \
++	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X/"$0" |
++    sed '/^.*\/\([^/][^/]*\)\/*$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\/\(\/\/\)$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\/\(\/\).*/{
++	    s//\1/
++	    q
++	  }
++	  s/.*/./; q'`
++
++# CDPATH.
++$as_unset CDPATH
++
++
++
++  as_lineno_1=$LINENO
++  as_lineno_2=$LINENO
++  test "x$as_lineno_1" != "x$as_lineno_2" &&
++  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
++
++  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
++  # uniformly replaced by the line number.  The first 'sed' inserts a
++  # line-number line after each line using $LINENO; the second 'sed'
++  # does the real work.  The second script uses 'N' to pair each
++  # line-number line with the line containing $LINENO, and appends
++  # trailing '-' during substitution so that $LINENO is not a special
++  # case at line end.
++  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
++  # scripts with optimization help from Paolo Bonzini.  Blame Lee
++  # E. McMahon (1931-1989) for sed's syntax.  :-)
++  sed -n '
++    p
++    /[$]LINENO/=
++  ' <$as_myself |
++    sed '
++      s/[$]LINENO.*/&-/
++      t lineno
++      b
++      :lineno
++      N
++      :loop
++      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
++      t loop
++      s/-\n.*//
++    ' >$as_me.lineno &&
++  chmod +x "$as_me.lineno" ||
++    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
++   { (exit 1); exit 1; }; }
++
++  # Don't try to exec as it changes $[0], causing all sort of problems
++  # (the dirname of $[0] is not the place where we might find the
++  # original and so on.  Autoconf is especially sensitive to this).
++  . "./$as_me.lineno"
++  # Exit status is that of the last command.
++  exit
++}
++
++
++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
++  as_dirname=dirname
++else
++  as_dirname=false
++fi
++
++ECHO_C= ECHO_N= ECHO_T=
++case `echo -n x` in
++-n*)
++  case `echo 'x\c'` in
++  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
++  *)   ECHO_C='\c';;
++  esac;;
++*)
++  ECHO_N='-n';;
++esac
++if expr a : '\(a\)' >/dev/null 2>&1 &&
++   test "X`expr 00001 : '.*\(...\)'`" = X001; then
++  as_expr=expr
++else
++  as_expr=false
++fi
++
++rm -f conf$$ conf$$.exe conf$$.file
++if test -d conf$$.dir; then
++  rm -f conf$$.dir/conf$$.file
++else
++  rm -f conf$$.dir
++  mkdir conf$$.dir 2>/dev/null
++fi
++if (echo >conf$$.file) 2>/dev/null; then
++  if ln -s conf$$.file conf$$ 2>/dev/null; then
++    as_ln_s='ln -s'
++    # ... but there are two gotchas:
++    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++    # In both cases, we have to default to `cp -p'.
++    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
++      as_ln_s='cp -p'
++  elif ln conf$$.file conf$$ 2>/dev/null; then
++    as_ln_s=ln
+   else
+-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
++    as_ln_s='cp -p'
+   fi
+-  if test ! -s conftest.s$ac_file; then
+-    ac_more_lines=false
+-    rm -f conftest.s$ac_file
+-  else
+-    if test -z "$ac_sed_cmds"; then
+-      ac_sed_cmds="sed -f conftest.s$ac_file"
+-    else
+-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+-    fi
+-    ac_file=`expr $ac_file + 1`
+-    ac_beg=$ac_end
+-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+-  fi
+-done
+-if test -z "$ac_sed_cmds"; then
+-  ac_sed_cmds=cat
+-fi
+-EOF
+-
+-cat >> $CONFIG_STATUS <<EOF
+-
+-CONFIG_FILES=\${CONFIG_FILES-"icudefs.mk \
+-		Makefile \
+-		data/Makefile data/icupkg.inc \
+-		common/Makefile config/Makefile.inc i18n/Makefile \
+-		layout/Makefile \
+-		layoutex/Makefile \
+-		io/Makefile \
+-		extra/Makefile \
+-		extra/uconv/Makefile extra/scrptrun/Makefile
+-		stubdata/Makefile \
+-		tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \
+-		tools/genrb/Makefile \
+-		tools/genuca/Makefile \
+-		tools/genccode/Makefile \
+-		tools/gencmn/Makefile \
+-		tools/gencnval/Makefile \
+-		tools/gennames/Makefile \
+-		tools/gentest/Makefile \
+-		tools/gennorm/Makefile \
+-		tools/genprops/Makefile \
+-		tools/genpname/Makefile \
+-		tools/genbrk/Makefile \
+-		tools/gensprep/Makefile \
+-		tools/icuswap/Makefile \
+-		tools/pkgdata/Makefile \
+-		tools/toolutil/Makefile \
+-		tools/dumpce/Makefile \
+-		test/Makefile test/testdata/Makefile \
+-		test/hdrtst/Makefile \
+-		test/intltest/Makefile \
+-		test/cintltst/Makefile \
+-		test/iotest/Makefile \
+-		test/thaitest/Makefile \
+-		test/testmap/Makefile \
+-		test/letest/Makefile \
+-		test/threadtest/Makefile \
+-		samples/Makefile samples/date/Makefile \
+-		samples/cal/Makefile samples/layout/Makefile \
+-		common/unicode/platform.h"}
+-EOF
+-cat >> $CONFIG_STATUS <<\EOF
+-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+-  case "$ac_file" in
+-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+-  *) ac_file_in="${ac_file}.in" ;;
+-  esac
++else
++  as_ln_s='cp -p'
++fi
++rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
++rmdir conf$$.dir 2>/dev/null
+ 
+-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
++if mkdir -p . 2>/dev/null; then
++  as_mkdir_p=:
++else
++  test -d ./-p && rmdir ./-p
++  as_mkdir_p=false
++fi
+ 
+-  # Remove last slash and all that follows it.  Not all systems have dirname.
+-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+-    # The file is in a subdirectory.
+-    test ! -d "$ac_dir" && mkdir "$ac_dir"
+-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+-    # A "../" for each directory in $ac_dir_suffix.
+-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
++if test -x / >/dev/null 2>&1; then
++  as_test_x='test -x'
++else
++  if ls -dL / >/dev/null 2>&1; then
++    as_ls_L_option=L
+   else
+-    ac_dir_suffix= ac_dots=
++    as_ls_L_option=
+   fi
++  as_test_x='
++    eval sh -c '\''
++      if test -d "$1"; then
++	test -d "$1/.";
++      else
++	case $1 in
++	-*)set "./$1";;
++	esac;
++	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
++	???[sx]*):;;*)false;;esac;fi
++    '\'' sh
++  '
++fi
++as_executable_p=$as_test_x
++
++# Sed expression to map a string onto a valid CPP name.
++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
++
++# Sed expression to map a string onto a valid variable name.
++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
++
++
++exec 6>&1
++
++# Save the log message, to keep $[0] and so on meaningful, and to
++# report actual input values of CONFIG_FILES etc. instead of their
++# values after options handling.
++ac_log="
++This file was extended by $as_me, which was
++generated by GNU Autoconf 2.63.  Invocation command line was
++
++  CONFIG_FILES    = $CONFIG_FILES
++  CONFIG_HEADERS  = $CONFIG_HEADERS
++  CONFIG_LINKS    = $CONFIG_LINKS
++  CONFIG_COMMANDS = $CONFIG_COMMANDS
++  $ $0 $@
+ 
+-  case "$ac_given_srcdir" in
+-  .)  srcdir=.
+-      if test -z "$ac_dots"; then top_srcdir=.
+-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+-  *) # Relative path.
+-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+-  esac
++on `(hostname || uname -n) 2>/dev/null | sed 1q`
++"
++
++_ACEOF
++
++case $ac_config_files in *"
++"*) set x $ac_config_files; shift; ac_config_files=$*;;
++esac
++
++case $ac_config_headers in *"
++"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
++esac
+ 
+-  case "$ac_given_INSTALL" in
+-  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+-  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+-  esac
+ 
+-  echo creating "$ac_file"
+-  rm -f "$ac_file"
+-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+-  case "$ac_file" in
+-  *Makefile*) ac_comsub="1i\\
+-# $configure_input" ;;
+-  *) ac_comsub= ;;
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++# Files that config.status was made for.
++config_files="$ac_config_files"
++config_headers="$ac_config_headers"
++
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ac_cs_usage="\
++\`$as_me' instantiates files from templates according to the
++current configuration.
++
++Usage: $0 [OPTION]... [FILE]...
++
++  -h, --help       print this help, then exit
++  -V, --version    print version number and configuration settings, then exit
++  -q, --quiet, --silent
++                   do not print progress messages
++  -d, --debug      don't remove temporary files
++      --recheck    update $as_me by reconfiguring in the same conditions
++      --file=FILE[:TEMPLATE]
++                   instantiate the configuration file FILE
++      --header=FILE[:TEMPLATE]
++                   instantiate the configuration header FILE
++
++Configuration files:
++$config_files
++
++Configuration headers:
++$config_headers
++
++Report bugs to <bug-autoconf@gnu.org>."
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ac_cs_version="\\
++config.status
++configured by $0, generated by GNU Autoconf 2.63,
++  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
++
++Copyright (C) 2008 Free Software Foundation, Inc.
++This config.status script is free software; the Free Software Foundation
++gives unlimited permission to copy, distribute and modify it."
++
++ac_pwd='$ac_pwd'
++srcdir='$srcdir'
++INSTALL='$INSTALL'
++test -n "\$AWK" || AWK=awk
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++# The default lists apply if the user does not specify any file.
++ac_need_defaults=:
++while test $# != 0
++do
++  case $1 in
++  --*=*)
++    ac_option=`expr "X$1" : 'X\([^=]*\)='`
++    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
++    ac_shift=:
++    ;;
++  *)
++    ac_option=$1
++    ac_optarg=$2
++    ac_shift=shift
++    ;;
+   esac
+ 
+-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+-  sed -e "$ac_comsub
+-s%@configure_input@%$configure_input%g
+-s%@srcdir@%$srcdir%g
+-s%@top_srcdir@%$top_srcdir%g
+-s%@INSTALL@%$INSTALL%g
+-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+-fi; done
+-rm -f conftest.s*
++  case $ac_option in
++  # Handling of the options.
++  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
++    ac_cs_recheck=: ;;
++  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
++    $as_echo "$ac_cs_version"; exit ;;
++  --debug | --debu | --deb | --de | --d | -d )
++    debug=: ;;
++  --file | --fil | --fi | --f )
++    $ac_shift
++    case $ac_optarg in
++    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
++    esac
++    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
++    ac_need_defaults=false;;
++  --header | --heade | --head | --hea )
++    $ac_shift
++    case $ac_optarg in
++    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
++    esac
++    CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
++    ac_need_defaults=false;;
++  --he | --h)
++    # Conflict between --help and --header
++    { $as_echo "$as_me: error: ambiguous option: $1
++Try \`$0 --help' for more information." >&2
++   { (exit 1); exit 1; }; };;
++  --help | --hel | -h )
++    $as_echo "$ac_cs_usage"; exit ;;
++  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++  | -silent | --silent | --silen | --sile | --sil | --si | --s)
++    ac_cs_silent=: ;;
++
++  # This is an error.
++  -*) { $as_echo "$as_me: error: unrecognized option: $1
++Try \`$0 --help' for more information." >&2
++   { (exit 1); exit 1; }; } ;;
++
++  *) ac_config_targets="$ac_config_targets $1"
++     ac_need_defaults=false ;;
+ 
+-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+-# NAME is the cpp macro being defined and VALUE is the value it is being given.
+-#
+-# ac_d sets the value in "#define NAME VALUE" lines.
+-ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+-ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+-ac_dC='\3'
+-ac_dD='%g'
+-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+-ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+-ac_uB='\([ 	]\)%\1#\2define\3'
+-ac_uC=' '
+-ac_uD='\4%g'
+-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+-ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+-ac_eB='$%\1#\2define\3'
+-ac_eC=' '
+-ac_eD='%g'
+-
+-if test "${CONFIG_HEADERS+set}" != set; then
+-EOF
+-cat >> $CONFIG_STATUS <<EOF
+-  CONFIG_HEADERS="common/icucfg.h"
+-EOF
+-cat >> $CONFIG_STATUS <<\EOF
+-fi
+-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+-  case "$ac_file" in
+-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+-  *) ac_file_in="${ac_file}.in" ;;
+   esac
++  shift
++done
++
++ac_configure_extra_args=
+ 
+-  echo creating $ac_file
++if $ac_cs_silent; then
++  exec 6>/dev/null
++  ac_configure_extra_args="$ac_configure_extra_args --silent"
++fi
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++if \$ac_cs_recheck; then
++  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
++  shift
++  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
++  CONFIG_SHELL='$SHELL'
++  export CONFIG_SHELL
++  exec "\$@"
++fi
+ 
+-  rm -f conftest.frag conftest.in conftest.out
+-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+-  cat $ac_file_inputs > conftest.in
+-
+-EOF
+-
+-# Transform confdefs.h into a sed script conftest.vals that substitutes
+-# the proper values into config.h.in to produce config.h.  And first:
+-# Protect against being on the right side of a sed subst in config.status.
+-# Protect against being in an unquoted here document in config.status.
+-rm -f conftest.vals
+-cat > conftest.hdr <<\EOF
+-s/[\\&%]/\\&/g
+-s%[\\$`]%\\&%g
+-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+-s%ac_d%ac_u%gp
+-s%ac_u%ac_e%gp
+-EOF
+-sed -n -f conftest.hdr confdefs.h > conftest.vals
+-rm -f conftest.hdr
+-
+-# This sed command replaces #undef with comments.  This is necessary, for
+-# example, in the case of _POSIX_SOURCE, which is predefined and required
+-# on some systems where configure will not decide to define it.
+-cat >> conftest.vals <<\EOF
+-s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+-EOF
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++exec 5>>config.log
++{
++  echo
++  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
++## Running $as_me. ##
++_ASBOX
++  $as_echo "$ac_log"
++} >&5
++
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++_ACEOF
+ 
+-# Break up conftest.vals because some shells have a limit on
+-# the size of here documents, and old seds have small limits too.
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ 
+-rm -f conftest.tail
+-while :
++# Handling of arguments.
++for ac_config_target in $ac_config_targets
+ do
+-  ac_lines=`grep -c . conftest.vals`
+-  # grep -c gives empty output for an empty file on some AIX systems.
+-  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+-  # Write a limited-size here document to conftest.frag.
+-  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+-  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+-  echo 'CEOF
+-  sed -f conftest.frag conftest.in > conftest.out
+-  rm -f conftest.in
+-  mv conftest.out conftest.in
+-' >> $CONFIG_STATUS
+-  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+-  rm -f conftest.vals
+-  mv conftest.tail conftest.vals
+-done
+-rm -f conftest.vals
+-
+-cat >> $CONFIG_STATUS <<\EOF
+-  rm -f conftest.frag conftest.h
+-  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+-  cat conftest.in >> conftest.h
+-  rm -f conftest.in
+-  if cmp -s $ac_file conftest.h 2>/dev/null; then
+-    echo "$ac_file is unchanged"
+-    rm -f conftest.h
++  case $ac_config_target in
++    "common/icucfg.h") CONFIG_HEADERS="$CONFIG_HEADERS common/icucfg.h" ;;
++    "icudefs.mk") CONFIG_FILES="$CONFIG_FILES icudefs.mk" ;;
++    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
++    "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
++    "data/icupkg.inc") CONFIG_FILES="$CONFIG_FILES data/icupkg.inc" ;;
++    "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
++    "config/Makefile.inc") CONFIG_FILES="$CONFIG_FILES config/Makefile.inc" ;;
++    "i18n/Makefile") CONFIG_FILES="$CONFIG_FILES i18n/Makefile" ;;
++    "layout/Makefile") CONFIG_FILES="$CONFIG_FILES layout/Makefile" ;;
++    "layoutex/Makefile") CONFIG_FILES="$CONFIG_FILES layoutex/Makefile" ;;
++    "io/Makefile") CONFIG_FILES="$CONFIG_FILES io/Makefile" ;;
++    "extra/Makefile") CONFIG_FILES="$CONFIG_FILES extra/Makefile" ;;
++    "extra/uconv/Makefile") CONFIG_FILES="$CONFIG_FILES extra/uconv/Makefile" ;;
++    "extra/scrptrun/Makefile") CONFIG_FILES="$CONFIG_FILES extra/scrptrun/Makefile" ;;
++    "stubdata/Makefile") CONFIG_FILES="$CONFIG_FILES stubdata/Makefile" ;;
++    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
++    "tools/ctestfw/Makefile") CONFIG_FILES="$CONFIG_FILES tools/ctestfw/Makefile" ;;
++    "tools/makeconv/Makefile") CONFIG_FILES="$CONFIG_FILES tools/makeconv/Makefile" ;;
++    "tools/genrb/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genrb/Makefile" ;;
++    "tools/genuca/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genuca/Makefile" ;;
++    "tools/genccode/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genccode/Makefile" ;;
++    "tools/gencmn/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencmn/Makefile" ;;
++    "tools/gencnval/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencnval/Makefile" ;;
++    "tools/gennames/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennames/Makefile" ;;
++    "tools/gentest/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gentest/Makefile" ;;
++    "tools/gennorm/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennorm/Makefile" ;;
++    "tools/genprops/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genprops/Makefile" ;;
++    "tools/genpname/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genpname/Makefile" ;;
++    "tools/genbrk/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genbrk/Makefile" ;;
++    "tools/gensprep/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gensprep/Makefile" ;;
++    "tools/icuswap/Makefile") CONFIG_FILES="$CONFIG_FILES tools/icuswap/Makefile" ;;
++    "tools/pkgdata/Makefile") CONFIG_FILES="$CONFIG_FILES tools/pkgdata/Makefile" ;;
++    "tools/toolutil/Makefile") CONFIG_FILES="$CONFIG_FILES tools/toolutil/Makefile" ;;
++    "tools/dumpce/Makefile") CONFIG_FILES="$CONFIG_FILES tools/dumpce/Makefile" ;;
++    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
++    "test/testdata/Makefile") CONFIG_FILES="$CONFIG_FILES test/testdata/Makefile" ;;
++    "test/hdrtst/Makefile") CONFIG_FILES="$CONFIG_FILES test/hdrtst/Makefile" ;;
++    "test/intltest/Makefile") CONFIG_FILES="$CONFIG_FILES test/intltest/Makefile" ;;
++    "test/cintltst/Makefile") CONFIG_FILES="$CONFIG_FILES test/cintltst/Makefile" ;;
++    "test/iotest/Makefile") CONFIG_FILES="$CONFIG_FILES test/iotest/Makefile" ;;
++    "test/thaitest/Makefile") CONFIG_FILES="$CONFIG_FILES test/thaitest/Makefile" ;;
++    "test/testmap/Makefile") CONFIG_FILES="$CONFIG_FILES test/testmap/Makefile" ;;
++    "test/letest/Makefile") CONFIG_FILES="$CONFIG_FILES test/letest/Makefile" ;;
++    "test/threadtest/Makefile") CONFIG_FILES="$CONFIG_FILES test/threadtest/Makefile" ;;
++    "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;;
++    "samples/date/Makefile") CONFIG_FILES="$CONFIG_FILES samples/date/Makefile" ;;
++    "samples/cal/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cal/Makefile" ;;
++    "samples/layout/Makefile") CONFIG_FILES="$CONFIG_FILES samples/layout/Makefile" ;;
++    "common/unicode/platform.h") CONFIG_FILES="$CONFIG_FILES common/unicode/platform.h" ;;
++
++  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
++$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
++   { (exit 1); exit 1; }; };;
++  esac
++done
++
++
++# If the user did not use the arguments to specify the items to instantiate,
++# then the envvar interface is used.  Set only those that are not.
++# We use the long form for the default assignment because of an extremely
++# bizarre bug on SunOS 4.1.3.
++if $ac_need_defaults; then
++  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
++  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
++fi
++
++# Have a temporary directory for convenience.  Make it in the build tree
++# simply because there is no reason against having it here, and in addition,
++# creating and moving files from /tmp can sometimes cause problems.
++# Hook for its removal unless debugging.
++# Note that there is a small window in which the directory will not be cleaned:
++# after its creation but before its name has been assigned to `$tmp'.
++$debug ||
++{
++  tmp=
++  trap 'exit_status=$?
++  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
++' 0
++  trap '{ (exit 1); exit 1; }' 1 2 13 15
++}
++# Create a (secure) tmp directory for tmp files.
++
++{
++  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
++  test -n "$tmp" && test -d "$tmp"
++}  ||
++{
++  tmp=./conf$$-$RANDOM
++  (umask 077 && mkdir "$tmp")
++} ||
++{
++   $as_echo "$as_me: cannot create a temporary directory in ." >&2
++   { (exit 1); exit 1; }
++}
++
++# Set up the scripts for CONFIG_FILES section.
++# No need to generate them if there are no CONFIG_FILES.
++# This happens for instance with `./config.status config.h'.
++if test -n "$CONFIG_FILES"; then
++
++
++ac_cr='
+'
++ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
++if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
++  ac_cs_awk_cr='\\r'
++else
++  ac_cs_awk_cr=$ac_cr
++fi
++
++echo 'BEGIN {' >"$tmp/subs1.awk" &&
++_ACEOF
++
++
++{
++  echo "cat >conf$$subs.awk <<_ACEOF" &&
++  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
++  echo "_ACEOF"
++} >conf$$subs.sh ||
++  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
++   { (exit 1); exit 1; }; }
++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
++ac_delim='%!_!# '
++for ac_last_try in false false false false false :; do
++  . ./conf$$subs.sh ||
++    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
++   { (exit 1); exit 1; }; }
++
++  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
++  if test $ac_delim_n = $ac_delim_num; then
++    break
++  elif $ac_last_try; then
++    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
++   { (exit 1); exit 1; }; }
++  else
++    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
++  fi
++done
++rm -f conf$$subs.sh
++
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
++_ACEOF
++sed -n '
++h
++s/^/S["/; s/!.*/"]=/
++p
++g
++s/^[^!]*!//
++:repl
++t repl
++s/'"$ac_delim"'$//
++t delim
++:nl
++h
++s/\(.\{148\}\).*/\1/
++t more1
++s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
++p
++n
++b repl
++:more1
++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
++p
++g
++s/.\{148\}//
++t nl
++:delim
++h
++s/\(.\{148\}\).*/\1/
++t more2
++s/["\\]/\\&/g; s/^/"/; s/$/"/
++p
++b
++:more2
++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
++p
++g
++s/.\{148\}//
++t delim
++' <conf$$subs.awk | sed '
++/^[^""]/{
++  N
++  s/\n//
++}
++' >>$CONFIG_STATUS || ac_write_fail=1
++rm -f conf$$subs.awk
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++_ACAWK
++cat >>"\$tmp/subs1.awk" <<_ACAWK &&
++  for (key in S) S_is_set[key] = 1
++  FS = ""
++
++}
++{
++  line = $ 0
++  nfields = split(line, field, "@")
++  substed = 0
++  len = length(field[1])
++  for (i = 2; i < nfields; i++) {
++    key = field[i]
++    keylen = length(key)
++    if (S_is_set[key]) {
++      value = S[key]
++      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
++      len += length(value) + length(field[++i])
++      substed = 1
++    } else
++      len += 1 + keylen
++  }
++
++  print line
++}
++
++_ACAWK
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
++  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
++else
++  cat
++fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
++  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
++$as_echo "$as_me: error: could not setup config files machinery" >&2;}
++   { (exit 1); exit 1; }; }
++_ACEOF
++
++# VPATH may cause trouble with some makes, so we remove $(srcdir),
++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
++# trailing colons and then remove the whole line if VPATH becomes empty
++# (actually we leave an empty line to preserve line numbers).
++if test "x$srcdir" = x.; then
++  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
++s/:*\$(srcdir):*/:/
++s/:*\${srcdir}:*/:/
++s/:*@srcdir@:*/:/
++s/^\([^=]*=[	 ]*\):*/\1/
++s/:*$//
++s/^[^=]*=[	 ]*$//
++}'
++fi
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++fi # test -n "$CONFIG_FILES"
++
++# Set up the scripts for CONFIG_HEADERS section.
++# No need to generate them if there are no CONFIG_HEADERS.
++# This happens for instance with `./config.status Makefile'.
++if test -n "$CONFIG_HEADERS"; then
++cat >"$tmp/defines.awk" <<\_ACAWK ||
++BEGIN {
++_ACEOF
++
++# Transform confdefs.h into an awk script `defines.awk', embedded as
++# here-document in config.status, that substitutes the proper values into
++# config.h.in to produce config.h.
++
++# Create a delimiter string that does not exist in confdefs.h, to ease
++# handling of long lines.
++ac_delim='%!_!# '
++for ac_last_try in false false :; do
++  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
++  if test -z "$ac_t"; then
++    break
++  elif $ac_last_try; then
++    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
++$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
++   { (exit 1); exit 1; }; }
+   else
+-    # Remove last slash and all that follows it.  Not all systems have dirname.
+-      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+-      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+-      # The file is in a subdirectory.
+-      test ! -d "$ac_dir" && mkdir "$ac_dir"
++    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
++  fi
++done
++
++# For the awk script, D is an array of macro values keyed by name,
++# likewise P contains macro parameters if any.  Preserve backslash
++# newline sequences.
++
++ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
++sed -n '
++s/.\{148\}/&'"$ac_delim"'/g
++t rset
++:rset
++s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
++t def
++d
++:def
++s/\\$//
++t bsnl
++s/["\\]/\\&/g
++s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
++D["\1"]=" \3"/p
++s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
++d
++:bsnl
++s/["\\]/\\&/g
++s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
++D["\1"]=" \3\\\\\\n"\\/p
++t cont
++s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
++t cont
++d
++:cont
++n
++s/.\{148\}/&'"$ac_delim"'/g
++t clear
++:clear
++s/\\$//
++t bsnlc
++s/["\\]/\\&/g; s/^/"/; s/$/"/p
++d
++:bsnlc
++s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
++b cont
++' <confdefs.h | sed '
++s/'"$ac_delim"'/"\\\
++"/g' >>$CONFIG_STATUS || ac_write_fail=1
++
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++  for (key in D) D_is_set[key] = 1
++  FS = ""
++}
++/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
++  line = \$ 0
++  split(line, arg, " ")
++  if (arg[1] == "#") {
++    defundef = arg[2]
++    mac1 = arg[3]
++  } else {
++    defundef = substr(arg[1], 2)
++    mac1 = arg[2]
++  }
++  split(mac1, mac2, "(") #)
++  macro = mac2[1]
++  prefix = substr(line, 1, index(line, defundef) - 1)
++  if (D_is_set[macro]) {
++    # Preserve the white space surrounding the "#".
++    print prefix "define", macro P[macro] D[macro]
++    next
++  } else {
++    # Replace #undef with comments.  This is necessary, for example,
++    # in the case of _POSIX_SOURCE, which is predefined and required
++    # on some systems where configure will not decide to define it.
++    if (defundef == "undef") {
++      print "/*", prefix defundef, macro, "*/"
++      next
++    }
++  }
++}
++{ print }
++_ACAWK
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++  { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
++$as_echo "$as_me: error: could not setup config headers machinery" >&2;}
++   { (exit 1); exit 1; }; }
++fi # test -n "$CONFIG_HEADERS"
++
++
++eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
++shift
++for ac_tag
++do
++  case $ac_tag in
++  :[FHLC]) ac_mode=$ac_tag; continue;;
++  esac
++  case $ac_mode$ac_tag in
++  :[FHL]*:*);;
++  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
++$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
++   { (exit 1); exit 1; }; };;
++  :[FH]-) ac_tag=-:-;;
++  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
++  esac
++  ac_save_IFS=$IFS
++  IFS=:
++  set x $ac_tag
++  IFS=$ac_save_IFS
++  shift
++  ac_file=$1
++  shift
++
++  case $ac_mode in
++  :L) ac_source=$1;;
++  :[FH])
++    ac_file_inputs=
++    for ac_f
++    do
++      case $ac_f in
++      -) ac_f="$tmp/stdin";;
++      *) # Look for the file first in the build tree, then in the source tree
++	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
++	 # because $ac_f cannot contain `:'.
++	 test -f "$ac_f" ||
++	   case $ac_f in
++	   [\\/$]*) false;;
++	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
++	   esac ||
++	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
++$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
++   { (exit 1); exit 1; }; };;
++      esac
++      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
++      ac_file_inputs="$ac_file_inputs '$ac_f'"
++    done
++
++    # Let's still pretend it is `configure' which instantiates (i.e., don't
++    # use $as_me), people would be surprised to read:
++    #    /* config.h.  Generated by config.status.  */
++    configure_input='Generated from '`
++	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
++	`' by configure.'
++    if test x"$ac_file" != x-; then
++      configure_input="$ac_file.  $configure_input"
++      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
++$as_echo "$as_me: creating $ac_file" >&6;}
++    fi
++    # Neutralize special characters interpreted by sed in replacement strings.
++    case $configure_input in #(
++    *\&* | *\|* | *\\* )
++       ac_sed_conf_input=`$as_echo "$configure_input" |
++       sed 's/[\\\\&|]/\\\\&/g'`;; #(
++    *) ac_sed_conf_input=$configure_input;;
++    esac
++
++    case $ac_tag in
++    *:-:* | *:-) cat >"$tmp/stdin" \
++      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
++$as_echo "$as_me: error: could not create $ac_file" >&2;}
++   { (exit 1); exit 1; }; } ;;
++    esac
++    ;;
++  esac
++
++  ac_dir=`$as_dirname -- "$ac_file" ||
++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++	 X"$ac_file" : 'X\(//\)[^/]' \| \
++	 X"$ac_file" : 'X\(//\)$' \| \
++	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$ac_file" |
++    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)[^/].*/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\).*/{
++	    s//\1/
++	    q
++	  }
++	  s/.*/./; q'`
++  { as_dir="$ac_dir"
++  case $as_dir in #(
++  -*) as_dir=./$as_dir;;
++  esac
++  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
++    as_dirs=
++    while :; do
++      case $as_dir in #(
++      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
++      *) as_qdir=$as_dir;;
++      esac
++      as_dirs="'$as_qdir' $as_dirs"
++      as_dir=`$as_dirname -- "$as_dir" ||
++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++	 X"$as_dir" : 'X\(//\)[^/]' \| \
++	 X"$as_dir" : 'X\(//\)$' \| \
++	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
++$as_echo X"$as_dir" |
++    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)[^/].*/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\/\)$/{
++	    s//\1/
++	    q
++	  }
++	  /^X\(\/\).*/{
++	    s//\1/
++	    q
++	  }
++	  s/.*/./; q'`
++      test -d "$as_dir" && break
++    done
++    test -z "$as_dirs" || eval "mkdir $as_dirs"
++  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
++$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
++   { (exit 1); exit 1; }; }; }
++  ac_builddir=.
++
++case "$ac_dir" in
++.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++*)
++  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++  # A ".." for each directory in $ac_dir_suffix.
++  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++  case $ac_top_builddir_sub in
++  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++  esac ;;
++esac
++ac_abs_top_builddir=$ac_pwd
++ac_abs_builddir=$ac_pwd$ac_dir_suffix
++# for backward compatibility:
++ac_top_builddir=$ac_top_build_prefix
++
++case $srcdir in
++  .)  # We are building in place.
++    ac_srcdir=.
++    ac_top_srcdir=$ac_top_builddir_sub
++    ac_abs_top_srcdir=$ac_pwd ;;
++  [\\/]* | ?:[\\/]* )  # Absolute name.
++    ac_srcdir=$srcdir$ac_dir_suffix;
++    ac_top_srcdir=$srcdir
++    ac_abs_top_srcdir=$srcdir ;;
++  *) # Relative name.
++    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
++    ac_top_srcdir=$ac_top_build_prefix$srcdir
++    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
++esac
++ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
++
++
++  case $ac_mode in
++  :F)
++  #
++  # CONFIG_FILE
++  #
++
++  case $INSTALL in
++  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
++  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
++  esac
++_ACEOF
++
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++# If the template does not know about datarootdir, expand it.
++# FIXME: This hack should be removed a few years after 2.60.
++ac_datarootdir_hack=; ac_datarootdir_seen=
++
++ac_sed_dataroot='
++/datarootdir/ {
++  p
++  q
++}
++/@datadir@/p
++/@docdir@/p
++/@infodir@/p
++/@localedir@/p
++/@mandir@/p
++'
++case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
++*datarootdir*) ac_datarootdir_seen=yes;;
++*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
++  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
++$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
++_ACEOF
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++  ac_datarootdir_hack='
++  s&@datadir@&$datadir&g
++  s&@docdir@&$docdir&g
++  s&@infodir@&$infodir&g
++  s&@localedir@&$localedir&g
++  s&@mandir@&$mandir&g
++    s&\\\${datarootdir}&$datarootdir&g' ;;
++esac
++_ACEOF
++
++# Neutralize VPATH when `$srcdir' = `.'.
++# Shell code in configure.ac might set extrasub.
++# FIXME: do we really want to maintain this feature?
++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ac_sed_extra="$ac_vpsub
++$extrasub
++_ACEOF
++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++:t
++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
++s|@configure_input@|$ac_sed_conf_input|;t t
++s&@top_builddir@&$ac_top_builddir_sub&;t t
++s&@top_build_prefix@&$ac_top_build_prefix&;t t
++s&@srcdir@&$ac_srcdir&;t t
++s&@abs_srcdir@&$ac_abs_srcdir&;t t
++s&@top_srcdir@&$ac_top_srcdir&;t t
++s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
++s&@builddir@&$ac_builddir&;t t
++s&@abs_builddir@&$ac_abs_builddir&;t t
++s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
++s&@INSTALL@&$ac_INSTALL&;t t
++$ac_datarootdir_hack
++"
++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
++  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
++$as_echo "$as_me: error: could not create $ac_file" >&2;}
++   { (exit 1); exit 1; }; }
++
++test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
++  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
++  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
++  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++which seems to be undefined.  Please make sure it is defined." >&5
++$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++which seems to be undefined.  Please make sure it is defined." >&2;}
++
++  rm -f "$tmp/stdin"
++  case $ac_file in
++  -) cat "$tmp/out" && rm -f "$tmp/out";;
++  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
++  esac \
++  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
++$as_echo "$as_me: error: could not create $ac_file" >&2;}
++   { (exit 1); exit 1; }; }
++ ;;
++  :H)
++  #
++  # CONFIG_HEADER
++  #
++  if test x"$ac_file" != x-; then
++    {
++      $as_echo "/* $configure_input  */" \
++      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
++    } >"$tmp/config.h" \
++      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
++$as_echo "$as_me: error: could not create $ac_file" >&2;}
++   { (exit 1); exit 1; }; }
++    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
++      { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
++$as_echo "$as_me: $ac_file is unchanged" >&6;}
++    else
++      rm -f "$ac_file"
++      mv "$tmp/config.h" "$ac_file" \
++	|| { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
++$as_echo "$as_me: error: could not create $ac_file" >&2;}
++   { (exit 1); exit 1; }; }
+     fi
+-    rm -f $ac_file
+-    mv conftest.h $ac_file
++  else
++    $as_echo "/* $configure_input  */" \
++      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
++      || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
++$as_echo "$as_me: error: could not create -" >&2;}
++   { (exit 1); exit 1; }; }
+   fi
+-fi; done
++ ;;
++
+ 
+-EOF
+-cat >> $CONFIG_STATUS <<EOF
++  esac
++
++done # for ac_tag
+ 
+-EOF
+-cat >> $CONFIG_STATUS <<\EOF
+ 
+-exit 0
+-EOF
++{ (exit 0); exit 0; }
++_ACEOF
+ chmod +x $CONFIG_STATUS
+-rm -fr confdefs* $ac_clean_files
+-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
++ac_clean_files=$ac_clean_files_save
++
++test $ac_write_fail = 0 ||
++  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
++$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
++   { (exit 1); exit 1; }; }
++
++
++# configure is writing to config.log, and then calls config.status.
++# config.status does its own redirection, appending to config.log.
++# Unfortunately, on DOS this fails, as config.log is still kept open
++# by configure, so config.status won't be able to write to it; its
++# output is simply discarded.  So we exec the FD to /dev/null,
++# effectively closing config.log, so it can be properly (re)opened and
++# appended to by config.status.  When coming back to configure, we
++# need to make the FD available again.
++if test "$no_create" != yes; then
++  ac_cs_success=:
++  ac_config_status_args=
++  test "$silent" = yes &&
++    ac_config_status_args="$ac_config_status_args --quiet"
++  exec 5>/dev/null
++  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
++  exec 5>>config.log
++  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
++  # would make configure fail if this is the last instruction.
++  $ac_cs_success || { (exit 1); exit 1; }
++fi
++if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
++  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
++$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
++fi
+ 
+ 
+ if test $ICU_USE_THREADS = 0; then
+Only in 3_0/icu/source/extra/scrptrun: Makefile
+Only in 3_0/icu/source: lib
+Only in 3_0/icu/source/samples/layout: Makefile
+Only in 3_0/icu/source/test/letest: Makefile
+Only in 3_0/icu/source/test/testmap: Makefile
+Only in 3_0/icu/source/test/thaitest: Makefile
+Only in 3_0/icu/source/test/threadtest: Makefile
+Only in 3_0/icu/source/tools/dumpce: Makefile
diff --git a/multi/c/patch/3_2 b/multi/c/patch/3_2
new file mode 100644
index 0000000..182b5f3
--- /dev/null
+++ b/multi/c/patch/3_2
@@ -0,0 +1,12384 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+--- 3_2.orig/icu/source/config/mh-darwin        2008-10-20 14:57:52.000000000 -0700
++++ 3_2/icu/source/config/mh-darwin     2008-10-20 15:57:28.000000000 -0700
+@@ -13,8 +13,8 @@
+ LD_FLAGS += -headerpad_max_install_names
+ 
+ ## Commands to generate dependency files
+-GEN_DEPS.c=	$(CC) -E -MMD  $(DEFS) $(CPPFLAGS)
+-GEN_DEPS.cc=	$(CXX) -E -MMD  $(DEFS) $(CPPFLAGS)
++GEN_DEPS.c=	echo 
++GEN_DEPS.cc=	echo 
+ 
+ ## Commands to compile
+ COMPILE.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -fno-common -c
+Only in 3_0.orig/icu/source: config.cache
+Only in 3_0.orig/icu/source: config.log
+diff -ru 3_0.orig/icu/source/configure 3_0/icu/source/configure
+--- 3_2.orig/icu/source/configure
++++ 3_2/icu/source/configure
+2d1
+< 
+4,5c3
+< # Generated automatically using autoconf version 2.13 
+< # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+---
+> # Generated by GNU Autoconf 2.63.
+6a5,6
+> # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+> # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+8a9,571
+> ## --------------------- ##
+> ## M4sh Initialization.  ##
+> ## --------------------- ##
+> 
+> # Be more Bourne compatible
+> DUALCASE=1; export DUALCASE # for MKS sh
+> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+>   emulate sh
+>   NULLCMD=:
+>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+>   # is contrary to our usage.  Disable this feature.
+>   alias -g '${1+"$@"}'='"$@"'
+>   setopt NO_GLOB_SUBST
+> else
+>   case `(set -o) 2>/dev/null` in
+>   *posix*) set -o posix ;;
+> esac
+> 
+> fi
+> 
+> 
+> 
+> 
+> # PATH needs CR
+> # Avoid depending upon Character Ranges.
+> as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+> as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+> as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+> as_cr_digits='0123456789'
+> as_cr_alnum=$as_cr_Letters$as_cr_digits
+> 
+> as_nl='
+> '
+> export as_nl
+> # Printing a long string crashes Solaris 7 /usr/bin/printf.
+> as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+> if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+>   as_echo='printf %s\n'
+>   as_echo_n='printf %s'
+> else
+>   if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+>     as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+>     as_echo_n='/usr/ucb/echo -n'
+>   else
+>     as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+>     as_echo_n_body='eval
+>       arg=$1;
+>       case $arg in
+>       *"$as_nl"*)
+> 	expr "X$arg" : "X\\(.*\\)$as_nl";
+> 	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+>       esac;
+>       expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+>     '
+>     export as_echo_n_body
+>     as_echo_n='sh -c $as_echo_n_body as_echo'
+>   fi
+>   export as_echo_body
+>   as_echo='sh -c $as_echo_body as_echo'
+> fi
+> 
+> # The user is always right.
+> if test "${PATH_SEPARATOR+set}" != set; then
+>   PATH_SEPARATOR=:
+>   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+>     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+>       PATH_SEPARATOR=';'
+>   }
+> fi
+> 
+> # Support unset when possible.
+> if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+>   as_unset=unset
+> else
+>   as_unset=false
+> fi
+> 
+> 
+> # IFS
+> # We need space, tab and new line, in precisely that order.  Quoting is
+> # there to prevent editors from complaining about space-tab.
+> # (If _AS_PATH_WALK were called with IFS unset, it would disable word
+> # splitting by setting IFS to empty value.)
+> IFS=" ""	$as_nl"
+> 
+> # Find who we are.  Look in the path if we contain no directory separator.
+> case $0 in
+>   *[\\/]* ) as_myself=$0 ;;
+>   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+> done
+> IFS=$as_save_IFS
+> 
+>      ;;
+> esac
+> # We did not find ourselves, most probably we were run as `sh COMMAND'
+> # in which case we are not to be found in the path.
+> if test "x$as_myself" = x; then
+>   as_myself=$0
+> fi
+> if test ! -f "$as_myself"; then
+>   $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+>   { (exit 1); exit 1; }
+> fi
+> 
+> # Work around bugs in pre-3.0 UWIN ksh.
+> for as_var in ENV MAIL MAILPATH
+> do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+> done
+> PS1='$ '
+> PS2='> '
+> PS4='+ '
+> 
+> # NLS nuisances.
+> LC_ALL=C
+> export LC_ALL
+> LANGUAGE=C
+> export LANGUAGE
+> 
+> # Required to use basename.
+> if expr a : '\(a\)' >/dev/null 2>&1 &&
+>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
+>   as_expr=expr
+> else
+>   as_expr=false
+> fi
+> 
+> if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+>   as_basename=basename
+> else
+>   as_basename=false
+> fi
+> 
+> 
+> # Name of the executable.
+> as_me=`$as_basename -- "$0" ||
+> $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+> 	 X"$0" : 'X\(//\)$' \| \
+> 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+> $as_echo X/"$0" |
+>     sed '/^.*\/\([^/][^/]*\)\/*$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\/\(\/\/\)$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\/\(\/\).*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  s/.*/./; q'`
+> 
+> # CDPATH.
+> $as_unset CDPATH
+> 
+> 
+> if test "x$CONFIG_SHELL" = x; then
+>   if (eval ":") 2>/dev/null; then
+>   as_have_required=yes
+> else
+>   as_have_required=no
+> fi
+> 
+>   if test $as_have_required = yes &&	 (eval ":
+> (as_func_return () {
+>   (exit \$1)
+> }
+> as_func_success () {
+>   as_func_return 0
+> }
+> as_func_failure () {
+>   as_func_return 1
+> }
+> as_func_ret_success () {
+>   return 0
+> }
+> as_func_ret_failure () {
+>   return 1
+> }
+> 
+> exitcode=0
+> if as_func_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_success failed.
+> fi
+> 
+> if as_func_failure; then
+>   exitcode=1
+>   echo as_func_failure succeeded.
+> fi
+> 
+> if as_func_ret_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_ret_success failed.
+> fi
+> 
+> if as_func_ret_failure; then
+>   exitcode=1
+>   echo as_func_ret_failure succeeded.
+> fi
+> 
+> if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+>   :
+> else
+>   exitcode=1
+>   echo positional parameters were not saved.
+> fi
+> 
+> test \$exitcode = 0) || { (exit 1); exit 1; }
+> 
+> (
+>   as_lineno_1=\$LINENO
+>   as_lineno_2=\$LINENO
+>   test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+>   test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+> ") 2> /dev/null; then
+>   :
+> else
+>   as_candidate_shells=
+>     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   case $as_dir in
+> 	 /*)
+> 	   for as_base in sh bash ksh sh5; do
+> 	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+> 	   done;;
+>        esac
+> done
+> IFS=$as_save_IFS
+> 
+> 
+>       for as_shell in $as_candidate_shells $SHELL; do
+> 	 # Try only shells that exist, to save several forks.
+> 	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+> 		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+>   emulate sh
+>   NULLCMD=:
+>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+>   # is contrary to our usage.  Disable this feature.
+>   alias -g '${1+"$@"}'='"$@"'
+>   setopt NO_GLOB_SUBST
+> else
+>   case `(set -o) 2>/dev/null` in
+>   *posix*) set -o posix ;;
+> esac
+> 
+> fi
+> 
+> 
+> :
+> _ASEOF
+> }; then
+>   CONFIG_SHELL=$as_shell
+> 	       as_have_required=yes
+> 	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+>   emulate sh
+>   NULLCMD=:
+>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+>   # is contrary to our usage.  Disable this feature.
+>   alias -g '${1+"$@"}'='"$@"'
+>   setopt NO_GLOB_SUBST
+> else
+>   case `(set -o) 2>/dev/null` in
+>   *posix*) set -o posix ;;
+> esac
+> 
+> fi
+> 
+> 
+> :
+> (as_func_return () {
+>   (exit $1)
+> }
+> as_func_success () {
+>   as_func_return 0
+> }
+> as_func_failure () {
+>   as_func_return 1
+> }
+> as_func_ret_success () {
+>   return 0
+> }
+> as_func_ret_failure () {
+>   return 1
+> }
+> 
+> exitcode=0
+> if as_func_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_success failed.
+> fi
+> 
+> if as_func_failure; then
+>   exitcode=1
+>   echo as_func_failure succeeded.
+> fi
+> 
+> if as_func_ret_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_ret_success failed.
+> fi
+> 
+> if as_func_ret_failure; then
+>   exitcode=1
+>   echo as_func_ret_failure succeeded.
+> fi
+> 
+> if ( set x; as_func_ret_success y && test x = "$1" ); then
+>   :
+> else
+>   exitcode=1
+>   echo positional parameters were not saved.
+> fi
+> 
+> test $exitcode = 0) || { (exit 1); exit 1; }
+> 
+> (
+>   as_lineno_1=$LINENO
+>   as_lineno_2=$LINENO
+>   test "x$as_lineno_1" != "x$as_lineno_2" &&
+>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+> 
+> _ASEOF
+> }; then
+>   break
+> fi
+> 
+> fi
+> 
+>       done
+> 
+>       if test "x$CONFIG_SHELL" != x; then
+>   for as_var in BASH_ENV ENV
+> 	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+> 	done
+> 	export CONFIG_SHELL
+> 	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+> fi
+> 
+> 
+>     if test $as_have_required = no; then
+>   echo This script requires a shell more modern than all the
+>       echo shells that I found on your system.  Please install a
+>       echo modern shell, or manually run the script under such a
+>       echo shell if you do have one.
+>       { (exit 1); exit 1; }
+> fi
+> 
+> 
+> fi
+> 
+> fi
+> 
+> 
+> 
+> (eval "as_func_return () {
+>   (exit \$1)
+> }
+> as_func_success () {
+>   as_func_return 0
+> }
+> as_func_failure () {
+>   as_func_return 1
+> }
+> as_func_ret_success () {
+>   return 0
+> }
+> as_func_ret_failure () {
+>   return 1
+> }
+> 
+> exitcode=0
+> if as_func_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_success failed.
+> fi
+> 
+> if as_func_failure; then
+>   exitcode=1
+>   echo as_func_failure succeeded.
+> fi
+> 
+> if as_func_ret_success; then
+>   :
+> else
+>   exitcode=1
+>   echo as_func_ret_success failed.
+> fi
+> 
+> if as_func_ret_failure; then
+>   exitcode=1
+>   echo as_func_ret_failure succeeded.
+> fi
+> 
+> if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+>   :
+> else
+>   exitcode=1
+>   echo positional parameters were not saved.
+> fi
+> 
+> test \$exitcode = 0") || {
+>   echo No shell found that supports shell functions.
+>   echo Please tell bug-autoconf@gnu.org about your system,
+>   echo including any error possibly output before this message.
+>   echo This can help us improve future autoconf versions.
+>   echo Configuration will now proceed without shell functions.
+> }
+> 
+> 
+> 
+>   as_lineno_1=$LINENO
+>   as_lineno_2=$LINENO
+>   test "x$as_lineno_1" != "x$as_lineno_2" &&
+>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+> 
+>   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+>   # uniformly replaced by the line number.  The first 'sed' inserts a
+>   # line-number line after each line using $LINENO; the second 'sed'
+>   # does the real work.  The second script uses 'N' to pair each
+>   # line-number line with the line containing $LINENO, and appends
+>   # trailing '-' during substitution so that $LINENO is not a special
+>   # case at line end.
+>   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+>   # scripts with optimization help from Paolo Bonzini.  Blame Lee
+>   # E. McMahon (1931-1989) for sed's syntax.  :-)
+>   sed -n '
+>     p
+>     /[$]LINENO/=
+>   ' <$as_myself |
+>     sed '
+>       s/[$]LINENO.*/&-/
+>       t lineno
+>       b
+>       :lineno
+>       N
+>       :loop
+>       s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+>       t loop
+>       s/-\n.*//
+>     ' >$as_me.lineno &&
+>   chmod +x "$as_me.lineno" ||
+>     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+>    { (exit 1); exit 1; }; }
+> 
+>   # Don't try to exec as it changes $[0], causing all sort of problems
+>   # (the dirname of $[0] is not the place where we might find the
+>   # original and so on.  Autoconf is especially sensitive to this).
+>   . "./$as_me.lineno"
+>   # Exit status is that of the last command.
+>   exit
+> }
+> 
+> 
+> if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+>   as_dirname=dirname
+> else
+>   as_dirname=false
+> fi
+> 
+> ECHO_C= ECHO_N= ECHO_T=
+> case `echo -n x` in
+> -n*)
+>   case `echo 'x\c'` in
+>   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+>   *)   ECHO_C='\c';;
+>   esac;;
+> *)
+>   ECHO_N='-n';;
+> esac
+> if expr a : '\(a\)' >/dev/null 2>&1 &&
+>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
+>   as_expr=expr
+> else
+>   as_expr=false
+> fi
+> 
+> rm -f conf$$ conf$$.exe conf$$.file
+> if test -d conf$$.dir; then
+>   rm -f conf$$.dir/conf$$.file
+> else
+>   rm -f conf$$.dir
+>   mkdir conf$$.dir 2>/dev/null
+> fi
+> if (echo >conf$$.file) 2>/dev/null; then
+>   if ln -s conf$$.file conf$$ 2>/dev/null; then
+>     as_ln_s='ln -s'
+>     # ... but there are two gotchas:
+>     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+>     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+>     # In both cases, we have to default to `cp -p'.
+>     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+>       as_ln_s='cp -p'
+>   elif ln conf$$.file conf$$ 2>/dev/null; then
+>     as_ln_s=ln
+>   else
+>     as_ln_s='cp -p'
+>   fi
+> else
+>   as_ln_s='cp -p'
+> fi
+> rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+> rmdir conf$$.dir 2>/dev/null
+> 
+> if mkdir -p . 2>/dev/null; then
+>   as_mkdir_p=:
+> else
+>   test -d ./-p && rmdir ./-p
+>   as_mkdir_p=false
+> fi
+> 
+> if test -x / >/dev/null 2>&1; then
+>   as_test_x='test -x'
+> else
+>   if ls -dL / >/dev/null 2>&1; then
+>     as_ls_L_option=L
+>   else
+>     as_ls_L_option=
+>   fi
+>   as_test_x='
+>     eval sh -c '\''
+>       if test -d "$1"; then
+> 	test -d "$1/.";
+>       else
+> 	case $1 in
+> 	-*)set "./$1";;
+> 	esac;
+> 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+> 	???[sx]*):;;*)false;;esac;fi
+>     '\'' sh
+>   '
+> fi
+> as_executable_p=$as_test_x
+> 
+> # Sed expression to map a string onto a valid CPP name.
+> as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+> 
+> # Sed expression to map a string onto a valid variable name.
+> as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+> 
+10,11c573,583
+< # Defaults:
+< ac_help=
+---
+> 
+> exec 7<&0 </dev/null 6>&1
+> 
+> # Name of the host.
+> # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+> # so uname gets run too.
+> ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+> 
+> #
+> # Initializations.
+> #
+13,52c585,810
+< # Any additions from configure.in:
+< ac_help="$ac_help
+<   --enable-strict         compile with strict compiler options [default=no]"
+< ac_help="$ac_help
+<   --enable-64bit-libs     build 64-bit libraries [default=yes]"
+< ac_help="$ac_help
+<   --enable-shared         build shared libraries [default=yes]"
+< ac_help="$ac_help
+<   --enable-static         build static libraries [default=no]"
+< ac_help="$ac_help
+<   --enable-debug          build debug libraries [default=no]"
+< ac_help="$ac_help
+<   --enable-release        build release libraries [default=yes]"
+< ac_help="$ac_help
+<   --enable-renaming       add a version suffix to symbols [default=yes]"
+< ac_help="$ac_help
+<   --enable-tracing        enable function and data tracing [default=yes]"
+< ac_help="$ac_help
+<   --enable-rpath          use rpath when linking [default is only if necessary]"
+< ac_help="$ac_help
+<   --enable-threads        build ICU with thread safety [default=yes]"
+< ac_help="$ac_help
+<   --with-iostream=version specify the version of iostream to use (none, old, std, auto) [default=auto]"
+< ac_help="$ac_help
+<   --enable-extras         build ICU extras [default=yes]"
+< ac_help="$ac_help
+<   --enable-icuio          build ICU's icuio library [default=yes]"
+< ac_help="$ac_help
+<   --enable-layout         build ICU's layout library [default=yes]"
+< ac_help="$ac_help
+<   --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) [default=auto]"
+< ac_help="$ac_help
+< "
+< ac_help="$ac_help
+<   --with-library-suffix=suffix    tag a suffix to the library names [default=]"
+< ac_help="$ac_help
+<   --enable-tests          build ICU tests [default=yes]"
+< ac_help="$ac_help
+<   --enable-samples        build ICU samples [default=yes]  
+< Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries."
+---
+> ac_clean_files=
+> ac_config_libobj_dir=.
+> LIBOBJS=
+> cross_compiling=no
+> subdirs=
+> MFLAGS=
+> MAKEFLAGS=
+> SHELL=${CONFIG_SHELL-/bin/sh}
+> 
+> # Identity of this package.
+> PACKAGE_NAME=
+> PACKAGE_TARNAME=
+> PACKAGE_VERSION=
+> PACKAGE_STRING=
+> PACKAGE_BUGREPORT=
+> 
+> ac_unique_file="common/unicode/utypes.h"
+> # Factoring default headers for most tests.
+> ac_includes_default="\
+> #include <stdio.h>
+> #ifdef HAVE_SYS_TYPES_H
+> # include <sys/types.h>
+> #endif
+> #ifdef HAVE_SYS_STAT_H
+> # include <sys/stat.h>
+> #endif
+> #ifdef STDC_HEADERS
+> # include <stdlib.h>
+> # include <stddef.h>
+> #else
+> # ifdef HAVE_STDLIB_H
+> #  include <stdlib.h>
+> # endif
+> #endif
+> #ifdef HAVE_STRING_H
+> # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+> #  include <memory.h>
+> # endif
+> # include <string.h>
+> #endif
+> #ifdef HAVE_STRINGS_H
+> # include <strings.h>
+> #endif
+> #ifdef HAVE_INTTYPES_H
+> # include <inttypes.h>
+> #endif
+> #ifdef HAVE_STDINT_H
+> # include <stdint.h>
+> #endif
+> #ifdef HAVE_UNISTD_H
+> # include <unistd.h>
+> #endif"
+> 
+> ac_subst_vars='LTLIBOBJS
+> LIBOBJS
+> AIX_SHLIB
+> ld_rpath_suf
+> platform_make_fragment
+> platform_make_fragment_name
+> platform
+> ICUDATA_CHAR
+> SAMPLES_TRUE
+> TESTS_TRUE
+> ICULIBSUFFIXCNAME
+> U_HAVE_LIB_SUFFIX
+> ICULIBSUFFIX
+> DATA_PACKAGING_MODE
+> DATA_PACKAGING_CPPFLAGS
+> thepkgicudatadir
+> pkgicudatadir
+> thelibdir
+> thedatadir
+> thesysconfdir
+> LAYOUT_TRUE
+> ICUIO_TRUE
+> EXTRAS_TRUE
+> U_SIZEOF_WCHAR_T
+> U_HAVE_WCSCPY
+> U_HAVE_WCHAR_H
+> HAVE_UINT64_T
+> HAVE_INT64_T
+> HAVE_UINT32_T
+> HAVE_INT32_T
+> HAVE_UINT16_T
+> HAVE_INT16_T
+> HAVE_UINT8_T
+> HAVE_INT8_T
+> U_TIMEZONE
+> U_HAVE_TIMEZONE
+> U_TZNAME
+> U_HAVE_TZNAME
+> U_TZSET
+> U_HAVE_TZSET
+> U_HAVE_POPEN
+> U_HAVE_PLACEMENT_NEW
+> U_OVERRIDE_CXX_ALLOCATION
+> U_HAVE_NAMESPACE
+> U_NL_LANGINFO_CODESET
+> U_HAVE_NL_LANGINFO_CODESET
+> U_HAVE_NL_LANGINFO
+> U_IS_BIG_ENDIAN
+> U_IOSTREAM_SOURCE
+> CXXCPP
+> U_HAVE_INTTYPES_H
+> EGREP
+> GREP
+> CPP
+> GENCCODE_ASSEMBLY
+> HAVE_MMAP
+> ICU_USE_THREADS
+> THREADS_TRUE
+> U_INLINE
+> ENABLE_RPATH
+> U_ENABLE_TRACING
+> U_DISABLE_RENAMING
+> AR
+> RANLIB
+> ENABLE_RELEASE
+> ENABLE_DEBUG
+> ENABLE_STATIC
+> ENABLE_SHARED
+> LIB_M
+> COMPILE_LINK_ENVVAR
+> ARFLAGS
+> host_os
+> host_vendor
+> host_cpu
+> host
+> build_os
+> build_vendor
+> build_cpu
+> build
+> DOXYGEN
+> U_MAKE
+> STRIP
+> INSTALL_DATA
+> INSTALL_SCRIPT
+> INSTALL_PROGRAM
+> ac_ct_CXX
+> CXXFLAGS
+> CXX
+> OBJEXT
+> EXEEXT
+> ac_ct_CC
+> LDFLAGS
+> CFLAGS
+> CC
+> CPPFLAGS
+> UNICODE_VERSION
+> LIB_VERSION_MAJOR
+> LIB_VERSION
+> VERSION
+> PACKAGE
+> target_alias
+> host_alias
+> build_alias
+> LIBS
+> ECHO_T
+> ECHO_N
+> ECHO_C
+> DEFS
+> mandir
+> localedir
+> libdir
+> psdir
+> pdfdir
+> dvidir
+> htmldir
+> infodir
+> docdir
+> oldincludedir
+> includedir
+> localstatedir
+> sharedstatedir
+> sysconfdir
+> datadir
+> datarootdir
+> libexecdir
+> sbindir
+> bindir
+> program_transform_name
+> prefix
+> exec_prefix
+> PACKAGE_BUGREPORT
+> PACKAGE_STRING
+> PACKAGE_VERSION
+> PACKAGE_TARNAME
+> PACKAGE_NAME
+> PATH_SEPARATOR
+> SHELL'
+> ac_subst_files=''
+> ac_user_opts='
+> enable_option_checking
+> enable_strict
+> enable_64bit_libs
+> enable_shared
+> enable_static
+> enable_debug
+> enable_release
+> enable_renaming
+> enable_tracing
+> enable_rpath
+> enable_threads
+> with_iostream
+> enable_extras
+> enable_layout
+> with_data_packaging
+> enable_mapped
+> with_library_suffix
+> enable_tests
+> enable_samples
+> '
+>       ac_precious_vars='build_alias
+> host_alias
+> target_alias
+> CC
+> CFLAGS
+> LDFLAGS
+> LIBS
+> CPPFLAGS
+> CXX
+> CXXFLAGS
+> CCC
+> CPP
+> CXXCPP'
+> 
+54a813,816
+> ac_init_help=
+> ac_init_version=false
+> ac_unrecognized_opts=
+> ac_unrecognized_sep=
+57,58c819
+< build=NONE
+< cache_file=./config.cache
+---
+> cache_file=/dev/null
+60d820
+< host=NONE
+62d821
+< nonopt=NONE
+71d829
+< target=NONE
+74a833,839
+> 
+> # Installation directory options.
+> # These are left unexpanded so users can "make install exec_prefix=/foo"
+> # and all the variables that are supposed to be based on exec_prefix
+> # by default will actually change.
+> # Use braces instead of parens because sh, perl, etc. also accept them.
+> # (The list follows the same order as the GNU Coding Standards.)
+78c843,844
+< datadir='${prefix}/share'
+---
+> datarootdir='${prefix}/share'
+> datadir='${datarootdir}'
+82d847
+< libdir='${exec_prefix}/lib'
+85,93c850,858
+< infodir='${prefix}/info'
+< mandir='${prefix}/man'
+< 
+< # Initialize some other variables.
+< subdirs=
+< MFLAGS= MAKEFLAGS=
+< SHELL=${CONFIG_SHELL-/bin/sh}
+< # Maximum number of lines to put in a shell here document.
+< ac_max_here_lines=12
+---
+> docdir='${datarootdir}/doc/${PACKAGE}'
+> infodir='${datarootdir}/info'
+> htmldir='${docdir}'
+> dvidir='${docdir}'
+> pdfdir='${docdir}'
+> psdir='${docdir}'
+> libdir='${exec_prefix}/lib'
+> localedir='${datarootdir}/locale'
+> mandir='${datarootdir}/man'
+95a861
+> ac_dashdash=
+98d863
+< 
+101c866
+<     eval "$ac_prev=\$ac_option"
+---
+>     eval $ac_prev=\$ac_option
+106,108c871,873
+<   case "$ac_option" in
+<   -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+<   *) ac_optarg= ;;
+---
+>   case $ac_option in
+>   *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+>   *)	ac_optarg=yes ;;
+113c878,880
+<   case "$ac_option" in
+---
+>   case $ac_dashdash$ac_option in
+>   --)
+>     ac_dashdash=yes ;;
+118c885
+<     bindir="$ac_optarg" ;;
+---
+>     bindir=$ac_optarg ;;
+121c888
+<     ac_prev=build ;;
+---
+>     ac_prev=build_alias ;;
+123c890
+<     build="$ac_optarg" ;;
+---
+>     build_alias=$ac_optarg ;;
+130c897,900
+<     cache_file="$ac_optarg" ;;
+---
+>     cache_file=$ac_optarg ;;
+> 
+>   --config-cache | -C)
+>     cache_file=config.cache ;;
+132c902
+<   -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+---
+>   -datadir | --datadir | --datadi | --datad)
+134,136c904,912
+<   -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+<   | --da=*)
+<     datadir="$ac_optarg" ;;
+---
+>   -datadir=* | --datadir=* | --datadi=* | --datad=*)
+>     datadir=$ac_optarg ;;
+> 
+>   -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+>   | --dataroo | --dataro | --datar)
+>     ac_prev=datarootdir ;;
+>   -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+>   | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+>     datarootdir=$ac_optarg ;;
+139c915
+<     ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+---
+>     ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+141,145c917,939
+<     if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+<       { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+<     fi
+<     ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+<     eval "enable_${ac_feature}=no" ;;
+---
+>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+>       { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+>    { (exit 1); exit 1; }; }
+>     ac_useropt_orig=$ac_useropt
+>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+>     case $ac_user_opts in
+>       *"
+> "enable_$ac_useropt"
+> "*) ;;
+>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+> 	 ac_unrecognized_sep=', ';;
+>     esac
+>     eval enable_$ac_useropt=no ;;
+> 
+>   -docdir | --docdir | --docdi | --doc | --do)
+>     ac_prev=docdir ;;
+>   -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+>     docdir=$ac_optarg ;;
+> 
+>   -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+>     ac_prev=dvidir ;;
+>   -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+>     dvidir=$ac_optarg ;;
+148c942
+<     ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+---
+>     ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+150,156c944,954
+<     if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+<       { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+<     fi
+<     ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+<     case "$ac_option" in
+<       *=*) ;;
+<       *) ac_optarg=yes ;;
+---
+>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+>       { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+>    { (exit 1); exit 1; }; }
+>     ac_useropt_orig=$ac_useropt
+>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+>     case $ac_user_opts in
+>       *"
+> "enable_$ac_useropt"
+> "*) ;;
+>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+> 	 ac_unrecognized_sep=', ';;
+158c956
+<     eval "enable_${ac_feature}='$ac_optarg'" ;;
+---
+>     eval enable_$ac_useropt=\$ac_optarg ;;
+167c965
+<     exec_prefix="$ac_optarg" ;;
+---
+>     exec_prefix=$ac_optarg ;;
+173,226c971,976
+<   -help | --help | --hel | --he)
+<     # Omit some internal or obsolete options to make the list less imposing.
+<     # This message is too long to be a string in the A/UX 3.1 sh.
+<     cat << EOF
+< Usage: configure [options] [host]
+< Options: [defaults in brackets after descriptions]
+< Configuration:
+<   --cache-file=FILE       cache test results in FILE
+<   --help                  print this message
+<   --no-create             do not create output files
+<   --quiet, --silent       do not print \`checking...' messages
+<   --version               print the version of autoconf that created configure
+< Directory and file names:
+<   --prefix=PREFIX         install architecture-independent files in PREFIX
+<                           [$ac_default_prefix]
+<   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+<                           [same as prefix]
+<   --bindir=DIR            user executables in DIR [EPREFIX/bin]
+<   --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+<   --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+<   --datadir=DIR           read-only architecture-independent data in DIR
+<                           [PREFIX/share]
+<   --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+<   --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+<                           [PREFIX/com]
+<   --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+<   --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+<   --includedir=DIR        C header files in DIR [PREFIX/include]
+<   --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+<   --infodir=DIR           info documentation in DIR [PREFIX/info]
+<   --mandir=DIR            man documentation in DIR [PREFIX/man]
+<   --srcdir=DIR            find the sources in DIR [configure dir or ..]
+<   --program-prefix=PREFIX prepend PREFIX to installed program names
+<   --program-suffix=SUFFIX append SUFFIX to installed program names
+<   --program-transform-name=PROGRAM
+<                           run sed PROGRAM on installed program names
+< EOF
+<     cat << EOF
+< Host type:
+<   --build=BUILD           configure for building on BUILD [BUILD=HOST]
+<   --host=HOST             configure for HOST [guessed]
+<   --target=TARGET         configure for TARGET [TARGET=HOST]
+< Features and packages:
+<   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+<   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+<   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+<   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+<   --x-includes=DIR        X include files are in DIR
+<   --x-libraries=DIR       X library files are in DIR
+< EOF
+<     if test -n "$ac_help"; then
+<       echo "--enable and --with options recognized:$ac_help"
+<     fi
+<     exit 0 ;;
+---
+>   -help | --help | --hel | --he | -h)
+>     ac_init_help=long ;;
+>   -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+>     ac_init_help=recursive ;;
+>   -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+>     ac_init_help=short ;;
+229c979
+<     ac_prev=host ;;
+---
+>     ac_prev=host_alias ;;
+231c981,987
+<     host="$ac_optarg" ;;
+---
+>     host_alias=$ac_optarg ;;
+> 
+>   -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+>     ac_prev=htmldir ;;
+>   -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+>   | --ht=*)
+>     htmldir=$ac_optarg ;;
+238c994
+<     includedir="$ac_optarg" ;;
+---
+>     includedir=$ac_optarg ;;
+243c999
+<     infodir="$ac_optarg" ;;
+---
+>     infodir=$ac_optarg ;;
+248c1004
+<     libdir="$ac_optarg" ;;
+---
+>     libdir=$ac_optarg ;;
+255c1011,1016
+<     libexecdir="$ac_optarg" ;;
+---
+>     libexecdir=$ac_optarg ;;
+> 
+>   -localedir | --localedir | --localedi | --localed | --locale)
+>     ac_prev=localedir ;;
+>   -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+>     localedir=$ac_optarg ;;
+258,259c1019
+<   | --localstate | --localstat | --localsta | --localst \
+<   | --locals | --local | --loca | --loc | --lo)
+---
+>   | --localstate | --localstat | --localsta | --localst | --locals)
+262,264c1022,1023
+<   | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+<   | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+<     localstatedir="$ac_optarg" ;;
+---
+>   | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+>     localstatedir=$ac_optarg ;;
+269c1028
+<     mandir="$ac_optarg" ;;
+---
+>     mandir=$ac_optarg ;;
+276c1035
+<   | --no-cr | --no-c)
+---
+>   | --no-cr | --no-c | -n)
+290c1049
+<     oldincludedir="$ac_optarg" ;;
+---
+>     oldincludedir=$ac_optarg ;;
+295c1054
+<     prefix="$ac_optarg" ;;
+---
+>     prefix=$ac_optarg ;;
+302c1061
+<     program_prefix="$ac_optarg" ;;
+---
+>     program_prefix=$ac_optarg ;;
+309c1068
+<     program_suffix="$ac_optarg" ;;
+---
+>     program_suffix=$ac_optarg ;;
+326c1085,1095
+<     program_transform_name="$ac_optarg" ;;
+---
+>     program_transform_name=$ac_optarg ;;
+> 
+>   -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+>     ac_prev=pdfdir ;;
+>   -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+>     pdfdir=$ac_optarg ;;
+> 
+>   -psdir | --psdir | --psdi | --psd | --ps)
+>     ac_prev=psdir ;;
+>   -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+>     psdir=$ac_optarg ;;
+336c1105
+<     sbindir="$ac_optarg" ;;
+---
+>     sbindir=$ac_optarg ;;
+347c1116
+<     sharedstatedir="$ac_optarg" ;;
+---
+>     sharedstatedir=$ac_optarg ;;
+352c1121
+<     site="$ac_optarg" ;;
+---
+>     site=$ac_optarg ;;
+357c1126
+<     srcdir="$ac_optarg" ;;
+---
+>     srcdir=$ac_optarg ;;
+364c1133
+<     sysconfdir="$ac_optarg" ;;
+---
+>     sysconfdir=$ac_optarg ;;
+367c1136
+<     ac_prev=target ;;
+---
+>     ac_prev=target_alias ;;
+369c1138
+<     target="$ac_optarg" ;;
+---
+>     target_alias=$ac_optarg ;;
+374,376c1143,1144
+<   -version | --version | --versio | --versi | --vers)
+<     echo "configure generated by autoconf version 2.13"
+<     exit 0 ;;
+---
+>   -version | --version | --versio | --versi | --vers | -V)
+>     ac_init_version=: ;;
+379c1147
+<     ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+---
+>     ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+381,387c1149,1159
+<     if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+<       { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+<     fi
+<     ac_package=`echo $ac_package| sed 's/-/_/g'`
+<     case "$ac_option" in
+<       *=*) ;;
+<       *) ac_optarg=yes ;;
+---
+>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+>       { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+>    { (exit 1); exit 1; }; }
+>     ac_useropt_orig=$ac_useropt
+>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+>     case $ac_user_opts in
+>       *"
+> "with_$ac_useropt"
+> "*) ;;
+>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+> 	 ac_unrecognized_sep=', ';;
+389c1161
+<     eval "with_${ac_package}='$ac_optarg'" ;;
+---
+>     eval with_$ac_useropt=\$ac_optarg ;;
+392c1164
+<     ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+---
+>     ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+394,398c1166,1178
+<     if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+<       { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+<     fi
+<     ac_package=`echo $ac_package| sed 's/-/_/g'`
+<     eval "with_${ac_package}=no" ;;
+---
+>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+>       { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+>    { (exit 1); exit 1; }; }
+>     ac_useropt_orig=$ac_useropt
+>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+>     case $ac_user_opts in
+>       *"
+> "with_$ac_useropt"
+> "*) ;;
+>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+> 	 ac_unrecognized_sep=', ';;
+>     esac
+>     eval with_$ac_useropt=no ;;
+409c1189
+<     x_includes="$ac_optarg" ;;
+---
+>     x_includes=$ac_optarg ;;
+416c1196
+<     x_libraries="$ac_optarg" ;;
+---
+>     x_libraries=$ac_optarg ;;
+418c1198,1200
+<   -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+---
+>   -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+> Try \`$0 --help' for more information." >&2
+>    { (exit 1); exit 1; }; }
+420a1203,1211
+>   *=*)
+>     ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+>     # Reject names that are not valid shell variable names.
+>     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+>       { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+>    { (exit 1); exit 1; }; }
+>     eval $ac_envvar=\$ac_optarg
+>     export $ac_envvar ;;
+> 
+422,428c1213,1217
+<     if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+<       echo "configure: warning: $ac_option: invalid host type" 1>&2
+<     fi
+<     if test "x$nonopt" != xNONE; then
+<       { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+<     fi
+<     nonopt="$ac_option"
+---
+>     # FIXME: should be removed in autoconf 3.0.
+>     $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+>     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+>       $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+>     : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+435c1224,1226
+<   { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+---
+>   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+>   { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+>    { (exit 1); exit 1; }; }
+438,451c1229,1235
+< trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+< 
+< # File descriptor usage:
+< # 0 standard input
+< # 1 file creation
+< # 2 errors and warnings
+< # 3 some systems may open it to /dev/tty
+< # 4 used on the Kubota Titan
+< # 6 checking for... messages and results
+< # 5 compiler messages saved in config.log
+< if test "$silent" = yes; then
+<   exec 6>/dev/null
+< else
+<   exec 6>&1
+---
+> if test -n "$ac_unrecognized_opts"; then
+>   case $enable_option_checking in
+>     no) ;;
+>     fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+>    { (exit 1); exit 1; }; } ;;
+>     *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+>   esac
+453,458d1236
+< exec 5>./config.log
+< 
+< echo "\
+< This file contains any messages produced by compilers while
+< running configure, to aid debugging if configure makes a mistake.
+< " 1>&5
+460,463c1238,1242
+< # Strip out --no-create and --no-recursion so they do not pile up.
+< # Also quote any args containing shell metacharacters.
+< ac_configure_args=
+< for ac_arg
+---
+> # Check all directory arguments for consistency.
+> for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+> 		datadir sysconfdir sharedstatedir localstatedir includedir \
+> 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+> 		libdir localedir mandir
+465,472c1244,1254
+<   case "$ac_arg" in
+<   -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+<   | --no-cr | --no-c) ;;
+<   -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+<   | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+<   *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+<   ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+<   *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+---
+>   eval ac_val=\$$ac_var
+>   # Remove trailing slashes.
+>   case $ac_val in
+>     */ )
+>       ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+>       eval $ac_var=\$ac_val;;
+>   esac
+>   # Be sure to have absolute directory names.
+>   case $ac_val in
+>     [\\/$]* | ?:[\\/]* )  continue;;
+>     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+473a1256,1257
+>   { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+>    { (exit 1); exit 1; }; }
+476,484c1260,1291
+< # NLS nuisances.
+< # Only set these to C if already set.  These must not be set unconditionally
+< # because not all systems understand e.g. LANG=C (notably SCO).
+< # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+< # Non-C LC_CTYPE values break the ctype check.
+< if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+< if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+< if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+< if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+---
+> # There might be people who depend on the old broken behavior: `$host'
+> # used to hold the argument of --host etc.
+> # FIXME: To remove some day.
+> build=$build_alias
+> host=$host_alias
+> target=$target_alias
+> 
+> # FIXME: To remove some day.
+> if test "x$host_alias" != x; then
+>   if test "x$build_alias" = x; then
+>     cross_compiling=maybe
+>     $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+>     If a cross compiler is detected then cross compile mode will be used." >&2
+>   elif test "x$build_alias" != "x$host_alias"; then
+>     cross_compiling=yes
+>   fi
+> fi
+> 
+> ac_tool_prefix=
+> test -n "$host_alias" && ac_tool_prefix=$host_alias-
+> 
+> test "$silent" = yes && exec 6>/dev/null
+> 
+> 
+> ac_pwd=`pwd` && test -n "$ac_pwd" &&
+> ac_ls_di=`ls -di .` &&
+> ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+>   { $as_echo "$as_me: error: working directory cannot be determined" >&2
+>    { (exit 1); exit 1; }; }
+> test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+>   { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+>    { (exit 1); exit 1; }; }
+486,493d1292
+< # confdefs.h avoids OS command line length limits that DEFS can exceed.
+< rm -rf conftest* confdefs.h
+< # AIX cpp loses on an empty file, so make sure it contains at least a newline.
+< echo > confdefs.h
+< 
+< # A filename unique to this package, relative to the directory that
+< # configure is in, which we can look for to find out if srcdir is correct.
+< ac_unique_file=common/unicode/utypes.h
+498,501c1297,1320
+<   # Try the directory containing this script, then its parent.
+<   ac_prog=$0
+<   ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+<   test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+---
+>   # Try the directory containing this script, then the parent directory.
+>   ac_confdir=`$as_dirname -- "$as_myself" ||
+> $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+> 	 X"$as_myself" : 'X\(//\)[^/]' \| \
+> 	 X"$as_myself" : 'X\(//\)$' \| \
+> 	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+> $as_echo X"$as_myself" |
+>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)[^/].*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\).*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  s/.*/./; q'`
+503c1322
+<   if test ! -r $srcdir/$ac_unique_file; then
+---
+>   if test ! -r "$srcdir/$ac_unique_file"; then
+509,530c1328,1352
+< if test ! -r $srcdir/$ac_unique_file; then
+<   if test "$ac_srcdir_defaulted" = yes; then
+<     { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+<   else
+<     { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+<   fi
+< fi
+< srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+< 
+< # Prefer explicitly selected file to automatically selected ones.
+< if test -z "$CONFIG_SITE"; then
+<   if test "x$prefix" != xNONE; then
+<     CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+<   else
+<     CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+<   fi
+< fi
+< for ac_site_file in $CONFIG_SITE; do
+<   if test -r "$ac_site_file"; then
+<     echo "loading site script $ac_site_file"
+<     . "$ac_site_file"
+<   fi
+---
+> if test ! -r "$srcdir/$ac_unique_file"; then
+>   test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+>   { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+>    { (exit 1); exit 1; }; }
+> fi
+> ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+> ac_abs_confdir=`(
+> 	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+>    { (exit 1); exit 1; }; }
+> 	pwd)`
+> # When building in place, set srcdir=.
+> if test "$ac_abs_confdir" = "$ac_pwd"; then
+>   srcdir=.
+> fi
+> # Remove unnecessary trailing slashes from srcdir.
+> # Double slashes in file names in object file debugging info
+> # mess up M-x gdb in Emacs.
+> case $srcdir in
+> */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+> esac
+> for ac_var in $ac_precious_vars; do
+>   eval ac_env_${ac_var}_set=\${${ac_var}+set}
+>   eval ac_env_${ac_var}_value=\$${ac_var}
+>   eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+>   eval ac_cv_env_${ac_var}_value=\$${ac_var}
+533,539c1355,1362
+< if test -r "$cache_file"; then
+<   echo "loading cache $cache_file"
+<   . $cache_file
+< else
+<   echo "creating cache $cache_file"
+<   > $cache_file
+< fi
+---
+> #
+> # Report the --help message.
+> #
+> if test "$ac_init_help" = "long"; then
+>   # Omit some internal or obsolete options to make the list less imposing.
+>   # This message is too long to be a string in the A/UX 3.1 sh.
+>   cat <<_ACEOF
+> \`configure' configures this package to adapt to many kinds of systems.
+541,556c1364,1819
+< ac_ext=c
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CPP $CPPFLAGS'
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+< 
+< ac_exeext=
+< ac_objext=o
+< if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+<   # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+<   if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+<     ac_n= ac_c='
+< ' ac_t='	'
+<   else
+<     ac_n=-n ac_c= ac_t=
+---
+> Usage: $0 [OPTION]... [VAR=VALUE]...
+> 
+> To assign environment variables (e.g., CC, CFLAGS...), specify them as
+> VAR=VALUE.  See below for descriptions of some of the useful variables.
+> 
+> Defaults for the options are specified in brackets.
+> 
+> Configuration:
+>   -h, --help              display this help and exit
+>       --help=short        display options specific to this package
+>       --help=recursive    display the short help of all the included packages
+>   -V, --version           display version information and exit
+>   -q, --quiet, --silent   do not print \`checking...' messages
+>       --cache-file=FILE   cache test results in FILE [disabled]
+>   -C, --config-cache      alias for \`--cache-file=config.cache'
+>   -n, --no-create         do not create output files
+>       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+> 
+> Installation directories:
+>   --prefix=PREFIX         install architecture-independent files in PREFIX
+>                           [$ac_default_prefix]
+>   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+>                           [PREFIX]
+> 
+> By default, \`make install' will install all the files in
+> \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+> an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+> for instance \`--prefix=\$HOME'.
+> 
+> For better control, use the options below.
+> 
+> Fine tuning of the installation directories:
+>   --bindir=DIR            user executables [EPREFIX/bin]
+>   --sbindir=DIR           system admin executables [EPREFIX/sbin]
+>   --libexecdir=DIR        program executables [EPREFIX/libexec]
+>   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+>   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+>   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+>   --libdir=DIR            object code libraries [EPREFIX/lib]
+>   --includedir=DIR        C header files [PREFIX/include]
+>   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+>   --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+>   --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+>   --infodir=DIR           info documentation [DATAROOTDIR/info]
+>   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+>   --mandir=DIR            man documentation [DATAROOTDIR/man]
+>   --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
+>   --htmldir=DIR           html documentation [DOCDIR]
+>   --dvidir=DIR            dvi documentation [DOCDIR]
+>   --pdfdir=DIR            pdf documentation [DOCDIR]
+>   --psdir=DIR             ps documentation [DOCDIR]
+> _ACEOF
+> 
+>   cat <<\_ACEOF
+> 
+> System types:
+>   --build=BUILD     configure for building on BUILD [guessed]
+>   --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+> _ACEOF
+> fi
+> 
+> if test -n "$ac_init_help"; then
+> 
+>   cat <<\_ACEOF
+> 
+> Optional Features:
+>   --disable-option-checking  ignore unrecognized --enable/--with options
+>   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+>   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+>   --enable-strict         compile with strict compiler options default=no
+>   --enable-64bit-libs     build 64-bit libraries default=yes
+>   --enable-shared         build shared libraries default=yes
+>   --enable-static         build static libraries default=no
+>   --enable-debug          build debug libraries default=no
+>   --enable-release        build release libraries default=yes
+>   --enable-renaming       add a version suffix to symbols default=yes
+>   --enable-tracing        enable function and data tracing default=yes
+>   --enable-rpath          use rpath when linking default is only if necessary
+>   --enable-threads        build ICU with thread safety default=yes
+>   --enable-extras         build ICU extras default=yes
+>   --enable-icuio          build ICU's icuio library default=yes
+>   --enable-layout         build ICU's layout library default=yes
+> 
+>   --enable-tests          build ICU tests default=yes
+>   --enable-samples        build ICU samples default=yes
+> Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.
+> 
+> Optional Packages:
+>   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+>   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+>   --with-iostream=version specify the version of iostream to use (none, old, std, auto) default=auto
+>   --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) default=auto
+>   --with-library-suffix=suffix    tag a suffix to the library names default=
+> 
+> Some influential environment variables:
+>   CC          C compiler command
+>   CFLAGS      C compiler flags
+>   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+>               nonstandard directory <lib dir>
+>   LIBS        libraries to pass to the linker, e.g. -l<library>
+>   CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+>               you have headers in a nonstandard directory <include dir>
+>   CXX         C++ compiler command
+>   CXXFLAGS    C++ compiler flags
+>   CPP         C preprocessor
+>   CXXCPP      C++ preprocessor
+> 
+> Use these variables to override the choices made by `configure' or to help
+> it to find libraries and programs with nonstandard names/locations.
+> 
+> _ACEOF
+> ac_status=$?
+> fi
+> 
+> if test "$ac_init_help" = "recursive"; then
+>   # If there are subdirs, report their specific --help.
+>   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+>     test -d "$ac_dir" ||
+>       { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+>       continue
+>     ac_builddir=.
+> 
+> case "$ac_dir" in
+> .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+> *)
+>   ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+>   # A ".." for each directory in $ac_dir_suffix.
+>   ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+>   case $ac_top_builddir_sub in
+>   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+>   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+>   esac ;;
+> esac
+> ac_abs_top_builddir=$ac_pwd
+> ac_abs_builddir=$ac_pwd$ac_dir_suffix
+> # for backward compatibility:
+> ac_top_builddir=$ac_top_build_prefix
+> 
+> case $srcdir in
+>   .)  # We are building in place.
+>     ac_srcdir=.
+>     ac_top_srcdir=$ac_top_builddir_sub
+>     ac_abs_top_srcdir=$ac_pwd ;;
+>   [\\/]* | ?:[\\/]* )  # Absolute name.
+>     ac_srcdir=$srcdir$ac_dir_suffix;
+>     ac_top_srcdir=$srcdir
+>     ac_abs_top_srcdir=$srcdir ;;
+>   *) # Relative name.
+>     ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+>     ac_top_srcdir=$ac_top_build_prefix$srcdir
+>     ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+> esac
+> ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+> 
+>     cd "$ac_dir" || { ac_status=$?; continue; }
+>     # Check for guested configure.
+>     if test -f "$ac_srcdir/configure.gnu"; then
+>       echo &&
+>       $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+>     elif test -f "$ac_srcdir/configure"; then
+>       echo &&
+>       $SHELL "$ac_srcdir/configure" --help=recursive
+>     else
+>       $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+>     fi || ac_status=$?
+>     cd "$ac_pwd" || { ac_status=$?; break; }
+>   done
+> fi
+> 
+> test -n "$ac_init_help" && exit $ac_status
+> if $ac_init_version; then
+>   cat <<\_ACEOF
+> configure
+> generated by GNU Autoconf 2.63
+> 
+> Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+> 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+> This configure script is free software; the Free Software Foundation
+> gives unlimited permission to copy, distribute and modify it.
+> _ACEOF
+>   exit
+> fi
+> cat >config.log <<_ACEOF
+> This file contains any messages produced by compilers while
+> running configure, to aid debugging if configure makes a mistake.
+> 
+> It was created by $as_me, which was
+> generated by GNU Autoconf 2.63.  Invocation command line was
+> 
+>   $ $0 $@
+> 
+> _ACEOF
+> exec 5>>config.log
+> {
+> cat <<_ASUNAME
+> ## --------- ##
+> ## Platform. ##
+> ## --------- ##
+> 
+> hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+> uname -m = `(uname -m) 2>/dev/null || echo unknown`
+> uname -r = `(uname -r) 2>/dev/null || echo unknown`
+> uname -s = `(uname -s) 2>/dev/null || echo unknown`
+> uname -v = `(uname -v) 2>/dev/null || echo unknown`
+> 
+> /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+> /bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+> 
+> /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+> /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+> /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+> /usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+> /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+> /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+> /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+> 
+> _ASUNAME
+> 
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   $as_echo "PATH: $as_dir"
+> done
+> IFS=$as_save_IFS
+> 
+> } >&5
+> 
+> cat >&5 <<_ACEOF
+> 
+> 
+> ## ----------- ##
+> ## Core tests. ##
+> ## ----------- ##
+> 
+> _ACEOF
+> 
+> 
+> # Keep a trace of the command line.
+> # Strip out --no-create and --no-recursion so they do not pile up.
+> # Strip out --silent because we don't want to record it for future runs.
+> # Also quote any args containing shell meta-characters.
+> # Make two passes to allow for proper duplicate-argument suppression.
+> ac_configure_args=
+> ac_configure_args0=
+> ac_configure_args1=
+> ac_must_keep_next=false
+> for ac_pass in 1 2
+> do
+>   for ac_arg
+>   do
+>     case $ac_arg in
+>     -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+>     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+>     | -silent | --silent | --silen | --sile | --sil)
+>       continue ;;
+>     *\'*)
+>       ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+>     esac
+>     case $ac_pass in
+>     1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+>     2)
+>       ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+>       if test $ac_must_keep_next = true; then
+> 	ac_must_keep_next=false # Got value, back to normal.
+>       else
+> 	case $ac_arg in
+> 	  *=* | --config-cache | -C | -disable-* | --disable-* \
+> 	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+> 	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+> 	  | -with-* | --with-* | -without-* | --without-* | --x)
+> 	    case "$ac_configure_args0 " in
+> 	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+> 	    esac
+> 	    ;;
+> 	  -* ) ac_must_keep_next=true ;;
+> 	esac
+>       fi
+>       ac_configure_args="$ac_configure_args '$ac_arg'"
+>       ;;
+>     esac
+>   done
+> done
+> $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+> $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+> 
+> # When interrupted or exit'd, cleanup temporary files, and complete
+> # config.log.  We remove comments because anyway the quotes in there
+> # would cause problems or look ugly.
+> # WARNING: Use '\'' to represent an apostrophe within the trap.
+> # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+> trap 'exit_status=$?
+>   # Save into config.log some information that might help in debugging.
+>   {
+>     echo
+> 
+>     cat <<\_ASBOX
+> ## ---------------- ##
+> ## Cache variables. ##
+> ## ---------------- ##
+> _ASBOX
+>     echo
+>     # The following way of writing the cache mishandles newlines in values,
+> (
+>   for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+>     eval ac_val=\$$ac_var
+>     case $ac_val in #(
+>     *${as_nl}*)
+>       case $ac_var in #(
+>       *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+> $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+>       esac
+>       case $ac_var in #(
+>       _ | IFS | as_nl) ;; #(
+>       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+>       *) $as_unset $ac_var ;;
+>       esac ;;
+>     esac
+>   done
+>   (set) 2>&1 |
+>     case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+>     *${as_nl}ac_space=\ *)
+>       sed -n \
+> 	"s/'\''/'\''\\\\'\'''\''/g;
+> 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+>       ;; #(
+>     *)
+>       sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+>       ;;
+>     esac |
+>     sort
+> )
+>     echo
+> 
+>     cat <<\_ASBOX
+> ## ----------------- ##
+> ## Output variables. ##
+> ## ----------------- ##
+> _ASBOX
+>     echo
+>     for ac_var in $ac_subst_vars
+>     do
+>       eval ac_val=\$$ac_var
+>       case $ac_val in
+>       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+>       esac
+>       $as_echo "$ac_var='\''$ac_val'\''"
+>     done | sort
+>     echo
+> 
+>     if test -n "$ac_subst_files"; then
+>       cat <<\_ASBOX
+> ## ------------------- ##
+> ## File substitutions. ##
+> ## ------------------- ##
+> _ASBOX
+>       echo
+>       for ac_var in $ac_subst_files
+>       do
+> 	eval ac_val=\$$ac_var
+> 	case $ac_val in
+> 	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+> 	esac
+> 	$as_echo "$ac_var='\''$ac_val'\''"
+>       done | sort
+>       echo
+>     fi
+> 
+>     if test -s confdefs.h; then
+>       cat <<\_ASBOX
+> ## ----------- ##
+> ## confdefs.h. ##
+> ## ----------- ##
+> _ASBOX
+>       echo
+>       cat confdefs.h
+>       echo
+>     fi
+>     test "$ac_signal" != 0 &&
+>       $as_echo "$as_me: caught signal $ac_signal"
+>     $as_echo "$as_me: exit $exit_status"
+>   } >&5
+>   rm -f core *.core core.conftest.* &&
+>     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+>     exit $exit_status
+> ' 0
+> for ac_signal in 1 2 13 15; do
+>   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+> done
+> ac_signal=0
+> 
+> # confdefs.h avoids OS command line length limits that DEFS can exceed.
+> rm -f -r conftest* confdefs.h
+> 
+> # Predefined preprocessor variables.
+> 
+> cat >>confdefs.h <<_ACEOF
+> #define PACKAGE_NAME "$PACKAGE_NAME"
+> _ACEOF
+> 
+> 
+> cat >>confdefs.h <<_ACEOF
+> #define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+> _ACEOF
+> 
+> 
+> cat >>confdefs.h <<_ACEOF
+> #define PACKAGE_VERSION "$PACKAGE_VERSION"
+> _ACEOF
+> 
+> 
+> cat >>confdefs.h <<_ACEOF
+> #define PACKAGE_STRING "$PACKAGE_STRING"
+> _ACEOF
+> 
+> 
+> cat >>confdefs.h <<_ACEOF
+> #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+> _ACEOF
+> 
+> 
+> # Let the site file select an alternate cache file if it wants to.
+> # Prefer an explicitly selected file to automatically selected ones.
+> ac_site_file1=NONE
+> ac_site_file2=NONE
+> if test -n "$CONFIG_SITE"; then
+>   ac_site_file1=$CONFIG_SITE
+> elif test "x$prefix" != xNONE; then
+>   ac_site_file1=$prefix/share/config.site
+>   ac_site_file2=$prefix/etc/config.site
+> else
+>   ac_site_file1=$ac_default_prefix/share/config.site
+>   ac_site_file2=$ac_default_prefix/etc/config.site
+> fi
+> for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+> do
+>   test "x$ac_site_file" = xNONE && continue
+>   if test -r "$ac_site_file"; then
+>     { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+> $as_echo "$as_me: loading site script $ac_site_file" >&6;}
+>     sed 's/^/| /' "$ac_site_file" >&5
+>     . "$ac_site_file"
+>   fi
+> done
+> 
+> if test -r "$cache_file"; then
+>   # Some versions of bash will fail to source /dev/null (special
+>   # files actually), so we avoid doing that.
+>   if test -f "$cache_file"; then
+>     { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+> $as_echo "$as_me: loading cache $cache_file" >&6;}
+>     case $cache_file in
+>       [\\/]* | ?:[\\/]* ) . "$cache_file";;
+>       *)                      . "./$cache_file";;
+>     esac
+559c1822,1884
+<   ac_n= ac_c='\c' ac_t=
+---
+>   { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+> $as_echo "$as_me: creating cache $cache_file" >&6;}
+>   >$cache_file
+> fi
+> 
+> # Check that the precious variables saved in the cache have kept the same
+> # value.
+> ac_cache_corrupted=false
+> for ac_var in $ac_precious_vars; do
+>   eval ac_old_set=\$ac_cv_env_${ac_var}_set
+>   eval ac_new_set=\$ac_env_${ac_var}_set
+>   eval ac_old_val=\$ac_cv_env_${ac_var}_value
+>   eval ac_new_val=\$ac_env_${ac_var}_value
+>   case $ac_old_set,$ac_new_set in
+>     set,)
+>       { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+> $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+>       ac_cache_corrupted=: ;;
+>     ,set)
+>       { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+> $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+>       ac_cache_corrupted=: ;;
+>     ,);;
+>     *)
+>       if test "x$ac_old_val" != "x$ac_new_val"; then
+> 	# differences in whitespace do not lead to failure.
+> 	ac_old_val_w=`echo x $ac_old_val`
+> 	ac_new_val_w=`echo x $ac_new_val`
+> 	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+> 	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+> $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+> 	  ac_cache_corrupted=:
+> 	else
+> 	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+> $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+> 	  eval $ac_var=\$ac_old_val
+> 	fi
+> 	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+> $as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+> 	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+> $as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+>       fi;;
+>   esac
+>   # Pass precious variables to config.status.
+>   if test "$ac_new_set" = set; then
+>     case $ac_new_val in
+>     *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+>     *) ac_arg=$ac_var=$ac_new_val ;;
+>     esac
+>     case " $ac_configure_args " in
+>       *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+>       *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+>     esac
+>   fi
+> done
+> if $ac_cache_corrupted; then
+>   { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+>   { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+> $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+>   { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+> $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+>    { (exit 1); exit 1; }; }
+564a1890,1912
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> 
+> 
+> 
+> ac_config_headers="$ac_config_headers common/icucfg.h"
+> 
+568,569c1916,1917
+< echo $ac_n "checking for ICU version numbers""... $ac_c" 1>&6
+< echo "configure:570: checking for ICU version numbers" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking for ICU version numbers" >&5
+> $as_echo_n "checking for ICU version numbers... " >&6; }
+578c1926,1928
+<         { echo "configure: error: Cannot determine ICU version number from header files" 1>&2; exit 1; }
+---
+>         { { $as_echo "$as_me:$LINENO: error: Cannot determine ICU version number from header files" >&5
+> $as_echo "$as_me: error: Cannot determine ICU version number from header files" >&2;}
+>    { (exit 1); exit 1; }; }
+586c1936,1937
+< echo "$ac_t""release $VERSION, library $LIB_VERSION" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: release $VERSION, library $LIB_VERSION" >&5
+> $as_echo "release $VERSION, library $LIB_VERSION" >&6; }
+594c1945,1991
+< # Extract the first word of "gcc", so it can be a program name with args.
+---
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> if test -n "$ac_tool_prefix"; then
+>   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+> set dummy ${ac_tool_prefix}gcc; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test -n "$CC"; then
+>   ac_cv_prog_CC="$CC" # Let the user override the test.
+> else
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_CC="${ac_tool_prefix}gcc"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+> fi
+> fi
+> CC=$ac_cv_prog_CC
+> if test -n "$CC"; then
+>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
+> $as_echo "$CC" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+> fi
+> 
+> 
+> fi
+> if test -z "$ac_cv_prog_CC"; then
+>   ac_ct_CC=$CC
+>   # Extract the first word of "gcc", so it can be a program name with args.
+596,599c1993,2049
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:598: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test -n "$ac_ct_CC"; then
+>   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+> else
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_ac_ct_CC="gcc"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+> fi
+> fi
+> ac_ct_CC=$ac_cv_prog_ac_ct_CC
+> if test -n "$ac_ct_CC"; then
+>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+> $as_echo "$ac_ct_CC" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+> fi
+> 
+>   if test "x$ac_ct_CC" = x; then
+>     CC=""
+>   else
+>     case $cross_compiling:$ac_tool_warned in
+> yes:)
+> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+> ac_tool_warned=yes ;;
+> esac
+>     CC=$ac_ct_CC
+>   fi
+> else
+>   CC="$ac_cv_prog_CC"
+> fi
+> 
+> if test -z "$CC"; then
+>           if test -n "$ac_tool_prefix"; then
+>     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+> set dummy ${ac_tool_prefix}cc; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+604,613c2054,2068
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_prog_CC="gcc"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_CC="${ac_tool_prefix}cc"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+616c2071
+< CC="$ac_cv_prog_CC"
+---
+> CC=$ac_cv_prog_CC
+618c2073,2074
+<   echo "$ac_t""$CC" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
+> $as_echo "$CC" >&6; }
+620c2076,2077
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+622a2080,2082
+> 
+>   fi
+> fi
+626,629c2086,2089
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:628: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+634d2093
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+636,648c2095,2113
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+<         ac_prog_rejected=yes
+< 	continue
+<       fi
+<       ac_cv_prog_CC="cc"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+>        ac_prog_rejected=yes
+>        continue
+>      fi
+>     ac_cv_prog_CC="cc"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+653c2118
+<   if test $# -gt 0; then
+---
+>   if test $# != 0; then
+658,660c2123
+<     set dummy "$ac_dir/$ac_word" "$@"
+<     shift
+<     ac_cv_prog_CC="$@"
+---
+>     ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+665c2128
+< CC="$ac_cv_prog_CC"
+---
+> CC=$ac_cv_prog_CC
+667c2130,2131
+<   echo "$ac_t""$CC" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
+> $as_echo "$CC" >&6; }
+669c2133,2134
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+672,680c2137,2148
+<   if test -z "$CC"; then
+<     case "`uname -s`" in
+<     *win32* | *WIN32*)
+<       # Extract the first word of "cl", so it can be a program name with args.
+< set dummy cl; ac_word=$2
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:679: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 
+> fi
+> if test -z "$CC"; then
+>   if test -n "$ac_tool_prefix"; then
+>   for ac_prog in cl.exe
+>   do
+>     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+> set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+685,694c2153,2167
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_prog_CC="cl"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+697c2170
+< CC="$ac_cv_prog_CC"
+---
+> CC=$ac_cv_prog_CC
+699c2172,2173
+<   echo "$ac_t""$CC" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
+> $as_echo "$CC" >&6; }
+701c2175,2176
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+703,704c2178,2206
+<  ;;
+<     esac
+---
+> 
+> 
+>     test -n "$CC" && break
+>   done
+> fi
+> if test -z "$CC"; then
+>   ac_ct_CC=$CC
+>   for ac_prog in cl.exe
+> do
+>   # Extract the first word of "$ac_prog", so it can be a program name with args.
+> set dummy $ac_prog; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test -n "$ac_ct_CC"; then
+>   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+> else
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_ac_ct_CC="$ac_prog"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+706c2208,2220
+<   test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+---
+> done
+> done
+> IFS=$as_save_IFS
+> 
+> fi
+> fi
+> ac_ct_CC=$ac_cv_prog_ac_ct_CC
+> if test -n "$ac_ct_CC"; then
+>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+> $as_echo "$ac_ct_CC" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+709,710d2222
+< echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+< echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+712,730c2224,2228
+< ac_ext=c
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CPP $CPPFLAGS'
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+< 
+< cat > conftest.$ac_ext << EOF
+< 
+< #line 722 "configure"
+< #include "confdefs.h"
+< 
+< main(){return(0);}
+< EOF
+< if { (eval echo configure:727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   ac_cv_prog_cc_works=yes
+<   # If we can't run a trivial program, we are probably using a cross compiler.
+<   if (./conftest; exit) 2>/dev/null; then
+<     ac_cv_prog_cc_cross=no
+---
+>   test -n "$ac_ct_CC" && break
+> done
+> 
+>   if test "x$ac_ct_CC" = x; then
+>     CC=""
+732c2230,2236
+<     ac_cv_prog_cc_cross=yes
+---
+>     case $cross_compiling:$ac_tool_warned in
+> yes:)
+> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+> ac_tool_warned=yes ;;
+> esac
+>     CC=$ac_ct_CC
+734,737d2237
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   ac_cv_prog_cc_works=no
+739,745d2238
+< rm -fr conftest*
+< ac_ext=c
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CPP $CPPFLAGS'
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+747,749d2239
+< echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+< if test $ac_cv_prog_cc_works = no; then
+<   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+751,754d2240
+< echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+< echo "configure:753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+< echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+< cross_compiling=$ac_cv_prog_cc_cross
+756,767c2242,2368
+< echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+< echo "configure:758: checking whether we are using GNU C" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.c <<EOF
+< #ifdef __GNUC__
+<   yes;
+< #endif
+< EOF
+< if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:767: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+<   ac_cv_prog_gcc=yes
+---
+> 
+> test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+> 
+> # Provide some information about the compiler.
+> $as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+> set X $ac_compile
+> ac_compiler=$2
+> { (ac_try="$ac_compiler --version >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler --version >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> { (ac_try="$ac_compiler -v >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler -v >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> { (ac_try="$ac_compiler -V >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler -V >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> 
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> ac_clean_files_save=$ac_clean_files
+> ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+> # Try to create an executable without -o first, disregard a.out.
+> # It will help us diagnose broken compilers, and finding out an intuition
+> # of exeext.
+> { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+> $as_echo_n "checking for C compiler default output file name... " >&6; }
+> ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+> 
+> # The possible output files:
+> ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+> 
+> ac_rmfiles=
+> for ac_file in $ac_files
+> do
+>   case $ac_file in
+>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+>     * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+>   esac
+> done
+> rm -f $ac_rmfiles
+> 
+> if { (ac_try="$ac_link_default"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link_default") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; then
+>   # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+> # So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+> # in a Makefile.  We should not override ac_cv_exeext if it was cached,
+> # so that the user can short-circuit this test for compilers unknown to
+> # Autoconf.
+> for ac_file in $ac_files ''
+> do
+>   test -f "$ac_file" || continue
+>   case $ac_file in
+>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+> 	;;
+>     [ab].out )
+> 	# We found the default executable, but exeext='' is most
+> 	# certainly right.
+> 	break;;
+>     *.* )
+>         if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+> 	then :; else
+> 	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+> 	fi
+> 	# We set ac_cv_exeext here because the later test for it is not
+> 	# safe: cross compilers may not add the suffix if given an `-o'
+> 	# argument, so we may need to know it at that point already.
+> 	# Even if this section looks crufty: it has the advantage of
+> 	# actually working.
+> 	break;;
+>     * )
+> 	break;;
+>   esac
+> done
+> test "$ac_cv_exeext" = no && ac_cv_exeext=
+> 
+769c2370
+<   ac_cv_prog_gcc=no
+---
+>   ac_file=''
+770a2372,2423
+> 
+> { $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+> $as_echo "$ac_file" >&6; }
+> if test -z "$ac_file"; then
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: C compiler cannot create executables
+> See \`config.log' for more details." >&2;}
+>    { (exit 77); exit 77; }; }; }
+> fi
+> 
+> ac_exeext=$ac_cv_exeext
+> 
+> # Check that the compiler produces executables we can run.  If not, either
+> # the compiler is broken, or we cross compile.
+> { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+> $as_echo_n "checking whether the C compiler works... " >&6; }
+> # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+> # If not cross compiling, check that we can run a simple program.
+> if test "$cross_compiling" != yes; then
+>   if { ac_try='./$ac_file'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+>     cross_compiling=no
+>   else
+>     if test "$cross_compiling" = maybe; then
+> 	cross_compiling=yes
+>     else
+> 	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
+> If you meant to cross compile, use \`--host'.
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: cannot run C compiled programs.
+> If you meant to cross compile, use \`--host'.
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+>     fi
+>   fi
+771a2425,2426
+> { $as_echo "$as_me:$LINENO: result: yes" >&5
+> $as_echo "yes" >&6; }
+773c2428,2549
+< echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+---
+> rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+> ac_clean_files=$ac_clean_files_save
+> # Check that the compiler produces executables we can run.  If not, either
+> # the compiler is broken, or we cross compile.
+> { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+> $as_echo_n "checking whether we are cross compiling... " >&6; }
+> { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+> $as_echo "$cross_compiling" >&6; }
+> 
+> { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+> $as_echo_n "checking for suffix of executables... " >&6; }
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; then
+>   # If both `conftest.exe' and `conftest' are `present' (well, observable)
+> # catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+> # work properly (i.e., refer to `conftest.exe'), while it won't with
+> # `rm'.
+> for ac_file in conftest.exe conftest conftest.*; do
+>   test -f "$ac_file" || continue
+>   case $ac_file in
+>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+>     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+> 	  break;;
+>     * ) break;;
+>   esac
+> done
+> else
+>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+> fi
+> 
+> rm -f conftest$ac_cv_exeext
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+> $as_echo "$ac_cv_exeext" >&6; }
+> 
+> rm -f conftest.$ac_ext
+> EXEEXT=$ac_cv_exeext
+> ac_exeext=$EXEEXT
+> { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+> $as_echo_n "checking for suffix of object files... " >&6; }
+> if test "${ac_cv_objext+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.o conftest.obj
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; then
+>   for ac_file in conftest.o conftest.obj conftest.*; do
+>   test -f "$ac_file" || continue;
+>   case $ac_file in
+>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+>     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+>        break;;
+>   esac
+> done
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+> fi
+> 
+> rm -f conftest.$ac_cv_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+> $as_echo "$ac_cv_objext" >&6; }
+> OBJEXT=$ac_cv_objext
+> ac_objext=$OBJEXT
+> { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+> $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+> if test "${ac_cv_c_compiler_gnu+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+775c2551,2594
+< if test $ac_cv_prog_gcc = yes; then
+---
+> int
+> main ()
+> {
+> #ifndef __GNUC__
+>        choke me
+> #endif
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_compiler_gnu=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_compiler_gnu=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> ac_cv_c_compiler_gnu=$ac_compiler_gnu
+> 
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+> $as_echo "$ac_cv_c_compiler_gnu" >&6; }
+> if test $ac_compiler_gnu = yes; then
+779a2599,2658
+> ac_test_CFLAGS=${CFLAGS+set}
+> ac_save_CFLAGS=$CFLAGS
+> { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+> $as_echo_n "checking whether $CC accepts -g... " >&6; }
+> if test "${ac_cv_prog_cc_g+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_save_c_werror_flag=$ac_c_werror_flag
+>    ac_c_werror_flag=yes
+>    ac_cv_prog_cc_g=no
+>    CFLAGS="-g"
+>    cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_cv_prog_cc_g=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	CFLAGS=""
+>       cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+781,787c2660,2682
+< ac_test_CFLAGS="${CFLAGS+set}"
+< ac_save_CFLAGS="$CFLAGS"
+< CFLAGS=
+< echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+< echo "configure:786: checking whether ${CC-cc} accepts -g" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+789,790c2684,2721
+<   echo 'void f(){}' > conftest.c
+< if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_c_werror_flag=$ac_save_c_werror_flag
+> 	 CFLAGS="-g"
+> 	 cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+793c2724,2727
+<   ac_cv_prog_cc_g=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+795d2728
+< rm -f conftest*
+796a2730
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+799c2733,2740
+< echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+>    ac_c_werror_flag=$ac_save_c_werror_flag
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+> $as_echo "$ac_cv_prog_cc_g" >&6; }
+801c2742
+<   CFLAGS="$ac_save_CFLAGS"
+---
+>   CFLAGS=$ac_save_CFLAGS
+814a2756,2790
+> { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+> $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+> if test "${ac_cv_prog_cc_c89+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_cv_prog_cc_c89=no
+> ac_save_CC=$CC
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <stdarg.h>
+> #include <stdio.h>
+> #include <sys/types.h>
+> #include <sys/stat.h>
+> /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+> struct buf { int x; };
+> FILE * (*rcsopen) (struct buf *, struct stat *, int);
+> static char *e (p, i)
+>      char **p;
+>      int i;
+> {
+>   return p[i];
+> }
+> static char *f (char * (*g) (char **, int), char **p, ...)
+> {
+>   char *s;
+>   va_list v;
+>   va_start (v,p);
+>   s = g (p, va_arg (v,int));
+>   va_end (v);
+>   return s;
+> }
+816c2792,2821
+< for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
+---
+> /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+>    function prototypes and stuff, but not '\xHH' hex character constants.
+>    These don't provoke an error unfortunately, instead are silently treated
+>    as 'x'.  The following induces an error, until -std is added to get
+>    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+>    array size at least.  It's necessary to write '\x00'==0 to get something
+>    that's true only with -std.  */
+> int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+> 
+> /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+>    inside strings and character constants.  */
+> #define FOO(x) 'x'
+> int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+> 
+> int test (int i, double x);
+> struct s1 {int (*f) (int a);};
+> struct s2 {int (*f) (double a);};
+> int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+> int argc;
+> char **argv;
+> int
+> main ()
+> {
+> return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+> 	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+818,823c2823,2895
+< # Extract the first word of "$ac_prog", so it can be a program name with args.
+< set dummy $ac_prog; ac_word=$2
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:822: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   CC="$ac_save_CC $ac_arg"
+>   rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_cv_prog_cc_c89=$ac_arg
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext
+>   test "x$ac_cv_prog_cc_c89" != "xno" && break
+> done
+> rm -f conftest.$ac_ext
+> CC=$ac_save_CC
+> 
+> fi
+> # AC_CACHE_VAL
+> case "x$ac_cv_prog_cc_c89" in
+>   x)
+>     { $as_echo "$as_me:$LINENO: result: none needed" >&5
+> $as_echo "none needed" >&6; } ;;
+>   xno)
+>     { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+> $as_echo "unsupported" >&6; } ;;
+>   *)
+>     CC="$CC $ac_cv_prog_cc_c89"
+>     { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+> $as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+> esac
+> 
+> 
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> 
+> ac_ext=cpp
+> ac_cpp='$CXXCPP $CPPFLAGS'
+> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+> if test -z "$CXX"; then
+>   if test -n "$CCC"; then
+>     CXX=$CCC
+>   else
+>     if test -n "$ac_tool_prefix"; then
+>   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+>   do
+>     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+> set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_CXX+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+828,837c2900,2914
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_prog_CXX="$ac_prog"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+840c2917
+< CXX="$ac_cv_prog_CXX"
+---
+> CXX=$ac_cv_prog_CXX
+842c2919,2920
+<   echo "$ac_t""$CXX" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $CXX" >&5
+> $as_echo "$CXX" >&6; }
+844c2922,2923
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+847c2926,2955
+< test -n "$CXX" && break
+---
+> 
+>     test -n "$CXX" && break
+>   done
+> fi
+> if test -z "$CXX"; then
+>   ac_ct_CXX=$CXX
+>   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+> do
+>   # Extract the first word of "$ac_prog", so it can be a program name with args.
+> set dummy $ac_prog; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test -n "$ac_ct_CXX"; then
+>   ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+> else
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_ac_ct_CXX="$ac_prog"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+849c2957,2968
+< test -n "$CXX" || CXX="gcc"
+---
+> IFS=$as_save_IFS
+> 
+> fi
+> fi
+> ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+> if test -n "$ac_ct_CXX"; then
+>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+> $as_echo "$ac_ct_CXX" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+> fi
+852,853c2971,2972
+< echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+< echo "configure:854: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+---
+>   test -n "$ac_ct_CXX" && break
+> done
+855,873c2974,2975
+< ac_ext=C
+< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CXXCPP $CPPFLAGS'
+< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cxx_cross
+< 
+< cat > conftest.$ac_ext << EOF
+< 
+< #line 865 "configure"
+< #include "confdefs.h"
+< 
+< int main(){return(0);}
+< EOF
+< if { (eval echo configure:870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   ac_cv_prog_cxx_works=yes
+<   # If we can't run a trivial program, we are probably using a cross compiler.
+<   if (./conftest; exit) 2>/dev/null; then
+<     ac_cv_prog_cxx_cross=no
+---
+>   if test "x$ac_ct_CXX" = x; then
+>     CXX="g++"
+875c2977,2983
+<     ac_cv_prog_cxx_cross=yes
+---
+>     case $cross_compiling:$ac_tool_warned in
+> yes:)
+> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+> ac_tool_warned=yes ;;
+> esac
+>     CXX=$ac_ct_CXX
+877,880d2984
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   ac_cv_prog_cxx_works=no
+882,888d2985
+< rm -fr conftest*
+< ac_ext=c
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CPP $CPPFLAGS'
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+890,892c2987
+< echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+< if test $ac_cv_prog_cxx_works = no; then
+<   { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
+---
+>   fi
+894,897c2989,3037
+< echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+< echo "configure:896: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+< echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+< cross_compiling=$ac_cv_prog_cxx_cross
+---
+> # Provide some information about the compiler.
+> $as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+> set X $ac_compile
+> ac_compiler=$2
+> { (ac_try="$ac_compiler --version >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler --version >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> { (ac_try="$ac_compiler -v >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler -v >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> { (ac_try="$ac_compiler -V >&5"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compiler -V >&5") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }
+> 
+> { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+> $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+> if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+899,906c3039,3043
+< echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+< echo "configure:901: checking whether we are using GNU C++" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.C <<EOF
+< #ifdef __GNUC__
+<   yes;
+---
+> int
+> main ()
+> {
+> #ifndef __GNUC__
+>        choke me
+908,916d3044
+< EOF
+< if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+<   ac_cv_prog_gxx=yes
+< else
+<   ac_cv_prog_gxx=no
+< fi
+< fi
+< 
+< echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+918c3046,3082
+< if test $ac_cv_prog_gxx = yes; then
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_compiler_gnu=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_compiler_gnu=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+> 
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+> $as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+> if test $ac_compiler_gnu = yes; then
+922a3087,3107
+> ac_test_CXXFLAGS=${CXXFLAGS+set}
+> ac_save_CXXFLAGS=$CXXFLAGS
+> { $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+> $as_echo_n "checking whether $CXX accepts -g... " >&6; }
+> if test "${ac_cv_prog_cxx_g+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+>    ac_cxx_werror_flag=yes
+>    ac_cv_prog_cxx_g=no
+>    CXXFLAGS="-g"
+>    cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+924,930c3109,3131
+< ac_test_CXXFLAGS="${CXXFLAGS+set}"
+< ac_save_CXXFLAGS="$CXXFLAGS"
+< CXXFLAGS=
+< echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+< echo "configure:929: checking whether ${CXX-g++} accepts -g" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_cv_prog_cxx_g=yes
+932,933c3133,3209
+<   echo 'void f(){}' > conftest.cc
+< if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	CXXFLAGS=""
+>       cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+> 	 CXXFLAGS="-g"
+> 	 cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+936c3212,3218
+<   ac_cv_prog_cxx_g=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+938d3219
+< rm -f conftest*
+939a3221
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+942c3224,3228
+< echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+>    ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+> $as_echo "$ac_cv_prog_cxx_g" >&6; }
+944c3230
+<   CXXFLAGS="$ac_save_CXXFLAGS"
+---
+>   CXXFLAGS=$ac_save_CXXFLAGS
+957a3244,3248
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+960,961c3251,3252
+< for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+<   if test -f $ac_dir/install-sh; then
+---
+> for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+>   if test -f "$ac_dir/install-sh"; then
+965c3256
+<   elif test -f $ac_dir/install.sh; then
+---
+>   elif test -f "$ac_dir/install.sh"; then
+968a3260,3263
+>   elif test -f "$ac_dir/shtool"; then
+>     ac_aux_dir=$ac_dir
+>     ac_install_sh="$ac_aux_dir/shtool install -c"
+>     break
+972c3267,3269
+<   { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+---
+>   { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+> $as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+>    { (exit 1); exit 1; }; }
+974,976c3271,3279
+< ac_config_guess=$ac_aux_dir/config.guess
+< ac_config_sub=$ac_aux_dir/config.sub
+< ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+---
+> 
+> # These three variables are undocumented and unsupported,
+> # and are intended to be withdrawn in a future Autoconf release.
+> # They can cause serious problems if a builder's source tree is in a directory
+> # whose full name contains unusual characters.
+> ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+> ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+> ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+> 
+984a3288
+> # AmigaOS /C/install, which installs bootblocks on floppy discs
+987a3292
+> # OS/2's system install, which has a completely different semantic
+989,990c3294,3296
+< echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+< echo "configure:991: checking for a BSD compatible install" >&5
+---
+> # Reject install programs that cannot install multiple files.
+> { $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+> $as_echo_n "checking for a BSD-compatible install... " >&6; }
+992,993c3298,3299
+< if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> if test "${ac_cv_path_install+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+995,1005c3301,3318
+<     IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
+<   for ac_dir in $PATH; do
+<     # Account for people who put trailing slashes in PATH elements.
+<     case "$ac_dir/" in
+<     /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+<     *)
+<       # OSF1 and SCO ODT 3.0 have their own names for install.
+<       # Don't use installbsd from OSF since it installs stuff as root
+<       # by default.
+<       for ac_prog in ginstall scoinst install; do
+<         if test -f $ac_dir/$ac_prog; then
+---
+>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   # Account for people who put trailing slashes in PATH elements.
+> case $as_dir/ in
+>   ./ | .// | /cC/* | \
+>   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+>   ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+>   /usr/ucb/* ) ;;
+>   *)
+>     # OSF1 and SCO ODT 3.0 have their own names for install.
+>     # Don't use installbsd from OSF since it installs stuff as root
+>     # by default.
+>     for ac_prog in ginstall scoinst install; do
+>       for ac_exec_ext in '' $ac_executable_extensions; do
+> 	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+1007c3320
+<             grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+---
+> 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+1009a3323,3326
+> 	  elif test $ac_prog = install &&
+> 	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+> 	    # program-specific install script used by HP pwplus--don't use.
+> 	    :
+1011,1012c3328,3339
+< 	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+< 	    break 2
+---
+> 	    rm -rf conftest.one conftest.two conftest.dir
+> 	    echo one > conftest.one
+> 	    echo two > conftest.two
+> 	    mkdir conftest.dir
+> 	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+> 	      test -s conftest.one && test -s conftest.two &&
+> 	      test -s conftest.dir/conftest.one &&
+> 	      test -s conftest.dir/conftest.two
+> 	    then
+> 	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+> 	      break 3
+> 	    fi
+1016,1019c3343,3350
+<       ;;
+<     esac
+<   done
+<   IFS="$ac_save_IFS"
+---
+>     done
+>     ;;
+> esac
+> 
+> done
+> IFS=$as_save_IFS
+> 
+> rm -rf conftest.one conftest.two conftest.dir
+1023c3354
+<     INSTALL="$ac_cv_path_install"
+---
+>     INSTALL=$ac_cv_path_install
+1025,1026c3356,3357
+<     # As a last resort, use the slow shell script.  We don't cache a
+<     # path for INSTALL within a source directory, because that will
+---
+>     # As a last resort, use the slow shell script.  Don't cache a
+>     # value for INSTALL within a source directory, because that will
+1028,1029c3359,3360
+<     # removed, or if the path is relative.
+<     INSTALL="$ac_install_sh"
+---
+>     # removed, or if the value is a relative name.
+>     INSTALL=$ac_install_sh
+1032c3363,3364
+< echo "$ac_t""$INSTALL" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+> $as_echo "$INSTALL" >&6; }
+1038c3370
+< test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+---
+> test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+1054,1057c3386,3389
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:1056: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_STRIP+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1062,1071c3394,3408
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_prog_STRIP="strip"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_STRIP="strip"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+1075c3412
+< STRIP="$ac_cv_prog_STRIP"
+---
+> STRIP=$ac_cv_prog_STRIP
+1077c3414,3415
+<   echo "$ac_t""$STRIP" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+> $as_echo "$STRIP" >&6; }
+1079c3417,3418
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+1082a3422
+> 
+1085c3425
+< # Extract the first word of "$ac_prog", so it can be a program name with args.
+---
+>   # Extract the first word of "$ac_prog", so it can be a program name with args.
+1087,1090c3427,3430
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:1089: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_path_U_MAKE'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_path_U_MAKE+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1092,1093c3432,3433
+<   case "$U_MAKE" in
+<   /*)
+---
+>   case $U_MAKE in
+>   [\\/]* | ?:[\\/]*)
+1096,1098d3435
+<   ?:/*)			 
+<   ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a dos path.
+<   ;;
+1100,1109c3437,3451
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do 
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_path_U_MAKE="$ac_dir/$ac_word"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_path_U_MAKE="$as_dir/$ac_word$ac_exec_ext"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+1113c3455
+< U_MAKE="$ac_cv_path_U_MAKE"
+---
+> U_MAKE=$ac_cv_path_U_MAKE
+1115c3457,3458
+<   echo "$ac_t""$U_MAKE" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $U_MAKE" >&5
+> $as_echo "$U_MAKE" >&6; }
+1117c3460,3461
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+1120c3464,3465
+< test -n "$U_MAKE" && break
+---
+> 
+>   test -n "$U_MAKE" && break
+1128,1131c3473,3476
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:1130: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_path_DOXYGEN+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1133,1134c3478,3479
+<   case "$DOXYGEN" in
+<   /*)
+---
+>   case $DOXYGEN in
+>   [\\/]* | ?:[\\/]*)
+1137,1139d3481
+<   ?:/*)			 
+<   ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a dos path.
+<   ;;
+1141,1150c3483,3498
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH:/usr/local/bin:/usr/bin"
+<   for ac_dir in $ac_dummy; do 
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_path_DOXYGEN="$ac_dir/$ac_word"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> as_dummy="$PATH:/usr/local/bin:/usr/bin"
+> for as_dir in $as_dummy
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+1154c3502
+< DOXYGEN="$ac_cv_path_DOXYGEN"
+---
+> DOXYGEN=$ac_cv_path_DOXYGEN
+1156c3504,3505
+<   echo "$ac_t""$DOXYGEN" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $DOXYGEN" >&5
+> $as_echo "$DOXYGEN" >&6; }
+1158c3507,3508
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+1164,1180c3514,3543
+< if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+< else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+< fi
+< 
+< echo $ac_n "checking host system type""... $ac_c" 1>&6
+< echo "configure:1170: checking host system type" >&5
+< 
+< host_alias=$host
+< case "$host_alias" in
+< NONE)
+<   case $nonopt in
+<   NONE)
+<     if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+<     else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+<     fi ;;
+<   *) host_alias=$nonopt ;;
+<   esac ;;
+---
+> $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+>   { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+> $as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+>    { (exit 1); exit 1; }; }
+> 
+> { $as_echo "$as_me:$LINENO: checking build system type" >&5
+> $as_echo_n "checking build system type... " >&6; }
+> if test "${ac_cv_build+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_build_alias=$build_alias
+> test "x$ac_build_alias" = x &&
+>   ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+> test "x$ac_build_alias" = x &&
+>   { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+> $as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+>    { (exit 1); exit 1; }; }
+> ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+>   { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+> $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+>    { (exit 1); exit 1; }; }
+> 
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+> $as_echo "$ac_cv_build" >&6; }
+> case $ac_cv_build in
+> *-*-*) ;;
+> *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+> $as_echo "$as_me: error: invalid value of canonical build" >&2;}
+>    { (exit 1); exit 1; }; };;
+1182,1216c3545,3570
+< 
+< host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+< host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+< host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+< host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+< echo "$ac_t""$host" 1>&6
+< 
+< echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+< echo "configure:1191: checking for Cygwin environment" >&5
+< if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 1196 "configure"
+< #include "confdefs.h"
+< 
+< int main() {
+< 
+< #ifndef __CYGWIN__
+< #define __CYGWIN__ __CYGWIN32__
+< #endif
+< return __CYGWIN__;
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1207: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+<   ac_cv_cygwin=yes
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_cygwin=no
+< fi
+< rm -f conftest*
+< rm -f conftest*
+---
+> build=$ac_cv_build
+> ac_save_IFS=$IFS; IFS='-'
+> set x $ac_cv_build
+> shift
+> build_cpu=$1
+> build_vendor=$2
+> shift; shift
+> # Remember, the first character of IFS is used to create $*,
+> # except with old shells:
+> build_os=$*
+> IFS=$ac_save_IFS
+> case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+> 
+> 
+> { $as_echo "$as_me:$LINENO: checking host system type" >&5
+> $as_echo_n "checking host system type... " >&6; }
+> if test "${ac_cv_host+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test "x$host_alias" = x; then
+>   ac_cv_host=$ac_cv_build
+> else
+>   ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+>     { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+> $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+>    { (exit 1); exit 1; }; }
+1219,1245d3572
+< echo "$ac_t""$ac_cv_cygwin" 1>&6
+< CYGWIN=
+< test "$ac_cv_cygwin" = yes && CYGWIN=yes
+< echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+< echo "configure:1224: checking for mingw32 environment" >&5
+< if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 1229 "configure"
+< #include "confdefs.h"
+< 
+< int main() {
+< return __MINGW32__;
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+<   ac_cv_mingw32=yes
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_mingw32=no
+< fi
+< rm -f conftest*
+< rm -f conftest*
+1246a3574,3593
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+> $as_echo "$ac_cv_host" >&6; }
+> case $ac_cv_host in
+> *-*-*) ;;
+> *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+> $as_echo "$as_me: error: invalid value of canonical host" >&2;}
+>    { (exit 1); exit 1; }; };;
+> esac
+> host=$ac_cv_host
+> ac_save_IFS=$IFS; IFS='-'
+> set x $ac_cv_host
+> shift
+> host_cpu=$1
+> host_vendor=$2
+> shift; shift
+> # Remember, the first character of IFS is used to create $*,
+> # except with old shells:
+> host_os=$*
+> IFS=$ac_save_IFS
+> case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+1248,1277d3594
+< echo "$ac_t""$ac_cv_mingw32" 1>&6
+< MINGW32=
+< test "$ac_cv_mingw32" = yes && MINGW32=yes
+< 
+< 
+< echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+< echo "configure:1255: checking for executable suffix" >&5
+< if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+<   ac_cv_exeext=.exe
+< else
+<   rm -f conftest*
+<   echo 'int main () { return 0; }' > conftest.$ac_ext
+<   ac_cv_exeext=
+<   if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+<     for file in conftest.*; do
+<       case $file in
+<       *.c | *.o | *.obj) ;;
+<       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+<       esac
+<     done
+<   else
+<     { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+<   fi
+<   rm -f conftest*
+<   test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+< fi
+< fi
+1279,1282d3595
+< EXEEXT=""
+< test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+< echo "$ac_t""${ac_cv_exeext}" 1>&6
+< ac_exeext=$EXEEXT
+1286,1288c3599,3601
+<     echo $ac_n "checking whether strict compiling is on""... $ac_c" 1>&6
+< echo "configure:1288: checking whether strict compiling is on" >&5
+<     # Check whether --enable-strict or --disable-strict was given.
+---
+>     { $as_echo "$as_me:$LINENO: checking whether strict compiling is on" >&5
+> $as_echo_n "checking whether strict compiling is on... " >&6; }
+>     # Check whether --enable-strict was given.
+1290,1291c3603
+<   enableval="$enable_strict"
+<   
+---
+>   enableval=$enable_strict;
+1298c3610
+<       
+---
+> 
+1303c3615,3616
+<     echo "$ac_t""$ac_use_strict_options" 1>&6
+---
+>     { $as_echo "$as_me:$LINENO: result: $ac_use_strict_options" >&5
+> $as_echo "$ac_use_strict_options" >&6; }
+1343c3656,3657
+<     # Check whether --enable-64bit-libs or --disable-64bit-libs was given.
+---
+> 
+>     # Check whether --enable-64bit-libs was given.
+1345,1346c3659
+<   enableval="$enable_64bit_libs"
+<   ENABLE_64BIT_LIBS=${enableval}
+---
+>   enableval=$enable_64bit_libs; ENABLE_64BIT_LIBS=${enableval}
+1349c3662
+<     
+---
+> 
+1352,1353c3665,3666
+<         echo $ac_n "checking for 64-bit executable support""... $ac_c" 1>&6
+< echo "configure:1354: checking for 64-bit executable support" >&5
+---
+>         { $as_echo "$as_me:$LINENO: checking for 64-bit executable support" >&5
+> $as_echo_n "checking for 64-bit executable support... " >&6; }
+1408c3721
+<             if test "$ac_cv_prog_gcc" = no; then
+---
+>             if test "$ac_cv_c_compiler_gnu" = no; then
+1420,1422c3733,3738
+<   cat > conftest.$ac_ext <<EOF
+< #line 1422 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+1424,1426c3740,3762
+< EOF
+< if { (eval echo configure:1426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+---
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+1429,1432c3765,3770
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+<   ENABLE_64BIT_LIBS=no
+---
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ENABLE_64BIT_LIBS=no
+1434c3772,3773
+< rm -fr conftest*
+---
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+1436a3776
+> 
+1450c3790
+<                         
+---
+> 
+1458,1460c3798,3803
+<   cat > conftest.$ac_ext <<EOF
+< #line 1460 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+1462,1464c3805,3827
+< EOF
+< if { (eval echo configure:1464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+---
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+1467,1470c3830,3835
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+<   ENABLE_64BIT_LIBS=no
+---
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ENABLE_64BIT_LIBS=no
+1472c3837,3838
+< rm -fr conftest*
+---
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+1474a3841
+> 
+1483,1485c3850,3855
+<   cat > conftest.$ac_ext <<EOF
+< #line 1485 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+1487,1489c3857,3879
+< EOF
+< if { (eval echo configure:1489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+---
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+1492,1495c3882,3887
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+<   ENABLE_64BIT_LIBS=no
+---
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ENABLE_64BIT_LIBS=no
+1497c3889,3890
+< rm -fr conftest*
+---
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+1499a3893
+> 
+1511c3905,3906
+<         echo "$ac_t""$ENABLE_64BIT_LIBS" 1>&6
+---
+>         { $as_echo "$as_me:$LINENO: result: $ENABLE_64BIT_LIBS" >&5
+> $as_echo "$ENABLE_64BIT_LIBS" >&6; }
+1517,1520c3912,3915
+< 	echo $ac_n "checking which Makefile fragment to use""... $ac_c" 1>&6
+< echo "configure:1519: checking which Makefile fragment to use" >&5
+< if eval "test \"`echo '$''{'icu_cv_host_frag'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 	{ $as_echo "$as_me:$LINENO: checking which Makefile fragment to use" >&5
+> $as_echo_n "checking which Makefile fragment to use... " >&6; }
+> if test "${icu_cv_host_frag+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1522c3917
+<   
+---
+> 
+1525,1526c3920,3921
+< 	if test "$GCC" = yes; then	
+< 		icu_cv_host_frag=mh-solaris-gcc 
+---
+> 	if test "$GCC" = yes; then
+> 		icu_cv_host_frag=mh-solaris-gcc
+1533c3928
+< 	else  
+---
+> 	else
+1587,1589d3981
+< 		
+< 	
+< fi
+1591c3983,3986
+< echo "$ac_t""$icu_cv_host_frag" 1>&6
+---
+> 
+> fi
+> { $as_echo "$as_me:$LINENO: result: $icu_cv_host_frag" >&5
+> $as_echo "$icu_cv_host_frag" >&6; }
+1595,1599c3990,3993
+< 	*-*-hpux*) 	echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
+< echo "configure:1597: checking for floor in -lm" >&5
+< ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
+< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 	*-*-hpux*) 	{ $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
+> $as_echo_n "checking for floor in -lm... " >&6; }
+> if test "${ac_cv_lib_m_floor+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1601c3995
+<   ac_save_LIBS="$LIBS"
+---
+>   ac_check_lib_save_LIBS=$LIBS
+1603,1629c3997,4055
+< cat > conftest.$ac_ext <<EOF
+< #line 1605 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char floor();
+< 
+< int main() {
+< floor()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=no"
+< fi
+< rm -f conftest*
+< LIBS="$ac_save_LIBS"
+< 
+< fi
+< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+---
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char floor ();
+> int
+> main ()
+> {
+> return floor ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_lib_m_floor=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_lib_m_floor=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> LIBS=$ac_check_lib_save_LIBS
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
+> $as_echo "$ac_cv_lib_m_floor" >&6; }
+> if test "x$ac_cv_lib_m_floor" = x""yes; then
+1631,1632d4056
+< else
+<   echo "$ac_t""no" 1>&6
+1635,1666d4058
+< 	
+< 	*) 		echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
+< echo "configure:1638: checking for floor in -lm" >&5
+< ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
+< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   ac_save_LIBS="$LIBS"
+< LIBS="-lm  $LIBS"
+< cat > conftest.$ac_ext <<EOF
+< #line 1646 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char floor();
+< 
+< int main() {
+< floor()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=no"
+< fi
+< rm -f conftest*
+< LIBS="$ac_save_LIBS"
+1668,1675c4060,4129
+< fi
+< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<     ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+<   cat >> confdefs.h <<EOF
+< #define $ac_tr_lib 1
+< EOF
+---
+> 	*)
+> { $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
+> $as_echo_n "checking for floor in -lm... " >&6; }
+> if test "${ac_cv_lib_m_floor+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_check_lib_save_LIBS=$LIBS
+> LIBS="-lm  $LIBS"
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char floor ();
+> int
+> main ()
+> {
+> return floor ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_lib_m_floor=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_lib_m_floor=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> LIBS=$ac_check_lib_save_LIBS
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
+> $as_echo "$ac_cv_lib_m_floor" >&6; }
+> if test "x$ac_cv_lib_m_floor" = x""yes; then
+>   cat >>confdefs.h <<_ACEOF
+> #define HAVE_LIBM 1
+> _ACEOF
+1679,1680d4132
+< else
+<   echo "$ac_t""no" 1>&6
+1682c4134
+<  
+---
+> 
+1687,1688c4139,4140
+< echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6
+< echo "configure:1689: checking whether to build shared libraries" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+> $as_echo_n "checking whether to build shared libraries... " >&6; }
+1690c4142
+< # Check whether --enable-shared or --disable-shared was given.
+---
+> # Check whether --enable-shared was given.
+1692,1693c4144
+<   enableval="$enable_shared"
+<    case "${enableval}" in
+---
+>   enableval=$enable_shared;  case "${enableval}" in
+1703c4154,4155
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1706,1707c4158,4159
+< echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6
+< echo "configure:1708: checking whether to build static libraries" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+> $as_echo_n "checking whether to build static libraries... " >&6; }
+1709c4161
+< # Check whether --enable-static or --disable-static was given.
+---
+> # Check whether --enable-static was given.
+1711,1712c4163
+<   enableval="$enable_static"
+<    case "${enableval}" in
+---
+>   enableval=$enable_static;  case "${enableval}" in
+1719c4170,4171
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1722,1723c4174,4175
+< echo $ac_n "checking whether to build debug libraries""... $ac_c" 1>&6
+< echo "configure:1724: checking whether to build debug libraries" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking whether to build debug libraries" >&5
+> $as_echo_n "checking whether to build debug libraries... " >&6; }
+1726c4178
+< # Check whether --enable-debug or --disable-debug was given.
+---
+> # Check whether --enable-debug was given.
+1728,1729c4180
+<   enableval="$enable_debug"
+<    case "${enableval}" in
+---
+>   enableval=$enable_debug;  case "${enableval}" in
+1735c4186,4187
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1738,1739c4190,4191
+< echo $ac_n "checking whether to build release libraries""... $ac_c" 1>&6
+< echo "configure:1740: checking whether to build release libraries" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking whether to build release libraries" >&5
+> $as_echo_n "checking whether to build release libraries... " >&6; }
+1742c4194
+< # Check whether --enable-release or --disable-release was given.
+---
+> # Check whether --enable-release was given.
+1744,1745c4196
+<   enableval="$enable_release"
+<    case "${enableval}" in
+---
+>   enableval=$enable_release;  case "${enableval}" in
+1751c4202,4203
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1754,1759c4206,4212
+< # Extract the first word of "ranlib", so it can be a program name with args.
+< set dummy ranlib; ac_word=$2
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:1758: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> if test -n "$ac_tool_prefix"; then
+>   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+> set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_RANLIB+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1764,1774c4217,4231
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH"
+<   for ac_dir in $ac_dummy; do
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_prog_RANLIB="ranlib"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+<   test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+---
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+1777c4234
+< RANLIB="$ac_cv_prog_RANLIB"
+---
+> RANLIB=$ac_cv_prog_RANLIB
+1779c4236,4293
+<   echo "$ac_t""$RANLIB" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5
+> $as_echo "$RANLIB" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+> fi
+> 
+> 
+> fi
+> if test -z "$ac_cv_prog_RANLIB"; then
+>   ac_ct_RANLIB=$RANLIB
+>   # Extract the first word of "ranlib", so it can be a program name with args.
+> set dummy ranlib; ac_word=$2
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   if test -n "$ac_ct_RANLIB"; then
+>   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+> else
+> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_prog_ac_ct_RANLIB="ranlib"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+> fi
+> fi
+> ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+> if test -n "$ac_ct_RANLIB"; then
+>   { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+> $as_echo "$ac_ct_RANLIB" >&6; }
+> else
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+> fi
+> 
+>   if test "x$ac_ct_RANLIB" = x; then
+>     RANLIB=":"
+>   else
+>     case $cross_compiling:$ac_tool_warned in
+> yes:)
+> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+> ac_tool_warned=yes ;;
+> esac
+>     RANLIB=$ac_ct_RANLIB
+>   fi
+1781c4295
+<   echo "$ac_t""no" 1>&6
+---
+>   RANLIB="$ac_cv_prog_RANLIB"
+1786,1789c4300,4303
+< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+< echo "configure:1788: checking for $ac_word" >&5
+< if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+> $as_echo_n "checking for $ac_word... " >&6; }
+> if test "${ac_cv_path_AR+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1791,1792c4305,4306
+<   case "$AR" in
+<   /*)
+---
+>   case $AR in
+>   [\\/]* | ?:[\\/]*)
+1795,1797d4308
+<   ?:/*)			 
+<   ac_cv_path_AR="$AR" # Let the user override the test with a dos path.
+<   ;;
+1799,1808c4310,4325
+<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+<   ac_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
+<   for ac_dir in $ac_dummy; do 
+<     test -z "$ac_dir" && ac_dir=.
+<     if test -f $ac_dir/$ac_word; then
+<       ac_cv_path_AR="$ac_dir/$ac_word"
+<       break
+<     fi
+<   done
+<   IFS="$ac_save_ifs"
+---
+>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> as_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
+> for as_dir in $as_dummy
+> do
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   for ac_exec_ext in '' $ac_executable_extensions; do
+>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+>     ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
+>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+>     break 2
+>   fi
+> done
+> done
+> IFS=$as_save_IFS
+> 
+1813c4330
+< AR="$ac_cv_path_AR"
+---
+> AR=$ac_cv_path_AR
+1815c4332,4333
+<   echo "$ac_t""$AR" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: $AR" >&5
+> $as_echo "$AR" >&6; }
+1817c4335,4336
+<   echo "$ac_t""no" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: result: no" >&5
+> $as_echo "no" >&6; }
+1821,1822c4340,4342
+< echo $ac_n "checking whether to enable renaming of symbols""... $ac_c" 1>&6
+< echo "configure:1823: checking whether to enable renaming of symbols" >&5
+---
+> 
+> { $as_echo "$as_me:$LINENO: checking whether to enable renaming of symbols" >&5
+> $as_echo_n "checking whether to enable renaming of symbols... " >&6; }
+1825c4345
+< # Check whether --enable-renaming or --disable-renaming was given.
+---
+> # Check whether --enable-renaming was given.
+1827,1828c4347
+<   enableval="$enable_renaming"
+<    case "${enableval}" in
+---
+>   enableval=$enable_renaming;  case "${enableval}" in
+1835c4354,4355
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1838,1839c4358,4359
+< echo $ac_n "checking whether to enable function and data tracing""... $ac_c" 1>&6
+< echo "configure:1840: checking whether to enable function and data tracing" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking whether to enable function and data tracing" >&5
+> $as_echo_n "checking whether to enable function and data tracing... " >&6; }
+1842c4362
+< # Check whether --enable-tracing or --disable-tracing was given.
+---
+> # Check whether --enable-tracing was given.
+1844,1845c4364
+<   enableval="$enable_tracing"
+<    case "${enableval}" in
+---
+>   enableval=$enable_tracing;  case "${enableval}" in
+1852c4371,4372
+< echo "$ac_t""$enabled" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
+> $as_echo "$enabled" >&6; }
+1855c4375
+< # Check whether --enable-rpath or --disable-rpath was given.
+---
+> # Check whether --enable-rpath was given.
+1857,1858c4377
+<   enableval="$enable_rpath"
+<    case "${enableval}" in
+---
+>   enableval=$enable_rpath;  case "${enableval}" in
+1871,1874c4390,4393
+< echo $ac_n "checking for definition of U_INLINE for C""... $ac_c" 1>&6
+< echo "configure:1873: checking for definition of U_INLINE for C" >&5
+< if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking for definition of U_INLINE for C" >&5
+> $as_echo_n "checking for definition of U_INLINE for C... " >&6; }
+> if test "${ac_cv_c_inline+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1878,1880c4397,4402
+<   cat > conftest.$ac_ext <<EOF
+< #line 1880 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+1882c4404,4406
+< int main() {
+---
+> int
+> main ()
+> {
+1884,1887c4408,4429
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+1890,1891c4432,4435
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+1893c4437,4438
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+1895,1896d4439
+<   
+< fi
+1898c4441,4443
+< echo "$ac_t""$ac_cv_c_inline" 1>&6
+---
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+> $as_echo "$ac_cv_c_inline" >&6; }
+1908c4453
+< # Check whether --enable-threads or --disable-threads was given.
+---
+> # Check whether --enable-threads was given.
+1910,1911c4455
+<   enableval="$enable_threads"
+<   case "${enableval}" in
+---
+>   enableval=$enable_threads; case "${enableval}" in
+1914c4458,4460
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-threads" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-threads" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-threads" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+1930,1935c4476,4481
+<            
+<   echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
+< echo "configure:1933: checking for pthread_attr_init in -lpthread" >&5
+< ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'`
+< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 
+> 
+> { $as_echo "$as_me:$LINENO: checking for pthread_attr_init in -lpthread" >&5
+> $as_echo_n "checking for pthread_attr_init in -lpthread... " >&6; }
+> if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1937c4483
+<   ac_save_LIBS="$LIBS"
+---
+>   ac_check_lib_save_LIBS=$LIBS
+1939,1970c4485,4546
+< cat > conftest.$ac_ext <<EOF
+< #line 1941 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char pthread_attr_init();
+< 
+< int main() {
+< pthread_attr_init()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:1952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=no"
+< fi
+< rm -f conftest*
+< LIBS="$ac_save_LIBS"
+< 
+< fi
+< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<     ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+<   cat >> confdefs.h <<EOF
+< #define $ac_tr_lib 1
+< EOF
+---
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char pthread_attr_init ();
+> int
+> main ()
+> {
+> return pthread_attr_init ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_lib_pthread_pthread_attr_init=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_lib_pthread_pthread_attr_init=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> LIBS=$ac_check_lib_save_LIBS
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_attr_init" >&5
+> $as_echo "$ac_cv_lib_pthread_pthread_attr_init" >&6; }
+> if test "x$ac_cv_lib_pthread_pthread_attr_init" = x""yes; then
+>   cat >>confdefs.h <<_ACEOF
+> #define HAVE_LIBPTHREAD 1
+> _ACEOF
+1974,1975d4549
+< else
+<   echo "$ac_t""no" 1>&6
+1981,1986c4555,4560
+<                
+<    
+< echo $ac_n "checking for library containing pthread_mutex_destroy""... $ac_c" 1>&6
+< echo "configure:1985: checking for library containing pthread_mutex_destroy" >&5
+< if eval "test \"`echo '$''{'ac_cv_search_pthread_mutex_destroy'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 
+> 
+> { $as_echo "$as_me:$LINENO: checking for library containing pthread_mutex_destroy" >&5
+> $as_echo_n "checking for library containing pthread_mutex_destroy... " >&6; }
+> if test "${ac_cv_search_pthread_mutex_destroy+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+1992,2005c4566,4608
+< cat > conftest.$ac_ext <<EOF
+< #line 1994 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char pthread_mutex_destroy();
+< 
+< int main() {
+< pthread_mutex_destroy()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char pthread_mutex_destroy ();
+> int
+> main ()
+> {
+> return pthread_mutex_destroy ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2009,2010c4612,4615
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2012c4617,4620
+< rm -f conftest*
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2015,2028c4623,4665
+< cat > conftest.$ac_ext <<EOF
+< #line 2017 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char pthread_mutex_destroy();
+< 
+< int main() {
+< pthread_mutex_destroy()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char pthread_mutex_destroy ();
+> int
+> main ()
+> {
+> return pthread_mutex_destroy ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2031,2032c4668,4671
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2034c4673,4676
+< rm -f conftest*
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2038,2039c4680,4681
+< 
+< echo "$ac_t""$ac_cv_search_pthread_mutex_destroy" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_search_pthread_mutex_destroy" >&5
+> $as_echo "$ac_cv_search_pthread_mutex_destroy" >&6; }
+2042c4684
+<   
+---
+> 
+2044c4686
+<   
+---
+> 
+2050,2054c4692,4696
+<         echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
+< echo "configure:2052: checking for pthread_mutex_init in -lpthread" >&5
+< ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
+< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> 
+> { $as_echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthread" >&5
+> $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; }
+> if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+2056c4698
+<   ac_save_LIBS="$LIBS"
+---
+>   ac_check_lib_save_LIBS=$LIBS
+2058,2089c4700,4761
+< cat > conftest.$ac_ext <<EOF
+< #line 2060 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char pthread_mutex_init();
+< 
+< int main() {
+< pthread_mutex_init()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_lib_$ac_lib_var=no"
+< fi
+< rm -f conftest*
+< LIBS="$ac_save_LIBS"
+< 
+< fi
+< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<     ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+<   cat >> confdefs.h <<EOF
+< #define $ac_tr_lib 1
+< EOF
+---
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char pthread_mutex_init ();
+> int
+> main ()
+> {
+> return pthread_mutex_init ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_lib_pthread_pthread_mutex_init=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_lib_pthread_pthread_mutex_init=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> LIBS=$ac_check_lib_save_LIBS
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5
+> $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; }
+> if test "x$ac_cv_lib_pthread_pthread_mutex_init" = x""yes; then
+>   cat >>confdefs.h <<_ACEOF
+> #define HAVE_LIBPTHREAD 1
+> _ACEOF
+2093,2094d4764
+< else
+<   echo "$ac_t""no" 1>&6
+2102,2109c4772,4786
+<    echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6
+< echo "configure:2104: checking for pthread_mutex_lock" >&5
+< if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2109 "configure"
+< #include "confdefs.h"
+---
+>    { $as_echo "$as_me:$LINENO: checking for pthread_mutex_lock" >&5
+> $as_echo_n "checking for pthread_mutex_lock... " >&6; }
+> if test "${ac_cv_func_pthread_mutex_lock+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> /* Define pthread_mutex_lock to an innocuous variant, in case <limits.h> declares pthread_mutex_lock.
+>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+> #define pthread_mutex_lock innocuous_pthread_mutex_lock
+> 
+2111,2116c4788,4796
+<     which can conflict with char pthread_mutex_lock(); below.  */
+< #include <assert.h>
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char pthread_mutex_lock();
+---
+>     which can conflict with char pthread_mutex_lock (); below.
+>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>     <limits.h> exists even on freestanding compilers.  */
+> 
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+2118c4798
+< int main() {
+---
+> #undef pthread_mutex_lock
+2119a4800,4806
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char pthread_mutex_lock ();
+2123c4810
+< #if defined (__stub_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
+---
+> #if defined __stub_pthread_mutex_lock || defined __stub___pthread_mutex_lock
+2125,2126d4811
+< #else
+< pthread_mutex_lock();
+2129,2147c4814,4853
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_func_pthread_mutex_lock=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_func_pthread_mutex_lock=no"
+< fi
+< rm -f conftest*
+< fi
+< 
+< if eval "test \"`echo '$ac_cv_func_'pthread_mutex_lock`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<   :
+< else
+<   echo "$ac_t""no" 1>&6
+---
+> int
+> main ()
+> {
+> return pthread_mutex_lock ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_func_pthread_mutex_lock=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func_pthread_mutex_lock=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2148a4855,4856
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_pthread_mutex_lock" >&5
+> $as_echo "$ac_cv_func_pthread_mutex_lock" >&6; }
+2156c4864
+<      if test "$ac_cv_prog_gcc" = no; then
+---
+>      if test "$ac_cv_c_compiler_gnu" = no; then
+2180,2188c4888,4899
+< echo $ac_n "checking for mmap""... $ac_c" 1>&6
+< echo "configure:2182: checking for mmap" >&5
+< if eval "test \"`echo '$''{'ac_cv_func_mmap_ok'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2187 "configure"
+< #include "confdefs.h"
+<     
+---
+> { $as_echo "$as_me:$LINENO: checking for mmap" >&5
+> $as_echo_n "checking for mmap... " >&6; }
+> if test "${ac_cv_func_mmap_ok+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+2193,2194c4904,4907
+<     
+< int main() {
+---
+> 
+> int
+> main ()
+> {
+2196,2199c4909,4933
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2199: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2202,2205c4936,4939
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_func_mmap_ok=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func_mmap_ok=no
+2207c4941,4944
+< rm -f conftest* 
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2210c4947,4948
+< echo "$ac_t""$ac_cv_func_mmap_ok" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_mmap_ok" >&5
+> $as_echo "$ac_cv_func_mmap_ok" >&6; }
+2227,2228c4965,4971
+< echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+< echo "configure:2229: checking how to run the C preprocessor" >&5
+---
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+> $as_echo_n "checking how to run the C preprocessor... " >&6; }
+2234,2235c4977,5084
+< if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   if test "${ac_cv_prog_CPP+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>       # Double quotes because CPP needs to be expanded
+>     for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+>     do
+>       ac_preproc_ok=false
+> for ac_c_preproc_warn_flag in '' yes
+> do
+>   # Use a header file that comes with gcc, so configuring glibc
+>   # with a fresh cross-compiler works.
+>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>   # <limits.h> exists even on freestanding compilers.
+>   # On the NeXT, cc -E runs the code through the compiler's parser,
+>   # not just through cpp. "Syntax error" is here to catch this case.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+> 		     Syntax error
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Broken: fails on valid input.
+> continue
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+>   # OK, works on sane cases.  Now check whether nonexistent headers
+>   # can be detected and how.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <ac_nonexistent.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   # Broken: success on invalid input.
+> continue
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Passes both tests.
+> ac_preproc_ok=:
+> break
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+> done
+> # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+> rm -f conftest.err conftest.$ac_ext
+> if $ac_preproc_ok; then
+>   break
+> fi
+> 
+>     done
+>     ac_cv_prog_CPP=$CPP
+> 
+> fi
+>   CPP=$ac_cv_prog_CPP
+2237,2239c5086,5096
+<     # This must be in double quotes, not single quotes, because CPP may get
+<   # substituted into the Makefile and "${CC-cc}" will confuse make.
+<   CPP="${CC-cc} -E"
+---
+>   ac_cv_prog_CPP=$CPP
+> fi
+> { $as_echo "$as_me:$LINENO: result: $CPP" >&5
+> $as_echo "$CPP" >&6; }
+> ac_preproc_ok=false
+> for ac_c_preproc_warn_flag in '' yes
+> do
+>   # Use a header file that comes with gcc, so configuring glibc
+>   # with a fresh cross-compiler works.
+>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>   # <limits.h> exists even on freestanding compilers.
+2241,2251c5098,5128
+<   # not just through cpp.
+<   cat > conftest.$ac_ext <<EOF
+< #line 2244 "configure"
+< #include "confdefs.h"
+< #include <assert.h>
+< Syntax Error
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+---
+>   # not just through cpp. "Syntax error" is here to catch this case.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+> 		     Syntax error
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+2254,2268c5131,5183
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   CPP="${CC-cc} -E -traditional-cpp"
+<   cat > conftest.$ac_ext <<EOF
+< #line 2261 "configure"
+< #include "confdefs.h"
+< #include <assert.h>
+< Syntax Error
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Broken: fails on valid input.
+> continue
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+>   # OK, works on sane cases.  Now check whether nonexistent headers
+>   # can be detected and how.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <ac_nonexistent.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   # Broken: success on invalid input.
+> continue
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Passes both tests.
+> ac_preproc_ok=:
+> break
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+> done
+> # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+> rm -f conftest.err conftest.$ac_ext
+> if $ac_preproc_ok; then
+2271,2285c5186,5400
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   CPP="${CC-cc} -nologo -E"
+<   cat > conftest.$ac_ext <<EOF
+< #line 2278 "configure"
+< #include "confdefs.h"
+< #include <assert.h>
+< Syntax Error
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+---
+>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+> fi
+> 
+> ac_ext=c
+> ac_cpp='$CPP $CPPFLAGS'
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> 
+> 
+> { $as_echo "$as_me:$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 test "${ac_cv_path_GREP+set}" = set; 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
+>     ac_count=`expr $ac_count + 1`
+>     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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+> $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+>    { (exit 1); exit 1; }; }
+>   fi
+> else
+>   ac_cv_path_GREP=$GREP
+> fi
+> 
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+> $as_echo "$ac_cv_path_GREP" >&6; }
+>  GREP="$ac_cv_path_GREP"
+> 
+> 
+> { $as_echo "$as_me:$LINENO: checking for egrep" >&5
+> $as_echo_n "checking for egrep... " >&6; }
+> if test "${ac_cv_path_EGREP+set}" = set; 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
+>     ac_count=`expr $ac_count + 1`
+>     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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+> $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+>    { (exit 1); exit 1; }; }
+>   fi
+> else
+>   ac_cv_path_EGREP=$EGREP
+> fi
+> 
+>    fi
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+> $as_echo "$ac_cv_path_EGREP" >&6; }
+>  EGREP="$ac_cv_path_EGREP"
+> 
+> 
+> { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+> $as_echo_n "checking for ANSI C header files... " >&6; }
+> if test "${ac_cv_header_stdc+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <stdlib.h>
+> #include <stdarg.h>
+> #include <string.h>
+> #include <float.h>
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_cv_header_stdc=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_header_stdc=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> 
+> if test $ac_cv_header_stdc = yes; then
+>   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <string.h>
+> 
+> _ACEOF
+> if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+>   $EGREP "memchr" >/dev/null 2>&1; then
+2288,2292c5403
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   CPP=/lib/cpp
+---
+>   ac_cv_header_stdc=no
+2294a5406,5424
+> 
+> fi
+> 
+> if test $ac_cv_header_stdc = yes; then
+>   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <stdlib.h>
+> 
+> _ACEOF
+> if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+>   $EGREP "free" >/dev/null 2>&1; then
+>   :
+> else
+>   ac_cv_header_stdc=no
+2296a5427,5501
+> 
+> fi
+> 
+> if test $ac_cv_header_stdc = yes; then
+>   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+>   if test "$cross_compiling" = yes; then
+>   :
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <ctype.h>
+> #include <stdlib.h>
+> #if ((' ' & 0x0FF) == 0x020)
+> # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+> # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+> #else
+> # define ISLOWER(c) \
+> 		   (('a' <= (c) && (c) <= 'i') \
+> 		     || ('j' <= (c) && (c) <= 'r') \
+> 		     || ('s' <= (c) && (c) <= 'z'))
+> # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+> #endif
+> 
+> #define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+> int
+> main ()
+> {
+>   int i;
+>   for (i = 0; i < 256; i++)
+>     if (XOR (islower (i), ISLOWER (i))
+> 	|| toupper (i) != TOUPPER (i))
+>       return 2;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+>   :
+> else
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ac_cv_header_stdc=no
+> fi
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+> fi
+> 
+> 
+2298,2299d5502
+< rm -f conftest*
+<   ac_cv_prog_CPP="$CPP"
+2301,2303c5504,5511
+<   CPP="$ac_cv_prog_CPP"
+< else
+<   ac_cv_prog_CPP="$CPP"
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+> $as_echo "$ac_cv_header_stdc" >&6; }
+> if test $ac_cv_header_stdc = yes; then
+> 
+> cat >>confdefs.h <<\_ACEOF
+> #define STDC_HEADERS 1
+> _ACEOF
+> 
+2305d5512
+< echo "$ac_t""$CPP" 1>&6
+2307c5514,5525
+< for ac_hdr in inttypes.h
+---
+> # On IRIX 5.3, sys/types and inttypes.h are conflicting.
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> 
+> for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+> 		  inttypes.h stdint.h unistd.h
+2309,2333c5527,5581
+< ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+< echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+< echo "configure:2312: checking for $ac_hdr" >&5
+< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2317 "configure"
+< #include "confdefs.h"
+< #include <$ac_hdr>
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=yes"
+< else
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=no"
+< fi
+< rm -f conftest*
+---
+> as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+> { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+> $as_echo_n "checking for $ac_header... " >&6; }
+> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> 
+> #include <$ac_header>
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   eval "$as_ac_Header=yes"
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	eval "$as_ac_Header=no"
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> ac_res=`eval 'as_val=${'$as_ac_Header'}
+> 		 $as_echo "$as_val"'`
+> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+> $as_echo "$ac_res" >&6; }
+> as_val=`eval 'as_val=${'$as_ac_Header'}
+> 		 $as_echo "$as_val"'`
+>    if test "x$as_val" = x""yes; then
+>   cat >>confdefs.h <<_ACEOF
+> #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+> _ACEOF
+> 
+2335,2343c5583,5728
+< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+<   cat >> confdefs.h <<EOF
+< #define $ac_tr_hdr 1
+< EOF
+<  
+< else
+<   echo "$ac_t""no" 1>&6
+---
+> 
+> done
+> 
+> 
+> 
+> for ac_header in inttypes.h
+> do
+> as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+>   { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+> $as_echo_n "checking for $ac_header... " >&6; }
+> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+>   $as_echo_n "(cached) " >&6
+> fi
+> ac_res=`eval 'as_val=${'$as_ac_Header'}
+> 		 $as_echo "$as_val"'`
+> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+> $as_echo "$ac_res" >&6; }
+> else
+>   # Is the header compilable?
+> { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+> $as_echo_n "checking $ac_header usability... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> #include <$ac_header>
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_header_compiler=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_header_compiler=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+> $as_echo "$ac_header_compiler" >&6; }
+> 
+> # Is the header present?
+> { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+> $as_echo_n "checking $ac_header presence... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <$ac_header>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   ac_header_preproc=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   ac_header_preproc=no
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+> $as_echo "$ac_header_preproc" >&6; }
+> 
+> # So?  What about this header?
+> case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+>   yes:no: )
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+> $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+> $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+>     ac_header_preproc=yes
+>     ;;
+>   no:yes:* )
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+> $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+> $as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+> $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+> $as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+> $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+> $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+> 
+>     ;;
+> esac
+> { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+> $as_echo_n "checking for $ac_header... " >&6; }
+> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   eval "$as_ac_Header=\$ac_header_preproc"
+> fi
+> ac_res=`eval 'as_val=${'$as_ac_Header'}
+> 		 $as_echo "$as_val"'`
+> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+> $as_echo "$ac_res" >&6; }
+> 
+> fi
+> as_val=`eval 'as_val=${'$as_ac_Header'}
+> 		 $as_echo "$as_val"'`
+>    if test "x$as_val" = x""yes; then
+>   cat >>confdefs.h <<_ACEOF
+> #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+> _ACEOF
+> 
+2344a5730
+> 
+2353c5739,5740
+<  echo "$ac_t"""C compiler set to CCC ${CC}" " 1>&6
+---
+>  { $as_echo "$as_me:$LINENO: result: \"C compiler set to CCC ${CC}\" " >&5
+> $as_echo "\"C compiler set to CCC ${CC}\" " >&6; }
+2361c5748,5749
+< # Check whether --with-iostream or --without-iostream was given.
+---
+> 
+> # Check whether --with-iostream was given.
+2363,2364c5751
+<   withval="$with_iostream"
+<   case "${withval}" in
+---
+>   withval=$with_iostream; case "${withval}" in
+2369c5756,5758
+< 		*) { echo "configure: error: bad value ${withval} for --with-iostream" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-iostream" >&5
+> $as_echo "$as_me: error: bad value ${withval} for --with-iostream" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+2379,2381c5768,5769
+<     
+<     ac_ext=C
+< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+---
+> 
+>     ac_ext=cpp
+2383,2385c5771,5773
+< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cxx_cross
+---
+> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+2393,2397c5781,5789
+<     echo $ac_n "checking iostream usability""... $ac_c" 1>&6
+< echo "configure:2395: checking iostream usability" >&5
+<     cat > conftest.$ac_ext <<EOF
+< #line 2397 "configure"
+< #include "confdefs.h"
+---
+>     { $as_echo "$as_me:$LINENO: checking iostream usability" >&5
+> $as_echo_n "checking iostream usability... " >&6; }
+> 
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2399c5791,5793
+< int main() {
+---
+> int
+> main ()
+> {
+2401,2404c5795,5816
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+2407,2410c5819,5822
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_header_iostream=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_header_iostream=no
+2412c5824,5825
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+2417c5830,5831
+<     echo "$ac_t""$ac_cv_header_iostream" 1>&6
+---
+>     { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream" >&5
+> $as_echo "$ac_cv_header_iostream" >&6; }
+2423,2424c5837,5843
+<         echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
+< echo "configure:2425: checking how to run the C++ preprocessor" >&5
+---
+>         ac_ext=cpp
+> ac_cpp='$CXXCPP $CPPFLAGS'
+> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+> { $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+> $as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+2426,2427c5845,5846
+< if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   if test "${ac_cv_prog_CXXCPP+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+2429,2444c5848,5889
+<   ac_ext=C
+< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CXXCPP $CPPFLAGS'
+< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cxx_cross
+<   CXXCPP="${CXX-g++} -E"
+<   cat > conftest.$ac_ext <<EOF
+< #line 2438 "configure"
+< #include "confdefs.h"
+< #include <stdlib.h>
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2443: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+---
+>       # Double quotes because CXXCPP needs to be expanded
+>     for CXXCPP in "$CXX -E" "/lib/cpp"
+>     do
+>       ac_preproc_ok=false
+> for ac_cxx_preproc_warn_flag in '' yes
+> do
+>   # Use a header file that comes with gcc, so configuring glibc
+>   # with a fresh cross-compiler works.
+>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>   # <limits.h> exists even on freestanding compilers.
+>   # On the NeXT, cc -E runs the code through the compiler's parser,
+>   # not just through cpp. "Syntax error" is here to catch this case.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+> 		     Syntax error
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+2447,2451c5892,5896
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   CXXCPP=/lib/cpp
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Broken: fails on valid input.
+> continue
+2453,2488c5898,5936
+< rm -f conftest*
+<   ac_cv_prog_CXXCPP="$CXXCPP"
+< ac_ext=C
+< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+< ac_cpp='$CXXCPP $CPPFLAGS'
+< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cxx_cross
+< fi
+< fi
+< CXXCPP="$ac_cv_prog_CXXCPP"
+< echo "$ac_t""$CXXCPP" 1>&6
+< 
+< ac_safe=`echo "iostream.h" | sed 'y%./+-%__p_%'`
+< echo $ac_n "checking for iostream.h""... $ac_c" 1>&6
+< echo "configure:2469: checking for iostream.h" >&5
+< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2474 "configure"
+< #include "confdefs.h"
+< #include <iostream.h>
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:2479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=yes"
+< else
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=no"
+---
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+>   # OK, works on sane cases.  Now check whether nonexistent headers
+>   # can be detected and how.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <ac_nonexistent.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   # Broken: success on invalid input.
+> continue
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Passes both tests.
+> ac_preproc_ok=:
+> break
+2490c5938,6003
+< rm -f conftest*
+---
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+> done
+> # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+> rm -f conftest.err conftest.$ac_ext
+> if $ac_preproc_ok; then
+>   break
+> fi
+> 
+>     done
+>     ac_cv_prog_CXXCPP=$CXXCPP
+> 
+> fi
+>   CXXCPP=$ac_cv_prog_CXXCPP
+> else
+>   ac_cv_prog_CXXCPP=$CXXCPP
+> fi
+> { $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5
+> $as_echo "$CXXCPP" >&6; }
+> ac_preproc_ok=false
+> for ac_cxx_preproc_warn_flag in '' yes
+> do
+>   # Use a header file that comes with gcc, so configuring glibc
+>   # with a fresh cross-compiler works.
+>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>   # <limits.h> exists even on freestanding compilers.
+>   # On the NeXT, cc -E runs the code through the compiler's parser,
+>   # not just through cpp. "Syntax error" is here to catch this case.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+> 		     Syntax error
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Broken: fails on valid input.
+> continue
+2492,2493c6005,6051
+< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+---
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+>   # OK, works on sane cases.  Now check whether nonexistent headers
+>   # can be detected and how.
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <ac_nonexistent.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   # Broken: success on invalid input.
+> continue
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   # Passes both tests.
+> ac_preproc_ok=:
+> break
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> 
+> done
+> # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+> rm -f conftest.err conftest.$ac_ext
+> if $ac_preproc_ok; then
+2496c6054,6195
+<   echo "$ac_t""no" 1>&6
+---
+>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+> { { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+> See \`config.log' for more details." >&5
+> $as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+> See \`config.log' for more details." >&2;}
+>    { (exit 1); exit 1; }; }; }
+> fi
+> 
+> ac_ext=cpp
+> ac_cpp='$CXXCPP $CPPFLAGS'
+> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+> 
+> 
+> if test "${ac_cv_header_iostream_h+set}" = set; then
+>   { $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
+> $as_echo_n "checking for iostream.h... " >&6; }
+> if test "${ac_cv_header_iostream_h+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
+> $as_echo "$ac_cv_header_iostream_h" >&6; }
+> else
+>   # Is the header compilable?
+> { $as_echo "$as_me:$LINENO: checking iostream.h usability" >&5
+> $as_echo_n "checking iostream.h usability... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> #include <iostream.h>
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_header_compiler=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_header_compiler=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+> $as_echo "$ac_header_compiler" >&6; }
+> 
+> # Is the header present?
+> { $as_echo "$as_me:$LINENO: checking iostream.h presence" >&5
+> $as_echo_n "checking iostream.h presence... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <iostream.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   ac_header_preproc=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   ac_header_preproc=no
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+> $as_echo "$ac_header_preproc" >&6; }
+> 
+> # So?  What about this header?
+> case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+>   yes:no: )
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&5
+> $as_echo "$as_me: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the compiler's result" >&5
+> $as_echo "$as_me: WARNING: iostream.h: proceeding with the compiler's result" >&2;}
+>     ac_header_preproc=yes
+>     ;;
+>   no:yes:* )
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: present but cannot be compiled" >&5
+> $as_echo "$as_me: WARNING: iostream.h: present but cannot be compiled" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     check for missing prerequisite headers?" >&5
+> $as_echo "$as_me: WARNING: iostream.h:     check for missing prerequisite headers?" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: see the Autoconf documentation" >&5
+> $as_echo "$as_me: WARNING: iostream.h: see the Autoconf documentation" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&5
+> $as_echo "$as_me: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the preprocessor's result" >&5
+> $as_echo "$as_me: WARNING: iostream.h: proceeding with the preprocessor's result" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: in the future, the compiler will take precedence" >&5
+> $as_echo "$as_me: WARNING: iostream.h: in the future, the compiler will take precedence" >&2;}
+> 
+>     ;;
+> esac
+> { $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
+> $as_echo_n "checking for iostream.h... " >&6; }
+> if test "${ac_cv_header_iostream_h+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_cv_header_iostream_h=$ac_header_preproc
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
+> $as_echo "$ac_cv_header_iostream_h" >&6; }
+> 
+2498a6198
+> 
+2500,2507c6200,6210
+<             echo $ac_n "checking whether ostream is really defined""... $ac_c" 1>&6
+< echo "configure:2502: checking whether ostream is really defined" >&5
+<             if eval "test \"`echo '$''{'ac_cv_iostream_ok'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2507 "configure"
+< #include "confdefs.h"
+---
+>             { $as_echo "$as_me:$LINENO: checking whether ostream is really defined" >&5
+> $as_echo_n "checking whether ostream is really defined... " >&6; }
+>             if test "${ac_cv_iostream_ok+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2509c6212,6214
+< int main() {
+---
+> int
+> main ()
+> {
+2511,2514c6216,6240
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2517,2520c6243,6246
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_iostream_ok=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_iostream_ok=no
+2522c6248,6251
+< rm -f conftest*
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2525c6254,6255
+<             echo "$ac_t""$ac_cv_iostream_ok" 1>&6
+---
+>             { $as_echo "$as_me:$LINENO: result: $ac_cv_iostream_ok" >&5
+> $as_echo "$ac_cv_iostream_ok" >&6; }
+2545c6275,6277
+<             { echo "configure: error: ${withval} iostream is not available" 1>&2; exit 1; }
+---
+>             { { $as_echo "$as_me:$LINENO: error: ${withval} iostream is not available" >&5
+> $as_echo "$as_me: error: ${withval} iostream is not available" >&2;}
+>    { (exit 1); exit 1; }; }
+2551d6282
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+2553,2555c6284,6287
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+---
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> 
+2558,2561c6290,6293
+< echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+< echo "configure:2560: checking whether byte ordering is bigendian" >&5
+< if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>  { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+> $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+> if test "${ac_cv_c_bigendian+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+2564,2567c6296,6349
+< # See if sys/param.h defines the BYTE_ORDER macro.
+< cat > conftest.$ac_ext <<EOF
+< #line 2567 "configure"
+< #include "confdefs.h"
+---
+>     # See if we're dealing with a universal compiler.
+>     cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #ifndef __APPLE_CC__
+> 	       not a universal capable compiler
+> 	     #endif
+> 	     typedef int dummy;
+> 
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+> 
+> 	# Check for potential -arch flags.  It is not universal unless
+> 	# there are some -arch flags.  Note that *ppc* also matches
+> 	# ppc64.  This check is also rather less than ideal.
+> 	case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in  #(
+> 	  *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;;
+> 	esac
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+>     if test $ac_cv_c_bigendian = unknown; then
+>       # See if sys/param.h defines the BYTE_ORDER macro.
+>       cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2569,2570c6351
+< #include <sys/param.h>
+< int main() {
+---
+> 	     #include <sys/param.h>
+2572,2578c6353,6383
+< #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+<  bogus endian macros
+< #endif
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2578: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+---
+> int
+> main ()
+> {
+> #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+> 		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+> 		     && LITTLE_ENDIAN)
+> 	      bogus endian macros
+> 	     #endif
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+2580,2582c6385,6390
+< cat > conftest.$ac_ext <<EOF
+< #line 2582 "configure"
+< #include "confdefs.h"
+---
+> 	 cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2584,2585c6392
+< #include <sys/param.h>
+< int main() {
+---
+> 		#include <sys/param.h>
+2586a6394,6396
+> int
+> main ()
+> {
+2588,2593c6398,6422
+<  not big endian
+< #endif
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+<   rm -rf conftest*
+---
+> 		 not big endian
+> 		#endif
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+2596,2599c6425,6428
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_c_bigendian=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_c_bigendian=no
+2601c6430,6431
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+2603,2604c6433,6436
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2606,2622c6438,6459
+< rm -f conftest*
+< if test $ac_cv_c_bigendian = unknown; then
+< if test "$cross_compiling" = yes; then
+<     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2613 "configure"
+< #include "confdefs.h"
+< main () {
+<   /* Are we little or big endian?  From Harbison&Steele.  */
+<   union
+<   {
+<     long l;
+<     char c[sizeof (long)];
+<   } u;
+<   u.l = 1;
+<   exit (u.c[sizeof (long) - 1] == 1);
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+>     fi
+>     if test $ac_cv_c_bigendian = unknown; then
+>       # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+>       cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <limits.h>
+> 
+> int
+> main ()
+> {
+> #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+> 	      bogus endian macros
+> 	     #endif
+> 
+>   ;
+>   return 0;
+2624,2631c6461,6517
+< EOF
+< if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+<   ac_cv_c_bigendian=no
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+---
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   # It does; now see whether it defined to _BIG_ENDIAN or not.
+> 	 cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <limits.h>
+> 
+> int
+> main ()
+> {
+> #ifndef _BIG_ENDIAN
+> 		 not big endian
+> 		#endif
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+2632a6519,6531
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_c_bigendian=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2634c6533,6603
+< rm -fr conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+>     fi
+>     if test $ac_cv_c_bigendian = unknown; then
+>       # Compile a test program.
+>       if test "$cross_compiling" = yes; then
+>   # Try to guess by grepping values from an object file.
+> 	 cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> short int ascii_mm[] =
+> 		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+> 		short int ascii_ii[] =
+> 		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+> 		int use_ascii (int i) {
+> 		  return ascii_mm[i] + ascii_ii[i];
+> 		}
+> 		short int ebcdic_ii[] =
+> 		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+> 		short int ebcdic_mm[] =
+> 		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+> 		int use_ebcdic (int i) {
+> 		  return ebcdic_mm[i] + ebcdic_ii[i];
+> 		}
+> 		extern int foo;
+> 
+> int
+> main ()
+> {
+> return use_ascii (foo) == use_ebcdic (foo);
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+> 	      ac_cv_c_bigendian=yes
+> 	    fi
+> 	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+> 	      if test "$ac_cv_c_bigendian" = unknown; then
+> 		ac_cv_c_bigendian=no
+> 	      else
+> 		# finding both strings is unlikely to happen, but who knows?
+> 		ac_cv_c_bigendian=unknown
+> 	      fi
+> 	    fi
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2636a6606,6661
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> 
+> 	     /* Are we little or big endian?  From Harbison&Steele.  */
+> 	     union
+> 	     {
+> 	       long int l;
+> 	       char c[sizeof (long int)];
+> 	     } u;
+> 	     u.l = 1;
+> 	     return u.c[sizeof (long int) - 1] == 1;
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+>   ac_cv_c_bigendian=no
+> else
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ac_cv_c_bigendian=yes
+2637a6663,6664
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+2640,2644d6666
+< echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+< if test $ac_cv_c_bigendian = yes; then
+<   cat >> confdefs.h <<\EOF
+< #define WORDS_BIGENDIAN 1
+< EOF
+2645a6668
+>     fi
+2646a6670,6693
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+> $as_echo "$ac_cv_c_bigendian" >&6; }
+>  case $ac_cv_c_bigendian in #(
+>    yes)
+>      cat >>confdefs.h <<\_ACEOF
+> #define WORDS_BIGENDIAN 1
+> _ACEOF
+> ;; #(
+>    no)
+>       ;; #(
+>    universal)
+> 
+> cat >>confdefs.h <<\_ACEOF
+> #define AC_APPLE_UNIVERSAL_BUILD 1
+> _ACEOF
+> 
+>      ;; #(
+>    *)
+>      { { $as_echo "$as_me:$LINENO: error: unknown endianness
+>  presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+> $as_echo "$as_me: error: unknown endianness
+>  presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+>  esac
+2659,2666c6706,6720
+< echo $ac_n "checking for nl_langinfo""... $ac_c" 1>&6
+< echo "configure:2661: checking for nl_langinfo" >&5
+< if eval "test \"`echo '$''{'ac_cv_func_nl_langinfo'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2666 "configure"
+< #include "confdefs.h"
+---
+> { $as_echo "$as_me:$LINENO: checking for nl_langinfo" >&5
+> $as_echo_n "checking for nl_langinfo... " >&6; }
+> if test "${ac_cv_func_nl_langinfo+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> /* Define nl_langinfo to an innocuous variant, in case <limits.h> declares nl_langinfo.
+>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+> #define nl_langinfo innocuous_nl_langinfo
+> 
+2668,2673c6722,6724
+<     which can conflict with char nl_langinfo(); below.  */
+< #include <assert.h>
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char nl_langinfo();
+---
+>     which can conflict with char nl_langinfo (); below.
+>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>     <limits.h> exists even on freestanding compilers.  */
+2675c6726,6730
+< int main() {
+---
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+2676a6732,6740
+> #undef nl_langinfo
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char nl_langinfo ();
+2680c6744
+< #if defined (__stub_nl_langinfo) || defined (__stub___nl_langinfo)
+---
+> #if defined __stub_nl_langinfo || defined __stub___nl_langinfo
+2682,2683d6745
+< #else
+< nl_langinfo();
+2686,2701c6748,6791
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_func_nl_langinfo=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_func_nl_langinfo=no"
+< fi
+< rm -f conftest*
+< fi
+< 
+< if eval "test \"`echo '$ac_cv_func_'nl_langinfo`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+---
+> int
+> main ()
+> {
+> return nl_langinfo ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_func_nl_langinfo=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func_nl_langinfo=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_nl_langinfo" >&5
+> $as_echo "$ac_cv_func_nl_langinfo" >&6; }
+> if test "x$ac_cv_func_nl_langinfo" = x""yes; then
+2704,2705c6794
+<   echo "$ac_t""no" 1>&6
+< U_HAVE_NL_LANGINFO=0
+---
+>   U_HAVE_NL_LANGINFO=0
+2710,2713c6799,6802
+<   echo $ac_n "checking for nl_langinfo's argument to obtain the codeset""... $ac_c" 1>&6
+< echo "configure:2712: checking for nl_langinfo's argument to obtain the codeset" >&5
+< if eval "test \"`echo '$''{'ac_cv_nl_langinfo_codeset'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+>   { $as_echo "$as_me:$LINENO: checking for nl_langinfo's argument to obtain the codeset" >&5
+> $as_echo_n "checking for nl_langinfo's argument to obtain the codeset... " >&6; }
+> if test "${ac_cv_nl_langinfo_codeset+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+2717,2719c6806,6811
+<   cat > conftest.$ac_ext <<EOF
+< #line 2719 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2721c6813,6815
+< int main() {
+---
+> int
+> main ()
+> {
+2723,2726c6817,6841
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2729,2730c6844,6847
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+2732c6849,6852
+< rm -f conftest*
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2735,2736c6855,6856
+< 
+< echo "$ac_t""$ac_cv_nl_langinfo_codeset" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_nl_langinfo_codeset" >&5
+> $as_echo "$ac_cv_nl_langinfo_codeset" >&6; }
+2746,2747c6866
+< ac_ext=C
+< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+---
+> ac_ext=cpp
+2749,2760c6868,6882
+< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cxx_cross
+< 
+< echo $ac_n "checking for namespace support""... $ac_c" 1>&6
+< echo "configure:2755: checking for namespace support" >&5
+< if eval "test \"`echo '$''{'ac_cv_namespace_ok'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2760 "configure"
+< #include "confdefs.h"
+---
+> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+> 
+> { $as_echo "$as_me:$LINENO: checking for namespace support" >&5
+> $as_echo_n "checking for namespace support... " >&6; }
+> if test "${ac_cv_namespace_ok+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2764,2765c6886,6889
+<     
+< int main() {
+---
+> 
+> int
+> main ()
+> {
+2767,2770c6891,6915
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2773,2776c6918,6921
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_namespace_ok=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_namespace_ok=no
+2778c6923,6926
+< rm -f conftest* 
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2781c6929,6930
+< echo "$ac_t""$ac_cv_namespace_ok" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_namespace_ok" >&5
+> $as_echo "$ac_cv_namespace_ok" >&6; }
+2789,2790c6938,6939
+< echo $ac_n "checking for properly overriding new and delete""... $ac_c" 1>&6
+< echo "configure:2791: checking for properly overriding new and delete" >&5
+---
+> { $as_echo "$as_me:$LINENO: checking for properly overriding new and delete" >&5
+> $as_echo_n "checking for properly overriding new and delete... " >&6; }
+2793,2794c6942,6943
+< if eval "test \"`echo '$''{'ac_cv_override_cxx_allocation_ok'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> if test "${ac_cv_override_cxx_allocation_ok+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+2796,2798c6945,6950
+<   cat > conftest.$ac_ext <<EOF
+< #line 2798 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2807,2813c6959,6988
+<     
+< int main() {
+<     
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2816,2819c6991,6994
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_override_cxx_allocation_ok=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_override_cxx_allocation_ok=no
+2821c6996,6999
+< rm -f conftest* 
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2824c7002,7003
+< echo "$ac_t""$ac_cv_override_cxx_allocation_ok" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_override_cxx_allocation_ok" >&5
+> $as_echo "$ac_cv_override_cxx_allocation_ok" >&6; }
+2828,2835c7007,7017
+<     echo $ac_n "checking for placement new and delete""... $ac_c" 1>&6
+< echo "configure:2830: checking for placement new and delete" >&5
+<     if eval "test \"`echo '$''{'ac_cv_override_placement_new_ok'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2835 "configure"
+< #include "confdefs.h"
+---
+>     { $as_echo "$as_me:$LINENO: checking for placement new and delete" >&5
+> $as_echo_n "checking for placement new and delete... " >&6; }
+>     if test "${ac_cv_override_placement_new_ok+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+2846,2852c7028,7057
+<         
+< int main() {
+<         
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+> 
+> int
+> main ()
+> {
+> 
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_cxx_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+2855,2858c7060,7063
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_override_placement_new_ok=no
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_override_placement_new_ok=no
+2860c7065,7068
+< rm -f conftest* 
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2863c7071,7072
+<     echo "$ac_t""$ac_cv_override_placement_new_ok" 1>&6
+---
+>     { $as_echo "$as_me:$LINENO: result: $ac_cv_override_placement_new_ok" >&5
+> $as_echo "$ac_cv_override_placement_new_ok" >&6; }
+2873d7081
+< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+2875,2886c7083,7101
+< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+< cross_compiling=$ac_cv_prog_cc_cross
+< 
+< echo $ac_n "checking for popen""... $ac_c" 1>&6
+< echo "configure:2881: checking for popen" >&5
+< if eval "test \"`echo '$''{'ac_cv_func_popen'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2886 "configure"
+< #include "confdefs.h"
+---
+> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+> ac_compiler_gnu=$ac_cv_c_compiler_gnu
+> 
+> { $as_echo "$as_me:$LINENO: checking for popen" >&5
+> $as_echo_n "checking for popen... " >&6; }
+> if test "${ac_cv_func_popen+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> /* Define popen to an innocuous variant, in case <limits.h> declares popen.
+>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+> #define popen innocuous_popen
+> 
+2888,2893c7103,7111
+<     which can conflict with char popen(); below.  */
+< #include <assert.h>
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char popen();
+---
+>     which can conflict with char popen (); below.
+>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>     <limits.h> exists even on freestanding compilers.  */
+> 
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+2895c7113
+< int main() {
+---
+> #undef popen
+2896a7115,7121
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char popen ();
+2900c7125
+< #if defined (__stub_popen) || defined (__stub___popen)
+---
+> #if defined __stub_popen || defined __stub___popen
+2902,2903d7126
+< #else
+< popen();
+2906,2924c7129,7168
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_func_popen=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_func_popen=no"
+< fi
+< rm -f conftest*
+< fi
+< 
+< if eval "test \"`echo '$ac_cv_func_'popen`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<   :
+< else
+<   echo "$ac_t""no" 1>&6
+---
+> int
+> main ()
+> {
+> return popen ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_func_popen=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func_popen=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2925a7170,7171
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_popen" >&5
+> $as_echo "$ac_cv_func_popen" >&6; }
+2935,2942c7181,7195
+< echo $ac_n "checking for tzset""... $ac_c" 1>&6
+< echo "configure:2937: checking for tzset" >&5
+< if eval "test \"`echo '$''{'ac_cv_func_tzset'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2942 "configure"
+< #include "confdefs.h"
+---
+> { $as_echo "$as_me:$LINENO: checking for tzset" >&5
+> $as_echo_n "checking for tzset... " >&6; }
+> if test "${ac_cv_func_tzset+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> /* Define tzset to an innocuous variant, in case <limits.h> declares tzset.
+>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+> #define tzset innocuous_tzset
+> 
+2944,2949c7197,7199
+<     which can conflict with char tzset(); below.  */
+< #include <assert.h>
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char tzset();
+---
+>     which can conflict with char tzset (); below.
+>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>     <limits.h> exists even on freestanding compilers.  */
+2951c7201,7205
+< int main() {
+---
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+2952a7207,7215
+> #undef tzset
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char tzset ();
+2956c7219
+< #if defined (__stub_tzset) || defined (__stub___tzset)
+---
+> #if defined __stub_tzset || defined __stub___tzset
+2958,2959d7220
+< #else
+< tzset();
+2962,2980c7223,7262
+< ; return 0; }
+< EOF
+< if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_func_tzset=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_func_tzset=no"
+< fi
+< rm -f conftest*
+< fi
+< 
+< if eval "test \"`echo '$ac_cv_func_'tzset`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<   :
+< else
+<   echo "$ac_t""no" 1>&6
+---
+> int
+> main ()
+> {
+> return tzset ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_func_tzset=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func_tzset=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+2981a7264,7265
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_tzset" >&5
+> $as_echo "$ac_cv_func_tzset" >&6; }
+2989,2996c7273,7287
+<     echo $ac_n "checking for _tzset""... $ac_c" 1>&6
+< echo "configure:2991: checking for _tzset" >&5
+< if eval "test \"`echo '$''{'ac_cv_func__tzset'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 2996 "configure"
+< #include "confdefs.h"
+---
+>     { $as_echo "$as_me:$LINENO: checking for _tzset" >&5
+> $as_echo_n "checking for _tzset... " >&6; }
+> if test "${ac_cv_func__tzset+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> /* Define _tzset to an innocuous variant, in case <limits.h> declares _tzset.
+>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+> #define _tzset innocuous__tzset
+> 
+2998,3003c7289,7297
+<     which can conflict with char _tzset(); below.  */
+< #include <assert.h>
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char _tzset();
+---
+>     which can conflict with char _tzset (); below.
+>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+>     <limits.h> exists even on freestanding compilers.  */
+> 
+> #ifdef __STDC__
+> # include <limits.h>
+> #else
+> # include <assert.h>
+> #endif
+3005c7299
+< int main() {
+---
+> #undef _tzset
+3006a7301,7307
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char _tzset ();
+3010c7311
+< #if defined (__stub__tzset) || defined (__stub____tzset)
+---
+> #if defined __stub__tzset || defined __stub____tzset
+3012,3013d7312
+< #else
+< _tzset();
+3016,3034c7315,7354
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   eval "ac_cv_func__tzset=yes"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_func__tzset=no"
+< fi
+< rm -f conftest*
+< fi
+< 
+< if eval "test \"`echo '$ac_cv_func_'_tzset`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<   :
+< else
+<   echo "$ac_t""no" 1>&6
+---
+> int
+> main ()
+> {
+> return _tzset ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_func__tzset=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_func__tzset=no
+> fi
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+3035a7356,7357
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_func__tzset" >&5
+> $as_echo "$ac_cv_func__tzset" >&6; }
+3047,3054c7369,7379
+< echo $ac_n "checking for tzname""... $ac_c" 1>&6
+< echo "configure:3049: checking for tzname" >&5
+< if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3054 "configure"
+< #include "confdefs.h"
+---
+> { $as_echo "$as_me:$LINENO: checking for tzname" >&5
+> $as_echo_n "checking for tzname... " >&6; }
+> if test "${ac_cv_var_tzname+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3063c7388,7390
+< int main() {
+---
+> int
+> main ()
+> {
+3065,3068c7392,7416
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+3071,3076c7419,7422
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_var_tzname=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_var_tzname=no
+3079c7425,7430
+< echo "$ac_t""$ac_cv_var_tzname" 1>&6
+---
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
+> $as_echo "$ac_cv_var_tzname" >&6; }
+3084,3091c7435,7445
+<   echo $ac_n "checking for _tzname""... $ac_c" 1>&6
+< echo "configure:3086: checking for _tzname" >&5
+< if eval "test \"`echo '$''{'ac_cv_var__tzname'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3091 "configure"
+< #include "confdefs.h"
+---
+>   { $as_echo "$as_me:$LINENO: checking for _tzname" >&5
+> $as_echo_n "checking for _tzname... " >&6; }
+> if test "${ac_cv_var__tzname+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3095,3096c7449,7452
+<   
+< int main() {
+---
+> 
+> int
+> main ()
+> {
+3098,3101c7454,7478
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+3104,3109c7481,7484
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_var__tzname=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_var__tzname=no
+3112c7487,7492
+< echo "$ac_t""$ac_cv_var__tzname" 1>&6
+---
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_var__tzname" >&5
+> $as_echo "$ac_cv_var__tzname" >&6; }
+3121,3128c7501,7511
+< echo $ac_n "checking for timezone""... $ac_c" 1>&6
+< echo "configure:3123: checking for timezone" >&5
+< if eval "test \"`echo '$''{'ac_cv_var_timezone'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3128 "configure"
+< #include "confdefs.h"
+---
+> { $as_echo "$as_me:$LINENO: checking for timezone" >&5
+> $as_echo_n "checking for timezone... " >&6; }
+> if test "${ac_cv_var_timezone+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3137c7520,7522
+< int main() {
+---
+> int
+> main ()
+> {
+3139,3142c7524,7548
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+3145,3150c7551,7554
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_var_timezone=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_var_timezone=no
+3153c7557,7562
+< echo "$ac_t""$ac_cv_var_timezone" 1>&6
+---
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_var_timezone" >&5
+> $as_echo "$ac_cv_var_timezone" >&6; }
+3159,3166c7568,7578
+<   echo $ac_n "checking for __timezone""... $ac_c" 1>&6
+< echo "configure:3161: checking for __timezone" >&5
+< if eval "test \"`echo '$''{'ac_cv_var___timezone'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3166 "configure"
+< #include "confdefs.h"
+---
+>   { $as_echo "$as_me:$LINENO: checking for __timezone" >&5
+> $as_echo_n "checking for __timezone... " >&6; }
+> if test "${ac_cv_var___timezone+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3168,3169c7580,7583
+<   
+< int main() {
+---
+> 
+> int
+> main ()
+> {
+3171,3174c7585,7609
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+3177,3182c7612,7615
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_var___timezone=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_var___timezone=no
+3185c7618,7623
+< echo "$ac_t""$ac_cv_var___timezone" 1>&6
+---
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_var___timezone" >&5
+> $as_echo "$ac_cv_var___timezone" >&6; }
+3190,3197c7628,7638
+<     echo $ac_n "checking for _timezone""... $ac_c" 1>&6
+< echo "configure:3192: checking for _timezone" >&5
+< if eval "test \"`echo '$''{'ac_cv_var__timezone'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3197 "configure"
+< #include "confdefs.h"
+---
+>     { $as_echo "$as_me:$LINENO: checking for _timezone" >&5
+> $as_echo_n "checking for _timezone... " >&6; }
+> if test "${ac_cv_var__timezone+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3199,3200c7640,7643
+<     
+< int main() {
+---
+> 
+> int
+> main ()
+> {
+3202,3205c7645,7669
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+---
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+3208,3213c7672,7675
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_var__timezone=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_var__timezone=no
+3216c7678,7683
+< echo "$ac_t""$ac_cv_var__timezone" 1>&6
+---
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_var__timezone" >&5
+> $as_echo "$ac_cv_var__timezone" >&6; }
+3226,3244c7693,7696
+< echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+< echo "configure:3228: checking for ANSI C header files" >&5
+< if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3233 "configure"
+< #include "confdefs.h"
+< #include <stdlib.h>
+< #include <stdarg.h>
+< #include <string.h>
+< #include <float.h>
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:3241: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+<   rm -rf conftest*
+<   ac_cv_header_stdc=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for int8_t" >&5
+> $as_echo_n "checking for int8_t... " >&6; }
+> if test "${ac_cv_type_int8_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3246,3262c7698,7766
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   ac_cv_header_stdc=no
+< fi
+< rm -f conftest*
+< 
+< if test $ac_cv_header_stdc = yes; then
+<   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+< cat > conftest.$ac_ext <<EOF
+< #line 3258 "configure"
+< #include "confdefs.h"
+< #include <string.h>
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "memchr" >/dev/null 2>&1; then
+---
+>   ac_cv_type_int8_t=no
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (int8_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((int8_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+3265,3268c7769,7770
+<   rm -rf conftest*
+<   ac_cv_header_stdc=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+3269a7772
+> 	ac_cv_type_int8_t=yes
+3272,3281c7775
+< if test $ac_cv_header_stdc = yes; then
+<   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+< cat > conftest.$ac_ext <<EOF
+< #line 3276 "configure"
+< #include "confdefs.h"
+< #include <stdlib.h>
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "free" >/dev/null 2>&1; then
+<   :
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+3283,3286c7777,7779
+<   rm -rf conftest*
+<   ac_cv_header_stdc=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3290,3292c7783,7787
+< if test $ac_cv_header_stdc = yes; then
+<   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+< if test "$cross_compiling" = yes; then
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5
+> $as_echo "$ac_cv_type_int8_t" >&6; }
+> if test "x$ac_cv_type_int8_t" = x""yes; then
+3295,3304d7789
+<   cat > conftest.$ac_ext <<EOF
+< #line 3297 "configure"
+< #include "confdefs.h"
+< #include <ctype.h>
+< #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+< #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+< #define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+< int main () { int i; for (i = 0; i < 256; i++)
+< if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+< exit (0); }
+3306,3317c7791,7793
+< EOF
+< if { (eval echo configure:3308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+<   :
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+<   ac_cv_header_stdc=no
+< fi
+< rm -fr conftest*
+< fi
+---
+> cat >>confdefs.h <<_ACEOF
+> #define int8_t signed char
+> _ACEOF
+3320d7795
+< fi
+3322,3326c7797,7874
+< echo "$ac_t""$ac_cv_header_stdc" 1>&6
+< if test $ac_cv_header_stdc = yes; then
+<   cat >> confdefs.h <<\EOF
+< #define STDC_HEADERS 1
+< EOF
+---
+> { $as_echo "$as_me:$LINENO: checking for uint8_t" >&5
+> $as_echo_n "checking for uint8_t... " >&6; }
+> if test "${ac_cv_type_uint8_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_cv_type_uint8_t=no
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (uint8_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((uint8_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+3327a7876
+> 	ac_cv_type_uint8_t=yes
+3330,3333c7879
+< echo $ac_n "checking for int8_t""... $ac_c" 1>&6
+< echo "configure:3332: checking for int8_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_int8_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+3335,3352c7881,7882
+<   cat > conftest.$ac_ext <<EOF
+< #line 3337 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])int8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_int8_t=yes
+< else
+<   rm -rf conftest*
+<   ac_cv_type_int8_t=no
+< fi
+< rm -f conftest*
+---
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+3354,3359d7883
+< fi
+< echo "$ac_t""$ac_cv_type_int8_t" 1>&6
+< if test $ac_cv_type_int8_t = no; then
+<   cat >> confdefs.h <<\EOF
+< #define int8_t signed char
+< EOF
+3363,3383c7887
+< echo $ac_n "checking for uint8_t""... $ac_c" 1>&6
+< echo "configure:3365: checking for uint8_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_uint8_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3370 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])uint8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_uint8_t=yes
+< else
+<   rm -rf conftest*
+<   ac_cv_type_uint8_t=no
+---
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+3385c7889,7893
+< rm -f conftest*
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5
+> $as_echo "$ac_cv_type_uint8_t" >&6; }
+> if test "x$ac_cv_type_uint8_t" = x""yes; then
+>   :
+> else
+3387,3390c7895
+< fi
+< echo "$ac_t""$ac_cv_type_uint8_t" 1>&6
+< if test $ac_cv_type_uint8_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> cat >>confdefs.h <<_ACEOF
+3392c7897
+< EOF
+---
+> _ACEOF
+3396,3413c7901,7904
+< echo $ac_n "checking for int16_t""... $ac_c" 1>&6
+< echo "configure:3398: checking for int16_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3403 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])int16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_int16_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for int16_t" >&5
+> $as_echo_n "checking for int16_t... " >&6; }
+> if test "${ac_cv_type_int16_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3415d7905
+<   rm -rf conftest*
+3416a7907,7980
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (int16_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((int16_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_int16_t=yes
+3418c7982,7987
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3421,3423c7990,7999
+< echo "$ac_t""$ac_cv_type_int16_t" 1>&6
+< if test $ac_cv_type_int16_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5
+> $as_echo "$ac_cv_type_int16_t" >&6; }
+> if test "x$ac_cv_type_int16_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3425c8001
+< EOF
+---
+> _ACEOF
+3429,3446c8005,8008
+< echo $ac_n "checking for uint16_t""... $ac_c" 1>&6
+< echo "configure:3431: checking for uint16_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_uint16_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3436 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])uint16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_uint16_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for uint16_t" >&5
+> $as_echo_n "checking for uint16_t... " >&6; }
+> if test "${ac_cv_type_uint16_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3448d8009
+<   rm -rf conftest*
+3449a8011,8084
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (uint16_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((uint16_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_uint16_t=yes
+3451c8086,8091
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3454,3456c8094,8103
+< echo "$ac_t""$ac_cv_type_uint16_t" 1>&6
+< if test $ac_cv_type_uint16_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5
+> $as_echo "$ac_cv_type_uint16_t" >&6; }
+> if test "x$ac_cv_type_uint16_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3458c8105
+< EOF
+---
+> _ACEOF
+3462,3479c8109,8112
+< echo $ac_n "checking for int32_t""... $ac_c" 1>&6
+< echo "configure:3464: checking for int32_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3469 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_int32_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for int32_t" >&5
+> $as_echo_n "checking for int32_t... " >&6; }
+> if test "${ac_cv_type_int32_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3481d8113
+<   rm -rf conftest*
+3482a8115,8188
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (int32_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((int32_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_int32_t=yes
+3484c8190,8195
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3487,3489c8198,8207
+< echo "$ac_t""$ac_cv_type_int32_t" 1>&6
+< if test $ac_cv_type_int32_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
+> $as_echo "$ac_cv_type_int32_t" >&6; }
+> if test "x$ac_cv_type_int32_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3491c8209
+< EOF
+---
+> _ACEOF
+3495,3512c8213,8216
+< echo $ac_n "checking for uint32_t""... $ac_c" 1>&6
+< echo "configure:3497: checking for uint32_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_uint32_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3502 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_uint32_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5
+> $as_echo_n "checking for uint32_t... " >&6; }
+> if test "${ac_cv_type_uint32_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3514d8217
+<   rm -rf conftest*
+3515a8219,8292
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (uint32_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((uint32_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_uint32_t=yes
+3517c8294,8299
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3520,3522c8302,8311
+< echo "$ac_t""$ac_cv_type_uint32_t" 1>&6
+< if test $ac_cv_type_uint32_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
+> $as_echo "$ac_cv_type_uint32_t" >&6; }
+> if test "x$ac_cv_type_uint32_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3524c8313
+< EOF
+---
+> _ACEOF
+3528,3545c8317,8320
+< echo $ac_n "checking for int64_t""... $ac_c" 1>&6
+< echo "configure:3530: checking for int64_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_int64_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3535 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])int64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_int64_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for int64_t" >&5
+> $as_echo_n "checking for int64_t... " >&6; }
+> if test "${ac_cv_type_int64_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3547d8321
+<   rm -rf conftest*
+3548a8323,8404
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (int64_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((int64_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_int64_t=yes
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+3550d8405
+< rm -f conftest*
+3551a8407
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+3553,3555c8409,8415
+< echo "$ac_t""$ac_cv_type_int64_t" 1>&6
+< if test $ac_cv_type_int64_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5
+> $as_echo "$ac_cv_type_int64_t" >&6; }
+> if test "x$ac_cv_type_int64_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3557c8417
+< EOF
+---
+> _ACEOF
+3561,3578c8421,8424
+< echo $ac_n "checking for uint64_t""... $ac_c" 1>&6
+< echo "configure:3563: checking for uint64_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_type_uint64_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3568 "configure"
+< #include "confdefs.h"
+< #include <sys/types.h>
+< #if STDC_HEADERS
+< #include <stdlib.h>
+< #include <stddef.h>
+< #endif
+< EOF
+< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+<   egrep "(^|[^a-zA-Z_0-9])uint64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+<   rm -rf conftest*
+<   ac_cv_type_uint64_t=yes
+---
+> { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5
+> $as_echo_n "checking for uint64_t... " >&6; }
+> if test "${ac_cv_type_uint64_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3580d8425
+<   rm -rf conftest*
+3581a8427,8500
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof (uint64_t))
+>        return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+> int
+> main ()
+> {
+> if (sizeof ((uint64_t)))
+> 	  return 0;
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   :
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_cv_type_uint64_t=yes
+3583c8502,8507
+< rm -f conftest*
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+3586,3588c8510,8519
+< echo "$ac_t""$ac_cv_type_uint64_t" 1>&6
+< if test $ac_cv_type_uint64_t = no; then
+<   cat >> confdefs.h <<\EOF
+---
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+> $as_echo "$ac_cv_type_uint64_t" >&6; }
+> if test "x$ac_cv_type_uint64_t" = x""yes; then
+>   :
+> else
+> 
+> cat >>confdefs.h <<_ACEOF
+3590c8521
+< EOF
+---
+> _ACEOF
+3651,3659c8582,8600
+< ac_safe=`echo "wchar.h" | sed 'y%./+-%__p_%'`
+< echo $ac_n "checking for wchar.h""... $ac_c" 1>&6
+< echo "configure:3654: checking for wchar.h" >&5
+< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   cat > conftest.$ac_ext <<EOF
+< #line 3659 "configure"
+< #include "confdefs.h"
+---
+> if test "${ac_cv_header_wchar_h+set}" = set; then
+>   { $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
+> $as_echo_n "checking for wchar.h... " >&6; }
+> if test "${ac_cv_header_wchar_h+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
+> $as_echo "$ac_cv_header_wchar_h" >&6; }
+> else
+>   # Is the header compilable?
+> { $as_echo "$as_me:$LINENO: checking wchar.h usability" >&5
+> $as_echo_n "checking wchar.h usability... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> $ac_includes_default
+3661,3679c8602,8701
+< EOF
+< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+< { (eval echo configure:3664: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+< if test -z "$ac_err"; then
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=yes"
+< else
+<   echo "$ac_err" >&5
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -rf conftest*
+<   eval "ac_cv_header_$ac_safe=no"
+< fi
+< rm -f conftest*
+< fi
+< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+<   echo "$ac_t""yes" 1>&6
+<   :
+---
+> _ACEOF
+> rm -f conftest.$ac_objext
+> if { (ac_try="$ac_compile"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_compile") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest.$ac_objext; then
+>   ac_header_compiler=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 	ac_header_compiler=no
+> fi
+> 
+> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+> $as_echo "$ac_header_compiler" >&6; }
+> 
+> # Is the header present?
+> { $as_echo "$as_me:$LINENO: checking wchar.h presence" >&5
+> $as_echo_n "checking wchar.h presence... " >&6; }
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> #include <wchar.h>
+> _ACEOF
+> if { (ac_try="$ac_cpp conftest.$ac_ext"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } >/dev/null && {
+> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        }; then
+>   ac_header_preproc=yes
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+>   ac_header_preproc=no
+> fi
+> 
+> rm -f conftest.err conftest.$ac_ext
+> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+> $as_echo "$ac_header_preproc" >&6; }
+> 
+> # So?  What about this header?
+> case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+>   yes:no: )
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&5
+> $as_echo "$as_me: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the compiler's result" >&5
+> $as_echo "$as_me: WARNING: wchar.h: proceeding with the compiler's result" >&2;}
+>     ac_header_preproc=yes
+>     ;;
+>   no:yes:* )
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: present but cannot be compiled" >&5
+> $as_echo "$as_me: WARNING: wchar.h: present but cannot be compiled" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     check for missing prerequisite headers?" >&5
+> $as_echo "$as_me: WARNING: wchar.h:     check for missing prerequisite headers?" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: see the Autoconf documentation" >&5
+> $as_echo "$as_me: WARNING: wchar.h: see the Autoconf documentation" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&5
+> $as_echo "$as_me: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the preprocessor's result" >&5
+> $as_echo "$as_me: WARNING: wchar.h: proceeding with the preprocessor's result" >&2;}
+>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: in the future, the compiler will take precedence" >&5
+> $as_echo "$as_me: WARNING: wchar.h: in the future, the compiler will take precedence" >&2;}
+> 
+>     ;;
+> esac
+> { $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
+> $as_echo_n "checking for wchar.h... " >&6; }
+> if test "${ac_cv_header_wchar_h+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3681c8703,8707
+<   echo "$ac_t""no" 1>&6
+---
+>   ac_cv_header_wchar_h=$ac_header_preproc
+> fi
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
+> $as_echo "$ac_cv_header_wchar_h" >&6; }
+> 
+3683a8710
+> 
+3689c8716
+<     cat >> confdefs.h <<\EOF
+---
+>     cat >>confdefs.h <<\_ACEOF
+3691c8718
+< EOF
+---
+> _ACEOF
+3694,3719c8721,8782
+<         
+< echo $ac_n "checking for library containing wcscpy""... $ac_c" 1>&6
+< echo "configure:3697: checking for library containing wcscpy" >&5
+< if eval "test \"`echo '$''{'ac_cv_search_wcscpy'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+< else
+<   ac_func_search_save_LIBS="$LIBS"
+< ac_cv_search_wcscpy="no"
+< cat > conftest.$ac_ext <<EOF
+< #line 3704 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char wcscpy();
+< 
+< int main() {
+< wcscpy()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   ac_cv_search_wcscpy="none required"
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+>         { $as_echo "$as_me:$LINENO: checking for library containing wcscpy" >&5
+> $as_echo_n "checking for library containing wcscpy... " >&6; }
+> if test "${ac_cv_search_wcscpy+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+> else
+>   ac_func_search_save_LIBS=$LIBS
+> cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+> 
+> /* Override any GCC internal prototype to avoid an error.
+>    Use char because int might match the return type of a GCC
+>    builtin and then its argument prototype would still apply.  */
+> #ifdef __cplusplus
+> extern "C"
+> #endif
+> char wcscpy ();
+> int
+> main ()
+> {
+> return wcscpy ();
+>   ;
+>   return 0;
+> }
+> _ACEOF
+> for ac_lib in '' wcs w; do
+>   if test -z "$ac_lib"; then
+>     ac_res="none required"
+>   else
+>     ac_res=-l$ac_lib
+>     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+>   fi
+>   rm -f conftest.$ac_objext conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>conftest.er1
+>   ac_status=$?
+>   grep -v '^ *+' conftest.er1 >conftest.err
+>   rm -f conftest.er1
+>   cat conftest.err >&5
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && {
+> 	 test -z "$ac_c_werror_flag" ||
+> 	 test ! -s conftest.err
+>        } && test -s conftest$ac_exeext && {
+> 	 test "$cross_compiling" = yes ||
+> 	 $as_test_x conftest$ac_exeext
+>        }; then
+>   ac_cv_search_wcscpy=$ac_res
+> else
+>   $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> 
+3721,3742c8784,8789
+< rm -f conftest*
+< test "$ac_cv_search_wcscpy" = "no" && for i in wcs w; do
+< LIBS="-l$i  $ac_func_search_save_LIBS"
+< cat > conftest.$ac_ext <<EOF
+< #line 3726 "configure"
+< #include "confdefs.h"
+< /* Override any gcc2 internal prototype to avoid an error.  */
+< /* We use char because int might match the return type of a gcc2
+<     builtin and then its argument prototype would still apply.  */
+< char wcscpy();
+< 
+< int main() {
+< wcscpy()
+< ; return 0; }
+< EOF
+< if { (eval echo configure:3737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+<   rm -rf conftest*
+<   ac_cv_search_wcscpy="-l$i"
+< break
+< else
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+---
+> 
+> rm -rf conftest.dSYM
+> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+>       conftest$ac_exeext
+>   if test "${ac_cv_search_wcscpy+set}" = set; then
+>   break
+3744d8790
+< rm -f conftest*
+3746c8792,8798
+< LIBS="$ac_func_search_save_LIBS"
+---
+> if test "${ac_cv_search_wcscpy+set}" = set; then
+>   :
+> else
+>   ac_cv_search_wcscpy=no
+> fi
+> rm conftest.$ac_ext
+> LIBS=$ac_func_search_save_LIBS
+3747a8800,8804
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_search_wcscpy" >&5
+> $as_echo "$ac_cv_search_wcscpy" >&6; }
+> ac_res=$ac_cv_search_wcscpy
+> if test "$ac_res" != no; then
+>   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+3749,3754d8805
+< echo "$ac_t""$ac_cv_search_wcscpy" 1>&6
+< if test "$ac_cv_search_wcscpy" != "no"; then
+<   test "$ac_cv_search_wcscpy" = "none required" || LIBS="$ac_cv_search_wcscpy $LIBS"
+<   
+< else :
+<   
+3755a8807
+> 
+3766,3769c8818,8821
+< echo $ac_n "checking size of wchar_t""... $ac_c" 1>&6
+< echo "configure:3768: checking size of wchar_t" >&5
+< if eval "test \"`echo '$''{'ac_cv_sizeof_wchar_t'+set}'`\" = set"; then
+<   echo $ac_n "(cached) $ac_c" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: checking size of wchar_t" >&5
+> $as_echo_n "checking size of wchar_t... " >&6; }
+> if test "${ac_cv_sizeof_wchar_t+set}" = set; then
+>   $as_echo_n "(cached) " >&6
+3774,3776c8826,8831
+<   cat > conftest.$ac_ext <<EOF
+< #line 3776 "configure"
+< #include "confdefs.h"
+---
+>   cat >conftest.$ac_ext <<_ACEOF
+> /* confdefs.h.  */
+> _ACEOF
+> cat confdefs.h >>conftest.$ac_ext
+> cat >>conftest.$ac_ext <<_ACEOF
+> /* end confdefs.h.  */
+3792,3794c8847,8869
+< EOF
+< if { (eval echo configure:3794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+< then
+---
+> _ACEOF
+> rm -f conftest$ac_exeext
+> if { (ac_try="$ac_link"
+> case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_link") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+>   { (case "(($ac_try" in
+>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+>   *) ac_try_echo=$ac_try;;
+> esac
+> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+> $as_echo "$ac_try_echo") >&5
+>   (eval "$ac_try") 2>&5
+>   ac_status=$?
+>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+>   (exit $ac_status); }; }; then
+3797,3800c8872,8877
+<   echo "configure: failed program was:" >&5
+<   cat conftest.$ac_ext >&5
+<   rm -fr conftest*
+<   ac_cv_sizeof_wchar_t=0
+---
+>   $as_echo "$as_me: program exited with status $ac_status" >&5
+> $as_echo "$as_me: failed program was:" >&5
+> sed 's/^/| /' conftest.$ac_ext >&5
+> 
+> ( exit $ac_status )
+> ac_cv_sizeof_wchar_t=0
+3802c8879,8880
+< rm -fr conftest*
+---
+> rm -rf conftest.dSYM
+> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+3804a8883
+> 
+3806,3807c8885,8887
+< echo "$ac_t""$ac_cv_sizeof_wchar_t" 1>&6
+< cat >> confdefs.h <<EOF
+---
+> { $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_wchar_t" >&5
+> $as_echo "$ac_cv_sizeof_wchar_t" >&6; }
+> cat >>confdefs.h <<_ACEOF
+3809c8889
+< EOF
+---
+> _ACEOF
+3815c8895,8897
+< 	   { echo "configure: error: There is wchar.h but the size of wchar_t is 0" 1>&2; exit 1; }
+---
+> 	   { { $as_echo "$as_me:$LINENO: error: There is wchar.h but the size of wchar_t is 0" >&5
+> $as_echo "$as_me: error: There is wchar.h but the size of wchar_t is 0" >&2;}
+>    { (exit 1); exit 1; }; }
+3826c8908
+< # Check whether --enable-extras or --disable-extras was given.
+---
+> # Check whether --enable-extras was given.
+3828,3829c8910
+<   enableval="$enable_extras"
+<   case "${enableval}" in
+---
+>   enableval=$enable_extras; case "${enableval}" in
+3832c8913,8915
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-extras" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-extras" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-extras" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+3844c8927
+< # Check whether --enable-extras or --disable-extras was given.
+---
+> # Check whether --enable-extras was given.
+3846,3847c8929
+<   enableval="$enable_extras"
+<   case "${enableval}" in
+---
+>   enableval=$enable_extras; case "${enableval}" in
+3850c8932,8934
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-icuio" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-icuio" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-icuio" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+3863c8947
+< # Check whether --enable-layout or --disable-layout was given.
+---
+> # Check whether --enable-layout was given.
+3865,3866c8949
+<   enableval="$enable_layout"
+<   case "${enableval}" in
+---
+>   enableval=$enable_layout; case "${enableval}" in
+3869c8952,8954
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-layout" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-layout" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-layout" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+3882c8967,8968
+< # Check whether --with-data-packaging or --without-data-packaging was given.
+---
+> 
+> # Check whether --with-data-packaging was given.
+3884,3885c8970
+<   withval="$with_data_packaging"
+<   case "${withval}" in
+---
+>   withval=$with_data_packaging; case "${withval}" in
+3891c8976,8978
+< 		*) { echo "configure: error: bad value ${withval} for --with-data-packaging" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-data-packaging" >&5
+> $as_echo "$as_me: error: bad value ${withval} for --with-data-packaging" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+3910c8997
+< # Check whether --enable-mapped or --disable-mapped was given.
+---
+> # Check whether --enable-mapped was given.
+3912,3913c8999
+<   enableval="$enable_mapped"
+<   case "${enableval}" in
+---
+>   enableval=$enable_mapped; case "${enableval}" in
+3916c9002,9004
+<                *) { echo "configure: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" 1>&2; exit 1; } ;;
+---
+>                *) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+3926c9014,9015
+<     	    echo "configure: warning: use --with-data-packaging=archive instead of --enable-mapped" 1>&2
+---
+>     	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&5
+> $as_echo "$as_me: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&2;}
+3929c9018,9019
+<     	    echo "configure: warning: use --with-data-packaging=library instead of --disable-mapped" 1>&2
+---
+>     	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&5
+> $as_echo "$as_me: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&2;}
+3933c9023,9025
+< 	{ echo "configure: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" 1>&2; exit 1; }
+---
+> 	{ { $as_echo "$as_me:$LINENO: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&5
+> $as_echo "$as_me: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&2;}
+>    { (exit 1); exit 1; }; }
+3959,3961c9051,9054
+< echo $ac_n "checking for a library suffix to use""... $ac_c" 1>&6
+< echo "configure:3961: checking for a library suffix to use" >&5
+< # Check whether --with-library-suffix or --without-library-suffix was given.
+---
+> { $as_echo "$as_me:$LINENO: checking for a library suffix to use" >&5
+> $as_echo_n "checking for a library suffix to use... " >&6; }
+> 
+> # Check whether --with-library-suffix was given.
+3963,3964c9056
+<   withval="$with_library_suffix"
+<   ICULIBSUFFIX="${withval}"
+---
+>   withval=$with_library_suffix; ICULIBSUFFIX="${withval}"
+3973c9065,9066
+< echo "$ac_t""$msg" 1>&6
+---
+> { $as_echo "$as_me:$LINENO: result: $msg" >&5
+> $as_echo "$msg" >&6; }
+3985c9078
+< # Check whether --enable-tests or --disable-tests was given.
+---
+> # Check whether --enable-tests was given.
+3987,3988c9080
+<   enableval="$enable_tests"
+<   case "${enableval}" in
+---
+>   enableval=$enable_tests; case "${enableval}" in
+3991c9083,9085
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-tests" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-tests" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-tests" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+4004c9098
+< # Check whether --enable-samples or --disable-samples was given.
+---
+> # Check whether --enable-samples was given.
+4006,4007c9100
+<   enableval="$enable_samples"
+<   case "${enableval}" in
+---
+>   enableval=$enable_samples; case "${enableval}" in
+4010c9103,9105
+< 		*) { echo "configure: error: bad value ${enableval} for --enable-samples" 1>&2; exit 1; } ;;
+---
+> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-samples" >&5
+> $as_echo "$as_me: error: bad value ${enableval} for --enable-samples" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+4067c9162
+< 	*-*-hpux*) 	
+---
+> 	*-*-hpux*)
+4113,4114c9208,9210
+< trap '' 1 2 15
+< cat > confcache <<\EOF
+---
+> ac_config_files="$ac_config_files icudefs.mk Makefile data/icupkg.inc config/Makefile.inc data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layout/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genuca/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gennames/Makefile tools/gentest/Makefile tools/gennorm/Makefile tools/genprops/Makefile tools/gencase/Makefile tools/genpname/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/toolutil/Makefile tools/dumpce/Makefile test/Makefile test/testdata/Makefile test/testdata/pkgdata.inc test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/thaitest/Makefile test/testmap/Makefile test/letest/Makefile test/threadtest/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile common/unicode/platform.h"
+> 
+> cat >confcache <<\_ACEOF
+4117,4118c9213,9215
+< # scripts and configure runs.  It is not useful on other systems.
+< # If it contains results you don't want to keep, you may remove or edit it.
+---
+> # scripts and configure runs, see configure's option --config-cache.
+> # It is not useful on other systems.  If it contains results you don't
+> # want to keep, you may remove or edit it.
+4120,4127c9217,9218
+< # By default, configure uses ./config.cache as the cache file,
+< # creating it if it does not exist already.  You can give configure
+< # the --cache-file=FILE option to use a different cache file; that is
+< # what configure does when it calls configure scripts in
+< # subdirectories, so they share the cache.
+< # Giving --cache-file=/dev/null disables caching, for debugging configure.
+< # config.status only pays attention to the cache file if you give it the
+< # --recheck option to rerun configure.
+---
+> # config.status only pays attention to the cache file if you give it
+> # the --recheck option to rerun configure.
+4129c9220,9225
+< EOF
+---
+> # `ac_cv_env_foo' variables (set or unset) will be overridden when
+> # loading this file, other *unset* `ac_cv_foo' will be assigned the
+> # following values.
+> 
+> _ACEOF
+> 
+4132c9228
+< # So, don't put newlines in cache variables' values.
+---
+> # So, we kill variables containing newlines.
+4135,4154c9231,9277
+< (set) 2>&1 |
+<   case `(ac_space=' '; set | grep ac_space) 2>&1` in
+<   *ac_space=\ *)
+<     # `set' does not quote correctly, so add quotes (double-quote substitution
+<     # turns \\\\ into \\, and sed turns \\ into \).
+<     sed -n \
+<       -e "s/'/'\\\\''/g" \
+<       -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+<     ;;
+<   *)
+<     # `set' quotes correctly as required by POSIX, so do not add quotes.
+<     sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+<     ;;
+<   esac >> confcache
+< if cmp -s $cache_file confcache; then
+<   :
+< else
+<   if test -w $cache_file; then
+<     echo "updating cache $cache_file"
+<     cat confcache > $cache_file
+---
+> (
+>   for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+>     eval ac_val=\$$ac_var
+>     case $ac_val in #(
+>     *${as_nl}*)
+>       case $ac_var in #(
+>       *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+> $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+>       esac
+>       case $ac_var in #(
+>       _ | IFS | as_nl) ;; #(
+>       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+>       *) $as_unset $ac_var ;;
+>       esac ;;
+>     esac
+>   done
+> 
+>   (set) 2>&1 |
+>     case $as_nl`(ac_space=' '; set) 2>&1` in #(
+>     *${as_nl}ac_space=\ *)
+>       # `set' does not quote correctly, so add quotes (double-quote
+>       # substitution turns \\\\ into \\, and sed turns \\ into \).
+>       sed -n \
+> 	"s/'/'\\\\''/g;
+> 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+>       ;; #(
+>     *)
+>       # `set' quotes correctly as required by POSIX, so do not add quotes.
+>       sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+>       ;;
+>     esac |
+>     sort
+> ) |
+>   sed '
+>      /^ac_cv_env_/b end
+>      t clear
+>      :clear
+>      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+>      t end
+>      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+>      :end' >>confcache
+> if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+>   if test -w "$cache_file"; then
+>     test "x$cache_file" != "x/dev/null" &&
+>       { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+> $as_echo "$as_me: updating cache $cache_file" >&6;}
+>     cat confcache >$cache_file
+4156c9279,9280
+<     echo "not updating unwritable cache $cache_file"
+---
+>     { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+> $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+4161,4162d9284
+< trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+< 
+4167,4172c9289
+< # Any assignment to VPATH causes Sun make to only execute
+< # the first set of double-colon rules, so remove it if not needed.
+< # If there is a colon in the path, we need to keep it.
+< if test "x$srcdir" = x.; then
+<   ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+< fi
+---
+> DEFS=-DHAVE_CONFIG_H
+4174c9291,9302
+< trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+---
+> ac_libobjs=
+> ac_ltlibobjs=
+> for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+>   # 1. Remove the extension, and $U if already installed.
+>   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+>   ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+>   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+>   #    will be set to the directory where LIBOBJS objects are built.
+>   ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+>   ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+> done
+> LIBOBJS=$ac_libobjs
+4176c9304
+< DEFS=-DHAVE_CONFIG_H
+---
+> LTLIBOBJS=$ac_ltlibobjs
+4178,4179d9305
+< # Without the "./", some shells look in PATH for config.status.
+< : ${CONFIG_STATUS=./config.status}
+4181,4185c9307,9317
+< echo creating $CONFIG_STATUS
+< rm -f $CONFIG_STATUS
+< cat > $CONFIG_STATUS <<EOF
+< #! /bin/sh
+< # Generated automatically by configure.
+---
+> 
+> 
+> : ${CONFIG_STATUS=./config.status}
+> ac_write_fail=0
+> ac_clean_files_save=$ac_clean_files
+> ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+> { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+> $as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+> cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> #! $SHELL
+> # Generated by $as_me.
+4187,4191d9318
+< # This directory was configured as follows,
+< # on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+< #
+< # $0 $ac_configure_args
+< #
+4193c9320
+< # configure, is in ./config.log if it exists.
+---
+> # configure, is in config.log if it exists.
+4195,4196c9322,9420
+< ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+< for ac_option
+---
+> debug=false
+> ac_cs_recheck=false
+> ac_cs_silent=false
+> SHELL=\${CONFIG_SHELL-$SHELL}
+> _ACEOF
+> 
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> ## --------------------- ##
+> ## M4sh Initialization.  ##
+> ## --------------------- ##
+> 
+> # Be more Bourne compatible
+> DUALCASE=1; export DUALCASE # for MKS sh
+> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+>   emulate sh
+>   NULLCMD=:
+>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+>   # is contrary to our usage.  Disable this feature.
+>   alias -g '${1+"$@"}'='"$@"'
+>   setopt NO_GLOB_SUBST
+> else
+>   case `(set -o) 2>/dev/null` in
+>   *posix*) set -o posix ;;
+> esac
+> 
+> fi
+> 
+> 
+> 
+> 
+> # PATH needs CR
+> # Avoid depending upon Character Ranges.
+> as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+> as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+> as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+> as_cr_digits='0123456789'
+> as_cr_alnum=$as_cr_Letters$as_cr_digits
+> 
+> as_nl='
+> '
+> export as_nl
+> # Printing a long string crashes Solaris 7 /usr/bin/printf.
+> as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+> if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+>   as_echo='printf %s\n'
+>   as_echo_n='printf %s'
+> else
+>   if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+>     as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+>     as_echo_n='/usr/ucb/echo -n'
+>   else
+>     as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+>     as_echo_n_body='eval
+>       arg=$1;
+>       case $arg in
+>       *"$as_nl"*)
+> 	expr "X$arg" : "X\\(.*\\)$as_nl";
+> 	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+>       esac;
+>       expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+>     '
+>     export as_echo_n_body
+>     as_echo_n='sh -c $as_echo_n_body as_echo'
+>   fi
+>   export as_echo_body
+>   as_echo='sh -c $as_echo_body as_echo'
+> fi
+> 
+> # The user is always right.
+> if test "${PATH_SEPARATOR+set}" != set; then
+>   PATH_SEPARATOR=:
+>   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+>     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+>       PATH_SEPARATOR=';'
+>   }
+> fi
+> 
+> # Support unset when possible.
+> if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+>   as_unset=unset
+> else
+>   as_unset=false
+> fi
+> 
+> 
+> # IFS
+> # We need space, tab and new line, in precisely that order.  Quoting is
+> # there to prevent editors from complaining about space-tab.
+> # (If _AS_PATH_WALK were called with IFS unset, it would disable word
+> # splitting by setting IFS to empty value.)
+> IFS=" ""	$as_nl"
+> 
+> # Find who we are.  Look in the path if we contain no directory separator.
+> case $0 in
+>   *[\\/]* ) as_myself=$0 ;;
+>   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+> for as_dir in $PATH
+4198,4208c9422,9424
+<   case "\$ac_option" in
+<   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+<     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+<     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+<   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+<     echo "$CONFIG_STATUS generated by autoconf version 2.13"
+<     exit 0 ;;
+<   -help | --help | --hel | --he | --h)
+<     echo "\$ac_cs_usage"; exit 0 ;;
+<   *) echo "\$ac_cs_usage"; exit 1 ;;
+<   esac
+---
+>   IFS=$as_save_IFS
+>   test -z "$as_dir" && as_dir=.
+>   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+4209a9426
+> IFS=$as_save_IFS
+4211,4212c9428,9438
+< ac_given_srcdir=$srcdir
+< ac_given_INSTALL="$INSTALL"
+---
+>      ;;
+> esac
+> # We did not find ourselves, most probably we were run as `sh COMMAND'
+> # in which case we are not to be found in the path.
+> if test "x$as_myself" = x; then
+>   as_myself=$0
+> fi
+> if test ! -f "$as_myself"; then
+>   $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+>   { (exit 1); exit 1; }
+> fi
+4214,4393c9440,9577
+< trap 'rm -fr `echo "icudefs.mk \
+< 		Makefile \
+< 		data/icupkg.inc \
+< 		config/Makefile.inc \
+< 		data/Makefile \
+< 		stubdata/Makefile \
+< 		common/Makefile \
+< 		i18n/Makefile \
+< 		layout/Makefile \
+< 		layoutex/Makefile \
+< 		io/Makefile \
+< 		extra/Makefile \
+< 		extra/uconv/Makefile extra/scrptrun/Makefile \
+< 		tools/Makefile tools/ctestfw/Makefile \
+< 		tools/makeconv/Makefile \
+< 		tools/genrb/Makefile \
+< 		tools/genuca/Makefile \
+< 		tools/genccode/Makefile \
+< 		tools/gencmn/Makefile \
+< 		tools/gencnval/Makefile \
+< 		tools/gennames/Makefile \
+< 		tools/gentest/Makefile \
+< 		tools/gennorm/Makefile \
+< 		tools/genprops/Makefile \
+< 		tools/gencase/Makefile \
+< 		tools/genpname/Makefile \
+< 		tools/genbrk/Makefile \
+< 		tools/gensprep/Makefile \
+< 		tools/icuswap/Makefile \
+< 		tools/pkgdata/Makefile \
+< 		tools/toolutil/Makefile \
+< 		tools/dumpce/Makefile \
+< 		test/Makefile \
+< 		test/testdata/Makefile \
+< 		test/testdata/pkgdata.inc \
+< 		test/hdrtst/Makefile \
+< 		test/intltest/Makefile \
+< 		test/cintltst/Makefile \
+< 		test/iotest/Makefile \
+< 		test/thaitest/Makefile \
+< 		test/testmap/Makefile \
+< 		test/letest/Makefile \
+< 		test/threadtest/Makefile \
+< 		samples/Makefile samples/date/Makefile \
+< 		samples/cal/Makefile samples/layout/Makefile \
+< 		common/unicode/platform.h common/icucfg.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+< EOF
+< cat >> $CONFIG_STATUS <<EOF
+< 
+< # Protect against being on the right side of a sed subst in config.status.
+< sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+<  s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+< $ac_vpsub
+< $extrasub
+< s%@SHELL@%$SHELL%g
+< s%@CFLAGS@%$CFLAGS%g
+< s%@CPPFLAGS@%$CPPFLAGS%g
+< s%@CXXFLAGS@%$CXXFLAGS%g
+< s%@FFLAGS@%$FFLAGS%g
+< s%@DEFS@%$DEFS%g
+< s%@LDFLAGS@%$LDFLAGS%g
+< s%@LIBS@%$LIBS%g
+< s%@exec_prefix@%$exec_prefix%g
+< s%@prefix@%$prefix%g
+< s%@program_transform_name@%$program_transform_name%g
+< s%@bindir@%$bindir%g
+< s%@sbindir@%$sbindir%g
+< s%@libexecdir@%$libexecdir%g
+< s%@datadir@%$datadir%g
+< s%@sysconfdir@%$sysconfdir%g
+< s%@sharedstatedir@%$sharedstatedir%g
+< s%@localstatedir@%$localstatedir%g
+< s%@libdir@%$libdir%g
+< s%@includedir@%$includedir%g
+< s%@oldincludedir@%$oldincludedir%g
+< s%@infodir@%$infodir%g
+< s%@mandir@%$mandir%g
+< s%@PACKAGE@%$PACKAGE%g
+< s%@VERSION@%$VERSION%g
+< s%@LIB_VERSION@%$LIB_VERSION%g
+< s%@LIB_VERSION_MAJOR@%$LIB_VERSION_MAJOR%g
+< s%@UNICODE_VERSION@%$UNICODE_VERSION%g
+< s%@CC@%$CC%g
+< s%@CXX@%$CXX%g
+< s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+< s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+< s%@INSTALL_DATA@%$INSTALL_DATA%g
+< s%@STRIP@%$STRIP%g
+< s%@U_MAKE@%$U_MAKE%g
+< s%@DOXYGEN@%$DOXYGEN%g
+< s%@host@%$host%g
+< s%@host_alias@%$host_alias%g
+< s%@host_cpu@%$host_cpu%g
+< s%@host_vendor@%$host_vendor%g
+< s%@host_os@%$host_os%g
+< s%@EXEEXT@%$EXEEXT%g
+< s%@ARFLAGS@%$ARFLAGS%g
+< s%@COMPILE_LINK_ENVVAR@%$COMPILE_LINK_ENVVAR%g
+< s%@LIB_M@%$LIB_M%g
+< s%@ENABLE_SHARED@%$ENABLE_SHARED%g
+< s%@ENABLE_STATIC@%$ENABLE_STATIC%g
+< s%@ENABLE_DEBUG@%$ENABLE_DEBUG%g
+< s%@ENABLE_RELEASE@%$ENABLE_RELEASE%g
+< s%@RANLIB@%$RANLIB%g
+< s%@AR@%$AR%g
+< s%@U_DISABLE_RENAMING@%$U_DISABLE_RENAMING%g
+< s%@U_ENABLE_TRACING@%$U_ENABLE_TRACING%g
+< s%@ENABLE_RPATH@%$ENABLE_RPATH%g
+< s%@U_INLINE@%$U_INLINE%g
+< s%@THREADS_TRUE@%$THREADS_TRUE%g
+< s%@ICU_USE_THREADS@%$ICU_USE_THREADS%g
+< s%@HAVE_MMAP@%$HAVE_MMAP%g
+< s%@GENCCODE_ASSEMBLY@%$GENCCODE_ASSEMBLY%g
+< s%@CPP@%$CPP%g
+< s%@U_HAVE_INTTYPES_H@%$U_HAVE_INTTYPES_H%g
+< s%@CXXCPP@%$CXXCPP%g
+< s%@U_IOSTREAM_SOURCE@%$U_IOSTREAM_SOURCE%g
+< s%@U_IS_BIG_ENDIAN@%$U_IS_BIG_ENDIAN%g
+< s%@U_HAVE_NL_LANGINFO@%$U_HAVE_NL_LANGINFO%g
+< s%@U_HAVE_NL_LANGINFO_CODESET@%$U_HAVE_NL_LANGINFO_CODESET%g
+< s%@U_NL_LANGINFO_CODESET@%$U_NL_LANGINFO_CODESET%g
+< s%@U_HAVE_NAMESPACE@%$U_HAVE_NAMESPACE%g
+< s%@U_OVERRIDE_CXX_ALLOCATION@%$U_OVERRIDE_CXX_ALLOCATION%g
+< s%@U_HAVE_PLACEMENT_NEW@%$U_HAVE_PLACEMENT_NEW%g
+< s%@U_HAVE_POPEN@%$U_HAVE_POPEN%g
+< s%@U_HAVE_TZSET@%$U_HAVE_TZSET%g
+< s%@U_TZSET@%$U_TZSET%g
+< s%@U_HAVE_TZNAME@%$U_HAVE_TZNAME%g
+< s%@U_TZNAME@%$U_TZNAME%g
+< s%@U_HAVE_TIMEZONE@%$U_HAVE_TIMEZONE%g
+< s%@U_TIMEZONE@%$U_TIMEZONE%g
+< s%@HAVE_INT8_T@%$HAVE_INT8_T%g
+< s%@HAVE_UINT8_T@%$HAVE_UINT8_T%g
+< s%@HAVE_INT16_T@%$HAVE_INT16_T%g
+< s%@HAVE_UINT16_T@%$HAVE_UINT16_T%g
+< s%@HAVE_INT32_T@%$HAVE_INT32_T%g
+< s%@HAVE_UINT32_T@%$HAVE_UINT32_T%g
+< s%@HAVE_INT64_T@%$HAVE_INT64_T%g
+< s%@HAVE_UINT64_T@%$HAVE_UINT64_T%g
+< s%@U_HAVE_WCHAR_H@%$U_HAVE_WCHAR_H%g
+< s%@U_HAVE_WCSCPY@%$U_HAVE_WCSCPY%g
+< s%@U_SIZEOF_WCHAR_T@%$U_SIZEOF_WCHAR_T%g
+< s%@EXTRAS_TRUE@%$EXTRAS_TRUE%g
+< s%@ICUIO_TRUE@%$ICUIO_TRUE%g
+< s%@LAYOUT_TRUE@%$LAYOUT_TRUE%g
+< s%@thesysconfdir@%$thesysconfdir%g
+< s%@thedatadir@%$thedatadir%g
+< s%@thelibdir@%$thelibdir%g
+< s%@pkgicudatadir@%$pkgicudatadir%g
+< s%@thepkgicudatadir@%$thepkgicudatadir%g
+< s%@DATA_PACKAGING_CPPFLAGS@%$DATA_PACKAGING_CPPFLAGS%g
+< s%@DATA_PACKAGING_MODE@%$DATA_PACKAGING_MODE%g
+< s%@ICULIBSUFFIX@%$ICULIBSUFFIX%g
+< s%@U_HAVE_LIB_SUFFIX@%$U_HAVE_LIB_SUFFIX%g
+< s%@ICULIBSUFFIXCNAME@%$ICULIBSUFFIXCNAME%g
+< s%@TESTS_TRUE@%$TESTS_TRUE%g
+< s%@SAMPLES_TRUE@%$SAMPLES_TRUE%g
+< s%@ICUDATA_CHAR@%$ICUDATA_CHAR%g
+< s%@platform@%$platform%g
+< s%@platform_make_fragment_name@%$platform_make_fragment_name%g
+< s%@platform_make_fragment@%$platform_make_fragment%g
+< s%@ld_rpath_suf@%$ld_rpath_suf%g
+< s%@AIX_SHLIB@%$AIX_SHLIB%g
+< 
+< CEOF
+< EOF
+< 
+< cat >> $CONFIG_STATUS <<\EOF
+< 
+< # Split the substitutions into bite-sized pieces for seds with
+< # small command number limits, like on Digital OSF/1 and HP-UX.
+< ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+< ac_file=1 # Number of current file.
+< ac_beg=1 # First line for current file.
+< ac_end=$ac_max_sed_cmds # Line after last line for current file.
+< ac_more_lines=:
+< ac_sed_cmds=""
+< while $ac_more_lines; do
+<   if test $ac_beg -gt 1; then
+<     sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+---
+> # Work around bugs in pre-3.0 UWIN ksh.
+> for as_var in ENV MAIL MAILPATH
+> do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+> done
+> PS1='$ '
+> PS2='> '
+> PS4='+ '
+> 
+> # NLS nuisances.
+> LC_ALL=C
+> export LC_ALL
+> LANGUAGE=C
+> export LANGUAGE
+> 
+> # Required to use basename.
+> if expr a : '\(a\)' >/dev/null 2>&1 &&
+>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
+>   as_expr=expr
+> else
+>   as_expr=false
+> fi
+> 
+> if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+>   as_basename=basename
+> else
+>   as_basename=false
+> fi
+> 
+> 
+> # Name of the executable.
+> as_me=`$as_basename -- "$0" ||
+> $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+> 	 X"$0" : 'X\(//\)$' \| \
+> 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+> $as_echo X/"$0" |
+>     sed '/^.*\/\([^/][^/]*\)\/*$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\/\(\/\/\)$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\/\(\/\).*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  s/.*/./; q'`
+> 
+> # CDPATH.
+> $as_unset CDPATH
+> 
+> 
+> 
+>   as_lineno_1=$LINENO
+>   as_lineno_2=$LINENO
+>   test "x$as_lineno_1" != "x$as_lineno_2" &&
+>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+> 
+>   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+>   # uniformly replaced by the line number.  The first 'sed' inserts a
+>   # line-number line after each line using $LINENO; the second 'sed'
+>   # does the real work.  The second script uses 'N' to pair each
+>   # line-number line with the line containing $LINENO, and appends
+>   # trailing '-' during substitution so that $LINENO is not a special
+>   # case at line end.
+>   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+>   # scripts with optimization help from Paolo Bonzini.  Blame Lee
+>   # E. McMahon (1931-1989) for sed's syntax.  :-)
+>   sed -n '
+>     p
+>     /[$]LINENO/=
+>   ' <$as_myself |
+>     sed '
+>       s/[$]LINENO.*/&-/
+>       t lineno
+>       b
+>       :lineno
+>       N
+>       :loop
+>       s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+>       t loop
+>       s/-\n.*//
+>     ' >$as_me.lineno &&
+>   chmod +x "$as_me.lineno" ||
+>     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+>    { (exit 1); exit 1; }; }
+> 
+>   # Don't try to exec as it changes $[0], causing all sort of problems
+>   # (the dirname of $[0] is not the place where we might find the
+>   # original and so on.  Autoconf is especially sensitive to this).
+>   . "./$as_me.lineno"
+>   # Exit status is that of the last command.
+>   exit
+> }
+> 
+> 
+> if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+>   as_dirname=dirname
+> else
+>   as_dirname=false
+> fi
+> 
+> ECHO_C= ECHO_N= ECHO_T=
+> case `echo -n x` in
+> -n*)
+>   case `echo 'x\c'` in
+>   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+>   *)   ECHO_C='\c';;
+>   esac;;
+> *)
+>   ECHO_N='-n';;
+> esac
+> if expr a : '\(a\)' >/dev/null 2>&1 &&
+>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
+>   as_expr=expr
+> else
+>   as_expr=false
+> fi
+> 
+> rm -f conf$$ conf$$.exe conf$$.file
+> if test -d conf$$.dir; then
+>   rm -f conf$$.dir/conf$$.file
+> else
+>   rm -f conf$$.dir
+>   mkdir conf$$.dir 2>/dev/null
+> fi
+> if (echo >conf$$.file) 2>/dev/null; then
+>   if ln -s conf$$.file conf$$ 2>/dev/null; then
+>     as_ln_s='ln -s'
+>     # ... but there are two gotchas:
+>     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+>     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+>     # In both cases, we have to default to `cp -p'.
+>     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+>       as_ln_s='cp -p'
+>   elif ln conf$$.file conf$$ 2>/dev/null; then
+>     as_ln_s=ln
+4395c9579
+<     sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+---
+>     as_ln_s='cp -p'
+4397,4472c9581,9585
+<   if test ! -s conftest.s$ac_file; then
+<     ac_more_lines=false
+<     rm -f conftest.s$ac_file
+<   else
+<     if test -z "$ac_sed_cmds"; then
+<       ac_sed_cmds="sed -f conftest.s$ac_file"
+<     else
+<       ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+<     fi
+<     ac_file=`expr $ac_file + 1`
+<     ac_beg=$ac_end
+<     ac_end=`expr $ac_end + $ac_max_sed_cmds`
+<   fi
+< done
+< if test -z "$ac_sed_cmds"; then
+<   ac_sed_cmds=cat
+< fi
+< EOF
+< 
+< cat >> $CONFIG_STATUS <<EOF
+< 
+< CONFIG_FILES=\${CONFIG_FILES-"icudefs.mk \
+< 		Makefile \
+< 		data/icupkg.inc \
+< 		config/Makefile.inc \
+< 		data/Makefile \
+< 		stubdata/Makefile \
+< 		common/Makefile \
+< 		i18n/Makefile \
+< 		layout/Makefile \
+< 		layoutex/Makefile \
+< 		io/Makefile \
+< 		extra/Makefile \
+< 		extra/uconv/Makefile extra/scrptrun/Makefile \
+< 		tools/Makefile tools/ctestfw/Makefile \
+< 		tools/makeconv/Makefile \
+< 		tools/genrb/Makefile \
+< 		tools/genuca/Makefile \
+< 		tools/genccode/Makefile \
+< 		tools/gencmn/Makefile \
+< 		tools/gencnval/Makefile \
+< 		tools/gennames/Makefile \
+< 		tools/gentest/Makefile \
+< 		tools/gennorm/Makefile \
+< 		tools/genprops/Makefile \
+< 		tools/gencase/Makefile \
+< 		tools/genpname/Makefile \
+< 		tools/genbrk/Makefile \
+< 		tools/gensprep/Makefile \
+< 		tools/icuswap/Makefile \
+< 		tools/pkgdata/Makefile \
+< 		tools/toolutil/Makefile \
+< 		tools/dumpce/Makefile \
+< 		test/Makefile \
+< 		test/testdata/Makefile \
+< 		test/testdata/pkgdata.inc \
+< 		test/hdrtst/Makefile \
+< 		test/intltest/Makefile \
+< 		test/cintltst/Makefile \
+< 		test/iotest/Makefile \
+< 		test/thaitest/Makefile \
+< 		test/testmap/Makefile \
+< 		test/letest/Makefile \
+< 		test/threadtest/Makefile \
+< 		samples/Makefile samples/date/Makefile \
+< 		samples/cal/Makefile samples/layout/Makefile \
+< 		common/unicode/platform.h"}
+< EOF
+< cat >> $CONFIG_STATUS <<\EOF
+< for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+<   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+<   case "$ac_file" in
+<   *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+<        ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+<   *) ac_file_in="${ac_file}.in" ;;
+<   esac
+---
+> else
+>   as_ln_s='cp -p'
+> fi
+> rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+> rmdir conf$$.dir 2>/dev/null
+4474c9587,9592
+<   # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+---
+> if mkdir -p . 2>/dev/null; then
+>   as_mkdir_p=:
+> else
+>   test -d ./-p && rmdir ./-p
+>   as_mkdir_p=false
+> fi
+4476,4483c9594,9598
+<   # Remove last slash and all that follows it.  Not all systems have dirname.
+<   ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+<   if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+<     # The file is in a subdirectory.
+<     test ! -d "$ac_dir" && mkdir "$ac_dir"
+<     ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+<     # A "../" for each directory in $ac_dir_suffix.
+<     ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+---
+> if test -x / >/dev/null 2>&1; then
+>   as_test_x='test -x'
+> else
+>   if ls -dL / >/dev/null 2>&1; then
+>     as_ls_L_option=L
+4485c9600
+<     ac_dir_suffix= ac_dots=
+---
+>     as_ls_L_option=
+4486a9602,9637
+>   as_test_x='
+>     eval sh -c '\''
+>       if test -d "$1"; then
+> 	test -d "$1/.";
+>       else
+> 	case $1 in
+> 	-*)set "./$1";;
+> 	esac;
+> 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+> 	???[sx]*):;;*)false;;esac;fi
+>     '\'' sh
+>   '
+> fi
+> as_executable_p=$as_test_x
+> 
+> # Sed expression to map a string onto a valid CPP name.
+> as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+> 
+> # Sed expression to map a string onto a valid variable name.
+> as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+> 
+> 
+> exec 6>&1
+> 
+> # Save the log message, to keep $[0] and so on meaningful, and to
+> # report actual input values of CONFIG_FILES etc. instead of their
+> # values after options handling.
+> ac_log="
+> This file was extended by $as_me, which was
+> generated by GNU Autoconf 2.63.  Invocation command line was
+> 
+>   CONFIG_FILES    = $CONFIG_FILES
+>   CONFIG_HEADERS  = $CONFIG_HEADERS
+>   CONFIG_LINKS    = $CONFIG_LINKS
+>   CONFIG_COMMANDS = $CONFIG_COMMANDS
+>   $ $0 $@
+4488,4496c9639,9650
+<   case "$ac_given_srcdir" in
+<   .)  srcdir=.
+<       if test -z "$ac_dots"; then top_srcdir=.
+<       else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+<   /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+<   *) # Relative path.
+<     srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+<     top_srcdir="$ac_dots$ac_given_srcdir" ;;
+<   esac
+---
+> on `(hostname || uname -n) 2>/dev/null | sed 1q`
+> "
+> 
+> _ACEOF
+> 
+> case $ac_config_files in *"
+> "*) set x $ac_config_files; shift; ac_config_files=$*;;
+> esac
+> 
+> case $ac_config_headers in *"
+> "*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+> esac
+4498,4501d9651
+<   case "$ac_given_INSTALL" in
+<   [/$]*) INSTALL="$ac_given_INSTALL" ;;
+<   *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+<   esac
+4503,4509c9653,9718
+<   echo creating "$ac_file"
+<   rm -f "$ac_file"
+<   configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+<   case "$ac_file" in
+<   *Makefile*) ac_comsub="1i\\
+< # $configure_input" ;;
+<   *) ac_comsub= ;;
+---
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> # Files that config.status was made for.
+> config_files="$ac_config_files"
+> config_headers="$ac_config_headers"
+> 
+> _ACEOF
+> 
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> ac_cs_usage="\
+> \`$as_me' instantiates files from templates according to the
+> current configuration.
+> 
+> Usage: $0 [OPTION]... [FILE]...
+> 
+>   -h, --help       print this help, then exit
+>   -V, --version    print version number and configuration settings, then exit
+>   -q, --quiet, --silent
+>                    do not print progress messages
+>   -d, --debug      don't remove temporary files
+>       --recheck    update $as_me by reconfiguring in the same conditions
+>       --file=FILE[:TEMPLATE]
+>                    instantiate the configuration file FILE
+>       --header=FILE[:TEMPLATE]
+>                    instantiate the configuration header FILE
+> 
+> Configuration files:
+> $config_files
+> 
+> Configuration headers:
+> $config_headers
+> 
+> Report bugs to <bug-autoconf@gnu.org>."
+> 
+> _ACEOF
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> ac_cs_version="\\
+> config.status
+> configured by $0, generated by GNU Autoconf 2.63,
+>   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+> 
+> Copyright (C) 2008 Free Software Foundation, Inc.
+> This config.status script is free software; the Free Software Foundation
+> gives unlimited permission to copy, distribute and modify it."
+> 
+> ac_pwd='$ac_pwd'
+> srcdir='$srcdir'
+> INSTALL='$INSTALL'
+> test -n "\$AWK" || AWK=awk
+> _ACEOF
+> 
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> # The default lists apply if the user does not specify any file.
+> ac_need_defaults=:
+> while test $# != 0
+> do
+>   case $1 in
+>   --*=*)
+>     ac_option=`expr "X$1" : 'X\([^=]*\)='`
+>     ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+>     ac_shift=:
+>     ;;
+>   *)
+>     ac_option=$1
+>     ac_optarg=$2
+>     ac_shift=shift
+>     ;;
+4512,4520c9721,9760
+<   ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+<   sed -e "$ac_comsub
+< s%@configure_input@%$configure_input%g
+< s%@srcdir@%$srcdir%g
+< s%@top_srcdir@%$top_srcdir%g
+< s%@INSTALL@%$INSTALL%g
+< " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+< fi; done
+< rm -f conftest.s*
+---
+>   case $ac_option in
+>   # Handling of the options.
+>   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+>     ac_cs_recheck=: ;;
+>   --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+>     $as_echo "$ac_cs_version"; exit ;;
+>   --debug | --debu | --deb | --de | --d | -d )
+>     debug=: ;;
+>   --file | --fil | --fi | --f )
+>     $ac_shift
+>     case $ac_optarg in
+>     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+>     esac
+>     CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+>     ac_need_defaults=false;;
+>   --header | --heade | --head | --hea )
+>     $ac_shift
+>     case $ac_optarg in
+>     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+>     esac
+>     CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
+>     ac_need_defaults=false;;
+>   --he | --h)
+>     # Conflict between --help and --header
+>     { $as_echo "$as_me: error: ambiguous option: $1
+> Try \`$0 --help' for more information." >&2
+>    { (exit 1); exit 1; }; };;
+>   --help | --hel | -h )
+>     $as_echo "$ac_cs_usage"; exit ;;
+>   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+>   | -silent | --silent | --silen | --sile | --sil | --si | --s)
+>     ac_cs_silent=: ;;
+> 
+>   # This is an error.
+>   -*) { $as_echo "$as_me: error: unrecognized option: $1
+> Try \`$0 --help' for more information." >&2
+>    { (exit 1); exit 1; }; } ;;
+> 
+>   *) ac_config_targets="$ac_config_targets $1"
+>      ac_need_defaults=false ;;
+4522,4553d9761
+< # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+< # NAME is the cpp macro being defined and VALUE is the value it is being given.
+< #
+< # ac_d sets the value in "#define NAME VALUE" lines.
+< ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+< ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+< ac_dC='\3'
+< ac_dD='%g'
+< # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+< ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+< ac_uB='\([ 	]\)%\1#\2define\3'
+< ac_uC=' '
+< ac_uD='\4%g'
+< # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+< ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+< ac_eB='$%\1#\2define\3'
+< ac_eC=' '
+< ac_eD='%g'
+< 
+< if test "${CONFIG_HEADERS+set}" != set; then
+< EOF
+< cat >> $CONFIG_STATUS <<EOF
+<   CONFIG_HEADERS="common/icucfg.h"
+< EOF
+< cat >> $CONFIG_STATUS <<\EOF
+< fi
+< for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+<   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+<   case "$ac_file" in
+<   *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+<        ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+<   *) ac_file_in="${ac_file}.in" ;;
+4554a9763,9766
+>   shift
+> done
+> 
+> ac_configure_extra_args=
+4556c9768,9782
+<   echo creating $ac_file
+---
+> if $ac_cs_silent; then
+>   exec 6>/dev/null
+>   ac_configure_extra_args="$ac_configure_extra_args --silent"
+> fi
+> 
+> _ACEOF
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> if \$ac_cs_recheck; then
+>   set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+>   shift
+>   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+>   CONFIG_SHELL='$SHELL'
+>   export CONFIG_SHELL
+>   exec "\$@"
+> fi
+4558,4584c9784,9797
+<   rm -f conftest.frag conftest.in conftest.out
+<   ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+<   cat $ac_file_inputs > conftest.in
+< 
+< EOF
+< 
+< # Transform confdefs.h into a sed script conftest.vals that substitutes
+< # the proper values into config.h.in to produce config.h.  And first:
+< # Protect against being on the right side of a sed subst in config.status.
+< # Protect against being in an unquoted here document in config.status.
+< rm -f conftest.vals
+< cat > conftest.hdr <<\EOF
+< s/[\\&%]/\\&/g
+< s%[\\$`]%\\&%g
+< s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+< s%ac_d%ac_u%gp
+< s%ac_u%ac_e%gp
+< EOF
+< sed -n -f conftest.hdr confdefs.h > conftest.vals
+< rm -f conftest.hdr
+< 
+< # This sed command replaces #undef with comments.  This is necessary, for
+< # example, in the case of _POSIX_SOURCE, which is predefined and required
+< # on some systems where configure will not decide to define it.
+< cat >> conftest.vals <<\EOF
+< s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+< EOF
+---
+> _ACEOF
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> exec 5>>config.log
+> {
+>   echo
+>   sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+> ## Running $as_me. ##
+> _ASBOX
+>   $as_echo "$ac_log"
+> } >&5
+> 
+> _ACEOF
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> _ACEOF
+4586,4587c9799
+< # Break up conftest.vals because some shells have a limit on
+< # the size of here documents, and old seds have small limits too.
+---
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+4589,4590c9801,9802
+< rm -f conftest.tail
+< while :
+---
+> # Handling of arguments.
+> for ac_config_target in $ac_config_targets
+4592,4616c9804,10076
+<   ac_lines=`grep -c . conftest.vals`
+<   # grep -c gives empty output for an empty file on some AIX systems.
+<   if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+<   # Write a limited-size here document to conftest.frag.
+<   echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+<   sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+<   echo 'CEOF
+<   sed -f conftest.frag conftest.in > conftest.out
+<   rm -f conftest.in
+<   mv conftest.out conftest.in
+< ' >> $CONFIG_STATUS
+<   sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+<   rm -f conftest.vals
+<   mv conftest.tail conftest.vals
+< done
+< rm -f conftest.vals
+< 
+< cat >> $CONFIG_STATUS <<\EOF
+<   rm -f conftest.frag conftest.h
+<   echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+<   cat conftest.in >> conftest.h
+<   rm -f conftest.in
+<   if cmp -s $ac_file conftest.h 2>/dev/null; then
+<     echo "$ac_file is unchanged"
+<     rm -f conftest.h
+---
+>   case $ac_config_target in
+>     "common/icucfg.h") CONFIG_HEADERS="$CONFIG_HEADERS common/icucfg.h" ;;
+>     "icudefs.mk") CONFIG_FILES="$CONFIG_FILES icudefs.mk" ;;
+>     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+>     "data/icupkg.inc") CONFIG_FILES="$CONFIG_FILES data/icupkg.inc" ;;
+>     "config/Makefile.inc") CONFIG_FILES="$CONFIG_FILES config/Makefile.inc" ;;
+>     "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
+>     "stubdata/Makefile") CONFIG_FILES="$CONFIG_FILES stubdata/Makefile" ;;
+>     "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
+>     "i18n/Makefile") CONFIG_FILES="$CONFIG_FILES i18n/Makefile" ;;
+>     "layout/Makefile") CONFIG_FILES="$CONFIG_FILES layout/Makefile" ;;
+>     "layoutex/Makefile") CONFIG_FILES="$CONFIG_FILES layoutex/Makefile" ;;
+>     "io/Makefile") CONFIG_FILES="$CONFIG_FILES io/Makefile" ;;
+>     "extra/Makefile") CONFIG_FILES="$CONFIG_FILES extra/Makefile" ;;
+>     "extra/uconv/Makefile") CONFIG_FILES="$CONFIG_FILES extra/uconv/Makefile" ;;
+>     "extra/scrptrun/Makefile") CONFIG_FILES="$CONFIG_FILES extra/scrptrun/Makefile" ;;
+>     "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+>     "tools/ctestfw/Makefile") CONFIG_FILES="$CONFIG_FILES tools/ctestfw/Makefile" ;;
+>     "tools/makeconv/Makefile") CONFIG_FILES="$CONFIG_FILES tools/makeconv/Makefile" ;;
+>     "tools/genrb/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genrb/Makefile" ;;
+>     "tools/genuca/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genuca/Makefile" ;;
+>     "tools/genccode/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genccode/Makefile" ;;
+>     "tools/gencmn/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencmn/Makefile" ;;
+>     "tools/gencnval/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencnval/Makefile" ;;
+>     "tools/gennames/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennames/Makefile" ;;
+>     "tools/gentest/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gentest/Makefile" ;;
+>     "tools/gennorm/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennorm/Makefile" ;;
+>     "tools/genprops/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genprops/Makefile" ;;
+>     "tools/gencase/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencase/Makefile" ;;
+>     "tools/genpname/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genpname/Makefile" ;;
+>     "tools/genbrk/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genbrk/Makefile" ;;
+>     "tools/gensprep/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gensprep/Makefile" ;;
+>     "tools/icuswap/Makefile") CONFIG_FILES="$CONFIG_FILES tools/icuswap/Makefile" ;;
+>     "tools/pkgdata/Makefile") CONFIG_FILES="$CONFIG_FILES tools/pkgdata/Makefile" ;;
+>     "tools/toolutil/Makefile") CONFIG_FILES="$CONFIG_FILES tools/toolutil/Makefile" ;;
+>     "tools/dumpce/Makefile") CONFIG_FILES="$CONFIG_FILES tools/dumpce/Makefile" ;;
+>     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+>     "test/testdata/Makefile") CONFIG_FILES="$CONFIG_FILES test/testdata/Makefile" ;;
+>     "test/testdata/pkgdata.inc") CONFIG_FILES="$CONFIG_FILES test/testdata/pkgdata.inc" ;;
+>     "test/hdrtst/Makefile") CONFIG_FILES="$CONFIG_FILES test/hdrtst/Makefile" ;;
+>     "test/intltest/Makefile") CONFIG_FILES="$CONFIG_FILES test/intltest/Makefile" ;;
+>     "test/cintltst/Makefile") CONFIG_FILES="$CONFIG_FILES test/cintltst/Makefile" ;;
+>     "test/iotest/Makefile") CONFIG_FILES="$CONFIG_FILES test/iotest/Makefile" ;;
+>     "test/thaitest/Makefile") CONFIG_FILES="$CONFIG_FILES test/thaitest/Makefile" ;;
+>     "test/testmap/Makefile") CONFIG_FILES="$CONFIG_FILES test/testmap/Makefile" ;;
+>     "test/letest/Makefile") CONFIG_FILES="$CONFIG_FILES test/letest/Makefile" ;;
+>     "test/threadtest/Makefile") CONFIG_FILES="$CONFIG_FILES test/threadtest/Makefile" ;;
+>     "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;;
+>     "samples/date/Makefile") CONFIG_FILES="$CONFIG_FILES samples/date/Makefile" ;;
+>     "samples/cal/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cal/Makefile" ;;
+>     "samples/layout/Makefile") CONFIG_FILES="$CONFIG_FILES samples/layout/Makefile" ;;
+>     "common/unicode/platform.h") CONFIG_FILES="$CONFIG_FILES common/unicode/platform.h" ;;
+> 
+>   *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+> $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+>    { (exit 1); exit 1; }; };;
+>   esac
+> done
+> 
+> 
+> # If the user did not use the arguments to specify the items to instantiate,
+> # then the envvar interface is used.  Set only those that are not.
+> # We use the long form for the default assignment because of an extremely
+> # bizarre bug on SunOS 4.1.3.
+> if $ac_need_defaults; then
+>   test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+>   test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+> fi
+> 
+> # Have a temporary directory for convenience.  Make it in the build tree
+> # simply because there is no reason against having it here, and in addition,
+> # creating and moving files from /tmp can sometimes cause problems.
+> # Hook for its removal unless debugging.
+> # Note that there is a small window in which the directory will not be cleaned:
+> # after its creation but before its name has been assigned to `$tmp'.
+> $debug ||
+> {
+>   tmp=
+>   trap 'exit_status=$?
+>   { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+> ' 0
+>   trap '{ (exit 1); exit 1; }' 1 2 13 15
+> }
+> # Create a (secure) tmp directory for tmp files.
+> 
+> {
+>   tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+>   test -n "$tmp" && test -d "$tmp"
+> }  ||
+> {
+>   tmp=./conf$$-$RANDOM
+>   (umask 077 && mkdir "$tmp")
+> } ||
+> {
+>    $as_echo "$as_me: cannot create a temporary directory in ." >&2
+>    { (exit 1); exit 1; }
+> }
+> 
+> # Set up the scripts for CONFIG_FILES section.
+> # No need to generate them if there are no CONFIG_FILES.
+> # This happens for instance with `./config.status config.h'.
+> if test -n "$CONFIG_FILES"; then
+> 
+> 
+> ac_cr='
+'
+> ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+> if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+>   ac_cs_awk_cr='\\r'
+> else
+>   ac_cs_awk_cr=$ac_cr
+> fi
+> 
+> echo 'BEGIN {' >"$tmp/subs1.awk" &&
+> _ACEOF
+> 
+> 
+> {
+>   echo "cat >conf$$subs.awk <<_ACEOF" &&
+>   echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+>   echo "_ACEOF"
+> } >conf$$subs.sh ||
+>   { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+>    { (exit 1); exit 1; }; }
+> ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+> ac_delim='%!_!# '
+> for ac_last_try in false false false false false :; do
+>   . ./conf$$subs.sh ||
+>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+>    { (exit 1); exit 1; }; }
+> 
+>   ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+>   if test $ac_delim_n = $ac_delim_num; then
+>     break
+>   elif $ac_last_try; then
+>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+>    { (exit 1); exit 1; }; }
+>   else
+>     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+>   fi
+> done
+> rm -f conf$$subs.sh
+> 
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+> _ACEOF
+> sed -n '
+> h
+> s/^/S["/; s/!.*/"]=/
+> p
+> g
+> s/^[^!]*!//
+> :repl
+> t repl
+> s/'"$ac_delim"'$//
+> t delim
+> :nl
+> h
+> s/\(.\{148\}\).*/\1/
+> t more1
+> s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+> p
+> n
+> b repl
+> :more1
+> s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+> p
+> g
+> s/.\{148\}//
+> t nl
+> :delim
+> h
+> s/\(.\{148\}\).*/\1/
+> t more2
+> s/["\\]/\\&/g; s/^/"/; s/$/"/
+> p
+> b
+> :more2
+> s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+> p
+> g
+> s/.\{148\}//
+> t delim
+> ' <conf$$subs.awk | sed '
+> /^[^""]/{
+>   N
+>   s/\n//
+> }
+> ' >>$CONFIG_STATUS || ac_write_fail=1
+> rm -f conf$$subs.awk
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> _ACAWK
+> cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+>   for (key in S) S_is_set[key] = 1
+>   FS = ""
+> 
+> }
+> {
+>   line = $ 0
+>   nfields = split(line, field, "@")
+>   substed = 0
+>   len = length(field[1])
+>   for (i = 2; i < nfields; i++) {
+>     key = field[i]
+>     keylen = length(key)
+>     if (S_is_set[key]) {
+>       value = S[key]
+>       line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+>       len += length(value) + length(field[++i])
+>       substed = 1
+>     } else
+>       len += 1 + keylen
+>   }
+> 
+>   print line
+> }
+> 
+> _ACAWK
+> _ACEOF
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+>   sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+> else
+>   cat
+> fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+>   || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+> $as_echo "$as_me: error: could not setup config files machinery" >&2;}
+>    { (exit 1); exit 1; }; }
+> _ACEOF
+> 
+> # VPATH may cause trouble with some makes, so we remove $(srcdir),
+> # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+> # trailing colons and then remove the whole line if VPATH becomes empty
+> # (actually we leave an empty line to preserve line numbers).
+> if test "x$srcdir" = x.; then
+>   ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+> s/:*\$(srcdir):*/:/
+> s/:*\${srcdir}:*/:/
+> s/:*@srcdir@:*/:/
+> s/^\([^=]*=[	 ]*\):*/\1/
+> s/:*$//
+> s/^[^=]*=[	 ]*$//
+> }'
+> fi
+> 
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> fi # test -n "$CONFIG_FILES"
+> 
+> # Set up the scripts for CONFIG_HEADERS section.
+> # No need to generate them if there are no CONFIG_HEADERS.
+> # This happens for instance with `./config.status Makefile'.
+> if test -n "$CONFIG_HEADERS"; then
+> cat >"$tmp/defines.awk" <<\_ACAWK ||
+> BEGIN {
+> _ACEOF
+> 
+> # Transform confdefs.h into an awk script `defines.awk', embedded as
+> # here-document in config.status, that substitutes the proper values into
+> # config.h.in to produce config.h.
+> 
+> # Create a delimiter string that does not exist in confdefs.h, to ease
+> # handling of long lines.
+> ac_delim='%!_!# '
+> for ac_last_try in false false :; do
+>   ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+>   if test -z "$ac_t"; then
+>     break
+>   elif $ac_last_try; then
+>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
+> $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
+>    { (exit 1); exit 1; }; }
+4618,4622c10078,10451
+<     # Remove last slash and all that follows it.  Not all systems have dirname.
+<       ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+<       if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+<       # The file is in a subdirectory.
+<       test ! -d "$ac_dir" && mkdir "$ac_dir"
+---
+>     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+>   fi
+> done
+> 
+> # For the awk script, D is an array of macro values keyed by name,
+> # likewise P contains macro parameters if any.  Preserve backslash
+> # newline sequences.
+> 
+> ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+> sed -n '
+> s/.\{148\}/&'"$ac_delim"'/g
+> t rset
+> :rset
+> s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+> t def
+> d
+> :def
+> s/\\$//
+> t bsnl
+> s/["\\]/\\&/g
+> s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+> D["\1"]=" \3"/p
+> s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+> d
+> :bsnl
+> s/["\\]/\\&/g
+> s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+> D["\1"]=" \3\\\\\\n"\\/p
+> t cont
+> s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+> t cont
+> d
+> :cont
+> n
+> s/.\{148\}/&'"$ac_delim"'/g
+> t clear
+> :clear
+> s/\\$//
+> t bsnlc
+> s/["\\]/\\&/g; s/^/"/; s/$/"/p
+> d
+> :bsnlc
+> s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+> b cont
+> ' <confdefs.h | sed '
+> s/'"$ac_delim"'/"\\\
+> "/g' >>$CONFIG_STATUS || ac_write_fail=1
+> 
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+>   for (key in D) D_is_set[key] = 1
+>   FS = ""
+> }
+> /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+>   line = \$ 0
+>   split(line, arg, " ")
+>   if (arg[1] == "#") {
+>     defundef = arg[2]
+>     mac1 = arg[3]
+>   } else {
+>     defundef = substr(arg[1], 2)
+>     mac1 = arg[2]
+>   }
+>   split(mac1, mac2, "(") #)
+>   macro = mac2[1]
+>   prefix = substr(line, 1, index(line, defundef) - 1)
+>   if (D_is_set[macro]) {
+>     # Preserve the white space surrounding the "#".
+>     print prefix "define", macro P[macro] D[macro]
+>     next
+>   } else {
+>     # Replace #undef with comments.  This is necessary, for example,
+>     # in the case of _POSIX_SOURCE, which is predefined and required
+>     # on some systems where configure will not decide to define it.
+>     if (defundef == "undef") {
+>       print "/*", prefix defundef, macro, "*/"
+>       next
+>     }
+>   }
+> }
+> { print }
+> _ACAWK
+> _ACEOF
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+>   { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
+> $as_echo "$as_me: error: could not setup config headers machinery" >&2;}
+>    { (exit 1); exit 1; }; }
+> fi # test -n "$CONFIG_HEADERS"
+> 
+> 
+> eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
+> shift
+> for ac_tag
+> do
+>   case $ac_tag in
+>   :[FHLC]) ac_mode=$ac_tag; continue;;
+>   esac
+>   case $ac_mode$ac_tag in
+>   :[FHL]*:*);;
+>   :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+> $as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+>    { (exit 1); exit 1; }; };;
+>   :[FH]-) ac_tag=-:-;;
+>   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+>   esac
+>   ac_save_IFS=$IFS
+>   IFS=:
+>   set x $ac_tag
+>   IFS=$ac_save_IFS
+>   shift
+>   ac_file=$1
+>   shift
+> 
+>   case $ac_mode in
+>   :L) ac_source=$1;;
+>   :[FH])
+>     ac_file_inputs=
+>     for ac_f
+>     do
+>       case $ac_f in
+>       -) ac_f="$tmp/stdin";;
+>       *) # Look for the file first in the build tree, then in the source tree
+> 	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+> 	 # because $ac_f cannot contain `:'.
+> 	 test -f "$ac_f" ||
+> 	   case $ac_f in
+> 	   [\\/$]*) false;;
+> 	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+> 	   esac ||
+> 	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+> $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+>    { (exit 1); exit 1; }; };;
+>       esac
+>       case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+>       ac_file_inputs="$ac_file_inputs '$ac_f'"
+>     done
+> 
+>     # Let's still pretend it is `configure' which instantiates (i.e., don't
+>     # use $as_me), people would be surprised to read:
+>     #    /* config.h.  Generated by config.status.  */
+>     configure_input='Generated from '`
+> 	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+> 	`' by configure.'
+>     if test x"$ac_file" != x-; then
+>       configure_input="$ac_file.  $configure_input"
+>       { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+> $as_echo "$as_me: creating $ac_file" >&6;}
+>     fi
+>     # Neutralize special characters interpreted by sed in replacement strings.
+>     case $configure_input in #(
+>     *\&* | *\|* | *\\* )
+>        ac_sed_conf_input=`$as_echo "$configure_input" |
+>        sed 's/[\\\\&|]/\\\\&/g'`;; #(
+>     *) ac_sed_conf_input=$configure_input;;
+>     esac
+> 
+>     case $ac_tag in
+>     *:-:* | *:-) cat >"$tmp/stdin" \
+>       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+> $as_echo "$as_me: error: could not create $ac_file" >&2;}
+>    { (exit 1); exit 1; }; } ;;
+>     esac
+>     ;;
+>   esac
+> 
+>   ac_dir=`$as_dirname -- "$ac_file" ||
+> $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+> 	 X"$ac_file" : 'X\(//\)[^/]' \| \
+> 	 X"$ac_file" : 'X\(//\)$' \| \
+> 	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+> $as_echo X"$ac_file" |
+>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)[^/].*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\).*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  s/.*/./; q'`
+>   { as_dir="$ac_dir"
+>   case $as_dir in #(
+>   -*) as_dir=./$as_dir;;
+>   esac
+>   test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+>     as_dirs=
+>     while :; do
+>       case $as_dir in #(
+>       *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+>       *) as_qdir=$as_dir;;
+>       esac
+>       as_dirs="'$as_qdir' $as_dirs"
+>       as_dir=`$as_dirname -- "$as_dir" ||
+> $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+> 	 X"$as_dir" : 'X\(//\)[^/]' \| \
+> 	 X"$as_dir" : 'X\(//\)$' \| \
+> 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+> $as_echo X"$as_dir" |
+>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)[^/].*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\/\)$/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  /^X\(\/\).*/{
+> 	    s//\1/
+> 	    q
+> 	  }
+> 	  s/.*/./; q'`
+>       test -d "$as_dir" && break
+>     done
+>     test -z "$as_dirs" || eval "mkdir $as_dirs"
+>   } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+> $as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+>    { (exit 1); exit 1; }; }; }
+>   ac_builddir=.
+> 
+> case "$ac_dir" in
+> .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+> *)
+>   ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+>   # A ".." for each directory in $ac_dir_suffix.
+>   ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+>   case $ac_top_builddir_sub in
+>   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+>   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+>   esac ;;
+> esac
+> ac_abs_top_builddir=$ac_pwd
+> ac_abs_builddir=$ac_pwd$ac_dir_suffix
+> # for backward compatibility:
+> ac_top_builddir=$ac_top_build_prefix
+> 
+> case $srcdir in
+>   .)  # We are building in place.
+>     ac_srcdir=.
+>     ac_top_srcdir=$ac_top_builddir_sub
+>     ac_abs_top_srcdir=$ac_pwd ;;
+>   [\\/]* | ?:[\\/]* )  # Absolute name.
+>     ac_srcdir=$srcdir$ac_dir_suffix;
+>     ac_top_srcdir=$srcdir
+>     ac_abs_top_srcdir=$srcdir ;;
+>   *) # Relative name.
+>     ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+>     ac_top_srcdir=$ac_top_build_prefix$srcdir
+>     ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+> esac
+> ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+> 
+> 
+>   case $ac_mode in
+>   :F)
+>   #
+>   # CONFIG_FILE
+>   #
+> 
+>   case $INSTALL in
+>   [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+>   *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+>   esac
+> _ACEOF
+> 
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> # If the template does not know about datarootdir, expand it.
+> # FIXME: This hack should be removed a few years after 2.60.
+> ac_datarootdir_hack=; ac_datarootdir_seen=
+> 
+> ac_sed_dataroot='
+> /datarootdir/ {
+>   p
+>   q
+> }
+> /@datadir@/p
+> /@docdir@/p
+> /@infodir@/p
+> /@localedir@/p
+> /@mandir@/p
+> '
+> case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+> *datarootdir*) ac_datarootdir_seen=yes;;
+> *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+>   { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+> $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+> _ACEOF
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+>   ac_datarootdir_hack='
+>   s&@datadir@&$datadir&g
+>   s&@docdir@&$docdir&g
+>   s&@infodir@&$infodir&g
+>   s&@localedir@&$localedir&g
+>   s&@mandir@&$mandir&g
+>     s&\\\${datarootdir}&$datarootdir&g' ;;
+> esac
+> _ACEOF
+> 
+> # Neutralize VPATH when `$srcdir' = `.'.
+> # Shell code in configure.ac might set extrasub.
+> # FIXME: do we really want to maintain this feature?
+> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+> ac_sed_extra="$ac_vpsub
+> $extrasub
+> _ACEOF
+> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+> :t
+> /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+> s|@configure_input@|$ac_sed_conf_input|;t t
+> s&@top_builddir@&$ac_top_builddir_sub&;t t
+> s&@top_build_prefix@&$ac_top_build_prefix&;t t
+> s&@srcdir@&$ac_srcdir&;t t
+> s&@abs_srcdir@&$ac_abs_srcdir&;t t
+> s&@top_srcdir@&$ac_top_srcdir&;t t
+> s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+> s&@builddir@&$ac_builddir&;t t
+> s&@abs_builddir@&$ac_abs_builddir&;t t
+> s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+> s&@INSTALL@&$ac_INSTALL&;t t
+> $ac_datarootdir_hack
+> "
+> eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+>   || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+> $as_echo "$as_me: error: could not create $ac_file" >&2;}
+>    { (exit 1); exit 1; }; }
+> 
+> test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+>   { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+>   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+>   { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+> which seems to be undefined.  Please make sure it is defined." >&5
+> $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+> which seems to be undefined.  Please make sure it is defined." >&2;}
+> 
+>   rm -f "$tmp/stdin"
+>   case $ac_file in
+>   -) cat "$tmp/out" && rm -f "$tmp/out";;
+>   *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+>   esac \
+>   || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+> $as_echo "$as_me: error: could not create $ac_file" >&2;}
+>    { (exit 1); exit 1; }; }
+>  ;;
+>   :H)
+>   #
+>   # CONFIG_HEADER
+>   #
+>   if test x"$ac_file" != x-; then
+>     {
+>       $as_echo "/* $configure_input  */" \
+>       && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+>     } >"$tmp/config.h" \
+>       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+> $as_echo "$as_me: error: could not create $ac_file" >&2;}
+>    { (exit 1); exit 1; }; }
+>     if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+>       { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+> $as_echo "$as_me: $ac_file is unchanged" >&6;}
+>     else
+>       rm -f "$ac_file"
+>       mv "$tmp/config.h" "$ac_file" \
+> 	|| { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+> $as_echo "$as_me: error: could not create $ac_file" >&2;}
+>    { (exit 1); exit 1; }; }
+4624,4625c10453,10458
+<     rm -f $ac_file
+<     mv conftest.h $ac_file
+---
+>   else
+>     $as_echo "/* $configure_input  */" \
+>       && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+>       || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
+> $as_echo "$as_me: error: could not create -" >&2;}
+>    { (exit 1); exit 1; }; }
+4627c10460,10461
+< fi; done
+---
+>  ;;
+> 
+4629,4630c10463,10465
+< EOF
+< cat >> $CONFIG_STATUS <<EOF
+---
+>   esac
+> 
+> done # for ac_tag
+4632,4633d10466
+< EOF
+< cat >> $CONFIG_STATUS <<\EOF
+4635,4636c10468,10469
+< exit 0
+< EOF
+---
+> { (exit 0); exit 0; }
+> _ACEOF
+4638,4639c10471,10502
+< rm -fr confdefs* $ac_clean_files
+< test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+---
+> ac_clean_files=$ac_clean_files_save
+> 
+> test $ac_write_fail = 0 ||
+>   { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+> $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+>    { (exit 1); exit 1; }; }
+> 
+> 
+> # configure is writing to config.log, and then calls config.status.
+> # config.status does its own redirection, appending to config.log.
+> # Unfortunately, on DOS this fails, as config.log is still kept open
+> # by configure, so config.status won't be able to write to it; its
+> # output is simply discarded.  So we exec the FD to /dev/null,
+> # effectively closing config.log, so it can be properly (re)opened and
+> # appended to by config.status.  When coming back to configure, we
+> # need to make the FD available again.
+> if test "$no_create" != yes; then
+>   ac_cs_success=:
+>   ac_config_status_args=
+>   test "$silent" = yes &&
+>     ac_config_status_args="$ac_config_status_args --quiet"
+>   exec 5>/dev/null
+>   $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+>   exec 5>>config.log
+>   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+>   # would make configure fail if this is the last instruction.
+>   $ac_cs_success || { (exit 1); exit 1; }
+> fi
+> if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+>   { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+> $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+> fi
diff --git a/multi/c/patch/3_4_1 b/multi/c/patch/3_4_1
new file mode 100644
index 0000000..076ed2b
--- /dev/null
+++ b/multi/c/patch/3_4_1
@@ -0,0 +1,17 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+Only in 3_0/icu/source: bin
+Only in 3_0.orig/icu/source: confdefs.h
+diff -ru 3_0.orig/icu/source/config/mh-darwin 3_0/icu/source/config/mh-darwin
+--- 3_0.orig/icu/source/config/mh-darwin	2008-10-20 14:57:52.000000000 -0700
++++ 3_0/icu/source/config/mh-darwin	2008-10-20 15:57:28.000000000 -0700
+@@ -15,6 +15,8 @@
+ ## Commands to generate dependency files
+ GEN_DEPS.c=	$(CC) -E -MMD  $(DEFS) $(CPPFLAGS)
+ GEN_DEPS.cc=	$(CXX) -E -MMD  $(DEFS) $(CPPFLAGS)
++GEN_DEPS.c=	echo
++GEN_DEPS.cc=	echo
+ 
+ ## Commands to compile
+ COMPILE.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -fno-common -c
+Only in 3_0.orig/icu/source: config.cache
+Only in 3_0.orig/icu/source: config.log
diff --git a/multi/c/patch/readme.txt b/multi/c/patch/readme.txt
new file mode 100644
index 0000000..1e92395
--- /dev/null
+++ b/multi/c/patch/readme.txt
@@ -0,0 +1,5 @@
+#!/bin/cat
+# Copyright (c) 2009 IBM Corp. and Others. All Rights Reserved
+#
+
+Contains ICU4C patches to make old versions build.
diff --git a/multi/c/superconf.sh b/multi/c/superconf.sh
new file mode 100755
index 0000000..bc94b30
--- /dev/null
+++ b/multi/c/superconf.sh
@@ -0,0 +1,66 @@
+#!/bin/sh
+# Copyright (c) 2009 IBM Corp. and Others. All Rights Reserved
+#
+# Sample "super configure" 
+# this script is responsible for configuring ICU.
+
+# input variables;
+# $ICU_VER  - the ICU version in underscore format (4_2_0_1)
+
+ICU_SRC="$1"
+ICU_VER="$2"
+
+U_HOST=`hostname`
+U_SYS=`uname || echo unknown`
+#echo $HOST
+
+export rcs=none
+
+case $U_SYS in
+	AIX)
+		# the preferred 'AIX' type to use
+		AIX=AIX
+		case $ICU_VER in 
+		4*)
+			#AIX=AIX4.3VA
+			AIX=AIX
+			;;
+		*)
+			AIX=AIX4.3VA
+			;;
+	        1*|2*|3_0*|3_1*)
+			AIX=AIX4.3xlC
+			PATH=/usr/vacpp/bin/:$PATH
+			;;
+		esac
+		rcs=${AIX}
+		;;
+	*)
+		rcs=none
+		;;
+esac
+
+
+
+case $HOST in
+        sys98*)
+                rcs=$AIX
+                ;;
+        hp*)
+                rcs='HP-UX/ACC'
+                ;;
+        merill*|redhat*|sunlight*)
+                rcs='LinuxRedHat'
+                ;;
+        *)
+		echo sh ${ICU_SRC}/configure
+                #echo Unknown host $HOST, edit $0
+                exit 0
+                ;;
+esac
+
+echo sh ${ICU_SRC}/runConfigureICU "${rcs}"
+
+
+
+
diff --git a/multi/common/Makefile-multi.inc b/multi/common/Makefile-multi.inc
new file mode 100644
index 0000000..bc3c165
--- /dev/null
+++ b/multi/common/Makefile-multi.inc
@@ -0,0 +1,22 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+
+C_ROOT=$(MULTICU_ROOT)/c
+J_ROOT=$(MULTICU_ROOT)/j
+M_TMP=$(MULTICU_ROOT)/tmp
+C_INS=$(M_TMP)/ins
+C_BLD=$(M_TMP)/build
+C_SRC=$(M_TMP)/src
+
+# C defs
+S_INS=include/unicode/utypes.h
+S_SRCDIR=icu/source
+S_BLD=$(S_SRCDIR)/config.status
+S_SRC=$(S_SRCDIR)/configure
+
+-include $(MULTICU_ROOT)/common/Makefile-local.inc
+
+ICUS=$(MULTICU_ROOT)/packages
+
+TOP=$(shell pwd)
+
+# J defs
diff --git a/multi/j/Makefile-j.inc b/multi/j/Makefile-j.inc
new file mode 100644
index 0000000..0007a97
--- /dev/null
+++ b/multi/j/Makefile-j.inc
@@ -0,0 +1,8 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+
+include $(MULTICU_ROOT)/Makefile-multi.inc
+ICUS=$(MULTICU_ROOT)/icus
+J_GOOD:=$(shell [ -d $(ICUS) ] && (cd $(ICUS) ;  ls -d icu4j-*.jar | cut -d- -f2 | cut -d. -f1))
+#J_GOOD=$(ICU4JVERS:%=$(ICUS)/icu4j-%.jar)
+
+
diff --git a/multi/j/old-icu4j.txt b/multi/j/old-icu4j.txt
new file mode 100644
index 0000000..8867e7d
--- /dev/null
+++ b/multi/j/old-icu4j.txt
@@ -0,0 +1,2 @@
+# Copyright (c) 2009 IBM Corp. and Others. All Rights Reserved
+# a list of ICU4Cs too old to build with the current patchset.
diff --git a/multi/proj/chello/Makefile b/multi/proj/chello/Makefile
new file mode 100644
index 0000000..94d54b1
--- /dev/null
+++ b/multi/proj/chello/Makefile
@@ -0,0 +1,51 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+# Makefile for multicu/sample/chello
+# C/C++ hello
+
+## Name of the app
+TARGET=chello
+
+## Sources list (C and C++ just to be difficult)
+C_SOURCES=date.c
+CXX_SOURCES=uprint.cpp
+SRCS=$(C_SOURCES) $(CXX_SOURCES)
+HEADERS=uprint.h
+
+all:
+	@echo To build and list "'" $(OUTFILES) "'"  in "'" $(C_GOOD) "'" use "$(MAKE) check"
+
+## Setup multicu
+MULTICU_ROOT=../../
+include $(MULTICU_ROOT)/c/Makefile-c.inc
+
+OUT=out
+
+$(OUT):
+	mkdir $(OUT)
+
+## The output files.  Will result in:   out/3_8.txt  out/4_0.txt  etc.
+OUTFILES=$(C_GOOD:%=$(OUT)/%.txt)
+
+.PRECIOUS: $(C_CLEAN_TARGET)
+
+## Generate a file
+$(OUT)/%.txt: $(OUT) $(C_INS)/%/bin/$(TARGET)
+	$(shell $(C_INS)/$*/bin/icu-config --invoke) $(C_INS)/$*/bin/$(TARGET)  > $@
+
+## clean
+clean:
+	-rm -f $(C_CLEAN_TARGET)
+	-rm -f ./$(OUT)/*
+	-rmdir $(OUT)
+
+## Just generate
+outfiles: $(OUTFILES)
+
+## Test: generate out files, and print them.
+check: $(OUTFILES)
+	@for file in $(OUTFILES); \
+	do \
+		echo; \
+		sed -e "s%^%$$file: %g" < $$file; \
+	done
+
diff --git a/multi/proj/chello/date.c b/multi/proj/chello/date.c
new file mode 100644
index 0000000..b524a2a
--- /dev/null
+++ b/multi/proj/chello/date.c
@@ -0,0 +1,204 @@
+/*
+**********************************************************************
+*   Copyright (C) 1998-2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+**********************************************************************
+*
+* File date.c
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   06/11/99    stephen     Creation.
+*   06/16/99    stephen     Modified to use uprint.
+*******************************************************************************
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "unicode/utypes.h"
+#include "unicode/ustring.h"
+#include "unicode/uclean.h"
+
+#include "unicode/ucnv.h"
+#include "unicode/udat.h"
+#include "unicode/ucal.h"
+
+#include "uprint.h"
+
+int main(int argc, char **argv);
+
+#if UCONFIG_NO_FORMATTING
+
+int main(int argc, char **argv)
+{
+  printf("%s: Sorry, UCONFIG_NO_FORMATTING was turned on (see uconfig.h). No formatting can be done. \n", argv[0]);
+  return 0;
+}
+#else
+
+
+/* Protos */
+static void usage(void);
+static void version(void);
+static void date(const UChar *tz, UDateFormatStyle style, char *format, UErrorCode *status);
+
+
+/* The version of date */
+#define DATE_VERSION "1.0"
+
+/* "GMT" */
+static const UChar GMT_ID [] = { 0x0047, 0x004d, 0x0054, 0x0000 };
+
+
+int
+main(int argc,
+     char **argv)
+{
+  int printUsage = 0;
+  int printVersion = 0;
+  int optind = 1;
+  char *arg;
+  const UChar *tz = 0;
+  UDateFormatStyle style = UDAT_DEFAULT;
+  UErrorCode status = U_ZERO_ERROR;
+  char *format = NULL;
+
+
+  /* parse the options */
+  for(optind = 1; optind < argc; ++optind) {
+    arg = argv[optind];
+    
+    /* version info */
+    if(strcmp(arg, "-v") == 0 || strcmp(arg, "--version") == 0) {
+      printVersion = 1;
+    }
+    /* usage info */
+    else if(strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) {
+      printUsage = 1;
+    }
+    /* display date in gmt */
+    else if(strcmp(arg, "-u") == 0 || strcmp(arg, "--gmt") == 0) {
+      tz = GMT_ID;
+    }
+    /* display date in gmt */
+    else if(strcmp(arg, "-f") == 0 || strcmp(arg, "--full") == 0) {
+      style = UDAT_FULL;
+    }
+    /* display date in long format */
+    else if(strcmp(arg, "-l") == 0 || strcmp(arg, "--long") == 0) {
+      style = UDAT_LONG;
+    }
+    /* display date in medium format */
+    else if(strcmp(arg, "-m") == 0 || strcmp(arg, "--medium") == 0) {
+      style = UDAT_MEDIUM;
+    }
+    /* display date in short format */
+    else if(strcmp(arg, "-s") == 0 || strcmp(arg, "--short") == 0) {
+      style = UDAT_SHORT;
+    }
+    else if(strcmp(arg, "-F") == 0 || strcmp(arg, "--format") == 0) {
+      if ( optind + 1 < argc ) { 
+         optind++;
+         format = argv[optind];
+      }
+    }
+    /* POSIX.1 says all arguments after -- are not options */
+    else if(strcmp(arg, "--") == 0) {
+      /* skip the -- */
+      ++optind;
+      break;
+    }
+    /* unrecognized option */
+    else if(strncmp(arg, "-", strlen("-")) == 0) {
+      printf("icudate: invalid option -- %s\n", arg+1);
+      printUsage = 1;
+    }
+    /* done with options, display date */
+    else {
+      break;
+    }
+  }
+
+  /* print usage info */
+  if(printUsage) {
+    usage();
+    return 0;
+  }
+
+  /* print version info */
+  if(printVersion) {
+    version();
+    return 0;
+  }
+
+  /* print the date */
+  date(tz, style, format, &status);
+
+  u_cleanup();
+  return (U_FAILURE(status) ? 1 : 0);
+}
+
+/* Usage information */
+static void
+usage()
+{  
+  puts("Usage: icudate [OPTIONS]");
+  puts("Options:");
+  puts("  -h, --help        Print this message and exit.");
+  puts("  -v, --version     Print the version number of date and exit.");
+  puts("  -u, --gmt         Display the date in Greenwich Mean Time.");
+  puts("  -f, --full        Use full display format.");
+  puts("  -l, --long        Use long display format.");
+  puts("  -m, --medium      Use medium display format.");
+  puts("  -s, --short       Use short display format.");
+}
+
+/* Version information */
+static void
+version()
+{
+  printf("icudate version %s (ICU version %s), created by Stephen F. Booth.\n", 
+	 DATE_VERSION, U_ICU_VERSION);
+  puts(U_COPYRIGHT_STRING);
+}
+
+/* Format the date */
+static void
+date(const UChar *tz,
+     UDateFormatStyle style,
+     char *format,
+     UErrorCode *status)
+{
+  UChar *s = 0;
+  int32_t len = 0;
+  UDateFormat *fmt;
+  UChar uFormat[100];
+
+  fmt = udat_open(style, style, 0, tz, -1,NULL,0, status);
+  if ( format != NULL ) {
+     u_charsToUChars(format,uFormat,strlen(format)),
+     udat_applyPattern(fmt,FALSE,uFormat,strlen(format));
+  }
+  len = udat_format(fmt, ucal_getNow(), 0, len, 0, status);
+  if(*status == U_BUFFER_OVERFLOW_ERROR) {
+    *status = U_ZERO_ERROR;
+    s = (UChar*) malloc(sizeof(UChar) * (len+1));
+    if(s == 0) goto finish;
+    udat_format(fmt, ucal_getNow(), s, len + 1, 0, status);
+    if(U_FAILURE(*status)) goto finish;
+  }
+
+  /* print the date string */
+  uprint(s, stdout, status);
+
+  /* print a trailing newline */
+  printf(" @ ICU " U_ICU_VERSION "\n");
+
+ finish:
+  udat_close(fmt);
+  free(s);
+}
+#endif
diff --git a/multi/proj/chello/uprint.cpp b/multi/proj/chello/uprint.cpp
new file mode 100644
index 0000000..547dea9
--- /dev/null
+++ b/multi/proj/chello/uprint.cpp
@@ -0,0 +1,76 @@
+/*
+**********************************************************************
+* Copyright (C) 1998-2009, International Business Machines Corporation
+* and others.  All Rights Reserved.
+**********************************************************************
+*
+* File uprint.cpp
+*
+* Modification History:
+*
+*	Date		Name		Description
+*	06/14/99	stephen 	Creation.
+*******************************************************************************
+*/
+
+#include "uprint.h"
+
+#include "unicode/ucnv.h"
+#include "unicode/ustring.h"
+
+#define BUF_SIZE 128
+
+/* Print a ustring to the specified FILE* in the default codepage */
+U_CAPI void
+uprint(const UChar *s,
+	   FILE *f,
+	   UErrorCode *status)
+{
+  /* converter */
+  UConverter *converter;
+  char buf [BUF_SIZE];
+  int32_t sourceLen;
+  const UChar *mySource;
+  const UChar *mySourceEnd;
+  char *myTarget;
+  int32_t arraySize;
+
+  if(s == 0) return;
+
+  /* set up the conversion parameters */
+  sourceLen    = u_strlen(s);
+  mySource	   = s;
+  mySourceEnd  = mySource + sourceLen;
+  myTarget	   = buf;
+  arraySize    = BUF_SIZE;
+
+  /* open a default converter */
+  converter = ucnv_open(0, status);
+  
+  /* if we failed, clean up and exit */
+  if(U_FAILURE(*status)) goto finish;
+  
+  /* perform the conversion */
+  do {
+	/* reset the error code */
+	*status = U_ZERO_ERROR;
+
+	/* perform the conversion */
+	ucnv_fromUnicode(converter, &myTarget,	myTarget + arraySize,
+			 &mySource, mySourceEnd, NULL,
+			 TRUE, status);
+
+	/* Write the converted data to the FILE* */
+	fwrite(buf, sizeof(char), myTarget - buf, f);
+
+	/* update the conversion parameters*/
+	myTarget	 = buf;
+	arraySize	 = BUF_SIZE;
+  }
+  while(*status == U_BUFFER_OVERFLOW_ERROR); 
+
+ finish:
+  
+  /* close the converter */
+  ucnv_close(converter);
+}
diff --git a/multi/proj/chello/uprint.h b/multi/proj/chello/uprint.h
new file mode 100644
index 0000000..b353e65
--- /dev/null
+++ b/multi/proj/chello/uprint.h
@@ -0,0 +1,26 @@
+/*
+**********************************************************************
+* Copyright (C) 1998-2009, International Business Machines Corporation
+* and others.  All Rights Reserved.
+**********************************************************************
+*
+* File uprint.h
+*
+* Modification History:
+*
+*   Date        Name        Description
+*   06/14/99    stephen     Creation.
+*******************************************************************************
+*/
+
+#ifndef UPRINT_H
+#define UPRINT_H 1
+
+#include <stdio.h>
+
+#include "unicode/utypes.h"
+
+/* Print a ustring to the specified FILE* in the default codepage */
+U_CFUNC void uprint(const UChar *s, FILE *f, UErrorCode *status);
+
+#endif /* ! UPRINT_H */
diff --git a/multi/proj/provider/Makefile b/multi/proj/provider/Makefile
new file mode 100644
index 0000000..ed24b10
--- /dev/null
+++ b/multi/proj/provider/Makefile
@@ -0,0 +1,296 @@
+#
+# Copyright (C) 2010 IBM Corporation and Others, All Rights Reserved.
+#
+all: glurens ii plugs testprog
+
+UNAME=$(shell uname)
+
+ifeq ($(UNAME),Linux)
+LIBPATH_VAR=LD_LIBRARY_PATH
+PLUG_EXTRA_LDFLAGS=-fPIC
+PBLD_EXTRA_FLAGS=-fPIC
+GLUE_EXTRA_CFLAGS= -fPIC
+PLUGLIB_SO=so
+else
+ifeq ($(UNAME),Darwin)
+LIBPATH_VAR=DYLD_LIBRARY_PATH
+PLUG_EXTRA_LDFLAGS=-exported_symbols_list glue/export.txt -dynamiclib -dynamic
+PLUGLIB_SO=dylib
+else
+$(warning **********************************)
+$(warning this script may not know how to handle your $(UNAME) system)
+endif
+endif
+
+
+PROVIDER=provider
+LIBPROVIDER=lib$(PROVIDER).a
+
+#libs: $(ICU_TARBALLS_VERS:%=$(OUT)/%/lib/$(LIBPROVIDER))
+
+PLUGLIB=$(shell echo $(PROVIDER_TARGET)  | tr '.' '_' )
+PLUGLIB_MAJ=$(shell echo $(PROVIDER_TARGET) | cut -d. -f1-2 | tr -d '.' )
+PLUGLIB_ICU_CONFIG=$(C_INS)/r$(PLUGLIB)/bin/icu-config
+#PLUGLIB_SO=$(shell $(PLUGLIB_ICU_CONFIG) --so 2>/dev/null )
+PLUGLIB_NAME=libicuprov.$(PLUGLIB_MAJ).$(PLUGLIB_SO)
+#PLUGLIB_MAJ=$(echo $(PLUGLIB) | cut -d_ -f-1 | tr -d _ )
+#GLOUT_ICU=$(ICU_TARBALLS_VERS:%=$(GLOUT)/%/$(OK))
+PLUGLIB_AVAILABLE=$(shell echo $(PROVIDER_AVAILABLE) | tr '.' '_')
+PLUGLIB_AVAILABLE_DATA=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/data/out/tmp/*.o)
+PLUGLIB_AVAILABLE_STATICS=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/[ci]*/*.ao)
+PLUGLIB_OUTLIBS=$(PLUGLIB:%=$(OUT)/%/lib/$(PLUGLIB_NAME))
+
+
+
+## configuration
+# Absolute path to this dir. 
+# dir holding ICUs to be built
+MULTICU_ROOT=../..
+include $(MULTICU_ROOT)/c/Makefile-c.inc
+ICU_CONFIG=icu-config-nosanity
+ICU_CONFIG_ORIG=icu-config
+
+# subdirs...
+# prefix to distinguish it from non-provider builds
+P_PREFIX=p
+BUILD=$(M_TMP)/$(P_PREFIX)bld
+INST=$(M_TMP)/$(P_PREFIX)ins
+SRC=$(M_TMP)/$(P_PREFIX)src
+OUT=$(TOP)/out
+SOURCE=$(S_SRCDIR)
+GLUE=glue
+GLOUT=$(M_TMP)/$(P_PREFIX)glout
+# header locations
+INCGLUE=$(TOP)/$(GLUE)/include
+# relative path to icuglue within glout
+GLUREN=gluren/include/icuglue
+# relative path to gluren.h
+GLUREN_H=$(GLUREN)/gluren.h
+# Special 'configure' caller
+SUPERCONF=$(TOP)/$(MULTICU_ROOT)/c/superconf.sh
+# options to compilation (such as, debug)
+XOPTS=$(EXTRA_COMPILE_OPTS)
+OK=ok
+MOPTS=
+
+# directories that need to be built
+ALLDIRS=$(INST) $(BUILD) $(SRC) $(GLOUT) $(OUT)
+# The 'ok' flag file for installations
+INST_ICU=$(PLUGLIB_AVAILABLE:%=$(INST)/%/$(OK))
+BUILD_ICU=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/$(OK))
+# this has to do with the pluglib
+GLOUT_ICU=$(PLUGLIB:%=$(GLOUT)/%/obj-$(OK))
+#SRC_ICU=$(ICU_TARBALLS_VERS:%=$(SRC)/%/$(OK))
+# gluren.h files for each version
+GLUREN_ICU=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/$(GLUREN_H))
+#?
+CONFIGURE_CMD=
+# Options passed to configure
+CONFIGURE_OPTS=--enable-static --disable-shared --with-data-packaging=static --disable-extras --disable-icuio --disable-layout --disable-tests --disable-samples  $(EXTRA_CONFIGURE_OPTS) 
+# additional options passed to make
+MAKE_XTRA_OPTS="PKGDATA_MODE=static"
+# additional options passed to make install
+MAKE_INSTALL_XTRA_OPTS=$(MAKE_XTRA_OPTS)
+
+# Munged source names: list of C, C++, O etc files for Backend
+GL_BE_C=$(shell cd $(GLUE) ; ls *_be.c)
+GL_BE_CXX=$(shell cd $(GLUE) ; ls *_be.cpp)
+GL_BE_O=$(GL_BE_C:%.c=%.o) $(GL_BE_CPP:%.cpp=%.o)
+# Munged source names: list of C, C++, O etc files for Frontend
+GL_FE_C=$(shell cd $(GLUE) ; ls *_fe.c)
+GL_FE_CXX=$(shell cd $(GLUE) ; ls *_fe.cpp)
+GL_FE_O=$(GL_FE_C:%.c=%.o) $(GL_FE_CPP:%.cpp=%.o)
+# C flags used in Glue compilation
+GLUE_CFLAGS=-I$(INCGLUE) $(GLUE_EXTRA_CFLAGS)
+
+
+# icu-config switches for compiling: C and C++
+ICU_CONFIG_COMMON=--cppflags
+# icu-config switches for C
+ICU_CONFIG_CC=--cc $(ICU_CONFIG_COMMON) --cflags 
+# icu-config switches for C++
+ICU_CONFIG_CXX=--cxx $(ICU_CONFIG_COMMON) --cxxflags
+
+include Makefile.local
+
+
+## @build All installed ICUs
+ii: $(GLOUT_ICU)
+
+# Don't delete these files
+.PRECIOUS: (INST_ICU) $(BUILD_ICU) $(SRC_ICU) $(ICU_TARBALLS_VERS:%=$(BUILD)/%/config.status) $(ICU_TARBALLS_VERS:%=$(GLOUT)/%/obj-$(OK))  $(ICU_TARBALLS_VERS:%=$(BUILD)/%/config/$(ICU_CONFIG)) $(PLUGLIB_ICU_CONFIG)
+
+# cleanup
+clean:
+	-rm -rf $(ALLDIRS)
+	-$(MAKE) -C ../.. clean
+
+# create all empty work dirs
+$(ALLDIRS):
+	-mkdir -p $(@)
+
+# Build r$(PLUGLIB) from ../../c
+$(PLUGLIB_ICU_CONFIG):
+	$(MAKE) -C ../../c ICUVERS=$(PLUGLIB) ricus
+
+# build the glue objects for TARGET
+# used to be %/* instead of $(PLUGLIB) - now, wire it down to pluglib.
+$(GLOUT)/$(PLUGLIB)/obj-$(OK): $(GLOUT) glurens  $(PLUGLIB_ICU_CONFIG)
+	-mkdir $(GLOUT)/$(PLUGLIB)
+#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CC)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_c_$(PLUGLIB).o $(GL_BE_C:%.c=$(GLUE)/%.c)
+#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_cxx_$(PLUGLIB).o $(GL_BE_CXX:%.cpp=$(GLUE)/%.cpp)
+	-rm -rf $(GLOUT)/$(PLUGLIB)/include
+	mkdir -p $(GLOUT)/$(PLUGLIB)/include/icuglue/include
+# for each version..  build all OTHER FE files
+# TODO: check is unnecessary, not permitted.
+# TODO: change to depend instead of for list. 
+	for ver in $(PLUGLIB_AVAILABLE) ; \
+	do \
+		echo building $$ver for $(PLUGLIB) ; \
+		if [ ! "$$ver" = "$(PLUGLIB)" ]; \
+		then \
+			echo $(GLOUT)/$(PLUGLIB)/gl_fe_c_$${ver}_x_$(PLUGLIB).o \
+			$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CC)) $(GLUE_CFLAGS) -c -I$(TOP)/$(BUILD)/$$ver/gluren/include -DICUGLUE_VER=$$ver "-DICUGLUE_VER_STR=\"$$ver\"" "-DGLUE_SYM(x)=glue ## x ## $$ver" -o $(GLOUT)/$(PLUGLIB)/gl_fe_c_$${ver}_x_$(PLUGLIB).o $(GL_FE_C:%.c=$(GLUE)/%.c) $(XOPTS) ;  \
+			$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -I$(TOP)/$(BUILD)/$$ver/gluren/include -DICUGLUE_VER=$$ver "-DICUGLUE_VER_STR=\"$$ver\"" "-DGLUE_SYM(x)=glue ## x ## $$ver" -o $(GLOUT)/$(PLUGLIB)/gl_fe_cxx_$${ver}_x_$(PLUGLIB).o $(GL_FE_CXX:%.cpp=$(GLUE)/%.cpp) $(XOPTS) ; \
+			echo " GLUE_VER( $$ver ) " >> $(GLOUT)/$(PLUGLIB)/include/icuglue/glver.h; \
+		fi \
+	done
+# build 'this version' FE files
+	@echo Building FE for $(PLUGLIB)
+	$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CC)) $(GLUE_CFLAGS) -I$(GLOUT)/$(PLUGLIB)/include -c -o $(GLOUT)/$(PLUGLIB)/gl_fe_c_$(PLUGLIB).o $(GL_FE_C:%.c=$(GLUE)/%.c) $(XOPTS)
+	$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -I$(GLOUT)/$(PLUGLIB)/include -c -o $(GLOUT)/$(PLUGLIB)/gl_fe_cxx_$(PLUGLIB).o $(GL_FE_CXX:%.cpp=$(GLUE)/%.cpp) $(XOPTS)
+# build 'this version' BE files (disabled for now)
+#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CC)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_c_$(PLUGLIB).o $(GL_BE_C:%.c=$(GLUE)/%.c)
+#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_cxx_$(PLUGLIB).o $(GL_BE_CXX:%.cpp=$(GLUE)/%.cpp)
+	touch $@
+
+plugs: $(PLUGLIB_OUTLIBS) $(OUT)/$(PLUGLIB_MAJ:%=icuplugins%.txt)
+
+install-plugs: $(C_INS)/r$(PLUGLIB)/lib/$(PLUGLIB_NAME) $(C_INS)/r$(PLUGLIB)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt
+	echo "Plugins installed for testing."
+
+#TODO: should be 'install' not 'cp'
+$(C_INS)/r$(PLUGLIB)/lib/$(PLUGLIB_NAME) $(C_INS)/r$(PLUGLIB)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt: $(PLUGLIB_OUTLIBS)
+	cp $(PLUGLIB_OUTLIBS) $(C_INS)/r$(PLUGLIB)/lib
+	echo "$(PLUGLIB_NAME)	coll_provider_plugin" > $(C_INS)/r$(PLUGLIB)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt
+
+$(OUT)/icuplugins$(PLUGLIB_MAJ).txt: $(PLUGLIB_OUTLIBS)
+	echo "$(PLUGLIB_NAME)	coll_provider_plugin" > $@
+
+TESTPROG=coldiff
+
+testprog: $(PLUGLIB:%=$(OUT)/%/bin/$(TESTPROG)) 
+
+check: all testprog $(OUT)/icuplugins$(PLUGLIB_MAJ).txt
+	ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(C_INS)/r$(PLUGLIB)/lib:out/$(PLUGLIB)/lib $(C_INS)/r$(PLUGLIB)/bin/icuinfo || ( echo "ICU broken." ; /bin/false )
+	ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(C_INS)/r$(PLUGLIB)/lib:out/$(PLUGLIB)/lib $(C_INS)/r$(PLUGLIB)/bin/icuinfo -L || ( echo "Plugin broken." ; /bin/false )
+	ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(C_INS)/r$(PLUGLIB)/lib:out/$(PLUGLIB)/lib out/$(PLUGLIB)/bin/coldiff || ( echo "coldiff failed." ; /bin/false )
+
+install-check: install-plugs
+	$(LIBPATH_VAR)=$(C_INS)/r$(PLUGLIB)/lib $(C_INS)/r$(PLUGLIB)/bin/icuinfo -L || ( echo "Plugin broken." ; /bin/false )
+	$(LIBPATH_VAR)=$(C_INS)/r$(PLUGLIB)/lib out/$(PLUGLIB)/bin/coldiff || ( echo "coldiff failed." ; /bin/false )
+
+$(OUT)/%/bin/$(TESTPROG): $(TESTPROG).cpp $(OUT)/$(PLUGLIB)/provider_version.h
+	-mkdir -p $(OUT)/$*/bin
+	$(shell $(PLUGLIB_ICU_CONFIG) --cxx --cxxflags --cppflags --ldflags) -o $@ -I$(OUT)/$(PLUGLIB) $(TESTPROG).cpp
+
+$(OUT)/%/lib/$(PLUGLIB_NAME):  $(GLOUT)/%/obj-$(OK)
+	-mkdir -p $(OUT)/$*/lib
+	$(shell $(PLUGLIB_ICU_CONFIG) --cxx --cxxflags --cppflags --ldflags) $(PLUG_EXTRA_LDFLAGS) -shared -o $@ $(GLOUT)/$*/*.o $(PLUGLIB_AVAILABLE_DATA) $(PLUGLIB_AVAILABLE_STATICS)
+
+#	cp $@ $(C_INS)/r$*/lib/
+
+$(OUT)/%/lib/$(LIBPROVIDER):  $(GLOUT)/%/obj-$(OK)
+	-mkdir -p $(OUT)/$*/lib
+	echo copy includes
+	ar -rv $@ $(GLOUT)/$*/*.o
+	ranlib $@
+
+## @@ build glu rename files
+glurens: $(GLUREN_ICU)
+
+# build single gluren.h 
+$(BUILD)/%/$(GLUREN_H): $(BUILD)/%/ok Makefile
+	-mkdir -p $(BUILD)/$*/$(GLUREN)
+	cat $(GLUE)/gluren-top.h > $@
+	echo "#define GLUREN_VER" $* >> $@
+	echo "#define GLUREN_TINY" $(shell echo $* | cut -d_ -f1-2) >> $@
+	echo >> $@
+	echo >> $@
+	echo >> $@
+	grep "^#define.*$(shell echo $* | cut -d_ -f1-2)$$" $(SRC)/$*/$(SOURCE)/common/unicode/urename.h   | fgrep -v '*' | \
+		sed -e "s@^#define \([^ ]*\) \([^ ]*\)@#define OICU_\1 \2@" >> $@
+	cat $(GLUE)/gluren-bottom.h >> $@
+
+
+$(BUILD)/%/config/$(ICU_CONFIG): $(BUILD)/%/config/$(ICU_CONFIG_ORIG) icu-config.sed $(BUILD)/%/ok 
+	sed -f icu-config.sed < $(BUILD)/$*/config/$(ICU_CONFIG_ORIG) >  $(BUILD)/$*/config/$(ICU_CONFIG) && chmod a+rx  $(BUILD)/$*/config/$(ICU_CONFIG)
+
+# smiling now.
+# perform installation
+$(INST)/%/ok: $(BUILD)/%/ok
+	echo "INST " "[" $* "]"
+	mkdir -p $(INST)/$*
+	-$(MAKE) $(MOPTS) -C $(BUILD)/$* install $(MAKE_INSTALL_XTRA_OPTS) 
+	touch $@
+
+# unpack ICU and patch
+$(SRC)/%/ok: $(ICUS)/icu4c-%-src.tgz
+	-[ -d $(SRC)/$* ] && rm -rf $(SRC)/$*
+	@echo "Unpacking" $*
+	mkdir -p $(SRC)/$*
+	( cd $(SRC)/$* && tar xfpz $(TOP)/$(ICUS)/icu4c-$*-src.tgz )
+	@echo Should patch $* here
+	touch $@
+
+# config 
+$(BUILD)/%/config.status: $(SRC)/%/ok
+	@echo "Configging" $*
+	-[ -d $(BUILD)/$* ] && rm -rf $(BUILD)/$*
+	mkdir -p $(BUILD)/$*
+	( cd $(BUILD)/$* && env CFLAGS=$(PBLD_EXTRA_FLAGS) CXXFLAGS=$(PBLD_EXTRA_FLAGS) $(shell $(SUPERCONF) $(TOP)/$(SRC)/$*/$(SOURCE) $*) $(CONFIGURE_OPTS) --srcdir=$(TOP)/$(SRC)/$*/$(SOURCE) --prefix=$(TOP)/$(INST)/$* )
+
+# build 
+# note: regex had renaming problems, and spoof depends on regex. Nuke them.
+$(BUILD)/%/ok: $(BUILD)/%/config.status
+	@echo "Building" $*
+	( $(MAKE)  $(MOPTS) -C $(BUILD)/$* all $(MAKE_XTRA_OPTS) )
+	@if [ ! -f $(BUILD)/$*/common/putil.ao ]; \
+	then \
+		echo re-unpacking $(BUILD)/$*/common ; \
+		( cd $(BUILD)/$*/common && ar xf ../lib/libsicuuc.a || echo could not unpack ../lib/libsicuuc.a ) ; \
+		echo re-unpacking $(BUILD)/$*/i18n ; \
+		( cd $(BUILD)/$*/i18n && ar xf ../lib/libsicui18n.a || echo could not unpack ../lib/libsicui18n.a ) ; \
+	fi
+	@if [ ! -f $(BUILD)/$*/common/putil.ao ]; \
+	then \
+		echo ERROR: still could not find $(BUILD)/$*/common/putil.ao - build may fail.; \
+	fi
+	-rm -f $(BUILD)/$*/i18n/uregex*.* $(BUILD)/$*/i18n/uspoof*.*o*
+	touch $@
+
+info help:
+	@echo ICU Provider Build
+	@echo "Targetting Provider against ICU $(PROVIDER_TARGET) ($(PLUGLIB), major $(PLUGLIB_MAJ))"
+	@echo "Available plugins: $(PROVIDER_AVAILABLE) ($(PLUGLIB_AVAILABLE))"
+	@echo "Available keywords:"
+	@for ver in $(PROVIDER_AVAILABLE); do \
+		echo "   ...@provider=icu"`echo $$ver | cut -d. -f1-2 | tr -d .`; \
+	done
+	@echo "Plugin library will be $(PLUGLIB_NAME)"
+	@echo
+	@echo Available ICU tarballs:  $(ICU_TARBALLS)
+	@echo Available ICU versions: $(shell echo $(ICU_TARBALLS_VERS) | tr '_' '.')
+
+$(OUT)/$(PLUGLIB)/provider_version.h: Makefile.local Makefile
+	@echo Generating $@ ..
+	@echo "/* Generated file. */" > $@
+	@echo "const char *provider_version[] = {" >> $@
+	@for ver in $(PROVIDER_AVAILABLE); do \
+		echo '"'`echo $$ver | cut -d. -f1-2 | tr -d .`'",' >> $@ ; \
+	done
+	@echo " }; " >> $@
+	@echo "#define PROVIDER_COUNT (sizeof(provider_version)/sizeof(provider_version[0]))" >> $@
+	@echo >> $@
+
+#-- for the prototype
diff --git a/multi/proj/provider/Makefile.local-sample b/multi/proj/provider/Makefile.local-sample
new file mode 100644
index 0000000..88e8c8a
--- /dev/null
+++ b/multi/proj/provider/Makefile.local-sample
@@ -0,0 +1,32 @@
+#
+# Copyright (C) 2008-2010 IBM Corporation and Others. All Rights Reserved
+
+# local definitions must go in Makefile.local
+# example:
+
+##
+## These two are REQUIRED.
+##
+
+# The version of ICU you will build against, such as:  
+# EXAMPLE: 4.4.2
+PROVIDER_TARGET=4.4.2
+
+# The versions of ICU you want to have available in the plugin. Space separated.  Don't include the PROVIDER_TARGET version.
+# EXAMPLE: 3.8.1  4.2.0.1
+PROVIDER_AVAILABLE=3.8.1 4.2.0.1
+
+
+
+
+
+##
+## following are OPTIONAL
+##
+
+## debug options
+#EXTRA_COMPILE_OPTS=-g
+
+## configure options
+#EXTRA_CONFIGURE_OPTS=--with-library-suffix=srl
+
diff --git a/multi/proj/provider/coldiff.cpp b/multi/proj/provider/coldiff.cpp
new file mode 100644
index 0000000..b926380
--- /dev/null
+++ b/multi/proj/provider/coldiff.cpp
@@ -0,0 +1,99 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#include <unicode/coll.h>
+#include <unicode/uclean.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+/* String to use. */
+const UChar stuff[] = { 0x30BB, 0x0d4c, 0x53, 0x74, 0x75, 0x66, 0x66, 0x00 }; /* Stuff */
+
+#include "provider_version.h"
+
+
+#define LOCALE_COUNT 4
+const char *locale[LOCALE_COUNT] = { "fi", "en_US", "ja", "ml" }; /* List of locales to test */
+
+/**
+ * Set up ICU, print # of available collators
+ */
+void setup(UErrorCode &status) {
+    u_init(&status);
+  
+    fprintf(stderr, "ICU %s init: %s\n", U_ICU_VERSION, u_errorName(status));
+
+    int32_t count;
+    StringEnumeration *se = Collator::getAvailableLocales();
+    count = se->count(status);
+    fprintf(stderr, "# Collators now available: %d,\t%s - %d providers expected.\n", count, u_errorName(status), PROVIDER_COUNT);
+}
+
+int main(int /* argc*/ , const char * /*argv*/ []) {
+    UErrorCode status = U_ZERO_ERROR;
+    int diffs = 0;
+    setup(status);
+    if(U_FAILURE(status)) return 1;
+
+    int expected = PROVIDER_COUNT;
+
+    for(int l=0;l<LOCALE_COUNT;l++) {
+        printf("\n");
+        uint8_t oldBytes[200];
+        int32_t oldLen = -1;
+        for(int v=0;v<=expected;v++) {
+
+            // Construct the locale ID
+            char locID[200];
+            strcpy(locID, locale[l]);
+            if((v!=expected)) { // -1 = no version
+                strcat(locID, "@provider=icu");
+                strcat(locID, provider_version[v]);
+            }
+            
+            printf("%28s : ", locID);
+            
+            UErrorCode subStatus = U_ZERO_ERROR;
+            uint8_t bytes[200];
+
+            Collator *col = Collator::createInstance(Locale(locID),subStatus);
+            if(U_FAILURE(subStatus)) {
+                printf("ERR: %s\n", u_errorName(subStatus));
+                continue;
+            }
+            int32_t len = col->getSortKey(stuff, -1, bytes, 200);
+
+            for(int i=0;i<len;i++) {
+	      if(i<oldLen&&bytes[i]!=oldBytes[i]) {
+                  diffs++;
+                  printf("*");
+                } else {
+                  printf(" ");
+                }
+                printf("%02X", (0xFF&bytes[i]));
+            }
+            printf("\n");
+
+            delete col;
+
+            oldLen = len;
+            memcpy(oldBytes, bytes, len);
+        }
+    }
+
+    if(diffs==0) {
+      printf("ERROR: 0 differences found between platforms.. are the platforms installed? Try 'icuinfo -L'\n");
+    } else {
+      printf("%d differences found among provider versions. Success!\n", diffs);
+    }
+    
+    return 0;
+}
diff --git a/multi/proj/provider/export.txt b/multi/proj/provider/export.txt
new file mode 100644
index 0000000..07ab784
--- /dev/null
+++ b/multi/proj/provider/export.txt
@@ -0,0 +1,2 @@
+# Copyright (C) 2010 International Business Machines Corporation and Others. All Rights Reserved. 
+_coll_provider_plugin
diff --git a/multi/proj/provider/glue/_versionlist_.cpp b/multi/proj/provider/glue/_versionlist_.cpp
new file mode 100644
index 0000000..9010609
--- /dev/null
+++ b/multi/proj/provider/glue/_versionlist_.cpp
@@ -0,0 +1,36 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#include <icuglue/icuglue.h>
+#include <unicode/coll.h>
+
+
+#if defined ( ICUGLUE_VER )
+//#error DEFINED!
+#else
+
+#define GLUE_VER(x) puts("Version " # x );
+
+#include <stdio.h>
+
+// generate list of versions
+#include <icuglue/fe_verlist.h>
+
+int main(int argc, const char *argv[]) {
+printf("I'm on " U_ICU_VERSION " but i have modules for: \n");
+  for(int i=0;fe_verlist[i];i++) {
+      printf("%d: %s\n", i, fe_verlist[i]);
+  }
+}
+
+#endif
+
+
+
+
diff --git a/multi/proj/provider/glue/coll_be.c b/multi/proj/provider/glue/coll_be.c
new file mode 100644
index 0000000..d0e2f22
--- /dev/null
+++ b/multi/proj/provider/glue/coll_be.c
@@ -0,0 +1,10 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+/* */
diff --git a/multi/proj/provider/glue/coll_be.cpp b/multi/proj/provider/glue/coll_be.cpp
new file mode 100644
index 0000000..a0ed273
--- /dev/null
+++ b/multi/proj/provider/glue/coll_be.cpp
@@ -0,0 +1,20 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+
+
+#include <unicode/coll.h>
+#include <icuglue/coll_be.h>
+XP_CPLUSPLUS
+
+
+
+extern "C" {
+    
+}
\ No newline at end of file
diff --git a/multi/proj/provider/glue/coll_fe.c b/multi/proj/provider/glue/coll_fe.c
new file mode 100644
index 0000000..db672d6
--- /dev/null
+++ b/multi/proj/provider/glue/coll_fe.c
@@ -0,0 +1,19 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+/*
+not needed.
+*/
+
+
+extern void not_needed () {
+	return;
+}
+
+
diff --git a/multi/proj/provider/glue/coll_fe.cpp b/multi/proj/provider/glue/coll_fe.cpp
new file mode 100644
index 0000000..0909fab
--- /dev/null
+++ b/multi/proj/provider/glue/coll_fe.cpp
@@ -0,0 +1,499 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#ifndef COLL_FE_DEBUG
+#define COLL_FE_DEBUG 0
+#endif
+
+#include <icuglue/icuglue.h>
+#include <unicode/coll.h>
+//#include <unicode/tblcoll.h>
+#include <unicode/ucol.h>
+#include <string.h>
+#include <stdio.h>
+#include "unicode/ustring.h"
+
+// these from tblcoll.h
+static Collator::ECollationStrength _getECollationStrength(
+                                       const UCollationStrength &strength) 
+{
+    switch (strength)
+    {
+    case UCOL_PRIMARY :
+        return Collator::PRIMARY;
+    case UCOL_SECONDARY :
+        return Collator::SECONDARY;
+    case UCOL_TERTIARY :
+        return Collator::TERTIARY;
+    case UCOL_QUATERNARY :
+        return Collator::QUATERNARY;
+    default :
+        return Collator::IDENTICAL;
+    }
+}
+
+static UCollationStrength _getUCollationStrength(
+                             const Collator::ECollationStrength &strength) 
+{
+    switch (strength)
+    {
+    case Collator::PRIMARY :
+        return UCOL_PRIMARY;
+    case Collator::SECONDARY :
+        return UCOL_SECONDARY;
+    case Collator::TERTIARY :
+        return UCOL_TERTIARY;
+    case Collator::QUATERNARY :
+        return UCOL_QUATERNARY;
+    default :
+        return UCOL_IDENTICAL;
+    }
+}
+
+
+/**
+ * Macro to define the Collator_glue_4_2 class 
+ */
+#define GLUE_VER(x) class GLUE_SYM_V( Collator, x ) : public Collator {  \
+    \
+  public:  static Collator *create(const Locale &loc, const char *ver); \
+  private: UCollator *_this; GLUE_SYM_V( Collator, x ) ( UCollator* tn ) : _this(tn){} \
+    virtual ~ GLUE_SYM_V ( Collator, x) ();                             \
+  public:                                                               \
+    virtual void* getDynamicClassID() const;                            \
+    static void* getStaticClassID() ;                                   \
+    virtual Collator* clone() const;                                    \
+    virtual UCollationResult compare(const UnicodeString&, const UnicodeString&, UErrorCode&) const; \
+    virtual UCollationResult compare(const UnicodeString&, const UnicodeString&, int32_t, UErrorCode&) const; \
+    virtual UCollationResult compare(const UChar*, int32_t, const UChar*, int32_t, UErrorCode&) const; \
+    virtual CollationKey& getCollationKey(const UnicodeString&, CollationKey&, UErrorCode&) const; \
+    virtual CollationKey& getCollationKey(const UChar*, int32_t, CollationKey&, UErrorCode&) const; \
+    virtual int32_t hashCode() const;                                   \
+    virtual const Locale getLocale(ULocDataLocaleType, UErrorCode&) const; \
+    virtual ECollationStrength getStrength() const;                     \
+    virtual void setStrength(ECollationStrength);                       \
+    virtual void getVersion(uint8_t*) const;                            \
+    virtual void setAttribute(UColAttribute, UColAttributeValue, UErrorCode&); \
+    virtual UColAttributeValue getAttribute(UColAttribute, UErrorCode&); \
+    virtual uint32_t setVariableTop(const UChar*, int32_t, UErrorCode&); \
+    virtual uint32_t setVariableTop(UnicodeString, UErrorCode&);        \
+    virtual void setVariableTop(uint32_t, UErrorCode&);                 \
+    virtual uint32_t getVariableTop(UErrorCode&) const;                 \
+    virtual Collator* safeClone();                                      \
+    virtual int32_t getSortKey(const UnicodeString&, uint8_t*, int32_t) const; \
+    virtual int32_t getSortKey(const UChar*, int32_t, uint8_t*, int32_t) const; \
+  public: static int32_t countAvailable();                              \
+  public: static int32_t appendAvailable(UnicodeString* strs, int32_t i, int32_t count); \
+  };
+
+/** ==================================== The following code runs inside the 'target' version (i.e. old ICU) ========== **/
+#if defined ( ICUGLUE_VER )
+
+/* code for some version */
+#include <icuglue/gluren.h>
+
+/**
+   uclean.h
+*/
+U_STABLE void U_EXPORT2
+OICU_u_init(UErrorCode *status);
+
+/**
+ ucol.h
+*/
+U_STABLE UCollator* U_EXPORT2 
+OICU_ucol_open(const char *loc, UErrorCode& status);
+
+U_STABLE void U_EXPORT2 
+OICU_ucol_close(UCollator*);
+
+U_STABLE UCollationResult OICU_ucol_strcoll	(	const UCollator * 	coll,
+const UChar * 	source,
+int32_t 	sourceLength,
+const UChar * 	target,
+int32_t 	targetLength	 
+);
+
+U_STABLE int32_t U_EXPORT2 
+OICU_ucol_countAvailable();
+
+U_STABLE void U_EXPORT2 
+OICU_ucol_setStrength(const UCollator *, UCollationStrength );
+
+U_STABLE const char * U_EXPORT2 
+OICU_ucol_getAvailable(int32_t i);
+
+U_STABLE UCollationStrength U_EXPORT2 
+OICU_ucol_getStrength(UCollator *col);
+
+U_STABLE int32_t U_EXPORT2 
+OICU_ucol_getSortKey(const    UCollator    *coll,
+        const    UChar        *source,
+        int32_t        sourceLength,
+        uint8_t        *result,
+        int32_t        resultLength);
+
+
+U_STABLE UCollator* U_EXPORT2 
+OICU_ucol_safeClone(const UCollator *coll,
+               void            *stackBuffer,
+               int32_t         *pBufferSize,
+               UErrorCode      *status);
+
+
+/**
+ end ucol.h
+*/
+
+// define version
+GLUE_VER( ICUGLUE_VER )
+
+GLUE_SYM ( Collator ) :: ~ GLUE_SYM(Collator) () {
+#if COLL_FE_DEBUG
+    fprintf(stderr, "VCF " ICUGLUE_VER_STR " ucol_close");
+#endif
+    OICU_ucol_close(_this);
+}
+
+#if 0
+U_CFUNC int32_t U_CALLCONV
+GLUE_SYM ( glue_calcSortKey) (const    UCollator    *coll,
+        const    UChar        *source,
+        int32_t        sourceLength,
+        uint8_t        **result,
+        uint32_t        resultLength,
+        UBool allocateSKBuffer,
+        UErrorCode *status);
+
+#endif
+
+Collator *
+GLUE_SYM ( Collator ) :: create (const Locale &loc, const char *ver) {
+    UErrorCode status = U_ZERO_ERROR;
+    char locBuf[200];
+    char kwvBuf[200];
+    int32_t len = loc.getKeywordValue("collation", kwvBuf, 200, status);
+    strcpy(locBuf,loc.getBaseName());
+    if(len>0) {
+        strcat(locBuf,"@collator=");
+        strcat(locBuf,kwvBuf);
+    }
+    UCollator * uc =  OICU_ucol_open( locBuf, status);
+    if(U_FAILURE(status)) return NULL; // TODO: ERR?
+    Collator *c =  new GLUE_SYM( Collator ) ( uc );
+#if COLL_FE_DEBUG
+    fprintf(stderr, "VCF " ICUGLUE_VER_STR " ucol_open=%s ->> %p\n", locBuf, c);
+#endif
+    return c;
+}
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION( GLUE_SYM( Collator ) )
+
+Collator* GLUE_SYM ( Collator ) :: clone() const  {
+    UErrorCode status = U_ZERO_ERROR;
+#if COLL_FE_DEBUG
+    fprintf(stderr, "VCF " ICUGLUE_VER_STR " clone %p -> " , this);
+#endif
+    UCollator *clc = OICU_ucol_safeClone( _this, NULL, 0, &status);
+#if COLL_FE_DEBUG
+    fprintf(stderr, "VCF " ICUGLUE_VER_STR " .. safeclone %s _this %p-> %p " , u_errorName(status), _this, clc);
+#endif
+    if(U_FAILURE(status)||clc==NULL) return NULL;
+    Collator *c = new GLUE_SYM( Collator ) ( clc );
+#if COLL_FE_DEBUG
+    fprintf(stderr, "VCF " ICUGLUE_VER_STR " .. wrap(%p) -> %p\n", clc, c);
+#endif
+
+    return c;
+}
+
+
+UCollationResult GLUE_SYM ( Collator ) :: compare(const UnicodeString&, const UnicodeString&, UErrorCode&) const  {
+    return (UCollationResult)0;
+}
+
+
+UCollationResult GLUE_SYM ( Collator ) :: compare(const UnicodeString&, const UnicodeString&, int32_t, UErrorCode&) const  {
+    return (UCollationResult)0;
+}
+
+
+UCollationResult GLUE_SYM ( Collator ) :: compare(const UChar* s, int32_t sl, const UChar* d , int32_t dl, UErrorCode&e ) const  {
+    return OICU_ucol_strcoll(_this, s, sl, d, dl);
+}
+
+#include "unicode/sortkey.h"
+
+static CollationKey kk;
+
+CollationKey& GLUE_SYM ( Collator ) :: getCollationKey(const UnicodeString&, CollationKey&, UErrorCode&) const  {
+  //#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF " ICUGLUE_VER_STR " GCK - notimp");
+    //#endif
+return kk;
+}
+
+
+CollationKey& GLUE_SYM ( Collator ) :: getCollationKey(const UChar*, int32_t, CollationKey&, UErrorCode&) const  {
+    fprintf(stderr,  "VCF " ICUGLUE_VER_STR " GKK2 - notimp");
+return kk;
+}
+
+
+int32_t GLUE_SYM ( Collator ) :: hashCode() const  {
+    return 0;
+}
+
+
+const Locale GLUE_SYM ( Collator ) :: getLocale(ULocDataLocaleType, UErrorCode&) const  {
+    return Locale();
+}
+
+
+Collator::ECollationStrength
+ GLUE_SYM ( Collator ) :: getStrength() const  {
+    return _getECollationStrength(OICU_ucol_getStrength(_this));
+}
+
+
+void GLUE_SYM ( Collator ) :: setStrength(ECollationStrength s)  {
+    OICU_ucol_setStrength(_this, _getUCollationStrength(s));
+}
+
+
+void GLUE_SYM ( Collator ) :: getVersion(uint8_t*) const  {
+}
+
+
+void GLUE_SYM ( Collator ) :: setAttribute(UColAttribute, UColAttributeValue, UErrorCode&)  {
+}
+
+
+UColAttributeValue GLUE_SYM ( Collator ) :: getAttribute(UColAttribute, UErrorCode&)  {
+return (UColAttributeValue)0;
+}
+
+
+uint32_t GLUE_SYM ( Collator ) :: setVariableTop(const UChar*, int32_t, UErrorCode&)  {
+return 0;
+}
+
+
+uint32_t GLUE_SYM ( Collator ) :: setVariableTop(UnicodeString, UErrorCode&)  {
+return 0;
+}
+
+
+void GLUE_SYM ( Collator ) :: setVariableTop(uint32_t, UErrorCode&)  {
+}
+
+
+uint32_t GLUE_SYM ( Collator ) :: getVariableTop(UErrorCode&) const  {
+return 0;
+}
+
+
+Collator* GLUE_SYM ( Collator ) :: safeClone()  {
+    return clone();
+}
+
+
+int32_t GLUE_SYM ( Collator ) :: getSortKey(const UnicodeString& s, uint8_t*buf, int32_t len) const  {
+#if COLL_FE_DEBUG
+  fprintf(stderr,  "VCF " ICUGLUE_VER_STR " GSK");
+#endif
+    return getSortKey(s.getBuffer(),s.length(), buf, len);
+}
+
+
+
+
+int32_t GLUE_SYM ( Collator ) :: getSortKey(const UChar*s, int32_t l, uint8_t*d, int32_t b) const  {
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF " ICUGLUE_VER_STR " GKS");
+#endif
+    return OICU_ucol_getSortKey(_this, s,l,d,b);
+}
+
+ int32_t GLUE_SYM ( Collator ) :: countAvailable() {
+    int32_t count =  OICU_ucol_countAvailable();
+    return count;
+ }
+ 
+ 
+ int32_t GLUE_SYM ( Collator ) :: appendAvailable(UnicodeString* strs, int32_t i, int32_t count) {
+   int avail = OICU_ucol_countAvailable();
+   UErrorCode status = U_ZERO_ERROR;
+   OICU_u_init(&status);
+#if COLL_FE_DEBUG
+   fprintf(stderr,  "VCF " ICUGLUE_VER_STR " avail %d - init %s\n", avail, u_errorName(status));
+#endif   
+    for(int j=0;j<avail;j++) {
+         strs[i+j].append(OICU_ucol_getAvailable(j));
+         strs[i+j].append("@provider=icu");
+         strs[i+j].append( ICUGLUE_VER_STR[0] );  // X_y
+         strs[i+j].append( ICUGLUE_VER_STR[2] );  // x_Y
+#if COLL_FE_DEBUG
+         { 
+            char foo[999];
+            const UChar *ss = strs[i+j].getTerminatedBuffer();
+            u_austrcpy(foo, ss);
+            //            fprintf(stderr,  "VCF " ICUGLUE_VER_STR " appending [%d+%d=%d] <<%s>>\n", i, j, i+j, foo);
+        }
+#endif
+    }
+    return OICU_ucol_countAvailable();
+ }
+
+
+
+
+#else
+/** ==================================== The following code runs inside the 'provider' version (i.e. current ICU) ========== **/
+
+// define Collator_XX
+#include "icuglue/glver.h"
+
+// generate list of versions
+static
+#include <icuglue/fe_verlist.h>
+
+class VersionCollatorFactory : public CollatorFactory {
+public:
+  virtual Collator *createCollator(const Locale &loc);
+  virtual const UnicodeString *getSupportedIDs(int32_t &count, UErrorCode &status);
+  virtual void* getDynamicClassID() const; 
+  static void* getStaticClassID() ; 
+};
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION( VersionCollatorFactory )
+
+Collator *VersionCollatorFactory::createCollator(const Locale &loc) {
+    // pull off provider #
+    char provider[200];
+    UErrorCode status = U_ZERO_ERROR;
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF:CC %s\n", loc.getName());
+#endif
+    int32_t len = loc.getKeywordValue("provider", provider, 200, status);
+    if(U_FAILURE(status)||len==0) return NULL;
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF:KWV> %s/%d\n", u_errorName(status), len);
+#endif
+    provider[len]=0;
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF:KWV %s\n", provider);
+#endif
+    if(strncmp(provider,"icu",3)) return NULL;
+    const char *icuver=provider+3;
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF:ICUV %s\n", icuver);
+#endif
+    
+#if defined(GLUE_VER)
+#undef GLUE_VER
+#endif
+#define GLUE_VER(x) /*printf("%c/%c|%c/%c\n", icuver[0],(#x)[0],icuver[1],(#x)[2]);*/  if(icuver[0]== (#x)[0] && icuver[1]==(#x)[2]) { Collator *c = glue ## Collator ## x :: create(loc, icuver); /*fprintf(stderr, "VCF::CC %s -> %p\n", loc.getName(), c);*/ return c; }
+#include "icuglue/glver.h"
+#if COLL_FE_DEBUG
+    fprintf(stderr,  "VCF:CC %s failed\n", loc.getName());
+#endif
+
+    return NULL;
+}
+
+
+static const UnicodeString *gLocales = NULL;
+static  int32_t gLocCount = 0; 
+
+const UnicodeString
+*VersionCollatorFactory::getSupportedIDs(int32_t &count, UErrorCode &status) {
+  if(gLocales==NULL) {
+    count = 0;
+    
+    
+    /* gather counts */
+#if defined(GLUE_VER)
+#undef GLUE_VER
+#endif
+#define GLUE_VER(x) count += glue ## Collator ## x :: countAvailable();
+#include "icuglue/glver.h"
+
+#if COLL_FE_DEBUG
+    printf("VCF: count=%d\n", count);
+#endif
+    UnicodeString *strs = new  UnicodeString[count];
+    int32_t i = 0;
+
+#if defined(GLUE_VER)
+#undef GLUE_VER
+#endif
+#define GLUE_VER(x) i += glue ## Collator ## x :: appendAvailable(strs, i, count);
+#include "icuglue/glver.h"
+
+#if COLL_FE_DEBUG
+    printf("VCF: appended count=%d\n", count);
+#endif
+
+    gLocCount = count;
+    gLocales = strs;
+  }
+  count = gLocCount;
+  return gLocales;
+}
+
+
+/* Plugin Code */
+
+#include <stdio.h>
+#include <unicode/uversion.h>
+
+static URegistryKey rk = NULL;
+
+void coll_provider_register(UErrorCode &status) {
+  rk = Collator::registerFactory(new VersionCollatorFactory(), status);
+}
+
+void coll_provider_unregister(UErrorCode &status) {
+  Collator::unregister(rk, status);
+}
+
+/* Plugin- only ICU 4.4+ */
+#if (U_ICU_VERSION_MAJOR_NUM > 4) || ((U_ICU_VERSION_MAJOR_NUM==4)&&(U_ICU_VERSION_MINOR_NUM>3))
+#include "unicode/icuplug.h"
+
+U_CAPI UPlugTokenReturn U_EXPORT2 coll_provider_plugin (UPlugData *data, UPlugReason reason, UErrorCode *status);
+
+U_CAPI UPlugTokenReturn U_EXPORT2 coll_provider_plugin (UPlugData *data, UPlugReason reason, UErrorCode *status)
+{
+  switch(reason) {
+  case UPLUG_REASON_QUERY:
+    uplug_setPlugName(data, "Collation Provider Plugin");
+    uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH);
+    break;
+  case UPLUG_REASON_LOAD:
+    coll_provider_register(*status);
+    break;
+  case UPLUG_REASON_UNLOAD:
+    coll_provider_unregister(*status);
+    break;
+  default:
+    break; /* not handled */
+  }
+  return UPLUG_TOKEN;
+}
+#else
+
+/* 
+   Note: this ICU version must explicitly call 'coll_provider_plugin'
+*/
+
+#endif /* plugin */
+
+#endif /* provider side (vs target) */
diff --git a/multi/proj/provider/glue/export.txt b/multi/proj/provider/glue/export.txt
new file mode 100644
index 0000000..07ab784
--- /dev/null
+++ b/multi/proj/provider/glue/export.txt
@@ -0,0 +1,2 @@
+# Copyright (C) 2010 International Business Machines Corporation and Others. All Rights Reserved. 
+_coll_provider_plugin
diff --git a/multi/proj/provider/glue/gluren-bottom.h b/multi/proj/provider/glue/gluren-bottom.h
new file mode 100644
index 0000000..7abfb68
--- /dev/null
+++ b/multi/proj/provider/glue/gluren-bottom.h
@@ -0,0 +1,12 @@
+
+#endif
+
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
diff --git a/multi/proj/provider/glue/gluren-top.h b/multi/proj/provider/glue/gluren-top.h
new file mode 100644
index 0000000..6128bf1
--- /dev/null
+++ b/multi/proj/provider/glue/gluren-top.h
@@ -0,0 +1,12 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#ifndef _GLUREN_H
+#define _GLUREN_H
+
diff --git a/multi/proj/provider/glue/include/icuglue/coll_be.h b/multi/proj/provider/glue/include/icuglue/coll_be.h
new file mode 100644
index 0000000..08cc7d3
--- /dev/null
+++ b/multi/proj/provider/glue/include/icuglue/coll_be.h
@@ -0,0 +1,29 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#ifndef _COLL_BE
+#define _COLL_BE
+
+#include <icuglue/icuglue.h>
+#include <unicode/ucoll.h> /* for definitions */
+
+#if defined(XP_CPLUSPLUS)
+extern "C" {
+#endif
+
+void * GLUE_SYM(ucol_open) (const char *locale);
+void * GLUE_SYM(ucol_close) (void *coll);
+void * GLUE_SYM(
+
+
+#if defined(XP_CPLUSPLUS) 
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/multi/proj/provider/glue/include/icuglue/coll_fe.h b/multi/proj/provider/glue/include/icuglue/coll_fe.h
new file mode 100644
index 0000000..dbf2f85
--- /dev/null
+++ b/multi/proj/provider/glue/include/icuglue/coll_fe.h
@@ -0,0 +1,24 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#ifndef _COLL_FE
+#define _COLL_FE
+
+#include <icuglue/icuglue.h>
+#include <unicode/coll.h>
+
+#if defined(XP_CPLUSPLUS)
+
+class GLUE_SYM( GlueFECollator ) : public Collator {
+
+};
+
+#endif /* XP_CPLUSPLUS */
+
+#endif
\ No newline at end of file
diff --git a/multi/proj/provider/glue/include/icuglue/fe_verlist.h b/multi/proj/provider/glue/include/icuglue/fe_verlist.h
new file mode 100644
index 0000000..92273c3
--- /dev/null
+++ b/multi/proj/provider/glue/include/icuglue/fe_verlist.h
@@ -0,0 +1,26 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+/**
+ * Purpose: create local or static fe_verlist such as:
+ * 
+ *   const char *fe_verlist[] = { "4_2", "4_2_3", ..., NULL }; 
+ */
+
+#if defined(GLUE_VER)
+#undef GLUE_VER
+#endif
+
+const char *fe_verlist[] = { 
+#define GLUE_VER(x)  #x  ,
+#include "icuglue/glver.h"
+#undef GLUE_VER
+    NULL
+};
+
diff --git a/multi/proj/provider/glue/include/icuglue/icuglue.h b/multi/proj/provider/glue/include/icuglue/icuglue.h
new file mode 100644
index 0000000..8d916c5
--- /dev/null
+++ b/multi/proj/provider/glue/include/icuglue/icuglue.h
@@ -0,0 +1,18 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2009-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#ifndef _ICUGLUE_H
+#define _ICUGLUE_H
+
+/* Get utypes.h from whatever ICU we are under */
+#include <unicode/utypes.h>
+
+#define GLUE_SYM_V(x, v) glue ## x ## v
+
+#endif
diff --git a/multi/proj/provider/icu-config.sed b/multi/proj/provider/icu-config.sed
new file mode 100644
index 0000000..349fe96
--- /dev/null
+++ b/multi/proj/provider/icu-config.sed
@@ -0,0 +1,4 @@
+# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
+# munge
+s%^sanity$%# sanity disabled.%
+
diff --git a/multi/proj/provider/readme.txt b/multi/proj/provider/readme.txt
new file mode 100644
index 0000000..fa4b33b
--- /dev/null
+++ b/multi/proj/provider/readme.txt
@@ -0,0 +1,66 @@
+#!/bin/cat
+# Copyright (c) 2009-2010 IBM Corp. and Others. All Rights Reserved
+
+# ICU Provider Feature. - $Id$
+
+BUILDING:
+
+1a. Download the ICU source (.tgz) you wish to TARGET (i.e. link your application against).  This must be in the 4.4. series. 
+
+    4.4, 4.4.1, and 4.4.2 have been tested.  The latest available is recommended (4.4.2 as of this writing).
+
+1b. Download one or more ICUs (.tgz) you wish to have AVAILABLE (via the provider interface).  As of this writing, 4.2.0.1, 3.8.1, 3.6, 3.4.1, and 3.2.1 have been tested.
+
+   (Known issue: As of this writing, ICU 4.4+,4.5+ etc may NOT be an AVAILABLE locale (it may be a TARGET). )
+
+
+   Note that the MAJOR+MINOR version numbers must not conflict between the TARGET  and AVAILABLE ICUs. Only one ICU of each major+minor is allowed. 
+   So, only one 4.4.X, one 3.8.X, etc.  This is due to ICU binary compatibility rules.
+
+
+1c. Copy the ICUs (named as they were downloaded) into the ../../packages/ directory relative to this readme.
+
+
+2a. Copy the file "Makefile-local.sample" into a new file "Makefile.local".
+
+2b. Edit the Makefile.local to modify the PROVIDER_TARGET and PROVIDER_AVAILABLE settings.
+
+
+3. Check the makefile settings by running 'make info', you should see output similar to the following:
+
+   ICU Provider Build
+   Targetting Provider against ICU 4.4.2 (4_4_2, major 44)
+   Available plugins: 3.8.1 4.2.0.1  (3_8_1 4_2_0_1)
+   Available keywords:
+      ...@provider=icu38
+      ...@provider=icu42
+   Plugin library will be libicuprov.44.so
+
+   Available ICU tarballs: icu4c-3_8_1-src.tgz icu4c-4_2_0_1-src.tgz icu4c-4_4_2-src.tgz 
+   Available ICU versions: 3.8.1 4.2.0.1 4.4.2 
+
+
+ The last two lines show which ICU .tgz files are available. If a version is not listed, make sure the filename is as above.
+
+4. Now, you are ready to build and test:
+
+     make check
+
+   This will take quite a while as it has to build N copies of ICU.
+
+   When done, it should show a list of collation keys, and indicate that there were differences between ICU 3.8, 4.4, 4.2.   You may need to modify coldiff.cpp if you are using a different set of ICU versions.
+
+5. You can test in an 'installed' ICU (not the system install) with this command:
+
+      make install-check
+
+DEPLOYING:
+
+6.  To install the plugin in your own ICU, copy  out/icuplugins44.txt into your lib/icu,  and out/lib/libicuprov.44.so into your lib/ directories where ICU is installed. 
+
+ Note that running 'icuinfo' will tell you where the plugin file is expected to be located, and 'icuinfo -L' will debug any load issues.
+
+USING:
+
+Collators opened with an id such as that shown in 'make info', such as  'en_US@provider=icu38' will load, for example, an ICU 3.8 collator.
+
diff --git a/multi/readme.txt b/multi/readme.txt
new file mode 100644
index 0000000..6ccb76d
--- /dev/null
+++ b/multi/readme.txt
@@ -0,0 +1,56 @@
+#!/bin/cat
+# Copyright (c) 2009-2010 IBM Corp. and Others. All Rights Reserved
+#
+
+
+NOTE:
+NOTE: For information about the 'Provider' feature, see proj/provider/readme.txt
+NOTE:
+
+
+
+ This directory contains pieces of the 'MultiIcu' feature, which contains
+scripts for building multiple versions of ICU at the same time, and running
+various pieces of code against it.
+
+ Note, if you copy one of these projects outside the multi/ directory,
+you must ensure that the 'MULTIICU_ROOT' variable in build scripts points
+to the top level directory here, 'multi/'.
+
+ multi/              ( You are Here )
+ multi/packages/     .tgz and .jar files for C and J respectively
+                        (see the readme in that directory)
+ multi/c/            Scripts for building against ICU4C
+ multi/c/patch/         Patches for building old ICU versions
+ 
+ multi/common/       Common makefiles
+
+ multi/j/            Scripts for building against ICU4J
+
+ multi/tmp/          Temporary directory, contains intermediate builds
+ multi/tmp/src/         Unpacked and patched source
+ multi/tmp/build/       Built ICUs
+ multi/tmp/inst/        Installed ICUs
+
+ multi/proj/         Contains various projects which make use of multi-icu.
+                       (See individual readmes under each project.)
+ multi/proj/chello/  C "hello world" against multiple ICUs
+ multi/proj/jhello/  J "hello world" against multiple ICUs
+
+--
+HOW TO USE
+
+1. Copy some ICU source files into multi/packages/
+
+2. in "multi/c"  run "make iicus" - this will take a while.
+
+3.To verify the ICU build, in "multi/proj/chello",  run "make check".
+
+   You should see output like this:
+
+       out/3_8_1.txt:  ICU 3.8.1
+       out/4_2_0_1.txt:  ICU 4.2
+       out/4_4_1.txt:  ICU 4.4.1
+
+4. The 'Provider' project is more complex. To see its information, see
+the readme in that directory. 
diff --git a/release/c/allLocaleTest.sh b/release/c/allLocaleTest.sh
new file mode 100755
index 0000000..e3a074f
--- /dev/null
+++ b/release/c/allLocaleTest.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# Copyright (c) 2006-2008 IBM All Rights Reserved
+#
+echo "Testing $1 in all locales"
+outfile=$1-locale.txt
+echo "" > $outfile
+for loc in `locale -a`; do
+echo LC_ALL=$loc >> $outfile
+LC_ALL=$loc make check $2 >> $outfile 2>&1
+done
+
+echo "Done testing $1 in all locales"
+
diff --git a/release/c/allTimezoneTest.sh b/release/c/allTimezoneTest.sh
new file mode 100755
index 0000000..923148e
--- /dev/null
+++ b/release/c/allTimezoneTest.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# Copyright (c) 2006-2008 IBM All Rights Reserved
+#
+echo "Testing $1 in all timezones"
+outfile=$1-timezone.txt
+echo "" > $outfile
+for timezone in `locate /usr/share/zoneinfo/|fgrep -v /right/|fgrep -v /posix/`; do
+timezone=${timezone#/usr/share/zoneinfo/}
+echo TZ=$timezone >> $outfile
+TZ=$timezone make check $2 >> $outfile 2>&1
+done
+
+echo "Done testing $1 in all timezones"
+
diff --git a/release/c/environmentTest.sh b/release/c/environmentTest.sh
new file mode 100755
index 0000000..a54206c
--- /dev/null
+++ b/release/c/environmentTest.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (c) 2006-2008 IBM All Rights Reserved
+#
+# This test script enumerates all locales and all timezones installed on a
+# machine (usually Linux), and runs the existing ICU4C tests to make sure that
+# the tests pass. Not everyone is using and testing ICU4C in the en_US locale
+# with the Pacific timezone.
+top_icu_dir=../../../icu
+release_tools_dir=../../../../tools/release/c
+cd $top_icu_dir/source/test/intltest
+$release_tools_dir/allLocaleTest.sh intltest &
+$release_tools_dir/allTimezoneTest.sh intltest &
+cd ../iotest
+$release_tools_dir/allLocaleTest.sh iotest IOTEST_OPTS=iotest-c-loc.txt &
+$release_tools_dir/allTimezoneTest.sh iotest IOTEST_OPTS=iotest-c-tz.txt &
+cd ../cintltst
+$release_tools_dir/allLocaleTest.sh cintltst &
+$release_tools_dir/allTimezoneTest.sh cintltst &
+
+echo "All tests have been spawned."
+echo "Please wait while the tests run. This may take a while."
diff --git a/release/c/os-mapping/Makefile b/release/c/os-mapping/Makefile
new file mode 100644
index 0000000..c622387
--- /dev/null
+++ b/release/c/os-mapping/Makefile
@@ -0,0 +1,70 @@
+#*****************************************************************************
+#
+#   Copyright (C) 2006-2008, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+#*****************************************************************************
+#
+#  FILE NAME : Makefile
+#
+#   Date        Name        Description
+#   03/02/2006  grhoten     Creation.
+#*****************************************************************************
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local install-library install-headers dist	\
+dist-local check check-local
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+ALL_TARGETS = displayLocaleConv testTimezone
+#ICU_BASE = /home/build/Build_ICU_HP11iACC
+#ICU_BASE = /home/build/Build_ICU_Solaris9CC
+ICU_BASE = /home/build/Build_ICU_LinuxRHEL4.2
+#ICU_BASE = /home/build/Build_ICU_MacOSX
+#ICU_BASE = /home/build/Build_ICU_AIX5.2VA6
+
+all-local: $(ALL_TARGETS)
+
+displayLocaleConv: displayLocaleConv.c
+	#aCC +DD64 -I$(ICU_BASE)/icu/source/common/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#CC -xtarget=ultra -xarch=v9 -I$(ICU_BASE)/icu/source/common/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	gcc -I $(ICU_BASE)/icu/source/common/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#gcc -I $(ICU_BASE)/icu/source/common/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#xlc -q64 -I $(ICU_BASE)/icu/source/common/ -L$(ICU_BASE)/icu/source/lib/ -licuuc35 -licudata35 -o $@ $<
+
+testTimezone: testTimezone.c
+	#aCC +DD64 -I$(ICU_BASE)/icu/source/common/ -I$(ICU_BASE)/icu/source/i18n/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#CC -xtarget=ultra -xarch=v9 -I$(ICU_BASE)/icu/source/common/ -I$(ICU_BASE)/icu/source/i18n/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	gcc -I $(ICU_BASE)/icu/source/common/ -I$(ICU_BASE)/icu/source/i18n/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#gcc -I $(ICU_BASE)/icu/source/common/ -I$(ICU_BASE)/icu/source/i18n/ -L$(ICU_BASE)/icu/source/lib/ -licuuc -licudata -o $@ $<
+	#xlc -q64 -I $(ICU_BASE)/icu/source/common/ -I$(ICU_BASE)/icu/source/i18n/ -L$(ICU_BASE)/icu/source/lib/ -licuuc35 -licudata35 -o $@ $<
+
+
+install-local: install-headers install-library
+
+install-library: all-local
+
+install-headers:
+
+dist-local:
+
+clean-local:
+#	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	rm $(OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA)
+
+distclean-local: clean-local
+
+check-local:
+
+
diff --git a/release/c/os-mapping/displayLocaleConv.c b/release/c/os-mapping/displayLocaleConv.c
new file mode 100644
index 0000000..4380526
--- /dev/null
+++ b/release/c/os-mapping/displayLocaleConv.c
@@ -0,0 +1,35 @@
+/*
+******************************************************************************
+*
+*   Copyright (C) 2006-2008, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+******************************************************************************
+*
+*  FILE NAME : testTimezone.c
+*
+*   Date        Name        Description
+*   03/02/2006  grhoten     Creation.
+******************************************************************************
+*/
+#include "unicode/putil.h"
+#include "unicode/ucnv.h"
+#include "unicode/uloc.h"
+#include "unicode/ures.h"
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, const char* const argv[]) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    ures_close(ures_open(NULL, NULL, &status));
+    if (status != U_ZERO_ERROR) {
+        printf("uloc_getDefault = %s\n", uloc_getDefault());
+        printf("Locale available in ICU = %s\n", status == U_ZERO_ERROR ? "TRUE" : "FALSE");
+    }
+    if (strcmp(ucnv_getDefaultName(), "US-ASCII") == 0) {
+        printf("uprv_getDefaultCodepage = %s\n", uprv_getDefaultCodepage());
+        printf("ucnv_getDefaultName = %s\n", ucnv_getDefaultName());
+    }
+    return 0;
+}
diff --git a/release/c/os-mapping/readme.txt b/release/c/os-mapping/readme.txt
new file mode 100644
index 0000000..9dbb638
--- /dev/null
+++ b/release/c/os-mapping/readme.txt
@@ -0,0 +1,12 @@
+#
+#   Copyright (C) 2006-2008, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+
+These tests allow you to see how timezones, locales, charsets and other similar stuff are mapped from the OS values to ICU specific values.
+
+Some tweaking may be required to get these tools to work.
+
+If the charset maps to US-ASCII, it may be an indication that the alias or mapping table do not exist in ICU.
+If the locale doesn't exist, the test will state that the locale is not available.
+If the timezone doesn't match, it will be listed as a difference.
\ No newline at end of file
diff --git a/release/c/os-mapping/testLocales.sh b/release/c/os-mapping/testLocales.sh
new file mode 100755
index 0000000..a15e098
--- /dev/null
+++ b/release/c/os-mapping/testLocales.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#*****************************************************************************
+#
+#   Copyright (C) 2006-2008, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+#*****************************************************************************
+for loc in `locale -a`; do echo ; echo LC_ALL=$loc ; LC_ALL=$loc ./displayLocaleConv ; done
diff --git a/release/c/os-mapping/testTimezone.c b/release/c/os-mapping/testTimezone.c
new file mode 100644
index 0000000..e767ca6
--- /dev/null
+++ b/release/c/os-mapping/testTimezone.c
@@ -0,0 +1,35 @@
+/*
+******************************************************************************
+*
+*   Copyright (C) 2006-2008, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+******************************************************************************
+*
+*  FILE NAME : testTimezone.c
+*
+*   Date        Name        Description
+*   03/02/2006  grhoten/mow Creation.
+******************************************************************************
+*/
+
+#include "unicode/putil.h"
+#include "unicode/udat.h"
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+int main(int argc, const char* const argv[]) {
+    UErrorCode status = U_ZERO_ERROR;
+    char sysTimeStr[256];
+    struct tm summerTimeTM;
+    struct tm winterTimeTM;
+
+    memset(sysTimeStr, 0, sizeof(sysTimeStr));
+    memset(&summerTimeTM, 0, sizeof(summerTimeTM));
+    memset(&winterTimeTM, 0, sizeof(winterTimeTM));
+
+    strptime("2006-06-01 12:00", "%Y-%m-%d %H:%M", &summerTimeTM);
+    strftime(sysTimeStr, sizeof(sysTimeStr)-1, "%Y-%m-%d %H:%M", &summerTimeTM);
+    puts(sysTimeStr);
+}
diff --git a/release/c/os-mapping/testTimezones.sh b/release/c/os-mapping/testTimezones.sh
new file mode 100755
index 0000000..0495b51
--- /dev/null
+++ b/release/c/os-mapping/testTimezones.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+#*****************************************************************************
+#
+#   Copyright (C) 2006-2008, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+#*****************************************************************************
+timezones=`locate zoneinfo | fgrep -v evolution-data-server`
+for tzone in $timezones
+do 
+    if [ -f $tzone ]; then
+        tzname=${tzone#/usr/share/zoneinfo/}
+        ICUTime=`LD_LIBRARY_PATH=../dev-icu/icu/source/lib/ TZ=$tzname ./checkTimezone`
+        systemHour=`TZ=$tzname date +%I`
+        # OS X does not allow %-I so this ugly mess needs to occur
+        if [ "${systemHour:0:1}" == "0" ]; then
+            systemHour=${systemHour:1:1}
+        fi
+        systemTimeShort=`TZ=$tzname date +%b\ %d,\ %Y`
+        systemTimeShort="${systemTimeShort} ${systemHour}"
+        systemTimeAMPM=`TZ=$tzname date +%p`
+        index1=`expr "$systemTimeShort" : '.*'`
+        index2=`expr "$ICUTime" : '.*'`-2
+        ICUTimeShort=${ICUTime:0:${index1}}
+        ICUAMPM=${ICUTime:${index2}:2}
+        systemTime=`TZ=$tzname date +%b\ %d,\ %Y\ %r`
+        if [ "$systemTimeShort" == "$ICUTimeShort" ] && [ "$systemTimeAMPM" == "$ICUAMPM" ]; then
+            if [ "$opt1" != "-bad" ]; then
+                echo TZ=$tzname
+                echo System: $systemTime
+                echo ICU: $ICUTime
+            fi
+        else 
+            if [ "$opt1" == "-all" ]; then
+                echo --TZ=$tzname
+                echo --System: $systemTime
+                echo --ICU: $ICUTime
+            else
+                echo TZ=$tzname
+                echo System: $systemTime
+                echo ICU: $ICUTime
+            fi
+        fi
+    fi
+done
diff --git a/release/c/uconfigtest.sh b/release/c/uconfigtest.sh
new file mode 100755
index 0000000..ad7cbef
--- /dev/null
+++ b/release/c/uconfigtest.sh
@@ -0,0 +1,286 @@
+#!/bin/sh
+# Exhaust(ive, ing)  (Mean, Multi)  (Test, Trouble)
+# Copyright (c) 2002-2010 IBM All Rights Reserved
+#
+
+# Builds ICU a whole lotta times and with different options
+# Set the options below and execute this script with the shell.
+
+# This script is checked into tools/trunk/release/c. It assumes that the
+# icu directory is at the same level as the tools  directory. If this
+# is not the case, use the uconfigtest.local file to set the
+# SRC_DIR variable to point at the ICU source directory. 
+# Or, alternatively, you can make a symlink tools/icu -> your_icu_dir
+# You can also use the uconfigtest.local file to override the BUILD_DIR
+# and ICUPLATFORM variables.
+
+
+#------------------- Find full path names  -----------------------
+
+# check for uconfigtest.local
+if [ -f ./uconfigtest.local ]
+then
+    . ./uconfigtest.local
+fi
+
+# location of this script
+S=$(pwd)
+
+# Build root - tools/release/c/uconfigtest
+BUILD_DIR=${BUILD_DIR:-${S}/uconfigtest}
+
+# the runConfigureICU platform name
+ICUPLATFORM=${ICUPLATFORM:-Linux}
+
+# Global Config options to use
+#export COPTS=" --with-data-packaging=archive"
+export COPTS=
+
+# Global testing options to use
+export INTLTESTOPTS=-w 
+export CINTLTEST_OPTS=-w
+# --- Probably will not need to modify the following variables ---
+
+# ICU directory is $S/../../../icu
+ICU=$(dirname $(dirname $(dirname ${S})))/icu
+
+# Source directory
+SRC_DIR=${SRC_DIR:-${ICU}/source}
+
+# ------------ End of config variables
+
+# Prepare uconfig.h
+UCONFIG_H=$SRC_DIR/common/unicode/uconfig.h
+if grep -q myconfig.h  $UCONFIG_H ;
+then
+    echo "# $UCONFIG_H already contains our patch, no change"
+else
+    mv $UCONFIG_H ${UCONFIG_H}.orig
+    cat > $UCONFIG_H  <<EOF
+#if defined(IN_UCONFIGTEST)
+#include "myconfig.h"
+#endif
+/* for uconfigtest.sh - you may REMOVE above this line */
+/* ----------------------------------------------------------- */
+EOF
+cat ${UCONFIG_H}.orig >> ${UCONFIG_H}
+    echo "# $UCONFIG_H updated"
+fi
+
+
+# Start,  set a default name to start with in case something goes wrong
+
+export NAME=foo
+mkdir -p ${BUILD_DIR} ${BUILD_DIR}/times 2>/dev/null
+
+# Banner function - print a separator to split the output
+ban()
+{
+    echo
+    echo
+    echo "#- -----------------------$NAME------------- -#"
+    echo
+    echo "CPPFLAGS = $CPPFLAGS"
+    echo "UCONFIGS = $UCONFIGS"
+    echo
+    echo " build to ${BUILD_DIR}/${NAME} and install in ${BUILD_DIR}/I${NAME} "
+    echo
+}
+
+# Clean up the old tree before building again
+clean()
+{
+    echo cleaning ${BUILD_DIR}/${NAME} and ${BUILD_DIR}/I${NAME}
+    rm -rf ${BUILD_DIR}/I${NAME} ${BUILD_DIR}/${NAME}
+    mkdir -p ${BUILD_DIR}/${NAME}
+}
+
+# Run configure with the appropriate options (out of source build)
+config()
+{
+    mkdir -p ${BUILD_DIR}/${NAME} 2>/dev/null
+    cd ${BUILD_DIR}/${NAME}
+    mkdir emtinc 2>/dev/null
+
+    # myconfig.h
+    cat > emtinc/myconfig.h <<EOF
+/* NAME=${NAME}            */
+/* UCONFIGS=${UCONFIGS}    */
+/* CPPFLAGS=${CPPFLAGS}    */
+#ifndef _MYCONFIG_H
+#define _MYCONFIG_H
+
+EOF
+    for what in `echo $UCONFIGS`;
+    do
+        echo "#define UCONFIG_${what} 1" >> emtinc/myconfig.h
+    done
+    cat >> emtinc/myconfig.h <<EOF
+#endif
+EOF
+    CPPFLAGS="${CPPFLAGS} -DIN_UCONFIGTEST -I${BUILD_DIR}/${NAME}/emtinc"
+    echo "CPPFLAGS=\"$CPPFLAGS\" Configure $COPTS --srcdir=$SRC_DIR"
+    $SRC_DIR/runConfigureICU ${ICUPLATFORM} $COPTS --prefix=${BUILD_DIR}/I${NAME} --srcdir=$SRC_DIR 2>&1 > ${BUILD_DIR}/${NAME}/config.out
+}
+
+# Do an actual build
+bld()
+{
+##*##  Stream filter to put 'NAME: ' in front of
+##*##  every line:
+##*##      . . .   2>&1 | tee -a ./bld.log | sed -e "s/^/${NAME}: /"
+    cd ${BUILD_DIR}/${NAME}
+    /usr/bin/time -o ${BUILD_DIR}/times/${NAME}.all     make -k -j2 all                      
+    /usr/bin/time -o ${BUILD_DIR}/times/${NAME}.install make -k install                  
+    /usr/bin/time -o ${BUILD_DIR}/times/${NAME}.il      make -k install-local            
+    /usr/bin/time -o ${BUILD_DIR}/times/${NAME}.chk     make -k -j2 check INTLTEST_OPTS=-w CINTLTST_OPTS=-w
+    PATH=${BUILD_DIR}/I${NAME}/bin:$PATH make -C ${BUILD_DIR}/${NAME}/test/hdrtst/  check    
+}
+
+# Do a complete cycle for a run
+doit()
+{
+ban ; clean ; config ; bld
+}
+
+# Set up the variables for convenience
+NO_COL="NO_COLLATION"
+NO_BRK="NO_BREAK_ITERATION"
+NO_FMT="NO_FORMATTING"
+NO_UCM="NO_LEGACY_CONVERSION"
+# Since NO_CONVERSION is only meant to allow the common and i18n
+# libraries to be built, we don't test this configuration.
+#NO_CNV="NO_CONVERSION"
+NO_FIO="NO_FILE_IO"
+NO_XLT="NO_TRANSLITERATION"
+NO_RGX="NO_REGULAR_EXPRESSIONS"
+JS_COL="ONLY_COLLATION"
+NO_NRM="NO_NORMALIZATION"
+NO_IDN="NO_IDNA"
+NO_SVC="NO_SERVICE"
+NO_MST="$NO_COL $NO_BRK $NO_FMT $NO_UCM $NO_FIO $NO_RGX $NO_XLT $NO_NRM $NO_IDN $NO_SVC"
+NO_ALL="$NO_MST $NO_SVC"
+
+# Now, come the actual test runs
+# Each one sets a NAME, and CPPFLAGS or other flags, and calls doit
+
+######################
+# NO_MST
+export NAME=NO_MST
+export UCONFIGS="$NO_MST"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_RGX
+export NAME=NO_RGX
+export UCONFIGS="$NO_RGX"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_COL
+export NAME=NO_COL
+export UCONFIGS="$NO_COL"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_BRK
+export NAME=NO_BRK
+export UCONFIGS="$NO_BRK"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_FMT
+export NAME=NO_FMT
+export UCONFIGS="$NO_FMT"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_UCM
+export NAME=NO_UCM
+export UCONFIGS="$NO_UCM"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_FIO
+export NAME=NO_FIO
+export UCONFIGS="$NO_FIO"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_XLT
+export NAME=NO_XLT
+export UCONFIGS="$NO_XLT"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_IDN
+export NAME=NO_IDN
+export UCONFIGS="$NO_IDN"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_NRM
+export NAME=NO_NRM
+export UCONFIGS="$NO_NRM"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_SVC
+export NAME=NO_SVC
+export UCONFIGS="$NO_SVC"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# JS_COL
+export NAME=JS_COL
+export UCONFIGS="$JS_COL"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# NO_ALL
+export NAME=NO_ALL
+export UCONFIGS="$NO_ALL"
+export CPPFLAGS=""
+doit
+######################
+
+######################
+# DEFAULT
+export NAME=DEFAULT
+export UCONFIGS=""
+export CPPFLAGS=""
+doit
+######################
+
+
+NAME=done
+ban
+echo "All builds finished! Times are in ${BUILD_DIR}/times"
+echo "There were errors if the following grep finds anything."
+echo "grep status ${BUILD_DIR}/times/*"
+grep status ${BUILD_DIR}/times/*
+
diff --git a/release/java/.classpath b/release/java/.classpath
new file mode 100644
index 0000000..47558c4
--- /dev/null
+++ b/release/java/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+# Copyright (C) 2009 IBM and Others. All Rights Reserved
+-->
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="classes"/>
+</classpath>
diff --git a/release/java/.project b/release/java/.project
new file mode 100644
index 0000000..747fdce
--- /dev/null
+++ b/release/java/.project
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+# Copyright (C) 2009 IBM and Others. All Rights Reserved
+-->
+<projectDescription>
+	<name>toolsj</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/release/java/Makefile b/release/java/Makefile
new file mode 100644
index 0000000..b6f9a8d
--- /dev/null
+++ b/release/java/Makefile
@@ -0,0 +1,73 @@
+# Copyright (C) 2009-2010 IBM and Others. All Rights Reserved
+
+#
+#
+#
+#Usage:
+# make OLD_ICU=/xsrl/E/401m40  NEW_ICU=/xsrl/E/icu4ct42
+#
+# you can put the OLD_ICU=xx and NEW_ICU=yy in separate lines in Makefile.local 
+#
+
+ANT=ant
+ANT_TARGET=apireport
+DOXYGEN=doxygen
+
+-include Makefile.local
+
+TARGET=APIChangeReport.html
+
+NOTSET=
+
+ifeq ($(OLD_ICU),)
+NOTSET:="$(NOTSET) OLD_ICU"
+endif
+
+ifeq ($(NEW_ICU),)
+NOTSET:="$(NOTSET) NEW_ICU"
+endif
+
+all: $(TARGET) $(LOCAL_TARGET)
+
+
+ifneq ($(NOTSET),)
+check-vars:
+	@echo "Error: please set $(NOTSET) in Makefile.local or on the command line."
+	false
+else
+check-vars:
+endif
+
+.PHONY: check-vars classes clean-docs
+
+.PRECIOUS: $(TARGET) $(OLD_ICU)/$(DOXYFILE) $(NEW_ICU)/$(DOXYFILE)
+
+#######
+DOXYFILE=source/Doxyfile
+XML=source/doc/xml
+UVERSIONH=$(XML)/uversion_8h.xml
+
+clean-docs: | check-vars
+	-rm -rf "$(OLD_ICU)/$(XML)" "$(NEW_ICU)/$(XML)"
+
+$(TARGET): check-vars $(OLD_ICU)/$(XML) $(NEW_ICU)/$(XML) 
+	echo "Remember to run the non-ascii file detector if you get errors."
+	$(ANT) -Dolddir="$(OLD_ICU)/$(XML)" -Dnewdir="$(NEW_ICU)/$(XML)" $(ANT_TARGET)
+
+# check-vars $(OLD_ICU)/$(XML) $(NEW_ICU)/$(XML) 
+APIChangeReport.xml:
+	echo "Remember to run the non-ascii file detector if you get errors."
+	$(ANT) -Dolddir="$(OLD_ICU)/$(XML)" -Dnewdir="$(NEW_ICU)/$(XML)" $(ANT_TARGET)_xml
+
+%/source/doc/xml:	%/source/Doxyfile
+	# don't care what GENERATE_XML is set to previously - set it to yes.
+	@echo running doxyugen .. 
+	( cd "$*/source/" && ( (cat ./Doxyfile | grep -v '^GENERATE_') ;  echo 'GENERATE_XML=YES')  | $(DOXYGEN) -  )
+	@echo doxygen done in $*
+
+%/source/Doxyfile:	%/source/Makefile %/source/Doxyfile.in
+	@echo generating $@
+	@$(MAKE) -C  "$*/source" Doxyfile || ( echo "could not make Doxyfile in $*  - was doxygen available?" ; false )
+
+%/source/Makefile: %/source/Makefile.in
+	@echo "$@ does not seem to exist - was configure run?" ; false
diff --git a/release/java/build.xml b/release/java/build.xml
new file mode 100644
index 0000000..6ba059a
--- /dev/null
+++ b/release/java/build.xml
@@ -0,0 +1,120 @@
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2006-2010, International Business Machines Corporation and    *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is the ant build file for ICU tools. 
+*/
+-->
+<project name="release-tools" default="tools" basedir=".">
+    <target name="init">
+        <tstamp/>
+        <property name="src.dir" value="src"/>
+        <property name="lib.dir" value="lib"/>
+        <property name="build.dir" value="classes"/>
+        <property file="api-report.properties" />
+
+        <mkdir dir="${build.dir}"/>
+        <echo message="java home: ${java.home}"/>
+        <echo message="java version: ${java.version}"/>
+        <echo message="java vendor: ${java.vm.vendor}"/>
+        <echo message="ant java version: ${ant.java.version}"/>
+        <echo message="${ant.version}"/>
+        <echo message="${basedir}"/>
+    </target>
+
+    <target name="tools"  depends="init" description="compile release tools">
+        <javac includes="**/*.java"
+            srcdir="${src.dir}"
+            destdir="${build.dir}"
+            source="1.5"
+            debug="on" deprecation="off"
+            encoding="ascii"/>
+    </target>             
+
+    <target name="clean" depends="init" description="remove all build targets">
+        <delete dir="${build.dir}"/>
+    </target>
+
+    <target name="apireport" depends="tools">    
+        <java classname="com.ibm.icu.dev.tools.docs.StableAPI" fork="yes" failonerror="true">
+           
+<!--
+            <arg value = "-DELETEME-newver"/>
+            <arg value = "4.6"/>
+-->
+            
+            <arg value = "--olddir"/> 
+            <arg value = "${olddir}"/>
+            
+<!--
+	!! Only need these if you must override. Remove the DELETEME
+            <arg value = "-DELETEME-newver"/>
+            <arg value = "${newver}"/>
+-->
+            
+            <arg value = "--newdir"/>
+            <arg value = "${newdir}"/>
+            
+            <arg value = "--resultfile"/>
+            <arg value = "${basedir}/APIChangeReport.html"/>
+
+            <classpath>
+                <pathelement location="${build.dir}"/>
+                <pathelement path="${java.class.path}/"/>
+                <pathelement location="${lib.dir}/xalan.jar"/>
+		<fileset dir="${lib.dir}"/>
+                <pathelement location="${lib.dir}/xercesImpl.jar"/>
+                <pathelement path="."/>
+            </classpath>
+        </java>
+    </target>
+    <target name="apireport_xml" depends="tools">    
+        <java classname="com.ibm.icu.dev.tools.docs.StableAPI" fork="yes" failonerror="true">
+
+<!--
+            <arg value = "-DELETEME-newver"/>
+            <arg value = "4.4.1"/>
+    
+-->
+
+<!--        
+            <arg value = "-DELETEME-newver"/>
+            <arg value = "4.6"/>
+-->            
+
+            <arg value = "--olddir"/> 
+            <arg value = "${olddir}"/>
+            
+<!--
+	!! Only need these if you must override. Remove the DELETEME
+            <arg value = "-DELETEME-newver"/>
+            <arg value = "${newver}"/>
+-->
+            
+            <arg value = "--newdir"/>
+            <arg value = "${newdir}"/>
+            
+            <arg value = "--cppxslt"/>
+            <arg value = "${basedir}/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc_xml.xslt"/>
+            
+            <arg value = "--cxslt"/>
+            <arg value = "${basedir}/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc_xml.xslt"/>
+            
+            <arg value = "--reportxslt"/>
+            <arg value = "${basedir}/src/com/ibm/icu/dev/tools/docs/genReport_xml.xslt"/>
+            
+            <arg value = "--resultfile"/>
+            <arg value = "${basedir}/APIChangeReport.xml"/>
+
+            <classpath>
+                <pathelement location="${build.dir}"/>
+                <pathelement path="${java.class.path}/"/>
+                <pathelement location="${lib.dir}/xalan.jar"/>
+                <pathelement location="${lib.dir}/xercesImpl.jar"/>
+                <pathelement path="."/>
+            </classpath>
+        </java>
+    </target>
+</project>
diff --git a/release/java/icu4c.css b/release/java/icu4c.css
new file mode 100644
index 0000000..dde8605
--- /dev/null
+++ b/release/java/icu4c.css
@@ -0,0 +1,447 @@
+/*
+ * Default CSS style sheet for the ICU4C Open Source readme
+ * Copyright (C) 2005-2010, International Business Machines
+ * Corporation and others.  All Rights Reserved.
+ */
+
+/* Global styles */
+
+body,p,li,ol,ul,th,td {
+	font-size: 10pt;
+	font-family: "Arial", "Helvetica", sans-serif;
+}
+
+body {
+	margin: 1em;
+}
+
+body.draft {
+	background-image: url(images/draftbg.png);
+}
+
+.mainbody {
+	padding: 1em;
+}
+
+/*
+ * Customize the headers to have less space around them than usual
+ */
+
+h1 {
+	margin-bottom: .5em;
+	margin-top: .5em;
+	padding-bottom: .5em;
+	padding-top: .5em;
+	font-weight: 700;
+	font-size: 20pt;
+	font-family: Georgia, "Times New Roman", Times, serif;
+	border-width: 2px;
+	border-style: solid;
+	text-align: center;
+	width: 100%;
+	font-size: 200%;
+	font-weight: bold;
+}
+
+h2 {
+	border-top: 2px solid #22d;
+	border-left: 2px solid #22d;
+	margin-bottom: 0.5em;
+	padding-left: 4px;
+	margin-top: 12pt;
+	font-weight: 700;
+	font-size: 2em;
+	font-family: Georgia, "Times New Roman", Times, serif;
+	background-color: #eee;
+	page-break-before: always;
+}
+
+h2 a {
+	text-decoration: none;
+	color: black;
+}
+
+h2 a:hover {
+	color: blue;
+	text-decoration: underline;
+}
+
+h3 {
+	border-top: 1px solid gray;
+	color: #1e1c46;
+	margin-bottom: 0pt;
+	margin-top: 12pt;
+	padding-left: 0;
+	margin-left: 1em;
+	margin-top: 0.2em;
+	padding-bottom: 0.4em;
+	font-size: 1.5em;
+	font-family: Georgia, "Times New Roman", Times, serif;
+}
+
+h3 a {
+	text-decoration: none;
+	color: black;
+}
+
+h3 a:hover {
+	color: blue;
+	text-decoration: underline;
+}
+
+h4 {
+	margin-left: 1.5em;
+	margin-bottom: 0pt;
+	margin-top: 12pt;
+	font-size: 1.0em;
+	font-weight: bolder;
+	font-family: Georgia, "Times New Roman", Times, serif;
+}
+
+h4 a {
+	text-decoration: none;
+	color: black;
+}
+
+h4 a:hover {
+	color: blue;
+	text-decoration: underline;
+}
+
+h5, h6 {
+	margin-left: 1.8em;
+	margin-bottom: 0pt;
+	margin-top: 12pt;
+	padding-left: 0.75em;
+	font-size: x-small;
+	font-family: Georgia, "Times New Roman", Times, serif;
+}
+
+p,pre,table,ul,ol,dl {
+	margin-left: 2em;
+}
+
+/*
+ * Navigation sidebar on the left hand of most pages
+ */
+
+td.sidebar1 {
+	background-color: #99CCFF;
+	font-weight: 700;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding-top: 1em;
+	padding-left: 0.2em;
+	white-space: nowrap;
+}
+
+td.sidebar2 {
+	background-color: #99CCFF;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	margin-left: 0px;
+	padding-top: 1px;
+	padding-bottom: 1px;
+	padding-left: 1px;
+	padding-right: 0.5em;
+	white-space: nowrap;
+	text-decoration: none;
+	display: block;
+}
+
+td.sidebar2:hover {
+	background-color: #EEEEFF;
+	padding-top: 1px;
+	padding-bottom: 1px;
+	padding-left: 1px;
+	padding-right: 0.5em;
+}
+
+a.sidebar2 {
+	text-decoration: none;
+	display: block;
+	width: 100%;
+}
+
+a.sidebar2:link {
+	color: #000099;
+	display: block;
+}
+
+a.sidebar2:hover {
+	background-color: #EEEEFF;
+	display: block;
+}
+
+.underlinehover:hover {
+	background-color: #EEEEFF;
+	text-decoration: underline;
+}
+
+/* This is the faded header at the top */
+
+td.fadedtop {
+	background-color: #006699;
+	background-image: url(http://www.icu-project.org/images/gr100.gif);
+}
+
+/* Related site on the left */
+
+p.relatedsite {
+	color: White;
+	font-weight: 700;
+	font-size: 10pt;
+	margin-top: 1em;
+	margin-bottom: 0;
+	padding-left: 0.2em;
+	white-space: nowrap;
+}
+
+/* Related site on the left */
+
+p.sidebar3 {
+	margin-top: 0.75em;
+	margin-bottom: 0;
+	padding-left: 0.8em;
+}
+
+a.sidebar3 {
+	font-size: 0.9em;
+	text-decoration: none;
+}
+
+a.sidebar3:link {
+	text-decoration: none;
+	color: White;
+}
+
+a.sidebar3:hover {
+	text-decoration: underline;
+}
+
+/* FAQ */
+
+li.faq_contents {
+	font-weight: 500;
+}
+
+p.faq_q {
+	font-weight: 700;
+	margin-bottom: 0px;
+}
+
+p.faq_a {
+	margin-top: 0px;
+}
+
+/* News items */
+
+table.newsItem {
+	padding-left: 1em;
+	padding-right: 1em;
+	border-width: medium;
+}
+
+th.newsItem {
+	background-color: #666666;
+	color: White;
+}
+
+td.newsItem {
+	background-color: #CCCCCC;
+}
+
+td.release-line,th.release-line {
+	padding-left: 0.5em;
+	padding-right: 0.5em;
+	white-space: nowrap;
+	border: 1px;
+}
+
+.note {
+	font-style: italic;
+	font-size: small;
+	margin-left: 1em;
+}
+
+samp {
+	margin-left: 1em;
+	margin-right: 2em;
+	border-style: groove;
+	padding: 1em;
+	display: block;
+	background-color: #EEEEEE
+}
+
+table.rtable caption {
+	margin-left: 2px;
+	margin-right: 2px;
+	padding: 3px;
+	font-weight: bold;
+	background-color: #dee2ff;
+	text-align: left;
+}
+
+table.rtable tr th {
+	background-color: #dee2ff;
+	text-align: left;
+}
+
+table.rtable tr td {
+	background-color: #c0c0fd;
+	padding: 3px;
+}
+
+table.rtable tr.broken td {
+	background-color: #fbb;
+	border: 1px dashed gray;
+	padding: 3px;
+	font-weight: bold;
+}
+
+table.rtable tr.rarely td {
+	background-color: #efe9c2;
+	padding: 3px;
+	font-style: italic;
+}
+
+/*  APIChangeReport specific things */
+
+.row0 {
+	background-color: white;
+}
+
+.row1 {
+	background-color: #dfd;
+}
+
+.verchange {
+	color: red;
+	font-weight: bold;
+	font-size: large;
+}
+
+.stabchange {
+	color: red;
+	font-size: large;
+}
+
+.bigwarn {
+	color: red;
+	background-color: white;
+	font-size: x-large;
+	margin: 0.5 em;
+}
+
+table.genTable {
+	border-collapse: collapse;
+	border: 1px solid black;
+}
+
+/* 'everything inc version */
+
+table.gentable td {
+	border: 1px solid gray;
+	padding: 0.25em;
+	font-size: small;
+}
+
+/* not version */
+
+table.genTable td.file,
+table.genTable td.proto {
+	border: none;
+	font-size: medium;
+}
+
+table.genTable td.file {
+	font-family: monospace;
+	font-weight: bold;
+}
+
+div.other .row0 {
+	background-color: white;
+}
+
+div.other .row1 {
+	background-color: #ddf;
+}
+
+table.docTable {
+	border-collapse: collapse;
+	border: 1px solid black;
+}
+
+/* 'everything inc version */
+
+table.docTable td,
+table.docTable th {
+	border: 1px solid gray;
+	padding: 0.25em;
+	font-size: small;
+}
+
+/* not version */
+
+table.docTable td.file,
+table.docTable td.proto {
+	border: none;
+	font-size: medium;
+}
+
+table.docTable td.file {
+	font-family: monospace;
+	font-weight: bold;
+}
+
+abbr {
+	border-bottom: 1px dashed #0B0;
+}
+
+h2.TOC {
+	page-break-before: auto;
+}
+
+body.readme {
+	
+}
+
+caption {
+	font-weight: bold;
+	text-align: left
+}
+
+div.indent {
+	margin-left: 2em
+}
+
+ul.TOC {
+	list-style-type: none;
+	padding-left: 1em;
+	font-size: larger;
+}
+
+ul.TOC li a {
+	font-weight: bold;
+}
+
+ul.TOC li ul li a {
+	font-weight: normal;
+	list-style-type: none;
+	font-size: small;
+}
+
+ul.TOC li ul {
+	margin-left: 0;
+	padding-left: 2em;
+	font-weight: normal;
+	list-style-type: none;
+}
+
+pre.samp,samp {
+	margin-left: 1em;
+	border-style: groove;
+	padding: 1em;
+	display: block;
+	background-color: #EEEEEE
+}
diff --git a/release/java/readme.txt b/release/java/readme.txt
new file mode 100644
index 0000000..68b9e49
--- /dev/null
+++ b/release/java/readme.txt
@@ -0,0 +1,26 @@
+# Copyright (C) 2009-2010 IBM and Others. All Rights Reserved
+
+API Change Report:
+
+A tool to generate a report of API status changes between two ICU4C releases.
+(ICU4J has a builtin change report generator)
+
+Requirements:
+  - Everything needed to build ICU4C from a command line (UNIX) environment
+  - Doxygen (for generating docs)
+  - Java JDK 1.5+
+  - Apache Ant
+  - Xalan/Xerces ( put the jars in the lib/ directory ) - the built in version to Java doesn't seem to work properly.
+
+To use the utility:
+    1. setup ICU
+            (put the two ICU releases on your machine ^_^  )
+            run 'configure' in both releases (or runConfigureICU)
+            Doxygen must be found during configure.
+	2. create a Makefile.local with just these two lines:
+			OLD_ICU=/xsrl/E/icu-1.0
+			NEW_ICU=/xsrl/E/icu-6.8
+	   ( where these are the paths to the parent of 'source', etc)     
+    3. Build the API docs
+            make
+	4. This will create an 'APIChangeReport.html' in this directory. Check it over, then check it in.
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/StableAPI.java b/release/java/src/com/ibm/icu/dev/tools/docs/StableAPI.java
new file mode 100644
index 0000000..86a92ce
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/StableAPI.java
@@ -0,0 +1,935 @@
+/*
+ **********************************************************************
+ * Copyright (c) 2006-2010, International Business Machines
+ * Corporation and others.  All Rights Reserved.
+ **********************************************************************
+ * Created on 2006-7-24 ?
+ * Moved from Java 1.4 to 1.5? API by srl 2009-01-16
+ */
+package com.ibm.icu.dev.tools.docs;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import com.sun.xml.internal.fastinfoset.stax.events.XMLConstants;
+
+
+/**
+ A utility to report the status change between two ICU releases
+
+To use the utility
+1. Generate the XML files
+    (put the two ICU releases on your machine ^_^ )
+    (generate 'Doxygen' file on Windows platform with Cygwin's help)
+    Edit the generated 'Doxygen' file under ICU4C source directory
+    a) GENERATE_XML           = YES
+    b) Sync the ALIASES definiation
+       (For example, copy the ALIASES defination from ICU 3.6
+       Doxygen file to ICU 3.4 Doxygen file.)
+    c) gerenate the XML files
+2. Build the tool
+    Download Apache Xerces Java Parser
+    Build this file with the library
+3. Edit the api-report-config.xml file & Change the file according your real configuration
+4. Run the tool to generate the report.
+
+ * @author Raymond Yang
+ */
+public class StableAPI {
+
+    private static final String DOC_FOLDER = "docFolder";
+	private static final String INDEX_XML = "index.xml";
+	private static final String ICU_SPACE_PREFIX = "ICU ";
+	private static final String INITIALIZER_XPATH = "initializer";
+	private static final String NAME_XPATH = "name";
+	private static final String UVERSIONA = "uvernum_8h.xml";
+	private static final String UVERSIONB = "uversion_8h.xml";
+    private static final String U_ICU_VERSION = "U_ICU_VERSION";
+    /* ICU 4.4+ */
+	private static final String ICU_VERSION_XPATHA = "/doxygen/compounddef[@id='uvernum_8h'][@kind='file']/sectiondef[@kind='define']";
+	/* ICU <4.4 */
+	private static final String ICU_VERSION_XPATHB = "/doxygen/compounddef[@id='uversion_8h'][@kind='file']/sectiondef[@kind='define']";
+    private static String ICU_VERSION_XPATH = ICU_VERSION_XPATHA;
+
+	private String leftVer;
+    private File leftDir = null;
+//    private String leftStatus;
+    
+    private String rightVer;
+    private File rightDir = null;
+//    private String rightStatus;
+
+    private InputStream dumpCppXsltStream = null; 
+	private InputStream dumpCXsltStream = null;
+	private InputStream reportXslStream = null;
+	private static final String CXSLT = "dumpAllCFunc.xslt";
+	private static final String CPPXSLT = "dumpAllCppFunc.xslt"; 
+	private static final String RPTXSLT = "genReport.xslt";
+
+    private File dumpCppXslt;
+    private File dumpCXslt;
+    private File reportXsl;
+    private File resultFile;
+    
+    private String milestoneOf = "";
+    
+    final private static String nul = "None"; 
+
+    public static void main(String[] args) throws TransformerException, ParserConfigurationException, SAXException, IOException, XPathExpressionException {
+        
+        StableAPI t = new StableAPI();
+        t.run(args); 
+    }
+    
+    private void run(String[] args) throws XPathExpressionException, TransformerException, ParserConfigurationException, SAXException, IOException {
+        this.parseArgs(args);
+        Set<JoinedFunction> full = new TreeSet<JoinedFunction>();
+
+        System.err.println("Reading C++...");
+        Set<JoinedFunction> setCpp = this.getFullList(dumpCppXsltStream, CPPXSLT);
+        full.addAll(setCpp);
+        System.out.println("read "+setCpp.size() +" C++.  Reading C:");
+        
+        Set<JoinedFunction> setC = this.getFullList(dumpCXsltStream, CXSLT);
+        full.addAll(setC);
+
+        System.out.println("read "+setC.size() +" C. Setting node:");
+        
+        Node fullList = this.setToNode(full);
+//        t.dumpNode(fullList,"");
+        
+        System.out.println("Node set. Reporting:");
+        
+        this.reportSelectedFun(fullList);
+        System.out.println("Done. Please check " + this.resultFile);
+    }
+
+
+    private void parseArgs(String[] args){
+        for (int i = 0; i < args.length; i++) {
+            String arg = args[i];
+            if (arg == null || arg.length() == 0) {
+                continue;
+            }
+            if (arg.equals("--help") ) {
+                printUsage();
+            } else if (arg.equals("--oldver") ) {
+                leftVer = args[++i];
+            } else if (arg.equals("--olddir") ) {
+                leftDir = new File(args[++i]);
+            } else if (arg.equals("--newver")) {
+                rightVer = args[++i];
+            } else if (arg.equals("--newdir")) {
+                rightDir = new File(args[++i]);
+            } else if (arg.equals("--cxslt") ) {
+                dumpCXslt = new File(args[++i]);
+            } else if (arg.equals("--cppxslt") ) {
+                dumpCppXslt = new File(args[++i]);
+            } else if (arg.equals("--reportxslt") ) {
+                reportXsl = new File(args[++i]);
+            } else if (arg.equals("--resultfile")) {
+                resultFile = new File(args[++i]);
+            } else {
+                System.out.println("Unknown option: "+arg);
+               printUsage();
+            } 
+        }
+
+        dumpCppXsltStream = loadStream(CPPXSLT, "--cppxslt", dumpCppXslt);
+        dumpCXsltStream= loadStream(CXSLT, "--cxslt", dumpCXslt);
+        reportXslStream= loadStream(RPTXSLT, "--reportxslt", reportXsl);
+
+        leftVer = trimICU(setVer(leftVer, "old", leftDir));
+        rightVer = trimICU(setVer(rightVer, "new", rightDir));
+    }
+
+
+    private InputStream loadStream(String name, String argName, File argFile) {
+    	InputStream stream = null;
+    	if(argFile != null) {
+    		try {
+	    		stream = new FileInputStream(argFile);
+	    	} catch (IOException ioe) {
+	    		throw new RuntimeException("Error: Could not load " + argName +" " + argFile.getPath() + " - " + ioe.toString(), ioe);
+	    	}
+    	} else {    	
+        	stream = StableAPI.class.getResourceAsStream(name);
+        	if(stream == null) {
+        		throw new InternalError("No resource found for " + StableAPI.class.getPackage().getName()+"/"+ name + " -   use " + argName);
+        	} else {
+        		System.out.println("Loaded resource " + name);
+        	}
+        }
+        return stream;
+	}
+
+    private static Set<String> warnSet = new TreeSet<String>();
+    
+    private static void warn(String what) {
+        if(!warnSet.contains(what)) {
+               System.out.println("Warning: "+what);
+               if(warnSet.isEmpty()) {
+                      System.out.println(" (These warnings are only printed one time each.)");
+               }
+               warnSet.add(what);
+        }
+    } 
+    
+    private static boolean didWarnSuperTrim = false;
+    
+    private static String trimICU(String ver) {
+        final String ICU_ = ICU_SPACE_PREFIX;
+        final String ICU = "ICU";
+        if(ver != null) { // trim everything before the 'ICU...'
+            ver = ver.trim();
+            int icuidx = ver.lastIndexOf(ICU_);
+            int icuidx1 = ver.lastIndexOf(ICU);
+            if(icuidx>=0) {
+                ver = ver.substring(icuidx+ICU_.length()).trim();
+            } else if(icuidx1>=0) {
+                warn("trimming: '" + ver + "'");
+                ver = ver.substring(icuidx1+ICU.length()).trim();
+            } else {
+                int n;
+                for(n=ver.length()-1;n>0 && ((ver.charAt(n)=='.') || Character.isDigit(ver.charAt(n))) ;n--)
+                    ;
+                warn("Trimming extraneous 'version' text: '" + ver + "'");
+                if(!didWarnSuperTrim) {
+                	didWarnSuperTrim = true;
+                	warn("Please ONLY use:  '@whatever ICU X.Y.Z'");
+                }
+                if(n>0) {
+                    ver = ver.substring(n+1).trim();
+                }
+            }
+        } 
+        return ver;
+    }
+    
+    private String setVer(String prevVer, String whichVer, File dir) {
+	    String UVERSION = UVERSIONA;
+    	if(dir==null) {
+    		System.out.println("--"+whichVer+"dir not set.");
+    		printUsage(); /* exits */
+    	} else if(!dir.exists()||!dir.isDirectory()) {
+    		System.out.println("--"+whichVer+"dir="+dir.getName()+" does not exist or is not a directory.");
+    		printUsage(); /* exits */
+    	}
+        String result = null;
+        // looking for: <name>U_ICU_VERSION</name> in uversion_8h.xml:        <initializer>&quot;3.8.1&quot;</initializer>
+        try {
+            File verFile = new File(dir, UVERSION);
+		    if(!verFile.exists()) {
+				UVERSION=UVERSIONB;
+				ICU_VERSION_XPATH=ICU_VERSION_XPATHB;
+				verFile = new File(dir, UVERSION);
+		    } else {
+				ICU_VERSION_XPATH=ICU_VERSION_XPATHA;
+		    }
+            Document doc = getDocument(verFile);
+            DOMSource uvernum_h = new DOMSource(doc);
+            XPath xpath = XPathFactory.newInstance().newXPath();
+
+            Node defines = (Node)xpath.evaluate(ICU_VERSION_XPATH, uvernum_h.getNode(), XPathConstants.NODE);
+
+	    if(defines==null) {
+	    	System.err.println("can't load from "+verFile.getName()+":"+ICU_VERSION_XPATH);
+	    }
+
+            NodeList nList = defines.getChildNodes();
+            for (int i = 0; result==null&& (i < nList.getLength()); i++) {
+                Node ln = nList.item(i);
+                if(!"memberdef".equals(ln.getNodeName())) {
+                    continue;
+                }
+                Node name = (Node)xpath.evaluate(NAME_XPATH, ln, XPathConstants.NODE);
+                if(name==null) continue;
+                
+               // System.err.println("Gotta node: " + name);
+                
+                Node nameVal = name.getFirstChild();
+                if(nameVal==null) nameVal = name;
+                
+                String nameStr = nameVal.getNodeValue();
+                if(nameStr==null) continue;
+
+               // System.err.println("Gotta name: " + nameStr);
+                
+                if(nameStr.trim().equals(U_ICU_VERSION)) {
+                    Node initializer = (Node)xpath.evaluate(INITIALIZER_XPATH, ln, XPathConstants.NODE);
+                    if(initializer==null) System.err.println("initializer with no value");
+                    Node initVal = initializer.getFirstChild();
+//                    if(initVal==null) initVal = initializer;
+                    String initStr = initVal.getNodeValue().trim().replaceAll("\"","");
+                    result = ICU_SPACE_PREFIX+initStr;
+                    System.err.println("Detected "+whichVer + " version: " + result);
+                    if(whichVer.equals("new") && result.startsWith("ICU ")) {
+                    		String vers[] = result.substring(4).split("\\.");
+                    		int maj = Integer.parseInt(vers[0]);
+                    		int min = Integer.parseInt(vers[1]);
+                    		if((min%2)==1) {
+                    			milestoneOf = " ("+result+")";
+                    			result = "ICU "+(maj)+"."+(min+1);
+                    			System.err.println("    .. " + milestoneOf + " is a milestone towards " + result);
+                    		}
+                    }
+                }
+                
+            }
+            //dumpNode(defines,"");
+        } catch(Throwable t) {
+            t.printStackTrace();
+            System.err.println("Warning: Couldn't get " + whichVer+  " version from "+ UVERSION + " - reverting to " + prevVer);
+            result = prevVer;
+        }
+        
+        if(result != null) {
+        	
+        }
+        
+        if(prevVer != null) {
+            if(result != null) {
+                if(!result.equals(prevVer)) { 
+                    System.err.println("Note: Detected " + result + " version but we'll use your requested --"+whichVer+"ver "+prevVer);
+                    result = prevVer;
+                	if(!milestoneOf.isEmpty()&&whichVer.equals("new")) {
+                		System.err.println(" .. ignoring milestone indicator " + milestoneOf);
+                		milestoneOf = "";
+                	}
+                } else {
+                    System.err.println("Note: You don't need to use  '--"+whichVer+"ver "+result+"' anymore - we detected it correctly.");
+                }
+            } else {
+                System.err.println("Note: Didn't detect version so we'll use your requested --"+whichVer+"ver "+prevVer);
+            	result = prevVer;
+            	if(!milestoneOf.isEmpty()&&whichVer.equals("new")) {
+            		System.err.println(" .. ignoring milestone indicator " + milestoneOf);
+            		milestoneOf = "";
+            	}
+            }
+        }
+        
+        if(result == null) {
+        	System.err.println("prevVer="+prevVer);
+            System.err.println("Error: You'll need to use the option  \"--"+whichVer+"ver\"  because we could not detect an ICU version in " + UVERSION );
+            throw new InternalError("Error: You'll need to use the option  \"--"+whichVer+"ver\"  because we could not detect an ICU version in " + UVERSION );
+        }
+        
+        
+        
+        return result;
+    }
+    
+    private static void printUsage(){
+        System.out.println("Usage: StableAPI option* target*");
+        System.out.println();
+        System.out.println("Options:");
+        System.out.println("    --help          Print this text");
+        System.out.println("    --oldver        Version of old version of ICU (optional)");
+        System.out.println("    --olddir        Directory that contains xml docs of old version");
+        System.out.println("    --newver        Version of new version of ICU (optional)");
+        System.out.println("    --newdir        Directory that contains xml docs of new version");
+        System.out.println("    --cxslt         XSLT file for C docs");
+        System.out.println("    --cppxslt       XSLT file for C++ docs");
+        System.out.println("    --reportxslt    XSLT file for report docs");
+        System.out.println("    --resultfile    Output file");
+        System.exit(-1);
+    }
+
+    static String getAttr(Node node, String attrName){
+    	if(node.getAttributes()==null && node.getNodeType()==3) {
+//    		return "(text node 3)";
+    		return "(Node: " + node.toString() + " )";
+//    		return node.getFirstChild().getAttributes().getNamedItem(attrName).getNodeValue();
+    	}
+    	
+        try {
+        	return node.getAttributes().getNamedItem(attrName).getNodeValue();
+        } catch(NullPointerException npe) {
+        	if(node.getAttributes()==null)  {
+        		throw new InternalError("[no attributes Can't get attr "+attrName +" out of node " + node.getNodeName()+":"+node.getNodeType()+":"+node.getNodeValue()+"@"+node.getTextContent());
+        	} else if(node.getAttributes().getNamedItem(attrName)==null) {
+        		return null; 
+        		//throw new InternalError("No attribute named: "+attrName);
+        	} else {
+        		System.err.println("Can't get attr "+attrName+": "+npe.toString());
+        	}
+        	npe.printStackTrace();
+        	throw new InternalError("Can't get attr "+attrName);
+        }
+    }
+    
+    static String getAttr(NamedNodeMap attrList, String attrName){
+        return attrList.getNamedItem(attrName).getNodeValue();
+    }
+    
+    static class Function implements Comparable<Function> {
+        public String prototype;
+        public String id;
+        public String status;
+        public String version;
+        public String file;
+        public String comparableName;
+        public boolean equals(Function right){
+            return this.prototype.equals(right.prototype);
+        }
+        static Function fromXml(Node n){
+            Function f = new Function();
+            f.prototype = getAttr(n, "prototype");
+            
+            if("yes".equals(getAttr(n, "static"))&&!f.prototype.contains("static")) {
+            	f.prototype = "static ".concat(f.prototype);
+            }
+             
+            f.id = getAttr(n, "id");
+            f.status = getAttr(n, "status");
+            f.version = trimICU(getAttr(n, "version"));
+            f.file = getAttr(n, "file");
+            f.purifyPrototype();
+            if(f.file == null) {
+            	f.file = "{null}";
+            } else {
+            	f.file = Function.getBasename(f.file);
+            }
+            f.comparableName = f.comparableName();
+            return f;
+        }
+        
+        /**
+         * Convert string to basename.
+         * @param str
+         * @return
+         */
+        private static String getBasename(String str){
+            int i = str.lastIndexOf("/");
+            str = i == -1 ? str : str.substring(i+1);
+            return str;
+        }
+        
+        /**
+         * Special cases:
+         * 
+         * Remove the status attribute embedded in the C prototype
+         * 
+         * Remove the virtual keyword in Cpp prototype
+         */
+        private void purifyPrototype(){
+            //refer to 'umachine.h'
+            String statusList[] = {"U_CAPI", "U_STABLE", "U_DRAFT", "U_DEPRECATED", "U_OBSOLETE", "U_INTERNAL", "virtual", "U_EXPORT2"};
+            for (int i = 0; i < statusList.length; i++) {
+                String s = statusList[i];
+                prototype = prototype.replaceAll(s,"");
+                prototype = prototype.trim();
+            }
+            
+            String replList[] = {  "[ ]*\\([ ]*void[ ]*\\)[ ]*",   "()",
+            				       " , ", ", ",
+            						};
+            for (int i = 0; i < replList.length; i+= 2) {
+                prototype = prototype.replaceAll(replList[i+0],replList[i+1]);
+            }
+            
+            
+            prototype = prototype.trim();
+
+            // Now, remove parameter names!
+            StringBuffer out = new StringBuffer();
+            StringBuffer in = new StringBuffer(prototype);
+            int openParen = in.indexOf("(");
+            int closeParen = in.lastIndexOf(")");
+            
+            if(openParen==-1 || closeParen==-1) return; // exit, malformed?
+            if(openParen+1==closeParen) return; // exit: ()
+            
+            out.append(in, 0, openParen+1); // prelude
+                        
+            for(int left = openParen+1; left<closeParen;) {
+            	int right = in.indexOf(",", left+1); // right edge
+            	if(right>=closeParen || right==-1 )  right=closeParen; // found last comma
+            	
+            //	System.err.println("Considering  " + left + " / " + right + " - " + closeParen +  " : "  + in.substring(left, right));
+            	
+            	if(left==right) continue; 
+            	
+            	// find variable name
+            	int rightCh = right-1;
+            	if(rightCh==left) { // 1 ch- break
+            		out.append(in,left,right);
+            		continue;
+            	}
+            	// eat whitespace at right
+            	int nameEndCh = rightCh;
+            	while(nameEndCh>left && Character.isWhitespace(in.charAt(nameEndCh))) {
+            		nameEndCh--;
+            	}
+            	int nameStartCh = nameEndCh;
+            	while(nameStartCh>left && Character.isJavaIdentifierPart(in.charAt(nameStartCh))) {
+            		nameStartCh--;
+            	}
+            	
+            	// now, did we find something to skip?
+            	if(nameStartCh>left && nameEndCh>nameStartCh) {
+            		out.append(in, left, nameStartCh+1);
+            	} else {
+            		// pass through
+            		out.append(in, left, right);
+            	}
+            	
+            	left = right;
+            }
+            
+            out.append(in, closeParen, in.length()); // postlude
+            
+            // Delete any doubled whitespace.
+            for(int p=1;p<out.length();p++) {
+                char prev = out.charAt(p-1); 
+            	if(Character.isWhitespace(prev)) {
+            		while (out.length()>p&&(Character.isWhitespace(out.charAt(p)))) {
+            			out.deleteCharAt(p);
+            		}
+            		if(out.length()>p) {
+            			// any trailings to delete?
+            			char curr = out.charAt(p);
+            			if(curr==',' || curr==')' || curr=='*' || curr=='&') { // delete spaces before these.
+            				out.deleteCharAt(--p);
+            				continue;
+            			}
+            		}
+            	}
+            }
+            
+          //  System.err.println(prototype+" -> " + out.toString());
+            prototype = out.toString();
+        }
+//        private Element toXml(Document doc){
+//            Element  ele = doc.createElement("func");
+//            ele.setAttribute("prototype", prototype);
+//            ele.setAttribute("id", id);
+//            ele.setAttribute("status", status);
+//            return ele;
+//        }
+		public int compareTo(Function o) {
+			return comparableName.compareTo(((Function)o).comparableName);
+		}
+		public String comparableName() { 
+			return file+"|"+prototype+"|"+status+"|"+version+"|"+id;
+		}
+    }
+    
+    static class JoinedFunction implements Comparable<JoinedFunction> {
+        public String prototype;
+        public String leftRefId;
+        public String leftStatus;
+        public String leftVersion;
+        public String rightVersion;
+        public String leftFile;
+        public String rightRefId;
+        public String rightStatus;
+        public String rightFile;
+        
+        public String comparableName;
+        
+        static JoinedFunction fromLeftFun(Function left){
+            JoinedFunction u = new JoinedFunction();
+            u.prototype = left.prototype;
+            u.leftRefId = left.id;
+            u.leftStatus = left.status;
+            u.leftFile = left.file;
+            u.rightRefId = nul;
+           // u.rightVersion = nul;
+            u.leftVersion = left.version;
+            u.rightStatus = nul;
+            u.rightFile = nul;
+            u.comparableName = left.comparableName;
+            return u;
+        }
+    
+        static JoinedFunction fromRightFun(Function right){
+            JoinedFunction u = new JoinedFunction();
+            u.prototype = right.prototype;
+            u.leftRefId = nul;
+            u.leftStatus = nul;
+            u.leftFile = nul;
+           // u.leftVersion = nul;
+            u.rightVersion = right.version;
+            u.rightRefId = right.id;
+            u.rightStatus = right.status;
+            u.rightFile = right.file;
+            u.comparableName = right.comparableName;
+            return u;
+        }
+        
+        static JoinedFunction fromTwoFun(Function left, Function right){
+            if (!left.equals(right)) throw new Error();
+            JoinedFunction u = new JoinedFunction();
+            u.prototype = left.prototype;
+            u.leftRefId = left.id;
+            u.leftStatus = left.status;
+            u.leftFile = left.file;
+            u.rightRefId = right.id;
+            u.rightStatus = right.status;
+            u.leftVersion = left.version;
+            u.rightVersion = right.version;
+            u.rightFile = right.file;
+            u.comparableName = left.comparableName+"+"+right.comparableName;
+            return u;
+        }
+
+        Element toXml(Document doc){
+            Element  ele = doc.createElement("func");
+            ele.setAttribute("prototype", formatCode(prototype));
+//            ele.setAttribute("leftRefId", leftRefId);
+            
+            ele.setAttribute("leftStatus", leftStatus);
+//            ele.setAttribute("rightRefId", rightRefId);
+            ele.setAttribute("rightStatus", rightStatus);
+            ele.setAttribute("leftVersion", leftVersion);
+//            ele.setAttribute("rightRefId", rightRefId);
+            ele.setAttribute("rightVersion", rightVersion);
+            
+            
+//            String f = rightRefId.equals(nul) ? leftRefId : rightRefId;
+//            int tail = f.indexOf("_");
+//            f = tail != -1 ? f.substring(0, tail) : f;
+//            f = f.startsWith("class") ? f.replaceFirst("class","") : f;
+            String f = rightFile.equals(nul) ? leftFile : rightFile;
+            ele.setAttribute("file", f);
+            return ele;
+        }
+        
+
+		public int compareTo(JoinedFunction o) {
+			return comparableName.compareTo(o.comparableName);
+		}
+		
+        public boolean equals(Function right){
+            return this.prototype.equals(right.prototype);
+        }
+    }
+
+    TransformerFactory transFac = TransformerFactory.newInstance();
+    Transformer makeTransformer(InputStream is, String name) {
+    	if(is==null) {
+    		throw new InternalError("No inputstream set for " + name);
+    	}
+    	System.err.println("Transforming from: " + name);
+    	Transformer t;
+		try {
+//			// check the prolog
+//			if(is.markSupported())  try {
+//				is.mark(100);
+//				int b = is.read();
+//				is.reset();
+//				System.err.println("Read byte: == " + Integer.toHexString(b));
+//			} catch(Throwable th) {
+//				System.err.println(" ( couldn't read a byte: " + th.toString()+ " )");
+//			} else {
+//				System.err.println(" ( couldn't set mark)");
+//			}
+			StreamSource ss = new StreamSource(is);
+			ss.setSystemId(new File("."));
+			t = transFac.newTransformer(ss);
+		} catch (TransformerConfigurationException e) {
+			e.printStackTrace();
+			throw new InternalError("Couldn't make transformer for " + name + " - " + e.getMessageAndLocation());			
+		}
+    	if(t == null) {
+    		throw new InternalError("Couldn't make transformer for " + name);
+    	}
+    	return t;
+    }
+    private void reportSelectedFun(Node joinedNode) throws TransformerException, ParserConfigurationException, SAXException, IOException{
+        Transformer report = makeTransformer(reportXslStream, RPTXSLT);
+        //report.setParameter("leftStatus", leftStatus);
+        report.setParameter("leftVer", leftVer);
+//        report.setParameter("rightStatus", rightStatus);
+        report.setParameter("ourYear", new Integer(new java.util.GregorianCalendar().get(java.util.Calendar.YEAR)));
+        report.setParameter("rightVer", rightVer);
+        report.setParameter("rightMilestone", milestoneOf);
+        report.setParameter("dateTime", new GregorianCalendar().getTime());
+        report.setParameter("nul", nul);
+        
+        DOMSource src = new DOMSource(joinedNode);
+
+        Result res = new StreamResult(resultFile);
+//        DOMResult res = new DOMResult();
+        report.transform(src, res);
+//        dumpNode(res.getNode(),"");
+    }
+    
+    private Set<JoinedFunction> getFullList(InputStream dumpXsltStream, String dumpXsltFile) throws TransformerException, ParserConfigurationException, XPathExpressionException, SAXException, IOException{
+        // prepare transformer
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        String expression = "/list";
+        Transformer transformer = makeTransformer(dumpXsltStream, dumpXsltFile);
+
+        //        InputSource leftSource = new InputSource(leftDir + "index.xml");
+        DOMSource leftIndex = new DOMSource(getDocument(new File(leftDir,INDEX_XML)));
+        DOMResult leftResult = new DOMResult();
+        transformer.setParameter(DOC_FOLDER, leftDir);
+        transformer.transform(leftIndex, leftResult);
+
+//        Node leftList = XPathAPI.selectSingleNode(leftResult.getNode(),"/list");
+        Node leftList = (Node)xpath.evaluate(expression, leftResult.getNode(), XPathConstants.NODE);
+        if(leftList==null) {
+           	//dumpNode(xsltSource.getNode());
+          	dumpNode(leftResult.getNode());
+//        	dumpNode(leftIndex.getNode());
+        	System.out.flush();
+        	System.err.flush();
+        	throw new InternalError("getFullList("+dumpXsltFile.toString()+") returned a null left "+expression);
+        }
+        
+        xpath.reset(); // reuse
+        
+        DOMSource rightIndex = new DOMSource(getDocument(new File(rightDir,INDEX_XML)));
+        DOMResult rightResult = new DOMResult();
+        transformer.setParameter(DOC_FOLDER, rightDir);
+        System.err.println("abdToLoad "+dumpXsltFile.toString());
+        transformer.transform(rightIndex, rightResult);
+        System.err.println("dnlToLoad "+dumpXsltFile.toString());
+        Node rightList = (Node)xpath.evaluate(expression, rightResult.getNode(), XPathConstants.NODE);
+        if(rightList==null) {
+        	throw new InternalError("getFullList("+dumpXsltFile.toString()+") returned a null right "+expression);
+        }
+//        dumpNode(rightList,"");
+        
+        
+        Set<Function> leftSet = nodeToSet(leftList);
+        Set<Function> rightSet = nodeToSet(rightList);
+        Set<JoinedFunction> joined = fullJoin(leftSet, rightSet);
+        return joined;
+//        joinedNode = setToNode(joined);
+//        dumpNode(joinedNode,"");
+//        return joinedNode;
+    }
+
+    /**
+     * @param node
+     * @return      Set<Fun>
+     */
+    private Set<Function> nodeToSet(Node node){
+        Set<Function> s = new TreeSet<Function>();
+        NodeList list = node.getChildNodes();
+        for (int i = 0; i < list.getLength(); i++) {
+            Node n = list.item(i);
+            s.add(Function.fromXml(n));
+        }
+        return s;
+    }
+
+    /**
+     * @param set       Set<JoinedFun>
+     * @return
+     * @throws ParserConfigurationException
+     */
+    private Node setToNode(Set<JoinedFunction> set) throws ParserConfigurationException{
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        Document doc  = dbf.newDocumentBuilder().newDocument();
+        Element root = doc.createElement("list");
+        doc.appendChild(root);
+        for (Iterator<JoinedFunction> iter = set.iterator(); iter.hasNext();) {
+            JoinedFunction fun = iter.next();
+            root.appendChild(fun.toXml(doc));
+        }
+        return doc;
+    }
+
+    /**
+     * full-join two Set on 'prototype' 
+     * 
+     * @param left     Set<Fun>
+     * @param right    Set<Fun>
+     * @return          Set<JoinedFun>
+     */
+    private static Set<JoinedFunction> fullJoin(Set<Function> left, Set<Function> right){
+
+        Set<JoinedFunction> joined = new TreeSet<JoinedFunction>(); //Set<JoinedFun>
+        Set<Function> common = new TreeSet<Function>(); //Set<Fun>
+        for (Iterator<Function> iter1 = left.iterator(); iter1.hasNext();) {
+            Function f1 = iter1.next();
+//            if (f1.prototype.matches(".*Transliterator::.*")){
+//                System.err.println("left: " + f1.prototype);
+//                System.err.println("left: " + f1.status);
+//            }
+            for (Iterator<Function> iter2 = right.iterator(); iter2.hasNext();) {
+                Function f2 = iter2.next();
+//                if ( f1.prototype.matches(".*filteredTransliterate.*")
+//                  && f2.prototype.matches(".*filteredTransliterate.*")){
+//                    System.err.println("right: " + f2.prototype);
+//                    System.err.println("right: " + f2.status);
+//                    System.err.println(f1.prototype.equals(f2.prototype));
+//                    System.err.println(f1.prototype.getBytes()[0]);
+//                    System.err.println(f2.prototype.getBytes()[0]);
+//                }
+                if (f1.equals(f2)) {
+                    // should add left item to common set
+                    // since we will remove common items with left set later
+                    common.add(f1);
+                    joined.add(JoinedFunction.fromTwoFun(f1, f2));
+                    right.remove(f2);
+                    break;
+                } 
+            }
+        }
+
+        for (Iterator<Function> iter = common.iterator(); iter.hasNext();) {
+            Function f = iter.next();
+            left.remove(f);
+        }
+        
+        for (Iterator<Function> iter = left.iterator(); iter.hasNext();) {
+            Function f = iter.next();
+            joined.add(JoinedFunction.fromLeftFun(f));
+        }
+        
+        for (Iterator<Function> iter = right.iterator(); iter.hasNext();) {
+            Function f = iter.next();
+            joined.add(JoinedFunction.fromRightFun(f));
+        }
+        return joined;
+    }
+    
+    private static void dumpNode(Node n) {
+    	dumpNode(n,"");
+    }
+    /**
+     * Dump out a node for debugging. Recursive fcn
+     * @param n
+     * @param pre
+     */
+    private static void dumpNode(Node n, String pre) {
+    	String opre = pre;
+		pre += " ";
+		System.out.print(opre + "<" + n.getNodeName() );
+		// dump attribute
+		NamedNodeMap attr = n.getAttributes();
+		if (attr != null) {
+			for (int i = 0; i < attr.getLength(); i++) {
+				System.out.print("\n"+pre+"   "+attr.item(i).getNodeName()+"=\"" + attr.item(i).getNodeValue()+"\"");
+			}
+		}
+		System.out.println(">");
+
+		// dump value
+		String v = pre + n.getNodeValue();
+		if (n.getNodeType() == Node.TEXT_NODE)
+			System.out.println(v);
+
+		// dump sub nodes
+		NodeList nList = n.getChildNodes();
+		for (int i = 0; i < nList.getLength(); i++) {
+			Node ln = nList.item(i);
+			dumpNode(ln, pre + " ");
+		}
+		System.out.println(opre + "</" + n.getNodeName() + ">");
+	}
+    
+    private static DocumentBuilder theBuilder = null;
+    private static DocumentBuilderFactory dbf  = null;
+    private synchronized static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
+    	if(theBuilder == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            theBuilder = dbf.newDocumentBuilder();
+    	}
+    	return theBuilder;
+    }
+    
+    private static Document getDocument(File file) throws ParserConfigurationException, SAXException, IOException{
+        FileInputStream fis = new FileInputStream(file);
+        InputSource inputSource = new InputSource(fis);
+        Document doc = getDocumentBuilder().parse(inputSource);
+        return doc;
+    }
+    static boolean tried = false;
+    static Formatter aFormatter = null;
+    
+    public interface Formatter {
+    	public String formatCode(String s);
+    }
+    
+
+    public static String format_keywords[] = {
+    	"enum","#define","static"
+    };
+    
+    /**
+     * Attempt to use a pretty formatter
+     * @param prototype2
+     * @return
+     */
+	public static String formatCode(String prototype2) {
+		if(!tried) {
+			String theFormatter = StableAPI.class.getPackage().getName()+".CodeFormatter";
+			try {
+				@SuppressWarnings("unchecked")
+				Class<Formatter> formatClass = (Class<Formatter>) Class.forName(theFormatter);
+				aFormatter = (Formatter) formatClass.newInstance();
+			} catch (Exception e) {
+				System.err.println("Note: Couldn't load " + theFormatter);
+				aFormatter = new Formatter() {
+
+					public String formatCode(String s) {
+						String str = HTMLSafe(s.trim());
+						for(String keyword : format_keywords) {
+							if(str.startsWith(keyword)) {
+								str = str.replaceFirst(keyword, "<tt>"+keyword+"</tt>");
+							}
+						}
+						return str;
+					}
+					
+				};
+			}
+			tried = true;
+		}
+		if(aFormatter != null) {
+			return aFormatter.formatCode(prototype2);
+		} else {
+			return HTMLSafe(prototype2);
+		}
+	}
+
+    public static String HTMLSafe(String s) {
+        if(s==null) return null;
+        
+        return 
+            s.replaceAll("&","&amp;")
+             .replaceAll("<","&lt;")
+             .replaceAll(">","&gt;")
+             .replaceAll("\"","&quot;");
+    }
+    
+	
+}
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc.xslt
new file mode 100644
index 0000000..91a1a68
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc.xslt
@@ -0,0 +1,106 @@
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2009-2010, International Business Machines Corporation and    *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is an XSLT build file for ICU tools. 
+*/
+-->
+<!--
+  List all C functions generated from the 'index.xml'
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="docFolder" />
+
+  <xsl:template match="/">
+  <list>
+      <xsl:variable name="files_node" select="/doxygenindex/compound[@kind='file']/@refid" />
+      <xsl:for-each select="$files_node">
+        <xsl:variable name="file" select="concat($docFolder, '/', . , '.xml')" />
+        <xsl:variable name="funcs_node" select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='function']" />
+        <xsl:for-each select="$funcs_node">
+          <cppfunc>
+             <xsl:copy-of select="@id" />
+             <xsl:attribute name="status"><xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/></xsl:attribute>
+             <xsl:attribute name="version"><xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/></xsl:attribute>
+             <xsl:attribute name="prototype"><xsl:value-of select="concat(definition/text(), argsstring/text())" /></xsl:attribute>
+             <xsl:copy-of select="location/@file" />
+          </cppfunc>
+        </xsl:for-each>
+        
+        <!--  now get #defines  -->
+        <xsl:variable name="defs_node" select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='define']" />
+        <xsl:for-each select="$defs_node">
+          <cppfunc>
+             <xsl:copy-of select="@id" />
+             <xsl:attribute name="status"><xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/></xsl:attribute>
+             <xsl:attribute name="version"><xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/></xsl:attribute>
+             <xsl:attribute name="prototype">#define <xsl:value-of select="name/text()" /></xsl:attribute>
+             <xsl:copy-of select="location/@file" />
+          </cppfunc>
+         </xsl:for-each>
+
+		<!--  now enums -->
+		<xsl:variable name="enum_node"
+			select="document($file)/doxygen/compounddef/sectiondef/memberdef[@kind='enum'][@prot='public']" />
+		<xsl:for-each select="$enum_node">
+
+			<!--  use a name, else '(anonymous)' -->
+			<xsl:variable name="enum_node_name">
+				<xsl:choose>					
+					<xsl:when test="contains(name/text(), '@')">
+						(anonymous)</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="name/text()" /></xsl:otherwise></xsl:choose>
+			</xsl:variable>
+		
+			<!--  enum object  -->
+			<xsl:variable name="enum_status" select="detaileddescription/para/xrefsect/xreftitle/text()"/>
+			<xsl:variable name="enum_version" select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/>
+			
+			<xsl:if test="not(contains(name/text(), '@'))"> <!--  no anonymous file level enums -->
+				<cppfunc> 
+					<xsl:copy-of select="@id" />
+					<xsl:attribute name="status"><xsl:value-of select="$enum_status" /></xsl:attribute>
+					<xsl:attribute name="version"><xsl:value-of select="$enum_status" /></xsl:attribute>
+					<xsl:attribute name="prototype">enum <xsl:value-of
+						select="$enum_node_name" /> {}</xsl:attribute>
+					<xsl:copy-of select="location/@file" />
+				</cppfunc>
+			</xsl:if>
+			
+			<xsl:variable name="enum_node_file" select="location/@file" />
+			
+
+			<xsl:variable name="enum_member" select="enumvalue[@prot='public']"/>
+			
+			<xsl:for-each select="$enum_member">
+				<cppfunc>
+					<xsl:copy-of select="@id" />
+					<!--  status and version: only override if set. -->
+					<xsl:attribute name="status"><xsl:choose>
+							<xsl:when test="detaileddescription/para/xrefsect/xreftitle/text() != ''"><xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/></xsl:when>
+							<xsl:otherwise><xsl:value-of select="$enum_status" /></xsl:otherwise>
+						</xsl:choose></xsl:attribute>
+					<xsl:attribute name="version"><xsl:choose>
+							<xsl:when test="detaileddescription/para/xrefsect/xrefdescription/para/text() != ''"><xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/></xsl:when>
+							<xsl:otherwise><xsl:value-of select="$enum_version" /></xsl:otherwise>
+						</xsl:choose></xsl:attribute>
+					<xsl:attribute name="prototype">enum <xsl:value-of select="$enum_node_name"/>::<xsl:value-of
+						select="name/text()" /></xsl:attribute>
+					<xsl:attribute name="file"><xsl:value-of select="$enum_node_file" /></xsl:attribute>
+				</cppfunc>
+			
+			</xsl:for-each> <!--  done with enum member -->
+			
+
+		</xsl:for-each> <!--  done with enum -->
+
+
+      </xsl:for-each>
+  </list>
+  </xsl:template>
+</xsl:stylesheet>
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc_xml.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc_xml.xslt
new file mode 100644
index 0000000..c490e29
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCFunc_xml.xslt
@@ -0,0 +1,36 @@
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2009-2010, International Business Machines Corporation and    *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is an XSLT build file for ICU tools. 
+*/
+-->
+<!--
+  List all C functions generated from the 'index.xml'
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="docFolder" />
+
+  <xsl:template match="/">
+  <list>
+      <xsl:variable name="files_node" select="/doxygenindex/compound[@kind='file']/@refid" />
+      <xsl:for-each select="$files_node">
+        <xsl:variable name="file" select="concat($docFolder, '/', . , '.xml')" />
+        <xsl:variable name="funcs_node" select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='function']" />
+        <xsl:for-each select="$funcs_node">
+          <cppfunc>
+             <xsl:copy-of select="@id" />
+             <xsl:attribute name="status"><xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/></xsl:attribute>
+             <xsl:attribute name="version"><xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/></xsl:attribute>
+             <xsl:attribute name="prototype"><xsl:value-of select="concat(definition/text(), argsstring/text())" /></xsl:attribute>
+             <xsl:copy-of select="location/@file" />
+          </cppfunc>
+        </xsl:for-each>
+      </xsl:for-each>
+  </list>
+  </xsl:template>
+</xsl:stylesheet>
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc.xslt
new file mode 100644
index 0000000..e32ec8c
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc.xslt
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009-2010, International Business Machines Corporation and others. All Rights Reserved. -->
+<!-- List all cpp public functions generated from the 'index.xml' -->
+<xsl:stylesheet version="1.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:param name="docFolder" />
+
+	<xsl:template match="/">
+		<list>
+			<xsl:variable name="files_node"
+				select="/doxygenindex/compound[@kind='class']/@refid" />
+			<xsl:for-each select="$files_node">
+				<xsl:variable name="file"
+					select="concat($docFolder, '/', . , '.xml')" />
+				<xsl:variable name="funcs_node"
+					select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='function']" />
+				<xsl:variable name="compoundname"
+					select="document($file)/doxygen/compounddef/compoundname/text()" />
+				<xsl:for-each select="$funcs_node">
+					<cppfunc>
+						<xsl:copy-of select="@id" />
+						<xsl:attribute name="status"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xreftitle/text()" /></xsl:attribute>
+						<xsl:attribute name="version"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xrefdescription/para/text()" /></xsl:attribute>
+						<xsl:attribute name="prototype"><xsl:value-of
+							select="concat(definition/text(), argsstring/text())" /></xsl:attribute>
+						<xsl:copy-of select="location/@file" />
+						<xsl:copy-of select="@static" />
+						<xsl:copy-of select="@inline" />
+					</cppfunc>
+				</xsl:for-each>
+				
+				<!--  now const static publics -->
+				<xsl:variable name="sconst_node"
+					select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='variable'][@static='yes']" />
+				<xsl:for-each select="$sconst_node">
+					<cppfunc>
+						<xsl:copy-of select="@id" />
+						<xsl:attribute name="status"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xreftitle/text()" /></xsl:attribute>
+						<xsl:attribute name="version"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xrefdescription/para/text()" /></xsl:attribute>
+						<xsl:attribute name="prototype">static <xsl:value-of
+							select="definition/text()" /></xsl:attribute>
+						<xsl:copy-of select="location/@file" />
+						<xsl:copy-of select="@static" />
+						<xsl:copy-of select="@inline" />
+					</cppfunc>
+				</xsl:for-each>
+
+		<!-- 
+				//No real non-static variables - and also, doxygen is confused about nested structs/unions
+				
+				<xsl:variable name="const_node"
+					select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='variable'][@static='no']" />
+				<xsl:for-each select="$const_node">
+					<cppfunc>
+						<xsl:copy-of select="@id" />
+						<xsl:attribute name="status"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xreftitle/text()" /></xsl:attribute>
+						<xsl:attribute name="version"><xsl:value-of
+							select="detaileddescription/para/xrefsect/xrefdescription/para/text()" /></xsl:attribute>
+						<xsl:attribute name="prototype">/* not static */ <xsl:value-of
+							select="definition/text()" /></xsl:attribute>
+						<xsl:copy-of select="location/@file" />
+						<xsl:copy-of select="@static" />
+						<xsl:copy-of select="@inline" />
+					</cppfunc>
+				</xsl:for-each>
+		-->
+				<!--  now enums -->
+				<xsl:variable name="enum_node"
+					select="document($file)/doxygen/compounddef/sectiondef/memberdef[@kind='enum'][@prot='public']" />
+				<xsl:for-each select="$enum_node">
+
+					<!--  use a name, else '(anonymous)' -->
+					<xsl:variable name="enum_node_name"><xsl:choose>					
+							<xsl:when test="contains(name/text(), '@')">(anonymous)</xsl:when>
+							<xsl:otherwise><xsl:value-of select="name/text()" /></xsl:otherwise>
+						</xsl:choose></xsl:variable>
+
+					<xsl:variable name="enum_status" select="detaileddescription/para/xrefsect/xreftitle/text()"/>
+					<xsl:variable name="enum_version" select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/>
+
+					<cppfunc>
+						<xsl:copy-of select="@id" />
+						<xsl:attribute name="status"><xsl:value-of
+							select="$enum_status" /></xsl:attribute>
+						<xsl:attribute name="version"><xsl:value-of
+							select="$enum_version" /></xsl:attribute>
+						<xsl:attribute name="prototype">enum 
+							<xsl:value-of select="$compoundname"/>::<xsl:value-of
+							select="$enum_node_name" /> {}</xsl:attribute>
+						<xsl:copy-of select="location/@file" />
+					</cppfunc>
+		
+					<xsl:variable name="enum_node_file" select="location/@file" />
+		
+		
+					<xsl:variable name="enum_member" select="enumvalue[@prot='public']"/>
+					
+					<!--  for each member -->
+					<xsl:for-each select="$enum_member">
+						<cppfunc>
+							<xsl:copy-of select="@id" />
+							<!--  status and version: only override if set. -->
+							<xsl:attribute name="status">
+								<xsl:choose>
+									<xsl:when test="detaileddescription/para/xrefsect/xreftitle/text() != ''">
+										<xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/>
+									</xsl:when>
+									<xsl:otherwise>
+										<xsl:value-of select="$enum_status" />
+									</xsl:otherwise>
+								</xsl:choose>
+							</xsl:attribute>
+							<xsl:attribute name="version">
+								<xsl:choose>
+									<xsl:when test="detaileddescription/para/xrefsect/xrefdescription/para/text() != ''">
+										<xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/>
+									</xsl:when>
+									<xsl:otherwise>
+										<xsl:value-of select="$enum_version" />
+									</xsl:otherwise>
+								</xsl:choose>
+							</xsl:attribute>
+							<xsl:attribute name="prototype">enum 
+							<xsl:value-of select="$compoundname"/>::<xsl:value-of
+								select="$enum_node_name" />::<xsl:value-of
+								select="name/text()" /></xsl:attribute>
+							<xsl:attribute name="file"><xsl:value-of select="$enum_node_file" /></xsl:attribute>
+						</cppfunc>
+					
+					</xsl:for-each> <!--  done with enum member -->
+					 
+				</xsl:for-each> <!--  done with enums -->
+
+			</xsl:for-each> <!--  done with file -->
+
+		</list>
+	</xsl:template>
+</xsl:stylesheet>
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc_xml.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc_xml.xslt
new file mode 100644
index 0000000..88c3ff3
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/dumpAllCppFunc_xml.xslt
@@ -0,0 +1,36 @@
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2009-2010, International Business Machines Corporation and    *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is an XSLT file. 
+*/
+-->
+<!--
+  List all cpp public functions generated from the 'index.xml'
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:param name="docFolder" />
+
+  <xsl:template match="/">
+  <list>
+      <xsl:variable name="files_node" select="/doxygenindex/compound[@kind='class']/@refid" />
+      <xsl:for-each select="$files_node">
+        <xsl:variable name="file" select="concat($docFolder, '/', . , '.xml')" />
+        <xsl:variable name="funcs_node" select="document($file)/doxygen/compounddef/sectiondef/memberdef[@prot='public'][@kind='function']" />
+        <xsl:for-each select="$funcs_node">
+          <cppfunc>
+             <xsl:copy-of select="@id" />
+             <xsl:attribute name="status"><xsl:value-of select="detaileddescription/para/xrefsect/xreftitle/text()"/></xsl:attribute>
+             <xsl:attribute name="version"><xsl:value-of select="detaileddescription/para/xrefsect/xrefdescription/para/text()"/></xsl:attribute>
+             <xsl:attribute name="prototype"><xsl:value-of select="concat(definition/text(), argsstring/text())" /></xsl:attribute>
+             <xsl:copy-of select="location/@file" />
+          </cppfunc>
+        </xsl:for-each>
+      </xsl:for-each>
+  </list>
+  </xsl:template>
+</xsl:stylesheet>
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/genReport.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/genReport.xslt
new file mode 100644
index 0000000..0e8048b
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/genReport.xslt
@@ -0,0 +1,262 @@
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2008-2010, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is the XSLT for the API Report. 
+*/
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!--
+  <xsl:param name="leftStatus" />
+  <xsl:param name="rightStatus" />
+-->
+  <xsl:param name="leftVer" />
+  <xsl:param name="rightVer" />
+  <xsl:param name="dateTime" />
+  <xsl:param name="rightMilestone" />
+  <xsl:param name="nul" />
+
+  <xsl:param name="ourYear" />
+
+<xsl:output method="html" version="4.0"  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" 
+doctype-system="http://www.w3.org/TR/html4/loose.dtd"
+	omit-xml-declaration="yes"	encoding="utf-8" indent="yes"/>
+  
+
+  <xsl:template match="/">
+    <html>
+	<xsl:comment>
+	 Copyright (C)  <xsl:value-of select="$ourYear" />, International Business Machines Corporation, All Rights Reserved. 
+	</xsl:comment>
+    <head>
+    <title>ICU4C API Comparison: <xsl:value-of select="$leftVer"/> with <xsl:value-of select="$rightVer" /><xsl:value-of select="$rightMilestone" /> </title>
+    <link rel="stylesheet" href="icu4c.css" type="text/css" />
+    </head>
+    
+    <body>
+    
+    <a name="#_top"></a>
+    
+    <h1>ICU4C API Comparison: <xsl:value-of select="$leftVer"/> with <xsl:value-of select="$rightVer" /><xsl:value-of select="$rightMilestone" /> </h1>
+    
+    <div id="toc">
+	    <ul>
+	    	<li><a href="#removed">Removed from <xsl:value-of select="$leftVer"/></a></li>
+	    	<li><a href="#deprecated">Deprecated or Obsoleted in <xsl:value-of select="$rightVer" /></a></li>
+	    	<li><a href="#changed">Changed in  <xsl:value-of select="$rightVer" /></a></li>
+	    	<li><a href="#promoted">Promoted to stable in <xsl:value-of select="$rightVer" /></a></li>
+	    	<li><a href="#added">Added in <xsl:value-of select="$rightVer" /></a></li>
+	    	<li><a href="#other">Other existing drafts in <xsl:value-of select="$rightVer" /></a></li>
+	    </ul>
+	    <hr />
+	</div>
+	
+	<a name="removed"></a>
+	    <h2>Removed from <xsl:value-of select="$leftVer"/> </h2>
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@rightStatus=$nul]"/>
+        </xsl:call-template>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+
+	<a name="deprecated"></a>
+    <h2>Deprecated or Obsoleted in <xsl:value-of select="$rightVer" /></h2>
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[(@rightStatus='Deprecated' and @leftStatus!='Deprecated') or (@rightStatus='Obsolete' and @leftStatus!='Obsolete')]"/>
+        </xsl:call-template>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+
+	<a name="changed"></a>
+    <h2>Changed in  <xsl:value-of select="$rightVer" /> (old, new)</h2>
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[(@leftStatus != $nul) and (@rightStatus != $nul) and ( (@leftStatus != @rightStatus) or (@leftVersion != @rightVersion) ) and not ( (@leftStatus = 'Draft') and (@rightStatus = 'Stable') and (@rightVersion = $rightVer) )]"/>
+        </xsl:call-template>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+
+	<a name="promoted"></a>
+    <h2>Promoted to stable in <xsl:value-of select="$rightVer" /></h2>
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@leftStatus != 'Stable' and  @rightStatus = 'Stable']"/>
+        </xsl:call-template>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+    
+    <a name="added"></a>
+    <h2>Added in <xsl:value-of select="$rightVer" /></h2>
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@leftStatus=$nul]"/>
+        </xsl:call-template>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+    
+    <a name="other"></a>
+    <h2>Other existing drafts in <xsl:value-of select="$rightVer" /></h2>
+    <div class='other'>
+        <xsl:call-template name="infoTable"> <!--  note: note genTable -->
+            <xsl:with-param name="nodes" select="/list/func[@rightStatus = 'Draft' and @rightVersion != $rightVer]"/>
+        </xsl:call-template>
+    </div>
+    <P/><a href="#_top">(jump back to top)</a><hr/>
+<!--    
+    
+-->    
+
+    <p><i><font size="-1">Contents generated by StableAPI tool on <xsl:value-of select="$dateTime" /><br/>Copyright (C) <xsl:value-of select="$ourYear" />, International Business Machines Corporation, All Rights Reserved.</font></i></p>
+    </body>
+    </html>
+  </xsl:template>
+
+  <xsl:template name="genTable">
+    <xsl:param name="nodes" />
+    <table class='genTable' BORDER="1">
+    <THEAD>
+        <tr>
+            <th> <xsl:value-of select="'File'" /> </th>
+            <th> <xsl:value-of select="'API'" /> </th>
+            <th> <xsl:value-of select="$leftVer" /> </th>
+            <th> <xsl:value-of select="$rightVer" /> </th>
+        </tr>
+    </THEAD>
+
+        <xsl:for-each select="$nodes">
+            <xsl:sort select="@file" />
+            
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="'row'"/>
+                    <xsl:value-of select="(position() mod 2)"/>
+                    <!-- 
+                    <xsl:choose>
+                        <xsl:when test="(position() mod 2) = 0"><xsl:value-of select="row0" /></xsl:when>
+                        <xsl:otherwise><xsl:value-of select="row1" /></xsl:otherwise>
+                    </xsl:choose>
+                    -->
+                </xsl:attribute>
+                <td class='file'> <xsl:value-of select="@file" /> </td>
+                <td class='proto'> <xsl:value-of disable-output-escaping="yes" select="@prototype" /> </td>
+                <td>
+                    <xsl:attribute name="class">
+                        <xsl:if test ="@leftStatus = 'Stable'">
+                                <xsl:value-of select="'stabchange'" />
+                        </xsl:if>
+                    </xsl:attribute>
+                   	<xsl:if  test = "@leftStatus = 'Draft' and @rightStatus = 'Stable' and @leftVersion = @rightVersion">
+	                    <xsl:attribute name="colspan">2</xsl:attribute>
+	                    <xsl:attribute name="align">center</xsl:attribute>
+                   	</xsl:if>
+                
+                    <xsl:value-of select="@leftStatus" /><xsl:if  test = "@leftStatus = 'Draft' and @rightStatus = 'Stable' and @leftVersion = @rightVersion">»Stable</xsl:if>
+                    <br/> <xsl:value-of select="@leftVersion" />
+                </td>
+           	<xsl:if  test = "@leftStatus != 'Draft' or @rightStatus != 'Stable' or @leftVersion != @rightVersion">
+                <td> <xsl:value-of select="@rightStatus" /> 
+                    <br/> 
+                    <span>
+                        <xsl:attribute name="class">
+                            <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != ''">
+                                <xsl:value-of select="'verchange'" />                                
+                            </xsl:if>
+                        </xsl:attribute>              
+                        <span>              
+                            <xsl:value-of select="@rightVersion" />
+                        </span>
+                        <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != '' and @rightStatus = 'Stable' and not ( (@leftStatus = 'Draft') and (@rightStatus = 'Stable') and (@rightVersion = $rightVer) )">
+                            <br/><b title='A stable API changed version.' class='bigwarn'>(changed)</b>
+                        </xsl:if>
+                        <xsl:if test ="@rightStatus = 'Draft' and @rightVersion != $rightVer">
+                            <br/><b title='A draft API has the wrong version.' class='bigwarn'>(should be <xsl:value-of select="$rightVer"/>)</b>
+                        </xsl:if>
+                        <xsl:if test="@leftStatus = 'None' and @rightVersion = ''">
+                        	<br/><b title='A new API was introduced that was not tagged.' class='bigwarn'>(untagged)</b>
+                        </xsl:if>
+                    </span>
+                </td>
+           </xsl:if>
+           	<xsl:if  test = "@rightStatus = 'Stable' and @rightVersion = $rightVer">
+                <td class='bornstable'>
+                    <b title='A new API was introduced as stable in $rightVer.' class='bigwarn'>(Born Stable)</b>
+                </td>
+           </xsl:if>
+            </tr>
+        </xsl:for-each>
+    </table>
+  </xsl:template>
+  
+    <xsl:template name="infoTable">
+    <xsl:param name="nodes" />
+    <table class='genTable' BORDER="1">
+    <THEAD>
+        <tr>
+            <th> <xsl:value-of select="'File'" /> </th>
+            <th> <xsl:value-of select="'API'" /> </th>
+            <th> <xsl:value-of select="$leftVer" /> </th>
+            <th> <xsl:value-of select="$rightVer" /> </th>
+        </tr>
+    </THEAD>
+
+        <xsl:for-each select="$nodes">
+            <xsl:sort select="@file" />
+            
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="'row'"/>
+                    <xsl:value-of select="(position() mod 2)"/>
+                    <!-- 
+                    <xsl:choose>
+                        <xsl:when test="(position() mod 2) = 0"><xsl:value-of select="row0" /></xsl:when>
+                        <xsl:otherwise><xsl:value-of select="row1" /></xsl:otherwise>
+                    </xsl:choose>
+                    -->
+                </xsl:attribute>
+                <td class='file'> <xsl:value-of select="@file" /> </td>
+                <td class='proto'> <xsl:value-of disable-output-escaping="yes" select="@prototype" /> </td>
+                <td>
+                    <xsl:attribute name="class">
+                        <xsl:if test ="@leftStatus = 'Stable'">
+                                <xsl:value-of select="'stabchange'" />
+                        </xsl:if>
+                    </xsl:attribute>
+                    
+                   	<xsl:if  test = "@leftStatus = @rightStatus and @leftVersion = @rightVersion">
+	                    <xsl:attribute name="colspan">2</xsl:attribute>
+	                    <xsl:attribute name="align">center</xsl:attribute>
+                   	</xsl:if>
+               
+                    <xsl:value-of select="@leftStatus" />
+                    <br/> <xsl:value-of select="@leftVersion" />
+                </td>
+                <xsl:if test = "@leftStatus != @rightStatus or @leftVersion != @rightVersion">
+                <td> <xsl:value-of select="@rightStatus" /> 
+                    <br/> 
+                    <span>
+                        <xsl:attribute name="class">
+                            <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != ''">
+                                <xsl:value-of select="'verchange'" />                                
+                            </xsl:if>
+                        </xsl:attribute>              
+                        <span>              
+                            <xsl:value-of select="@rightVersion" />
+                        </span>
+                   <!-- 
+                        <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != '' and @rightStatus = 'Stable'">
+                            <br/><b title='A stable API changed version.' class='bigwarn'>(changed)</b>
+                        </xsl:if>
+                        <xsl:if test ="@rightStatus = 'Draft' and @rightVersion != $rightVer">
+                            <br/><b title='A draft API has the wrong version.' class='bigwarn'>(should be <xsl:value-of select="$rightVer"/>)</b>
+                        </xsl:if>
+                        <xsl:if test="@leftStatus = 'None' and @rightVersion = ''">
+                        	<br/><b title='A new API was introduced that was not tagged.' class='bigwarn'>(untagged)</b>
+                        </xsl:if>
+                     -->
+                    </span>
+                </td>
+                </xsl:if>
+            </tr>
+        </xsl:for-each>
+    </table>
+  </xsl:template>
+  
+</xsl:stylesheet>
+
+
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/docs/genreport_xml.xslt b/release/java/src/com/ibm/icu/dev/tools/docs/genreport_xml.xslt
new file mode 100644
index 0000000..fb01b15
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/docs/genreport_xml.xslt
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+*******************************************************************************
+* Copyright (C) 2008-2010, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+* This is the XSLT for the API Report, XML style
+*/
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<!--
+  <xsl:param name="leftStatus" />
+  <xsl:param name="rightStatus" />
+-->
+  <xsl:param name="leftVer" />
+  <xsl:param name="rightVer" />
+  <xsl:param name="dateTime" />
+  <xsl:param name="nul" />
+
+  <xsl:param name="ourYear" />
+  
+
+  <xsl:template match="/">
+    <xsl:comment>
+      Copyright (C)  <xsl:value-of select="$ourYear" />, International Business Machines Corporation, All Rights Reserved. 
+    </xsl:comment>
+    <changeReport>
+      <identity>
+	<xsl:attribute name="left">
+	   <xsl:value-of select="$leftVer"/>
+	</xsl:attribute>
+	<xsl:attribute name="right">
+	  <xsl:value-of select="$rightVer" />
+	</xsl:attribute>
+	<xsl:attribute name="generated-date">
+	  <xsl:value-of select="$dateTime" />
+	</xsl:attribute>
+      </identity>
+
+      <!-- <link rel="stylesheet" href="icu4c.css" type="text/css" /> -->
+
+      <functions name="removed">
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@rightStatus=$nul]"/>
+        </xsl:call-template>
+      </functions>
+
+      <functions name="deprecated">
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[(@rightStatus='Deprecated' and @leftStatus!='Deprecated') or (@rightStatus='Obsolete' and @leftStatus!='Obsolete')]"/>
+        </xsl:call-template>
+      </functions>
+
+      <functions name="changed">
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[(@leftStatus != $nul) and (@rightStatus != $nul) and ( (@leftStatus != @rightStatus) or (@leftVersion != @rightVersion) )]"/>
+        </xsl:call-template>
+      </functions>
+
+      <functions name="promoted">
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@leftStatus != 'Stable' and  @rightStatus = 'Stable']"/>
+        </xsl:call-template>
+      </functions>
+    
+      <functions name="added">
+        <xsl:call-template name="genTable">
+            <xsl:with-param name="nodes" select="/list/func[@leftStatus=$nul]"/>
+        </xsl:call-template>
+      </functions>
+
+      <functions name="draft">
+        <xsl:call-template name="infoTable">
+            <xsl:with-param name="nodes" select="/list/func[@rightStatus = 'Draft' and @rightVersion != $rightVer]"/>
+        </xsl:call-template>
+      </functions>
+
+    </changeReport>
+  </xsl:template>
+
+  <xsl:template name="genTable">
+    <xsl:param name="nodes" />
+    <table class='genTable' BORDER="1">
+    <THEAD>
+        <tr>
+            <th> <xsl:value-of select="'File'" /> </th>
+            <th> <xsl:value-of select="'API'" /> </th>
+            <th> <xsl:value-of select="$leftVer" /> </th>
+            <th> <xsl:value-of select="$rightVer" /> </th>
+        </tr>
+    </THEAD>
+
+        <xsl:for-each select="$nodes">
+            <xsl:sort select="@file" />
+            
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="'row'"/>
+                    <xsl:value-of select="(position() mod 2)"/>
+                    <!-- 
+                    <xsl:choose>
+                        <xsl:when test="(position() mod 2) = 0"><xsl:value-of select="row0" /></xsl:when>
+                        <xsl:otherwise><xsl:value-of select="row1" /></xsl:otherwise>
+                    </xsl:choose>
+                    -->
+                </xsl:attribute>
+                <td class='file'> <xsl:value-of select="@file" /> </td>
+                <td class='proto'> <xsl:value-of select="@prototype" /> </td>
+                <td>
+                    <xsl:attribute name="class">
+                        <xsl:if test ="@leftStatus = 'Stable'">
+                                <xsl:value-of select="'stabchange'" />
+                        </xsl:if>
+                    </xsl:attribute>
+                   	<xsl:if  test = "@leftStatus = 'Draft' and @rightStatus = 'Stable' and @leftVersion = @rightVersion">
+	                    <xsl:attribute name="colspan">
+       	            		2
+       	            	</xsl:attribute>
+	                    <xsl:attribute name="align">
+       	            		center
+       	            	</xsl:attribute>
+                   	</xsl:if>
+                
+                    <xsl:value-of select="@leftStatus" /><xsl:if  test = "@leftStatus = 'Draft' and @rightStatus = 'Stable' and @leftVersion = @rightVersion">&gt;Stable</xsl:if>
+                    <br/> <xsl:value-of select="@leftVersion" />
+                </td>
+           	<xsl:if  test = "@leftStatus != 'Draft' or @rightStatus != 'Stable' or @leftVersion != @rightVersion">
+                <td> <xsl:value-of select="@rightStatus" /> 
+                    <br/> 
+                    <span>
+                        <xsl:attribute name="class">
+                            <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != ''">
+                                <xsl:value-of select="'verchange'" />                                
+                            </xsl:if>
+                        </xsl:attribute>              
+                        <span>              
+                            <xsl:value-of select="@rightVersion" />
+                        </span>
+                        <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != '' and @rightStatus = 'Stable'">
+                            <br/><b title='A stable API changed version.' class='bigwarn'>(changed)</b>
+                        </xsl:if>
+                        <xsl:if test ="@rightStatus = 'Draft' and @rightVersion != $rightVer">
+                            <br/><b title='A draft API has the wrong version.' class='bigwarn'>(should be <xsl:value-of select="$rightVer"/>)</b>
+                        </xsl:if>
+                        <xsl:if test="@leftStatus = 'None' and @rightVersion = ''">
+                        	<br/><b title='A new API was introduced that was not tagged.' class='bigwarn'>(untagged)</b>
+                        </xsl:if>
+                    </span>
+                </td>
+           </xsl:if>
+            </tr>
+        </xsl:for-each>
+    </table>
+  </xsl:template>
+  
+    <xsl:template name="infoTable">
+    <xsl:param name="nodes" />
+    <table class='genTable' BORDER="1">
+    <THEAD>
+        <tr>
+            <th> <xsl:value-of select="'File'" /> </th>
+            <th> <xsl:value-of select="'API'" /> </th>
+            <th> <xsl:value-of select="$leftVer" /> </th>
+            <th> <xsl:value-of select="$rightVer" /> </th>
+        </tr>
+    </THEAD>
+
+        <xsl:for-each select="$nodes">
+            <xsl:sort select="@file" />
+            
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="'row'"/>
+                    <xsl:value-of select="(position() mod 2)"/>
+                    <!-- 
+                    <xsl:choose>
+                        <xsl:when test="(position() mod 2) = 0"><xsl:value-of select="row0" /></xsl:when>
+                        <xsl:otherwise><xsl:value-of select="row1" /></xsl:otherwise>
+                    </xsl:choose>
+                    -->
+                </xsl:attribute>
+                <td class='file'> <xsl:value-of select="@file" /> </td>
+                <td class='proto'> <xsl:value-of select="@prototype" /> </td>
+                <td>
+                    <xsl:attribute name="class">
+                        <xsl:if test ="@leftStatus = 'Stable'">
+                                <xsl:value-of select="'stabchange'" />
+                        </xsl:if>
+                    </xsl:attribute>
+                    
+                   	<xsl:if  test = "@leftStatus = @rightStatus and @leftVersion = @rightVersion">
+	                    <xsl:attribute name="colspan">
+       	            		2
+       	            	</xsl:attribute>
+	                    <xsl:attribute name="align">
+       	            		center
+       	            	</xsl:attribute>
+                   	</xsl:if>
+               
+                    <xsl:value-of select="@leftStatus" />
+                    <br/> <xsl:value-of select="@leftVersion" />
+                </td>
+                <xsl:if test = "@leftStatus != @rightStatus or @leftVersion != @rightVersion">
+                <td> <xsl:value-of select="@rightStatus" /> 
+                    <br/> 
+                    <span>
+                        <xsl:attribute name="class">
+                            <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != ''">
+                                <xsl:value-of select="'verchange'" />                                
+                            </xsl:if>
+                        </xsl:attribute>              
+                        <span>              
+                            <xsl:value-of select="@rightVersion" />
+                        </span>
+                   <!-- 
+                        <xsl:if test ="@leftVersion != @rightVersion and @leftVersion != '' and @rightVersion != '' and @rightStatus = 'Stable'">
+                            <br/><b title='A stable API changed version.' class='bigwarn'>(changed)</b>
+                        </xsl:if>
+                        <xsl:if test ="@rightStatus = 'Draft' and @rightVersion != $rightVer">
+                            <br/><b title='A draft API has the wrong version.' class='bigwarn'>(should be <xsl:value-of select="$rightVer"/>)</b>
+                        </xsl:if>
+                        <xsl:if test="@leftStatus = 'None' and @rightVersion = ''">
+                        	<br/><b title='A new API was introduced that was not tagged.' class='bigwarn'>(untagged)</b>
+                        </xsl:if>
+                     -->
+                    </span>
+                </td>
+                </xsl:if>
+            </tr>
+        </xsl:for-each>
+    </table>
+  </xsl:template>
+  
+</xsl:stylesheet>
+
+
+
+
diff --git a/release/java/src/com/ibm/icu/dev/tools/misc/NonAsciiFileDetector.java b/release/java/src/com/ibm/icu/dev/tools/misc/NonAsciiFileDetector.java
new file mode 100644
index 0000000..a249779
--- /dev/null
+++ b/release/java/src/com/ibm/icu/dev/tools/misc/NonAsciiFileDetector.java
@@ -0,0 +1,168 @@
+/*
+ **********************************************************************
+ * Copyright (c) 2008-2010, International Business Machines
+ * Corporation and others.  All Rights Reserved.
+ **********************************************************************
+ */
+package com.ibm.icu.dev.tools.misc;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+import java.util.Vector;
+
+public class NonAsciiFileDetector
+{
+	
+	private static boolean VERBOSE = false;
+	
+    public static class ICUSourceFileFilter implements FilenameFilter
+    {
+    	int matched = 0;
+    	int skipped = 0;
+        public boolean accept(File dir, String name) 
+        {
+            boolean doAccept = name.endsWith(".cpp") || name.endsWith(".c") || name.endsWith(".h") || name.endsWith(".java");
+            if(doAccept) {
+            	matched++;
+            } else {
+            	skipped++;
+            }
+            return doAccept;
+        }
+        public String stats() {
+        	return "Checked " + matched + " files and skipped " + skipped + " files";
+        }
+    }
+
+    public static int isNonAscii(File file) throws IOException
+    {
+        BufferedReader in = new BufferedReader(new FileReader(file));
+        int line = 0;
+        while (true) {
+            String str = in.readLine();
+            if (str == null) {
+                in.close();
+                return -1;
+            }
+            for (int i = 0; i < str.length(); i ++) {
+                if (str.charAt(i) > 0x7f || str.charAt(i)==0x07) {
+                    System.out.println("Ascii test failed in " 
+                                       + file.getAbsolutePath() + " line "
+                                       + line + " string\n" + str);
+                    // non-latin1
+                    in.close();
+                    return line;
+                }
+            }
+            line ++;
+        }
+    }
+    
+    public static void listFiles(File file, 
+                                 FilenameFilter filter,
+                                 Vector<File> list) throws IOException 
+    {
+    	if(VERBOSE) System.err.println(" .. checking " + file.getPath() );
+        File files[] = file.listFiles();
+        if (files != null && files.length > 0) {
+            for (int i = 0; i < files.length; i ++) {
+                if (files[i].isDirectory()) {
+                	if(files[i].getAbsolutePath().equals(files[i].getCanonicalPath())) {
+                		if(!files[i].getName().equals(".svn")) { // skip .svn dirs
+                			listFiles(files[i], filter, list);          
+                		}
+                	} else {
+                		if(VERBOSE) {
+                			System.err.println("..    skipping symlink " + files[i].getPath());
+                		}
+                	}
+                }
+                else {
+                    if (filter.accept(file, files[i].getName())) {
+                        list.add(files[i]);
+                    }
+                }
+            }
+        }
+    }
+
+    public static Map<String, Integer> getNonAsciiFiles(File directory, 
+                                            FilenameFilter filter)
+                                            throws IOException
+    {
+        Vector<File> files = new Vector<File>();
+        Map<String,Integer> result = new TreeMap<String,Integer>();
+        listFiles(directory, filter, files);
+        int filecount = files.size();
+        if (filecount == 0) {
+            return null;
+        }
+        for (int i = 0; i < filecount; i ++) {
+             int isnonascii = isNonAscii(files.elementAt(i));
+             if (isnonascii != -1) {
+            	 result.put(files.elementAt(i).getAbsolutePath(),new Integer(isnonascii));
+             }
+        }
+        return result;
+    }
+
+    public static void main(String arg[])
+    {
+    	int nextArg = 0;
+    	for(nextArg = 0;nextArg<arg.length && arg[nextArg].startsWith("-");nextArg++) {
+    		if(arg[nextArg].equals("-v")) {
+    			VERBOSE=true;
+    			System.err.println(" .. verbose mode.");
+    		}
+    	}
+    	if(nextArg == arg.length) {
+    		System.err.println(NonAsciiFileDetector.class.getSimpleName()+": error, no directories specified!");
+    	}
+    	int bad=0;
+    	for(;nextArg<arg.length;nextArg++){
+	        try {
+	        	ICUSourceFileFilter isff = new ICUSourceFileFilter();
+	        	File dir = new File(arg[nextArg]);
+	            if(!dir.isDirectory()) {
+	            	throw new FileNotFoundException("Not a directory: " + dir.getAbsolutePath());
+	            }
+	            Map<String, Integer> nonascii = getNonAsciiFiles(dir, isff);
+	            boolean noised = false;
+	            System.out.println();
+	            if (nonascii != null && nonascii.size() > 0) {
+	                for (Entry<String, Integer> e : nonascii.entrySet()) {
+	                     if(!noised) {
+	                    	 System.out.println("Non ascii files in  " + arg[nextArg] + ": ");
+	                    	 noised = true;
+	                     }
+	                     System.out.println("" 
+	                            +e.getKey() + ":" 
+	                            +e.getValue());
+	                     bad++;
+	                }
+	            } else {
+//	            	if (VERBOSE==true) {
+	            		System.out.println("No non ascii files in " + arg[nextArg]);
+//	            	}
+	            }
+//	            if(VERBOSE==true) {
+	            	System.out.println( isff.stats());
+//	            }
+	        } catch (IOException e) {
+	        	System.err.println("Error processing " + arg[nextArg]);
+	        	e.printStackTrace();
+	        }
+    	}
+    	if(bad>0) {
+    		System.err.println(bad+" non-ascii files found in total.");
+    	}	
+    }
+}
+             
diff --git a/scripts/cpysearch/cpyscan.pl b/scripts/cpysearch/cpyscan.pl
new file mode 100755
index 0000000..b386bfd
--- /dev/null
+++ b/scripts/cpysearch/cpyscan.pl
@@ -0,0 +1,25 @@
+#!/usr/bin/perl -w
+#  ***********************************************************************
+#  * COPYRIGHT:
+#  * Copyright (c) 2002-2007, International Business Machines Corporation
+#  * and others. All Rights Reserved.
+#  ***********************************************************************
+# 
+#  Search for and list files which don't have a copyright notice, and should.
+#
+use strict;
+
+my $icuSource = $ARGV[0];
+my $ignore = "data/out/build|CVS|\\.svn|\\~|\\#|Debug|Release|\\.dll|\\.ilk|\\.idb|\\.pdb|\\.dsp|\\.dsw|\\.opt|\\.ncb|\\.vcproj|\\.sln|\\.suo|\\.cvsignore|\\.cnv|\\.res|\\.icu|\\.exe|\\.obj|\\.bin|\\.exp|\\.lib|\\.out|\\.plg|positions|unidata|\\.jar|\\.spp|\\.stub|\\.policy|\\.otf|\\.ttf|\\.TTF";
+
+my $command = "find $icuSource -type f | fgrep -v -f cpyskip.txt";
+my @files = `$command`;
+@files = grep(!/$ignore/, @files);
+my $file;
+foreach $file (@files) {
+  chomp $file;
+  my @lines = `head -n 20 "$file"`;
+  if (grep(/copyright.*(international|ibm)/i, @lines) == 0) {
+    print "$file\n";
+  }
+}
diff --git a/scripts/cpysearch/cpysearch.pl b/scripts/cpysearch/cpysearch.pl
new file mode 100755
index 0000000..8130f93
--- /dev/null
+++ b/scripts/cpysearch/cpysearch.pl
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+#  ***********************************************************************
+#  * COPYRIGHT:
+#  * Copyright (c) 2002-2009, International Business Machines Corporation
+#  * and others. All Rights Reserved.
+#  ***********************************************************************
+#
+# Search for files modified this year, that need to have copyright indicating
+# this current year on them.
+#
+use strict;
+
+my $icuSource = $ARGV[0];
+die "Can't open ICU dir: $icuSource" unless  -d $icuSource ;
+
+my $ignore = "CVS|\\.svn|\\~|\\#|Debug|Release|\\.dll|\\.ilk|\\.idb|\\.pdb|\\.dsp|\\.dsw|\\.opt|\\.ncb|\\.vcproj|\\.sln|\\.suo|\\.cvsignore|\\.cnv|\\.res|\\.icu|\\.exe|\\.obj|\\.bin|\\.exp|\\.lib|\\.out|\\.plg|positions|unidata|\\.jar|\\.spp|\\.stub|\\.policy|\\.ttf|\\.TTF|\\.otf";
+
+my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime;
+$year += 1900;
+if ( ! -f "cpyskip.txt" ) {
+	die "Can't open cpyskip.txt, please download from http://source.icu-project.org/cpyskip.txt (see http://site.icu-project.org/processes/copyright-scan for more details)"
+}
+my $command = "find $icuSource -type f -mtime -$yday | fgrep -v -f cpyskip.txt";
+my @files = `$command`;
+@files = grep(!/$ignore/, @files);
+my $file;
+foreach $file (@files) {
+  chomp $file;
+  my @lines = `head -n 20 "$file"`;
+  if (grep(/copyright.*$year/i, @lines) == 0) {
+    print "$file\n";
+  }
+}
diff --git a/scripts/cpysearch/readme.txt b/scripts/cpysearch/readme.txt
new file mode 100644
index 0000000..487de7f
--- /dev/null
+++ b/scripts/cpysearch/readme.txt
@@ -0,0 +1,18 @@
+Copyright (c) 2002-2009, International Business Machines Corporation and others. All Rights Reserved.
+
+cpysearch.pl is a perl script used to detect the files that might not have the copyright notice. Best when used on windows on a clean checkout. Edit $icuSource to your path. If you are working on other platform, you probably want to edit $ignore to reflect different temporary files that you don't want in the scan. The result will be the list of files that don't have word copyright (case ignored) in first 10 lines. Look at them and fix if needed. 
+
+cpysearch.pl  searches for files modified this year that don't have the
+  correct year copyright (i.e. 'copyright 1995') 
+
+cpyscan.pl    searches for all files that don't have any copyright
+
+cpyskip.txt  is part of the ignore list. Download the latest from
+   http://source.icu-project.org/cpyskip.txt
+
+more docs on copyright scan at:
+   http://site.icu-project.org/processes/copyright-scan
+
+
+Have fun!
+weiv
diff --git a/trac/IcuCodeTools/icucodetools/__init__.py b/trac/IcuCodeTools/icucodetools/__init__.py
new file mode 100755
index 0000000..82d6756
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+#
+#
+#from icutracxtn.web_ui import *
diff --git a/trac/IcuCodeTools/icucodetools/dcut.py b/trac/IcuCodeTools/icucodetools/dcut.py
new file mode 100755
index 0000000..0b7486f
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/dcut.py
@@ -0,0 +1,151 @@
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+
+import re
+
+from trac.core import *
+from trac.util import Markup
+from trac.web import IRequestHandler
+from trac.web.chrome import add_stylesheet, INavigationContributor, \
+                            ITemplateProvider
+from trac.web.href import Href
+#from trac.versioncontrol.web_ui.changeset import IChangesetRangeLink
+from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider, \
+                      Formatter
+
+
+class DcutModule(Component):
+
+    implements(IRequestHandler)
+#    implements(IRequestHandler,IChangesetRangeLink)
+
+    def revision_range_link(self, req, base, start, end):
+        return ('DCUT Helper', req.href('dcut',old_path=base,new_path=base,old=start,new=end))
+
+    _request_re = re.compile(r"/dcut(?:/([^/]+))?(/.*)?$")
+
+    def match_request(self, req):
+        match = re.match(self._request_re, req.path_info)
+        if match:
+            return True
+
+    def process_request(self, req):
+
+        idx = 0
+        # srl
+#        show_files = self.timeline_show_files
+        db = self.env.get_db_cnx()
+        ticketlist = {}  # dict of ticket->???
+        revlist = {} # dict of revision->
+        # well. check it again,.
+            
+        srldebug=False
+        
+        repos = self.env.get_repository(req.authname)
+        
+        new_path = req.args.get('new_path')
+        new_rev = req.args.get('new')
+        old_path = req.args.get('old_path')
+        old_rev = req.args.get('old')
+
+        new_path = repos.normalize_path(new_path)
+        new_rev = repos.normalize_rev(new_rev)
+        old_path = repos.normalize_path(old_path)
+        old_rev = repos.normalize_rev(old_rev)
+
+        old_rev = int(old_rev)
+        new_rev = int(new_rev)
+        
+        req.hdf['changeset.diff_href'] = req.href('changeset',old_path=old_path,new=new_rev,new_path=new_path,old=old_rev)
+
+        req.hdf['is_dcut']=1
+        
+        req.hdf['changeset.old_rev'] = old_rev
+        req.hdf['changeset.new_rev'] = new_rev
+        req.hdf['changeset.old_path'] = old_path
+        req.hdf['changeset.new_path'] = new_path
+
+        if True:
+            req.hdf['target_path'] = '.';
+            # okay. manually tromp through 'em
+            nrev = old_rev+1
+            while nrev <= new_rev:
+                chgset = repos.get_changeset(nrev)
+                message = chgset.message or '--'
+                # can we load a ticket from it?
+                splits=message.split(':')
+                if message.startswith('ticket:') and len(splits)>2:
+                    tickname=splits[1]
+                    try:
+                        ticknum=int(tickname)
+                    except Exception,e:
+                        nrev = nrev+1
+                        continue
+                    # yes, we have a ticket #
+                    files=[]
+                    for chg in chgset.get_changes():
+                        if not chg[0].startswith(old_path):
+                            continue
+                        files.append(chg)
+                    if len(files)==0:
+                        nrev = nrev+1
+                        continue # no relevant files
+                    titem=(ticknum,files,chgset)
+                    if ticknum in ticketlist:
+                        ticketlist[ticknum].append( titem )
+                    else:
+                        ticketlist[ticknum]=[ titem ]
+                    revlist[nrev]=titem
+                else:
+                    print "malformed ticket? %s at %d" % (message,nrev) # don't know the syntax for die..
+                nrev = nrev+1
+            if len(ticketlist):
+                tickets=ticketlist.keys()
+                tickets.sort()
+                for ticket in tickets:
+                    aticket=ticketlist[ticket]  # (ticket,files,chg)
+                    cmt = 'ticket:%d - %d revs: ' % (ticket,len(aticket))
+                    for rev in aticket:
+                        revn = rev[2].rev
+                        filecount = len(rev[1])
+                        cmt = cmt + 'r%d - %d files (' % (revn,filecount)
+                        for file in rev[1]:
+                            cmt = cmt + file[0] + ' '
+                        cmt = cmt + ') '
+                    req.hdf['tickets.%d.comment' % ticket] = wiki_to_oneliner(cmt, self.env, db,  shorten=False)
+                    req.hdf['tickets.%d.number' % ticket] = ticket
+            if len(revlist):
+                revs=revlist.keys()
+                revs.sort()
+                for rev in revs:
+                    arev=revlist[rev]  # (ticket,files,chg)
+                    cmt = 'r%d ticket:%d ' % (arev[2].rev,arev[0])
+                    filecount = len(arev[1])
+                    cmt = cmt + ' - %d files (' % filecount
+                    shortfiles=''
+                    j = 0
+                    for file in arev[1]:
+                        req.hdf['revs.%d.files.%d.path' % (rev,j)] = file[0]
+                        req.hdf['revs.%d.files.%d.kind' % (rev,j)] = file[1]
+                        req.hdf['revs.%d.files.%d.change' % (rev,j)] = file[2]
+                        shortpath=file[0][len(old_path)+1:]
+                        req.hdf['revs.%d.files.%d.shortpath' % (rev,j)] = shortpath
+                        cmt = cmt + file[0] + ' '
+                        shortfiles = shortfiles + ' ' + shortpath
+                        j=j+1
+                    cmt = cmt + ') '
+                    req.hdf['revs.%d.comment' % rev] = wiki_to_oneliner(cmt, self.env, db,  shorten=False)
+                    req.hdf['revs.%d.number' % rev] = rev
+                    req.hdf['revs.%d.shortfiles' % rev] = shortfiles
+                    req.hdf['revs.%d.backnumber' % rev] = (rev-1)
+                    req.hdf['revs.%d.ticket' % rev] = arev[0]
+
+
+#        if isinstance(template, basestring):
+#            req.hdf['admin.page_template'] = template
+#        else:
+#            req.hdf['admin.page_content'] = Markup(template.render())
+
+        content_type = "text/html"
+        add_stylesheet(req, 'css/icuxtn.css')
+        return 'dcut.cs', content_type
+
diff --git a/trac/IcuCodeTools/icucodetools/htdocs/css/icuxtn.css b/trac/IcuCodeTools/icucodetools/htdocs/css/icuxtn.css
new file mode 100644
index 0000000..afe0903
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/htdocs/css/icuxtn.css
@@ -0,0 +1,30 @@
+/* Copyright (C) 2010 International Business Machines Corporation and Others. All Rights Reserved. */
+
+/* @override http://unicode.org/cldr/trac/chrome/icucodetools/css/icuxtn.css */
+
+
+table.icureview {
+	border-collapse: collapse;
+	border:  1px solid gray;
+}
+
+table.icureview th, table.icureview td {
+	text-align: left;
+	border:  1px solid gray;
+	padding:  2px;
+}
+
+table.icureview thead th {
+	font-weight: bold;
+}
+
+table.icureview td.changes {
+	text-align: right;
+}
+
+table.icureview td.overall  {
+	background-color: silver;
+	font-style: italic;
+	text-align: right;
+}
+
diff --git a/trac/IcuCodeTools/icucodetools/review.py b/trac/IcuCodeTools/icucodetools/review.py
new file mode 100755
index 0000000..9cbf649
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/review.py
@@ -0,0 +1,296 @@
+# Copyright (C) 2007-2010 International Business Machines Corporation and Others. All Rights Reserved.
+
+# Review module.
+# TODO: refactor ticket manipulation items into ticketmgr.
+
+import re
+
+from trac.core import Component, implements
+from trac.core import ComponentManager
+from trac.core import TracError
+from trac.util import Markup
+from trac.web import IRequestHandler
+from trac.web.chrome import add_stylesheet, ITemplateProvider, add_ctxtnav
+from trac.versioncontrol import Changeset
+from trac.web.api import IRequestFilter
+from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider
+            
+from genshi.builder import tag
+#from trac.env import IEnvironmentSetupParticipant
+from trac.perm import IPermissionRequestor
+from trac.config import ListOption
+from icucodetools.ticketmgr import TicketManager
+from pkg_resources import resource_filename #@UnresolvedImport
+
+class ReviewModule(Component):
+
+    implements(ITemplateProvider, IRequestFilter, IRequestHandler, IPermissionRequestor)
+
+    # path to match for review
+    path_match = re.compile(r'/icureview/([0-9]+)')
+
+    voteable_paths = ListOption('icucodetools', 'paths', '/ticket*',
+        doc='List of URL paths to show reviews on. Globs are supported.')
+
+    # IPermissionRequestor methods
+    def get_permission_actions(self):
+        return ['ICUREVIEW_VIEW']
+
+    # ITemplateProvider methods
+    def get_templates_dirs(self):
+        return [resource_filename(__name__, 'templates')]
+
+    def get_htdocs_dirs(self):
+        return [('icucodetools', resource_filename(__name__, 'htdocs'))]
+
+    # IRequestFilter methods
+    def pre_process_request(self, req, handler):
+        if 'ICUREVIEW_VIEW' not in req.perm:
+            return handler
+
+        if self.match_ticketpage(req):
+            self.render_reviewlink(req)
+
+        return handler
+
+    def post_process_request(self, req, template, data, content_type):
+        return (template, data, content_type)
+
+    def render_reviewlink(self, req):
+        #add_stylesheet(req, 'icucodetools/css/icuxtn.css')
+
+        els = []
+
+        ticket_mgr = TicketManager(self.compmgr)
+
+        db = self.env.get_db_cnx()
+        repos = self.env.get_repository()
+        if not repos:
+            raise TracError("Could not get repository for %s" % (req.authname))
+
+        revs = ticket_mgr.tkt2revs(self.log, db, repos, req, req.args['ticket'])
+
+        if not revs:
+            str = 'No commits.'
+            li = tag.li(str)
+            els.append(li)
+        else:
+            str = ' %d commits.' % len(revs)
+            href = req.href.review(req.args['ticket'])
+            a = tag.a('Review', href=href)
+            li = tag.li(a + str)
+            els.append(li)            
+        
+        ul = tag.ul(els, class_='review')
+        className = ''
+        title = "Reviews"
+        add_ctxtnav(req, tag.span(tag.object(ul), id='icureview', title=title, class_=className))
+
+
+    def match_request(self, req):
+        match = re.match('/review(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', req.path_info)
+        if match:
+            req.args['ticket'] = match.group(1)
+            return True
+
+    def match_ticketpage(self, req):
+        match = re.match('/ticket(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', req.path_info)
+        if match:
+            req.args['ticket'] = match.group(1)
+            return True
+
+    def changeToRange(self, c_new, change):
+        # q: (u'trunk/Locale.java', 'file', 'add', None, u'-1')  from r3
+        # q: (u'trunk/util.c',      'file', 'edit', u'trunk/util.c', u'2')  from r4
+#        c_path = change[0]
+#        c_itemtype = change[1]
+        c_type = change[2]
+        c_oldpath = change[3]
+        c_old = int(change[4] or -1)
+        if(c_type in (Changeset.COPY,Changeset.MOVE)):
+            return (-1, c_new, c_type, c_old, c_oldpath) # ignore OLD rev for these
+        elif(c_type in (Changeset.DELETE)):
+            return (c_old, -1, c_type)
+        else:
+            return (c_old, c_new, c_type)
+        
+    def describeChange(self, file, change, req, db):
+        what = change[2] or 'change'
+        where = 'r%d:%d' % (change[0],change[1])
+        if(change[0] == -1):
+            if(change[1] == -1):
+                url = None
+                what = "noop"
+                where = None
+            else:
+                #if change[2] == 'add+commits':
+                url = req.href.browser(file, rev=change[1]) # 'add'
+                where = 'r%d' % change[1]
+                what = change[2]
+        elif(change[1] == -1):
+            url = None # deleted
+            what = "deleted"
+            where = None
+        else:
+            url = req.href.changeset(old_path=file, old=change[0], new_path=file, new=change[1])
+        if url:
+            what = Markup('<a href="%s">%s</a>' % (url,what))
+        if where:
+            return (what, tag.a(where, href=req.href.search(q=where)))
+            #return (what, where)
+        else:
+            return (what, '')
+
+
+    def process_request(self, req):
+        #ok, what are we about.
+        #db = self.env.get_db_cnx()
+        #ticketlist = {}  # dict of ticket->???
+        #revlist = {} # dict of revision->
+        repos = self.env.get_repository()
+
+        new_path = req.args.get('new_path')
+        new_rev = req.args.get('new')
+        old_path = req.args.get('old_path')
+        old_rev = req.args.get('old')
+
+        new_path = repos.normalize_path(new_path)
+        new_rev = repos.normalize_rev(new_rev)
+        old_path = repos.normalize_path(old_path)
+        old_rev = repos.normalize_rev(old_rev)
+        
+
+#        if not req.perm.has_permission('TICKET_MODIFY'):
+#            return req.redirect(req.href.browser())
+
+        old_rev = int(old_rev)
+        new_rev = int(new_rev)
+        
+        ticket = req.args.get('ticket')
+        try:
+            ticket = int(ticket)
+        except Exception:
+            ticket = 0
+#        req.hdf['review.ticket'] = ticket
+#        req.hdf['review.tickethtml'] = tag.a(ticket, req.href.ticket(ticket))
+
+        data = {}
+
+        data['overall_y'] = 0
+        data['ticket_id'] = req.args['ticket']
+        data['ticket_href'] = req.href.ticket(req.args['ticket'])
+
+        ticket_mgr = TicketManager(self.compmgr)
+
+        db = self.env.get_db_cnx()
+        repos = self.env.get_repository()
+
+        revs = ticket_mgr.tkt2revs(self.log, db, repos, req, req.args['ticket'])
+        
+        if (not revs or len(revs)==0):
+            # nothing to review. shouldn't happen
+            return ('nothing.html', data, 'text/html')
+        elif(len(revs)==1):
+            # only one change - just do a changeset view
+            return req.redirect(req.href.changeset(revs[0]))
+
+        revcount = 0
+        branches = {}
+        files = {}
+        # may be 0 revs.
+        revisions = []
+        
+        for rev in revs:
+            chgset = repos.get_changeset(rev)
+            # q: (u'trunk/Locale.java', 'file', 'add', None, u'-1')  from r3
+            # q: (u'trunk/util.c', 'file', 'edit', u'trunk/util.c', u'2')  from r4
+            message = chgset.message or '--'
+            revcount = revcount + 1
+            revision = {}
+            revision['rev'] =  tag.a(rev, req.href.changeset(rev))
+            revision['num'] =  rev
+            revision['comment'] =  message #wiki_to_oneliner( message, self.env, db, shorten=False )
+            for chg in chgset.get_changes():
+                path = chg[0]
+                if path in files:
+                    item = files[path]
+                else:
+                    item = []
+                    files[path] = item;
+                item.append(self.changeToRange(rev,chg))
+            revisions.append(revision)
+        data['revisions'] = revisions
+        
+        if(revcount > 0):
+            data['revcount'] = revcount
+        
+        # print "files: %d" % len(files)
+        # go throuhg each file and calculate its minimum range
+        filelist = files.keys()
+        filelist.sort()
+#        print 'bar to %d len of %s' % (len(filelist),str(filelist))
+        for file in filelist:
+            changes = files[file]
+            i = 0
+#            print " looping from %d to %d over %d " % (i,len(changes)-1,len(changes))
+            while len(changes)>1 and i<(len(changes)-1):
+                if changes[i][1] == changes[i+1][0]:
+                    if changes[i][0] == -1:
+                        changes[i+1] = (changes[i][0],changes[i+1][1],'add+commits') # retain 'first' rev
+                    else:
+                        changes[i+1] = (changes[i][0],changes[i+1][1],'multiple commits') # retain 'first' rev
+
+                    changes = changes[:i] + changes[i+1:] # and shift down
+#                    print "merged: %s" % str(changes)
+                    files[file] = changes
+                else:
+                    i = i + 1
+        
+        # now, write 'em out
+        sera = 0
+        #files_data = []
+        for file in filelist:
+            sera = sera+1
+            file_data = {}
+            file_data['name'] = Markup('<a href="%s">%s</a>' % (req.href.browser(file),file))
+            branch_name = '/'.join(file.split('/')[0:2])
+            #print "branch is: (%s)" % (branch_name)
+            branches_data = branches.get(branch_name, {})
+            files_data = branches_data.get('files',[])
+
+            changes = files[file]
+            cha = 0
+            changes_data = []
+            for change in changes:
+                cha = cha + 1
+#                print "%s output %s " % (file, str(change))
+                changes_data.append(self.describeChange(file, change, req, db))
+            file_data['changes'] = changes_data
+            if(len(changes)>1):
+                whathtml = self.describeChange(file, (changes[0][0], changes[len(changes)-1][1], 'overall'), req, db)
+                file_data['overall'] = whathtml
+                file_data['overall_y'] = 1
+                data['overall_y'] = 1
+            else:
+                file_data['overall_y'] = 0
+            files_data.append(file_data)
+            # sets
+            branches_data['files'] = files_data
+            branches_data['len'] = len(files_data)
+            branches_data['name'] = branch_name
+            branches[branch_name] = branches_data
+        #data['files'] = files_data
+        #data['branches'] = branches
+
+        # .. convert dict to array.
+        branch_list = []
+        for branch in branches:
+            branch_list.append(branches[branch])
+        data['branches'] = branch_list
+        data['lastbranch'] = branch
+        data['branchcount'] = len(branches)
+        
+        content_type = "text/html"
+        add_stylesheet(req, 'icucodetools/css/icuxtn.css')
+        return 'review.html', data, content_type
+
diff --git a/trac/IcuCodeTools/icucodetools/templates/nothing.html b/trac/IcuCodeTools/icucodetools/templates/nothing.html
new file mode 100644
index 0000000..6fa9ee4
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/templates/nothing.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:py="http://genshi.edgewall.org/"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="layout.html" />
+  <head>
+    <title>Nothing to Review for ticket #${ticket_id}</title>
+  </head>
+
+  <body>
+    <div id="ctxtnav" class="nav"></div>
+
+    <div id="content" class="icucodereview">
+      <h1>Nothing to review!</h1>
+      <p>
+      	Nothing to review - no changesets in ticket <a href="${ticket_href}">#${ticket_id}</a>
+      </p>
+    </div>
+  </body>
+</html>
diff --git a/trac/IcuCodeTools/icucodetools/templates/review.html b/trac/IcuCodeTools/icucodetools/templates/review.html
new file mode 100644
index 0000000..d86205e
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/templates/review.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:py="http://genshi.edgewall.org/"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="layout.html" />
+  <head>
+    <title>Review for ticket #${ticket_id}</title>
+  </head>
+
+  <body>
+    <div id="ctxtnav" class="nav"></div>
+
+    <div id="content" class="icucodereview">
+
+ <h1>Ticket <a href='${href.ticket(ticket_id)}'>#${ticket_id}</a></h1>
+
+<py:if test="revcount">
+
+<h2>${revcount} Changesets</h2>
+<ul>
+<py:for each="rev in revisions">
+    <li><a href="${href.changeset(rev.num)}">r${rev.num}</a> &mdash; ${rev.comment}</li>
+</py:for>
+</ul>
+
+<py:if test="branchcount > 1">
+<h2>Files</h2>
+<h3>Jump to Sections</h3>
+<ul>
+<py:for each="branch in branches">
+  <li><a href="#${branch.name}">${branch.name}</a> &mdash; ${branch.len} files</li>
+</py:for>
+</ul>
+</py:if>
+
+<py:for each="branch in branches">
+<hr/>
+<a name="${branch.name}">
+  <h3>
+        <a href="${href.browser(branch.name)}">${branch.name}</a> &mdash; (${branch.len} files changed)
+  </h3>
+</a>
+
+<style type='text/css'>
+
+
+</style>
+
+<blockquote>
+
+<table class='icureview'>
+<thead>
+<tr>
+ <th>File</th>
+ <th>Changes</th>
+ <th>Details</th>
+ <py:if test="overall_y > 0"> 
+  <th>Overall<br/><i>(including other changes)</i></th>
+  <th>Details</th>
+ </py:if>
+</tr>
+</thead>
+<tbody>
+<py:for each="file in branch.files">
+ <tr>
+    <th class='name'>${file.name}</th>
+    <td class='changes'>
+      <py:for each="change in file.changes">
+        ${change[0]}<br/>
+      </py:for>
+    </td>
+    <td class='details'>
+      <py:for each="change in file.changes">
+        ${change[1]}<br/>
+      </py:for>
+    </td>
+	  
+    <py:if test="overall_y > 0"> 
+     <py:if test="file.overall_y > 0">
+      <td class='overall'>${file.overall[0]}</td>
+      <td class='overall'>${file.overall[1]}</td>
+     </py:if>
+    </py:if>
+  </tr>
+</py:for>
+</tbody>
+</table>
+
+</blockquote>
+
+</py:for>
+
+<hr/>
+
+<div style='display:none;'>
+<h2>Merge Commands</h2>
+Very experimental.  Change ??? to the top of the tree you want to merge from (icu or icu4j)<br/>
+<textarea>svn merge -c <?cs each:rev = revisions ?><?cs var:rev.num ?>,<?cs /each ?> svn+ssh://source.icu-project.org/repos/icu/???/trunk</textarea>
+
+<hr/>
+</div>
+<hr/>
+<iframe src="http://sites.google.com/site/icucodetools/v1/review" width="100%" height="800px">
+<h1><a href="http://sites.google.com/site/icucodetools/v1/review">Help</a></h1>
+</iframe>
+
+</py:if>
+<hr/>
+<i>$Id: $</i>
+</div>
+</body>
+</html>
diff --git a/trac/IcuCodeTools/icucodetools/ticketmgr.py b/trac/IcuCodeTools/icucodetools/ticketmgr.py
new file mode 100755
index 0000000..62e31a5
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/ticketmgr.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+# Author: <srl@icu-project.org>
+#
+
+# 
+# Ticket management.
+# This component manages the revision to ticket map.
+
+
+
+from trac.core import Component, implements, TracError
+from trac.env import IEnvironmentSetupParticipant
+from trac.db import Table, Column, Index, DatabaseManager
+from trac.config import Option
+from trac.util.text import exception_to_unicode
+
+import re
+
+tktmgr_schema = [
+    Table('rev2ticket', key='rev')[         # map rev->ticket
+        Column('rev', type='int'),          # changeset id
+        Column('ticket', type='int'),       # ticket #
+        Index(['ticket'])],                 # index by ticket
+]
+
+class TicketManager(Component):
+    implements(IEnvironmentSetupParticipant)
+#    implements(IEnvironmentSetupParticipant, IRepositoryObserver)
+
+    ticket_pattern = Option('icucodetools', 'ticket_pattern', '^ticket:(\d+)', 
+                            """A regex matching the commit messages. Group 1 must return a number.""")
+    
+    def icu_tktmgr(self):
+        return 1;
+    
+    known_youngest = -1
+
+    def environment_created(self):
+        db = self.env.get_db_cnx()
+        connector, _ = DatabaseManager(self.env)._get_connector()
+        cursor = db.cursor()
+        for table in tktmgr_schema:
+            for stmt in connector.to_sql(table):
+                cursor.execute(stmt)
+
+        cursor.execute("INSERT INTO system (name,value) "
+                       "VALUES ('icu_tktmgr',%s)", (self.icu_tktmgr(),))
+        db.commit()
+        self.log.info('Database update: icu_tktmgr tables version %d ',
+                          self.icu_tktmgr())
+        print 'icucodetools.ticketmgr: Note, first review will take a while.\n'
+    
+    def youngest_rev(self,db):
+        if (self.known_youngest < 0):
+            #print('Did not know youngest value.')
+            cursor = db.cursor()
+            cursor.execute("SELECT value FROM system WHERE name='icu_tktmgr_youngest'")
+            row = cursor.fetchone()
+            if not row:
+                cursor.execute("INSERT INTO system (name,value) "
+                               "VALUES ('icu_tktmgr_youngest','-1')")
+                db.commit()
+                self.known_youngest = -2
+                return -1
+            else:
+                known_youngest = int(row[0])
+                self.known_youngest = known_youngest
+        return self.known_youngest
+        
+    def check_sync(self, log, db, repos):
+        ourYoungest = self.youngest_rev(db)
+        theirYoungest = repos.get_youngest_rev()
+        #log.info("TKT: check_sync %d/%d" % (ourYoungest,theirYoungest))
+        if(ourYoungest <= theirYoungest):
+            self.resync(log, db, repos, ourYoungest, theirYoungest)
+    
+    def environment_needs_upgrade(self, db):
+        cursor = db.cursor()
+        cursor.execute("SELECT value FROM system WHERE name='icu_tktmgr'")
+        row = cursor.fetchone()
+        if not row or int(row[0]) < self.icu_tktmgr():
+            return True
+
+    def upgrade_environment(self, db):
+        cursor = db.cursor()
+        cursor.execute("SELECT value FROM system WHERE name='icu_tktmgr'")
+        row = cursor.fetchone()
+        if not row:
+            self.environment_created()
+        else:
+            self.log.info('Do not know how to upgrade icutraxctn_ticketmgr tables to %d',
+                          self.icu_tktmgr())
+	cursor.close()
+
+    def resync(self, log, db, repos, ourYoungest, theirYoungest):
+        self.log.info('resync: ourYoungest=%d theirYoungest=%d' % (ourYoungest, theirYoungest))
+        if (ourYoungest < 0):
+            # start at rev 1
+            ourYoungest = 1
+        
+        #self.ticket_pattern = self.env.config.get('icucodetools', 'ticket_pattern', '^cldrbug (\d+):')
+
+        #        log.info("Pat: %s" % (self.ticket_pattern))
+        try:
+            self.ticket_match = re.compile(self.ticket_pattern)
+        except Exception, e:
+            found = self.env.config.get('icucodetools', 'ticket_pattern', 'NoneFound')
+            raise TracError('Could not compile icucodetools.ticket_pattern=/%s/ but /%s/: %s' % (self.ticket_pattern, found, exception_to_unicode(e, traceback=True)))
+
+#        self.ticket_match = re.compile(self.ticket_pattern.get())
+#        self.ticket_match = re.compile('.*')
+        for i in range(ourYoungest, theirYoungest+1):
+            #log.warning('syncing: %d [%d/%d+1]', i, theirYoungest)
+            cset = repos.get_changeset(i)
+            self.revision_changed(log, cset, i, db.cursor())
+        db.commit()
+        cursor = db.cursor();
+        cursor.execute("update system set value='%s' where name='icu_tktmgr_youngest'" % (theirYoungest))
+        db.commit()
+        #log.warn("self.known_youngest was %d [%d/%d]" % (self.known_youngest,ourYoungest,theirYoungest)) 
+        # update known youngest.
+        self.known_youngest = theirYoungest
+        #log.warn("self.known_youngest now %d [%d/%d]" % (self.known_youngest,ourYoungest,theirYoungest)) 
+        return
+
+    # IRepositoryObserver methods
+    def revision_changed(self, log, cset, next_youngest, cursor):
+        # sync the 'rev2ticket' table
+        message = cset.message or '--'
+        # can we load a ticket from it?   "ticket:1234: Message"
+        res = self.ticket_match.match(message)
+        if res:
+            tickname = res.group(1)
+            try:
+                int(res.group(1)) # should be int
+            except Exception, e:
+                log.warning('Revision [%s] had unparseable ticket number [%s]: [%s]' %
+                                 (next_youngest, tickname, e))
+                return
+            try:
+		#log.warning('r%s=#%s' % (str(next_youngest), tickname))
+                cursor.execute("INSERT OR IGNORE INTO rev2ticket "
+                               " (rev,ticket) "
+                               "VALUES (%s,%s) ",
+                               (str(next_youngest), tickname))
+            except Exception, e: # *another* 1.1. resync attempt won 
+                log.warning('rev2ticket %s could not cache: %s' %
+                                 (next_youngest, e))
+        else:
+                log.warning('Revision %s had unmatched message %s' %
+                                 (next_youngest, cset.message))
+    
+    def repository_resync(self, cursor):
+        cursor.execute("DELETE FROM rev2ticket");
+        
+    def tkt2revs(self, log, db, repos, req, ticket):
+        """Given a ticket, return a list of revs.
+        """
+        
+        self.check_sync(log, db, repos)
+        cursor = db.cursor()
+        cursor.execute("select rt.rev from rev2ticket as rt where rt.ticket = %d order by rt.rev" % int(ticket))
+        revs = []
+        for rev, in cursor:
+            rev = int(rev)
+            revs.append(rev)
+	cursor.close()
+        return revs
diff --git a/trac/IcuCodeTools/icucodetools/tktlist.py b/trac/IcuCodeTools/icucodetools/tktlist.py
new file mode 100755
index 0000000..a7de496
--- /dev/null
+++ b/trac/IcuCodeTools/icucodetools/tktlist.py
@@ -0,0 +1,171 @@
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+
+import re
+
+import sys
+
+from trac.core import *
+from trac.util import Markup
+from trac.web import IRequestHandler
+from trac.web.chrome import add_stylesheet, INavigationContributor, \
+                            ITemplateProvider
+from trac.web.href import Href
+#from trac.versioncontrol.web_ui.changeset import IChangesetRangeLink
+from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider, \
+                      Formatter
+from trac.ticket import Ticket
+
+
+
+class TicketlistModule(Component):
+
+    implements(IRequestHandler)
+#    implements(IRequestHandler,IChangesetRangeLink)
+
+    def revision_range_link(self, req, base, start, end):
+        return ('Ticket List', req.href('tktlist',old_path=base,new_path=base,old=start,new=end))
+
+    _request_re = re.compile(r"/tktlist(?:/([^/]+))?(/.*)?$")
+
+    def match_request(self, req):
+        match = re.match(self._request_re, req.path_info)
+        if match:
+            return True
+
+    def process_request(self, req):
+        #ok, what are we about.
+        db = self.env.get_db_cnx()
+        ticketlist = {}  # dict of ticket->???
+        revlist = {} # dict of revision->
+        repos = self.env.get_repository(req.authname)
+
+        if not req.perm.has_permission('TICKET_MODIFY'):
+            return req.redirect(req.href.browser())
+
+        # shortcut - if "revs" is set, just use that
+        revs = req.args.get('revs')
+        if revs and len(revs)>0:
+           content_type = "text/html"
+           add_stylesheet(req, 'css/icuxtn.css')
+           req.hdf['tix.revs'] = revs
+           items = revs.split()
+           outstr = '1=0 '
+           for item in items:
+               rev = int(item) # may fail
+               outstr = 'rt.rev=%d'%(rev)
+           req.hdf['is_dcut']=1
+           req.hdf['tix.sql'] = outstr  
+           # test - get relevant revs
+   #        print "otime=%s, ntime=%s"%(type(otime),type(ntime))
+           #cursor.execute("select distinct t.id,t.summary from ticket as t,revision as r, rev2ticket as rt "
+           #               " where t.id = rt.ticket and (%s) order by t.id"%(outstr))
+           allsql = "select distinct ticket from rev2ticket as rt where %s order by rt.ticket"%(outstr)
+           allsql = "select ticket from rev2ticket where rev=%s order by ticket"
+           cursor = db.cursor()
+          # cursor.execute("select ticket from rev2ticket where rev=%s order by ticket",("22913",))
+           cursor.execute("select rt.rev from rev2ticket as rt where rt.ticket = %d order by rt.rev" % int(6010))
+           ticket = 0
+           req.hdf['tix.sql'] = allsql  
+           req.hdf['tix.sql']="zero"
+           for tkt in cursor:
+               req.hdf['tix.sql']=tkt
+               summ = "";
+               #sys.stderr.write(" tkt %s summ %s from (d-d)" % (tkt,summ))
+               ticket = ticket + 1
+               try:
+                   req.hdf['tickets.%d.comment' % ticket] = summ
+                   #req.hdf['tickets.%d.commenthtml' % ticket] = wiki_to_oneliner( summ, self.env, db, shorten=True )
+               except Exception,e:
+                   req.hdf['tix.sql']=e
+                   #req.hdf['tickets.%d.commenthtml' % ticket] = ''
+                   req.hdf['tickets.%d.comment' % ticket] = ''
+               req.hdf['tickets.%d.number' % ticket] = tkt
+               #aa = Markup("<a class=\"new ticket\" href=\"%s\" title=\"Ticket x (new)\">#%s</a>"%(req.href.ticket(tkt),tkt))
+               #req.hdf['tickets.%d.html' % ticket] = aa
+           # set RDF here
+           return 'tktrevs.cs', content_type
+
+        new_path = req.args.get('new_path')
+        new_rev = req.args.get('new')
+        old_path = req.args.get('old_path')
+        old_rev = req.args.get('old')
+
+        new_path = repos.normalize_path(new_path)
+        new_rev = repos.normalize_rev(new_rev)
+        old_path = repos.normalize_path(old_path)
+        old_rev = repos.normalize_rev(old_rev)
+
+
+        old_rev = int(old_rev)
+        new_rev = int(new_rev)
+        
+        req.hdf['changeset.diff_href'] = req.href('changeset',old_path=old_path,new=new_rev,new_path=new_path,old=old_rev)
+
+        req.hdf['is_dcut']=1
+        
+        req.hdf['changeset.old_rev'] = old_rev
+        req.hdf['changeset.new_rev'] = new_rev
+        req.hdf['changeset.old_path'] = old_path
+        req.hdf['changeset.new_path'] = new_path
+        content_type = "text/html"
+        add_stylesheet(req, 'css/icuxtn.css')
+        
+        
+        
+        # first, get relevant changes.
+        req.hdf['target_path'] = '.';
+        # okay. manually tromp through 'em
+        oset = repos.get_changeset(old_rev);
+        nset = repos.get_changeset(new_rev);
+        otime = int(oset.date)
+        ntime = int(nset.date)
+        
+        norm_tr="style='border: 1px dashed green; background-color: #CFC;'"
+        closed_tr="style='color: #666;'"
+        norev_tr="style='background-color:#FDD; border: 1px solid #F99; font-weight: bold;'"
+
+        req.hdf['sample.norm.tr'] = norm_tr
+        req.hdf['sample.closed.tr'] = closed_tr
+        req.hdf['sample.norev.tr'] = norev_tr
+        
+#        print " searching in  (%s-%s)" % (otime, ntime)
+
+        # test - get relevant revs
+        cursor = db.cursor()
+#        print "otime=%s, ntime=%s"%(type(otime),type(ntime))
+        cursor.execute("select distinct t.id,t.summary,t.owner, t.milestone, t.status "
+                       " , c.value "                       
+                       " from ticket as t,revision as r, rev2ticket as rt "
+                       " left join ticket_custom as c "
+                       " on  ( c.name = 'revw' AND c.ticket = t.id ) "
+#                       " , ticket_custom as c "
+                       " where t.id = rt.ticket and rt.rev = r.rev and r.time > %s and r.time <= %s "
+                       "and exists ( select nc.rev from node_change as nc where nc.rev=r.rev and nc.path like %s ) "
+                       "order by t.id", (str(otime), str(ntime), (old_path + "%")))
+        ticket = 0
+        for tkt,summ,ownr,milestone,status, revw in cursor:
+#            print " tkt %s summ %s from (%d-%d)" % (tkt,summ, otime, ntime)
+            ticket = ticket + 1
+            try:
+                req.hdf['tickets.%d.comment' % ticket] = summ
+                req.hdf['tickets.%d.commenthtml' % ticket] = wiki_to_oneliner( summ, self.env, db, shorten=True )
+            except Exception,e:
+                req.hdf['tickets.%d.commenthtml' % ticket] = ''
+                req.hdf['tickets.%d.comment' % ticket] = ''
+            req.hdf['tickets.%d.number' % ticket] = tkt
+            aa = Markup("<a class=\"new ticket\" href=\"%s\" title=\"Ticket x (new)\">#%s</a>"%(req.href.ticket(tkt),tkt))
+            req.hdf['tickets.%d.html' % ticket] = aa
+            aa = Markup("<a class=\"new ticket\" href=\"%s\" title=\"Ticket x (new)\">#%s</a>"%(req.href.ticket(tkt),tkt))
+            req.hdf['tickets.%d.owner' % ticket] = ownr
+            req.hdf['tickets.%d.milestone' % ticket] = wiki_to_oneliner( "milestone:%s"%milestone , self.env, db, shorten=False )
+            req.hdf['tickets.%d.reviewer' % ticket] = revw
+            req.hdf['tickets.%d.statushtml' % ticket] = wiki_to_oneliner( "#%s"%(tkt), self.env, db, shorten=False )
+            req.hdf['tickets.%d.html' % ticket] = aa
+            req.hdf['tickets.%d.tr' % ticket] = norm_tr
+            if status and status.startswith('closed'):
+                req.hdf['tickets.%d.tr' % ticket] = closed_tr
+            if ( not revw ) or len(revw)<1:
+                req.hdf['tickets.%d.tr' % ticket] = norev_tr
+        
+        return 'tktlist.cs', content_type
+
diff --git a/trac/IcuCodeTools/license.html b/trac/IcuCodeTools/license.html
new file mode 100644
index 0000000..7ae0252
--- /dev/null
+++ b/trac/IcuCodeTools/license.html
@@ -0,0 +1,51 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></meta>
+<title>ICU License - ICU 1.8.1 and later</title>
+</head>
+
+<body BGCOLOR="#ffffff">
+<h2>ICU License - ICU 1.8.1 and later</h2>
+
+<p>COPYRIGHT AND PERMISSION NOTICE</p>
+
+<p>
+Copyright (c) 1995-2010 International Business Machines Corporation and others
+</p>
+<p>
+All rights reserved.
+</p>
+<p>
+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, and/or sell
+copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies
+of the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+</p>
+<p>
+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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM,
+OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+USE OR PERFORMANCE OF THIS SOFTWARE.
+</p>
+<p>
+Except as contained in this notice, the name of a copyright holder shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization of the copyright holder.
+</p>
+
+<hr>
+<p><small>
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+</small></p>
+</body>
+</html>
diff --git a/trac/IcuCodeTools/readme.txt b/trac/IcuCodeTools/readme.txt
new file mode 100644
index 0000000..d549d91
--- /dev/null
+++ b/trac/IcuCodeTools/readme.txt
@@ -0,0 +1,74 @@
+ICU Code Tools plugin
+
+Copyright (C) 2010 IBM Corporation and Others. All Rights Reserved.
+See license.html for the license file. This file is part of the
+ICU project and is under the same license.
+
+Requirements:
+	Trac (0.11 or 0.12+?)
+	Repository
+
+Installing:
+	1. install the plugin - at least the ticketmanager and review portion.
+
+         a. There is no source release at this time: I recommend
+             that you check out this code with svn
+             and in this directory, run: 
+                "python setup.py develop"
+	
+	 b. In trac.ini under '[components]' add:
+		icucodetools.review.reviewmodule = enabled
+		icucodetools.ticketmgr.ticketmanager = enabled
+	
+	NOTE: DCUT and TKTLIST parts are not working yet. 
+	Don't bother to enable them.
+
+	2. in your trac.ini describe how your changesets describe a ticket. 
+	Our changesets look like this:  "ticket:1234: fixed the broken code"
+	We use this regex:
+
+	   [icucodetools]
+	   ticket_pattern = ^ticket:(\d+)
+
+	3. you may need to run trac-admin <environment> upgrade 
+
+	4. Grant permission of ICUREVIEW_VIEW to whomever you want to 
+	   be able to review tickets. 
+
+	5. Now, any ticket will have something in the top right corner which says:
+	     "No commits" - no commits against this ticket
+
+	     "Review 1 commits"  - there is only one commit. Clicking this link
+	             will just take you to that single changeset.
+
+	      "Review n commits"  - there are more than one commits against this
+	             ticket.
+
+ 
+Troubleshooting:
+
+Q: My commits aren't being found!
+A: Check the debug log. It will note commits with unparseable messages
+
+Q: How do I resync the commits?
+A: Until we implement trac 0.12 changeset listeners, you can do this:
+
+    0.  back up your path/to/env/db/trac.db
+
+    1. $ sqlite3  path/to/env/db/trac.db
+    
+    2. sqlite> delete from rev2ticket;
+
+    3. sqlite> update system set value='-1' where name='icu_tktmgr_youngest';
+
+    4. sqlite>  .quit
+
+Now the ticket manager will re-sync the first time you hit a ticket.
+
+FILING BUGS/FEATURE REQUESTS:
+ - Use ICU's trac repository at http://bugs.icu-project.org/trac
+ - Use the 'infrastructure' component and clearly identify the 'ICU Code Tools
+   for Trac' when you file the bug.
+
+
+
diff --git a/trac/IcuCodeTools/setup.cfg b/trac/IcuCodeTools/setup.cfg
new file mode 100644
index 0000000..7223f2b
--- /dev/null
+++ b/trac/IcuCodeTools/setup.cfg
@@ -0,0 +1,4 @@
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
diff --git a/trac/IcuCodeTools/setup.py b/trac/IcuCodeTools/setup.py
new file mode 100755
index 0000000..ab3f189
--- /dev/null
+++ b/trac/IcuCodeTools/setup.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010 IBM and Others. All Rights Reserved.
+# All rights reserved.
+#
+
+from setuptools import setup, find_packages
+
+PACKAGE = 'IcuCodeTools'
+VERSION = '0.0.1'
+
+setup(
+    name=PACKAGE, version=VERSION,
+    description='Miscellaneous ICU Extensions to Trac',
+    author="Steven R. Loomis", author_email="srl@icu-project.org",
+    license='BSD', url='http://icu-project.org',
+    packages=find_packages(exclude=['ez_setup', '*.tests*']),
+    package_data={
+        'icucodetools': [
+            'htdocs/css/*.css',
+            'templates/*.html',
+##            'htdocs/img/*.png',
+#            'htdocs/js/*.js',
+        ]
+    },
+    entry_points = {
+        'trac.plugins': [
+            'icucodetools.ticketmgr = icucodetools.ticketmgr',
+            'icucodetools.review = icucodetools.review',
+            'icucodetools.tktlist = icucodetools.tktlist',
+            'icucodetools.dcut = icucodetools.dcut'
+        ]
+    }
+)
diff --git a/unicode/c/CMakeLists.txt b/unicode/c/CMakeLists.txt
new file mode 100644
index 0000000..5fb9353
--- /dev/null
+++ b/unicode/c/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+cmake_minimum_required(VERSION 2.6)
+project(ICU_UNI_TOOLS)
+# This requires an icudefs.txt file with contents like the following:
+# Location (--prefix) of where ICU was installed.
+#set(ICU_INST_DIR /home/mscherer/svn.icu/trunk/bldinst)
+# Location of the ICU source tree.
+#set(ICU_SRC_DIR /home/mscherer/svn.icu/trunk/src)
+include(icudefs.txt)
+include_directories(
+  ${ICU_INST_DIR}/include
+  ${ICU_SRC_DIR}/source/common
+  ${ICU_SRC_DIR}/source/i18n
+  ${ICU_SRC_DIR}/source/tools/toolutil)
+link_directories(${ICU_INST_DIR}/lib)
+add_subdirectory(genbidi)
+add_subdirectory(gencase)
+add_subdirectory(gennames)
+add_subdirectory(gennorm)
+add_subdirectory(genpname)
+add_subdirectory(genprops)
+add_subdirectory(genuca)
+add_subdirectory(genuts46)
diff --git a/unicode/c/genbidi/CMakeLists.txt b/unicode/c/genbidi/CMakeLists.txt
new file mode 100644
index 0000000..56aaf3a
--- /dev/null
+++ b/unicode/c/genbidi/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(genbidi genbidi.c store.c)
+target_link_libraries(genbidi icuuc icutu)
diff --git a/unicode/c/genbidi/Makefile.in b/unicode/c/genbidi/Makefile.in
new file mode 100644
index 0000000..2f93e7d
--- /dev/null
+++ b/unicode/c/genbidi/Makefile.in
@@ -0,0 +1,95 @@
+## Makefile.in for ICU - tools/genbidi
+## Copyright (c) 1999-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/genbidi
+
+TARGET_STUB_NAME = genbidi
+
+SECTION = 8
+
+#MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = genbidi.o store.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS)
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/genbidi/genbidi.c b/unicode/c/genbidi/genbidi.c
new file mode 100644
index 0000000..f773b1c
--- /dev/null
+++ b/unicode/c/genbidi/genbidi.c
@@ -0,0 +1,636 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2008, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genbidi.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004dec30
+*   created by: Markus W. Scherer
+*
+*   This program reads several of the Unicode character database text files,
+*   parses them, and extracts the bidi/shaping properties for each character.
+*   It then writes a binary file containing the properties
+*   that is designed to be used directly for random-access to
+*   the properties of each Unicode character.
+*/
+
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uarrsort.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uparse.h"
+#include "propsvec.h"
+#include "ubidi_props.h"
+#include "genbidi.h"
+
+#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
+
+/* data --------------------------------------------------------------------- */
+
+UPropsVectors *pv;
+
+UBool beVerbose=FALSE, haveCopyright=TRUE;
+
+/* prototypes --------------------------------------------------------------- */
+
+static UBool
+isToken(const char *token, const char *s);
+
+static void
+parseBidiMirroring(const char *filename, UErrorCode *pErrorCode);
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode);
+
+/* miscellaneous ------------------------------------------------------------ */
+
+/* TODO: more common code, move functions to uparse.h|c */
+
+static char *
+trimTerminateField(char *s, char *limit) {
+    /* trim leading whitespace */
+    s=(char *)u_skipWhitespace(s);
+
+    /* trim trailing whitespace */
+    while(s<limit && (*(limit-1)==' ' || *(limit-1)=='\t')) {
+        --limit;
+    }
+    *limit=0;
+
+    return s;
+}
+
+static void
+parseTwoFieldFile(char *filename, char *basename,
+                  const char *ucdFile, const char *suffix,
+                  UParseLineFn *lineFn,
+                  UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, lineFn, NULL, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+static void U_CALLCONV
+bidiClassLineFn(void *context,
+                char *fields[][2], int32_t fieldCount,
+                UErrorCode *pErrorCode);
+
+/* parse files with single enumerated properties ---------------------------- */
+
+/* TODO: more common code, move functions to uparse.h|c */
+
+struct SingleEnum {
+    const char *ucdFile, *propName;
+    UProperty prop;
+    int32_t vecWord, vecShift;
+    uint32_t vecMask;
+};
+typedef struct SingleEnum SingleEnum;
+
+static void
+parseSingleEnumFile(char *filename, char *basename, const char *suffix,
+                    const SingleEnum *sen,
+                    UErrorCode *pErrorCode);
+
+static const SingleEnum jtSingleEnum={
+    "DerivedJoiningType", "joining type",
+    UCHAR_JOINING_TYPE,
+    0, UBIDI_JT_SHIFT, UBIDI_JT_MASK
+};
+
+static const SingleEnum jgSingleEnum={
+    "DerivedJoiningGroup", "joining group",
+    UCHAR_JOINING_GROUP,
+    1, 0, 0xff                  /* column 1 bits 7..0 */
+};
+
+static void U_CALLCONV
+singleEnumLineFn(void *context,
+                 char *fields[][2], int32_t fieldCount,
+                 UErrorCode *pErrorCode) {
+    const SingleEnum *sen;
+    char *s;
+    uint32_t start, end, uv;
+    int32_t value;
+
+    sen=(const SingleEnum *)context;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi: syntax error in %s.txt field 0 at %s\n", sen->ucdFile, fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse property alias */
+    s=trimTerminateField(fields[1][0], fields[1][1]);
+    value=u_getPropertyValueEnum(sen->prop, s);
+    if(value<0) {
+        if(sen->prop==UCHAR_BLOCK) {
+            if(isToken("Greek", s)) {
+                value=UBLOCK_GREEK; /* Unicode 3.2 renames this to "Greek and Coptic" */
+            } else if(isToken("Combining Marks for Symbols", s)) {
+                value=UBLOCK_COMBINING_MARKS_FOR_SYMBOLS; /* Unicode 3.2 renames this to "Combining Diacritical Marks for Symbols" */
+            } else if(isToken("Private Use", s)) {
+                value=UBLOCK_PRIVATE_USE; /* Unicode 3.2 renames this to "Private Use Area" */
+            }
+        }
+    }
+    if(value<0) {
+        fprintf(stderr, "genbidi error: unknown %s name in %s.txt field 1 at %s\n",
+                        sen->propName, sen->ucdFile, s);
+        exit(U_PARSE_ERROR);
+    }
+
+    uv=(uint32_t)(value<<sen->vecShift);
+    if((uv&sen->vecMask)!=uv) {
+        fprintf(stderr, "genbidi error: %s value overflow (0x%x) at %s\n",
+                        sen->propName, (int)uv, s);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+
+    upvec_setValue(pv, start, end, sen->vecWord, uv, sen->vecMask, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi error: unable to set %s code: %s\n",
+                        sen->propName, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+static void
+parseSingleEnumFile(char *filename, char *basename, const char *suffix,
+                    const SingleEnum *sen,
+                    UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, sen->ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, singleEnumLineFn, (void *)sen, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", sen->ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+/* parse files with multiple binary properties ------------------------------ */
+
+/* TODO: more common code, move functions to uparse.h|c */
+
+/* TODO: similar to genbidi/props2.c but not the same; same as in gencase/gencase.c */
+
+struct Binary {
+    const char *propName;
+    int32_t vecWord;
+    uint32_t vecValue, vecMask;
+};
+typedef struct Binary Binary;
+
+struct Binaries {
+    const char *ucdFile;
+    const Binary *binaries;
+    int32_t binariesCount;
+};
+typedef struct Binaries Binaries;
+
+static const Binary
+propListNames[]={
+    { "Bidi_Control",                       0, U_MASK(UBIDI_BIDI_CONTROL_SHIFT), U_MASK(UBIDI_BIDI_CONTROL_SHIFT) },
+    { "Join_Control",                       0, U_MASK(UBIDI_JOIN_CONTROL_SHIFT), U_MASK(UBIDI_JOIN_CONTROL_SHIFT) }
+};
+
+static const Binaries
+propListBinaries={
+    "PropList", propListNames, LENGTHOF(propListNames)
+};
+
+static void U_CALLCONV
+binariesLineFn(void *context,
+               char *fields[][2], int32_t fieldCount,
+               UErrorCode *pErrorCode) {
+    const Binaries *bin;
+    char *s;
+    uint32_t start, end;
+    int32_t i;
+
+    bin=(const Binaries *)context;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse binary property name */
+    s=(char *)u_skipWhitespace(fields[1][0]);
+    for(i=0;; ++i) {
+        if(i==bin->binariesCount) {
+            /* ignore unrecognized properties */
+            return;
+        }
+        if(isToken(bin->binaries[i].propName, s)) {
+            break;
+        }
+    }
+
+    if(bin->binaries[i].vecMask==0) {
+        fprintf(stderr, "genbidi error: mask value %d==0 for %s %s\n",
+                        (int)bin->binaries[i].vecMask, bin->ucdFile, bin->binaries[i].propName);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+
+    upvec_setValue(pv, start, end, bin->binaries[i].vecWord, bin->binaries[i].vecValue, bin->binaries[i].vecMask, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi error: unable to set %s, code: %s\n",
+                        bin->binaries[i].propName, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+static void
+parseBinariesFile(char *filename, char *basename, const char *suffix,
+                  const Binaries *bin,
+                  UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, bin->ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, binariesLineFn, (void *)bin, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", bin->ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+
+enum {
+    HELP_H,
+    HELP_QUESTION_MARK,
+    VERBOSE,
+    COPYRIGHT,
+    DESTDIR,
+    SOURCEDIR,
+    UNICODE_VERSION,
+    ICUDATADIR,
+    CSOURCE
+};
+
+/* Keep these values in sync with the above enums */
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_VERBOSE,
+    UOPTION_COPYRIGHT,
+    UOPTION_DESTDIR,
+    UOPTION_SOURCEDIR,
+    UOPTION_DEF("unicode", 'u', UOPT_REQUIRES_ARG),
+    UOPTION_ICUDATADIR,
+    UOPTION_DEF("csource", 'C', UOPT_NO_ARG)
+};
+
+extern int
+main(int argc, char* argv[]) {
+    char filename[300];
+    const char *srcDir=NULL, *destDir=NULL, *suffix=NULL;
+    char *basename=NULL;
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[DESTDIR].value=u_getDataDirectory();
+    options[SOURCEDIR].value="";
+    options[UNICODE_VERSION].value="";
+    options[ICUDATADIR].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+    if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
+        /*
+         * Broken into chucks because the C89 standard says the minimum
+         * required supported string length is 509 bytes.
+         */
+        fprintf(stderr,
+            "Usage: %s [-options] [suffix]\n"
+            "\n"
+            "read the UnicodeData.txt file and other Unicode properties files and\n"
+            "create a binary file " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE " with the bidi/shaping properties\n"
+            "\n",
+            argv[0]);
+        fprintf(stderr,
+            "Options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     verbose output\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-u or --unicode     Unicode version, followed by the version like 3.0.0\n"
+            "\t-C or --csource     generate a .c source file rather than the .icu binary\n");
+        fprintf(stderr,
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-s or --sourcedir   source directory, followed by the path\n"
+            "\t-i or --icudatadir  directory for locating any needed intermediate data files,\n"
+            "\t                    followed by path, defaults to %s\n"
+            "\tsuffix              suffix that is to be appended with a '-'\n"
+            "\t                    to the source file basenames before opening;\n"
+            "\t                    'genbidi new' will read UnicodeData-new.txt etc.\n",
+            u_getDataDirectory());
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    beVerbose=options[VERBOSE].doesOccur;
+    haveCopyright=options[COPYRIGHT].doesOccur;
+    srcDir=options[SOURCEDIR].value;
+    destDir=options[DESTDIR].value;
+
+    if(argc>=2) {
+        suffix=argv[1];
+    } else {
+        suffix=NULL;
+    }
+
+    if(options[UNICODE_VERSION].doesOccur) {
+        setUnicodeVersion(options[UNICODE_VERSION].value);
+    }
+    /* else use the default dataVersion in store.c */
+
+    if (options[ICUDATADIR].doesOccur) {
+        u_setDataDirectory(options[ICUDATADIR].value);
+    }
+
+    /* prepare the filename beginning with the source dir */
+    uprv_strcpy(filename, srcDir);
+    basename=filename+uprv_strlen(filename);
+    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
+        *basename++=U_FILE_SEP_CHAR;
+    }
+
+    /* initialize */
+    pv=upvec_open(2, &errorCode);
+
+    /* process BidiMirroring.txt */
+    writeUCDFilename(basename, "BidiMirroring", suffix);
+    parseBidiMirroring(filename, &errorCode);
+
+    /* process additional properties files */
+    *basename=0;
+
+    parseBinariesFile(filename, basename, suffix, &propListBinaries, &errorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &jtSingleEnum, &errorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &jgSingleEnum, &errorCode);
+
+    /* process UnicodeData.txt */
+    writeUCDFilename(basename, "UnicodeData", suffix);
+    parseDB(filename, &errorCode);
+
+    /* set proper bidi class for unassigned code points (Cn) */
+    parseTwoFieldFile(filename, basename, "DerivedBidiClass", suffix, bidiClassLineFn, &errorCode);
+
+    /* process parsed data */
+    if(U_SUCCESS(errorCode)) {
+        /* write the properties data file */
+        generateData(destDir, options[CSOURCE].doesOccur);
+    }
+
+    u_cleanup();
+    return errorCode;
+}
+
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix) {
+    int32_t length=(int32_t)uprv_strlen(filename);
+    uprv_strcpy(basename, filename);
+    if(suffix!=NULL) {
+        basename[length++]='-';
+        uprv_strcpy(basename+length, suffix);
+        length+=(int32_t)uprv_strlen(suffix);
+    }
+    uprv_strcpy(basename+length, ".txt");
+}
+
+/* TODO: move to toolutil */
+static UBool
+isToken(const char *token, const char *s) {
+    const char *z;
+    int32_t j;
+
+    s=u_skipWhitespace(s);
+    for(j=0;; ++j) {
+        if(token[j]!=0) {
+            if(s[j]!=token[j]) {
+                break;
+            }
+        } else {
+            z=u_skipWhitespace(s+j);
+            if(*z==';' || *z==0) {
+                return TRUE;
+            } else {
+                break;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+/* parser for BidiMirroring.txt --------------------------------------------- */
+
+static void U_CALLCONV
+mirrorLineFn(void *context,
+             char *fields[][2], int32_t fieldCount,
+             UErrorCode *pErrorCode) {
+    char *end;
+    UChar32 src, mirror;
+
+    src=(UChar32)uprv_strtoul(fields[0][0], &end, 16);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "genbidi: syntax error in BidiMirroring.txt field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    mirror=(UChar32)uprv_strtoul(fields[1][0], &end, 16);
+    if(end<=fields[1][0] || end!=fields[1][1]) {
+        fprintf(stderr, "genbidi: syntax error in BidiMirroring.txt field 1 at %s\n", fields[1][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    addMirror(src, mirror);
+}
+
+static void
+parseBidiMirroring(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 2, mirrorLineFn, NULL, pErrorCode);
+}
+
+/* parser for UnicodeData.txt ----------------------------------------------- */
+
+static void U_CALLCONV
+unicodeDataLineFn(void *context,
+                  char *fields[][2], int32_t fieldCount,
+                  UErrorCode *pErrorCode) {
+    char *end;
+    UErrorCode errorCode;
+    UChar32 c;
+
+    errorCode=U_ZERO_ERROR;
+
+    /* get the character code, field 0 */
+    c=(UChar32)uprv_strtoul(fields[0][0], &end, 16);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "genbidi: syntax error in field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get Mirrored flag, field 9 */
+    if(*fields[9][0]=='Y') {
+        upvec_setValue(pv, c, c, 0, U_MASK(UBIDI_IS_MIRRORED_SHIFT), U_MASK(UBIDI_IS_MIRRORED_SHIFT), &errorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "genbidi error: unable to set 'is mirrored' for U+%04lx, code: %s\n",
+                            (long)c, u_errorName(errorCode));
+            exit(errorCode);
+        }
+    } else if(fields[9][1]-fields[9][0]!=1 || *fields[9][0]!='N') {
+        fprintf(stderr, "genbidi: syntax error in field 9 at U+%04lx\n",
+            (long)c);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+}
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode) {
+    /* default Bidi classes for unassigned code points */
+    static const UChar32 defaultBidi[][3]={ /* { start, end, class } */
+        /* R: U+0590..U+05FF, U+07C0..U+08FF, U+FB1D..U+FB4F, U+10800..U+10FFF */
+        { 0x0590, 0x05FF, U_RIGHT_TO_LEFT },
+        { 0x07C0, 0x08FF, U_RIGHT_TO_LEFT },
+        { 0xFB1D, 0xFB4F, U_RIGHT_TO_LEFT },
+        { 0x10800, 0x10FFF, U_RIGHT_TO_LEFT },
+
+        /* AL: U+0600..U+07BF, U+FB50..U+FDCF, U+FDF0..U+FDFF, U+FE70..U+FEFE */
+        { 0x0600, 0x07BF, U_RIGHT_TO_LEFT_ARABIC },
+        { 0xFB50, 0xFDCF, U_RIGHT_TO_LEFT_ARABIC },
+        { 0xFDF0, 0xFDFF, U_RIGHT_TO_LEFT_ARABIC },
+        { 0xFE70, 0xFEFE, U_RIGHT_TO_LEFT_ARABIC }
+
+        /* L otherwise */
+    };
+
+    char *fields[15][2];
+    UChar32 start, end;
+    int32_t i;
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    /*
+     * Set default Bidi classes for unassigned code points.
+     * See the documentation for Bidi_Class in UCD.html in the Unicode data.
+     * http://www.unicode.org/Public/
+     *
+     * Starting with Unicode 5.0, DerivedBidiClass.txt should (re)set
+     * the Bidi_Class values for all code points including unassigned ones
+     * and including L values for these.
+     * This code becomes unnecesary but harmless. Leave it for now in case
+     * someone uses genbidi on pre-Unicode 5.0 data.
+     */
+    for(i=0; i<LENGTHOF(defaultBidi); ++i) {
+        start=defaultBidi[i][0];
+        end=defaultBidi[i][1];
+        upvec_setValue(pv, start, end, 0, (uint32_t)defaultBidi[i][2], UBIDI_CLASS_MASK, pErrorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "genbidi error: unable to set default bidi class for U+%04lx..U+%04lx, code: %s\n",
+                            (long)start, (long)end, u_errorName(*pErrorCode));
+            exit(*pErrorCode);
+        }
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode);
+
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+}
+
+/* DerivedBidiClass.txt ----------------------------------------------------- */
+
+static void U_CALLCONV
+bidiClassLineFn(void *context,
+                char *fields[][2], int32_t fieldCount,
+                UErrorCode *pErrorCode) {
+    char *s;
+    uint32_t start, end, value;
+
+    /* get the code point range */
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi: syntax error in DerivedBidiClass.txt field 0 at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse bidi class */
+    s=trimTerminateField(fields[1][0], fields[1][1]);
+    value=u_getPropertyValueEnum(UCHAR_BIDI_CLASS, s);
+    if((int32_t)value<0) {
+        fprintf(stderr, "genbidi error: unknown bidi class in DerivedBidiClass.txt field 1 at %s\n", s);
+        exit(U_PARSE_ERROR);
+    }
+
+    upvec_setValue(pv, start, end, 0, value, UBIDI_CLASS_MASK, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genbidi error: unable to set derived bidi class for U+%04x..U+%04x - %s\n",
+                (int)start, (int)end, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/genbidi/genbidi.h b/unicode/c/genbidi/genbidi.h
new file mode 100644
index 0000000..ab1ac41
--- /dev/null
+++ b/unicode/c/genbidi/genbidi.h
@@ -0,0 +1,48 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2008, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genbidi.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004dec30
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __GENBIDI_H__
+#define __GENBIDI_H__
+
+#include "unicode/utypes.h"
+#include "propsvec.h"
+
+U_CDECL_BEGIN
+
+/* genbidi ------------------------------------------------------------------ */
+
+/* global flags */
+extern UBool beVerbose, haveCopyright;
+
+/* properties vectors in genbidi.c */
+extern UPropsVectors *pv;
+
+/* prototypes */
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix);
+
+extern void
+setUnicodeVersion(const char *v);
+
+extern void
+addMirror(UChar32 src, UChar32 mirror);
+
+extern void
+generateData(const char *dataDir, UBool csource);
+
+U_CDECL_END
+
+#endif
diff --git a/unicode/c/genbidi/genbidi.vcproj b/unicode/c/genbidi/genbidi.vcproj
new file mode 100644
index 0000000..56682cb
--- /dev/null
+++ b/unicode/c/genbidi/genbidi.vcproj
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="genbidi"
+	ProjectGUID="{DB312A49-12A9-4E07-9E96-451DC2D8FF62}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/genbidi.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/genbidi.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/genbidi.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/genbidi.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/genbidi.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/genbidi.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/genbidi.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/genbidi.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/genbidi.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/genbidi.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/genbidi.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/genbidi.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/genbidi.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/genbidi.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/genbidi.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/genbidi.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="c;cpp;rc"
+			>
+			<File
+				RelativePath=".\genbidi.c"
+				>
+			</File>
+			<File
+				RelativePath=".\store.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h"
+			>
+			<File
+				RelativePath=".\genbidi.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/genbidi/store.c b/unicode/c/genbidi/store.c
new file mode 100644
index 0000000..f22534a
--- /dev/null
+++ b/unicode/c/genbidi/store.c
@@ -0,0 +1,463 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  store.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004dec30
+*   created by: Markus W. Scherer
+*
+*   Store Unicode bidi/shaping properties efficiently for
+*   random access.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "utrie2.h"
+#include "uarrsort.h"
+#include "unicode/udata.h"
+#include "unewdata.h"
+#include "propsvec.h"
+#include "writesrc.h"
+#include "ubidi_props.h"
+#include "genbidi.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+/* Unicode bidi/shaping properties file format ---------------------------------
+
+The file format prepared and written here contains several data
+structures that store indexes or data.
+
+Before the data contents described below, there are the headers required by
+the udata API for loading ICU data. Especially, a UDataInfo structure
+precedes the actual data. It contains platform properties values and the
+file format version.
+
+The following is a description of format version 2.0 .
+
+The file contains the following structures:
+
+    const int32_t indexes[i0] with values i0, i1, ...:
+    (see UBIDI_IX_... constants for names of indexes)
+
+    i0 indexLength; -- length of indexes[] (UBIDI_IX_TOP)
+    i1 dataLength; -- length in bytes of the post-header data (incl. indexes[])
+    i2 trieSize; -- size in bytes of the bidi/shaping properties trie
+    i3 mirrorLength; -- length in uint32_t of the bidi mirroring array
+
+    i4 jgStart; -- first code point with Joining_Group data
+    i5 jgLimit; -- limit code point for Joining_Group data
+
+    i6..i14 reservedIndexes; -- reserved values; 0 for now
+
+    i15 maxValues; -- maximum code values for enumerated properties
+                      bits 23..16 contain the max value for Joining_Group,
+                      otherwise the bits are used like enum fields in the trie word
+
+    Serialized trie, see utrie2.h;
+
+    const uint32_t mirrors[mirrorLength];
+
+    const uint8_t jgArray[i5-i4]; -- (i5-i4) is always a multiple of 4
+
+Trie data word:
+Bits
+15..13  signed delta to bidi mirroring code point
+        (add delta to input code point)
+        0 no such code point (source maps to itself)
+        -3..-1, 1..3 delta
+        -4 look in mirrors table
+    12  is mirrored
+    11  Bidi_Control
+    10  Join_Control
+ 9.. 8  reserved (set to 0)
+ 7.. 5  Joining_Type
+ 4.. 0  BiDi category
+
+
+Mirrors:
+Stores some of the bidi mirroring data, where each code point maps to
+at most one other.
+Most code points do not have a mirroring code point; most that do have a signed
+delta stored in the trie data value. Only those where the delta does not fit
+into the trie data are stored in this table.
+
+Logically, this is a two-column table with source and mirror code points.
+
+Physically, the table is compressed by taking advantage of the fact that each
+mirror code point is also a source code point
+(each of them is a mirror of the other).
+Therefore, both logical columns contain the same set of code points, which needs
+to be stored only once.
+
+The table stores source code points, and also for each the index of its mirror
+code point in the same table, in a simple array of uint32_t.
+Bits
+31..21  index to mirror code point (unsigned)
+20.. 0  source code point
+
+The table is sorted by source code points.
+
+
+Joining_Group array:
+The Joining_Group values do not fit into the 16-bit trie, but the data is also
+limited to a small range of code points (Arabic and Syriac) and not
+well compressible.
+
+The start and limit code points for the range are stored in the indexes[]
+array, and the jgArray[] stores a byte for each of these code points,
+containing the Joining_Group value.
+
+All code points outside of this range have No_Joining_Group (0).
+
+--- Changes in format version 2 ---
+
+Change from UTrie to UTrie2.
+
+----------------------------------------------------------------------------- */
+
+/* UDataInfo cf. udata.h */
+static UDataInfo dataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    U_SIZEOF_UCHAR,
+    0,
+
+    /* dataFormat="BiDi" */
+    { UBIDI_FMT_0, UBIDI_FMT_1, UBIDI_FMT_2, UBIDI_FMT_3 },
+    { 2, 0, 0, 0 },                             /* formatVersion */
+    { 6, 0, 0, 0 }                              /* dataVersion */
+};
+
+/* exceptions values */
+static uint32_t mirrors[UBIDI_MAX_MIRROR_INDEX+1][2];
+static uint16_t mirrorTop=0;
+
+/* -------------------------------------------------------------------------- */
+
+extern void
+setUnicodeVersion(const char *v) {
+    UVersionInfo version;
+    u_versionFromString(version, v);
+    uprv_memcpy(dataInfo.dataVersion, version, 4);
+}
+
+/* bidi mirroring table ----------------------------------------------------- */
+
+extern void
+addMirror(UChar32 src, UChar32 mirror) {
+    UErrorCode errorCode;
+    int32_t delta;
+
+    delta=mirror-src;
+    if(delta==0) {
+        return; /* mapping to self=no mapping */
+    }
+
+    if(delta<UBIDI_MIN_MIRROR_DELTA || UBIDI_MAX_MIRROR_DELTA<delta) {
+        /* delta does not fit into the trie properties value, store in the mirrors[] table */
+        if(mirrorTop==LENGTHOF(mirrors)) {
+            fprintf(stderr, "genbidi error: too many long-distance mirroring mappings\n");
+            exit(U_BUFFER_OVERFLOW_ERROR);
+        }
+
+        /* possible: search the table so far and see if src is already listed */
+
+        mirrors[mirrorTop][0]=(uint32_t)src;
+        mirrors[mirrorTop][1]=(uint32_t)mirror;
+        ++mirrorTop;
+
+        /* set an escape marker in src's properties */
+        delta=UBIDI_ESC_MIRROR_DELTA;
+    }
+
+    errorCode=U_ZERO_ERROR;
+    upvec_setValue(
+            pv, src, src, 0,
+            (uint32_t)delta<<UBIDI_MIRROR_DELTA_SHIFT, (uint32_t)(-1)<<UBIDI_MIRROR_DELTA_SHIFT,
+            &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "genbidi error: unable to set mirroring delta, code: %s\n",
+                        u_errorName(errorCode));
+        exit(errorCode);
+    }
+}
+
+static int32_t U_CALLCONV
+compareMirror(const void *context, const void *left, const void *right) {
+    UChar32 l, r;
+
+    l=UBIDI_GET_MIRROR_CODE_POINT(((const uint32_t *)left)[0]);
+    r=UBIDI_GET_MIRROR_CODE_POINT(((const uint32_t *)right)[0]);
+    return l-r;
+}
+
+static void
+makeMirror() {
+    uint32_t *reducedMirror;
+    UErrorCode errorCode;
+    int32_t i, j, start, limit, step;
+    uint32_t c;
+
+    /* sort the mirroring table by source code points */
+    errorCode=U_ZERO_ERROR;
+    uprv_sortArray(mirrors, mirrorTop, 8,
+                   compareMirror, NULL, FALSE, &errorCode);
+
+    /*
+     * reduce the 2-column table to a single column
+     * by putting the index to the mirror entry into the source entry
+     *
+     * first:
+     * find each mirror code point in the source column and set each other's indexes
+     *
+     * second:
+     * reduce the table, combine the source code points with their indexes
+     * and store as a simple array of uint32_t
+     */
+    for(i=0; i<mirrorTop; ++i) {
+        c=mirrors[i][1]; /* mirror code point */
+        if(c>0x1fffff) {
+            continue; /* this entry already has an index */
+        }
+
+        /* search for the mirror code point in the source column */
+        if(c<mirrors[i][0]) {
+            /* search before i */
+            start=i-1;
+            limit=-1;
+            step=-1;
+        } else {
+            start=i+1;
+            limit=mirrorTop;
+            step=1;
+        }
+
+        for(j=start;; j+=step) {
+            if(j==limit) {
+                fprintf(stderr,
+                        "genbidi error: bidi mirror does not roundtrip - %04lx->%04lx->?\n",
+                        (long)mirrors[i][0], (long)mirrors[i][1]);
+                errorCode=U_ILLEGAL_ARGUMENT_ERROR;
+            }
+            if(c==mirrors[j][0]) {
+                /*
+                 * found the mirror code point c in the source column,
+                 * set both entries' indexes to each other
+                 */
+                if(UBIDI_GET_MIRROR_CODE_POINT(mirrors[i][0])!=UBIDI_GET_MIRROR_CODE_POINT(mirrors[j][1])) {
+                    /* roundtrip check fails */
+                    fprintf(stderr,
+                            "genbidi error: bidi mirrors do not roundtrip - %04lx->%04lx->%04lx\n",
+                            (long)mirrors[i][0], (long)mirrors[i][1], (long)mirrors[j][1]);
+                    errorCode=U_ILLEGAL_ARGUMENT_ERROR;
+                } else {
+                    mirrors[i][1]|=(uint32_t)j<<UBIDI_MIRROR_INDEX_SHIFT;
+                    mirrors[j][1]|=(uint32_t)i<<UBIDI_MIRROR_INDEX_SHIFT;
+                }
+                break;
+            }
+        }
+    }
+
+    /* now the second step, the actual reduction of the table */
+    reducedMirror=mirrors[0];
+    for(i=0; i<mirrorTop; ++i) {
+        reducedMirror[i]=mirrors[i][0]|(mirrors[i][1]&~0x1fffff);
+    }
+
+    if(U_FAILURE(errorCode)) {
+        exit(errorCode);
+    }
+}
+
+/* generate output data ----------------------------------------------------- */
+
+extern void
+generateData(const char *dataDir, UBool csource) {
+    static int32_t indexes[UBIDI_IX_TOP]={
+        UBIDI_IX_TOP
+    };
+    static uint8_t trieBlock[40000];
+    static uint8_t jgArray[0x300]; /* at most for U+0600..U+08FF */
+
+    const uint32_t *row;
+    UChar32 start, end, prev, jgStart;
+    int32_t i;
+
+    UNewDataMemory *pData;
+    UTrie2 *pTrie;
+    UErrorCode errorCode=U_ZERO_ERROR;
+    int32_t trieSize;
+    long dataLength;
+
+    makeMirror();
+
+    pTrie=utrie2_open(0, 0, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "genbidi error: utrie2_open() failed - %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+
+    prev=jgStart=0;
+    for(i=0; (row=upvec_getRow(pv, i, &start, &end))!=NULL && start<UPVEC_FIRST_SPECIAL_CP; ++i) {
+        /* store most values from vector column 0 in the trie */
+        utrie2_setRange32(pTrie, start, end, *row, TRUE, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "genbidi error: utrie2_setRange32() failed - %s\n", u_errorName(errorCode));
+            exit(errorCode);
+        }
+
+        /* store Joining_Group values from vector column 1 in a simple byte array */
+        if(row[1]!=0) {
+            if(start<0x600 || 0x8ff<end) {
+                fprintf(stderr, "genbidi error: Joining_Group for out-of-range code points U+%04lx..U+%04lx\n",
+                        (long)start, (long)end);
+                exit(U_ILLEGAL_ARGUMENT_ERROR);
+            }
+
+            if(prev==0) {
+                /* first code point with any value */
+                prev=jgStart=start;
+            } else {
+                /* add No_Joining_Group for code points between prev and start */
+                while(prev<start) {
+                    jgArray[prev++ -jgStart]=0;
+                }
+            }
+
+            /* set Joining_Group value for start..end */
+            while(prev<=end) {
+                jgArray[prev++ -jgStart]=(uint8_t)row[1];
+            }
+        }
+    }
+
+    /* finish jgArray, pad to multiple of 4 */
+    while((prev-jgStart)&3) {
+        jgArray[prev++ -jgStart]=0;
+    }
+    indexes[UBIDI_IX_JG_START]=jgStart;
+    indexes[UBIDI_IX_JG_LIMIT]=prev;
+
+    utrie2_freeze(pTrie, UTRIE2_16_VALUE_BITS, &errorCode);
+    trieSize=utrie2_serialize(pTrie, trieBlock, sizeof(trieBlock), &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "genbidi error: utrie2_freeze()+utrie2_serialize() failed: %s (length %ld)\n",
+                u_errorName(errorCode), (long)trieSize);
+        exit(errorCode);
+    }
+
+    indexes[UBIDI_IX_TRIE_SIZE]=trieSize;
+    indexes[UBIDI_IX_MIRROR_LENGTH]=mirrorTop;
+    indexes[UBIDI_IX_LENGTH]=
+        (int32_t)sizeof(indexes)+
+        trieSize+
+        4*mirrorTop+
+        (prev-jgStart);
+
+    if(beVerbose) {
+        printf("trie size in bytes:                    %5d\n", (int)trieSize);
+        printf("size in bytes of mirroring table:      %5d\n", (int)(4*mirrorTop));
+        printf("length of Joining_Group array:         %5d (U+%04x..U+%04x)\n", (int)(prev-jgStart), (int)jgStart, (int)(prev-1));
+        printf("data size:                             %5d\n", (int)indexes[UBIDI_IX_LENGTH]);
+    }
+
+    indexes[UBIDI_MAX_VALUES_INDEX]=
+        ((int32_t)U_CHAR_DIRECTION_COUNT-1)|
+        (((int32_t)U_JT_COUNT-1)<<UBIDI_JT_SHIFT)|
+        (((int32_t)U_JG_COUNT-1)<<UBIDI_MAX_JG_SHIFT);
+
+    if(csource) {
+        /* write .c file for hardcoded data */
+        FILE *f=usrc_create(dataDir, "ubidi_props_data.c");
+        if(f!=NULL) {
+            usrc_writeArray(f,
+                "static const UVersionInfo ubidi_props_dataVersion={",
+                dataInfo.dataVersion, 8, 4,
+                "};\n\n");
+            usrc_writeArray(f,
+                "static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={",
+                indexes, 32, UBIDI_IX_TOP,
+                "};\n\n");
+            usrc_writeUTrie2Arrays(f,
+                "static const uint16_t ubidi_props_trieIndex[%ld]={\n", NULL,
+                pTrie,
+                "\n};\n\n");
+            usrc_writeArray(f,
+                "static const uint32_t ubidi_props_mirrors[%ld]={\n",
+                mirrors, 32, mirrorTop,
+                "\n};\n\n");
+            usrc_writeArray(f,
+                "static const uint8_t ubidi_props_jgArray[%ld]={\n",
+                jgArray, 8, prev-jgStart,
+                "\n};\n\n");
+            fputs(
+                "static const UBiDiProps ubidi_props_singleton={\n"
+                "  NULL,\n"
+                "  ubidi_props_indexes,\n"
+                "  ubidi_props_mirrors,\n"
+                "  ubidi_props_jgArray,\n",
+                f);
+            usrc_writeUTrie2Struct(f,
+                "  {\n",
+                pTrie, "ubidi_props_trieIndex", NULL,
+                "  },\n");
+            usrc_writeArray(f, "  { ", dataInfo.formatVersion, 8, 4, " }\n");
+            fputs("};\n", f);
+            fclose(f);
+        }
+    } else {
+        /* write the data */
+        pData=udata_create(dataDir, UBIDI_DATA_TYPE, UBIDI_DATA_NAME, &dataInfo,
+                           haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "genbidi: unable to create data memory, %s\n", u_errorName(errorCode));
+            exit(errorCode);
+        }
+
+        udata_writeBlock(pData, indexes, sizeof(indexes));
+        udata_writeBlock(pData, trieBlock, trieSize);
+        udata_writeBlock(pData, mirrors, 4*mirrorTop);
+        udata_writeBlock(pData, jgArray, prev-jgStart);
+
+        /* finish up */
+        dataLength=udata_finish(pData, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "genbidi: error %d writing the output file\n", errorCode);
+            exit(errorCode);
+        }
+
+        if(dataLength!=indexes[UBIDI_IX_LENGTH]) {
+            fprintf(stderr, "genbidi: data length %ld != calculated size %d\n",
+                dataLength, (int)indexes[UBIDI_IX_LENGTH]);
+            exit(U_INTERNAL_PROGRAM_ERROR);
+        }
+    }
+
+    utrie2_close(pTrie);
+    upvec_close(pv);
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/gencase/CMakeLists.txt b/unicode/c/gencase/CMakeLists.txt
new file mode 100644
index 0000000..0f54f65
--- /dev/null
+++ b/unicode/c/gencase/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(gencase gencase.c store.c)
+target_link_libraries(gencase icuuc icutu)
diff --git a/unicode/c/gencase/Makefile.in b/unicode/c/gencase/Makefile.in
new file mode 100644
index 0000000..7ab1d61
--- /dev/null
+++ b/unicode/c/gencase/Makefile.in
@@ -0,0 +1,95 @@
+## Makefile.in for ICU - tools/gencase
+## Copyright (c) 1999-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/gencase
+
+TARGET_STUB_NAME = gencase
+
+SECTION = 8
+
+#MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = gencase.o store.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS)
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/gencase/gencase.c b/unicode/c/gencase/gencase.c
new file mode 100644
index 0000000..39379ff
--- /dev/null
+++ b/unicode/c/gencase/gencase.c
@@ -0,0 +1,835 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  gencase.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004aug28
+*   created by: Markus W. Scherer
+*
+*   This program reads several of the Unicode character database text files,
+*   parses them, and the case mapping properties for each character.
+*   It then writes a binary file containing the properties
+*   that is designed to be used directly for random-access to
+*   the properties of each Unicode character.
+*/
+
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/uset.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uarrsort.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uparse.h"
+#include "uprops.h"
+#include "propsvec.h"
+#include "gencase.h"
+
+#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
+
+/* data --------------------------------------------------------------------- */
+
+UPropsVectors *pv;
+
+UBool beVerbose=FALSE, haveCopyright=TRUE;
+
+/*
+ * Unicode set collecting the case-sensitive characters;
+ * see uchar.h UCHAR_CASE_SENSITIVE.
+ * Add code points from case mappings/foldings in
+ * the root locale and with default options.
+ */
+static USet *caseSensitive;
+
+/* prototypes --------------------------------------------------------------- */
+
+static void
+parseSpecialCasing(const char *filename, UErrorCode *pErrorCode);
+
+static void
+parseCaseFolding(const char *filename, UErrorCode *pErrorCode);
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode);
+
+/* parse files with multiple binary properties ------------------------------ */
+
+/* TODO: more common code, move functions to uparse.h|c */
+
+/* TODO: similar to genprops/props2.c but not the same */
+
+struct Binary {
+    const char *propName;
+    int32_t vecWord;
+    uint32_t vecValue, vecMask;
+};
+typedef struct Binary Binary;
+
+struct Binaries {
+    const char *ucdFile;
+    const Binary *binaries;
+    int32_t binariesCount;
+};
+typedef struct Binaries Binaries;
+
+static const Binary
+propListNames[]={
+    { "Soft_Dotted",                        0, UCASE_SOFT_DOTTED,   UCASE_DOT_MASK }
+};
+
+static const Binaries
+propListBinaries={
+    "PropList", propListNames, LENGTHOF(propListNames)
+};
+
+static const Binary
+derCorePropsNames[]={
+    { "Lowercase",                          0, UCASE_LOWER,         UCASE_TYPE_MASK },
+    { "Uppercase",                          0, UCASE_UPPER,         UCASE_TYPE_MASK },
+    /* Unicode 5.2 adds Case_Ignorable as a public property. See comments in store.c. */
+    { "Case_Ignorable",                     1, U_MASK(UGENCASE_IS_MID_LETTER_SHIFT), U_MASK(UGENCASE_IS_MID_LETTER_SHIFT) }
+};
+
+static const Binaries
+derCorePropsBinaries={
+    "DerivedCoreProperties", derCorePropsNames, LENGTHOF(derCorePropsNames)
+};
+
+/*
+ * Treat Word_Break=MidLetter and MidNumLet as a single binary property.
+ * We need not distinguish between them because both add to case-ignorable.
+ * We ignore all other Word_Break values.
+ */
+static const Binary
+wordBreakNames[]={
+    { "MidLetter",                          1, U_MASK(UGENCASE_IS_MID_LETTER_SHIFT), U_MASK(UGENCASE_IS_MID_LETTER_SHIFT) },
+    { "MidNumLet",                          1, U_MASK(UGENCASE_IS_MID_LETTER_SHIFT), U_MASK(UGENCASE_IS_MID_LETTER_SHIFT) }
+};
+
+static const Binaries
+wordBreakBinaries={
+    "WordBreakProperty", wordBreakNames, LENGTHOF(wordBreakNames)
+};
+
+static void U_CALLCONV
+binariesLineFn(void *context,
+               char *fields[][2], int32_t fieldCount,
+               UErrorCode *pErrorCode) {
+    const Binaries *bin;
+    char *s;
+    uint32_t start, end;
+    int32_t i;
+
+    bin=(const Binaries *)context;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "gencase: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse binary property name */
+    s=(char *)u_skipWhitespace(fields[1][0]);
+    for(i=0;; ++i) {
+        if(i==bin->binariesCount) {
+            /* ignore unrecognized properties */
+            return;
+        }
+        if(isToken(bin->binaries[i].propName, s)) {
+            break;
+        }
+    }
+
+    if(bin->binaries[i].vecMask==0) {
+        fprintf(stderr, "gencase error: mask value %d==0 for %s %s\n",
+                        (int)bin->binaries[i].vecMask, bin->ucdFile, bin->binaries[i].propName);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+
+    upvec_setValue(pv, start, end, bin->binaries[i].vecWord, bin->binaries[i].vecValue, bin->binaries[i].vecMask, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "gencase error: unable to set %s, code: %s\n",
+                        bin->binaries[i].propName, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+static void
+parseBinariesFile(char *filename, char *basename, const char *suffix,
+                  const Binaries *bin,
+                  UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, bin->ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, binariesLineFn, (void *)bin, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", bin->ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+
+enum
+{
+    HELP_H,
+    HELP_QUESTION_MARK,
+    VERBOSE,
+    COPYRIGHT,
+    DESTDIR,
+    SOURCEDIR,
+    UNICODE_VERSION,
+    ICUDATADIR,
+    CSOURCE
+};
+
+/* Keep these values in sync with the above enums */
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_VERBOSE,
+    UOPTION_COPYRIGHT,
+    UOPTION_DESTDIR,
+    UOPTION_SOURCEDIR,
+    UOPTION_DEF("unicode", 'u', UOPT_REQUIRES_ARG),
+    UOPTION_ICUDATADIR,
+    UOPTION_DEF("csource", 'C', UOPT_NO_ARG)
+};
+
+extern int
+main(int argc, char* argv[]) {
+    char filename[300];
+    const char *srcDir=NULL, *destDir=NULL, *suffix=NULL;
+    char *basename=NULL;
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[DESTDIR].value=u_getDataDirectory();
+    options[SOURCEDIR].value="";
+    options[UNICODE_VERSION].value="";
+    options[ICUDATADIR].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+    if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
+        /*
+         * Broken into chunks because the C89 standard says the minimum
+         * required supported string length is 509 bytes.
+         */
+        fprintf(stderr,
+            "Usage: %s [-options] [suffix]\n"
+            "\n"
+            "read the UnicodeData.txt file and other Unicode properties files and\n"
+            "create a binary file " UCASE_DATA_NAME "." UCASE_DATA_TYPE " with the case mapping properties\n"
+            "\n",
+            argv[0]);
+        fprintf(stderr,
+            "Options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     verbose output\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-u or --unicode     Unicode version, followed by the version like 3.0.0\n"
+            "\t-C or --csource     generate a .c source file rather than the .icu binary\n");
+        fprintf(stderr,
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-s or --sourcedir   source directory, followed by the path\n"
+            "\t-i or --icudatadir  directory for locating any needed intermediate data files,\n"
+            "\t                    followed by path, defaults to %s\n"
+            "\tsuffix              suffix that is to be appended with a '-'\n"
+            "\t                    to the source file basenames before opening;\n"
+            "\t                    'gencase new' will read UnicodeData-new.txt etc.\n",
+            u_getDataDirectory());
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    beVerbose=options[VERBOSE].doesOccur;
+    haveCopyright=options[COPYRIGHT].doesOccur;
+    srcDir=options[SOURCEDIR].value;
+    destDir=options[DESTDIR].value;
+
+    if(argc>=2) {
+        suffix=argv[1];
+    } else {
+        suffix=NULL;
+    }
+
+    if(options[UNICODE_VERSION].doesOccur) {
+        setUnicodeVersion(options[UNICODE_VERSION].value);
+    }
+    /* else use the default dataVersion in store.c */
+
+    if (options[ICUDATADIR].doesOccur) {
+        u_setDataDirectory(options[ICUDATADIR].value);
+    }
+
+    /* prepare the filename beginning with the source dir */
+    uprv_strcpy(filename, srcDir);
+    basename=filename+uprv_strlen(filename);
+    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
+        *basename++=U_FILE_SEP_CHAR;
+    }
+
+    /* initialize */
+    pv=upvec_open(2, &errorCode);
+    caseSensitive=uset_open(1, 0); /* empty set (start>end) */
+
+    /* process SpecialCasing.txt */
+    writeUCDFilename(basename, "SpecialCasing", suffix);
+    parseSpecialCasing(filename, &errorCode);
+
+    /* process CaseFolding.txt */
+    writeUCDFilename(basename, "CaseFolding", suffix);
+    parseCaseFolding(filename, &errorCode);
+
+    /* process additional properties files */
+    *basename=0;
+
+    parseBinariesFile(filename, basename, suffix, &propListBinaries, &errorCode);
+
+    parseBinariesFile(filename, basename, suffix, &derCorePropsBinaries, &errorCode);
+
+    if(ucdVersion>=UNI_4_1) {
+        parseBinariesFile(filename, basename, suffix, &wordBreakBinaries, &errorCode);
+    }
+
+    /* process UnicodeData.txt */
+    writeUCDFilename(basename, "UnicodeData", suffix);
+    parseDB(filename, &errorCode);
+
+    /* process parsed data */
+    makeCaseClosure();
+
+    makeExceptions();
+
+    if(U_SUCCESS(errorCode)) {
+        /* write the properties data file */
+        generateData(destDir, options[CSOURCE].doesOccur);
+    }
+
+    u_cleanup();
+    return errorCode;
+}
+
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix) {
+    int32_t length=(int32_t)uprv_strlen(filename);
+    uprv_strcpy(basename, filename);
+    if(suffix!=NULL) {
+        basename[length++]='-';
+        uprv_strcpy(basename+length, suffix);
+        length+=(int32_t)uprv_strlen(suffix);
+    }
+    uprv_strcpy(basename+length, ".txt");
+}
+
+/* TODO: move to toolutil */
+U_CFUNC UBool
+isToken(const char *token, const char *s) {
+    const char *z;
+    int32_t j;
+
+    s=u_skipWhitespace(s);
+    for(j=0;; ++j) {
+        if(token[j]!=0) {
+            if(s[j]!=token[j]) {
+                break;
+            }
+        } else {
+            z=u_skipWhitespace(s+j);
+            if(*z==';' || *z==0) {
+                return TRUE;
+            } else {
+                break;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+static int32_t
+getTokenIndex(const char *const tokens[], int32_t countTokens, const char *s) {
+    const char *t, *z;
+    int32_t i, j;
+
+    s=u_skipWhitespace(s);
+    for(i=0; i<countTokens; ++i) {
+        t=tokens[i];
+        if(t!=NULL) {
+            for(j=0;; ++j) {
+                if(t[j]!=0) {
+                    if(s[j]!=t[j]) {
+                        break;
+                    }
+                } else {
+                    z=u_skipWhitespace(s+j);
+                    if(*z==';' || *z==0 || *z=='#' || *z=='\r' || *z=='\n') {
+                        return i;
+                    } else {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+static void
+_set_addAll(USet *set, const UChar *s, int32_t length) {
+    UChar32 c;
+    int32_t i;
+
+    /* needs length>=0 */
+    for(i=0; i<length; /* U16_NEXT advances i */) {
+        U16_NEXT(s, i, length, c);
+        uset_add(set, c);
+    }
+}
+
+/* parser for SpecialCasing.txt --------------------------------------------- */
+
+#define MAX_SPECIAL_CASING_COUNT 500
+
+static SpecialCasing specialCasings[MAX_SPECIAL_CASING_COUNT];
+static int32_t specialCasingCount=0;
+
+static void U_CALLCONV
+specialCasingLineFn(void *context,
+                    char *fields[][2], int32_t fieldCount,
+                    UErrorCode *pErrorCode) {
+    char *end;
+
+    /* get code point */
+    specialCasings[specialCasingCount].code=(UChar32)uprv_strtoul(u_skipWhitespace(fields[0][0]), &end, 16);
+    end=(char *)u_skipWhitespace(end);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "gencase: syntax error in SpecialCasing.txt field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* is this a complex mapping? */
+    if(*(end=(char *)u_skipWhitespace(fields[4][0]))!=0 && *end!=';' && *end!='#') {
+        /* there is some condition text in the fifth field */
+        specialCasings[specialCasingCount].isComplex=TRUE;
+
+        /* do not store any actual mappings for this */
+        specialCasings[specialCasingCount].lowerCase[0]=0;
+        specialCasings[specialCasingCount].upperCase[0]=0;
+        specialCasings[specialCasingCount].titleCase[0]=0;
+    } else {
+        /* just set the "complex" flag and get the case mappings */
+        specialCasings[specialCasingCount].isComplex=FALSE;
+        specialCasings[specialCasingCount].lowerCase[0]=
+            (UChar)u_parseString(fields[1][0], specialCasings[specialCasingCount].lowerCase+1, 31, NULL, pErrorCode);
+        specialCasings[specialCasingCount].upperCase[0]=
+            (UChar)u_parseString(fields[3][0], specialCasings[specialCasingCount].upperCase+1, 31, NULL, pErrorCode);
+        specialCasings[specialCasingCount].titleCase[0]=
+            (UChar)u_parseString(fields[2][0], specialCasings[specialCasingCount].titleCase+1, 31, NULL, pErrorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "gencase: error parsing special casing at %s\n", fields[0][0]);
+            exit(*pErrorCode);
+        }
+
+        uset_add(caseSensitive, (UChar32)specialCasings[specialCasingCount].code);
+        _set_addAll(caseSensitive, specialCasings[specialCasingCount].lowerCase+1, specialCasings[specialCasingCount].lowerCase[0]);
+        _set_addAll(caseSensitive, specialCasings[specialCasingCount].upperCase+1, specialCasings[specialCasingCount].upperCase[0]);
+        _set_addAll(caseSensitive, specialCasings[specialCasingCount].titleCase+1, specialCasings[specialCasingCount].titleCase[0]);
+    }
+
+    if(++specialCasingCount==MAX_SPECIAL_CASING_COUNT) {
+        fprintf(stderr, "gencase: too many special casing mappings\n");
+        *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+        exit(U_INDEX_OUTOFBOUNDS_ERROR);
+    }
+}
+
+static int32_t U_CALLCONV
+compareSpecialCasings(const void *context, const void *left, const void *right) {
+    return ((const SpecialCasing *)left)->code-((const SpecialCasing *)right)->code;
+}
+
+static void
+parseSpecialCasing(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[5][2];
+    int32_t i, j;
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 5, specialCasingLineFn, NULL, pErrorCode);
+
+    /* sort the special casing entries by code point */
+    if(specialCasingCount>0) {
+        uprv_sortArray(specialCasings, specialCasingCount, sizeof(SpecialCasing),
+                       compareSpecialCasings, NULL, FALSE, pErrorCode);
+    }
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    /* replace multiple entries for any code point by one "complex" one */
+    j=0;
+    for(i=1; i<specialCasingCount; ++i) {
+        if(specialCasings[i-1].code==specialCasings[i].code) {
+            /* there is a duplicate code point */
+            specialCasings[i-1].code=0x7fffffff;    /* remove this entry in the following sorting */
+            specialCasings[i].isComplex=TRUE;       /* make the following one complex */
+            specialCasings[i].lowerCase[0]=0;
+            specialCasings[i].upperCase[0]=0;
+            specialCasings[i].titleCase[0]=0;
+            ++j;
+        }
+    }
+
+    /* if some entries just were removed, then re-sort */
+    if(j>0) {
+        uprv_sortArray(specialCasings, specialCasingCount, sizeof(SpecialCasing),
+                       compareSpecialCasings, NULL, FALSE, pErrorCode);
+        specialCasingCount-=j;
+    }
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    /*
+     * Add one complex mapping to caseSensitive that was filtered out above:
+     * Greek final Sigma has a conditional mapping but not locale-sensitive,
+     * and it is taken when lowercasing just U+03A3 alone.
+     * 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
+     */
+    uset_add(caseSensitive, 0x3c2);
+}
+
+/* parser for CaseFolding.txt ----------------------------------------------- */
+
+#define MAX_CASE_FOLDING_COUNT 2000
+
+static CaseFolding caseFoldings[MAX_CASE_FOLDING_COUNT];
+static int32_t caseFoldingCount=0;
+
+static void U_CALLCONV
+caseFoldingLineFn(void *context,
+                  char *fields[][2], int32_t fieldCount,
+                  UErrorCode *pErrorCode) {
+    char *end;
+    static UChar32 prevCode=0;
+    int32_t count;
+    char status;
+
+    /* get code point */
+    caseFoldings[caseFoldingCount].code=(UChar32)uprv_strtoul(u_skipWhitespace(fields[0][0]), &end, 16);
+    end=(char *)u_skipWhitespace(end);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "gencase: syntax error in CaseFolding.txt field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get the status of this mapping */
+    caseFoldings[caseFoldingCount].status=status=*u_skipWhitespace(fields[1][0]);
+    if(status!='L' && status!='E' && status!='C' && status!='S' && status!='F' && status!='I' && status!='T') {
+        fprintf(stderr, "gencase: unrecognized status field in CaseFolding.txt at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* ignore all case folding mappings that are the same as the UnicodeData.txt lowercase mappings */
+    if(status=='L') {
+        return;
+    }
+
+    /* get the mapping */
+    count=caseFoldings[caseFoldingCount].full[0]=
+        (UChar)u_parseString(fields[2][0], caseFoldings[caseFoldingCount].full+1, 31, (uint32_t *)&caseFoldings[caseFoldingCount].simple, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "gencase: error parsing CaseFolding.txt mapping at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* there is a simple mapping only if there is exactly one code point (count is in UChars) */
+    if(count==0 || count>2 || (count==2 && UTF_IS_SINGLE(caseFoldings[caseFoldingCount].full[1]))) {
+        caseFoldings[caseFoldingCount].simple=0;
+    }
+
+    /* update the case-sensitive set */
+    if(status!='T') {
+        uset_add(caseSensitive, (UChar32)caseFoldings[caseFoldingCount].code);
+        _set_addAll(caseSensitive, caseFoldings[caseFoldingCount].full+1, caseFoldings[caseFoldingCount].full[0]);
+    }
+
+    /* check the status */
+    if(status=='S') {
+        /* check if there was a full mapping for this code point before */
+        if( caseFoldingCount>0 &&
+            caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code &&
+            caseFoldings[caseFoldingCount-1].status=='F'
+        ) {
+            /* merge the two entries */
+            caseFoldings[caseFoldingCount-1].simple=caseFoldings[caseFoldingCount].simple;
+            return;
+        }
+    } else if(status=='F') {
+        /* check if there was a simple mapping for this code point before */
+        if( caseFoldingCount>0 &&
+            caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code &&
+            caseFoldings[caseFoldingCount-1].status=='S'
+        ) {
+            /* merge the two entries */
+            uprv_memcpy(caseFoldings[caseFoldingCount-1].full, caseFoldings[caseFoldingCount].full, 32*U_SIZEOF_UCHAR);
+            return;
+        }
+    } else if(status=='I' || status=='T') {
+        /* check if there was a default mapping for this code point before (remove it) */
+        while(caseFoldingCount>0 &&
+              caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code
+        ) {
+            prevCode=0;
+            --caseFoldingCount;
+        }
+        /* store only a marker for special handling for cases like dotless i */
+        caseFoldings[caseFoldingCount].simple=0;
+        caseFoldings[caseFoldingCount].full[0]=0;
+    }
+
+    /* check that the code points (caseFoldings[caseFoldingCount].code) are in ascending order */
+    if(caseFoldings[caseFoldingCount].code<=prevCode && caseFoldings[caseFoldingCount].code>0) {
+        fprintf(stderr, "gencase: error - CaseFolding entries out of order, U+%04lx after U+%04lx\n",
+                (unsigned long)caseFoldings[caseFoldingCount].code,
+                (unsigned long)prevCode);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    prevCode=caseFoldings[caseFoldingCount].code;
+
+    if(++caseFoldingCount==MAX_CASE_FOLDING_COUNT) {
+        fprintf(stderr, "gencase: too many case folding mappings\n");
+        *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+        exit(U_INDEX_OUTOFBOUNDS_ERROR);
+    }
+}
+
+static void
+parseCaseFolding(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[3][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 3, caseFoldingLineFn, NULL, pErrorCode);
+}
+
+/* parser for UnicodeData.txt ----------------------------------------------- */
+
+/* general categories */
+const char *const
+genCategoryNames[U_CHAR_CATEGORY_COUNT]={
+    "Cn",
+    "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Me",
+    "Mc", "Nd", "Nl", "No",
+    "Zs", "Zl", "Zp",
+    "Cc", "Cf", "Co", "Cs",
+    "Pd", "Ps", "Pe", "Pc", "Po",
+    "Sm", "Sc", "Sk", "So",
+    "Pi", "Pf"
+};
+
+static int32_t specialCasingIndex=0, caseFoldingIndex=0;
+
+static void U_CALLCONV
+unicodeDataLineFn(void *context,
+                  char *fields[][2], int32_t fieldCount,
+                  UErrorCode *pErrorCode) {
+    Props p;
+    char *end;
+    static UChar32 prevCode=0;
+    UChar32 value;
+    int32_t i;
+
+    /* reset the properties */
+    uprv_memset(&p, 0, sizeof(Props));
+
+    /* get the character code, field 0 */
+    p.code=(UChar32)uprv_strtoul(fields[0][0], &end, 16);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "gencase: syntax error in field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get general category, field 2 */
+    i=getTokenIndex(genCategoryNames, U_CHAR_CATEGORY_COUNT, fields[2][0]);
+    if(i>=0) {
+        p.gc=(uint8_t)i;
+    } else {
+        fprintf(stderr, "gencase: unknown general category \"%s\" at code 0x%lx\n",
+            fields[2][0], (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get canonical combining class, field 3 */
+    value=(UChar32)uprv_strtoul(fields[3][0], &end, 10);
+    if(end<=fields[3][0] || end!=fields[3][1] || value>0xff) {
+        fprintf(stderr, "gencase: syntax error in field 3 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    p.cc=(uint8_t)value;
+
+    /* get uppercase mapping, field 12 */
+    value=(UChar32)uprv_strtoul(fields[12][0], &end, 16);
+    if(end!=fields[12][1]) {
+        fprintf(stderr, "gencase: syntax error in field 12 at code 0x%lx\n",
+            (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    if(value!=0 && value!=p.code) {
+        p.upperCase=value;
+        uset_add(caseSensitive, p.code);
+        uset_add(caseSensitive, value);
+    }
+
+    /* get lowercase value, field 13 */
+    value=(UChar32)uprv_strtoul(fields[13][0], &end, 16);
+    if(end!=fields[13][1]) {
+        fprintf(stderr, "gencase: syntax error in field 13 at code 0x%lx\n",
+            (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    if(value!=0 && value!=p.code) {
+        p.lowerCase=value;
+        uset_add(caseSensitive, p.code);
+        uset_add(caseSensitive, value);
+    }
+
+    /* get titlecase value, field 14 */
+    value=(UChar32)uprv_strtoul(fields[14][0], &end, 16);
+    if(end!=fields[14][1]) {
+        fprintf(stderr, "gencase: syntax error in field 14 at code 0x%lx\n",
+            (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    if(value!=0 && value!=p.code) {
+        p.titleCase=value;
+        uset_add(caseSensitive, p.code);
+        uset_add(caseSensitive, value);
+    }
+
+    /* set additional properties from previously parsed files */
+    if(specialCasingIndex<specialCasingCount && p.code==specialCasings[specialCasingIndex].code) {
+        p.specialCasing=specialCasings+specialCasingIndex++;
+    } else {
+        p.specialCasing=NULL;
+    }
+    if(caseFoldingIndex<caseFoldingCount && p.code==caseFoldings[caseFoldingIndex].code) {
+        p.caseFolding=caseFoldings+caseFoldingIndex++;
+
+        /* ignore "Common" mappings (simple==full) that map to the same code point as the regular lowercase mapping */
+        if( p.caseFolding->status=='C' &&
+            p.caseFolding->simple==p.lowerCase
+        ) {
+            p.caseFolding=NULL;
+        }
+    } else {
+        p.caseFolding=NULL;
+    }
+
+    /* check for non-character code points */
+    if((p.code&0xfffe)==0xfffe || (uint32_t)(p.code-0xfdd0)<0x20) {
+        fprintf(stderr, "gencase: error - properties for non-character code point U+%04lx\n",
+                (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* check that the code points (p.code) are in ascending order */
+    if(p.code<=prevCode && p.code>0) {
+        fprintf(stderr, "gencase: error - UnicodeData entries out of order, U+%04lx after U+%04lx\n",
+                (unsigned long)p.code, (unsigned long)prevCode);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* properties for a single code point */
+    setProps(&p);
+
+    prevCode=p.code;
+}
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[15][2];
+    UChar32 start, end;
+    int32_t i;
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode);
+
+    /* are all sub-properties consumed? */
+    if(specialCasingIndex<specialCasingCount) {
+        fprintf(stderr, "gencase: error - some code points in SpecialCasing.txt are missing from UnicodeData.txt\n");
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    if(caseFoldingIndex<caseFoldingCount) {
+        fprintf(stderr, "gencase: error - some code points in CaseFolding.txt are missing from UnicodeData.txt\n");
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    for(i=0;
+        0==uset_getItem(caseSensitive, i, &start, &end, NULL, 0, pErrorCode) && U_SUCCESS(*pErrorCode);
+        ++i
+    ) {
+        addCaseSensitive(start, end);
+    }
+    if(*pErrorCode==U_INDEX_OUTOFBOUNDS_ERROR) {
+        *pErrorCode=U_ZERO_ERROR;
+    }
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/gencase/gencase.h b/unicode/c/gencase/gencase.h
new file mode 100644
index 0000000..aa7c38e
--- /dev/null
+++ b/unicode/c/gencase/gencase.h
@@ -0,0 +1,132 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2009, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  gencase.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004aug28
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __GENCASE_H__
+#define __GENCASE_H__
+
+#include "unicode/utypes.h"
+#include "utrie.h"
+#include "propsvec.h"
+#include "ucase.h"
+
+U_CDECL_BEGIN
+
+/* Unicode versions --------------------------------------------------------- */
+
+enum {
+    UNI_1_0,
+    UNI_1_1,
+    UNI_2_0,
+    UNI_3_0,
+    UNI_3_1,
+    UNI_3_2,
+    UNI_4_0,
+    UNI_4_0_1,
+    UNI_4_1,
+    UNI_5_1,
+    UNI_5_2,
+    UNI_6_0,
+    UNI_VER_COUNT
+};
+
+extern int32_t ucdVersion;
+
+/* gencase ------------------------------------------------------------------ */
+
+#define UGENCASE_EXC_SHIFT     16
+#define UGENCASE_EXC_MASK      0xffff0000
+
+/*
+ * Values for the ucase.icu unfold[] data array, see store.c.
+ * The values are stored in ucase.icu so that the runtime code will work with
+ * changing values, but they are hardcoded for gencase for simplicity.
+ * They are optimized, that is, provide for minimal table column widths,
+ * for the actual Unicode data, so that the table size is minimized.
+ * Future versions of Unicode may require increases of some of these values.
+ */
+enum {
+    UGENCASE_UNFOLD_STRING_WIDTH=3,
+    UGENCASE_UNFOLD_CP_WIDTH=2,
+    UGENCASE_UNFOLD_WIDTH=UGENCASE_UNFOLD_STRING_WIDTH+UGENCASE_UNFOLD_CP_WIDTH,
+    UGENCASE_UNFOLD_MAX_ROWS=250
+};
+
+/* Values for additional data stored in pv column 1 */
+enum {
+    UGENCASE_IS_MID_LETTER_SHIFT        /* bit 0  WB=MidLetter or WB=MidNumLet */
+};
+
+/* special casing data */
+typedef struct {
+    UChar32 code;
+    UBool isComplex;
+    UChar lowerCase[32], upperCase[32], titleCase[32];
+} SpecialCasing;
+
+/* case folding data */
+typedef struct {
+    UChar32 code, simple;
+    char status;
+    UChar full[32];
+} CaseFolding;
+
+/* case mapping properties */
+typedef struct {
+    UChar32 code, lowerCase, upperCase, titleCase;
+    UChar32 closure[8];
+    SpecialCasing *specialCasing;
+    CaseFolding *caseFolding;
+    uint8_t gc, cc;
+    UBool isCaseIgnorable;
+} Props;
+
+/* global flags */
+extern UBool beVerbose, haveCopyright;
+
+/* properties vectors in gencase.c */
+extern UPropsVectors *pv;
+
+/* prototypes */
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix);
+
+U_CFUNC UBool
+isToken(const char *token, const char *s);
+
+extern void
+setUnicodeVersion(const char *v);
+
+extern void
+setProps(Props *p);
+
+U_CFUNC uint32_t U_EXPORT2
+getFoldedPropsValue(UNewTrie *trie, UChar32 start, int32_t offset);
+
+extern void
+addCaseSensitive(UChar32 first, UChar32 last);
+
+extern void
+makeCaseClosure(void);
+
+extern void
+makeExceptions(void);
+
+extern void
+generateData(const char *dataDir, UBool csource);
+
+U_CDECL_END
+
+#endif
diff --git a/unicode/c/gencase/gencase.vcproj b/unicode/c/gencase/gencase.vcproj
new file mode 100644
index 0000000..81c4eb2
--- /dev/null
+++ b/unicode/c/gencase/gencase.vcproj
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="gencase"
+	ProjectGUID="{DB312A49-12A9-4E07-9E96-451DC2D8FF61}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/gencase.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/gencase.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/gencase.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/gencase.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/gencase.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/gencase.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/gencase.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/gencase.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/gencase.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/gencase.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/gencase.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/gencase.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/gencase.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/gencase.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/gencase.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/gencase.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="c;cpp;rc"
+			>
+			<File
+				RelativePath=".\gencase.c"
+				>
+			</File>
+			<File
+				RelativePath=".\store.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h"
+			>
+			<File
+				RelativePath=".\gencase.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/gencase/store.c b/unicode/c/gencase/store.c
new file mode 100644
index 0000000..2539042
--- /dev/null
+++ b/unicode/c/gencase/store.c
@@ -0,0 +1,1198 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2004-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  store.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2004aug28
+*   created by: Markus W. Scherer
+*
+*   Store Unicode case mapping properties efficiently for
+*   random access.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/ustring.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "filestrm.h"
+#include "utrie2.h"
+#include "uarrsort.h"
+#include "unicode/udata.h"
+#include "unewdata.h"
+#include "propsvec.h"
+#include "writesrc.h"
+#include "gencase.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+/* Unicode case mapping properties file format ---------------------------------
+
+The file format prepared and written here contains several data
+structures that store indexes or data.
+
+Before the data contents described below, there are the headers required by
+the udata API for loading ICU data. Especially, a UDataInfo structure
+precedes the actual data. It contains platform properties values and the
+file format version.
+
+The following is a description of format version 2.0 .
+
+Format version 1.1 adds data for case closure.
+
+Format version 1.2 adds an exception bit for case-ignorable. Needed because
+the Cased and Case_Ignorable properties are not disjoint.
+
+Format version 2.0 changes from UTrie to UTrie2.
+
+The file contains the following structures:
+
+    const int32_t indexes[i0] with values i0, i1, ...:
+    (see UCASE_IX_... constants for names of indexes)
+
+    i0 indexLength; -- length of indexes[] (UCASE_IX_TOP)
+    i1 dataLength; -- length in bytes of the post-header data (incl. indexes[])
+    i2 trieSize; -- size in bytes of the case mapping properties trie
+    i3 exceptionsLength; -- length in uint16_t of the exceptions array
+    i4 unfoldLength; -- length in uint16_t of the reverse-folding array (new in format version 1.1)
+
+    i5..i14 reservedIndexes; -- reserved values; 0 for now
+
+    i15 maxFullLength; -- maximum length of a full case mapping/folding string
+
+
+    Serialized trie, see utrie2.h;
+
+    const uint16_t exceptions[exceptionsLength];
+
+    const UChar unfold[unfoldLength];
+
+
+Trie data word:
+Bits
+if(exception) {
+    15..4   unsigned exception index
+} else {
+    if(not uncased) {
+        15..6   signed delta to simple case mapping code point
+                (add delta to input code point)
+    } else {
+            6   the code point is case-ignorable
+                (U+0307 is also case-ignorable but has an exception)
+    }
+     5..4   0 normal character with cc=0
+            1 soft-dotted character
+            2 cc=230
+            3 other cc
+}
+    3   exception
+    2   case sensitive
+ 1..0   0 uncased
+        1 lowercase
+        2 uppercase
+        3 titlecase
+
+
+Exceptions:
+A sub-array of the exceptions array is indexed by the exception index in a
+trie word.
+The sub-array consists of the following fields:
+    uint16_t excWord;
+    uint16_t optional values [];
+    UTF-16 strings for full (string) mappings for lowercase, case folding, uppercase, titlecase
+
+excWord: (see UCASE_EXC_...)
+Bits
+    15  conditional case folding
+    14  conditional special casing
+13..12  same as non-exception trie data bits 5..4
+        moved here because the exception index needs more bits than the delta
+        0 normal character with cc=0
+        1 soft-dotted character
+        2 cc=230
+        3 other cc
+11      case-ignorable (used when the character is cased or has another exception)
+        (new in formatVersion 1.2/ICU 4.4)
+10.. 9  reserved
+     8  if set, then for each optional-value slot there are 2 uint16_t values
+        (high and low parts of 32-bit values)
+        instead of single ones
+ 7.. 0  bits for which optional value is present
+
+Optional-value slots:
+0   lowercase mapping (code point)
+1   case folding (code point)
+2   uppercase mapping (code point)
+3   titlecase mapping (code point)
+4   reserved
+5   reserved
+6   closure mappings (new in format version 1.1)
+7   there is at least one full (string) case mapping
+    the length of each is encoded in a nibble of this optional value,
+    and the strings follow this optional value in the same order:
+    lower/fold/upper/title
+
+The optional closure mappings value is used as follows:
+Bits 0..3 contain the length of a string of code points for case closure.
+The string immediately follows the full case mappings, or the closure value
+slot if there are no full case mappings.
+Bits 4..15 are reserved and could be used in the future to indicate the
+number of strings for case closure.
+Complete case closure for a code point is given by the union of all simple
+and full case mappings and foldings, plus the case closure code points
+(and potentially, in the future, case closure strings).
+
+For space saving, some values are not stored. Lookups are as follows:
+- If special casing is conditional, then no full lower/upper/title mapping
+  strings are stored.
+- If case folding is conditional, then no simple or full case foldings are
+  stored.
+- Fall back in this order:
+    full (string) mapping -- if full mappings are used
+    simple (code point) mapping of the same type
+    simple fold->simple lower
+    simple title->simple upper
+    finally, the original code point (no mapping)
+
+This fallback order is strict:
+In particular, the fallback from full case folding is to simple case folding,
+not to full lowercase mapping.
+
+Reverse case folding data ("unfold") array: (new in format version 1.1)
+
+This array stores some miscellaneous values followed by a table. The data maps
+back from multi-character strings to their original code points, for use
+in case closure.
+
+The table contains two columns of strings.
+The string in the first column is the case folding of each of the code points
+in the second column. The strings are terminated with NUL or by the end of the
+column, whichever comes first.
+
+The miscellaneous data takes up one pseudo-row and includes:
+- number of rows
+- number of UChars per row
+- number of UChars in the left (folding string) column
+
+The table is sorted by its first column. Values in the first column are unique.
+
+----------------------------------------------------------------------------- */
+
+/* UDataInfo cf. udata.h */
+static UDataInfo dataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    U_SIZEOF_UCHAR,
+    0,
+
+    /* dataFormat="cAsE" */
+    { UCASE_FMT_0, UCASE_FMT_1, UCASE_FMT_2, UCASE_FMT_3 },
+    { 2, 0, 0, 0 },                             /* formatVersion */
+    { 6, 0, 0, 0 }                              /* dataVersion */
+};
+
+enum {
+    /* maximum number of exceptions expected */
+    MAX_EXC_COUNT=1000
+};
+
+/* exceptions values */
+static uint16_t exceptions[UCASE_MAX_EXCEPTIONS+100];
+static uint16_t exceptionsTop=0;
+static Props excProps[MAX_EXC_COUNT];
+static uint16_t exceptionsCount=0;
+
+/* becomes indexes[UCASE_IX_MAX_FULL_LENGTH] */
+static int32_t maxFullLength=U16_MAX_LENGTH;
+
+/* reverse case folding ("unfold") data */
+static UChar unfold[UGENCASE_UNFOLD_MAX_ROWS*UGENCASE_UNFOLD_WIDTH]={
+    0, UGENCASE_UNFOLD_WIDTH, UGENCASE_UNFOLD_STRING_WIDTH, 0, 0
+};
+static uint16_t unfoldRows=0;
+static uint16_t unfoldTop=UGENCASE_UNFOLD_WIDTH;
+
+/* Unicode versions --------------------------------------------------------- */
+
+static const UVersionInfo
+unicodeVersions[]={
+    { 1, 0, 0, 0 },
+    { 1, 1, 0, 0 },
+    { 2, 0, 0, 0 },
+    { 3, 0, 0, 0 },
+    { 3, 1, 0, 0 },
+    { 3, 2, 0, 0 },
+    { 4, 0, 0, 0 },
+    { 4, 0, 1, 0 },
+    { 4, 1, 0, 0 },
+    { 5, 1, 0, 0 },
+    { 5, 2, 0, 0 },
+    { 6, 0, 0, 0 }
+};
+
+int32_t ucdVersion=UNI_4_1;
+
+static int32_t
+findUnicodeVersion(const UVersionInfo version) {
+    int32_t i;
+
+    for(i=0; /* while(version>unicodeVersions[i]) {} */
+        i<UNI_VER_COUNT && uprv_memcmp(version, unicodeVersions[i], 4)>0;
+        ++i) {}
+    if(0<i && i<UNI_VER_COUNT && uprv_memcmp(version, unicodeVersions[i], 4)<0) {
+        --i; /* fix 4.0.2 to land before 4.1, for valid x>=ucdVersion comparisons */
+    }
+    return i; /* version>=unicodeVersions[i] && version<unicodeVersions[i+1]; possible: i==UNI_VER_COUNT */
+}
+
+extern void
+setUnicodeVersion(const char *v) {
+    UVersionInfo version;
+    u_versionFromString(version, v);
+    uprv_memcpy(dataInfo.dataVersion, version, 4);
+    ucdVersion=findUnicodeVersion(version);
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void
+addUnfolding(UChar32 c, const UChar *s, int32_t length) {
+    int32_t i;
+
+    if(length>UGENCASE_UNFOLD_STRING_WIDTH) {
+        fprintf(stderr, "gencase error: case folding too long (length=%ld>%d=UGENCASE_UNFOLD_STRING_WIDTH)\n",
+                (long)length, UGENCASE_UNFOLD_STRING_WIDTH);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+    if(unfoldTop >= (LENGTHOF(unfold) - UGENCASE_UNFOLD_STRING_WIDTH)) {
+        fprintf(stderr, "gencase error: too many multi-character case foldings\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+    u_memset(unfold+unfoldTop, 0, UGENCASE_UNFOLD_WIDTH);
+    u_memcpy(unfold+unfoldTop, s, length);
+
+    i=unfoldTop+UGENCASE_UNFOLD_STRING_WIDTH;
+    U16_APPEND_UNSAFE(unfold, i, c);
+
+    ++unfoldRows;
+    unfoldTop+=UGENCASE_UNFOLD_WIDTH;
+}
+
+/* store a character's properties ------------------------------------------- */
+
+extern void
+setProps(Props *p) {
+    UErrorCode errorCode;
+    uint32_t value, oldValue;
+    int32_t delta;
+
+    /* get the non-UnicodeData.txt properties */
+    value=oldValue=upvec_getValue(pv, p->code, 0);
+
+    /* default: map to self */
+    delta=0;
+
+    if(p->gc==U_TITLECASE_LETTER) {
+        /* the Titlecase property is read late, from UnicodeData.txt */
+        value|=UCASE_TITLE;
+    }
+
+    if(p->upperCase!=0) {
+        /* uppercase mapping as delta if the character is lowercase */
+        if((value&UCASE_TYPE_MASK)==UCASE_LOWER) {
+            delta=p->upperCase-p->code;
+        } else {
+            value|=UCASE_EXCEPTION;
+        }
+    }
+    if(p->lowerCase!=0) {
+        /* lowercase mapping as delta if the character is uppercase or titlecase */
+        if((value&UCASE_TYPE_MASK)>=UCASE_UPPER) {
+            delta=p->lowerCase-p->code;
+        } else {
+            value|=UCASE_EXCEPTION;
+        }
+    }
+    if(p->upperCase!=p->titleCase) {
+        value|=UCASE_EXCEPTION;
+    }
+    if(p->closure[0]!=0) {
+        value|=UCASE_EXCEPTION;
+    }
+    if(p->specialCasing!=NULL) {
+        value|=UCASE_EXCEPTION;
+    }
+    if(p->caseFolding!=NULL) {
+        value|=UCASE_EXCEPTION;
+    }
+
+    if(delta<UCASE_MIN_DELTA || UCASE_MAX_DELTA<delta) {
+        value|=UCASE_EXCEPTION;
+    }
+
+    if(p->cc!=0) {
+        if(value&UCASE_DOT_MASK) {
+            fprintf(stderr, "gencase: a soft-dotted character has cc!=0\n");
+            exit(U_INTERNAL_PROGRAM_ERROR);
+        }
+        if(p->cc==230) {
+            value|=UCASE_ABOVE;
+        } else {
+            value|=UCASE_OTHER_ACCENT;
+        }
+    }
+
+    /*
+     * Encode case-ignorable as delta==1 on uncased characters,
+     * and with an exception bit on cased characters and characters with another exception.
+     */
+    if(ucdVersion>=UNI_4_1) {
+        /*
+         * Unicode 4.1 & 5.0: (D47a) Word_Break=MidLetter or Mn, Me, Cf, Lm, Sk
+         * Unicode 5.1: Word_Break=(MidLetter or MidNumLet) or Mn, Me, Cf, Lm, Sk
+         *   The UGENCASE_IS_MID_LETTER_SHIFT bit is set for both WB=MidLetter and WB=MidNumLet.
+         * Unicode 5.2: The definition (Unicode Standard Definition D121) is unchanged,
+         *   but now Case_Ignorable is a public property
+         *   with its values listed in DerivedCoreProperties.txt.
+         *   gencase.c parses those values as well, just in case the definition changes
+         *   in the future. gencase.c sets the UGENCASE_IS_MID_LETTER_SHIFT bit
+         *   for each Case_Ignorable entry. (It never resets that bit.)
+         */
+        if(
+            (U_MASK(p->gc)&(U_GC_MN_MASK|U_GC_ME_MASK|U_GC_CF_MASK|U_GC_LM_MASK|U_GC_SK_MASK))!=0 ||
+            (upvec_getValue(pv, p->code, 1)&U_MASK(UGENCASE_IS_MID_LETTER_SHIFT))!=0
+        ) {
+            p->isCaseIgnorable=TRUE;
+        }
+    } else {
+        /* before Unicode 4.1: Mn, Me, Cf, Lm, Sk or 0027 or 00AD or 2019 */
+        if(
+            (U_MASK(p->gc)&(U_GC_MN_MASK|U_GC_ME_MASK|U_GC_CF_MASK|U_GC_LM_MASK|U_GC_SK_MASK))!=0 ||
+            p->code==0x27 || p->code==0xad || p->code==0x2019
+        ) {
+            p->isCaseIgnorable=TRUE;
+        }
+    }
+    if(p->isCaseIgnorable) {
+        if((value&UCASE_TYPE_MASK)==UCASE_NONE) {
+            /*
+             * We use one of the delta/exception bits for
+             * the case-ignorable flag for uncased characters.
+             * There is no delta for uncased characters (see checks above).
+             */
+            delta=1;
+        } else {
+            /*
+             * If the character is cased or has another exception,
+             * then we store the case-ignorable flag as an exception bit.
+             */
+            value|=UCASE_EXCEPTION;
+        }
+    }
+
+    /* handle exceptions */
+    if(value&UCASE_EXCEPTION) {
+        /* simply store exceptions for later processing and encoding */
+        value|=(uint32_t)exceptionsCount<<UGENCASE_EXC_SHIFT;
+        uprv_memcpy(excProps+exceptionsCount, p, sizeof(*p));
+        if(++exceptionsCount==MAX_EXC_COUNT) {
+            fprintf(stderr, "gencase: too many exceptions\n");
+            exit(U_INDEX_OUTOFBOUNDS_ERROR);
+        }
+    } else {
+        /* store the simple case mapping delta */
+        value|=((uint32_t)delta<<UCASE_DELTA_SHIFT)&UCASE_DELTA_MASK;
+    }
+
+    errorCode=U_ZERO_ERROR;
+    if(value!=oldValue) {
+        upvec_setValue(pv, p->code, p->code, 0, value, 0xffffffff, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "gencase error: unable to set case mapping values, code: %s\n",
+                            u_errorName(errorCode));
+            exit(errorCode);
+        }
+    }
+
+    /* add the multi-character case folding to the "unfold" data */
+    if(p->caseFolding!=NULL) {
+        int32_t length=p->caseFolding->full[0];
+        if(length>1 && u_strHasMoreChar32Than(p->caseFolding->full+1, length, 1)) {
+            addUnfolding(p->code, p->caseFolding->full+1, length);
+        }
+    }
+}
+
+extern void
+addCaseSensitive(UChar32 first, UChar32 last) {
+    UErrorCode errorCode=U_ZERO_ERROR;
+    upvec_setValue(pv, first, last, 0, UCASE_SENSITIVE, UCASE_SENSITIVE, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gencase error: unable to set UCASE_SENSITIVE, code: %s\n",
+                        u_errorName(errorCode));
+        exit(errorCode);
+    }
+}
+
+/* finalize reverse case folding ("unfold") data ---------------------------- */
+
+static int32_t U_CALLCONV
+compareUnfold(const void *context, const void *left, const void *right) {
+    return u_memcmp((const UChar *)left, (const UChar *)right, UGENCASE_UNFOLD_WIDTH);
+}
+
+static void
+makeUnfoldData() {
+    static const UChar
+        iDot[2]=        { 0x69, 0x307 };
+
+    UChar *p, *q;
+    int32_t i, j, k;
+    UErrorCode errorCode;
+
+    /*
+     * add a case folding that we missed because it's conditional:
+     * 0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+     */
+    addUnfolding(0x130, iDot, 2);
+
+    /* sort the data */
+    errorCode=U_ZERO_ERROR;
+    uprv_sortArray(unfold+UGENCASE_UNFOLD_WIDTH, unfoldRows, UGENCASE_UNFOLD_WIDTH*2,
+                   compareUnfold, NULL, FALSE, &errorCode);
+
+    /* make unique-string rows by merging adjacent ones' code point columns */
+
+    /* make p point to row i-1 */
+    p=(UChar *)unfold+UGENCASE_UNFOLD_WIDTH;
+
+    for(i=1; i<unfoldRows;) {
+        if(0==u_memcmp(p, p+UGENCASE_UNFOLD_WIDTH, UGENCASE_UNFOLD_STRING_WIDTH)) {
+            /* concatenate code point columns */
+            q=p+UGENCASE_UNFOLD_STRING_WIDTH;
+            for(j=1; j<UGENCASE_UNFOLD_CP_WIDTH && q[j]!=0; ++j) {}
+            for(k=0; k<UGENCASE_UNFOLD_CP_WIDTH && q[UGENCASE_UNFOLD_WIDTH+k]!=0; ++j, ++k) {
+                q[j]=q[UGENCASE_UNFOLD_WIDTH+k];
+            }
+            if(j>UGENCASE_UNFOLD_CP_WIDTH) {
+                fprintf(stderr, "gencase error: too many code points in unfold[]: %ld>%d=UGENCASE_UNFOLD_CP_WIDTH\n",
+                        (long)j, UGENCASE_UNFOLD_CP_WIDTH);
+                exit(U_BUFFER_OVERFLOW_ERROR);
+            }
+
+            /* move following rows up one */
+            --unfoldRows;
+            unfoldTop-=UGENCASE_UNFOLD_WIDTH;
+            u_memmove(p+UGENCASE_UNFOLD_WIDTH, p+UGENCASE_UNFOLD_WIDTH*2, (unfoldRows-i)*UGENCASE_UNFOLD_WIDTH);
+        } else {
+            p+=UGENCASE_UNFOLD_WIDTH;
+            ++i;
+        }
+    }
+
+    unfold[UCASE_UNFOLD_ROWS]=(UChar)unfoldRows;
+
+    if(beVerbose) {
+        puts("unfold data:");
+
+        p=(UChar *)unfold;
+        for(i=0; i<unfoldRows; ++i) {
+            p+=UGENCASE_UNFOLD_WIDTH;
+            printf("[%2d] %04x %04x %04x <- %04x %04x\n",
+                   (int)i, p[0], p[1], p[2], p[3], p[4]);
+        }
+    }
+}
+
+/* case closure ------------------------------------------------------------- */
+
+static void
+addClosureMapping(UChar32 src, UChar32 dest) {
+    uint32_t value;
+
+    if(beVerbose) {
+        printf("add closure mapping U+%04lx->U+%04lx\n",
+                (unsigned long)src, (unsigned long)dest);
+    }
+
+    value=upvec_getValue(pv, src, 0);
+    if(value&UCASE_EXCEPTION) {
+        Props *p=excProps+(value>>UGENCASE_EXC_SHIFT);
+        int32_t i;
+
+        /* append dest to src's closure array */
+        for(i=0;; ++i) {
+            if(i==LENGTHOF(p->closure)) {
+                fprintf(stderr, "closure[] overflow for U+%04lx->U+%04lx\n",
+                                (unsigned long)src, (unsigned long)dest);
+                exit(U_BUFFER_OVERFLOW_ERROR);
+            } else if(p->closure[i]==dest) {
+                break; /* do not store duplicates */
+            } else if(p->closure[i]==0) {
+                p->closure[i]=dest;
+                break;
+            }
+        }
+    } else {
+        Props p2={ 0 };
+        UChar32 next;
+        UErrorCode errorCode;
+
+        /*
+         * decode value into p2 (enough for makeException() to work properly),
+         * add the closure mapping,
+         * and set the new exception for src
+         */
+        p2.code=src;
+        p2.closure[0]=dest;
+
+        if((value&UCASE_TYPE_MASK)>UCASE_NONE) {
+            /* one simple case mapping, don't care which one */
+            next=src+((int16_t)value>>UCASE_DELTA_SHIFT);
+            if(next!=src) {
+                if((value&UCASE_TYPE_MASK)==UCASE_LOWER) {
+                    p2.upperCase=p2.titleCase=next;
+                } else {
+                    p2.lowerCase=next;
+                }
+            }
+        } else if(value&UCASE_DELTA_MASK) {
+            fprintf(stderr, "gencase error: unable to add case closure exception to case-ignorable U+%04lx\n",
+                            (unsigned long)src);
+            exit(U_INTERNAL_PROGRAM_ERROR);
+        }
+
+        value&=~(UGENCASE_EXC_MASK|UCASE_DELTA_MASK); /* remove previous simple mapping */
+        value|=(uint32_t)exceptionsCount<<UGENCASE_EXC_SHIFT;
+        value|=UCASE_EXCEPTION;
+        uprv_memcpy(excProps+exceptionsCount, &p2, sizeof(p2));
+        if(++exceptionsCount==MAX_EXC_COUNT) {
+            fprintf(stderr, "gencase: too many exceptions\n");
+            exit(U_INDEX_OUTOFBOUNDS_ERROR);
+        }
+
+        errorCode=U_ZERO_ERROR;
+        upvec_setValue(pv, src, src, 0, value, 0xffffffff, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "gencase error: unable to set case mapping values, code: %s\n",
+                            u_errorName(errorCode));
+            exit(errorCode);
+        }
+    }
+}
+
+/*
+ * Find missing case mapping relationships and add mappings for case closure.
+ * This function starts from an "original" code point and recursively
+ * finds its case mappings and the case mappings of where it maps to.
+ *
+ * The recursion depth is capped at 3 nested calls of this function.
+ * In each call, the current code point is c, and the function enumerates
+ * all of c's simple (single-code point) case mappings.
+ * prev is the code point that case-mapped to c.
+ * prev2 is the code point that case-mapped to prev.
+ *
+ * The initial function call has prev2<0, prev<0, and c==orig
+ * (marking no code points).
+ * It enumerates c's case mappings and recurses without further action.
+ *
+ * The second-level function call has prev2<0, prev==orig, and c is
+ * the destination code point of one of prev's case mappings.
+ * The function checks if any of c's case mappings go back to orig
+ * and adds a closure mapping if not.
+ * In other words, it turns a case mapping relationship of
+ *   orig->c
+ * into
+ *   orig<->c
+ *
+ * The third-level function call has prev2==orig, prev>=0, and c is
+ * the destination code point of one of prev's case mappings.
+ * (And prev is the destination of one of prev2's case mappings.)
+ * The function checks if any of c's case mappings go back to orig
+ * and adds a closure mapping if not.
+ * In other words, it turns case mapping relationships of
+ *   orig->prev->c or orig->prev<->c
+ * into
+ *   orig->prev->c->orig or orig->prev<->c->orig
+ * etc.
+ * (Graphically, this closes a triangle.)
+ *
+ * With repeated application on all code points until no more closure mappings
+ * are added, all case equivalence groups get complete mappings.
+ * That is, in each group of code points with case relationships
+ * each code point will in the end have some mapping to each other
+ * code point in the group.
+ *
+ * @return TRUE if a closure mapping was added
+ */
+static UBool
+addClosure(UChar32 orig, UChar32 prev2, UChar32 prev, UChar32 c, uint32_t value) {
+    UChar32 next;
+    UBool someMappingsAdded=FALSE;
+
+    if(c!=orig) {
+        /* get the properties for c */
+        value=upvec_getValue(pv, c, 0);
+    }
+    /* else if c==orig then c's value was passed in */
+
+    if(value&UCASE_EXCEPTION) {
+        UChar32 set[32];
+        int32_t i, count=0;
+
+        Props *p=excProps+(value>>UGENCASE_EXC_SHIFT);
+
+        /*
+         * marker for whether any of c's mappings goes to orig
+         * c==orig: prevent adding a closure mapping when getting orig's own, direct mappings
+         */
+        UBool mapsToOrig=(UBool)(c==orig);
+
+        /* collect c's case mapping destinations in set[] */
+        if((next=p->upperCase)!=0 && next!=c) {
+            set[count++]=next;
+        }
+        if((next=p->lowerCase)!=0 && next!=c) {
+            set[count++]=next;
+        }
+        if(p->upperCase!=(next=p->titleCase) && next!=c) {
+            set[count++]=next;
+        }
+        if(p->caseFolding!=NULL && (next=p->caseFolding->simple)!=0 && next!=c) {
+            set[count++]=next;
+        }
+
+        /* append c's current closure mappings to set[] */
+        for(i=0; i<LENGTHOF(p->closure) && (next=p->closure[i])!=0; ++i) {
+            set[count++]=next;
+        }
+
+        /* process all code points to which c case-maps */
+        for(i=0; i<count; ++i) {
+            next=set[i]; /* next!=c */
+
+            if(next==orig) {
+                mapsToOrig=TRUE; /* remember that we map to orig */
+            } else if(prev2<0 && next!=prev) {
+                /*
+                 * recurse unless
+                 * we have reached maximum depth (prev2>=0) or
+                 * this is a mapping to one of the previous code points (orig, prev, c)
+                 */
+                someMappingsAdded|=addClosure(orig, prev, c, next, 0);
+            }
+        }
+
+        if(!mapsToOrig) {
+            addClosureMapping(c, orig);
+            return TRUE;
+        }
+    } else {
+        if((value&UCASE_TYPE_MASK)>UCASE_NONE) {
+            /* one simple case mapping, don't care which one */
+            next=c+((int16_t)value>>UCASE_DELTA_SHIFT);
+            if(next!=c) {
+                /*
+                 * recurse unless
+                 * we have reached maximum depth (prev2>=0) or
+                 * this is a mapping to one of the previous code points (orig, prev, c)
+                 */
+                if(prev2<0 && next!=orig && next!=prev) {
+                    someMappingsAdded|=addClosure(orig, prev, c, next, 0);
+                }
+
+                if(c!=orig && next!=orig) {
+                    /* c does not map to orig, add a closure mapping c->orig */
+                    addClosureMapping(c, orig);
+                    return TRUE;
+                }
+            }
+        }
+    }
+
+    return someMappingsAdded;
+}
+
+extern void
+makeCaseClosure() {
+    UChar *p;
+    uint32_t *row;
+    uint32_t value;
+    UChar32 start, end, c, c2;
+    int32_t i, j;
+    UBool someMappingsAdded;
+
+    /*
+     * finalize the "unfold" data because we need to use it to add closure mappings
+     * for situations like FB05->"st"<-FB06
+     * where we would otherwise miss the FB05<->FB06 relationship
+     */
+    makeUnfoldData();
+
+    /* use the "unfold" data to add mappings */
+
+    /* p always points to the code points; this loop ignores the strings completely */
+    p=unfold+UGENCASE_UNFOLD_WIDTH+UGENCASE_UNFOLD_STRING_WIDTH;
+
+    for(i=0; i<unfoldRows; p+=UGENCASE_UNFOLD_WIDTH, ++i) {
+        j=0;
+        U16_NEXT_UNSAFE(p, j, c);
+        while(j<UGENCASE_UNFOLD_CP_WIDTH && p[j]!=0) {
+            U16_NEXT_UNSAFE(p, j, c2);
+            addClosure(c, U_SENTINEL, c, c2, 0);
+        }
+    }
+
+    if(beVerbose) {
+        puts("---- ---- ---- ---- (done with closures from unfolding)");
+    }
+
+    /* add further closure mappings from analyzing simple mappings */
+    do {
+        someMappingsAdded=FALSE;
+
+        i=0;
+        while((row=upvec_getRow(pv, i, &start, &end))!=NULL && start<UPVEC_FIRST_SPECIAL_CP) {
+            value=*row;
+            if(value!=0) {
+                while(start<=end) {
+                    if(addClosure(start, U_SENTINEL, U_SENTINEL, start, value)) {
+                        someMappingsAdded=TRUE;
+
+                        /*
+                         * stop this loop because pv was changed and row is not valid any more
+                         * skip all rows below the current start
+                         */
+                        while((row=upvec_getRow(pv, i, NULL, &end))!=NULL && start>end) {
+                            ++i;
+                        }
+                        row=NULL; /* signal to continue with outer loop, without further ++i */
+                        break;
+                    }
+                    ++start;
+                }
+                if(row==NULL) {
+                    continue; /* see row=NULL above */
+                }
+            }
+            ++i;
+        }
+
+        if(beVerbose && someMappingsAdded) {
+            puts("---- ---- ---- ----");
+        }
+    } while(someMappingsAdded);
+}
+
+/* exceptions --------------------------------------------------------------- */
+
+/* get the string length from zero-terminated code points in a limited-length array */
+static int32_t
+getLengthOfCodePoints(const UChar32 *s, int32_t maxLength) {
+    int32_t i, length;
+
+    for(i=length=0; i<maxLength && s[i]!=0; ++i) {
+        length+=U16_LENGTH(s[i]);
+    }
+    return length;
+}
+
+static UBool
+fullMappingEqualsSimple(const UChar *s, UChar32 simple, UChar32 c) {
+    int32_t i, length;
+    UChar32 full;
+
+    length=*s++;
+    if(length==0 || length>U16_MAX_LENGTH) {
+        return FALSE;
+    }
+    i=0;
+    U16_NEXT(s, i, length, full);
+
+    if(simple==0) {
+        simple=c; /* UCD has no simple mapping if it's the same as the code point itself */
+    }
+    return (UBool)(i==length && full==simple);
+}
+
+static uint16_t
+makeException(uint32_t value, Props *p) {
+    uint32_t slots[8];
+    uint32_t slotBits;
+    uint16_t excWord, i, count, length, fullLengths;
+    UBool doubleSlots;
+
+    /* exceptionsTop might be returned for storing in the trie word */
+    if(exceptionsTop>=UCASE_MAX_EXCEPTIONS) {
+        fprintf(stderr, "gencase error: too many exceptions words\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+
+    /* copy and shift the soft-dotted bits */
+    excWord=((uint16_t)value&UCASE_DOT_MASK)<<UCASE_EXC_DOT_SHIFT;
+
+    if(p->isCaseIgnorable) {
+        excWord|=UCASE_EXC_CASE_IGNORABLE;
+    }
+
+    /* update maxFullLength */
+    if(p->specialCasing!=NULL) {
+        length=p->specialCasing->lowerCase[0];
+        if(length>maxFullLength) {
+            maxFullLength=length;
+        }
+        length=p->specialCasing->upperCase[0];
+        if(length>maxFullLength) {
+            maxFullLength=length;
+        }
+        length=p->specialCasing->titleCase[0];
+        if(length>maxFullLength) {
+            maxFullLength=length;
+        }
+    }
+    if(p->caseFolding!=NULL) {
+        length=p->caseFolding->full[0];
+        if(length>maxFullLength) {
+            maxFullLength=length;
+        }
+    }
+
+    /* set the bits for conditional mappings */
+    if(p->specialCasing!=NULL && p->specialCasing->isComplex) {
+        excWord|=UCASE_EXC_CONDITIONAL_SPECIAL;
+        p->specialCasing=NULL;
+    }
+    if(p->caseFolding!=NULL && p->caseFolding->simple==0 && p->caseFolding->full[0]==0) {
+        excWord|=UCASE_EXC_CONDITIONAL_FOLD;
+        p->caseFolding=NULL;
+    }
+
+    /*
+     * Note:
+     * UCD stores no simple mappings when they are the same as the code point itself.
+     * SpecialCasing and CaseFolding do store simple mappings even if they are
+     * the same as the code point itself.
+     * Comparisons between simple regular mappings and simple special/folding
+     * mappings need to compensate for the difference by comparing with the
+     * original code point if a simple UCD mapping is missing (0).
+     */
+
+    /* remove redundant data */
+    if(p->specialCasing!=NULL) {
+        /* do not store full mappings if they are the same as the simple ones */
+        if(fullMappingEqualsSimple(p->specialCasing->lowerCase, p->lowerCase, p->code)) {
+            p->specialCasing->lowerCase[0]=0;
+        }
+        if(fullMappingEqualsSimple(p->specialCasing->upperCase, p->upperCase, p->code)) {
+            p->specialCasing->upperCase[0]=0;
+        }
+        if(fullMappingEqualsSimple(p->specialCasing->titleCase, p->titleCase, p->code)) {
+            p->specialCasing->titleCase[0]=0;
+        }
+    }
+    if( p->caseFolding!=NULL &&
+        fullMappingEqualsSimple(p->caseFolding->full, p->caseFolding->simple, p->code)
+    ) {
+        p->caseFolding->full[0]=0;
+    }
+
+    /* write the optional slots */
+    slotBits=0;
+    count=0;
+
+    if(p->lowerCase!=0) {
+        slots[count]=(uint32_t)p->lowerCase;
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_LOWER);
+    }
+    if( p->caseFolding!=NULL &&
+        p->caseFolding->simple!=0 &&
+        (p->lowerCase!=0 ?
+            p->caseFolding->simple!=p->lowerCase :
+            p->caseFolding->simple!=p->code)
+    ) {
+        slots[count]=(uint32_t)p->caseFolding->simple;
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_FOLD);
+    }
+    if(p->upperCase!=0) {
+        slots[count]=(uint32_t)p->upperCase;
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_UPPER);
+    }
+    if(p->upperCase!=p->titleCase) {
+        if(p->titleCase!=0) {
+            slots[count]=(uint32_t)p->titleCase;
+        } else {
+            slots[count]=(uint32_t)p->code;
+        }
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_TITLE);
+    }
+
+    /* length of case closure */
+    if(p->closure[0]!=0) {
+        length=getLengthOfCodePoints(p->closure, LENGTHOF(p->closure));
+        slots[count]=(uint32_t)length; /* must be 1..UCASE_CLOSURE_MAX_LENGTH */
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_CLOSURE);
+    }
+
+    /* lengths of full case mapping strings, stored in the last slot */
+    fullLengths=0;
+    if(p->specialCasing!=NULL) {
+        fullLengths=p->specialCasing->lowerCase[0];
+        fullLengths|=p->specialCasing->upperCase[0]<<8;
+        fullLengths|=p->specialCasing->titleCase[0]<<12;
+    }
+    if(p->caseFolding!=NULL) {
+        fullLengths|=p->caseFolding->full[0]<<4;
+    }
+    if(fullLengths!=0) {
+        slots[count]=fullLengths;
+        slotBits|=slots[count];
+        ++count;
+        excWord|=U_MASK(UCASE_EXC_FULL_MAPPINGS);
+    }
+
+    if(count==0) {
+        /* No optional slots: Try to share excWord entries. */
+        uint16_t excIndex;
+        for(excIndex=0; excIndex<exceptionsTop; ++excIndex) {
+            if(excWord==exceptions[excIndex]) {
+                return excIndex;
+            }
+        }
+        /* not found */
+        ++exceptionsTop;
+        exceptions[excIndex]=excWord;
+        return excIndex;
+    } else {
+        /* write slots */
+        uint16_t excIndex=exceptionsTop;
+        uint16_t excTop=excIndex+1; /* +1 for excWord which will be stored at excIndex */
+
+        doubleSlots=(UBool)(slotBits>0xffff);
+        if(!doubleSlots) {
+            for(i=0; i<count; ++i) {
+                exceptions[excTop++]=(uint16_t)slots[i];
+            }
+        } else {
+            excWord|=UCASE_EXC_DOUBLE_SLOTS;
+            for(i=0; i<count; ++i) {
+                exceptions[excTop++]=(uint16_t)(slots[i]>>16);
+                exceptions[excTop++]=(uint16_t)slots[i];
+            }
+        }
+
+        /* write the full case mapping strings */
+        if(p->specialCasing!=NULL) {
+            length=(uint16_t)p->specialCasing->lowerCase[0];
+            u_memcpy((UChar *)exceptions+excTop, p->specialCasing->lowerCase+1, length);
+            excTop+=length;
+        }
+        if(p->caseFolding!=NULL) {
+            length=(uint16_t)p->caseFolding->full[0];
+            u_memcpy((UChar *)exceptions+excTop, p->caseFolding->full+1, length);
+            excTop+=length;
+        }
+        if(p->specialCasing!=NULL) {
+            length=(uint16_t)p->specialCasing->upperCase[0];
+            u_memcpy((UChar *)exceptions+excTop, p->specialCasing->upperCase+1, length);
+            excTop+=length;
+
+            length=(uint16_t)p->specialCasing->titleCase[0];
+            u_memcpy((UChar *)exceptions+excTop, p->specialCasing->titleCase+1, length);
+            excTop+=length;
+        }
+
+        /* write the closure data */
+        if(p->closure[0]!=0) {
+            UChar32 c;
+
+            for(i=0; i<LENGTHOF(p->closure) && (c=p->closure[i])!=0; ++i) {
+                U16_APPEND_UNSAFE((UChar *)exceptions, excTop, c);
+            }
+        }
+
+        exceptionsTop=excTop;
+
+        /* write the main exceptions word */
+        exceptions[excIndex]=excWord;
+
+        return excIndex;
+    }
+}
+
+extern void
+makeExceptions() {
+    uint32_t *row;
+    uint32_t value;
+    int32_t i;
+    uint16_t excIndex;
+
+    i=0;
+    while((row=upvec_getRow(pv, i, NULL, NULL))!=NULL) {
+        value=*row;
+        if(value&UCASE_EXCEPTION) {
+            excIndex=makeException(value, excProps+(value>>UGENCASE_EXC_SHIFT));
+            *row=(value&~(UGENCASE_EXC_MASK|UCASE_EXC_MASK))|(excIndex<<UCASE_EXC_SHIFT);
+        }
+        ++i;
+    }
+}
+
+/* generate output data ----------------------------------------------------- */
+
+extern void
+generateData(const char *dataDir, UBool csource) {
+    static int32_t indexes[UCASE_IX_TOP]={
+        UCASE_IX_TOP
+    };
+    static uint8_t trieBlock[40000];
+
+    const uint32_t *row;
+    UChar32 start, end;
+    int32_t i;
+
+    UNewDataMemory *pData;
+    UTrie2 *pTrie;
+    UErrorCode errorCode=U_ZERO_ERROR;
+    int32_t trieSize;
+    long dataLength;
+
+    pTrie=utrie2_open(0, 0, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gencase error: utrie2_open() failed - %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+
+    for(i=0; (row=upvec_getRow(pv, i, &start, &end))!=NULL; ++i) {
+        if(start<UPVEC_FIRST_SPECIAL_CP) {
+            utrie2_setRange32(pTrie, start, end, *row, TRUE, &errorCode);
+            if(U_FAILURE(errorCode)) {
+                fprintf(stderr, "gencase error: utrie2_setRange32() failed - %s\n",
+                        u_errorName(errorCode));
+                exit(errorCode);
+            }
+        }
+    }
+
+    utrie2_freeze(pTrie, UTRIE2_16_VALUE_BITS, &errorCode);
+    trieSize=utrie2_serialize(pTrie, trieBlock, sizeof(trieBlock), &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gencase error: utrie2_freeze()+utrie2_serialize() failed: %s (length %ld)\n",
+                u_errorName(errorCode), (long)trieSize);
+        exit(errorCode);
+    }
+
+    indexes[UCASE_IX_EXC_LENGTH]=exceptionsTop;
+    indexes[UCASE_IX_TRIE_SIZE]=trieSize;
+    indexes[UCASE_IX_UNFOLD_LENGTH]=unfoldTop;
+    indexes[UCASE_IX_LENGTH]=(int32_t)sizeof(indexes)+trieSize+2*exceptionsTop+2*unfoldTop;
+
+    indexes[UCASE_IX_MAX_FULL_LENGTH]=maxFullLength;
+
+    if(beVerbose) {
+        printf("trie size in bytes:                    %5d\n", (int)trieSize);
+        printf("number of code points with exceptions: %5d\n", exceptionsCount);
+        printf("size in bytes of exceptions:           %5d\n", 2*exceptionsTop);
+        printf("size in bytes of reverse foldings:     %5d\n", 2*unfoldTop);
+        printf("data size:                             %5d\n", (int)indexes[UCASE_IX_LENGTH]);
+    }
+
+    if(csource) {
+        /* write .c file for hardcoded data */
+        FILE *f=usrc_create(dataDir, "ucase_props_data.c");
+        if(f!=NULL) {
+            usrc_writeArray(f,
+                "static const UVersionInfo ucase_props_dataVersion={",
+                dataInfo.dataVersion, 8, 4,
+                "};\n\n");
+            usrc_writeArray(f,
+                "static const int32_t ucase_props_indexes[UCASE_IX_TOP]={",
+                indexes, 32, UCASE_IX_TOP,
+                "};\n\n");
+            usrc_writeUTrie2Arrays(f,
+                "static const uint16_t ucase_props_trieIndex[%ld]={\n", NULL,
+                pTrie,
+                "\n};\n\n");
+            usrc_writeArray(f,
+                "static const uint16_t ucase_props_exceptions[%ld]={\n",
+                exceptions, 16, exceptionsTop,
+                "\n};\n\n");
+            usrc_writeArray(f,
+                "static const uint16_t ucase_props_unfold[%ld]={\n",
+                unfold, 16, unfoldTop,
+                "\n};\n\n");
+            fputs(
+                "static const UCaseProps ucase_props_singleton={\n"
+                "  NULL,\n"
+                "  ucase_props_indexes,\n"
+                "  ucase_props_exceptions,\n"
+                "  ucase_props_unfold,\n",
+                f);
+            usrc_writeUTrie2Struct(f,
+                "  {\n",
+                pTrie, "ucase_props_trieIndex", NULL,
+                "  },\n");
+            usrc_writeArray(f, "  { ", dataInfo.formatVersion, 8, 4, " }\n");
+            fputs("};\n", f);
+            fclose(f);
+        }
+    } else {
+        /* write the data */
+        pData=udata_create(dataDir, UCASE_DATA_TYPE, UCASE_DATA_NAME, &dataInfo,
+                        haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "gencase: unable to create data memory, %s\n", u_errorName(errorCode));
+            exit(errorCode);
+        }
+
+        udata_writeBlock(pData, indexes, sizeof(indexes));
+        udata_writeBlock(pData, trieBlock, trieSize);
+        udata_writeBlock(pData, exceptions, 2*exceptionsTop);
+        udata_writeBlock(pData, unfold, 2*unfoldTop);
+
+        /* finish up */
+        dataLength=udata_finish(pData, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "gencase: error %d writing the output file\n", errorCode);
+            exit(errorCode);
+        }
+
+        if(dataLength!=indexes[UCASE_IX_LENGTH]) {
+            fprintf(stderr, "gencase: data length %ld != calculated size %d\n",
+                dataLength, (int)indexes[UCASE_IX_LENGTH]);
+            exit(U_INTERNAL_PROGRAM_ERROR);
+        }
+    }
+
+    utrie2_close(pTrie);
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/gennames/CMakeLists.txt b/unicode/c/gennames/CMakeLists.txt
new file mode 100644
index 0000000..843f0c7
--- /dev/null
+++ b/unicode/c/gennames/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(gennames gennames.c)
+target_link_libraries(gennames icuuc icutu)
diff --git a/unicode/c/gennames/Makefile.in b/unicode/c/gennames/Makefile.in
new file mode 100644
index 0000000..ed2f88f
--- /dev/null
+++ b/unicode/c/gennames/Makefile.in
@@ -0,0 +1,97 @@
+## Makefile.in for ICU - tools/gennames
+## Copyright (c) 1999-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/gennames
+
+TARGET_STUB_NAME = gennames
+
+SECTION = 8
+
+#MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = gennames.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+#	$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+#	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS)
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/gennames/gennames.c b/unicode/c/gennames/gennames.c
new file mode 100644
index 0000000..d5e5bfd
--- /dev/null
+++ b/unicode/c/gennames/gennames.c
@@ -0,0 +1,1601 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  gennames.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 1999sep30
+*   created by: Markus W. Scherer
+*
+*   This program reads the Unicode character database text file,
+*   parses it, and extracts the character code,
+*   the "modern" character name, and optionally the
+*   Unicode 1.0 character name, and (starting with ICU 2.2) the ISO 10646 comment.
+*   It then tokenizes and compresses the names and builds
+*   compact binary tables for random-access lookup
+*   in a u_charName() API function.
+*
+* unames.icu file format (after UDataInfo header etc. - see udata.c)
+* (all data is static const)
+*
+* UDataInfo fields:
+*   dataFormat "unam"
+*   formatVersion 1.0
+*   dataVersion = Unicode version from -u or --unicode command line option, defaults to 3.0.0
+*
+* -- data-based names
+* uint32_t tokenStringOffset,
+*          groupsOffset,
+*          groupStringOffset,
+*          algNamesOffset;
+*
+* uint16_t tokenCount;
+* uint16_t tokenTable[tokenCount];
+*
+* char     tokenStrings[]; -- padded to even count
+*
+* -- strings (groupStrings) are tokenized as follows:
+*   for each character c
+*       if(c>=tokenCount) write that character c directly
+*   else
+*       token=tokenTable[c];
+*       if(token==0xfffe) -- lead byte of double-byte token
+*           token=tokenTable[c<<8|next character];
+*       if(token==-1)
+*           write c directly
+*       else
+*           tokenString=tokenStrings+token; (tokenStrings=start of names data + tokenStringOffset;)
+*           append zero-terminated tokenString;
+*
+*    Different strings for a code point - normal name, 1.0 name, and ISO comment -
+*    are separated by ';'.
+*
+* uint16_t groupCount;
+* struct {
+*   uint16_t groupMSB; -- for a group of 32 character names stored, this is code point>>5
+*   uint16_t offsetHigh; -- group strings are at start of names data + groupStringsOffset + this 32 bit-offset
+*   uint16_t offsetLow;
+* } groupTable[groupCount];
+*
+* char     groupStrings[]; -- padded to 4-count
+*
+* -- The actual, tokenized group strings are not zero-terminated because
+*   that would take up too much space.
+*   Instead, they are preceeded by their length, written in a variable-length sequence:
+*   For each of the 32 group strings, one or two nibbles are stored for its length.
+*   Nibbles (4-bit values, half-bytes) are read MSB first.
+*   A nibble with a value of 0..11 directly indicates the length of the name string.
+*   A nibble n with a value of 12..15 is a lead nibble and forms a value with the following nibble m
+*   by (((n-12)<<4)|m)+12, reaching values of 12..75.
+*   These lengths are sequentially for each tokenized string, not for the de-tokenized result.
+*   For the de-tokenizing, see token description above; the strings immediately follow the
+*   32 lengths.
+*
+* -- algorithmic names
+*
+* typedef struct AlgorithmicRange {
+*     uint32_t rangeStart, rangeEnd;
+*     uint8_t algorithmType, algorithmVariant;
+*     uint16_t rangeSize;
+* } AlgorithmicRange;
+*
+* uint32_t algRangesCount; -- number of data blocks for ranges of
+*               algorithmic names (Unicode 3.0.0: 3, hardcoded in gennames)
+*
+* struct {
+*     AlgorithmicRange algRange;
+*     uint8_t algRangeData[]; -- padded to 4-count except in last range
+* } algRanges[algNamesCount];
+* -- not a real array because each part has a different size
+*    of algRange.rangeSize (including AlgorithmicRange)
+*
+* -- algorithmic range types:
+*
+* 0 Names are formed from a string prefix that is stored in
+*   the algRangeData (zero-terminated), followed by the Unicode code point
+*   of the character in hexadecimal digits;
+*   algRange.algorithmVariant digits are written
+*
+* 1 Names are formed by calculating modulo-factors of the code point value as follows:
+*   algRange.algorithmVariant is the count of modulo factors
+*   algRangeData contains
+*       uint16_t factors[algRange.algorithmVariant];
+*       char strings[];
+*   the first zero-terminated string is written as the prefix; then:
+*
+*   The rangeStart is subtracted; with the difference, here "code":
+*   for(i=algRange.algorithmVariant-1 to 0 step -1)
+*       index[i]=code%factor[i];
+*       code/=factor[i];
+*
+*   The strings after the prefix are short pieces that are then appended to the result
+*   according to index[0..algRange.algorithmVariant-1].
+*/
+
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "unicode/udata.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "uarrsort.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uparse.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+#define STRING_STORE_SIZE 1000000
+#define GROUP_STORE_SIZE 5000
+
+#define GROUP_SHIFT 5
+#define LINES_PER_GROUP (1UL<<GROUP_SHIFT)
+#define GROUP_MASK (LINES_PER_GROUP-1)
+
+#define MAX_LINE_COUNT 50000
+#define MAX_WORD_COUNT 20000
+#define MAX_GROUP_COUNT 5000
+
+#define DATA_NAME "unames"
+#define DATA_TYPE "icu"
+#define VERSION_STRING "unam"
+#define NAME_SEPARATOR_CHAR ';'
+
+#define ISO_DATA_NAME "ucomment"
+
+/* Unicode versions --------------------------------------------------------- */
+
+enum {
+    UNI_1_0,
+    UNI_1_1,
+    UNI_2_0,
+    UNI_3_0,
+    UNI_3_1,
+    UNI_3_2,
+    UNI_4_0,
+    UNI_4_0_1,
+    UNI_4_1,
+    UNI_5_0,
+    UNI_5_1,
+    UNI_5_2,
+    UNI_6_0,
+    UNI_VER_COUNT
+};
+
+static const UVersionInfo
+unicodeVersions[]={
+    { 1, 0, 0, 0 },
+    { 1, 1, 0, 0 },
+    { 2, 0, 0, 0 },
+    { 3, 0, 0, 0 },
+    { 3, 1, 0, 0 },
+    { 3, 2, 0, 0 },
+    { 4, 0, 0, 0 },
+    { 4, 0, 1, 0 },
+    { 4, 1, 0, 0 },
+    { 5, 0, 0, 0 },
+    { 5, 1, 0, 0 },
+    { 5, 2, 0, 0 },
+    { 6, 0, 0, 0 }
+};
+
+static int32_t ucdVersion=UNI_5_2;
+
+static int32_t
+findUnicodeVersion(const UVersionInfo version) {
+    int32_t i;
+
+    for(i=0; /* while(version>unicodeVersions[i]) {} */
+        i<UNI_VER_COUNT && uprv_memcmp(version, unicodeVersions[i], 4)>0;
+        ++i) {}
+    if(0<i && i<UNI_VER_COUNT && uprv_memcmp(version, unicodeVersions[i], 4)<0) {
+        --i; /* fix 4.0.2 to land before 4.1, for valid x>=ucdVersion comparisons */
+    }
+    return i; /* version>=unicodeVersions[i] && version<unicodeVersions[i+1]; possible: i==UNI_VER_COUNT */
+}
+
+/* generator data ----------------------------------------------------------- */
+
+/* UDataInfo cf. udata.h */
+static UDataInfo dataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    sizeof(UChar),
+    0,
+
+    {0x75, 0x6e, 0x61, 0x6d},     /* dataFormat="unam" */
+    {1, 0, 0, 0},                 /* formatVersion */
+    {3, 0, 0, 0}                  /* dataVersion */
+};
+
+static UBool beVerbose=FALSE, beQuiet=FALSE, haveCopyright=TRUE;
+
+typedef struct Options {
+    UBool storeNames;
+    UBool store10Names;
+    UBool storeISOComments;
+} Options;
+
+/*
+ * Pair of code point and name alias.
+ * Try to keep sizeof(CpNameAlias) a multiple of 4 to avoid padding.
+ */
+typedef struct CpNameAlias {
+    uint32_t code;
+    char nameAlias[124];
+} CpNameAlias;
+
+static CpNameAlias cpNameAliases[50];
+
+static uint32_t cpNameAliasesIndex=0, cpNameAliasesTop=0;
+
+static uint8_t stringStore[STRING_STORE_SIZE],
+               groupStore[GROUP_STORE_SIZE],
+               lineLengths[LINES_PER_GROUP];
+
+static uint32_t lineTop=0, groupBottom, wordBottom=STRING_STORE_SIZE, lineLengthsTop;
+
+typedef struct {
+    uint32_t code;
+    int16_t length;
+    uint8_t *s;
+} Line;
+
+typedef struct {
+    int32_t weight; /* -(cost for token) + (number of occurences) * (length-1) */
+    int16_t count;
+    int16_t length;
+    uint8_t *s;
+} Word;
+
+static Line lines[MAX_LINE_COUNT];
+static Word words[MAX_WORD_COUNT];
+
+static uint32_t lineCount=0, wordCount=0;
+
+static int16_t leadByteCount;
+
+#define LEADBYTE_LIMIT 16
+
+static int16_t tokens[LEADBYTE_LIMIT*256];
+static uint32_t tokenCount;
+
+/* prototypes --------------------------------------------------------------- */
+
+static void
+init(void);
+
+static void
+parseNameAliases(const char *filename, Options *options);
+
+static void
+parseDB(const char *filename, Options *options);
+
+static void
+parseName(char *name, int16_t length);
+
+static int16_t
+skipNoise(char *line, int16_t start, int16_t limit);
+
+static int16_t
+getWord(char *line, int16_t start, int16_t limit);
+
+static void
+compress(void);
+
+static void
+compressLines(void);
+
+static int16_t
+compressLine(uint8_t *s, int16_t length, int16_t *pGroupTop);
+
+static int32_t
+compareWords(const void *context, const void *word1, const void *word2);
+
+static void
+generateData(const char *dataDir, Options *options);
+
+static uint32_t
+generateAlgorithmicData(UNewDataMemory *pData, Options *options);
+
+static int16_t
+findToken(uint8_t *s, int16_t length);
+
+static Word *
+findWord(char *s, int16_t length);
+
+static Word *
+addWord(char *s, int16_t length);
+
+static void
+countWord(Word *word);
+
+static void
+addLine(uint32_t code, char *names[], int16_t lengths[], int16_t count);
+
+static void
+addGroup(uint32_t groupMSB, uint8_t *strings, int16_t length);
+
+static uint32_t
+addToken(uint8_t *s, int16_t length);
+
+static void
+appendLineLength(int16_t length);
+
+static void
+appendLineLengthNibble(uint8_t nibble);
+
+static uint8_t *
+allocLine(int32_t length);
+
+static uint8_t *
+allocWord(uint32_t length);
+
+/* -------------------------------------------------------------------------- */
+
+enum {
+    HELP_H,
+    HELP_QUESTION_MARK,
+    VERBOSE,
+    QUIET,
+    COPYRIGHT,
+    DESTDIR,
+    UNICODE,
+    UNICODE1_NAMES,
+    NO_ISO_COMMENTS,
+    ONLY_ISO_COMMENTS
+};
+
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_VERBOSE,
+    UOPTION_QUIET,
+    UOPTION_COPYRIGHT,
+    UOPTION_DESTDIR,
+    { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 },
+    { "unicode1-names", NULL, NULL, NULL, '1', UOPT_NO_ARG, 0 },
+    { "no-iso-comments", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
+    { "only-iso-comments", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 }
+};
+
+extern int
+main(int argc, char* argv[]) {
+    UVersionInfo version;
+    Options moreOptions={ TRUE, FALSE, TRUE };
+    UErrorCode errorCode = U_ZERO_ERROR;
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* Initialize ICU */
+    u_init(&errorCode);
+    if (U_FAILURE(errorCode) && errorCode != U_FILE_ACCESS_ERROR) {
+        /* Note: u_init() will try to open ICU property data.
+         *       failures here are expected when building ICU from scratch.
+         *       ignore them.
+         */
+        fprintf(stderr, "%s: can not initialize ICU.  errorCode = %s\n",
+            argv[0], u_errorName(errorCode));
+        exit(1);
+    }
+
+    /* preset then read command line options */
+    options[DESTDIR].value=u_getDataDirectory();
+    options[UNICODE].value="4.1";
+    argc=u_parseArgs(argc, argv, LENGTHOF(options), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    } else if(argc<2) {
+        argc=-1;
+    }
+    if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
+        /*
+         * Broken into chucks because the C89 standard says the minimum
+         * required supported string length is 509 bytes.
+         */
+        fprintf(stderr,
+            "Usage: %s [-1[+|-]] [-v[+|-]] [-c[+|-]] [filename_ud [filename_na]]\n"
+            "\n"
+            "Read the UnicodeData.txt file and \n"
+            "create a binary file " DATA_NAME "." DATA_TYPE " with the character names\n"
+            "\n"
+            "\tfilename_ud  absolute path/filename for the UnicodeData.txt file\n"
+            "\t             (default: standard input)\n"
+            "\tfilename_na  absolute path/filename for the NameAliases.txt file\n"
+            "\t             (default: no name aliases)\n"
+            "\n",
+            argv[0]);
+        fprintf(stderr,
+            "Options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     verbose output\n"
+            "\t-q or --quiet       no output\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-u or --unicode     Unicode version, followed by the version like 3.0.0\n");
+        fprintf(stderr,
+            "\t-1 or --unicode1-names     store Unicode 1.0 character names\n"
+            "\t      --no-iso-comments    do not store ISO comments\n"
+            "\t      --only-iso-comments  write ucomment.icu with only ISO comments\n");
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    beVerbose=options[VERBOSE].doesOccur;
+    beQuiet=options[QUIET].doesOccur;
+    haveCopyright=options[COPYRIGHT].doesOccur;
+    moreOptions.store10Names=options[UNICODE1_NAMES].doesOccur;
+    moreOptions.storeISOComments=!options[NO_ISO_COMMENTS].doesOccur;
+    if(options[ONLY_ISO_COMMENTS].doesOccur) {
+        moreOptions.storeNames=moreOptions.store10Names=FALSE;
+        moreOptions.storeISOComments=TRUE;
+    }
+
+    /* set the Unicode version */
+    u_versionFromString(version, options[UNICODE].value);
+    uprv_memcpy(dataInfo.dataVersion, version, 4);
+    ucdVersion=findUnicodeVersion(version);
+
+    init();
+    if(argc>=3) {
+        parseNameAliases(argv[2], &moreOptions);
+    }
+    parseDB(argc>=2 ? argv[1] : "-", &moreOptions);
+    compress();
+    generateData(options[DESTDIR].value, &moreOptions);
+
+    u_cleanup();
+    return 0;
+}
+
+static void
+init() {
+    int i;
+
+    for(i=0; i<256; ++i) {
+        tokens[i]=0;
+    }
+}
+
+/* parsing ------------------------------------------------------------------ */
+
+/* get a name, strip leading and trailing whitespace */
+static int16_t
+getName(char **pStart, char *limit) {
+    /* strip leading whitespace */
+    char *start=(char *)u_skipWhitespace(*pStart);
+
+    /* strip trailing whitespace */
+    while(start<limit && (*(limit-1)==' ' || *(limit-1)=='\t')) {
+        --limit;
+    }
+
+    /* return results */
+    *pStart=start;
+    return (int16_t)(limit-start);
+}
+
+static void U_CALLCONV
+nameAliasesLineFn(void *context,
+       char *fields[][2], int32_t fieldCount,
+       UErrorCode *pErrorCode) {
+    char *name;
+    int16_t length=0;
+    static uint32_t prevCode=0;
+    uint32_t code=0;
+
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+    /* get the character code */
+    code=uprv_strtoul(fields[0][0], NULL, 16);
+
+    /* get the character name */
+    name=fields[1][0];
+    length=getName(&name, fields[1][1]);
+    if(length==0 || length>=sizeof(cpNameAliases[cpNameAliasesTop].nameAlias)) {
+        fprintf(stderr, "gennames: error - name alias %s empty or too long for code point U+%04lx\n",
+                name, (unsigned long)code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* check for non-character code points */
+    if(!U_IS_UNICODE_CHAR(code)) {
+        fprintf(stderr, "gennames: error - name alias for non-character code point U+%04lx\n",
+                (unsigned long)code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* check that the code points (code) are in ascending order */
+    if(code<=prevCode && code>0) {
+        fprintf(stderr, "gennames: error - NameAliases entries out of order, U+%04lx after U+%04lx\n",
+                (unsigned long)code, (unsigned long)prevCode);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    prevCode=code;
+
+    if(cpNameAliasesTop>=LENGTHOF(cpNameAliases)) {
+        fprintf(stderr, "gennames: error - too many name aliases\n");
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    cpNameAliases[cpNameAliasesTop].code=code;
+    uprv_memcpy(cpNameAliases[cpNameAliasesTop].nameAlias, name, length);
+    cpNameAliases[cpNameAliasesTop].nameAlias[length]=0;
+    ++cpNameAliasesTop;
+
+    parseName(name, length);
+}
+
+static void U_CALLCONV
+lineFn(void *context,
+       char *fields[][2], int32_t fieldCount,
+       UErrorCode *pErrorCode) {
+    Options *storeOptions=(Options *)context;
+    char *names[4];
+    int16_t lengths[4]={ 0, 0, 0, 0 };
+    static uint32_t prevCode=0;
+    uint32_t code=0;
+
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+    /* get the character code */
+    code=uprv_strtoul(fields[0][0], NULL, 16);
+
+    /* get the character name */
+    if(storeOptions->storeNames) {
+        names[0]=fields[1][0];
+        lengths[0]=getName(names+0, fields[1][1]);
+        if(names[0][0]=='<') {
+            /* do not store pseudo-names in <> brackets */
+            lengths[0]=0;
+        }
+    }
+
+    /* store 1.0 names */
+    /* get the second character name, the one from Unicode 1.0 */
+    if(storeOptions->store10Names) {
+        names[1]=fields[10][0];
+        lengths[1]=getName(names+1, fields[10][1]);
+        if(names[1][0]=='<') {
+            /* do not store pseudo-names in <> brackets */
+            lengths[1]=0;
+        }
+    }
+
+    /* get the ISO 10646 comment */
+    if(storeOptions->storeISOComments) {
+        names[2]=fields[11][0];
+        lengths[2]=getName(names+2, fields[11][1]);
+    }
+
+    if(lengths[0]+lengths[1]+lengths[2]==0) {
+        return;
+    }
+
+    /* check for non-character code points */
+    if(!U_IS_UNICODE_CHAR(code)) {
+        fprintf(stderr, "gennames: error - properties for non-character code point U+%04lx\n",
+                (unsigned long)code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* check that the code points (code) are in ascending order */
+    if(code<=prevCode && code>0) {
+        fprintf(stderr, "gennames: error - UnicodeData entries out of order, U+%04lx after U+%04lx\n",
+                (unsigned long)code, (unsigned long)prevCode);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    prevCode=code;
+
+    parseName(names[0], lengths[0]);
+    parseName(names[1], lengths[1]);
+    parseName(names[2], lengths[2]);
+
+    if(cpNameAliasesIndex<cpNameAliasesTop && code>=cpNameAliases[cpNameAliasesIndex].code) {
+        if(code==cpNameAliases[cpNameAliasesIndex].code) {
+            names[3]=cpNameAliases[cpNameAliasesIndex].nameAlias;
+            lengths[3]=(int16_t)uprv_strlen(cpNameAliases[cpNameAliasesIndex].nameAlias);
+            ++cpNameAliasesIndex;
+        } else {
+            fprintf(stderr, "gennames: error - NameAlias but no UnicodeData entry for U+%04lx\n",
+                    (unsigned long)code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+    }
+
+    /*
+     * set the count argument to
+     * 1: only store regular names, or only store ISO 10646 comments
+     * 2: store regular and 1.0 names
+     * 3: store names and ISO 10646 comment
+     * 4: also store name alias
+     *
+     * addLine() will ignore empty trailing names
+     */
+    if(storeOptions->storeNames) {
+        /* store names and comments as parsed according to storeOptions */
+        addLine(code, names, lengths, LENGTHOF(names));
+    } else {
+        /* store only ISO 10646 comments */
+        addLine(code, names+2, lengths+2, 1);
+    }
+}
+
+static void
+parseNameAliases(const char *filename, Options *storeOptions) {
+    char *fields[2][2];
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    if(!storeOptions->storeNames) {
+        return;
+    }
+    u_parseDelimitedFile(filename, ';', fields, 2, nameAliasesLineFn, NULL, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gennames parse error: %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+
+    if(!beQuiet) {
+        printf("number of name aliases: %lu\n", (unsigned long)cpNameAliasesTop);
+    }
+}
+
+static void
+parseDB(const char *filename, Options *storeOptions) {
+    char *fields[15][2];
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    u_parseDelimitedFile(filename, ';', fields, 15, lineFn, storeOptions, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gennames parse error: %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+    if(cpNameAliasesIndex<cpNameAliasesTop) {
+        fprintf(stderr, "gennames: error - NameAlias but no UnicodeData entry for U+%04lx\n",
+                (unsigned long)cpNameAliases[cpNameAliasesIndex].code);
+        exit(U_PARSE_ERROR);
+    }
+
+    if(!beQuiet) {
+        printf("size of all names in the database: %lu\n",
+            (unsigned long)lineTop);
+        printf("number of named Unicode characters: %lu\n",
+            (unsigned long)lineCount);
+        printf("number of words in the dictionary from these names: %lu\n",
+            (unsigned long)wordCount);
+    }
+}
+
+static void
+parseName(char *name, int16_t length) {
+    int16_t start=0, limit, wordLength/*, prevStart=-1*/;
+    Word *word;
+
+    while(start<length) {
+        /* skip any "noise" characters */
+        limit=skipNoise(name, start, length);
+        if(start<limit) {
+            /*prevStart=-1;*/
+            start=limit;
+        }
+        if(start==length) {
+            break;
+        }
+
+        /* get a word and add it if it is longer than 1 */
+        limit=getWord(name, start, length);
+        wordLength=(int16_t)(limit-start);
+        if(wordLength>1) {
+            word=findWord(name+start, wordLength);
+            if(word==NULL) {
+                word=addWord(name+start, wordLength);
+            }
+            countWord(word);
+        }
+
+#if 0
+        /*
+         * if there was a word before this
+         * (with no noise in between), then add the pair of words, too
+         */
+        if(prevStart!=-1) {
+            wordLength=limit-prevStart;
+            word=findWord(name+prevStart, wordLength);
+            if(word==NULL) {
+                word=addWord(name+prevStart, wordLength);
+            }
+            countWord(word);
+        }
+#endif
+
+        /*prevStart=start;*/
+        start=limit;
+    }
+}
+
+static UBool U_INLINE
+isWordChar(char c) {
+    return ('A'<=c && c<='I') || /* EBCDIC-safe check for letters */
+           ('J'<=c && c<='R') ||
+           ('S'<=c && c<='Z') ||
+
+           ('a'<=c && c<='i') || /* lowercase letters for ISO comments */
+           ('j'<=c && c<='r') ||
+           ('s'<=c && c<='z') ||
+
+           ('0'<=c && c<='9');
+}
+
+static int16_t
+skipNoise(char *line, int16_t start, int16_t limit) {
+    /* skip anything that is not part of a word in this sense */
+    while(start<limit && !isWordChar(line[start])) {
+        ++start;
+    }
+
+    return start;
+}
+
+static int16_t
+getWord(char *line, int16_t start, int16_t limit) {
+    char c=0; /* initialize to avoid a compiler warning although the code was safe */
+
+    /* a unicode character name word consists of A-Z0-9 */
+    while(start<limit && isWordChar(line[start])) {
+        ++start;
+    }
+
+    /* include a following space or dash */
+    if(start<limit && ((c=line[start])==' ' || c=='-')) {
+        ++start;
+    }
+
+    return start;
+}
+
+/* compressing -------------------------------------------------------------- */
+
+static void
+compress() {
+    uint32_t i, letterCount;
+    int16_t wordNumber;
+    UErrorCode errorCode;
+
+    /* sort the words in reverse order by weight */
+    errorCode=U_ZERO_ERROR;
+    uprv_sortArray(words, wordCount, sizeof(Word),
+                    compareWords, NULL, FALSE, &errorCode);
+
+    /* remove the words that do not save anything */
+    while(wordCount>0 && words[wordCount-1].weight<1) {
+        --wordCount;
+    }
+
+    /* count the letters in the token range */
+    letterCount=0;
+    for(i=LEADBYTE_LIMIT; i<256; ++i) {
+        if(tokens[i]==-1) {
+            ++letterCount;
+        }
+    }
+    if(!beQuiet) {
+        printf("number of letters used in the names: %d\n", (int)letterCount);
+    }
+
+    /* do we need double-byte tokens? */
+    if(wordCount+letterCount<=256) {
+        /* no, single-byte tokens are enough */
+        leadByteCount=0;
+        for(i=0, wordNumber=0; wordNumber<(int16_t)wordCount; ++i) {
+            if(tokens[i]!=-1) {
+                tokens[i]=wordNumber;
+                if(beVerbose) {
+                    printf("tokens[0x%03x]: word%8ld \"%.*s\"\n",
+                            (int)i, (long)words[wordNumber].weight,
+                            words[wordNumber].length, words[wordNumber].s);
+                }
+                ++wordNumber;
+            }
+        }
+        tokenCount=i;
+    } else {
+        /*
+         * The tokens that need two token bytes
+         * get their weight reduced by their count
+         * because they save less.
+         */
+        tokenCount=256-letterCount;
+        for(i=tokenCount; i<wordCount; ++i) {
+            words[i].weight-=words[i].count;
+        }
+
+        /* sort these words in reverse order by weight */
+        errorCode=U_ZERO_ERROR;
+        uprv_sortArray(words+tokenCount, wordCount-tokenCount, sizeof(Word),
+                        compareWords, NULL, FALSE, &errorCode);
+
+        /* remove the words that do not save anything */
+        while(wordCount>0 && words[wordCount-1].weight<1) {
+            --wordCount;
+        }
+
+        /* how many tokens and lead bytes do we have now? */
+        tokenCount=wordCount+letterCount+(LEADBYTE_LIMIT-1);
+        /*
+         * adjust upwards to take into account that
+         * double-byte tokens must not
+         * use NAME_SEPARATOR_CHAR as a second byte
+         */
+        tokenCount+=(tokenCount-256+254)/255;
+
+        leadByteCount=(int16_t)(tokenCount>>8);
+        if(leadByteCount<LEADBYTE_LIMIT) {
+            /* adjust for the real number of lead bytes */
+            tokenCount-=(LEADBYTE_LIMIT-1)-leadByteCount;
+        } else {
+            /* limit the number of lead bytes */
+            leadByteCount=LEADBYTE_LIMIT-1;
+            tokenCount=LEADBYTE_LIMIT*256;
+            wordCount=tokenCount-letterCount-(LEADBYTE_LIMIT-1);
+            /* adjust again to skip double-byte tokens with ';' */
+            wordCount-=(tokenCount-256+254)/255;
+        }
+
+        /* set token 0 to word 0 */
+        tokens[0]=0;
+        if(beVerbose) {
+            printf("tokens[0x000]: word%8ld \"%.*s\"\n",
+                    (long)words[0].weight,
+                    words[0].length, words[0].s);
+        }
+        wordNumber=1;
+
+        /* set the lead byte tokens */
+        for(i=1; (int16_t)i<=leadByteCount; ++i) {
+            tokens[i]=-2;
+        }
+
+        /* set the tokens */
+        for(; i<256; ++i) {
+            /* if store10Names then the parser set tokens[NAME_SEPARATOR_CHAR]=-1 */
+            if(tokens[i]!=-1) {
+                tokens[i]=wordNumber;
+                if(beVerbose) {
+                    printf("tokens[0x%03x]: word%8ld \"%.*s\"\n",
+                            (int)i, (long)words[wordNumber].weight,
+                            words[wordNumber].length, words[wordNumber].s);
+                }
+                ++wordNumber;
+            }
+        }
+
+        /* continue above 255 where there are no letters */
+        for(; (uint32_t)wordNumber<wordCount; ++i) {
+            if((i&0xff)==NAME_SEPARATOR_CHAR) {
+                tokens[i]=-1; /* do not use NAME_SEPARATOR_CHAR as a second token byte */
+            } else {
+                tokens[i]=wordNumber;
+                if(beVerbose) {
+                    printf("tokens[0x%03x]: word%8ld \"%.*s\"\n",
+                            (int)i, (long)words[wordNumber].weight,
+                            words[wordNumber].length, words[wordNumber].s);
+                }
+                ++wordNumber;
+            }
+        }
+        tokenCount=i; /* should be already tokenCount={i or i+1} */
+    }
+
+    if(!beQuiet) {
+        printf("number of lead bytes: %d\n", leadByteCount);
+        printf("number of single-byte tokens: %lu\n",
+            (unsigned long)256-letterCount-leadByteCount);
+        printf("number of tokens: %lu\n", (unsigned long)tokenCount);
+    }
+
+    compressLines();
+}
+
+static void
+compressLines() {
+    Line *line=NULL;
+    uint32_t i=0, inLine, outLine=0xffffffff /* (uint32_t)(-1) */,
+             groupMSB=0xffff, lineCount2;
+    int16_t groupTop=0;
+
+    /* store the groups like lines, with compressed data after raw strings */
+    groupBottom=lineTop;
+    lineCount2=lineCount;
+    lineCount=0;
+
+    /* loop over all lines */
+    while(i<lineCount2) {
+        line=lines+i++;
+        inLine=line->code;
+
+        /* segment the lines to groups of 32 */
+        if(inLine>>GROUP_SHIFT!=groupMSB) {
+            /* finish the current group with empty lines */
+            while((++outLine&GROUP_MASK)!=0) {
+                appendLineLength(0);
+            }
+
+            /* store the group like a line */
+            if(groupTop>0) {
+                if(groupTop>GROUP_STORE_SIZE) {
+                    fprintf(stderr, "gennames: group store overflow\n");
+                    exit(U_BUFFER_OVERFLOW_ERROR);
+                }
+                addGroup(groupMSB, groupStore, groupTop);
+            }
+
+            /* start the new group */
+            lineLengthsTop=0;
+            groupTop=0;
+            groupMSB=inLine>>GROUP_SHIFT;
+            outLine=(inLine&~GROUP_MASK)-1;
+        }
+
+        /* write empty lines between the previous line in the group and this one */
+        while(++outLine<inLine) {
+            appendLineLength(0);
+        }
+
+        /* write characters and tokens for this line */
+        appendLineLength(compressLine(line->s, line->length, &groupTop));
+    }
+
+    /* finish and store the last group */
+    if(line && groupMSB!=0xffff) {
+        /* finish the current group with empty lines */
+        while((++outLine&GROUP_MASK)!=0) {
+            appendLineLength(0);
+        }
+
+        /* store the group like a line */
+        if(groupTop>0) {
+            if(groupTop>GROUP_STORE_SIZE) {
+                fprintf(stderr, "gennames: group store overflow\n");
+                exit(U_BUFFER_OVERFLOW_ERROR);
+            }
+            addGroup(groupMSB, groupStore, groupTop);
+        }
+    }
+
+    if(!beQuiet) {
+        printf("number of groups: %lu\n", (unsigned long)lineCount);
+    }
+}
+
+static int16_t
+compressLine(uint8_t *s, int16_t length, int16_t *pGroupTop) {
+    int16_t start, limit, token, groupTop=*pGroupTop;
+
+    start=0;
+    do {
+        /* write any "noise" characters */
+        limit=skipNoise((char *)s, start, length);
+        while(start<limit) {
+            groupStore[groupTop++]=s[start++];
+        }
+
+        if(start==length) {
+            break;
+        }
+
+        /* write a word, as token or directly */
+        limit=getWord((char *)s, start, length);
+        if(limit-start==1) {
+            groupStore[groupTop++]=s[start++];
+        } else {
+            token=findToken(s+start, (int16_t)(limit-start));
+            if(token!=-1) {
+                if(token>0xff) {
+                    groupStore[groupTop++]=(uint8_t)(token>>8);
+                }
+                groupStore[groupTop++]=(uint8_t)token;
+                start=limit;
+            } else {
+                while(start<limit) {
+                    groupStore[groupTop++]=s[start++];
+                }
+            }
+        }
+    } while(start<length);
+
+    length=(int16_t)(groupTop-*pGroupTop);
+    *pGroupTop=groupTop;
+    return length;
+}
+
+static int32_t
+compareWords(const void *context, const void *word1, const void *word2) {
+    /* reverse sort by word weight */
+    return ((Word *)word2)->weight-((Word *)word1)->weight;
+}
+
+/* generate output data ----------------------------------------------------- */
+
+static void
+generateData(const char *dataDir, Options *storeOptions) {
+    UNewDataMemory *pData;
+    UErrorCode errorCode=U_ZERO_ERROR;
+    uint16_t groupWords[3];
+    uint32_t i, groupTop=lineTop, offset, size,
+             tokenStringOffset, groupsOffset, groupStringOffset, algNamesOffset;
+    long dataLength;
+    int16_t token;
+
+    pData=udata_create(dataDir,
+                       DATA_TYPE, storeOptions->storeNames ? DATA_NAME : ISO_DATA_NAME,
+                       &dataInfo,
+                       haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gennames: unable to create data memory, error %d\n", errorCode);
+        exit(errorCode);
+    }
+
+    /* first, see how much space we need, and prepare the token strings */
+    for(i=0; i<tokenCount; ++i) {
+        token=tokens[i];
+        if(token!=-1 && token!=-2) {
+            tokens[i]=(int16_t)(addToken(words[token].s, words[token].length)-groupTop);
+        }
+    }
+
+    /*
+     * Required padding for data swapping:
+     * The token table undergoes a permutation during data swapping when the
+     * input and output charsets are different.
+     * The token table cannot grow during swapping, so we need to make sure that
+     * the table is long enough for successful in-place permutation.
+     *
+     * We simply round up tokenCount to the next multiple of 256 to account for
+     * all possible permutations.
+     *
+     * An optimization is possible if we only ever swap between ASCII and EBCDIC:
+     *
+     * If tokenCount>256, then a semicolon (NAME_SEPARATOR_CHAR) is used
+     * and will be swapped between ASCII and EBCDIC between
+     * positions 0x3b (ASCII semicolon) and 0x5e (EBCDIC semicolon).
+     * This should be the only -1 entry in tokens[256..511] on which the data
+     * swapper bases its trail byte permutation map (trailMap[]).
+     *
+     * It would be sufficient to increase tokenCount so that its lower 8 bits
+     * are at least 0x5e+1 to make room for swapping between the two semicolons.
+     * For values higher than 0x5e, the trail byte permutation map (trailMap[])
+     * should always be an identity map, where we do not need additional room.
+     */
+    i=tokenCount;
+    tokenCount=(tokenCount+0xff)&~0xff;
+    if(!beQuiet && i<tokenCount) {
+        printf("number of tokens[] padding entries for data swapping: %lu\n", (unsigned long)(tokenCount-i));
+    }
+    for(; i<tokenCount; ++i) {
+        if((i&0xff)==NAME_SEPARATOR_CHAR) {
+            tokens[i]=-1; /* do not use NAME_SEPARATOR_CHAR as a second token byte */
+        } else {
+            tokens[i]=0; /* unused token for padding */
+        }
+    }
+
+    /*
+     * Calculate the total size in bytes of the data including:
+     * - the offset to the token strings, uint32_t (4)
+     * - the offset to the group table, uint32_t (4)
+     * - the offset to the group strings, uint32_t (4)
+     * - the offset to the algorithmic names, uint32_t (4)
+     *
+     * - the number of tokens, uint16_t (2)
+     * - the token table, uint16_t[tokenCount] (2*tokenCount)
+     *
+     * - the token strings, each zero-terminated (tokenSize=(lineTop-groupTop)), 2-padded
+     *
+     * - the number of groups, uint16_t (2)
+     * - the group table, { uint16_t groupMSB, uint16_t offsetHigh, uint16_t offsetLow }[6*groupCount]
+     *
+     * - the group strings (groupTop-groupBottom), 2-padded
+     *
+     * - the size of the data for the algorithmic names
+     */
+    tokenStringOffset=4+4+4+4+2+2*tokenCount;
+    groupsOffset=(tokenStringOffset+(lineTop-groupTop)+1)&~1;
+    groupStringOffset=groupsOffset+2+6*lineCount;
+    algNamesOffset=(groupStringOffset+(groupTop-groupBottom)+3)&~3;
+
+    offset=generateAlgorithmicData(NULL, storeOptions);
+    size=algNamesOffset+offset;
+
+    if(!beQuiet) {
+        printf("size of the Unicode Names data:\n"
+               "total data length %lu, token strings %lu, compressed strings %lu, algorithmic names %lu\n",
+                (unsigned long)size, (unsigned long)(lineTop-groupTop),
+                (unsigned long)(groupTop-groupBottom), (unsigned long)offset);
+    }
+
+    /* write the data to the file */
+    /* offsets */
+    udata_write32(pData, tokenStringOffset);
+    udata_write32(pData, groupsOffset);
+    udata_write32(pData, groupStringOffset);
+    udata_write32(pData, algNamesOffset);
+
+    /* token table */
+    udata_write16(pData, (uint16_t)tokenCount);
+    udata_writeBlock(pData, tokens, 2*tokenCount);
+
+    /* token strings */
+    udata_writeBlock(pData, stringStore+groupTop, lineTop-groupTop);
+    if((lineTop-groupTop)&1) {
+        /* 2-padding */
+        udata_writePadding(pData, 1);
+    }
+
+    /* group table */
+    udata_write16(pData, (uint16_t)lineCount);
+    for(i=0; i<lineCount; ++i) {
+        /* groupMSB */
+        groupWords[0]=(uint16_t)lines[i].code;
+
+        /* offset */
+        offset = (uint32_t)((lines[i].s - stringStore)-groupBottom);
+        groupWords[1]=(uint16_t)(offset>>16);
+        groupWords[2]=(uint16_t)(offset);
+        udata_writeBlock(pData, groupWords, 6);
+    }
+
+    /* group strings */
+    udata_writeBlock(pData, stringStore+groupBottom, groupTop-groupBottom);
+
+    /* 4-align the algorithmic names data */
+    udata_writePadding(pData, algNamesOffset-(groupStringOffset+(groupTop-groupBottom)));
+
+    generateAlgorithmicData(pData, storeOptions);
+
+    /* finish up */
+    dataLength=udata_finish(pData, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "gennames: error %d writing the output file\n", errorCode);
+        exit(errorCode);
+    }
+
+    if(dataLength!=(long)size) {
+        fprintf(stderr, "gennames: data length %ld != calculated size %lu\n",
+dataLength, (unsigned long)size);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+}
+
+/* the structure for algorithmic names needs to be 4-aligned */
+typedef struct AlgorithmicRange {
+    uint32_t rangeStart, rangeEnd;
+    uint8_t algorithmType, algorithmVariant;
+    uint16_t rangeSize;
+} AlgorithmicRange;
+
+static uint32_t
+generateAlgorithmicData(UNewDataMemory *pData, Options *storeOptions) {
+    static char prefix[] = "CJK UNIFIED IDEOGRAPH-";
+#   define PREFIX_LENGTH 23
+#   define PREFIX_LENGTH_4 24
+    uint32_t countAlgRanges;
+
+    static AlgorithmicRange cjkExtA={
+        0x3400, 0x4db5,
+        0, 4,
+        sizeof(AlgorithmicRange)+PREFIX_LENGTH_4
+    };
+    static AlgorithmicRange cjk={
+        0x4e00, 0x9fa5,
+        0, 4,
+        sizeof(AlgorithmicRange)+PREFIX_LENGTH_4
+    };
+    static AlgorithmicRange cjkExtB={
+        0x20000, 0x2a6d6,
+        0, 5,
+        sizeof(AlgorithmicRange)+PREFIX_LENGTH_4
+    };
+    static AlgorithmicRange cjkExtC={
+        0x2a700, 0x2b734,
+        0, 5,
+        sizeof(AlgorithmicRange)+PREFIX_LENGTH_4
+    };
+    static AlgorithmicRange cjkExtD={
+        0x2b740, 0x2b81d,
+        0, 5,
+        sizeof(AlgorithmicRange)+PREFIX_LENGTH_4
+    };
+
+    static char jamo[]=
+        "HANGUL SYLLABLE \0"
+
+        "G\0GG\0N\0D\0DD\0R\0M\0B\0BB\0"
+        "S\0SS\0\0J\0JJ\0C\0K\0T\0P\0H\0"
+
+        "A\0AE\0YA\0YAE\0EO\0E\0YEO\0YE\0O\0"
+        "WA\0WAE\0OE\0YO\0U\0WEO\0WE\0WI\0"
+        "YU\0EU\0YI\0I\0"
+
+        "\0G\0GG\0GS\0N\0NJ\0NH\0D\0L\0LG\0LM\0"
+        "LB\0LS\0LT\0LP\0LH\0M\0B\0BS\0"
+        "S\0SS\0NG\0J\0C\0K\0T\0P\0H"
+    ;
+
+    static AlgorithmicRange hangul={
+        0xac00, 0xd7a3,
+        1, 3,
+        sizeof(AlgorithmicRange)+6+sizeof(jamo)
+    };
+
+    /* modulo factors, maximum 8 */
+    /* 3 factors: 19, 21, 28, most-to-least-significant */
+    static uint16_t hangulFactors[3]={
+        19, 21, 28
+    };
+
+    uint32_t size;
+
+    size=0;
+
+    if(ucdVersion>=UNI_5_2) {
+        /* Unicode 5.2 and up has a longer CJK Unihan range than before */
+        cjk.rangeEnd=0x9FCB;
+    } else if(ucdVersion>=UNI_5_1) {
+        /* Unicode 5.1 and up has a longer CJK Unihan range than before */
+        cjk.rangeEnd=0x9FC3;
+    } else if(ucdVersion>=UNI_4_1) {
+        /* Unicode 4.1 and up has a longer CJK Unihan range than before */
+        cjk.rangeEnd=0x9FBB;
+    }
+
+    /* number of ranges of algorithmic names */
+    if(!storeOptions->storeNames) {
+        countAlgRanges=0;
+    } else if(ucdVersion>=UNI_6_0) {
+        /* Unicode 6.0 and up has 6 ranges including CJK Extension D */
+        countAlgRanges=6;
+    } else if(ucdVersion>=UNI_5_2) {
+        /* Unicode 5.2 and up has 5 ranges including CJK Extension C */
+        countAlgRanges=5;
+    } else if(ucdVersion>=UNI_3_1) {
+        /* Unicode 3.1 and up has 4 ranges including CJK Extension B */
+        countAlgRanges=4;
+    } else if(ucdVersion>=UNI_3_0) {
+        /* Unicode 3.0 has 3 ranges including CJK Extension A */
+        countAlgRanges=3;
+    } else {
+        /* Unicode 2.0 has 2 ranges including Hangul and CJK Unihan */
+        countAlgRanges=2;
+    }
+
+    if(pData!=NULL) {
+        udata_write32(pData, countAlgRanges);
+    } else {
+        size+=4;
+    }
+    if(countAlgRanges==0) {
+        return size;
+    }
+
+    /*
+     * each range:
+     * uint32_t rangeStart
+     * uint32_t rangeEnd
+     * uint8_t algorithmType
+     * uint8_t algorithmVariant
+     * uint16_t size of range data
+     * uint8_t[size] data
+     */
+
+    /* range 0: cjk extension a */
+    if(countAlgRanges>=3) {
+        if(pData!=NULL) {
+            udata_writeBlock(pData, &cjkExtA, sizeof(AlgorithmicRange));
+            udata_writeString(pData, prefix, PREFIX_LENGTH);
+            if(PREFIX_LENGTH<PREFIX_LENGTH_4) {
+                udata_writePadding(pData, PREFIX_LENGTH_4-PREFIX_LENGTH);
+            }
+        } else {
+            size+=sizeof(AlgorithmicRange)+PREFIX_LENGTH_4;
+        }
+    }
+
+    /* range 1: cjk */
+    if(pData!=NULL) {
+        udata_writeBlock(pData, &cjk, sizeof(AlgorithmicRange));
+        udata_writeString(pData, prefix, PREFIX_LENGTH);
+        if(PREFIX_LENGTH<PREFIX_LENGTH_4) {
+            udata_writePadding(pData, PREFIX_LENGTH_4-PREFIX_LENGTH);
+        }
+    } else {
+        size+=sizeof(AlgorithmicRange)+PREFIX_LENGTH_4;
+    }
+
+    /* range 2: hangul syllables */
+    if(pData!=NULL) {
+        udata_writeBlock(pData, &hangul, sizeof(AlgorithmicRange));
+        udata_writeBlock(pData, hangulFactors, 6);
+        udata_writeString(pData, jamo, sizeof(jamo));
+    } else {
+        size+=sizeof(AlgorithmicRange)+6+sizeof(jamo);
+    }
+
+    /* range 3: cjk extension b */
+    if(countAlgRanges>=4) {
+        if(pData!=NULL) {
+            udata_writeBlock(pData, &cjkExtB, sizeof(AlgorithmicRange));
+            udata_writeString(pData, prefix, PREFIX_LENGTH);
+            if(PREFIX_LENGTH<PREFIX_LENGTH_4) {
+                udata_writePadding(pData, PREFIX_LENGTH_4-PREFIX_LENGTH);
+            }
+        } else {
+            size+=sizeof(AlgorithmicRange)+PREFIX_LENGTH_4;
+        }
+    }
+
+    /* range 4: cjk extension c */
+    if(countAlgRanges>=5) {
+        if(pData!=NULL) {
+            udata_writeBlock(pData, &cjkExtC, sizeof(AlgorithmicRange));
+            udata_writeString(pData, prefix, PREFIX_LENGTH);
+            if(PREFIX_LENGTH<PREFIX_LENGTH_4) {
+                udata_writePadding(pData, PREFIX_LENGTH_4-PREFIX_LENGTH);
+            }
+        } else {
+            size+=sizeof(AlgorithmicRange)+PREFIX_LENGTH_4;
+        }
+    }
+
+    /* range 5: cjk extension d */
+    if(countAlgRanges>=6) {
+        if(pData!=NULL) {
+            udata_writeBlock(pData, &cjkExtD, sizeof(AlgorithmicRange));
+            udata_writeString(pData, prefix, PREFIX_LENGTH);
+            if(PREFIX_LENGTH<PREFIX_LENGTH_4) {
+                udata_writePadding(pData, PREFIX_LENGTH_4-PREFIX_LENGTH);
+            }
+        } else {
+            size+=sizeof(AlgorithmicRange)+PREFIX_LENGTH_4;
+        }
+    }
+
+    return size;
+}
+
+/* helpers ------------------------------------------------------------------ */
+
+static int16_t
+findToken(uint8_t *s, int16_t length) {
+    int16_t i, token;
+
+    for(i=0; i<(int16_t)tokenCount; ++i) {
+        token=tokens[i];
+        if(token>=0 && length==words[token].length && 0==uprv_memcmp(s, words[token].s, length)) {
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+static Word *
+findWord(char *s, int16_t length) {
+    uint32_t i;
+
+    for(i=0; i<wordCount; ++i) {
+        if(length==words[i].length && 0==uprv_memcmp(s, words[i].s, length)) {
+            return words+i;
+        }
+    }
+
+    return NULL;
+}
+
+static Word *
+addWord(char *s, int16_t length) {
+    uint8_t *stringStart;
+    Word *word;
+
+    if(wordCount==MAX_WORD_COUNT) {
+        fprintf(stderr, "gennames: too many words\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+
+    stringStart=allocWord(length);
+    uprv_memcpy(stringStart, s, length);
+
+    word=words+wordCount;
+
+    /*
+     * Initialize the weight with the costs for this token:
+     * a zero-terminated string and a 16-bit offset.
+     */
+    word->weight=-(length+1+2);
+    word->count=0;
+    word->length=length;
+    word->s=stringStart;
+
+    ++wordCount;
+
+    return word;
+}
+
+static void
+countWord(Word *word) {
+    /* add to the weight the savings: the length of the word minus 1 byte for the token */
+    word->weight+=word->length-1;
+    ++word->count;
+}
+
+static void
+addLine(uint32_t code, char *names[], int16_t lengths[], int16_t count) {
+    uint8_t *stringStart;
+    Line *line;
+    int16_t i, length;
+
+    if(lineCount==MAX_LINE_COUNT) {
+        fprintf(stderr, "gennames: too many lines\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+
+    /* find the last non-empty name */
+    while(count>0 && lengths[count-1]==0) {
+        --count;
+    }
+    if(count==0) {
+        return; /* should not occur: caller should not have called */
+    }
+
+    /* there will be (count-1) separator characters */
+    i=count;
+    length=count-1;
+
+    /* add lengths of strings */
+    while(i>0) {
+        length+=lengths[--i];
+    }
+
+    /* allocate line memory */
+    stringStart=allocLine(length);
+
+    /* copy all strings into the line memory */
+    length=0; /* number of chars copied so far */
+    for(i=0; i<count; ++i) {
+        if(i>0) {
+            stringStart[length++]=NAME_SEPARATOR_CHAR;
+        }
+        if(lengths[i]>0) {
+            uprv_memcpy(stringStart+length, names[i], lengths[i]);
+            length+=lengths[i];
+        }
+    }
+
+    line=lines+lineCount;
+
+    line->code=code;
+    line->length=length;
+    line->s=stringStart;
+
+    ++lineCount;
+
+    /* prevent a character value that is actually in a name from becoming a token */
+    while(length>0) {
+        tokens[stringStart[--length]]=-1;
+    }
+}
+
+static void
+addGroup(uint32_t groupMSB, uint8_t *strings, int16_t length) {
+    uint8_t *stringStart;
+    Line *line;
+
+    if(lineCount==MAX_LINE_COUNT) {
+        fprintf(stderr, "gennames: too many groups\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+
+    /* store the line lengths first, then the strings */
+    lineLengthsTop=(lineLengthsTop+1)/2;
+    stringStart=allocLine(lineLengthsTop+length);
+    uprv_memcpy(stringStart, lineLengths, lineLengthsTop);
+    uprv_memcpy(stringStart+lineLengthsTop, strings, length);
+
+    line=lines+lineCount;
+
+    line->code=groupMSB;
+    line->length=length;
+    line->s=stringStart;
+
+    ++lineCount;
+}
+
+static uint32_t
+addToken(uint8_t *s, int16_t length) {
+    uint8_t *stringStart;
+
+    stringStart=allocLine(length+1);
+    uprv_memcpy(stringStart, s, length);
+    stringStart[length]=0;
+
+    return (uint32_t)(stringStart - stringStore);
+}
+
+static void
+appendLineLength(int16_t length) {
+    if(length>=76) {
+        fprintf(stderr, "gennames: compressed line too long\n");
+        exit(U_BUFFER_OVERFLOW_ERROR);
+    }
+    if(length>=12) {
+        length-=12;
+        appendLineLengthNibble((uint8_t)((length>>4)|12));
+    }
+    appendLineLengthNibble((uint8_t)length);
+}
+
+static void
+appendLineLengthNibble(uint8_t nibble) {
+    if((lineLengthsTop&1)==0) {
+        lineLengths[lineLengthsTop/2]=(uint8_t)(nibble<<4);
+    } else {
+        lineLengths[lineLengthsTop/2]|=nibble&0xf;
+    }
+    ++lineLengthsTop;
+}
+
+static uint8_t *
+allocLine(int32_t length) {
+    uint32_t top=lineTop+length;
+    uint8_t *p;
+
+    if(top>wordBottom) {
+        fprintf(stderr, "gennames: out of memory\n");
+        exit(U_MEMORY_ALLOCATION_ERROR);
+    }
+    p=stringStore+lineTop;
+    lineTop=top;
+    return p;
+}
+
+static uint8_t *
+allocWord(uint32_t length) {
+    uint32_t bottom=wordBottom-length;
+
+    if(lineTop>bottom) {
+        fprintf(stderr, "gennames: out of memory\n");
+        exit(U_MEMORY_ALLOCATION_ERROR);
+    }
+    wordBottom=bottom;
+    return stringStore+bottom;
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/gennames/gennames.vcproj b/unicode/c/gennames/gennames.vcproj
new file mode 100644
index 0000000..0a1f05f
--- /dev/null
+++ b/unicode/c/gennames/gennames.vcproj
@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="gennames"
+	ProjectGUID="{F5281B04-A9E0-4680-BBA8-1D7F7D115458}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/gennames.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/gennames.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/gennames.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/gennames.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/gennames.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/gennames.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/gennames.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/gennames.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/gennames.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/gennames.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/gennames.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/gennames.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/gennames.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/gennames.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/gennames.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/gennames.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<File
+			RelativePath=".\gennames.c"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/gennorm/CMakeLists.txt b/unicode/c/gennorm/CMakeLists.txt
new file mode 100644
index 0000000..bb18827
--- /dev/null
+++ b/unicode/c/gennorm/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(gennorm gennorm.c store.c)
+target_link_libraries(gennorm icuuc icutu)
diff --git a/unicode/c/gennorm/Makefile.in b/unicode/c/gennorm/Makefile.in
new file mode 100644
index 0000000..baec685
--- /dev/null
+++ b/unicode/c/gennorm/Makefile.in
@@ -0,0 +1,97 @@
+## Makefile.in for ICU - tools/gennorm
+## Copyright (c) 2001-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis/Markus W. Scherer
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/gennorm
+
+TARGET_STUB_NAME = gennorm
+
+SECTION = 8
+
+#MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = gennorm.o store.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+#	$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+#	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS)
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/gennorm/gennorm.c b/unicode/c/gennorm/gennorm.c
new file mode 100644
index 0000000..d1b1fba
--- /dev/null
+++ b/unicode/c/gennorm/gennorm.c
@@ -0,0 +1,399 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2001-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  gennorm.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2001may25
+*   created by: Markus W. Scherer
+*
+*   This program reads the Unicode character database text file,
+*   parses it, and extracts the data for normalization.
+*   It then preprocesses it and writes a binary file for efficient use
+*   in various Unicode text normalization processes.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/ustring.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "unicode/udata.h"
+#include "unicode/uset.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uparse.h"
+#include "unormimp.h"
+
+U_CDECL_BEGIN
+#include "gennorm.h"
+U_CDECL_END
+
+UBool beVerbose=FALSE;
+
+/* prototypes --------------------------------------------------------------- */
+
+static void
+parseDerivedNormalizationProperties(const char *filename, UErrorCode *pErrorCode, UBool reportError);
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode);
+
+/* -------------------------------------------------------------------------- */
+
+enum {
+    HELP_H,
+    HELP_QUESTION_MARK,
+    VERBOSE,
+    DESTDIR,
+    SOURCEDIR,
+    ICUDATADIR
+};
+
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_VERBOSE,
+    UOPTION_DESTDIR,
+    UOPTION_SOURCEDIR,
+    UOPTION_ICUDATADIR
+};
+
+extern int
+main(int argc, char* argv[]) {
+#if !UCONFIG_NO_NORMALIZATION
+    char filename[300];
+#endif
+    const char *srcDir=NULL, *destDir=NULL, *suffix=NULL;
+    char *basename=NULL;
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[DESTDIR].value=u_getDataDirectory();
+    options[SOURCEDIR].value="";
+    options[ICUDATADIR].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+    if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
+        /*
+         * Broken into chucks because the C89 standard says the minimum
+         * required supported string length is 509 bytes.
+         */
+        fprintf(stderr,
+            "Usage: %s [-options] [suffix]\n"
+            "\n"
+            "Read the UnicodeData.txt file and other Unicode properties files and\n"
+            "write nfc.txt and nfkc.txt files for gennorm2\n"
+            "\n",
+            argv[0]);
+        fprintf(stderr,
+            "Options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     verbose output\n");
+        fprintf(stderr,
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-s or --sourcedir   source directory, followed by the path\n"
+            "\t-i or --icudatadir  directory for locating any needed intermediate data files,\n"
+            "\t                    followed by path, defaults to <%s>\n"
+            "\tsuffix              suffix that is to be appended with a '-'\n"
+            "\t                    to the source file basenames before opening;\n"
+            "\t                    'gennorm new' will read UnicodeData-new.txt etc.\n",
+            u_getDataDirectory());
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    beVerbose=options[VERBOSE].doesOccur;
+    srcDir=options[SOURCEDIR].value;
+    destDir=options[DESTDIR].value;
+
+    if(argc>=2) {
+        suffix=argv[1];
+    } else {
+        suffix=NULL;
+    }
+
+#if !UCONFIG_NO_NORMALIZATION
+
+    if (options[ICUDATADIR].doesOccur) {
+        u_setDataDirectory(options[ICUDATADIR].value);
+    }
+
+    /*
+     * Verify that we can work with properties
+     * but don't call u_init() because that needs unorm.icu which we are just
+     * going to build here.
+     */
+    {
+        U_STRING_DECL(ideo, "[:Ideographic:]", 15);
+        USet *set;
+
+        U_STRING_INIT(ideo, "[:Ideographic:]", 15);
+        set=uset_openPattern(ideo, -1, &errorCode);
+        if(U_FAILURE(errorCode) || !uset_contains(set, 0xf900)) {
+            fprintf(stderr, "gennorm is unable to work with properties (uprops.icu): %s\n", u_errorName(errorCode));
+            exit(errorCode);
+        }
+        uset_close(set);
+    }
+
+    /* prepare the filename beginning with the source dir */
+    uprv_strcpy(filename, srcDir);
+    basename=filename+uprv_strlen(filename);
+    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR && *(basename-1)!=U_FILE_ALT_SEP_CHAR) {
+        *basename++=U_FILE_SEP_CHAR;
+    }
+
+    /* initialize */
+    init();
+
+    /* process DerivedNormalizationProps.txt (name changed for Unicode 3.2, to <=31 characters) */
+    if(suffix==NULL) {
+        uprv_strcpy(basename, "DerivedNormalizationProps.txt");
+    } else {
+        uprv_strcpy(basename, "DerivedNormalizationProps");
+        basename[30]='-';
+        uprv_strcpy(basename+31, suffix);
+        uprv_strcat(basename+31, ".txt");
+    }
+    parseDerivedNormalizationProperties(filename, &errorCode, FALSE);
+    if(U_FAILURE(errorCode)) {
+        /* can be only U_FILE_ACCESS_ERROR - try filename from before Unicode 3.2 */
+        if(suffix==NULL) {
+            uprv_strcpy(basename, "DerivedNormalizationProperties.txt");
+        } else {
+            uprv_strcpy(basename, "DerivedNormalizationProperties");
+            basename[30]='-';
+            uprv_strcpy(basename+31, suffix);
+            uprv_strcat(basename+31, ".txt");
+        }
+        parseDerivedNormalizationProperties(filename, &errorCode, TRUE);
+    }
+
+    /* process UnicodeData.txt */
+    if(suffix==NULL) {
+        uprv_strcpy(basename, "UnicodeData.txt");
+    } else {
+        uprv_strcpy(basename, "UnicodeData");
+        basename[11]='-';
+        uprv_strcpy(basename+12, suffix);
+        uprv_strcat(basename+12, ".txt");
+    }
+    parseDB(filename, &errorCode);
+
+    /* process parsed data */
+    if(U_SUCCESS(errorCode)) {
+        writeNorm2(destDir);
+
+        cleanUpData();
+    }
+
+#endif
+
+    return errorCode;
+}
+
+#if !UCONFIG_NO_NORMALIZATION
+
+/* parser for DerivedNormalizationProperties.txt ---------------------------- */
+
+static void U_CALLCONV
+derivedNormalizationPropertiesLineFn(void *context,
+                                     char *fields[][2], int32_t fieldCount,
+                                     UErrorCode *pErrorCode) {
+    UChar string[32];
+    char *s;
+    uint32_t start, end;
+    int32_t count;
+
+    /* get code point range */
+    count=u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "gennorm: error parsing DerivedNormalizationProperties.txt mapping at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* ignore hangul - handle explicitly */
+    if(start==0xac00) {
+        return;
+    }
+
+    /* get property - ignore unrecognized ones */
+    s=(char *)u_skipWhitespace(fields[1][0]);
+    if(0==uprv_memcmp(s, "Comp_Ex", 7) || 0==uprv_memcmp(s, "Full_Composition_Exclusion", 26)) {
+        /* full composition exclusion */
+        while(start<=end) {
+            setCompositionExclusion(start++);
+        }
+    }
+}
+
+static void
+parseDerivedNormalizationProperties(const char *filename, UErrorCode *pErrorCode, UBool reportError) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 2, derivedNormalizationPropertiesLineFn, NULL, pErrorCode);
+    if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) {
+        fprintf(stderr, "gennorm error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+/* parser for UnicodeData.txt ----------------------------------------------- */
+
+static void U_CALLCONV
+unicodeDataLineFn(void *context,
+                  char *fields[][2], int32_t fieldCount,
+                  UErrorCode *pErrorCode) {
+    uint32_t decomp[40];
+    Norm norm;
+    const char *s;
+    char *end;
+    uint32_t code, value;
+    int32_t length;
+    UBool isCompat, something=FALSE;
+
+    /* ignore First and Last entries for ranges */
+    if( *fields[1][0]=='<' &&
+        (length=(int32_t)(fields[1][1]-fields[1][0]))>=9 &&
+        (0==uprv_memcmp(", First>", fields[1][1]-8, 8) || 0==uprv_memcmp(", Last>", fields[1][1]-7, 7))
+    ) {
+        return;
+    }
+
+    /* reset the properties */
+    uprv_memset(&norm, 0, sizeof(Norm));
+
+    /* get the character code, field 0 */
+    code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "gennorm: syntax error in field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get canonical combining class, field 3 */
+    value=(uint32_t)uprv_strtoul(fields[3][0], &end, 10);
+    if(end<=fields[3][0] || end!=fields[3][1] || value>0xff) {
+        fprintf(stderr, "gennorm: syntax error in field 3 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    if(value>0) {
+        norm.udataCC=(uint8_t)value;
+        something=TRUE;
+    }
+
+    /* get the decomposition, field 5 */
+    if(fields[5][0]<fields[5][1]) {
+        if(*(s=fields[5][0])=='<') {
+            ++s;
+            isCompat=TRUE;
+
+            /* skip and ignore the compatibility type name */
+            do {
+                if(s==fields[5][1]) {
+                    /* missing '>' */
+                    fprintf(stderr, "gennorm: syntax error in field 5 at %s\n", fields[0][0]);
+                    *pErrorCode=U_PARSE_ERROR;
+                    exit(U_PARSE_ERROR);
+                }
+            } while(*s++!='>');
+        } else {
+            isCompat=FALSE;
+        }
+
+        /* parse the decomposition string */
+        length=u_parseCodePoints(s, decomp, sizeof(decomp)/4, pErrorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "gennorm error parsing UnicodeData.txt decomposition of U+%04lx - %s\n",
+                    (long)code, u_errorName(*pErrorCode));
+            exit(*pErrorCode);
+        }
+
+        /* store the string */
+        if(length>0) {
+            something=TRUE;
+            if(isCompat) {
+                norm.lenNFKD=(uint8_t)length;
+                norm.nfkd=decomp;
+            } else {
+                if(length>2) {
+                    fprintf(stderr, "gennorm: error - length of NFD(U+%04lx) = %ld >2 in UnicodeData - illegal\n",
+                            (long)code, (long)length);
+                    *pErrorCode=U_PARSE_ERROR;
+                    exit(U_PARSE_ERROR);
+                }
+                norm.lenNFD=(uint8_t)length;
+                norm.nfd=decomp;
+            }
+        }
+    }
+
+    /* check for non-character code points */
+    if((code&0xfffe)==0xfffe || (uint32_t)(code-0xfdd0)<0x20 || code>0x10ffff) {
+        fprintf(stderr, "gennorm: error - properties for non-character code point U+%04lx\n",
+                (long)code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    if(something) {
+        /* there are normalization values, so store them */
+#if 0
+        if(beVerbose) {
+            printf("store values for U+%04lx: cc=%d, lenNFD=%ld, lenNFKD=%ld\n",
+                   (long)code, norm.udataCC, (long)norm.lenNFD, (long)norm.lenNFKD);
+        }
+#endif
+        storeNorm(code, &norm);
+    }
+}
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[15][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "gennorm error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+#endif /* #if !UCONFIG_NO_NORMALIZATION */
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/gennorm/gennorm.h b/unicode/c/gennorm/gennorm.h
new file mode 100644
index 0000000..faa9ba7
--- /dev/null
+++ b/unicode/c/gennorm/gennorm.h
@@ -0,0 +1,50 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  gennorm.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2001may25
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __GENPROPS_H__
+#define __GENPROPS_H__
+
+#include "unicode/utypes.h"
+
+/*
+ * data structure that holds the normalization properties for one or more
+ * code point(s) at build time
+ */
+typedef struct Norm {
+    uint8_t udataCC, lenNFD, lenNFKD;
+    uint32_t *nfd, *nfkd;
+} Norm;
+
+/* global flags */
+extern UBool beVerbose;
+
+/* prototypes */
+extern void
+init(void);
+
+extern void
+storeNorm(uint32_t code, Norm *norm);
+
+extern void
+setCompositionExclusion(uint32_t code);
+
+extern void
+writeNorm2(const char *dataDir);
+
+extern void
+cleanUpData(void);
+
+#endif
diff --git a/unicode/c/gennorm/gennorm.vcproj b/unicode/c/gennorm/gennorm.vcproj
new file mode 100644
index 0000000..5d99c54
--- /dev/null
+++ b/unicode/c/gennorm/gennorm.vcproj
@@ -0,0 +1,407 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="gennorm"
+	ProjectGUID="{F5213103-6CBE-46E6-B4CC-2570B6837D86}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/gennorm.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/gennorm.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/gennorm.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/gennorm.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/gennorm.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/gennorm.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/gennorm.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/gennorm.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/gennorm.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/gennorm.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/gennorm.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/gennorm.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/gennorm.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/gennorm.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/gennorm.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/gennorm.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<File
+			RelativePath=".\gennorm.c"
+			>
+		</File>
+		<File
+			RelativePath=".\gennorm.h"
+			>
+		</File>
+		<File
+			RelativePath=".\store.c"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/gennorm/store.c b/unicode/c/gennorm/store.c
new file mode 100644
index 0000000..45dc743
--- /dev/null
+++ b/unicode/c/gennorm/store.c
@@ -0,0 +1,289 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  store.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2001may25
+*   created by: Markus W. Scherer
+*
+*   Store Unicode normalization data in a memory-mappable file.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/udata.h"
+#include "unicode/uset.h"
+#include "cmemory.h"
+#include "filestrm.h"
+#include "utrie.h"
+#include "toolutil.h"
+#include "writesrc.h"
+#include "unormimp.h"
+#include "gennorm.h"
+
+#define DO_DEBUG_OUT 0
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+#if !UCONFIG_NO_NORMALIZATION
+
+/* builder data ------------------------------------------------------------- */
+
+static UNewTrie *normTrie;
+
+static UToolMemory *normMem, *utf32Mem;
+
+static Norm *norms;
+
+static USet *compositionExclusions;
+
+/* allocate and initialize a Norm unit */
+static Norm *
+allocNorm() {
+    /* allocate Norm */
+    Norm *p=(Norm *)utm_alloc(normMem);
+    return p;
+}
+
+extern void
+init() {
+    uint16_t *p16;
+
+    normTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie));
+    uprv_memset(normTrie, 0, sizeof(UNewTrie));
+
+    /* initialize the two tries */
+    if(NULL==utrie_open(normTrie, NULL, 30000, 0, 0, FALSE)) {
+        fprintf(stderr, "error: failed to initialize tries\n");
+        exit(U_MEMORY_ALLOCATION_ERROR);
+    }
+
+    /* allocate Norm structures and reset the first one */
+    normMem=utm_open("gennorm normalization structs", 20000, 20000, sizeof(Norm));
+    norms=allocNorm();
+
+    /* allocate UTF-32 string memory */
+    utf32Mem=utm_open("gennorm UTF-32 strings", 30000, 30000, 4);
+
+    compositionExclusions=uset_openEmpty();
+}
+
+/*
+ * get or create a Norm unit;
+ * get or create the intermediate trie entries for it as well
+ */
+static Norm *
+createNorm(uint32_t code) {
+    Norm *p;
+    uint32_t i;
+
+    i=utrie_get32(normTrie, (UChar32)code, NULL);
+    if(i!=0) {
+        p=norms+i;
+    } else {
+        /* allocate Norm */
+        p=allocNorm();
+        if(!utrie_set32(normTrie, (UChar32)code, (uint32_t)(p-norms))) {
+            fprintf(stderr, "error: too many normalization entries\n");
+            exit(U_BUFFER_OVERFLOW_ERROR);
+        }
+    }
+    return p;
+}
+
+/* processing incoming normalization data ----------------------------------- */
+
+/*
+ * process the data for one code point listed in UnicodeData;
+ * UnicodeData itself never maps a code point to both NFD and NFKD
+ */
+extern void
+storeNorm(uint32_t code, Norm *norm) {
+    Norm *p=createNorm(code);
+
+    /* store the data */
+    uprv_memcpy(p, norm, sizeof(Norm));
+
+    /* store the decomposition string if there is one here */
+    if(norm->lenNFD!=0) {
+        uint32_t *s32=utm_allocN(utf32Mem, norm->lenNFD);
+        uprv_memcpy(s32, norm->nfd, norm->lenNFD*4);
+        p->nfd=s32;
+    } else if(norm->lenNFKD!=0) {
+        uint32_t *s32=utm_allocN(utf32Mem, norm->lenNFKD);
+        uprv_memcpy(s32, norm->nfkd, norm->lenNFKD*4);
+        p->nfkd=s32;
+    }
+}
+
+extern void
+setCompositionExclusion(uint32_t code) {
+    uset_add(compositionExclusions, (UChar32)code);
+}
+
+
+static void
+writeAllCC(FILE *f) {
+    uint32_t i;
+    UChar32 prevCode, code;
+    uint8_t prevCC, cc;
+    UBool isInBlockZero;
+
+    fprintf(f, "# Canonical_Combining_Class (ccc) values\n");
+    prevCode=0;
+    prevCC=0;
+    for(code=0; code<=0x110000;) {
+        if(code==0x110000) {
+            cc=0;
+        } else {
+            i=utrie_get32(normTrie, code, &isInBlockZero);
+            if(i==0 || isInBlockZero) {
+                cc=0;
+            } else {
+                cc=norms[i].udataCC;
+            }
+        }
+        if(prevCC!=cc) {
+            if(prevCC!=0) {
+                uint32_t lastCode=code-1;
+                if(prevCode==lastCode) {
+                    fprintf(f, "%04lX:%d\n", (long)lastCode, prevCC);
+                } else {
+                    fprintf(f, "%04lX..%04lX:%d\n",
+                            (long)prevCode, (long)lastCode, prevCC);
+                }
+            }
+            prevCode=code;
+            prevCC=cc;
+        }
+        if(isInBlockZero) {
+            code+=UTRIE_DATA_BLOCK_LENGTH;
+        } else {
+            ++code;
+        }
+    }
+}
+
+static UBool
+hasMapping(uint32_t code) {
+    Norm *norm=norms+utrie_get32(normTrie, code, NULL);
+    return norm->lenNFD!=0 || norm->lenNFKD!=0;
+}
+
+static UBool
+hasOneWayMapping(uint32_t code, UBool withCompat) {
+    for(;;) {
+        Norm *norm=norms+utrie_get32(normTrie, code, NULL);
+        uint8_t length;
+        if((length=norm->lenNFD)!=0) {
+            /*
+             * The canonical decomposition is a one-way mapping if
+             * - it does not map to exactly two code points
+             * - the code has ccc!=0
+             * - the code has the Composition_Exclusion property
+             * - its starter has a one-way mapping (loop for this)
+             * - its non-starter decomposes
+             */
+            if( length!=2 ||
+                norm->udataCC!=0 ||
+                uset_contains(compositionExclusions, (UChar32)code) ||
+                hasMapping(norm->nfd[1])
+            ) {
+                return TRUE;
+            }
+            code=norm->nfd[0];  /* continue */
+        } else if(withCompat && norm->lenNFKD!=0) {
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+}
+
+static void
+writeAllMappings(FILE *f, UBool withCompat) {
+    uint32_t i, code;
+    UBool isInBlockZero;
+
+    if(withCompat) {
+        fprintf(f, "\n# Canonical and compatibility decomposition mappings\n");
+    } else {
+        fprintf(f, "\n# Canonical decomposition mappings\n");
+    }
+    for(code=0; code<=0x10ffff;) {
+        i=utrie_get32(normTrie, code, &isInBlockZero);
+        if(isInBlockZero) {
+            code+=UTRIE_DATA_BLOCK_LENGTH;
+        } else {
+            if(i!=0) {
+                uint32_t *s32;
+                uint8_t length;
+                char separator;
+                if((length=norms[i].lenNFD)!=0) {
+                    s32=norms[i].nfd;
+                    separator= hasOneWayMapping(code, withCompat) ? '>' : '=';
+                } else if(withCompat && (length=norms[i].lenNFKD)!=0) {
+                    s32=norms[i].nfkd;
+                    separator='>';
+                }
+                if(length!=0) {
+                    uint8_t j;
+                    fprintf(f, "%04lX%c", (long)code, separator);
+                    for(j=0; j<length; ++j) {
+                        if(j!=0) {
+                            fputc(' ', f);
+                        }
+                        fprintf(f, "%04lX", (long)s32[j]);
+                    }
+                    fputc('\n', f);
+                }
+            }
+            ++code;
+        }
+    }
+}
+
+static void
+writeNorm2TextFile(const char *path, const char *filename, UBool withCompat) {
+    FILE *f=usrc_createTextData(path, filename);
+    if(f==NULL) {
+        exit(U_FILE_ACCESS_ERROR);
+    }
+    writeAllCC(f);
+    writeAllMappings(f, withCompat);
+    fclose(f);
+}
+
+extern void
+writeNorm2(const char *dataDir) {
+    writeNorm2TextFile(dataDir, "nfc.txt", FALSE);
+    writeNorm2TextFile(dataDir, "nfkc.txt", TRUE);
+}
+
+extern void
+cleanUpData(void) {
+    utm_close(normMem);
+    utm_close(utf32Mem);
+    utrie_close(normTrie);
+    uprv_free(normTrie);
+    uset_close(compositionExclusions);
+}
+
+#endif /* #if !UCONFIG_NO_NORMALIZATION */
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/genpname/CMakeLists.txt b/unicode/c/genpname/CMakeLists.txt
new file mode 100644
index 0000000..d890b9f
--- /dev/null
+++ b/unicode/c/genpname/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(genpname genpname.cpp)
+target_link_libraries(genpname icuuc icutu)
diff --git a/unicode/c/genpname/Makefile.in b/unicode/c/genpname/Makefile.in
new file mode 100644
index 0000000..0a592a9
--- /dev/null
+++ b/unicode/c/genpname/Makefile.in
@@ -0,0 +1,97 @@
+## Makefile.in for ICU - tools/genpname
+## Copyright (c) 1999-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/genpname
+
+TARGET_STUB_NAME = genpname
+
+SECTION = 8
+
+MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = genpname.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET)
+
+install-local: all-local 
+#	$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+#	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) 
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/genpname/SyntheticPropertyAliases.txt b/unicode/c/genpname/SyntheticPropertyAliases.txt
new file mode 100644
index 0000000..5b9d022
--- /dev/null
+++ b/unicode/c/genpname/SyntheticPropertyAliases.txt
@@ -0,0 +1,53 @@
+######################################################################
+# Copyright (c) 2003-2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+######################################################################
+# Author: Alan Liu
+# Created: February 20 2003
+# Since: ICU 2.6
+######################################################################
+
+# This file follows the format of PropertyAliases.txt
+# It contains synthetic property aliases not present
+# in the UCD.  Unlike PropertyAliases.txt, it should
+# NOT contain a version number.
+# ================================================
+
+# ================================================
+# Miscellaneous Properties
+# ================================================
+scx; Script_Extensions
+
+# ================================================
+# Enumerated Properties
+# ================================================
+
+# lccc(c)=ccc(NFD(c)[0])
+# tccc(c)=ccc(NFD(c)[last])
+lccc; Lead_Canonical_Combining_Class
+tccc; Trail_Canonical_Combining_Class
+
+# ================================================
+# Bitmask Properties
+# ================================================
+gcm       ; General_Category_Mask
+
+# ================================================
+# Binary Properties
+# ================================================
+Sensitive ; Case_Sensitive
+
+nfdinert; NFD_Inert
+nfkdinert; NFKD_Inert
+nfcinert; NFC_Inert
+nfkcinert; NFKC_Inert
+
+segstart; Segment_Starter
+
+# C/POSIX character classes that do not have Unicode property [value] aliases
+# see uchar.h
+n/a; alnum
+n/a; blank
+n/a; graph
+n/a; print
+n/a; xdigit
diff --git a/unicode/c/genpname/SyntheticPropertyValueAliases.txt b/unicode/c/genpname/SyntheticPropertyValueAliases.txt
new file mode 100644
index 0000000..de091b2
--- /dev/null
+++ b/unicode/c/genpname/SyntheticPropertyValueAliases.txt
@@ -0,0 +1,79 @@
+########################################################################
+# Copyright (c) 2006-2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+########################################################################
+#   file name:      SyntheticPropertyValueAliases.txt
+#   encoding:       US-ASCII
+#   tab size:       8 (not used)
+#   indentation:    4
+#   created by:     gensvpa.pl
+########################################################################
+
+# This file follows the format of PropertyValueAliases.txt
+# It contains synthetic property value aliases not present
+# in the UCD.  Unlike PropertyValueAliases.txt, it should
+# NOT contain a version number.
+
+########################################################################
+#  THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW
+#  WHAT YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
+########################################################################
+
+# set the same names as short and long names to fit the syntax without 
+# inventing names that we would have to support forever
+
+# Script (sc)
+
+sc ; Blis ; Blis 
+sc ; Cirt ; Cirt 
+sc ; Cyrs ; Cyrs 
+sc ; Egyd ; Egyd 
+sc ; Egyh ; Egyh 
+sc ; Geok ; Geok 
+sc ; Hans ; Hans 
+sc ; Hant ; Hant 
+sc ; Hmng ; Hmng 
+sc ; Hung ; Hung 
+sc ; Inds ; Inds 
+sc ; Jpan ; Jpan 
+sc ; Latf ; Latf 
+sc ; Latg ; Latg 
+sc ; Lina ; Lina 
+sc ; Maya ; Maya 
+sc ; Mero ; Mero 
+sc ; Moon ; Moon 
+sc ; Perm ; Perm 
+sc ; Plrd ; Plrd 
+sc ; Roro ; Roro 
+sc ; Sara ; Sara 
+sc ; Sgnw ; Sgnw
+sc ; Syre ; Syre 
+sc ; Syrj ; Syrj 
+sc ; Syrn ; Syrn 
+sc ; Teng ; Teng 
+sc ; Visp ; Visp 
+sc ; Zxxx ; Zxxx 
+
+sc ; Cakm ; Cakm
+sc ; Kore ; Kore
+sc ; Mani ; Mani
+sc ; Phlp ; Phlp
+sc ; Phlv ; Phlv
+sc ; Zmth ; Zmth
+sc ; Zsym ; Zsym
+
+sc ; Nkgb ; Nkgb
+
+sc ; Bass ; Bass
+sc ; Dupl ; Dupl
+sc ; Elba ; Elba
+sc ; Gran ; Gran
+sc ; Kpel ; Kpel
+sc ; Loma ; Loma
+sc ; Mend ; Mend
+sc ; Merc ; Merc
+sc ; Narb ; Narb
+sc ; Nbat ; Nbat
+sc ; Palm ; Palm
+sc ; Sind ; Sind
+sc ; Wara ; Wara
diff --git a/unicode/c/genpname/data.h b/unicode/c/genpname/data.h
new file mode 100644
index 0000000..b4c9d7d
--- /dev/null
+++ b/unicode/c/genpname/data.h
@@ -0,0 +1,2580 @@
+/**
+ * Copyright (C) 2002-2010, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ *
+ * MACHINE GENERATED FILE.  !!! Do not edit manually !!!
+ *
+ * Generated from
+ *   uchar.h
+ *   uscript.h
+ *   Blocks.txt
+ *   PropertyAliases.txt
+ *   PropertyValueAliases.txt
+ *
+ * Date: Sun Sep 19 07:53:38 2010
+ * Unicode version: 6.0.0
+ * Script: preparse.pl
+ */
+
+/* Unicode version 6.0.0 */
+const uint8_t VERSION_0 = 6;
+const uint8_t VERSION_1 = 0;
+const uint8_t VERSION_2 = 0;
+const uint8_t VERSION_3 = 0;
+
+const int32_t STRING_COUNT = 938;
+
+/* to be sorted */
+const AliasName STRING_TABLE[] = {
+    AliasName("", 0),
+    AliasName("A", 1),
+    AliasName("AHex", 2),
+    AliasName("AI", 3),
+    AliasName("AL", 4),
+    AliasName("ALetter", 5),
+    AliasName("AN", 6),
+    AliasName("AR", 7),
+    AliasName("ASCII", 8),
+    AliasName("ASCII_Hex_Digit", 9),
+    AliasName("AT", 10),
+    AliasName("ATA", 11),
+    AliasName("ATAR", 12),
+    AliasName("ATB", 13),
+    AliasName("ATBL", 14),
+    AliasName("ATerm", 15),
+    AliasName("Above", 16),
+    AliasName("Above_Left", 17),
+    AliasName("Above_Right", 18),
+    AliasName("Aegean_Numbers", 19),
+    AliasName("Age", 20),
+    AliasName("Ain", 21),
+    AliasName("Alaph", 22),
+    AliasName("Alchemical_Symbols", 23),
+    AliasName("Alef", 24),
+    AliasName("Alpha", 25),
+    AliasName("Alphabetic", 26),
+    AliasName("Alphabetic_Presentation_Forms", 27),
+    AliasName("Ambiguous", 28),
+    AliasName("Ancient_Greek_Musical_Notation", 29),
+    AliasName("Ancient_Greek_Numbers", 30),
+    AliasName("Ancient_Symbols", 31),
+    AliasName("Arab", 32),
+    AliasName("Arabic", 33),
+    AliasName("Arabic_Letter", 34),
+    AliasName("Arabic_Number", 35),
+    AliasName("Arabic_Presentation_Forms-A", 36),
+    AliasName("Arabic_Presentation_Forms_A", 37),
+    AliasName("Arabic_Presentation_Forms_B", 38),
+    AliasName("Arabic_Supplement", 39),
+    AliasName("Armenian", 40),
+    AliasName("Armi", 41),
+    AliasName("Armn", 42),
+    AliasName("Arrows", 43),
+    AliasName("Attached_Above", 44),
+    AliasName("Attached_Above_Right", 45),
+    AliasName("Attached_Below", 46),
+    AliasName("Attached_Below_Left", 47),
+    AliasName("Avestan", 48),
+    AliasName("Avst", 49),
+    AliasName("B", 50),
+    AliasName("B2", 51),
+    AliasName("BA", 52),
+    AliasName("BB", 53),
+    AliasName("BK", 54),
+    AliasName("BL", 55),
+    AliasName("BN", 56),
+    AliasName("BR", 57),
+    AliasName("Bali", 58),
+    AliasName("Balinese", 59),
+    AliasName("Bamu", 60),
+    AliasName("Bamum", 61),
+    AliasName("Bamum_Supplement", 62),
+    AliasName("Basic_Latin", 63),
+    AliasName("Bass", 64),
+    AliasName("Batak", 65),
+    AliasName("Batk", 66),
+    AliasName("Beh", 67),
+    AliasName("Below", 68),
+    AliasName("Below_Left", 69),
+    AliasName("Below_Right", 70),
+    AliasName("Beng", 71),
+    AliasName("Bengali", 72),
+    AliasName("Beth", 73),
+    AliasName("Bidi_C", 74),
+    AliasName("Bidi_Class", 75),
+    AliasName("Bidi_Control", 76),
+    AliasName("Bidi_M", 77),
+    AliasName("Bidi_Mirrored", 78),
+    AliasName("Bidi_Mirroring_Glyph", 79),
+    AliasName("Blis", 80),
+    AliasName("Block", 81),
+    AliasName("Block_Elements", 82),
+    AliasName("Bopo", 83),
+    AliasName("Bopomofo", 84),
+    AliasName("Bopomofo_Extended", 85),
+    AliasName("Boundary_Neutral", 86),
+    AliasName("Box_Drawing", 87),
+    AliasName("Brah", 88),
+    AliasName("Brahmi", 89),
+    AliasName("Brai", 90),
+    AliasName("Braille", 91),
+    AliasName("Braille_Patterns", 92),
+    AliasName("Break_After", 93),
+    AliasName("Break_Before", 94),
+    AliasName("Break_Both", 95),
+    AliasName("Break_Symbols", 96),
+    AliasName("Bugi", 97),
+    AliasName("Buginese", 98),
+    AliasName("Buhd", 99),
+    AliasName("Buhid", 100),
+    AliasName("Burushaski_Yeh_Barree", 101),
+    AliasName("Byzantine_Musical_Symbols", 102),
+    AliasName("C", 103),
+    AliasName("CB", 104),
+    AliasName("CI", 105),
+    AliasName("CJK_Compatibility", 106),
+    AliasName("CJK_Compatibility_Forms", 107),
+    AliasName("CJK_Compatibility_Ideographs", 108),
+    AliasName("CJK_Compatibility_Ideographs_Supplement", 109),
+    AliasName("CJK_Radicals_Supplement", 110),
+    AliasName("CJK_Strokes", 111),
+    AliasName("CJK_Symbols_And_Punctuation", 112),
+    AliasName("CJK_Unified_Ideographs", 113),
+    AliasName("CJK_Unified_Ideographs_Extension_A", 114),
+    AliasName("CJK_Unified_Ideographs_Extension_B", 115),
+    AliasName("CJK_Unified_Ideographs_Extension_C", 116),
+    AliasName("CJK_Unified_Ideographs_Extension_D", 117),
+    AliasName("CL", 118),
+    AliasName("CM", 119),
+    AliasName("CN", 120),
+    AliasName("CP", 121),
+    AliasName("CR", 122),
+    AliasName("CS", 123),
+    AliasName("CWCF", 124),
+    AliasName("CWCM", 125),
+    AliasName("CWKCF", 126),
+    AliasName("CWL", 127),
+    AliasName("CWT", 128),
+    AliasName("CWU", 129),
+    AliasName("Cakm", 130),
+    AliasName("Can", 131),
+    AliasName("Canadian_Aboriginal", 132),
+    AliasName("Canadian_Syllabics", 133),
+    AliasName("Canonical", 134),
+    AliasName("Canonical_Combining_Class", 135),
+    AliasName("Cans", 136),
+    AliasName("Cari", 137),
+    AliasName("Carian", 138),
+    AliasName("Carriage_Return", 139),
+    AliasName("Case_Folding", 140),
+    AliasName("Case_Ignorable", 141),
+    AliasName("Case_Sensitive", 142),
+    AliasName("Cased", 143),
+    AliasName("Cased_Letter", 144),
+    AliasName("Cc", 145),
+    AliasName("Cf", 146),
+    AliasName("Cham", 147),
+    AliasName("Changes_When_Casefolded", 148),
+    AliasName("Changes_When_Casemapped", 149),
+    AliasName("Changes_When_Lowercased", 150),
+    AliasName("Changes_When_NFKC_Casefolded", 151),
+    AliasName("Changes_When_Titlecased", 152),
+    AliasName("Changes_When_Uppercased", 153),
+    AliasName("Cher", 154),
+    AliasName("Cherokee", 155),
+    AliasName("Circle", 156),
+    AliasName("Cirt", 157),
+    AliasName("Close", 158),
+    AliasName("Close_Parenthesis", 159),
+    AliasName("Close_Punctuation", 160),
+    AliasName("Cn", 161),
+    AliasName("Co", 162),
+    AliasName("Com", 163),
+    AliasName("Combining_Diacritical_Marks", 164),
+    AliasName("Combining_Diacritical_Marks_For_Symbols", 165),
+    AliasName("Combining_Diacritical_Marks_Supplement", 166),
+    AliasName("Combining_Half_Marks", 167),
+    AliasName("Combining_Mark", 168),
+    AliasName("Combining_Marks_For_Symbols", 169),
+    AliasName("Common", 170),
+    AliasName("Common_Indic_Number_Forms", 171),
+    AliasName("Common_Separator", 172),
+    AliasName("Comp_Ex", 173),
+    AliasName("Compat", 174),
+    AliasName("Complex_Context", 175),
+    AliasName("Connector_Punctuation", 176),
+    AliasName("Contingent_Break", 177),
+    AliasName("Control", 178),
+    AliasName("Control_Pictures", 179),
+    AliasName("Copt", 180),
+    AliasName("Coptic", 181),
+    AliasName("Counting_Rod_Numerals", 182),
+    AliasName("Cprt", 183),
+    AliasName("Cs", 184),
+    AliasName("Cuneiform", 185),
+    AliasName("Cuneiform_Numbers_And_Punctuation", 186),
+    AliasName("Currency_Symbol", 187),
+    AliasName("Currency_Symbols", 188),
+    AliasName("Cypriot", 189),
+    AliasName("Cypriot_Syllabary", 190),
+    AliasName("Cyrillic", 191),
+    AliasName("Cyrillic_Extended_A", 192),
+    AliasName("Cyrillic_Extended_B", 193),
+    AliasName("Cyrillic_Supplement", 194),
+    AliasName("Cyrillic_Supplementary", 195),
+    AliasName("Cyrl", 196),
+    AliasName("Cyrs", 197),
+    AliasName("D", 198),
+    AliasName("DA", 199),
+    AliasName("DB", 200),
+    AliasName("DI", 201),
+    AliasName("Dal", 202),
+    AliasName("Dalath_Rish", 203),
+    AliasName("Dash", 204),
+    AliasName("Dash_Punctuation", 205),
+    AliasName("De", 206),
+    AliasName("Decimal", 207),
+    AliasName("Decimal_Number", 208),
+    AliasName("Decomposition_Type", 209),
+    AliasName("Default_Ignorable_Code_Point", 210),
+    AliasName("Dep", 211),
+    AliasName("Deprecated", 212),
+    AliasName("Deseret", 213),
+    AliasName("Deva", 214),
+    AliasName("Devanagari", 215),
+    AliasName("Devanagari_Extended", 216),
+    AliasName("Di", 217),
+    AliasName("Dia", 218),
+    AliasName("Diacritic", 219),
+    AliasName("Digit", 220),
+    AliasName("Dingbats", 221),
+    AliasName("Domino_Tiles", 222),
+    AliasName("Double_Above", 223),
+    AliasName("Double_Below", 224),
+    AliasName("Dsrt", 225),
+    AliasName("Dual_Joining", 226),
+    AliasName("Dupl", 227),
+    AliasName("E", 228),
+    AliasName("EN", 229),
+    AliasName("ES", 230),
+    AliasName("ET", 231),
+    AliasName("EX", 232),
+    AliasName("East_Asian_Width", 233),
+    AliasName("Egyd", 234),
+    AliasName("Egyh", 235),
+    AliasName("Egyp", 236),
+    AliasName("Egyptian_Hieroglyphs", 237),
+    AliasName("Elba", 238),
+    AliasName("Emoticons", 239),
+    AliasName("Enc", 240),
+    AliasName("Enclosed_Alphanumeric_Supplement", 241),
+    AliasName("Enclosed_Alphanumerics", 242),
+    AliasName("Enclosed_CJK_Letters_And_Months", 243),
+    AliasName("Enclosed_Ideographic_Supplement", 244),
+    AliasName("Enclosing_Mark", 245),
+    AliasName("Ethi", 246),
+    AliasName("Ethiopic", 247),
+    AliasName("Ethiopic_Extended", 248),
+    AliasName("Ethiopic_Extended_A", 249),
+    AliasName("Ethiopic_Supplement", 250),
+    AliasName("European_Number", 251),
+    AliasName("European_Separator", 252),
+    AliasName("European_Terminator", 253),
+    AliasName("Exclamation", 254),
+    AliasName("Ext", 255),
+    AliasName("Extend", 256),
+    AliasName("ExtendNumLet", 257),
+    AliasName("Extender", 258),
+    AliasName("F", 259),
+    AliasName("FO", 260),
+    AliasName("False", 261),
+    AliasName("Farsi_Yeh", 262),
+    AliasName("Fe", 263),
+    AliasName("Feh", 264),
+    AliasName("Fin", 265),
+    AliasName("Final", 266),
+    AliasName("Final_Punctuation", 267),
+    AliasName("Final_Semkath", 268),
+    AliasName("Font", 269),
+    AliasName("Format", 270),
+    AliasName("Fra", 271),
+    AliasName("Fraction", 272),
+    AliasName("Full_Composition_Exclusion", 273),
+    AliasName("Fullwidth", 274),
+    AliasName("GCB", 275),
+    AliasName("GL", 276),
+    AliasName("Gaf", 277),
+    AliasName("Gamal", 278),
+    AliasName("General_Category", 279),
+    AliasName("General_Category_Mask", 280),
+    AliasName("General_Punctuation", 281),
+    AliasName("Geok", 282),
+    AliasName("Geometric_Shapes", 283),
+    AliasName("Geor", 284),
+    AliasName("Georgian", 285),
+    AliasName("Georgian_Supplement", 286),
+    AliasName("Glag", 287),
+    AliasName("Glagolitic", 288),
+    AliasName("Glue", 289),
+    AliasName("Goth", 290),
+    AliasName("Gothic", 291),
+    AliasName("Gr_Base", 292),
+    AliasName("Gr_Ext", 293),
+    AliasName("Gr_Link", 294),
+    AliasName("Gran", 295),
+    AliasName("Grapheme_Base", 296),
+    AliasName("Grapheme_Cluster_Break", 297),
+    AliasName("Grapheme_Extend", 298),
+    AliasName("Grapheme_Link", 299),
+    AliasName("Greek", 300),
+    AliasName("Greek_And_Coptic", 301),
+    AliasName("Greek_Extended", 302),
+    AliasName("Grek", 303),
+    AliasName("Gujarati", 304),
+    AliasName("Gujr", 305),
+    AliasName("Gurmukhi", 306),
+    AliasName("Guru", 307),
+    AliasName("H", 308),
+    AliasName("H2", 309),
+    AliasName("H3", 310),
+    AliasName("HY", 311),
+    AliasName("Hah", 312),
+    AliasName("Halfwidth", 313),
+    AliasName("Halfwidth_And_Fullwidth_Forms", 314),
+    AliasName("Hamza_On_Heh_Goal", 315),
+    AliasName("Han", 316),
+    AliasName("Hang", 317),
+    AliasName("Hangul", 318),
+    AliasName("Hangul_Compatibility_Jamo", 319),
+    AliasName("Hangul_Jamo", 320),
+    AliasName("Hangul_Jamo_Extended_A", 321),
+    AliasName("Hangul_Jamo_Extended_B", 322),
+    AliasName("Hangul_Syllable_Type", 323),
+    AliasName("Hangul_Syllables", 324),
+    AliasName("Hani", 325),
+    AliasName("Hano", 326),
+    AliasName("Hans", 327),
+    AliasName("Hant", 328),
+    AliasName("Hanunoo", 329),
+    AliasName("He", 330),
+    AliasName("Hebr", 331),
+    AliasName("Hebrew", 332),
+    AliasName("Heh", 333),
+    AliasName("Heh_Goal", 334),
+    AliasName("Heth", 335),
+    AliasName("Hex", 336),
+    AliasName("Hex_Digit", 337),
+    AliasName("High_Private_Use_Surrogates", 338),
+    AliasName("High_Surrogates", 339),
+    AliasName("Hira", 340),
+    AliasName("Hiragana", 341),
+    AliasName("Hmng", 342),
+    AliasName("Hrkt", 343),
+    AliasName("Hung", 344),
+    AliasName("Hyphen", 345),
+    AliasName("ID", 346),
+    AliasName("IDC", 347),
+    AliasName("IDS", 348),
+    AliasName("IDSB", 349),
+    AliasName("IDST", 350),
+    AliasName("IDS_Binary_Operator", 351),
+    AliasName("IDS_Trinary_Operator", 352),
+    AliasName("ID_Continue", 353),
+    AliasName("ID_Start", 354),
+    AliasName("IN", 355),
+    AliasName("IPA_Extensions", 356),
+    AliasName("IS", 357),
+    AliasName("ISO_Comment", 358),
+    AliasName("Ideo", 359),
+    AliasName("Ideographic", 360),
+    AliasName("Ideographic_Description_Characters", 361),
+    AliasName("Imperial_Aramaic", 362),
+    AliasName("Inds", 363),
+    AliasName("Infix_Numeric", 364),
+    AliasName("Inherited", 365),
+    AliasName("Init", 366),
+    AliasName("Initial", 367),
+    AliasName("Initial_Punctuation", 368),
+    AliasName("Inscriptional_Pahlavi", 369),
+    AliasName("Inscriptional_Parthian", 370),
+    AliasName("Inseparable", 371),
+    AliasName("Inseperable", 372),
+    AliasName("Iota_Subscript", 373),
+    AliasName("Iso", 374),
+    AliasName("Isolated", 375),
+    AliasName("Ital", 376),
+    AliasName("JL", 377),
+    AliasName("JT", 378),
+    AliasName("JV", 379),
+    AliasName("Java", 380),
+    AliasName("Javanese", 381),
+    AliasName("Join_C", 382),
+    AliasName("Join_Causing", 383),
+    AliasName("Join_Control", 384),
+    AliasName("Joining_Group", 385),
+    AliasName("Joining_Type", 386),
+    AliasName("Jpan", 387),
+    AliasName("KA", 388),
+    AliasName("KV", 389),
+    AliasName("Kaf", 390),
+    AliasName("Kaithi", 391),
+    AliasName("Kali", 392),
+    AliasName("Kana", 393),
+    AliasName("Kana_Supplement", 394),
+    AliasName("Kana_Voicing", 395),
+    AliasName("Kanbun", 396),
+    AliasName("Kangxi_Radicals", 397),
+    AliasName("Kannada", 398),
+    AliasName("Kaph", 399),
+    AliasName("Katakana", 400),
+    AliasName("Katakana_Or_Hiragana", 401),
+    AliasName("Katakana_Phonetic_Extensions", 402),
+    AliasName("Kayah_Li", 403),
+    AliasName("Khaph", 404),
+    AliasName("Khar", 405),
+    AliasName("Kharoshthi", 406),
+    AliasName("Khmer", 407),
+    AliasName("Khmer_Symbols", 408),
+    AliasName("Khmr", 409),
+    AliasName("Knda", 410),
+    AliasName("Knotted_Heh", 411),
+    AliasName("Kore", 412),
+    AliasName("Kpel", 413),
+    AliasName("Kthi", 414),
+    AliasName("L", 415),
+    AliasName("LC", 416),
+    AliasName("LE", 417),
+    AliasName("LF", 418),
+    AliasName("LO", 419),
+    AliasName("LOE", 420),
+    AliasName("LRE", 421),
+    AliasName("LRO", 422),
+    AliasName("LV", 423),
+    AliasName("LVT", 424),
+    AliasName("LVT_Syllable", 425),
+    AliasName("LV_Syllable", 426),
+    AliasName("Lam", 427),
+    AliasName("Lamadh", 428),
+    AliasName("Lana", 429),
+    AliasName("Lao", 430),
+    AliasName("Laoo", 431),
+    AliasName("Latf", 432),
+    AliasName("Latg", 433),
+    AliasName("Latin", 434),
+    AliasName("Latin_1", 435),
+    AliasName("Latin_1_Supplement", 436),
+    AliasName("Latin_Extended_A", 437),
+    AliasName("Latin_Extended_Additional", 438),
+    AliasName("Latin_Extended_B", 439),
+    AliasName("Latin_Extended_C", 440),
+    AliasName("Latin_Extended_D", 441),
+    AliasName("Latn", 442),
+    AliasName("Lead_Canonical_Combining_Class", 443),
+    AliasName("Leading_Jamo", 444),
+    AliasName("Left", 445),
+    AliasName("Left_Joining", 446),
+    AliasName("Left_To_Right", 447),
+    AliasName("Left_To_Right_Embedding", 448),
+    AliasName("Left_To_Right_Override", 449),
+    AliasName("Lepc", 450),
+    AliasName("Lepcha", 451),
+    AliasName("Letter", 452),
+    AliasName("Letter_Number", 453),
+    AliasName("Letterlike_Symbols", 454),
+    AliasName("Limb", 455),
+    AliasName("Limbu", 456),
+    AliasName("Lina", 457),
+    AliasName("Linb", 458),
+    AliasName("Line_Break", 459),
+    AliasName("Line_Feed", 460),
+    AliasName("Line_Separator", 461),
+    AliasName("Linear_B", 462),
+    AliasName("Linear_B_Ideograms", 463),
+    AliasName("Linear_B_Syllabary", 464),
+    AliasName("Lisu", 465),
+    AliasName("Ll", 466),
+    AliasName("Lm", 467),
+    AliasName("Lo", 468),
+    AliasName("Logical_Order_Exception", 469),
+    AliasName("Loma", 470),
+    AliasName("Low_Surrogates", 471),
+    AliasName("Lower", 472),
+    AliasName("Lowercase", 473),
+    AliasName("Lowercase_Letter", 474),
+    AliasName("Lowercase_Mapping", 475),
+    AliasName("Lt", 476),
+    AliasName("Lu", 477),
+    AliasName("Lyci", 478),
+    AliasName("Lycian", 479),
+    AliasName("Lydi", 480),
+    AliasName("Lydian", 481),
+    AliasName("M", 482),
+    AliasName("MB", 483),
+    AliasName("ML", 484),
+    AliasName("MN", 485),
+    AliasName("Mahjong_Tiles", 486),
+    AliasName("Malayalam", 487),
+    AliasName("Mand", 488),
+    AliasName("Mandaic", 489),
+    AliasName("Mandatory_Break", 490),
+    AliasName("Mani", 491),
+    AliasName("Mark", 492),
+    AliasName("Math", 493),
+    AliasName("Math_Symbol", 494),
+    AliasName("Mathematical_Alphanumeric_Symbols", 495),
+    AliasName("Mathematical_Operators", 496),
+    AliasName("Maya", 497),
+    AliasName("Maybe", 498),
+    AliasName("Mc", 499),
+    AliasName("Me", 500),
+    AliasName("Med", 501),
+    AliasName("Medial", 502),
+    AliasName("Meem", 503),
+    AliasName("Meetei_Mayek", 504),
+    AliasName("Mend", 505),
+    AliasName("Merc", 506),
+    AliasName("Mero", 507),
+    AliasName("MidLetter", 508),
+    AliasName("MidNum", 509),
+    AliasName("MidNumLet", 510),
+    AliasName("Mim", 511),
+    AliasName("Miscellaneous_Mathematical_Symbols_A", 512),
+    AliasName("Miscellaneous_Mathematical_Symbols_B", 513),
+    AliasName("Miscellaneous_Symbols", 514),
+    AliasName("Miscellaneous_Symbols_And_Arrows", 515),
+    AliasName("Miscellaneous_Symbols_And_Pictographs", 516),
+    AliasName("Miscellaneous_Technical", 517),
+    AliasName("Mlym", 518),
+    AliasName("Mn", 519),
+    AliasName("Modifier_Letter", 520),
+    AliasName("Modifier_Symbol", 521),
+    AliasName("Modifier_Tone_Letters", 522),
+    AliasName("Mong", 523),
+    AliasName("Mongolian", 524),
+    AliasName("Moon", 525),
+    AliasName("Mtei", 526),
+    AliasName("Musical_Symbols", 527),
+    AliasName("Myanmar", 528),
+    AliasName("Myanmar_Extended_A", 529),
+    AliasName("Mymr", 530),
+    AliasName("N", 531),
+    AliasName("NA", 532),
+    AliasName("NChar", 533),
+    AliasName("NFC_Inert", 534),
+    AliasName("NFC_QC", 535),
+    AliasName("NFC_Quick_Check", 536),
+    AliasName("NFD_Inert", 537),
+    AliasName("NFD_QC", 538),
+    AliasName("NFD_Quick_Check", 539),
+    AliasName("NFKC_Inert", 540),
+    AliasName("NFKC_QC", 541),
+    AliasName("NFKC_Quick_Check", 542),
+    AliasName("NFKD_Inert", 543),
+    AliasName("NFKD_QC", 544),
+    AliasName("NFKD_Quick_Check", 545),
+    AliasName("NK", 546),
+    AliasName("NKo", 547),
+    AliasName("NL", 548),
+    AliasName("NR", 549),
+    AliasName("NS", 550),
+    AliasName("NSM", 551),
+    AliasName("NU", 552),
+    AliasName("Na", 553),
+    AliasName("Name", 554),
+    AliasName("Nar", 555),
+    AliasName("Narb", 556),
+    AliasName("Narrow", 557),
+    AliasName("Nb", 558),
+    AliasName("Nbat", 559),
+    AliasName("Nd", 560),
+    AliasName("Neutral", 561),
+    AliasName("New_Tai_Lue", 562),
+    AliasName("Newline", 563),
+    AliasName("Next_Line", 564),
+    AliasName("Nkgb", 565),
+    AliasName("Nko", 566),
+    AliasName("Nkoo", 567),
+    AliasName("Nl", 568),
+    AliasName("No", 569),
+    AliasName("No_Block", 570),
+    AliasName("No_Joining_Group", 571),
+    AliasName("Nobreak", 572),
+    AliasName("Non_Joining", 573),
+    AliasName("Noncharacter_Code_Point", 574),
+    AliasName("None", 575),
+    AliasName("Nonspacing_Mark", 576),
+    AliasName("Nonstarter", 577),
+    AliasName("Noon", 578),
+    AliasName("Not_Applicable", 579),
+    AliasName("Not_Reordered", 580),
+    AliasName("Nu", 581),
+    AliasName("Nukta", 582),
+    AliasName("Number", 583),
+    AliasName("Number_Forms", 584),
+    AliasName("Numeric", 585),
+    AliasName("Numeric_Type", 586),
+    AliasName("Numeric_Value", 587),
+    AliasName("Nun", 588),
+    AliasName("Nya", 589),
+    AliasName("OLetter", 590),
+    AliasName("ON", 591),
+    AliasName("OP", 592),
+    AliasName("OV", 593),
+    AliasName("Ogam", 594),
+    AliasName("Ogham", 595),
+    AliasName("Ol_Chiki", 596),
+    AliasName("Olck", 597),
+    AliasName("Old_Italic", 598),
+    AliasName("Old_Persian", 599),
+    AliasName("Old_South_Arabian", 600),
+    AliasName("Old_Turkic", 601),
+    AliasName("Open_Punctuation", 602),
+    AliasName("Optical_Character_Recognition", 603),
+    AliasName("Oriya", 604),
+    AliasName("Orkh", 605),
+    AliasName("Orya", 606),
+    AliasName("Osma", 607),
+    AliasName("Osmanya", 608),
+    AliasName("Other", 609),
+    AliasName("Other_Letter", 610),
+    AliasName("Other_Neutral", 611),
+    AliasName("Other_Number", 612),
+    AliasName("Other_Punctuation", 613),
+    AliasName("Other_Symbol", 614),
+    AliasName("Overlay", 615),
+    AliasName("P", 616),
+    AliasName("PDF", 617),
+    AliasName("PO", 618),
+    AliasName("PP", 619),
+    AliasName("PR", 620),
+    AliasName("Palm", 621),
+    AliasName("Paragraph_Separator", 622),
+    AliasName("Pat_Syn", 623),
+    AliasName("Pat_WS", 624),
+    AliasName("Pattern_Syntax", 625),
+    AliasName("Pattern_White_Space", 626),
+    AliasName("Pc", 627),
+    AliasName("Pd", 628),
+    AliasName("Pe", 629),
+    AliasName("Perm", 630),
+    AliasName("Pf", 631),
+    AliasName("Phag", 632),
+    AliasName("Phags_Pa", 633),
+    AliasName("Phaistos_Disc", 634),
+    AliasName("Phli", 635),
+    AliasName("Phlp", 636),
+    AliasName("Phlv", 637),
+    AliasName("Phnx", 638),
+    AliasName("Phoenician", 639),
+    AliasName("Phonetic_Extensions", 640),
+    AliasName("Phonetic_Extensions_Supplement", 641),
+    AliasName("Pi", 642),
+    AliasName("Playing_Cards", 643),
+    AliasName("Plrd", 644),
+    AliasName("Po", 645),
+    AliasName("Pop_Directional_Format", 646),
+    AliasName("Postfix_Numeric", 647),
+    AliasName("Prefix_Numeric", 648),
+    AliasName("Prepend", 649),
+    AliasName("Private_Use", 650),
+    AliasName("Private_Use_Area", 651),
+    AliasName("Prti", 652),
+    AliasName("Ps", 653),
+    AliasName("Punctuation", 654),
+    AliasName("QMark", 655),
+    AliasName("QU", 656),
+    AliasName("Qaac", 657),
+    AliasName("Qaai", 658),
+    AliasName("Qaf", 659),
+    AliasName("Qaph", 660),
+    AliasName("Quotation", 661),
+    AliasName("Quotation_Mark", 662),
+    AliasName("R", 663),
+    AliasName("RLE", 664),
+    AliasName("RLO", 665),
+    AliasName("Radical", 666),
+    AliasName("Reh", 667),
+    AliasName("Rejang", 668),
+    AliasName("Reversed_Pe", 669),
+    AliasName("Right", 670),
+    AliasName("Right_Joining", 671),
+    AliasName("Right_To_Left", 672),
+    AliasName("Right_To_Left_Embedding", 673),
+    AliasName("Right_To_Left_Override", 674),
+    AliasName("Rjng", 675),
+    AliasName("Roro", 676),
+    AliasName("Rumi_Numeral_Symbols", 677),
+    AliasName("Runic", 678),
+    AliasName("Runr", 679),
+    AliasName("S", 680),
+    AliasName("SA", 681),
+    AliasName("SB", 682),
+    AliasName("SC", 683),
+    AliasName("SContinue", 684),
+    AliasName("SD", 685),
+    AliasName("SE", 686),
+    AliasName("SG", 687),
+    AliasName("SM", 688),
+    AliasName("SP", 689),
+    AliasName("ST", 690),
+    AliasName("STerm", 691),
+    AliasName("SY", 692),
+    AliasName("Sad", 693),
+    AliasName("Sadhe", 694),
+    AliasName("Samaritan", 695),
+    AliasName("Samr", 696),
+    AliasName("Sara", 697),
+    AliasName("Sarb", 698),
+    AliasName("Saur", 699),
+    AliasName("Saurashtra", 700),
+    AliasName("Sc", 701),
+    AliasName("Script", 702),
+    AliasName("Script_Extensions", 703),
+    AliasName("Seen", 704),
+    AliasName("Segment_Separator", 705),
+    AliasName("Segment_Starter", 706),
+    AliasName("Semkath", 707),
+    AliasName("Sensitive", 708),
+    AliasName("Sentence_Break", 709),
+    AliasName("Sep", 710),
+    AliasName("Separator", 711),
+    AliasName("Sgnw", 712),
+    AliasName("Shavian", 713),
+    AliasName("Shaw", 714),
+    AliasName("Shin", 715),
+    AliasName("Simple_Case_Folding", 716),
+    AliasName("Simple_Lowercase_Mapping", 717),
+    AliasName("Simple_Titlecase_Mapping", 718),
+    AliasName("Simple_Uppercase_Mapping", 719),
+    AliasName("Sind", 720),
+    AliasName("Sinh", 721),
+    AliasName("Sinhala", 722),
+    AliasName("Sk", 723),
+    AliasName("Sm", 724),
+    AliasName("Small", 725),
+    AliasName("Small_Form_Variants", 726),
+    AliasName("Sml", 727),
+    AliasName("So", 728),
+    AliasName("Soft_Dotted", 729),
+    AliasName("Sp", 730),
+    AliasName("Space", 731),
+    AliasName("Space_Separator", 732),
+    AliasName("SpacingMark", 733),
+    AliasName("Spacing_Mark", 734),
+    AliasName("Spacing_Modifier_Letters", 735),
+    AliasName("Specials", 736),
+    AliasName("Sqr", 737),
+    AliasName("Square", 738),
+    AliasName("Sub", 739),
+    AliasName("Sund", 740),
+    AliasName("Sundanese", 741),
+    AliasName("Sup", 742),
+    AliasName("Super", 743),
+    AliasName("Superscripts_And_Subscripts", 744),
+    AliasName("Supplemental_Arrows_A", 745),
+    AliasName("Supplemental_Arrows_B", 746),
+    AliasName("Supplemental_Mathematical_Operators", 747),
+    AliasName("Supplemental_Punctuation", 748),
+    AliasName("Supplementary_Private_Use_Area_A", 749),
+    AliasName("Supplementary_Private_Use_Area_B", 750),
+    AliasName("Surrogate", 751),
+    AliasName("Swash_Kaf", 752),
+    AliasName("Sylo", 753),
+    AliasName("Syloti_Nagri", 754),
+    AliasName("Symbol", 755),
+    AliasName("Syrc", 756),
+    AliasName("Syre", 757),
+    AliasName("Syriac", 758),
+    AliasName("Syriac_Waw", 759),
+    AliasName("Syrj", 760),
+    AliasName("Syrn", 761),
+    AliasName("T", 762),
+    AliasName("Tagalog", 763),
+    AliasName("Tagb", 764),
+    AliasName("Tagbanwa", 765),
+    AliasName("Tags", 766),
+    AliasName("Tah", 767),
+    AliasName("Tai_Le", 768),
+    AliasName("Tai_Tham", 769),
+    AliasName("Tai_Viet", 770),
+    AliasName("Tai_Xuan_Jing_Symbols", 771),
+    AliasName("Tale", 772),
+    AliasName("Talu", 773),
+    AliasName("Tamil", 774),
+    AliasName("Taml", 775),
+    AliasName("Tavt", 776),
+    AliasName("Taw", 777),
+    AliasName("Teh_Marbuta", 778),
+    AliasName("Teh_Marbuta_Goal", 779),
+    AliasName("Telu", 780),
+    AliasName("Telugu", 781),
+    AliasName("Teng", 782),
+    AliasName("Term", 783),
+    AliasName("Terminal_Punctuation", 784),
+    AliasName("Teth", 785),
+    AliasName("Tfng", 786),
+    AliasName("Tglg", 787),
+    AliasName("Thaa", 788),
+    AliasName("Thaana", 789),
+    AliasName("Thai", 790),
+    AliasName("Tibetan", 791),
+    AliasName("Tibt", 792),
+    AliasName("Tifinagh", 793),
+    AliasName("Titlecase_Letter", 794),
+    AliasName("Titlecase_Mapping", 795),
+    AliasName("Trail_Canonical_Combining_Class", 796),
+    AliasName("Trailing_Jamo", 797),
+    AliasName("Transparent", 798),
+    AliasName("Transport_And_Map_Symbols", 799),
+    AliasName("True", 800),
+    AliasName("U", 801),
+    AliasName("UIdeo", 802),
+    AliasName("UP", 803),
+    AliasName("Ugar", 804),
+    AliasName("Ugaritic", 805),
+    AliasName("Unassigned", 806),
+    AliasName("Unicode_1_Name", 807),
+    AliasName("Unified_Canadian_Aboriginal_Syllabics", 808),
+    AliasName("Unified_Canadian_Aboriginal_Syllabics_Extended", 809),
+    AliasName("Unified_Ideograph", 810),
+    AliasName("Unknown", 811),
+    AliasName("Upper", 812),
+    AliasName("Uppercase", 813),
+    AliasName("Uppercase_Letter", 814),
+    AliasName("Uppercase_Mapping", 815),
+    AliasName("V", 816),
+    AliasName("VR", 817),
+    AliasName("VS", 818),
+    AliasName("Vai", 819),
+    AliasName("Vaii", 820),
+    AliasName("Variation_Selector", 821),
+    AliasName("Variation_Selectors", 822),
+    AliasName("Variation_Selectors_Supplement", 823),
+    AliasName("Vedic_Extensions", 824),
+    AliasName("Vert", 825),
+    AliasName("Vertical", 826),
+    AliasName("Vertical_Forms", 827),
+    AliasName("Virama", 828),
+    AliasName("Visp", 829),
+    AliasName("Vowel_Jamo", 830),
+    AliasName("W", 831),
+    AliasName("WB", 832),
+    AliasName("WJ", 833),
+    AliasName("WS", 834),
+    AliasName("WSpace", 835),
+    AliasName("Wara", 836),
+    AliasName("Waw", 837),
+    AliasName("White_Space", 838),
+    AliasName("Wide", 839),
+    AliasName("Word_Break", 840),
+    AliasName("Word_Joiner", 841),
+    AliasName("XIDC", 842),
+    AliasName("XIDS", 843),
+    AliasName("XID_Continue", 844),
+    AliasName("XID_Start", 845),
+    AliasName("XX", 846),
+    AliasName("Xpeo", 847),
+    AliasName("Xsux", 848),
+    AliasName("Y", 849),
+    AliasName("Yeh", 850),
+    AliasName("Yeh_Barree", 851),
+    AliasName("Yeh_With_Tail", 852),
+    AliasName("Yes", 853),
+    AliasName("Yi", 854),
+    AliasName("Yi_Radicals", 855),
+    AliasName("Yi_Syllables", 856),
+    AliasName("Yiii", 857),
+    AliasName("Yijing_Hexagram_Symbols", 858),
+    AliasName("Yudh", 859),
+    AliasName("Yudh_He", 860),
+    AliasName("Z", 861),
+    AliasName("ZW", 862),
+    AliasName("ZWSpace", 863),
+    AliasName("Zain", 864),
+    AliasName("Zhain", 865),
+    AliasName("Zinh", 866),
+    AliasName("Zl", 867),
+    AliasName("Zmth", 868),
+    AliasName("Zp", 869),
+    AliasName("Zs", 870),
+    AliasName("Zsym", 871),
+    AliasName("Zxxx", 872),
+    AliasName("Zyyy", 873),
+    AliasName("Zzzz", 874),
+    AliasName("age", 875),
+    AliasName("alnum", 876),
+    AliasName("bc", 877),
+    AliasName("blank", 878),
+    AliasName("blk", 879),
+    AliasName("bmg", 880),
+    AliasName("can", 881),
+    AliasName("ccc", 882),
+    AliasName("cf", 883),
+    AliasName("cntrl", 884),
+    AliasName("com", 885),
+    AliasName("digit", 886),
+    AliasName("dt", 887),
+    AliasName("ea", 888),
+    AliasName("enc", 889),
+    AliasName("fin", 890),
+    AliasName("font", 891),
+    AliasName("fra", 892),
+    AliasName("gc", 893),
+    AliasName("gcm", 894),
+    AliasName("graph", 895),
+    AliasName("hst", 896),
+    AliasName("init", 897),
+    AliasName("isc", 898),
+    AliasName("iso", 899),
+    AliasName("jg", 900),
+    AliasName("jt", 901),
+    AliasName("lb", 902),
+    AliasName("lc", 903),
+    AliasName("lccc", 904),
+    AliasName("med", 905),
+    AliasName("na", 906),
+    AliasName("na1", 907),
+    AliasName("nar", 908),
+    AliasName("nb", 909),
+    AliasName("nfcinert", 910),
+    AliasName("nfdinert", 911),
+    AliasName("nfkcinert", 912),
+    AliasName("nfkdinert", 913),
+    AliasName("none", 914),
+    AliasName("nt", 915),
+    AliasName("nv", 916),
+    AliasName("print", 917),
+    AliasName("punct", 918),
+    AliasName("sc", 919),
+    AliasName("scf", 920),
+    AliasName("scx", 921),
+    AliasName("segstart", 922),
+    AliasName("sfc", 923),
+    AliasName("slc", 924),
+    AliasName("sml", 925),
+    AliasName("space", 926),
+    AliasName("sqr", 927),
+    AliasName("stc", 928),
+    AliasName("sub", 929),
+    AliasName("suc", 930),
+    AliasName("sup", 931),
+    AliasName("tc", 932),
+    AliasName("tccc", 933),
+    AliasName("uc", 934),
+    AliasName("vert", 935),
+    AliasName("wide", 936),
+    AliasName("xdigit", 937),
+};
+
+/* to be filled in */
+int32_t REMAP[938];
+
+const int32_t NAME_GROUP_COUNT = 1429;
+
+int32_t NAME_GROUP[] = {
+    120, -178,          /*   0: "CN", "Control" */
+    122, -122,          /*   2: "CR", "CR" */
+    232, -256,          /*   4: "EX", "Extend" */
+    415, -415,          /*   6: "L", "L" */
+    418, -418,          /*   8: "LF", "LF" */
+    423, -423,          /*  10: "LV", "LV" */
+    424, -424,          /*  12: "LVT", "LVT" */
+    846, -609,          /*  14: "XX", "Other" */
+    619, -649,          /*  16: "PP", "Prepend" */
+    688, -733,          /*  18: "SM", "SpacingMark" */
+    762, -762,          /*  20: "T", "T" */
+    816, -816,          /*  22: "V", "V" */
+    482, -498,          /*  24: "M", "Maybe" */
+    531, -569,          /*  26: "N", "No" */
+    849, -853,          /*  28: "Y", "Yes" */
+    10, -15,            /*  30: "AT", "ATerm" */
+    118, -158,          /*  32: "CL", "Close" */
+    260, -270,          /*  34: "FO", "Format" */
+    419, -472,          /*  36: "LO", "Lower" */
+    552, -585,          /*  38: "NU", "Numeric" */
+    417, -590,          /*  40: "LE", "OLetter" */
+    683, -684,          /*  42: "SC", "SContinue" */
+    686, -710,          /*  44: "SE", "Sep" */
+    689, -730,          /*  46: "SP", "Sp" */
+    690, -691,          /*  48: "ST", "STerm" */
+    803, -812,          /*  50: "UP", "Upper" */
+    417, -5,            /*  52: "LE", "ALetter" */
+    256, -256,          /*  54: "Extend", "Extend" */
+    232, -257,          /*  56: "EX", "ExtendNumLet" */
+    388, -400,          /*  58: "KA", "Katakana" */
+    484, -508,          /*  60: "ML", "MidLetter" */
+    485, -509,          /*  62: "MN", "MidNum" */
+    483, -510,          /*  64: "MB", "MidNumLet" */
+    548, -563,          /*  66: "NL", "Newline" */
+    25, -26,            /*  68: "Alpha", "Alphabetic" */
+    2, -9,              /*  70: "AHex", "ASCII_Hex_Digit" */
+    74, -76,            /*  72: "Bidi_C", "Bidi_Control" */
+    77, -78,            /*  74: "Bidi_M", "Bidi_Mirrored" */
+    143, -143,          /*  76: "Cased", "Cased" */
+    105, -141,          /*  78: "CI", "Case_Ignorable" */
+    708, -142,          /*  80: "Sensitive", "Case_Sensitive" */
+    124, -148,          /*  82: "CWCF", "Changes_When_Casefolded" */
+    125, -149,          /*  84: "CWCM", "Changes_When_Casemapped" */
+    127, -150,          /*  86: "CWL", "Changes_When_Lowercased" */
+    126, -151,          /*  88: "CWKCF", "Changes_When_NFKC_Casefolded" */
+    128, -152,          /*  90: "CWT", "Changes_When_Titlecased" */
+    129, -153,          /*  92: "CWU", "Changes_When_Uppercased" */
+    204, -204,          /*  94: "Dash", "Dash" */
+    201, -210,          /*  96: "DI", "Default_Ignorable_Code_Point" */
+    211, -212,          /*  98: "Dep", "Deprecated" */
+    218, -219,          /* 100: "Dia", "Diacritic" */
+    255, -258,          /* 102: "Ext", "Extender" */
+    173, -273,          /* 104: "Comp_Ex", "Full_Composition_Exclusion" */
+    292, -296,          /* 106: "Gr_Base", "Grapheme_Base" */
+    293, -298,          /* 108: "Gr_Ext", "Grapheme_Extend" */
+    294, -299,          /* 110: "Gr_Link", "Grapheme_Link" */
+    336, -337,          /* 112: "Hex", "Hex_Digit" */
+    345, -345,          /* 114: "Hyphen", "Hyphen" */
+    359, -360,          /* 116: "Ideo", "Ideographic" */
+    349, -351,          /* 118: "IDSB", "IDS_Binary_Operator" */
+    350, -352,          /* 120: "IDST", "IDS_Trinary_Operator" */
+    347, -353,          /* 122: "IDC", "ID_Continue" */
+    348, -354,          /* 124: "IDS", "ID_Start" */
+    382, -384,          /* 126: "Join_C", "Join_Control" */
+    420, -469,          /* 128: "LOE", "Logical_Order_Exception" */
+    472, -473,          /* 130: "Lower", "Lowercase" */
+    493, -493,          /* 132: "Math", "Math" */
+    910, -534,          /* 134: "nfcinert", "NFC_Inert" */
+    911, -537,          /* 136: "nfdinert", "NFD_Inert" */
+    912, -540,          /* 138: "nfkcinert", "NFKC_Inert" */
+    913, -543,          /* 140: "nfkdinert", "NFKD_Inert" */
+    533, -574,          /* 142: "NChar", "Noncharacter_Code_Point" */
+    623, -625,          /* 144: "Pat_Syn", "Pattern_Syntax" */
+    624, -626,          /* 146: "Pat_WS", "Pattern_White_Space" */
+    0, -876,            /* 148: "", "alnum" */
+    0, -878,            /* 150: "", "blank" */
+    0, -895,            /* 152: "", "graph" */
+    0, -917,            /* 154: "", "print" */
+    0, -937,            /* 156: "", "xdigit" */
+    655, -662,          /* 158: "QMark", "Quotation_Mark" */
+    666, -666,          /* 160: "Radical", "Radical" */
+    922, -706,          /* 162: "segstart", "Segment_Starter" */
+    685, -729,          /* 164: "SD", "Soft_Dotted" */
+    691, -691,          /* 166: "STerm", "STerm" */
+    783, -784,          /* 168: "Term", "Terminal_Punctuation" */
+    802, -810,          /* 170: "UIdeo", "Unified_Ideograph" */
+    812, -813,          /* 172: "Upper", "Uppercase" */
+    818, -821,          /* 174: "VS", "Variation_Selector" */
+    835, 838, -926,     /* 176: "WSpace", "White_Space", "space" */
+    842, -844,          /* 179: "XIDC", "XID_Continue" */
+    843, -845,          /* 181: "XIDS", "XID_Start" */
+    916, -587,          /* 183: "nv", "Numeric_Value" */
+    877, -75,           /* 185: "bc", "Bidi_Class" */
+    879, -81,           /* 187: "blk", "Block" */
+    882, -135,          /* 189: "ccc", "Canonical_Combining_Class" */
+    887, -209,          /* 191: "dt", "Decomposition_Type" */
+    888, -233,          /* 193: "ea", "East_Asian_Width" */
+    893, -279,          /* 195: "gc", "General_Category" */
+    275, -297,          /* 197: "GCB", "Grapheme_Cluster_Break" */
+    896, -323,          /* 199: "hst", "Hangul_Syllable_Type" */
+    900, -385,          /* 201: "jg", "Joining_Group" */
+    901, -386,          /* 203: "jt", "Joining_Type" */
+    904, -443,          /* 205: "lccc", "Lead_Canonical_Combining_Class" */
+    902, -459,          /* 207: "lb", "Line_Break" */
+    535, -536,          /* 209: "NFC_QC", "NFC_Quick_Check" */
+    538, -539,          /* 211: "NFD_QC", "NFD_Quick_Check" */
+    541, -542,          /* 213: "NFKC_QC", "NFKC_Quick_Check" */
+    544, -545,          /* 215: "NFKD_QC", "NFKD_Quick_Check" */
+    915, -586,          /* 217: "nt", "Numeric_Type" */
+    919, -702,          /* 219: "sc", "Script" */
+    682, -709,          /* 221: "SB", "Sentence_Break" */
+    933, -796,          /* 223: "tccc", "Trail_Canonical_Combining_Class" */
+    832, -840,          /* 225: "WB", "Word_Break" */
+    894, -280,          /* 227: "gcm", "General_Category_Mask" */
+    921, -703,          /* 229: "scx", "Script_Extensions" */
+    875, -20,           /* 231: "age", "Age" */
+    880, -79,           /* 233: "bmg", "Bidi_Mirroring_Glyph" */
+    883, -140,          /* 235: "cf", "Case_Folding" */
+    898, -358,          /* 237: "isc", "ISO_Comment" */
+    903, -475,          /* 239: "lc", "Lowercase_Mapping" */
+    906, -554,          /* 241: "na", "Name" */
+    920, 716, -923,     /* 243: "scf", "Simple_Case_Folding", "sfc" */
+    924, -717,          /* 246: "slc", "Simple_Lowercase_Mapping" */
+    928, -718,          /* 248: "stc", "Simple_Titlecase_Mapping" */
+    930, -719,          /* 250: "suc", "Simple_Uppercase_Mapping" */
+    932, -795,          /* 252: "tc", "Titlecase_Mapping" */
+    907, -807,          /* 254: "na1", "Unicode_1_Name" */
+    934, -815,          /* 256: "uc", "Uppercase_Mapping" */
+    6, -35,             /* 258: "AN", "Arabic_Number" */
+    50, -622,           /* 260: "B", "Paragraph_Separator" */
+    56, -86,            /* 262: "BN", "Boundary_Neutral" */
+    123, -172,          /* 264: "CS", "Common_Separator" */
+    551, -576,          /* 266: "NSM", "Nonspacing_Mark" */
+    229, -251,          /* 268: "EN", "European_Number" */
+    230, -252,          /* 270: "ES", "European_Separator" */
+    231, -253,          /* 272: "ET", "European_Terminator" */
+    415, -447,          /* 274: "L", "Left_To_Right" */
+    421, -448,          /* 276: "LRE", "Left_To_Right_Embedding" */
+    422, -449,          /* 278: "LRO", "Left_To_Right_Override" */
+    591, -611,          /* 280: "ON", "Other_Neutral" */
+    617, -646,          /* 282: "PDF", "Pop_Directional_Format" */
+    663, -672,          /* 284: "R", "Right_To_Left" */
+    4, -34,             /* 286: "AL", "Arabic_Letter" */
+    664, -673,          /* 288: "RLE", "Right_To_Left_Embedding" */
+    665, -674,          /* 290: "RLO", "Right_To_Left_Override" */
+    680, -705,          /* 292: "S", "Segment_Separator" */
+    834, -838,          /* 294: "WS", "White_Space" */
+    531, 569, 259, -261, /* 296: "N", "No", "F", "False" */
+    849, 853, 762, -800, /* 300: "Y", "Yes", "T", "True" */
+    0, -19,             /* 304: "", "Aegean_Numbers" */
+    0, -23,             /* 306: "", "Alchemical_Symbols" */
+    0, -27,             /* 308: "", "Alphabetic_Presentation_Forms" */
+    0, -29,             /* 310: "", "Ancient_Greek_Musical_Notation" */
+    0, -30,             /* 312: "", "Ancient_Greek_Numbers" */
+    0, -31,             /* 314: "", "Ancient_Symbols" */
+    0, -33,             /* 316: "", "Arabic" */
+    0, 37, -36,         /* 318: "", "Arabic_Presentation_Forms_A", "Arabic_Presentation_Forms-A" */
+    0, -38,             /* 321: "", "Arabic_Presentation_Forms_B" */
+    0, -39,             /* 323: "", "Arabic_Supplement" */
+    0, -40,             /* 325: "", "Armenian" */
+    0, -43,             /* 327: "", "Arrows" */
+    0, -48,             /* 329: "", "Avestan" */
+    0, -59,             /* 331: "", "Balinese" */
+    0, -61,             /* 333: "", "Bamum" */
+    0, -62,             /* 335: "", "Bamum_Supplement" */
+    0, 63, -8,          /* 337: "", "Basic_Latin", "ASCII" */
+    0, -65,             /* 340: "", "Batak" */
+    0, -72,             /* 342: "", "Bengali" */
+    0, -82,             /* 344: "", "Block_Elements" */
+    0, -84,             /* 346: "", "Bopomofo" */
+    0, -85,             /* 348: "", "Bopomofo_Extended" */
+    0, -87,             /* 350: "", "Box_Drawing" */
+    0, -89,             /* 352: "", "Brahmi" */
+    0, -92,             /* 354: "", "Braille_Patterns" */
+    0, -98,             /* 356: "", "Buginese" */
+    0, -100,            /* 358: "", "Buhid" */
+    0, -102,            /* 360: "", "Byzantine_Musical_Symbols" */
+    0, -138,            /* 362: "", "Carian" */
+    0, -147,            /* 364: "", "Cham" */
+    0, -155,            /* 366: "", "Cherokee" */
+    0, -106,            /* 368: "", "CJK_Compatibility" */
+    0, -107,            /* 370: "", "CJK_Compatibility_Forms" */
+    0, -108,            /* 372: "", "CJK_Compatibility_Ideographs" */
+    0, -109,            /* 374: "", "CJK_Compatibility_Ideographs_Supplement" */
+    0, -110,            /* 376: "", "CJK_Radicals_Supplement" */
+    0, -111,            /* 378: "", "CJK_Strokes" */
+    0, -112,            /* 380: "", "CJK_Symbols_And_Punctuation" */
+    0, -113,            /* 382: "", "CJK_Unified_Ideographs" */
+    0, -114,            /* 384: "", "CJK_Unified_Ideographs_Extension_A" */
+    0, -115,            /* 386: "", "CJK_Unified_Ideographs_Extension_B" */
+    0, -116,            /* 388: "", "CJK_Unified_Ideographs_Extension_C" */
+    0, -117,            /* 390: "", "CJK_Unified_Ideographs_Extension_D" */
+    0, -164,            /* 392: "", "Combining_Diacritical_Marks" */
+    0, -166,            /* 394: "", "Combining_Diacritical_Marks_Supplement" */
+    0, -167,            /* 396: "", "Combining_Half_Marks" */
+    0, 165, -169,       /* 398: "", "Combining_Diacritical_Marks_For_Symbols", "Combining_Marks_For_Symbols" */
+    0, -171,            /* 401: "", "Common_Indic_Number_Forms" */
+    0, -179,            /* 403: "", "Control_Pictures" */
+    0, -181,            /* 405: "", "Coptic" */
+    0, -182,            /* 407: "", "Counting_Rod_Numerals" */
+    0, -185,            /* 409: "", "Cuneiform" */
+    0, -186,            /* 411: "", "Cuneiform_Numbers_And_Punctuation" */
+    0, -188,            /* 413: "", "Currency_Symbols" */
+    0, -190,            /* 415: "", "Cypriot_Syllabary" */
+    0, -191,            /* 417: "", "Cyrillic" */
+    0, -192,            /* 419: "", "Cyrillic_Extended_A" */
+    0, -193,            /* 421: "", "Cyrillic_Extended_B" */
+    0, 194, -195,       /* 423: "", "Cyrillic_Supplement", "Cyrillic_Supplementary" */
+    0, -213,            /* 426: "", "Deseret" */
+    0, -215,            /* 428: "", "Devanagari" */
+    0, -216,            /* 430: "", "Devanagari_Extended" */
+    0, -221,            /* 432: "", "Dingbats" */
+    0, -222,            /* 434: "", "Domino_Tiles" */
+    0, -237,            /* 436: "", "Egyptian_Hieroglyphs" */
+    0, -239,            /* 438: "", "Emoticons" */
+    0, -242,            /* 440: "", "Enclosed_Alphanumerics" */
+    0, -241,            /* 442: "", "Enclosed_Alphanumeric_Supplement" */
+    0, -243,            /* 444: "", "Enclosed_CJK_Letters_And_Months" */
+    0, -244,            /* 446: "", "Enclosed_Ideographic_Supplement" */
+    0, -247,            /* 448: "", "Ethiopic" */
+    0, -248,            /* 450: "", "Ethiopic_Extended" */
+    0, -249,            /* 452: "", "Ethiopic_Extended_A" */
+    0, -250,            /* 454: "", "Ethiopic_Supplement" */
+    0, -281,            /* 456: "", "General_Punctuation" */
+    0, -283,            /* 458: "", "Geometric_Shapes" */
+    0, -285,            /* 460: "", "Georgian" */
+    0, -286,            /* 462: "", "Georgian_Supplement" */
+    0, -288,            /* 464: "", "Glagolitic" */
+    0, -291,            /* 466: "", "Gothic" */
+    0, 301, -300,       /* 468: "", "Greek_And_Coptic", "Greek" */
+    0, -302,            /* 471: "", "Greek_Extended" */
+    0, -304,            /* 473: "", "Gujarati" */
+    0, -306,            /* 475: "", "Gurmukhi" */
+    0, -314,            /* 477: "", "Halfwidth_And_Fullwidth_Forms" */
+    0, -319,            /* 479: "", "Hangul_Compatibility_Jamo" */
+    0, -320,            /* 481: "", "Hangul_Jamo" */
+    0, -321,            /* 483: "", "Hangul_Jamo_Extended_A" */
+    0, -322,            /* 485: "", "Hangul_Jamo_Extended_B" */
+    0, -324,            /* 487: "", "Hangul_Syllables" */
+    0, -329,            /* 489: "", "Hanunoo" */
+    0, -332,            /* 491: "", "Hebrew" */
+    0, -338,            /* 493: "", "High_Private_Use_Surrogates" */
+    0, -339,            /* 495: "", "High_Surrogates" */
+    0, -341,            /* 497: "", "Hiragana" */
+    0, -361,            /* 499: "", "Ideographic_Description_Characters" */
+    0, -362,            /* 501: "", "Imperial_Aramaic" */
+    0, -369,            /* 503: "", "Inscriptional_Pahlavi" */
+    0, -370,            /* 505: "", "Inscriptional_Parthian" */
+    0, -356,            /* 507: "", "IPA_Extensions" */
+    0, -381,            /* 509: "", "Javanese" */
+    0, -391,            /* 511: "", "Kaithi" */
+    0, -394,            /* 513: "", "Kana_Supplement" */
+    0, -396,            /* 515: "", "Kanbun" */
+    0, -397,            /* 517: "", "Kangxi_Radicals" */
+    0, -398,            /* 519: "", "Kannada" */
+    0, -400,            /* 521: "", "Katakana" */
+    0, -402,            /* 523: "", "Katakana_Phonetic_Extensions" */
+    0, -403,            /* 525: "", "Kayah_Li" */
+    0, -406,            /* 527: "", "Kharoshthi" */
+    0, -407,            /* 529: "", "Khmer" */
+    0, -408,            /* 531: "", "Khmer_Symbols" */
+    0, -430,            /* 533: "", "Lao" */
+    0, 436, -435,       /* 535: "", "Latin_1_Supplement", "Latin_1" */
+    0, -437,            /* 538: "", "Latin_Extended_A" */
+    0, -438,            /* 540: "", "Latin_Extended_Additional" */
+    0, -439,            /* 542: "", "Latin_Extended_B" */
+    0, -440,            /* 544: "", "Latin_Extended_C" */
+    0, -441,            /* 546: "", "Latin_Extended_D" */
+    0, -451,            /* 548: "", "Lepcha" */
+    0, -454,            /* 550: "", "Letterlike_Symbols" */
+    0, -456,            /* 552: "", "Limbu" */
+    0, -463,            /* 554: "", "Linear_B_Ideograms" */
+    0, -464,            /* 556: "", "Linear_B_Syllabary" */
+    0, -465,            /* 558: "", "Lisu" */
+    0, -471,            /* 560: "", "Low_Surrogates" */
+    0, -479,            /* 562: "", "Lycian" */
+    0, -481,            /* 564: "", "Lydian" */
+    0, -486,            /* 566: "", "Mahjong_Tiles" */
+    0, -487,            /* 568: "", "Malayalam" */
+    0, -489,            /* 570: "", "Mandaic" */
+    0, -495,            /* 572: "", "Mathematical_Alphanumeric_Symbols" */
+    0, -496,            /* 574: "", "Mathematical_Operators" */
+    0, -504,            /* 576: "", "Meetei_Mayek" */
+    0, -512,            /* 578: "", "Miscellaneous_Mathematical_Symbols_A" */
+    0, -513,            /* 580: "", "Miscellaneous_Mathematical_Symbols_B" */
+    0, -514,            /* 582: "", "Miscellaneous_Symbols" */
+    0, -515,            /* 584: "", "Miscellaneous_Symbols_And_Arrows" */
+    0, -516,            /* 586: "", "Miscellaneous_Symbols_And_Pictographs" */
+    0, -517,            /* 588: "", "Miscellaneous_Technical" */
+    0, -522,            /* 590: "", "Modifier_Tone_Letters" */
+    0, -524,            /* 592: "", "Mongolian" */
+    0, -527,            /* 594: "", "Musical_Symbols" */
+    0, -528,            /* 596: "", "Myanmar" */
+    0, -529,            /* 598: "", "Myanmar_Extended_A" */
+    0, -562,            /* 600: "", "New_Tai_Lue" */
+    0, -547,            /* 602: "", "NKo" */
+    0, -570,            /* 604: "", "No_Block" */
+    0, -584,            /* 606: "", "Number_Forms" */
+    0, -595,            /* 608: "", "Ogham" */
+    0, -598,            /* 610: "", "Old_Italic" */
+    0, -599,            /* 612: "", "Old_Persian" */
+    0, -600,            /* 614: "", "Old_South_Arabian" */
+    0, -601,            /* 616: "", "Old_Turkic" */
+    0, -596,            /* 618: "", "Ol_Chiki" */
+    0, -603,            /* 620: "", "Optical_Character_Recognition" */
+    0, -604,            /* 622: "", "Oriya" */
+    0, -608,            /* 624: "", "Osmanya" */
+    0, -633,            /* 626: "", "Phags_Pa" */
+    0, -634,            /* 628: "", "Phaistos_Disc" */
+    0, -639,            /* 630: "", "Phoenician" */
+    0, -640,            /* 632: "", "Phonetic_Extensions" */
+    0, -641,            /* 634: "", "Phonetic_Extensions_Supplement" */
+    0, -643,            /* 636: "", "Playing_Cards" */
+    0, 651, -650,       /* 638: "", "Private_Use_Area", "Private_Use" */
+    0, -668,            /* 641: "", "Rejang" */
+    0, -677,            /* 643: "", "Rumi_Numeral_Symbols" */
+    0, -678,            /* 645: "", "Runic" */
+    0, -695,            /* 647: "", "Samaritan" */
+    0, -700,            /* 649: "", "Saurashtra" */
+    0, -713,            /* 651: "", "Shavian" */
+    0, -722,            /* 653: "", "Sinhala" */
+    0, -726,            /* 655: "", "Small_Form_Variants" */
+    0, -735,            /* 657: "", "Spacing_Modifier_Letters" */
+    0, -736,            /* 659: "", "Specials" */
+    0, -741,            /* 661: "", "Sundanese" */
+    0, -744,            /* 663: "", "Superscripts_And_Subscripts" */
+    0, -745,            /* 665: "", "Supplemental_Arrows_A" */
+    0, -746,            /* 667: "", "Supplemental_Arrows_B" */
+    0, -747,            /* 669: "", "Supplemental_Mathematical_Operators" */
+    0, -748,            /* 671: "", "Supplemental_Punctuation" */
+    0, -749,            /* 673: "", "Supplementary_Private_Use_Area_A" */
+    0, -750,            /* 675: "", "Supplementary_Private_Use_Area_B" */
+    0, -754,            /* 677: "", "Syloti_Nagri" */
+    0, -758,            /* 679: "", "Syriac" */
+    0, -763,            /* 681: "", "Tagalog" */
+    0, -765,            /* 683: "", "Tagbanwa" */
+    0, -766,            /* 685: "", "Tags" */
+    0, -768,            /* 687: "", "Tai_Le" */
+    0, -769,            /* 689: "", "Tai_Tham" */
+    0, -770,            /* 691: "", "Tai_Viet" */
+    0, -771,            /* 693: "", "Tai_Xuan_Jing_Symbols" */
+    0, -774,            /* 695: "", "Tamil" */
+    0, -781,            /* 697: "", "Telugu" */
+    0, -789,            /* 699: "", "Thaana" */
+    0, -790,            /* 701: "", "Thai" */
+    0, -791,            /* 703: "", "Tibetan" */
+    0, -793,            /* 705: "", "Tifinagh" */
+    0, -799,            /* 707: "", "Transport_And_Map_Symbols" */
+    0, -805,            /* 709: "", "Ugaritic" */
+    0, 808, -133,       /* 711: "", "Unified_Canadian_Aboriginal_Syllabics", "Canadian_Syllabics" */
+    0, -809,            /* 714: "", "Unified_Canadian_Aboriginal_Syllabics_Extended" */
+    0, -819,            /* 716: "", "Vai" */
+    0, -822,            /* 718: "", "Variation_Selectors" */
+    0, -823,            /* 720: "", "Variation_Selectors_Supplement" */
+    0, -824,            /* 722: "", "Vedic_Extensions" */
+    0, -827,            /* 724: "", "Vertical_Forms" */
+    0, -858,            /* 726: "", "Yijing_Hexagram_Symbols" */
+    0, -855,            /* 728: "", "Yi_Radicals" */
+    0, -856,            /* 730: "", "Yi_Syllables" */
+    549, -580,          /* 732: "NR", "Not_Reordered" */
+    593, -615,          /* 734: "OV", "Overlay" */
+    14, -47,            /* 736: "ATBL", "Attached_Below_Left" */
+    13, -46,            /* 738: "ATB", "Attached_Below" */
+    11, -44,            /* 740: "ATA", "Attached_Above" */
+    12, -45,            /* 742: "ATAR", "Attached_Above_Right" */
+    55, -69,            /* 744: "BL", "Below_Left" */
+    50, -68,            /* 746: "B", "Below" */
+    57, -70,            /* 748: "BR", "Below_Right" */
+    415, -445,          /* 750: "L", "Left" */
+    663, -670,          /* 752: "R", "Right" */
+    4, -17,             /* 754: "AL", "Above_Left" */
+    1, -16,             /* 756: "A", "Above" */
+    7, -18,             /* 758: "AR", "Above_Right" */
+    200, -224,          /* 760: "DB", "Double_Below" */
+    199, -223,          /* 762: "DA", "Double_Above" */
+    357, -373,          /* 764: "IS", "Iota_Subscript" */
+    546, -582,          /* 766: "NK", "Nukta" */
+    389, -395,          /* 768: "KV", "Kana_Voicing" */
+    817, -828,          /* 770: "VR", "Virama" */
+    131, 134, -881,     /* 772: "Can", "Canonical", "can" */
+    240, 156, -889,     /* 775: "Enc", "Circle", "enc" */
+    163, 174, -885,     /* 778: "Com", "Compat", "com" */
+    265, 266, -890,     /* 781: "Fin", "Final", "fin" */
+    269, -891,          /* 784: "Font", "font" */
+    271, 272, -892,     /* 786: "Fra", "Fraction", "fra" */
+    366, 367, -897,     /* 789: "Init", "Initial", "init" */
+    374, 375, -899,     /* 792: "Iso", "Isolated", "iso" */
+    501, 502, -905,     /* 795: "Med", "Medial", "med" */
+    555, 557, -908,     /* 798: "Nar", "Narrow", "nar" */
+    558, 572, -909,     /* 801: "Nb", "Nobreak", "nb" */
+    575, -914,          /* 804: "None", "none" */
+    727, 725, -925,     /* 806: "Sml", "Small", "sml" */
+    737, 738, -927,     /* 809: "Sqr", "Square", "sqr" */
+    739, -929,          /* 812: "Sub", "sub" */
+    742, 743, -931,     /* 814: "Sup", "Super", "sup" */
+    825, 826, -935,     /* 817: "Vert", "Vertical", "vert" */
+    839, -936,          /* 820: "Wide", "wide" */
+    1, -28,             /* 822: "A", "Ambiguous" */
+    259, -274,          /* 824: "F", "Fullwidth" */
+    308, -313,          /* 826: "H", "Halfwidth" */
+    553, -557,          /* 828: "Na", "Narrow" */
+    531, -561,          /* 830: "N", "Neutral" */
+    831, -839,          /* 832: "W", "Wide" */
+    499, -734,          /* 834: "Mc", "Spacing_Mark" */
+    627, -176,          /* 836: "Pc", "Connector_Punctuation" */
+    145, 178, -884,     /* 838: "Cc", "Control", "cntrl" */
+    701, -187,          /* 841: "Sc", "Currency_Symbol" */
+    628, -205,          /* 843: "Pd", "Dash_Punctuation" */
+    560, 208, -886,     /* 845: "Nd", "Decimal_Number", "digit" */
+    500, -245,          /* 848: "Me", "Enclosing_Mark" */
+    629, -160,          /* 850: "Pe", "Close_Punctuation" */
+    631, -267,          /* 852: "Pf", "Final_Punctuation" */
+    146, -270,          /* 854: "Cf", "Format" */
+    161, -806,          /* 856: "Cn", "Unassigned" */
+    642, -368,          /* 858: "Pi", "Initial_Punctuation" */
+    568, -453,          /* 860: "Nl", "Letter_Number" */
+    867, -461,          /* 862: "Zl", "Line_Separator" */
+    466, -474,          /* 864: "Ll", "Lowercase_Letter" */
+    724, -494,          /* 866: "Sm", "Math_Symbol" */
+    467, -520,          /* 868: "Lm", "Modifier_Letter" */
+    723, -521,          /* 870: "Sk", "Modifier_Symbol" */
+    519, -576,          /* 872: "Mn", "Nonspacing_Mark" */
+    468, -610,          /* 874: "Lo", "Other_Letter" */
+    569, -612,          /* 876: "No", "Other_Number" */
+    645, -613,          /* 878: "Po", "Other_Punctuation" */
+    728, -614,          /* 880: "So", "Other_Symbol" */
+    869, -622,          /* 882: "Zp", "Paragraph_Separator" */
+    162, -650,          /* 884: "Co", "Private_Use" */
+    870, -732,          /* 886: "Zs", "Space_Separator" */
+    653, -602,          /* 888: "Ps", "Open_Punctuation" */
+    184, -751,          /* 890: "Cs", "Surrogate" */
+    476, -794,          /* 892: "Lt", "Titlecase_Letter" */
+    477, -814,          /* 894: "Lu", "Uppercase_Letter" */
+    103, -609,          /* 896: "C", "Other" */
+    416, -144,          /* 898: "LC", "Cased_Letter" */
+    415, -452,          /* 900: "L", "Letter" */
+    482, -492,          /* 902: "M", "Mark" */
+    531, -583,          /* 904: "N", "Number" */
+    616, 654, -918,     /* 906: "P", "Punctuation", "punct" */
+    680, -755,          /* 909: "S", "Symbol" */
+    861, -711,          /* 911: "Z", "Separator" */
+    415, -444,          /* 913: "L", "Leading_Jamo" */
+    424, -425,          /* 915: "LVT", "LVT_Syllable" */
+    423, -426,          /* 917: "LV", "LV_Syllable" */
+    532, -579,          /* 919: "NA", "Not_Applicable" */
+    762, -797,          /* 921: "T", "Trailing_Jamo" */
+    816, -830,          /* 923: "V", "Vowel_Jamo" */
+    0, -21,             /* 925: "", "Ain" */
+    0, -22,             /* 927: "", "Alaph" */
+    0, -24,             /* 929: "", "Alef" */
+    0, -67,             /* 931: "", "Beh" */
+    0, -73,             /* 933: "", "Beth" */
+    0, -101,            /* 935: "", "Burushaski_Yeh_Barree" */
+    0, -202,            /* 937: "", "Dal" */
+    0, -203,            /* 939: "", "Dalath_Rish" */
+    0, -228,            /* 941: "", "E" */
+    0, -262,            /* 943: "", "Farsi_Yeh" */
+    0, -263,            /* 945: "", "Fe" */
+    0, -264,            /* 947: "", "Feh" */
+    0, -268,            /* 949: "", "Final_Semkath" */
+    0, -277,            /* 951: "", "Gaf" */
+    0, -278,            /* 953: "", "Gamal" */
+    0, -312,            /* 955: "", "Hah" */
+    0, -330,            /* 957: "", "He" */
+    0, -333,            /* 959: "", "Heh" */
+    0, -334,            /* 961: "", "Heh_Goal" */
+    0, -335,            /* 963: "", "Heth" */
+    0, -390,            /* 965: "", "Kaf" */
+    0, -399,            /* 967: "", "Kaph" */
+    0, -404,            /* 969: "", "Khaph" */
+    0, -411,            /* 971: "", "Knotted_Heh" */
+    0, -427,            /* 973: "", "Lam" */
+    0, -428,            /* 975: "", "Lamadh" */
+    0, -503,            /* 977: "", "Meem" */
+    0, -511,            /* 979: "", "Mim" */
+    0, -578,            /* 981: "", "Noon" */
+    0, -571,            /* 983: "", "No_Joining_Group" */
+    0, -588,            /* 985: "", "Nun" */
+    0, -589,            /* 987: "", "Nya" */
+    0, -629,            /* 989: "", "Pe" */
+    0, -659,            /* 991: "", "Qaf" */
+    0, -660,            /* 993: "", "Qaph" */
+    0, -667,            /* 995: "", "Reh" */
+    0, -669,            /* 997: "", "Reversed_Pe" */
+    0, -693,            /* 999: "", "Sad" */
+    0, -694,            /* 1001: "", "Sadhe" */
+    0, -704,            /* 1003: "", "Seen" */
+    0, -707,            /* 1005: "", "Semkath" */
+    0, -715,            /* 1007: "", "Shin" */
+    0, -752,            /* 1009: "", "Swash_Kaf" */
+    0, -759,            /* 1011: "", "Syriac_Waw" */
+    0, -767,            /* 1013: "", "Tah" */
+    0, -777,            /* 1015: "", "Taw" */
+    0, -778,            /* 1017: "", "Teh_Marbuta" */
+    0, 779, -315,       /* 1019: "", "Teh_Marbuta_Goal", "Hamza_On_Heh_Goal" */
+    0, -785,            /* 1022: "", "Teth" */
+    0, -837,            /* 1024: "", "Waw" */
+    0, -850,            /* 1026: "", "Yeh" */
+    0, -851,            /* 1028: "", "Yeh_Barree" */
+    0, -852,            /* 1030: "", "Yeh_With_Tail" */
+    0, -859,            /* 1032: "", "Yudh" */
+    0, -860,            /* 1034: "", "Yudh_He" */
+    0, -864,            /* 1036: "", "Zain" */
+    0, -865,            /* 1038: "", "Zhain" */
+    198, -226,          /* 1040: "D", "Dual_Joining" */
+    103, -383,          /* 1042: "C", "Join_Causing" */
+    415, -446,          /* 1044: "L", "Left_Joining" */
+    801, -573,          /* 1046: "U", "Non_Joining" */
+    663, -671,          /* 1048: "R", "Right_Joining" */
+    762, -798,          /* 1050: "T", "Transparent" */
+    4, -26,             /* 1052: "AL", "Alphabetic" */
+    3, -28,             /* 1054: "AI", "Ambiguous" */
+    52, -93,            /* 1056: "BA", "Break_After" */
+    53, -94,            /* 1058: "BB", "Break_Before" */
+    51, -95,            /* 1060: "B2", "Break_Both" */
+    692, -96,           /* 1062: "SY", "Break_Symbols" */
+    122, -139,          /* 1064: "CR", "Carriage_Return" */
+    121, -159,          /* 1066: "CP", "Close_Parenthesis" */
+    118, -160,          /* 1068: "CL", "Close_Punctuation" */
+    119, -168,          /* 1070: "CM", "Combining_Mark" */
+    681, -175,          /* 1072: "SA", "Complex_Context" */
+    104, -177,          /* 1074: "CB", "Contingent_Break" */
+    232, -254,          /* 1076: "EX", "Exclamation" */
+    276, -289,          /* 1078: "GL", "Glue" */
+    309, -309,          /* 1080: "H2", "H2" */
+    310, -310,          /* 1082: "H3", "H3" */
+    311, -345,          /* 1084: "HY", "Hyphen" */
+    346, -360,          /* 1086: "ID", "Ideographic" */
+    357, -364,          /* 1088: "IS", "Infix_Numeric" */
+    355, 371, -372,     /* 1090: "IN", "Inseparable", "Inseperable" */
+    377, -377,          /* 1093: "JL", "JL" */
+    378, -378,          /* 1095: "JT", "JT" */
+    379, -379,          /* 1097: "JV", "JV" */
+    418, -460,          /* 1099: "LF", "Line_Feed" */
+    54, -490,           /* 1101: "BK", "Mandatory_Break" */
+    548, -564,          /* 1103: "NL", "Next_Line" */
+    550, -577,          /* 1105: "NS", "Nonstarter" */
+    592, -602,          /* 1107: "OP", "Open_Punctuation" */
+    618, -647,          /* 1109: "PO", "Postfix_Numeric" */
+    620, -648,          /* 1111: "PR", "Prefix_Numeric" */
+    656, -661,          /* 1113: "QU", "Quotation" */
+    689, -731,          /* 1115: "SP", "Space" */
+    687, -751,          /* 1117: "SG", "Surrogate" */
+    846, -811,          /* 1119: "XX", "Unknown" */
+    833, -841,          /* 1121: "WJ", "Word_Joiner" */
+    862, -863,          /* 1123: "ZW", "ZWSpace" */
+    206, -207,          /* 1125: "De", "Decimal" */
+    217, -220,          /* 1127: "Di", "Digit" */
+    575, -575,          /* 1129: "None", "None" */
+    581, -585,          /* 1131: "Nu", "Numeric" */
+    32, -33,            /* 1133: "Arab", "Arabic" */
+    42, -40,            /* 1135: "Armn", "Armenian" */
+    49, -48,            /* 1137: "Avst", "Avestan" */
+    58, -59,            /* 1139: "Bali", "Balinese" */
+    60, -61,            /* 1141: "Bamu", "Bamum" */
+    64, -64,            /* 1143: "Bass", "Bass" */
+    66, -65,            /* 1145: "Batk", "Batak" */
+    71, -72,            /* 1147: "Beng", "Bengali" */
+    80, -80,            /* 1149: "Blis", "Blis" */
+    637, -637,          /* 1151: "Phlv", "Phlv" */
+    83, -84,            /* 1153: "Bopo", "Bopomofo" */
+    88, -89,            /* 1155: "Brah", "Brahmi" */
+    90, -91,            /* 1157: "Brai", "Braille" */
+    97, -98,            /* 1159: "Bugi", "Buginese" */
+    99, -100,           /* 1161: "Buhd", "Buhid" */
+    136, -132,          /* 1163: "Cans", "Canadian_Aboriginal" */
+    137, -138,          /* 1165: "Cari", "Carian" */
+    130, -130,          /* 1167: "Cakm", "Cakm" */
+    147, -147,          /* 1169: "Cham", "Cham" */
+    154, -155,          /* 1171: "Cher", "Cherokee" */
+    157, -157,          /* 1173: "Cirt", "Cirt" */
+    873, -170,          /* 1175: "Zyyy", "Common" */
+    180, 181, -657,     /* 1177: "Copt", "Coptic", "Qaac" */
+    848, -185,          /* 1180: "Xsux", "Cuneiform" */
+    183, -189,          /* 1182: "Cprt", "Cypriot" */
+    196, -191,          /* 1184: "Cyrl", "Cyrillic" */
+    234, -234,          /* 1186: "Egyd", "Egyd" */
+    225, -213,          /* 1188: "Dsrt", "Deseret" */
+    214, -215,          /* 1190: "Deva", "Devanagari" */
+    227, -227,          /* 1192: "Dupl", "Dupl" */
+    761, -761,          /* 1194: "Syrn", "Syrn" */
+    236, -237,          /* 1196: "Egyp", "Egyptian_Hieroglyphs" */
+    238, -238,          /* 1198: "Elba", "Elba" */
+    757, -757,          /* 1200: "Syre", "Syre" */
+    246, -247,          /* 1202: "Ethi", "Ethiopic" */
+    284, -285,          /* 1204: "Geor", "Georgian" */
+    287, -288,          /* 1206: "Glag", "Glagolitic" */
+    290, -291,          /* 1208: "Goth", "Gothic" */
+    295, -295,          /* 1210: "Gran", "Gran" */
+    303, -300,          /* 1212: "Grek", "Greek" */
+    305, -304,          /* 1214: "Gujr", "Gujarati" */
+    307, -306,          /* 1216: "Guru", "Gurmukhi" */
+    325, -316,          /* 1218: "Hani", "Han" */
+    317, -318,          /* 1220: "Hang", "Hangul" */
+    326, -329,          /* 1222: "Hano", "Hanunoo" */
+    363, -363,          /* 1224: "Inds", "Inds" */
+    331, -332,          /* 1226: "Hebr", "Hebrew" */
+    235, -235,          /* 1228: "Egyh", "Egyh" */
+    340, -341,          /* 1230: "Hira", "Hiragana" */
+    41, -362,           /* 1232: "Armi", "Imperial_Aramaic" */
+    866, 365, -658,     /* 1234: "Zinh", "Inherited", "Qaai" */
+    635, -369,          /* 1237: "Phli", "Inscriptional_Pahlavi" */
+    652, -370,          /* 1239: "Prti", "Inscriptional_Parthian" */
+    387, -387,          /* 1241: "Jpan", "Jpan" */
+    380, -381,          /* 1243: "Java", "Javanese" */
+    414, -391,          /* 1245: "Kthi", "Kaithi" */
+    410, -398,          /* 1247: "Knda", "Kannada" */
+    393, -400,          /* 1249: "Kana", "Katakana" */
+    343, -401,          /* 1251: "Hrkt", "Katakana_Or_Hiragana" */
+    392, -403,          /* 1253: "Kali", "Kayah_Li" */
+    405, -406,          /* 1255: "Khar", "Kharoshthi" */
+    409, -407,          /* 1257: "Khmr", "Khmer" */
+    282, -282,          /* 1259: "Geok", "Geok" */
+    412, -412,          /* 1261: "Kore", "Kore" */
+    413, -413,          /* 1263: "Kpel", "Kpel" */
+    429, -769,          /* 1265: "Lana", "Tai_Tham" */
+    431, -430,          /* 1267: "Laoo", "Lao" */
+    442, -434,          /* 1269: "Latn", "Latin" */
+    432, -432,          /* 1271: "Latf", "Latf" */
+    433, -433,          /* 1273: "Latg", "Latg" */
+    450, -451,          /* 1275: "Lepc", "Lepcha" */
+    455, -456,          /* 1277: "Limb", "Limbu" */
+    457, -457,          /* 1279: "Lina", "Lina" */
+    458, -462,          /* 1281: "Linb", "Linear_B" */
+    465, -465,          /* 1283: "Lisu", "Lisu" */
+    470, -470,          /* 1285: "Loma", "Loma" */
+    478, -479,          /* 1287: "Lyci", "Lycian" */
+    480, -481,          /* 1289: "Lydi", "Lydian" */
+    518, -487,          /* 1291: "Mlym", "Malayalam" */
+    488, -489,          /* 1293: "Mand", "Mandaic" */
+    491, -491,          /* 1295: "Mani", "Mani" */
+    868, -868,          /* 1297: "Zmth", "Zmth" */
+    497, -497,          /* 1299: "Maya", "Maya" */
+    526, -504,          /* 1301: "Mtei", "Meetei_Mayek" */
+    505, -505,          /* 1303: "Mend", "Mend" */
+    506, -506,          /* 1305: "Merc", "Merc" */
+    507, -507,          /* 1307: "Mero", "Mero" */
+    523, -524,          /* 1309: "Mong", "Mongolian" */
+    525, -525,          /* 1311: "Moon", "Moon" */
+    530, -528,          /* 1313: "Mymr", "Myanmar" */
+    559, -559,          /* 1315: "Nbat", "Nbat" */
+    565, -565,          /* 1317: "Nkgb", "Nkgb" */
+    773, -562,          /* 1319: "Talu", "New_Tai_Lue" */
+    567, -566,          /* 1321: "Nkoo", "Nko" */
+    594, -595,          /* 1323: "Ogam", "Ogham" */
+    197, -197,          /* 1325: "Cyrs", "Cyrs" */
+    344, -344,          /* 1327: "Hung", "Hung" */
+    376, -598,          /* 1329: "Ital", "Old_Italic" */
+    556, -556,          /* 1331: "Narb", "Narb" */
+    630, -630,          /* 1333: "Perm", "Perm" */
+    847, -599,          /* 1335: "Xpeo", "Old_Persian" */
+    698, -600,          /* 1337: "Sarb", "Old_South_Arabian" */
+    597, -596,          /* 1339: "Olck", "Ol_Chiki" */
+    606, -604,          /* 1341: "Orya", "Oriya" */
+    605, -601,          /* 1343: "Orkh", "Old_Turkic" */
+    607, -608,          /* 1345: "Osma", "Osmanya" */
+    342, -342,          /* 1347: "Hmng", "Hmng" */
+    621, -621,          /* 1349: "Palm", "Palm" */
+    632, -633,          /* 1351: "Phag", "Phags_Pa" */
+    638, -639,          /* 1353: "Phnx", "Phoenician" */
+    644, -644,          /* 1355: "Plrd", "Plrd" */
+    636, -636,          /* 1357: "Phlp", "Phlp" */
+    675, -668,          /* 1359: "Rjng", "Rejang" */
+    676, -676,          /* 1361: "Roro", "Roro" */
+    679, -678,          /* 1363: "Runr", "Runic" */
+    696, -695,          /* 1365: "Samr", "Samaritan" */
+    697, -697,          /* 1367: "Sara", "Sara" */
+    699, -700,          /* 1369: "Saur", "Saurashtra" */
+    714, -713,          /* 1371: "Shaw", "Shavian" */
+    712, -712,          /* 1373: "Sgnw", "Sgnw" */
+    327, -327,          /* 1375: "Hans", "Hans" */
+    720, -720,          /* 1377: "Sind", "Sind" */
+    721, -722,          /* 1379: "Sinh", "Sinhala" */
+    740, -741,          /* 1381: "Sund", "Sundanese" */
+    753, -754,          /* 1383: "Sylo", "Syloti_Nagri" */
+    871, -871,          /* 1385: "Zsym", "Zsym" */
+    756, -758,          /* 1387: "Syrc", "Syriac" */
+    787, -763,          /* 1389: "Tglg", "Tagalog" */
+    764, -765,          /* 1391: "Tagb", "Tagbanwa" */
+    772, -768,          /* 1393: "Tale", "Tai_Le" */
+    776, -770,          /* 1395: "Tavt", "Tai_Viet" */
+    775, -774,          /* 1397: "Taml", "Tamil" */
+    780, -781,          /* 1399: "Telu", "Telugu" */
+    782, -782,          /* 1401: "Teng", "Teng" */
+    788, -789,          /* 1403: "Thaa", "Thaana" */
+    790, -790,          /* 1405: "Thai", "Thai" */
+    792, -791,          /* 1407: "Tibt", "Tibetan" */
+    786, -793,          /* 1409: "Tfng", "Tifinagh" */
+    328, -328,          /* 1411: "Hant", "Hant" */
+    804, -805,          /* 1413: "Ugar", "Ugaritic" */
+    874, -811,          /* 1415: "Zzzz", "Unknown" */
+    872, -872,          /* 1417: "Zxxx", "Zxxx" */
+    820, -819,          /* 1419: "Vaii", "Vai" */
+    829, -829,          /* 1421: "Visp", "Visp" */
+    836, -836,          /* 1423: "Wara", "Wara" */
+    760, -760,          /* 1425: "Syrj", "Syrj" */
+    857, -854,          /* 1427: "Yiii", "Yi" */
+};
+
+#define MAX_NAMES_PER_GROUP 4
+
+const int32_t VALUES_GCB_COUNT = 12;
+
+const Alias VALUES_GCB[] = {
+    Alias((int32_t) U_GCB_CONTROL, 0),
+    Alias((int32_t) U_GCB_CR, 2),
+    Alias((int32_t) U_GCB_EXTEND, 4),
+    Alias((int32_t) U_GCB_L, 6),
+    Alias((int32_t) U_GCB_LF, 8),
+    Alias((int32_t) U_GCB_LV, 10),
+    Alias((int32_t) U_GCB_LVT, 12),
+    Alias((int32_t) U_GCB_OTHER, 14),
+    Alias((int32_t) U_GCB_PREPEND, 16),
+    Alias((int32_t) U_GCB_SPACING_MARK, 18),
+    Alias((int32_t) U_GCB_T, 20),
+    Alias((int32_t) U_GCB_V, 22),
+};
+
+const int32_t VALUES_NFC_QC_COUNT = 3;
+
+const Alias VALUES_NFC_QC[] = {
+    Alias((int32_t) UNORM_MAYBE, 24),
+    Alias((int32_t) UNORM_NO, 26),
+    Alias((int32_t) UNORM_YES, 28),
+};
+
+const int32_t VALUES_NFD_QC_COUNT = 2;
+
+const Alias VALUES_NFD_QC[] = {
+    Alias((int32_t) UNORM_NO, 26),
+    Alias((int32_t) UNORM_YES, 28),
+};
+
+const int32_t VALUES_NFKC_QC_COUNT = 3;
+
+const Alias VALUES_NFKC_QC[] = {
+    Alias((int32_t) UNORM_MAYBE, 24),
+    Alias((int32_t) UNORM_NO, 26),
+    Alias((int32_t) UNORM_YES, 28),
+};
+
+const int32_t VALUES_NFKD_QC_COUNT = 2;
+
+const Alias VALUES_NFKD_QC[] = {
+    Alias((int32_t) UNORM_NO, 26),
+    Alias((int32_t) UNORM_YES, 28),
+};
+
+const int32_t VALUES_SB_COUNT = 15;
+
+const Alias VALUES_SB[] = {
+    Alias((int32_t) U_SB_ATERM, 30),
+    Alias((int32_t) U_SB_CLOSE, 32),
+    Alias((int32_t) U_SB_CR, 2),
+    Alias((int32_t) U_SB_EXTEND, 4),
+    Alias((int32_t) U_SB_FORMAT, 34),
+    Alias((int32_t) U_SB_LF, 8),
+    Alias((int32_t) U_SB_LOWER, 36),
+    Alias((int32_t) U_SB_NUMERIC, 38),
+    Alias((int32_t) U_SB_OLETTER, 40),
+    Alias((int32_t) U_SB_OTHER, 14),
+    Alias((int32_t) U_SB_SCONTINUE, 42),
+    Alias((int32_t) U_SB_SEP, 44),
+    Alias((int32_t) U_SB_SP, 46),
+    Alias((int32_t) U_SB_STERM, 48),
+    Alias((int32_t) U_SB_UPPER, 50),
+};
+
+const int32_t VALUES_WB_COUNT = 13;
+
+const Alias VALUES_WB[] = {
+    Alias((int32_t) U_WB_ALETTER, 52),
+    Alias((int32_t) U_WB_CR, 2),
+    Alias((int32_t) U_WB_EXTEND, 54),
+    Alias((int32_t) U_WB_EXTENDNUMLET, 56),
+    Alias((int32_t) U_WB_FORMAT, 34),
+    Alias((int32_t) U_WB_KATAKANA, 58),
+    Alias((int32_t) U_WB_LF, 8),
+    Alias((int32_t) U_WB_MIDLETTER, 60),
+    Alias((int32_t) U_WB_MIDNUM, 62),
+    Alias((int32_t) U_WB_MIDNUMLET, 64),
+    Alias((int32_t) U_WB_NEWLINE, 66),
+    Alias((int32_t) U_WB_NUMERIC, 38),
+    Alias((int32_t) U_WB_OTHER, 14),
+};
+
+const int32_t VALUES_bc_COUNT = 19;
+
+const Alias VALUES_bc[] = {
+    Alias((int32_t) U_ARABIC_NUMBER, 258),
+    Alias((int32_t) U_BLOCK_SEPARATOR, 260),
+    Alias((int32_t) U_BOUNDARY_NEUTRAL, 262),
+    Alias((int32_t) U_COMMON_NUMBER_SEPARATOR, 264),
+    Alias((int32_t) U_DIR_NON_SPACING_MARK, 266),
+    Alias((int32_t) U_EUROPEAN_NUMBER, 268),
+    Alias((int32_t) U_EUROPEAN_NUMBER_SEPARATOR, 270),
+    Alias((int32_t) U_EUROPEAN_NUMBER_TERMINATOR, 272),
+    Alias((int32_t) U_LEFT_TO_RIGHT, 274),
+    Alias((int32_t) U_LEFT_TO_RIGHT_EMBEDDING, 276),
+    Alias((int32_t) U_LEFT_TO_RIGHT_OVERRIDE, 278),
+    Alias((int32_t) U_OTHER_NEUTRAL, 280),
+    Alias((int32_t) U_POP_DIRECTIONAL_FORMAT, 282),
+    Alias((int32_t) U_RIGHT_TO_LEFT, 284),
+    Alias((int32_t) U_RIGHT_TO_LEFT_ARABIC, 286),
+    Alias((int32_t) U_RIGHT_TO_LEFT_EMBEDDING, 288),
+    Alias((int32_t) U_RIGHT_TO_LEFT_OVERRIDE, 290),
+    Alias((int32_t) U_SEGMENT_SEPARATOR, 292),
+    Alias((int32_t) U_WHITE_SPACE_NEUTRAL, 294),
+};
+
+const int32_t VALUES_binprop_COUNT = 2;
+
+const Alias VALUES_binprop[] = {
+    Alias((int32_t) 0, 296),
+    Alias((int32_t) 1, 300),
+};
+
+const int32_t VALUES_blk_COUNT = 210;
+
+const Alias VALUES_blk[] = {
+    Alias((int32_t) UBLOCK_AEGEAN_NUMBERS, 304),
+    Alias((int32_t) UBLOCK_ALCHEMICAL_SYMBOLS, 306),
+    Alias((int32_t) UBLOCK_ALPHABETIC_PRESENTATION_FORMS, 308),
+    Alias((int32_t) UBLOCK_ANCIENT_GREEK_MUSICAL_NOTATION, 310),
+    Alias((int32_t) UBLOCK_ANCIENT_GREEK_NUMBERS, 312),
+    Alias((int32_t) UBLOCK_ANCIENT_SYMBOLS, 314),
+    Alias((int32_t) UBLOCK_ARABIC, 316),
+    Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_A, 318),
+    Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_B, 321),
+    Alias((int32_t) UBLOCK_ARABIC_SUPPLEMENT, 323),
+    Alias((int32_t) UBLOCK_ARMENIAN, 325),
+    Alias((int32_t) UBLOCK_ARROWS, 327),
+    Alias((int32_t) UBLOCK_AVESTAN, 329),
+    Alias((int32_t) UBLOCK_BALINESE, 331),
+    Alias((int32_t) UBLOCK_BAMUM, 333),
+    Alias((int32_t) UBLOCK_BAMUM_SUPPLEMENT, 335),
+    Alias((int32_t) UBLOCK_BASIC_LATIN, 337),
+    Alias((int32_t) UBLOCK_BATAK, 340),
+    Alias((int32_t) UBLOCK_BENGALI, 342),
+    Alias((int32_t) UBLOCK_BLOCK_ELEMENTS, 344),
+    Alias((int32_t) UBLOCK_BOPOMOFO, 346),
+    Alias((int32_t) UBLOCK_BOPOMOFO_EXTENDED, 348),
+    Alias((int32_t) UBLOCK_BOX_DRAWING, 350),
+    Alias((int32_t) UBLOCK_BRAHMI, 352),
+    Alias((int32_t) UBLOCK_BRAILLE_PATTERNS, 354),
+    Alias((int32_t) UBLOCK_BUGINESE, 356),
+    Alias((int32_t) UBLOCK_BUHID, 358),
+    Alias((int32_t) UBLOCK_BYZANTINE_MUSICAL_SYMBOLS, 360),
+    Alias((int32_t) UBLOCK_CARIAN, 362),
+    Alias((int32_t) UBLOCK_CHAM, 364),
+    Alias((int32_t) UBLOCK_CHEROKEE, 366),
+    Alias((int32_t) UBLOCK_CJK_COMPATIBILITY, 368),
+    Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_FORMS, 370),
+    Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS, 372),
+    Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, 374),
+    Alias((int32_t) UBLOCK_CJK_RADICALS_SUPPLEMENT, 376),
+    Alias((int32_t) UBLOCK_CJK_STROKES, 378),
+    Alias((int32_t) UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION, 380),
+    Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS, 382),
+    Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, 384),
+    Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, 386),
+    Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C, 388),
+    Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D, 390),
+    Alias((int32_t) UBLOCK_COMBINING_DIACRITICAL_MARKS, 392),
+    Alias((int32_t) UBLOCK_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT, 394),
+    Alias((int32_t) UBLOCK_COMBINING_HALF_MARKS, 396),
+    Alias((int32_t) UBLOCK_COMBINING_MARKS_FOR_SYMBOLS, 398),
+    Alias((int32_t) UBLOCK_COMMON_INDIC_NUMBER_FORMS, 401),
+    Alias((int32_t) UBLOCK_CONTROL_PICTURES, 403),
+    Alias((int32_t) UBLOCK_COPTIC, 405),
+    Alias((int32_t) UBLOCK_COUNTING_ROD_NUMERALS, 407),
+    Alias((int32_t) UBLOCK_CUNEIFORM, 409),
+    Alias((int32_t) UBLOCK_CUNEIFORM_NUMBERS_AND_PUNCTUATION, 411),
+    Alias((int32_t) UBLOCK_CURRENCY_SYMBOLS, 413),
+    Alias((int32_t) UBLOCK_CYPRIOT_SYLLABARY, 415),
+    Alias((int32_t) UBLOCK_CYRILLIC, 417),
+    Alias((int32_t) UBLOCK_CYRILLIC_EXTENDED_A, 419),
+    Alias((int32_t) UBLOCK_CYRILLIC_EXTENDED_B, 421),
+    Alias((int32_t) UBLOCK_CYRILLIC_SUPPLEMENT, 423),
+    Alias((int32_t) UBLOCK_DESERET, 426),
+    Alias((int32_t) UBLOCK_DEVANAGARI, 428),
+    Alias((int32_t) UBLOCK_DEVANAGARI_EXTENDED, 430),
+    Alias((int32_t) UBLOCK_DINGBATS, 432),
+    Alias((int32_t) UBLOCK_DOMINO_TILES, 434),
+    Alias((int32_t) UBLOCK_EGYPTIAN_HIEROGLYPHS, 436),
+    Alias((int32_t) UBLOCK_EMOTICONS, 438),
+    Alias((int32_t) UBLOCK_ENCLOSED_ALPHANUMERICS, 440),
+    Alias((int32_t) UBLOCK_ENCLOSED_ALPHANUMERIC_SUPPLEMENT, 442),
+    Alias((int32_t) UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS, 444),
+    Alias((int32_t) UBLOCK_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT, 446),
+    Alias((int32_t) UBLOCK_ETHIOPIC, 448),
+    Alias((int32_t) UBLOCK_ETHIOPIC_EXTENDED, 450),
+    Alias((int32_t) UBLOCK_ETHIOPIC_EXTENDED_A, 452),
+    Alias((int32_t) UBLOCK_ETHIOPIC_SUPPLEMENT, 454),
+    Alias((int32_t) UBLOCK_GENERAL_PUNCTUATION, 456),
+    Alias((int32_t) UBLOCK_GEOMETRIC_SHAPES, 458),
+    Alias((int32_t) UBLOCK_GEORGIAN, 460),
+    Alias((int32_t) UBLOCK_GEORGIAN_SUPPLEMENT, 462),
+    Alias((int32_t) UBLOCK_GLAGOLITIC, 464),
+    Alias((int32_t) UBLOCK_GOTHIC, 466),
+    Alias((int32_t) UBLOCK_GREEK, 468),
+    Alias((int32_t) UBLOCK_GREEK_EXTENDED, 471),
+    Alias((int32_t) UBLOCK_GUJARATI, 473),
+    Alias((int32_t) UBLOCK_GURMUKHI, 475),
+    Alias((int32_t) UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS, 477),
+    Alias((int32_t) UBLOCK_HANGUL_COMPATIBILITY_JAMO, 479),
+    Alias((int32_t) UBLOCK_HANGUL_JAMO, 481),
+    Alias((int32_t) UBLOCK_HANGUL_JAMO_EXTENDED_A, 483),
+    Alias((int32_t) UBLOCK_HANGUL_JAMO_EXTENDED_B, 485),
+    Alias((int32_t) UBLOCK_HANGUL_SYLLABLES, 487),
+    Alias((int32_t) UBLOCK_HANUNOO, 489),
+    Alias((int32_t) UBLOCK_HEBREW, 491),
+    Alias((int32_t) UBLOCK_HIGH_PRIVATE_USE_SURROGATES, 493),
+    Alias((int32_t) UBLOCK_HIGH_SURROGATES, 495),
+    Alias((int32_t) UBLOCK_HIRAGANA, 497),
+    Alias((int32_t) UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS, 499),
+    Alias((int32_t) UBLOCK_IMPERIAL_ARAMAIC, 501),
+    Alias((int32_t) UBLOCK_INSCRIPTIONAL_PAHLAVI, 503),
+    Alias((int32_t) UBLOCK_INSCRIPTIONAL_PARTHIAN, 505),
+    Alias((int32_t) UBLOCK_IPA_EXTENSIONS, 507),
+    Alias((int32_t) UBLOCK_JAVANESE, 509),
+    Alias((int32_t) UBLOCK_KAITHI, 511),
+    Alias((int32_t) UBLOCK_KANA_SUPPLEMENT, 513),
+    Alias((int32_t) UBLOCK_KANBUN, 515),
+    Alias((int32_t) UBLOCK_KANGXI_RADICALS, 517),
+    Alias((int32_t) UBLOCK_KANNADA, 519),
+    Alias((int32_t) UBLOCK_KATAKANA, 521),
+    Alias((int32_t) UBLOCK_KATAKANA_PHONETIC_EXTENSIONS, 523),
+    Alias((int32_t) UBLOCK_KAYAH_LI, 525),
+    Alias((int32_t) UBLOCK_KHAROSHTHI, 527),
+    Alias((int32_t) UBLOCK_KHMER, 529),
+    Alias((int32_t) UBLOCK_KHMER_SYMBOLS, 531),
+    Alias((int32_t) UBLOCK_LAO, 533),
+    Alias((int32_t) UBLOCK_LATIN_1_SUPPLEMENT, 535),
+    Alias((int32_t) UBLOCK_LATIN_EXTENDED_A, 538),
+    Alias((int32_t) UBLOCK_LATIN_EXTENDED_ADDITIONAL, 540),
+    Alias((int32_t) UBLOCK_LATIN_EXTENDED_B, 542),
+    Alias((int32_t) UBLOCK_LATIN_EXTENDED_C, 544),
+    Alias((int32_t) UBLOCK_LATIN_EXTENDED_D, 546),
+    Alias((int32_t) UBLOCK_LEPCHA, 548),
+    Alias((int32_t) UBLOCK_LETTERLIKE_SYMBOLS, 550),
+    Alias((int32_t) UBLOCK_LIMBU, 552),
+    Alias((int32_t) UBLOCK_LINEAR_B_IDEOGRAMS, 554),
+    Alias((int32_t) UBLOCK_LINEAR_B_SYLLABARY, 556),
+    Alias((int32_t) UBLOCK_LISU, 558),
+    Alias((int32_t) UBLOCK_LOW_SURROGATES, 560),
+    Alias((int32_t) UBLOCK_LYCIAN, 562),
+    Alias((int32_t) UBLOCK_LYDIAN, 564),
+    Alias((int32_t) UBLOCK_MAHJONG_TILES, 566),
+    Alias((int32_t) UBLOCK_MALAYALAM, 568),
+    Alias((int32_t) UBLOCK_MANDAIC, 570),
+    Alias((int32_t) UBLOCK_MATHEMATICAL_ALPHANUMERIC_SYMBOLS, 572),
+    Alias((int32_t) UBLOCK_MATHEMATICAL_OPERATORS, 574),
+    Alias((int32_t) UBLOCK_MEETEI_MAYEK, 576),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A, 578),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, 580),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS, 582),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS, 584),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS, 586),
+    Alias((int32_t) UBLOCK_MISCELLANEOUS_TECHNICAL, 588),
+    Alias((int32_t) UBLOCK_MODIFIER_TONE_LETTERS, 590),
+    Alias((int32_t) UBLOCK_MONGOLIAN, 592),
+    Alias((int32_t) UBLOCK_MUSICAL_SYMBOLS, 594),
+    Alias((int32_t) UBLOCK_MYANMAR, 596),
+    Alias((int32_t) UBLOCK_MYANMAR_EXTENDED_A, 598),
+    Alias((int32_t) UBLOCK_NEW_TAI_LUE, 600),
+    Alias((int32_t) UBLOCK_NKO, 602),
+    Alias((int32_t) UBLOCK_NO_BLOCK, 604),
+    Alias((int32_t) UBLOCK_NUMBER_FORMS, 606),
+    Alias((int32_t) UBLOCK_OGHAM, 608),
+    Alias((int32_t) UBLOCK_OLD_ITALIC, 610),
+    Alias((int32_t) UBLOCK_OLD_PERSIAN, 612),
+    Alias((int32_t) UBLOCK_OLD_SOUTH_ARABIAN, 614),
+    Alias((int32_t) UBLOCK_OLD_TURKIC, 616),
+    Alias((int32_t) UBLOCK_OL_CHIKI, 618),
+    Alias((int32_t) UBLOCK_OPTICAL_CHARACTER_RECOGNITION, 620),
+    Alias((int32_t) UBLOCK_ORIYA, 622),
+    Alias((int32_t) UBLOCK_OSMANYA, 624),
+    Alias((int32_t) UBLOCK_PHAGS_PA, 626),
+    Alias((int32_t) UBLOCK_PHAISTOS_DISC, 628),
+    Alias((int32_t) UBLOCK_PHOENICIAN, 630),
+    Alias((int32_t) UBLOCK_PHONETIC_EXTENSIONS, 632),
+    Alias((int32_t) UBLOCK_PHONETIC_EXTENSIONS_SUPPLEMENT, 634),
+    Alias((int32_t) UBLOCK_PLAYING_CARDS, 636),
+    Alias((int32_t) UBLOCK_PRIVATE_USE_AREA, 638),
+    Alias((int32_t) UBLOCK_REJANG, 641),
+    Alias((int32_t) UBLOCK_RUMI_NUMERAL_SYMBOLS, 643),
+    Alias((int32_t) UBLOCK_RUNIC, 645),
+    Alias((int32_t) UBLOCK_SAMARITAN, 647),
+    Alias((int32_t) UBLOCK_SAURASHTRA, 649),
+    Alias((int32_t) UBLOCK_SHAVIAN, 651),
+    Alias((int32_t) UBLOCK_SINHALA, 653),
+    Alias((int32_t) UBLOCK_SMALL_FORM_VARIANTS, 655),
+    Alias((int32_t) UBLOCK_SPACING_MODIFIER_LETTERS, 657),
+    Alias((int32_t) UBLOCK_SPECIALS, 659),
+    Alias((int32_t) UBLOCK_SUNDANESE, 661),
+    Alias((int32_t) UBLOCK_SUPERSCRIPTS_AND_SUBSCRIPTS, 663),
+    Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_A, 665),
+    Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_B, 667),
+    Alias((int32_t) UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS, 669),
+    Alias((int32_t) UBLOCK_SUPPLEMENTAL_PUNCTUATION, 671),
+    Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A, 673),
+    Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B, 675),
+    Alias((int32_t) UBLOCK_SYLOTI_NAGRI, 677),
+    Alias((int32_t) UBLOCK_SYRIAC, 679),
+    Alias((int32_t) UBLOCK_TAGALOG, 681),
+    Alias((int32_t) UBLOCK_TAGBANWA, 683),
+    Alias((int32_t) UBLOCK_TAGS, 685),
+    Alias((int32_t) UBLOCK_TAI_LE, 687),
+    Alias((int32_t) UBLOCK_TAI_THAM, 689),
+    Alias((int32_t) UBLOCK_TAI_VIET, 691),
+    Alias((int32_t) UBLOCK_TAI_XUAN_JING_SYMBOLS, 693),
+    Alias((int32_t) UBLOCK_TAMIL, 695),
+    Alias((int32_t) UBLOCK_TELUGU, 697),
+    Alias((int32_t) UBLOCK_THAANA, 699),
+    Alias((int32_t) UBLOCK_THAI, 701),
+    Alias((int32_t) UBLOCK_TIBETAN, 703),
+    Alias((int32_t) UBLOCK_TIFINAGH, 705),
+    Alias((int32_t) UBLOCK_TRANSPORT_AND_MAP_SYMBOLS, 707),
+    Alias((int32_t) UBLOCK_UGARITIC, 709),
+    Alias((int32_t) UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, 711),
+    Alias((int32_t) UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED, 714),
+    Alias((int32_t) UBLOCK_VAI, 716),
+    Alias((int32_t) UBLOCK_VARIATION_SELECTORS, 718),
+    Alias((int32_t) UBLOCK_VARIATION_SELECTORS_SUPPLEMENT, 720),
+    Alias((int32_t) UBLOCK_VEDIC_EXTENSIONS, 722),
+    Alias((int32_t) UBLOCK_VERTICAL_FORMS, 724),
+    Alias((int32_t) UBLOCK_YIJING_HEXAGRAM_SYMBOLS, 726),
+    Alias((int32_t) UBLOCK_YI_RADICALS, 728),
+    Alias((int32_t) UBLOCK_YI_SYLLABLES, 730),
+};
+
+const int32_t VALUES_ccc_COUNT = 20;
+
+const Alias VALUES_ccc[] = {
+    Alias((int32_t) 0, 732),
+    Alias((int32_t) 1, 734),
+    Alias((int32_t) 200, 736),
+    Alias((int32_t) 202, 738),
+    Alias((int32_t) 214, 740),
+    Alias((int32_t) 216, 742),
+    Alias((int32_t) 218, 744),
+    Alias((int32_t) 220, 746),
+    Alias((int32_t) 222, 748),
+    Alias((int32_t) 224, 750),
+    Alias((int32_t) 226, 752),
+    Alias((int32_t) 228, 754),
+    Alias((int32_t) 230, 756),
+    Alias((int32_t) 232, 758),
+    Alias((int32_t) 233, 760),
+    Alias((int32_t) 234, 762),
+    Alias((int32_t) 240, 764),
+    Alias((int32_t) 7, 766),
+    Alias((int32_t) 8, 768),
+    Alias((int32_t) 9, 770),
+};
+
+const int32_t VALUES_dt_COUNT = 18;
+
+const Alias VALUES_dt[] = {
+    Alias((int32_t) U_DT_CANONICAL, 772),
+    Alias((int32_t) U_DT_CIRCLE, 775),
+    Alias((int32_t) U_DT_COMPAT, 778),
+    Alias((int32_t) U_DT_FINAL, 781),
+    Alias((int32_t) U_DT_FONT, 784),
+    Alias((int32_t) U_DT_FRACTION, 786),
+    Alias((int32_t) U_DT_INITIAL, 789),
+    Alias((int32_t) U_DT_ISOLATED, 792),
+    Alias((int32_t) U_DT_MEDIAL, 795),
+    Alias((int32_t) U_DT_NARROW, 798),
+    Alias((int32_t) U_DT_NOBREAK, 801),
+    Alias((int32_t) U_DT_NONE, 804),
+    Alias((int32_t) U_DT_SMALL, 806),
+    Alias((int32_t) U_DT_SQUARE, 809),
+    Alias((int32_t) U_DT_SUB, 812),
+    Alias((int32_t) U_DT_SUPER, 814),
+    Alias((int32_t) U_DT_VERTICAL, 817),
+    Alias((int32_t) U_DT_WIDE, 820),
+};
+
+const int32_t VALUES_ea_COUNT = 6;
+
+const Alias VALUES_ea[] = {
+    Alias((int32_t) U_EA_AMBIGUOUS, 822),
+    Alias((int32_t) U_EA_FULLWIDTH, 824),
+    Alias((int32_t) U_EA_HALFWIDTH, 826),
+    Alias((int32_t) U_EA_NARROW, 828),
+    Alias((int32_t) U_EA_NEUTRAL, 830),
+    Alias((int32_t) U_EA_WIDE, 832),
+};
+
+const int32_t VALUES_gc_COUNT = 30;
+
+const Alias VALUES_gc[] = {
+    Alias((int32_t) U_COMBINING_SPACING_MARK, 834),
+    Alias((int32_t) U_CONNECTOR_PUNCTUATION, 836),
+    Alias((int32_t) U_CONTROL_CHAR, 838),
+    Alias((int32_t) U_CURRENCY_SYMBOL, 841),
+    Alias((int32_t) U_DASH_PUNCTUATION, 843),
+    Alias((int32_t) U_DECIMAL_DIGIT_NUMBER, 845),
+    Alias((int32_t) U_ENCLOSING_MARK, 848),
+    Alias((int32_t) U_END_PUNCTUATION, 850),
+    Alias((int32_t) U_FINAL_PUNCTUATION, 852),
+    Alias((int32_t) U_FORMAT_CHAR, 854),
+    Alias((int32_t) U_GENERAL_OTHER_TYPES, 856),
+    Alias((int32_t) U_INITIAL_PUNCTUATION, 858),
+    Alias((int32_t) U_LETTER_NUMBER, 860),
+    Alias((int32_t) U_LINE_SEPARATOR, 862),
+    Alias((int32_t) U_LOWERCASE_LETTER, 864),
+    Alias((int32_t) U_MATH_SYMBOL, 866),
+    Alias((int32_t) U_MODIFIER_LETTER, 868),
+    Alias((int32_t) U_MODIFIER_SYMBOL, 870),
+    Alias((int32_t) U_NON_SPACING_MARK, 872),
+    Alias((int32_t) U_OTHER_LETTER, 874),
+    Alias((int32_t) U_OTHER_NUMBER, 876),
+    Alias((int32_t) U_OTHER_PUNCTUATION, 878),
+    Alias((int32_t) U_OTHER_SYMBOL, 880),
+    Alias((int32_t) U_PARAGRAPH_SEPARATOR, 882),
+    Alias((int32_t) U_PRIVATE_USE_CHAR, 884),
+    Alias((int32_t) U_SPACE_SEPARATOR, 886),
+    Alias((int32_t) U_START_PUNCTUATION, 888),
+    Alias((int32_t) U_SURROGATE, 890),
+    Alias((int32_t) U_TITLECASE_LETTER, 892),
+    Alias((int32_t) U_UPPERCASE_LETTER, 894),
+};
+
+const int32_t VALUES_gcm_COUNT = 38;
+
+const Alias VALUES_gcm[] = {
+    Alias((int32_t) U_GC_CC_MASK, 838),
+    Alias((int32_t) U_GC_CF_MASK, 854),
+    Alias((int32_t) U_GC_CN_MASK, 856),
+    Alias((int32_t) U_GC_CO_MASK, 884),
+    Alias((int32_t) U_GC_CS_MASK, 890),
+    Alias((int32_t) U_GC_C_MASK, 896),
+    Alias((int32_t) U_GC_LC_MASK, 898),
+    Alias((int32_t) U_GC_LL_MASK, 864),
+    Alias((int32_t) U_GC_LM_MASK, 868),
+    Alias((int32_t) U_GC_LO_MASK, 874),
+    Alias((int32_t) U_GC_LT_MASK, 892),
+    Alias((int32_t) U_GC_LU_MASK, 894),
+    Alias((int32_t) U_GC_L_MASK, 900),
+    Alias((int32_t) U_GC_MC_MASK, 834),
+    Alias((int32_t) U_GC_ME_MASK, 848),
+    Alias((int32_t) U_GC_MN_MASK, 872),
+    Alias((int32_t) U_GC_M_MASK, 902),
+    Alias((int32_t) U_GC_ND_MASK, 845),
+    Alias((int32_t) U_GC_NL_MASK, 860),
+    Alias((int32_t) U_GC_NO_MASK, 876),
+    Alias((int32_t) U_GC_N_MASK, 904),
+    Alias((int32_t) U_GC_PC_MASK, 836),
+    Alias((int32_t) U_GC_PD_MASK, 843),
+    Alias((int32_t) U_GC_PE_MASK, 850),
+    Alias((int32_t) U_GC_PF_MASK, 852),
+    Alias((int32_t) U_GC_PI_MASK, 858),
+    Alias((int32_t) U_GC_PO_MASK, 878),
+    Alias((int32_t) U_GC_PS_MASK, 888),
+    Alias((int32_t) U_GC_P_MASK, 906),
+    Alias((int32_t) U_GC_SC_MASK, 841),
+    Alias((int32_t) U_GC_SK_MASK, 870),
+    Alias((int32_t) U_GC_SM_MASK, 866),
+    Alias((int32_t) U_GC_SO_MASK, 880),
+    Alias((int32_t) U_GC_S_MASK, 909),
+    Alias((int32_t) U_GC_ZL_MASK, 862),
+    Alias((int32_t) U_GC_ZP_MASK, 882),
+    Alias((int32_t) U_GC_ZS_MASK, 886),
+    Alias((int32_t) U_GC_Z_MASK, 911),
+};
+
+const int32_t VALUES_hst_COUNT = 6;
+
+const Alias VALUES_hst[] = {
+    Alias((int32_t) U_HST_LEADING_JAMO, 913),
+    Alias((int32_t) U_HST_LVT_SYLLABLE, 915),
+    Alias((int32_t) U_HST_LV_SYLLABLE, 917),
+    Alias((int32_t) U_HST_NOT_APPLICABLE, 919),
+    Alias((int32_t) U_HST_TRAILING_JAMO, 921),
+    Alias((int32_t) U_HST_VOWEL_JAMO, 923),
+};
+
+const int32_t VALUES_jg_COUNT = 57;
+
+const Alias VALUES_jg[] = {
+    Alias((int32_t) U_JG_AIN, 925),
+    Alias((int32_t) U_JG_ALAPH, 927),
+    Alias((int32_t) U_JG_ALEF, 929),
+    Alias((int32_t) U_JG_BEH, 931),
+    Alias((int32_t) U_JG_BETH, 933),
+    Alias((int32_t) U_JG_BURUSHASKI_YEH_BARREE, 935),
+    Alias((int32_t) U_JG_DAL, 937),
+    Alias((int32_t) U_JG_DALATH_RISH, 939),
+    Alias((int32_t) U_JG_E, 941),
+    Alias((int32_t) U_JG_FARSI_YEH, 943),
+    Alias((int32_t) U_JG_FE, 945),
+    Alias((int32_t) U_JG_FEH, 947),
+    Alias((int32_t) U_JG_FINAL_SEMKATH, 949),
+    Alias((int32_t) U_JG_GAF, 951),
+    Alias((int32_t) U_JG_GAMAL, 953),
+    Alias((int32_t) U_JG_HAH, 955),
+    Alias((int32_t) U_JG_HE, 957),
+    Alias((int32_t) U_JG_HEH, 959),
+    Alias((int32_t) U_JG_HEH_GOAL, 961),
+    Alias((int32_t) U_JG_HETH, 963),
+    Alias((int32_t) U_JG_KAF, 965),
+    Alias((int32_t) U_JG_KAPH, 967),
+    Alias((int32_t) U_JG_KHAPH, 969),
+    Alias((int32_t) U_JG_KNOTTED_HEH, 971),
+    Alias((int32_t) U_JG_LAM, 973),
+    Alias((int32_t) U_JG_LAMADH, 975),
+    Alias((int32_t) U_JG_MEEM, 977),
+    Alias((int32_t) U_JG_MIM, 979),
+    Alias((int32_t) U_JG_NOON, 981),
+    Alias((int32_t) U_JG_NO_JOINING_GROUP, 983),
+    Alias((int32_t) U_JG_NUN, 985),
+    Alias((int32_t) U_JG_NYA, 987),
+    Alias((int32_t) U_JG_PE, 989),
+    Alias((int32_t) U_JG_QAF, 991),
+    Alias((int32_t) U_JG_QAPH, 993),
+    Alias((int32_t) U_JG_REH, 995),
+    Alias((int32_t) U_JG_REVERSED_PE, 997),
+    Alias((int32_t) U_JG_SAD, 999),
+    Alias((int32_t) U_JG_SADHE, 1001),
+    Alias((int32_t) U_JG_SEEN, 1003),
+    Alias((int32_t) U_JG_SEMKATH, 1005),
+    Alias((int32_t) U_JG_SHIN, 1007),
+    Alias((int32_t) U_JG_SWASH_KAF, 1009),
+    Alias((int32_t) U_JG_SYRIAC_WAW, 1011),
+    Alias((int32_t) U_JG_TAH, 1013),
+    Alias((int32_t) U_JG_TAW, 1015),
+    Alias((int32_t) U_JG_TEH_MARBUTA, 1017),
+    Alias((int32_t) U_JG_TEH_MARBUTA_GOAL, 1019),
+    Alias((int32_t) U_JG_TETH, 1022),
+    Alias((int32_t) U_JG_WAW, 1024),
+    Alias((int32_t) U_JG_YEH, 1026),
+    Alias((int32_t) U_JG_YEH_BARREE, 1028),
+    Alias((int32_t) U_JG_YEH_WITH_TAIL, 1030),
+    Alias((int32_t) U_JG_YUDH, 1032),
+    Alias((int32_t) U_JG_YUDH_HE, 1034),
+    Alias((int32_t) U_JG_ZAIN, 1036),
+    Alias((int32_t) U_JG_ZHAIN, 1038),
+};
+
+const int32_t VALUES_jt_COUNT = 6;
+
+const Alias VALUES_jt[] = {
+    Alias((int32_t) U_JT_DUAL_JOINING, 1040),
+    Alias((int32_t) U_JT_JOIN_CAUSING, 1042),
+    Alias((int32_t) U_JT_LEFT_JOINING, 1044),
+    Alias((int32_t) U_JT_NON_JOINING, 1046),
+    Alias((int32_t) U_JT_RIGHT_JOINING, 1048),
+    Alias((int32_t) U_JT_TRANSPARENT, 1050),
+};
+
+const int32_t VALUES_lb_COUNT = 37;
+
+const Alias VALUES_lb[] = {
+    Alias((int32_t) U_LB_ALPHABETIC, 1052),
+    Alias((int32_t) U_LB_AMBIGUOUS, 1054),
+    Alias((int32_t) U_LB_BREAK_AFTER, 1056),
+    Alias((int32_t) U_LB_BREAK_BEFORE, 1058),
+    Alias((int32_t) U_LB_BREAK_BOTH, 1060),
+    Alias((int32_t) U_LB_BREAK_SYMBOLS, 1062),
+    Alias((int32_t) U_LB_CARRIAGE_RETURN, 1064),
+    Alias((int32_t) U_LB_CLOSE_PARENTHESIS, 1066),
+    Alias((int32_t) U_LB_CLOSE_PUNCTUATION, 1068),
+    Alias((int32_t) U_LB_COMBINING_MARK, 1070),
+    Alias((int32_t) U_LB_COMPLEX_CONTEXT, 1072),
+    Alias((int32_t) U_LB_CONTINGENT_BREAK, 1074),
+    Alias((int32_t) U_LB_EXCLAMATION, 1076),
+    Alias((int32_t) U_LB_GLUE, 1078),
+    Alias((int32_t) U_LB_H2, 1080),
+    Alias((int32_t) U_LB_H3, 1082),
+    Alias((int32_t) U_LB_HYPHEN, 1084),
+    Alias((int32_t) U_LB_IDEOGRAPHIC, 1086),
+    Alias((int32_t) U_LB_INFIX_NUMERIC, 1088),
+    Alias((int32_t) U_LB_INSEPARABLE, 1090),
+    Alias((int32_t) U_LB_JL, 1093),
+    Alias((int32_t) U_LB_JT, 1095),
+    Alias((int32_t) U_LB_JV, 1097),
+    Alias((int32_t) U_LB_LINE_FEED, 1099),
+    Alias((int32_t) U_LB_MANDATORY_BREAK, 1101),
+    Alias((int32_t) U_LB_NEXT_LINE, 1103),
+    Alias((int32_t) U_LB_NONSTARTER, 1105),
+    Alias((int32_t) U_LB_NUMERIC, 38),
+    Alias((int32_t) U_LB_OPEN_PUNCTUATION, 1107),
+    Alias((int32_t) U_LB_POSTFIX_NUMERIC, 1109),
+    Alias((int32_t) U_LB_PREFIX_NUMERIC, 1111),
+    Alias((int32_t) U_LB_QUOTATION, 1113),
+    Alias((int32_t) U_LB_SPACE, 1115),
+    Alias((int32_t) U_LB_SURROGATE, 1117),
+    Alias((int32_t) U_LB_UNKNOWN, 1119),
+    Alias((int32_t) U_LB_WORD_JOINER, 1121),
+    Alias((int32_t) U_LB_ZWSPACE, 1123),
+};
+
+const int32_t VALUES_lccc_COUNT = 20;
+
+const Alias VALUES_lccc[] = {
+    Alias((int32_t) 0, 732),
+    Alias((int32_t) 1, 734),
+    Alias((int32_t) 200, 736),
+    Alias((int32_t) 202, 738),
+    Alias((int32_t) 214, 740),
+    Alias((int32_t) 216, 742),
+    Alias((int32_t) 218, 744),
+    Alias((int32_t) 220, 746),
+    Alias((int32_t) 222, 748),
+    Alias((int32_t) 224, 750),
+    Alias((int32_t) 226, 752),
+    Alias((int32_t) 228, 754),
+    Alias((int32_t) 230, 756),
+    Alias((int32_t) 232, 758),
+    Alias((int32_t) 233, 760),
+    Alias((int32_t) 234, 762),
+    Alias((int32_t) 240, 764),
+    Alias((int32_t) 7, 766),
+    Alias((int32_t) 8, 768),
+    Alias((int32_t) 9, 770),
+};
+
+const int32_t VALUES_nt_COUNT = 4;
+
+const Alias VALUES_nt[] = {
+    Alias((int32_t) U_NT_DECIMAL, 1125),
+    Alias((int32_t) U_NT_DIGIT, 1127),
+    Alias((int32_t) U_NT_NONE, 1129),
+    Alias((int32_t) U_NT_NUMERIC, 1131),
+};
+
+const int32_t VALUES_sc_COUNT = 147;
+
+const Alias VALUES_sc[] = {
+    Alias((int32_t) USCRIPT_ARABIC, 1133),
+    Alias((int32_t) USCRIPT_ARMENIAN, 1135),
+    Alias((int32_t) USCRIPT_AVESTAN, 1137),
+    Alias((int32_t) USCRIPT_BALINESE, 1139),
+    Alias((int32_t) USCRIPT_BAMUM, 1141),
+    Alias((int32_t) USCRIPT_BASSA_VAH, 1143),
+    Alias((int32_t) USCRIPT_BATAK, 1145),
+    Alias((int32_t) USCRIPT_BENGALI, 1147),
+    Alias((int32_t) USCRIPT_BLISSYMBOLS, 1149),
+    Alias((int32_t) USCRIPT_BOOK_PAHLAVI, 1151),
+    Alias((int32_t) USCRIPT_BOPOMOFO, 1153),
+    Alias((int32_t) USCRIPT_BRAHMI, 1155),
+    Alias((int32_t) USCRIPT_BRAILLE, 1157),
+    Alias((int32_t) USCRIPT_BUGINESE, 1159),
+    Alias((int32_t) USCRIPT_BUHID, 1161),
+    Alias((int32_t) USCRIPT_CANADIAN_ABORIGINAL, 1163),
+    Alias((int32_t) USCRIPT_CARIAN, 1165),
+    Alias((int32_t) USCRIPT_CHAKMA, 1167),
+    Alias((int32_t) USCRIPT_CHAM, 1169),
+    Alias((int32_t) USCRIPT_CHEROKEE, 1171),
+    Alias((int32_t) USCRIPT_CIRTH, 1173),
+    Alias((int32_t) USCRIPT_COMMON, 1175),
+    Alias((int32_t) USCRIPT_COPTIC, 1177),
+    Alias((int32_t) USCRIPT_CUNEIFORM, 1180),
+    Alias((int32_t) USCRIPT_CYPRIOT, 1182),
+    Alias((int32_t) USCRIPT_CYRILLIC, 1184),
+    Alias((int32_t) USCRIPT_DEMOTIC_EGYPTIAN, 1186),
+    Alias((int32_t) USCRIPT_DESERET, 1188),
+    Alias((int32_t) USCRIPT_DEVANAGARI, 1190),
+    Alias((int32_t) USCRIPT_DUPLOYAN_SHORTAND, 1192),
+    Alias((int32_t) USCRIPT_EASTERN_SYRIAC, 1194),
+    Alias((int32_t) USCRIPT_EGYPTIAN_HIEROGLYPHS, 1196),
+    Alias((int32_t) USCRIPT_ELBASAN, 1198),
+    Alias((int32_t) USCRIPT_ESTRANGELO_SYRIAC, 1200),
+    Alias((int32_t) USCRIPT_ETHIOPIC, 1202),
+    Alias((int32_t) USCRIPT_GEORGIAN, 1204),
+    Alias((int32_t) USCRIPT_GLAGOLITIC, 1206),
+    Alias((int32_t) USCRIPT_GOTHIC, 1208),
+    Alias((int32_t) USCRIPT_GRANTHA, 1210),
+    Alias((int32_t) USCRIPT_GREEK, 1212),
+    Alias((int32_t) USCRIPT_GUJARATI, 1214),
+    Alias((int32_t) USCRIPT_GURMUKHI, 1216),
+    Alias((int32_t) USCRIPT_HAN, 1218),
+    Alias((int32_t) USCRIPT_HANGUL, 1220),
+    Alias((int32_t) USCRIPT_HANUNOO, 1222),
+    Alias((int32_t) USCRIPT_HARAPPAN_INDUS, 1224),
+    Alias((int32_t) USCRIPT_HEBREW, 1226),
+    Alias((int32_t) USCRIPT_HIERATIC_EGYPTIAN, 1228),
+    Alias((int32_t) USCRIPT_HIRAGANA, 1230),
+    Alias((int32_t) USCRIPT_IMPERIAL_ARAMAIC, 1232),
+    Alias((int32_t) USCRIPT_INHERITED, 1234),
+    Alias((int32_t) USCRIPT_INSCRIPTIONAL_PAHLAVI, 1237),
+    Alias((int32_t) USCRIPT_INSCRIPTIONAL_PARTHIAN, 1239),
+    Alias((int32_t) USCRIPT_JAPANESE, 1241),
+    Alias((int32_t) USCRIPT_JAVANESE, 1243),
+    Alias((int32_t) USCRIPT_KAITHI, 1245),
+    Alias((int32_t) USCRIPT_KANNADA, 1247),
+    Alias((int32_t) USCRIPT_KATAKANA, 1249),
+    Alias((int32_t) USCRIPT_KATAKANA_OR_HIRAGANA, 1251),
+    Alias((int32_t) USCRIPT_KAYAH_LI, 1253),
+    Alias((int32_t) USCRIPT_KHAROSHTHI, 1255),
+    Alias((int32_t) USCRIPT_KHMER, 1257),
+    Alias((int32_t) USCRIPT_KHUTSURI, 1259),
+    Alias((int32_t) USCRIPT_KOREAN, 1261),
+    Alias((int32_t) USCRIPT_KPELLE, 1263),
+    Alias((int32_t) USCRIPT_LANNA, 1265),
+    Alias((int32_t) USCRIPT_LAO, 1267),
+    Alias((int32_t) USCRIPT_LATIN, 1269),
+    Alias((int32_t) USCRIPT_LATIN_FRAKTUR, 1271),
+    Alias((int32_t) USCRIPT_LATIN_GAELIC, 1273),
+    Alias((int32_t) USCRIPT_LEPCHA, 1275),
+    Alias((int32_t) USCRIPT_LIMBU, 1277),
+    Alias((int32_t) USCRIPT_LINEAR_A, 1279),
+    Alias((int32_t) USCRIPT_LINEAR_B, 1281),
+    Alias((int32_t) USCRIPT_LISU, 1283),
+    Alias((int32_t) USCRIPT_LOMA, 1285),
+    Alias((int32_t) USCRIPT_LYCIAN, 1287),
+    Alias((int32_t) USCRIPT_LYDIAN, 1289),
+    Alias((int32_t) USCRIPT_MALAYALAM, 1291),
+    Alias((int32_t) USCRIPT_MANDAIC, 1293),
+    Alias((int32_t) USCRIPT_MANICHAEAN, 1295),
+    Alias((int32_t) USCRIPT_MATHEMATICAL_NOTATION, 1297),
+    Alias((int32_t) USCRIPT_MAYAN_HIEROGLYPHS, 1299),
+    Alias((int32_t) USCRIPT_MEITEI_MAYEK, 1301),
+    Alias((int32_t) USCRIPT_MENDE, 1303),
+    Alias((int32_t) USCRIPT_MEROITIC_CURSIVE, 1305),
+    Alias((int32_t) USCRIPT_MEROITIC_HIEROGLYPHS, 1307),
+    Alias((int32_t) USCRIPT_MONGOLIAN, 1309),
+    Alias((int32_t) USCRIPT_MOON, 1311),
+    Alias((int32_t) USCRIPT_MYANMAR, 1313),
+    Alias((int32_t) USCRIPT_NABATAEAN, 1315),
+    Alias((int32_t) USCRIPT_NAKHI_GEBA, 1317),
+    Alias((int32_t) USCRIPT_NEW_TAI_LUE, 1319),
+    Alias((int32_t) USCRIPT_NKO, 1321),
+    Alias((int32_t) USCRIPT_OGHAM, 1323),
+    Alias((int32_t) USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC, 1325),
+    Alias((int32_t) USCRIPT_OLD_HUNGARIAN, 1327),
+    Alias((int32_t) USCRIPT_OLD_ITALIC, 1329),
+    Alias((int32_t) USCRIPT_OLD_NORTH_ARABIAN, 1331),
+    Alias((int32_t) USCRIPT_OLD_PERMIC, 1333),
+    Alias((int32_t) USCRIPT_OLD_PERSIAN, 1335),
+    Alias((int32_t) USCRIPT_OLD_SOUTH_ARABIAN, 1337),
+    Alias((int32_t) USCRIPT_OL_CHIKI, 1339),
+    Alias((int32_t) USCRIPT_ORIYA, 1341),
+    Alias((int32_t) USCRIPT_ORKHON, 1343),
+    Alias((int32_t) USCRIPT_OSMANYA, 1345),
+    Alias((int32_t) USCRIPT_PAHAWH_HMONG, 1347),
+    Alias((int32_t) USCRIPT_PALMYRENE, 1349),
+    Alias((int32_t) USCRIPT_PHAGS_PA, 1351),
+    Alias((int32_t) USCRIPT_PHOENICIAN, 1353),
+    Alias((int32_t) USCRIPT_PHONETIC_POLLARD, 1355),
+    Alias((int32_t) USCRIPT_PSALTER_PAHLAVI, 1357),
+    Alias((int32_t) USCRIPT_REJANG, 1359),
+    Alias((int32_t) USCRIPT_RONGORONGO, 1361),
+    Alias((int32_t) USCRIPT_RUNIC, 1363),
+    Alias((int32_t) USCRIPT_SAMARITAN, 1365),
+    Alias((int32_t) USCRIPT_SARATI, 1367),
+    Alias((int32_t) USCRIPT_SAURASHTRA, 1369),
+    Alias((int32_t) USCRIPT_SHAVIAN, 1371),
+    Alias((int32_t) USCRIPT_SIGN_WRITING, 1373),
+    Alias((int32_t) USCRIPT_SIMPLIFIED_HAN, 1375),
+    Alias((int32_t) USCRIPT_SINDHI, 1377),
+    Alias((int32_t) USCRIPT_SINHALA, 1379),
+    Alias((int32_t) USCRIPT_SUNDANESE, 1381),
+    Alias((int32_t) USCRIPT_SYLOTI_NAGRI, 1383),
+    Alias((int32_t) USCRIPT_SYMBOLS, 1385),
+    Alias((int32_t) USCRIPT_SYRIAC, 1387),
+    Alias((int32_t) USCRIPT_TAGALOG, 1389),
+    Alias((int32_t) USCRIPT_TAGBANWA, 1391),
+    Alias((int32_t) USCRIPT_TAI_LE, 1393),
+    Alias((int32_t) USCRIPT_TAI_VIET, 1395),
+    Alias((int32_t) USCRIPT_TAMIL, 1397),
+    Alias((int32_t) USCRIPT_TELUGU, 1399),
+    Alias((int32_t) USCRIPT_TENGWAR, 1401),
+    Alias((int32_t) USCRIPT_THAANA, 1403),
+    Alias((int32_t) USCRIPT_THAI, 1405),
+    Alias((int32_t) USCRIPT_TIBETAN, 1407),
+    Alias((int32_t) USCRIPT_TIFINAGH, 1409),
+    Alias((int32_t) USCRIPT_TRADITIONAL_HAN, 1411),
+    Alias((int32_t) USCRIPT_UGARITIC, 1413),
+    Alias((int32_t) USCRIPT_UNKNOWN, 1415),
+    Alias((int32_t) USCRIPT_UNWRITTEN_LANGUAGES, 1417),
+    Alias((int32_t) USCRIPT_VAI, 1419),
+    Alias((int32_t) USCRIPT_VISIBLE_SPEECH, 1421),
+    Alias((int32_t) USCRIPT_WARANG_CITI, 1423),
+    Alias((int32_t) USCRIPT_WESTERN_SYRIAC, 1425),
+    Alias((int32_t) USCRIPT_YI, 1427),
+};
+
+const int32_t VALUES_tccc_COUNT = 20;
+
+const Alias VALUES_tccc[] = {
+    Alias((int32_t) 0, 732),
+    Alias((int32_t) 1, 734),
+    Alias((int32_t) 200, 736),
+    Alias((int32_t) 202, 738),
+    Alias((int32_t) 214, 740),
+    Alias((int32_t) 216, 742),
+    Alias((int32_t) 218, 744),
+    Alias((int32_t) 220, 746),
+    Alias((int32_t) 222, 748),
+    Alias((int32_t) 224, 750),
+    Alias((int32_t) 226, 752),
+    Alias((int32_t) 228, 754),
+    Alias((int32_t) 230, 756),
+    Alias((int32_t) 232, 758),
+    Alias((int32_t) 233, 760),
+    Alias((int32_t) 234, 762),
+    Alias((int32_t) 240, 764),
+    Alias((int32_t) 7, 766),
+    Alias((int32_t) 8, 768),
+    Alias((int32_t) 9, 770),
+};
+
+const int32_t PROPERTY_COUNT = 94;
+
+const Property PROPERTY[] = {
+    Property((int32_t) UCHAR_ALPHABETIC, 68, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_ASCII_HEX_DIGIT, 70, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_BIDI_CONTROL, 72, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_BIDI_MIRRORED, 74, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CASED, 76, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CASE_IGNORABLE, 78, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CASE_SENSITIVE, 80, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_CASEFOLDED, 82, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_CASEMAPPED, 84, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_LOWERCASED, 86, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED, 88, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_TITLECASED, 90, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_CHANGES_WHEN_UPPERCASED, 92, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_DASH, 94, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_DEFAULT_IGNORABLE_CODE_POINT, 96, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_DEPRECATED, 98, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_DIACRITIC, 100, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_EXTENDER, 102, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_FULL_COMPOSITION_EXCLUSION, 104, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_GRAPHEME_BASE, 106, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_GRAPHEME_EXTEND, 108, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_GRAPHEME_LINK, 110, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_HEX_DIGIT, 112, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_HYPHEN, 114, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_IDEOGRAPHIC, 116, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_IDS_BINARY_OPERATOR, 118, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_IDS_TRINARY_OPERATOR, 120, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_ID_CONTINUE, 122, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_ID_START, 124, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_JOIN_CONTROL, 126, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_LOGICAL_ORDER_EXCEPTION, 128, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_LOWERCASE, 130, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_MATH, 132, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_NFC_INERT, 134, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_NFD_INERT, 136, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_NFKC_INERT, 138, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_NFKD_INERT, 140, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_NONCHARACTER_CODE_POINT, 142, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_PATTERN_SYNTAX, 144, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_PATTERN_WHITE_SPACE, 146, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_POSIX_ALNUM, 148, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_POSIX_BLANK, 150, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_POSIX_GRAPH, 152, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_POSIX_PRINT, 154, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_POSIX_XDIGIT, 156, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_QUOTATION_MARK, 158, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_RADICAL, 160, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_SEGMENT_STARTER, 162, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_SOFT_DOTTED, 164, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_S_TERM, 166, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_TERMINAL_PUNCTUATION, 168, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_UNIFIED_IDEOGRAPH, 170, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_UPPERCASE, 172, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_VARIATION_SELECTOR, 174, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_WHITE_SPACE, 176, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_XID_CONTINUE, 179, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_XID_START, 181, VALUES_binprop_COUNT, VALUES_binprop),
+    Property((int32_t) UCHAR_BIDI_CLASS, 185, VALUES_bc_COUNT, VALUES_bc),
+    Property((int32_t) UCHAR_BLOCK, 187, VALUES_blk_COUNT, VALUES_blk),
+    Property((int32_t) UCHAR_CANONICAL_COMBINING_CLASS, 189, VALUES_ccc_COUNT, VALUES_ccc),
+    Property((int32_t) UCHAR_DECOMPOSITION_TYPE, 191, VALUES_dt_COUNT, VALUES_dt),
+    Property((int32_t) UCHAR_EAST_ASIAN_WIDTH, 193, VALUES_ea_COUNT, VALUES_ea),
+    Property((int32_t) UCHAR_GENERAL_CATEGORY, 195, VALUES_gc_COUNT, VALUES_gc),
+    Property((int32_t) UCHAR_GRAPHEME_CLUSTER_BREAK, 197, VALUES_GCB_COUNT, VALUES_GCB),
+    Property((int32_t) UCHAR_HANGUL_SYLLABLE_TYPE, 199, VALUES_hst_COUNT, VALUES_hst),
+    Property((int32_t) UCHAR_JOINING_GROUP, 201, VALUES_jg_COUNT, VALUES_jg),
+    Property((int32_t) UCHAR_JOINING_TYPE, 203, VALUES_jt_COUNT, VALUES_jt),
+    Property((int32_t) UCHAR_LEAD_CANONICAL_COMBINING_CLASS, 205, VALUES_lccc_COUNT, VALUES_lccc),
+    Property((int32_t) UCHAR_LINE_BREAK, 207, VALUES_lb_COUNT, VALUES_lb),
+    Property((int32_t) UCHAR_NFC_QUICK_CHECK, 209, VALUES_NFC_QC_COUNT, VALUES_NFC_QC),
+    Property((int32_t) UCHAR_NFD_QUICK_CHECK, 211, VALUES_NFD_QC_COUNT, VALUES_NFD_QC),
+    Property((int32_t) UCHAR_NFKC_QUICK_CHECK, 213, VALUES_NFKC_QC_COUNT, VALUES_NFKC_QC),
+    Property((int32_t) UCHAR_NFKD_QUICK_CHECK, 215, VALUES_NFKD_QC_COUNT, VALUES_NFKD_QC),
+    Property((int32_t) UCHAR_NUMERIC_TYPE, 217, VALUES_nt_COUNT, VALUES_nt),
+    Property((int32_t) UCHAR_SCRIPT, 219, VALUES_sc_COUNT, VALUES_sc),
+    Property((int32_t) UCHAR_SENTENCE_BREAK, 221, VALUES_SB_COUNT, VALUES_SB),
+    Property((int32_t) UCHAR_TRAIL_CANONICAL_COMBINING_CLASS, 223, VALUES_tccc_COUNT, VALUES_tccc),
+    Property((int32_t) UCHAR_WORD_BREAK, 225, VALUES_WB_COUNT, VALUES_WB),
+    Property((int32_t) UCHAR_AGE, 231, 0, NULL),
+    Property((int32_t) UCHAR_BIDI_MIRRORING_GLYPH, 233, 0, NULL),
+    Property((int32_t) UCHAR_CASE_FOLDING, 235, 0, NULL),
+    Property((int32_t) UCHAR_ISO_COMMENT, 237, 0, NULL),
+    Property((int32_t) UCHAR_LOWERCASE_MAPPING, 239, 0, NULL),
+    Property((int32_t) UCHAR_NAME, 241, 0, NULL),
+    Property((int32_t) UCHAR_SIMPLE_CASE_FOLDING, 243, 0, NULL),
+    Property((int32_t) UCHAR_SIMPLE_LOWERCASE_MAPPING, 246, 0, NULL),
+    Property((int32_t) UCHAR_SIMPLE_TITLECASE_MAPPING, 248, 0, NULL),
+    Property((int32_t) UCHAR_SIMPLE_UPPERCASE_MAPPING, 250, 0, NULL),
+    Property((int32_t) UCHAR_TITLECASE_MAPPING, 252, 0, NULL),
+    Property((int32_t) UCHAR_UNICODE_1_NAME, 254, 0, NULL),
+    Property((int32_t) UCHAR_UPPERCASE_MAPPING, 256, 0, NULL),
+    Property((int32_t) UCHAR_NUMERIC_VALUE, 183, 0, NULL),
+    Property((int32_t) UCHAR_GENERAL_CATEGORY_MASK, 227, VALUES_gcm_COUNT, VALUES_gcm),
+    Property((int32_t) UCHAR_SCRIPT_EXTENSIONS, 229, 0, NULL),
+};
+
+/*eof*/
diff --git a/unicode/c/genpname/genpname.cpp b/unicode/c/genpname/genpname.cpp
new file mode 100644
index 0000000..f174cca
--- /dev/null
+++ b/unicode/c/genpname/genpname.cpp
@@ -0,0 +1,1226 @@
+/*
+**********************************************************************
+*   Copyright (C) 2002-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+**********************************************************************
+*   Date        Name        Description
+*   10/11/02    aliu        Creation.
+**********************************************************************
+*/
+
+#include "unicode/utypes.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "filestrm.h"
+#include "uarrsort.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uprops.h"
+#include "propname.h"
+#include "uassert.h"
+
+#include <stdio.h>
+
+U_NAMESPACE_USE
+
+// TODO: Clean up and comment this code.
+
+//----------------------------------------------------------------------
+// BEGIN DATA
+// 
+// This is the raw data to be output.  We define the data structure,
+// then include a machine-generated header that contains the actual
+// data.
+
+#include "unicode/uchar.h"
+#include "unicode/uscript.h"
+#include "unicode/unorm.h"
+#include "unicode/unorm2.h"
+
+class AliasName {
+public:
+    const char* str;
+    int32_t     index;
+
+    AliasName(const char* str, int32_t index);
+
+    int compare(const AliasName& other) const;
+
+    UBool operator==(const AliasName& other) const {
+        return compare(other) == 0;
+    }
+
+    UBool operator!=(const AliasName& other) const {
+        return compare(other) != 0;
+    }
+};
+
+AliasName::AliasName(const char* _str,
+               int32_t _index) :
+    str(_str),
+    index(_index)
+{
+}
+
+int AliasName::compare(const AliasName& other) const {
+    return uprv_comparePropertyNames(str, other.str);
+}
+
+class Alias {
+public:
+    int32_t     enumValue;
+    int32_t     nameGroupIndex;
+
+    Alias(int32_t enumValue,
+             int32_t nameGroupIndex);
+
+    int32_t getUniqueNames(int32_t* nameGroupIndices) const;
+};
+
+Alias::Alias(int32_t anEnumValue,
+                   int32_t aNameGroupIndex) :
+    enumValue(anEnumValue),
+    nameGroupIndex(aNameGroupIndex)
+{
+}
+
+class Property : public Alias {
+public:
+    int32_t         valueCount;
+    const Alias* valueList;
+
+    Property(int32_t enumValue,
+                       int32_t nameGroupIndex,
+                       int32_t valueCount,
+                       const Alias* valueList);
+};
+
+Property::Property(int32_t _enumValue,
+                                       int32_t _nameGroupIndex,
+                                       int32_t _valueCount,
+                                       const Alias* _valueList) :
+    Alias(_enumValue, _nameGroupIndex),
+    valueCount(_valueCount),
+    valueList(_valueList)
+{
+}
+
+// *** Include the data header ***
+#include "data.h"
+
+/* return a list of unique names, not including "", for this property
+ * @param stringIndices array of at least MAX_NAMES_PER_GROUP
+ * elements, will be filled with indices into STRING_TABLE
+ * @return number of indices, >= 1
+ */
+int32_t Alias::getUniqueNames(int32_t* stringIndices) const {
+    int32_t count = 0;
+    int32_t i = nameGroupIndex;
+    UBool done = FALSE;
+    while (!done) {
+        int32_t j = NAME_GROUP[i++];
+        if (j < 0) {
+            done = TRUE;
+            j = -j;
+        }
+        if (j == 0) continue; // omit "" entries
+        UBool dupe = FALSE;
+        for (int32_t k=0; k<count; ++k) {
+            if (stringIndices[k] == j) {
+                dupe = TRUE;
+                break;
+            }
+            // also do a string check for things like "age|Age"
+            if (STRING_TABLE[stringIndices[k]] == STRING_TABLE[j]) {
+                //printf("Found dupe %s|%s\n",
+                //       STRING_TABLE[stringIndices[k]].str,
+                //       STRING_TABLE[j].str);
+                dupe = TRUE;
+                break;
+            }
+        }
+        if (dupe) continue; // omit duplicates
+        stringIndices[count++] = j;
+    }
+    return count;
+}
+
+// END DATA
+//----------------------------------------------------------------------
+
+#define MALLOC(type, count) \
+  (type*) uprv_malloc(sizeof(type) * count)
+
+void die(const char* msg) {
+    fprintf(stderr, "Error: %s\n", msg);
+    exit(1);
+}
+
+//----------------------------------------------------------------------
+
+/**
+ * A list of Alias objects.
+ */
+class AliasList {
+public:
+    virtual ~AliasList();
+    virtual const Alias& operator[](int32_t i) const = 0;
+    virtual int32_t count() const = 0;
+};
+
+AliasList::~AliasList() {}
+
+/**
+ * A single array.
+ */
+class AliasArrayList : public AliasList {
+    const Alias* a;
+    int32_t n;
+public:
+    AliasArrayList(const Alias* _a, int32_t _n) {
+        a = _a;
+        n = _n;
+    }
+    virtual const Alias& operator[](int32_t i) const {
+        return a[i];
+    }
+    virtual int32_t count() const {
+        return n;
+    }
+};
+
+/**
+ * A single array.
+ */
+class PropertyArrayList : public AliasList {
+    const Property* a;
+    int32_t n;
+public:
+    PropertyArrayList(const Property* _a, int32_t _n) {
+        a = _a;
+        n = _n;
+    }
+    virtual const Alias& operator[](int32_t i) const {
+        return a[i];
+    }
+    virtual int32_t count() const {
+        return n;
+    }
+};
+
+//----------------------------------------------------------------------
+
+/**
+ * An element in a name index.  It maps a name (given by index) into
+ * an enum value.
+ */
+class NameToEnumEntry {
+public:
+    int32_t nameIndex;
+    int32_t enumValue;
+    NameToEnumEntry(int32_t a, int32_t b) { nameIndex=a; enumValue=b; }
+};
+
+// Sort function for NameToEnumEntry (sort by name)
+U_CFUNC int32_t
+compareNameToEnumEntry(const void * /*context*/, const void* e1, const void* e2) {
+    return
+        STRING_TABLE[((NameToEnumEntry*)e1)->nameIndex].
+            compare(STRING_TABLE[((NameToEnumEntry*)e2)->nameIndex]);
+}
+
+//----------------------------------------------------------------------
+
+/**
+ * An element in an enum index.  It maps an enum into a name group entry
+ * (given by index).
+ */
+class EnumToNameGroupEntry {
+public:
+    int32_t enumValue;
+    int32_t nameGroupIndex;
+    EnumToNameGroupEntry(int32_t a, int32_t b) { enumValue=a; nameGroupIndex=b; }
+    
+    // are enumValues contiguous for count entries starting with this one?
+    // ***!!!*** we assume we are in an array and look at neighbors ***!!!***
+    UBool isContiguous(int32_t count) const {
+        const EnumToNameGroupEntry* p = this;
+        for (int32_t i=1; i<count; ++i) {
+            if (p[i].enumValue != (this->enumValue + i)) {
+                return FALSE;
+            }
+        }
+        return TRUE;
+    }
+};
+
+// Sort function for EnumToNameGroupEntry (sort by name index)
+U_CFUNC int32_t
+compareEnumToNameGroupEntry(const void * /*context*/, const void* e1, const void* e2) {
+    return ((EnumToNameGroupEntry*)e1)->enumValue - ((EnumToNameGroupEntry*)e2)->enumValue;
+}
+
+//----------------------------------------------------------------------
+
+/**
+ * An element in the map from enumerated property enums to value maps.
+ */
+class EnumToValueEntry {
+public:
+    int32_t enumValue;
+    EnumToNameGroupEntry* enumToName;
+    int32_t enumToName_count;
+    NameToEnumEntry* nameToEnum;
+    int32_t nameToEnum_count;
+
+    // are enumValues contiguous for count entries starting with this one?
+    // ***!!!*** we assume we are in an array and look at neighbors ***!!!***
+    UBool isContiguous(int32_t count) const {
+        const EnumToValueEntry* p = this;
+        for (int32_t i=1; i<count; ++i) {
+            if (p[i].enumValue != (this->enumValue + i)) {
+                return FALSE;
+            }
+        }
+        return TRUE;
+    }
+};
+
+// Sort function for EnumToValueEntry (sort by enum)
+U_CFUNC int32_t
+compareEnumToValueEntry(const void * /*context*/, const void* e1, const void* e2) {
+    return ((EnumToValueEntry*)e1)->enumValue - ((EnumToValueEntry*)e2)->enumValue;
+}
+
+//----------------------------------------------------------------------
+// BEGIN Builder
+
+#define IS_VALID_OFFSET(x) (((x)>=0)&&((x)<=MAX_OFFSET))
+
+class Builder {
+    // header:
+    PropertyAliases header;
+
+    // 0:
+    NonContiguousEnumToOffset* enumToName;
+    int32_t enumToName_size;
+    Offset enumToName_offset;
+
+    // 1: (deleted)
+
+    // 2:
+    NameToEnum* nameToEnum;
+    int32_t nameToEnum_size;
+    Offset nameToEnum_offset;
+
+    // 3:
+    NonContiguousEnumToOffset* enumToValue;
+    int32_t enumToValue_size;
+    Offset enumToValue_offset;
+
+    // 4:
+    ValueMap* valueMap;
+    int32_t valueMap_size;
+    int32_t valueMap_count;
+    Offset valueMap_offset;
+
+    // for any i, one of valueEnumToName[i] or valueNCEnumToName[i] is
+    // NULL and one is not.  valueEnumToName_size[i] is the size of
+    // the non-NULL one.  i=0..valueMapCount-1
+    // 5a:
+    EnumToOffset** valueEnumToName;
+    // 5b:
+    NonContiguousEnumToOffset** valueNCEnumToName;
+    int32_t* valueEnumToName_size;
+    Offset* valueEnumToName_offset;
+    // 6:
+    // arrays of valueMap_count pointers, sizes, & offsets
+    NameToEnum** valueNameToEnum;
+    int32_t* valueNameToEnum_size;
+    Offset* valueNameToEnum_offset;
+
+    // 98:
+    Offset* nameGroupPool;
+    int32_t nameGroupPool_count;
+    int32_t nameGroupPool_size;
+    Offset nameGroupPool_offset;
+
+    // 99:
+    char* stringPool;
+    int32_t stringPool_count;
+    int32_t stringPool_size;
+    Offset stringPool_offset;
+    Offset* stringPool_offsetArray; // relative to stringPool
+
+    int32_t total_size; // size of everything
+
+    int32_t debug;
+
+public:
+
+    Builder(int32_t debugLevel);
+    ~Builder();
+
+    void buildTopLevelProperties(const NameToEnumEntry* propName,
+                                 int32_t propNameCount,
+                                 const EnumToNameGroupEntry* propEnum,
+                                 int32_t propEnumCount);
+
+    void buildValues(const EnumToValueEntry* e2v,
+                     int32_t count);
+
+    void buildStringPool(const AliasName* propertyNames,
+                         int32_t propertyNameCount,
+                         const int32_t* nameGroupIndices,
+                         int32_t nameGroupIndicesCount);
+
+    void fixup();
+
+    int8_t* createData(int32_t& length) const;
+
+private:
+
+    static EnumToOffset* buildEnumToOffset(const EnumToNameGroupEntry* e2ng,
+                                           int32_t count,
+                                           int32_t& size);
+    static NonContiguousEnumToOffset*
+        buildNCEnumToNameGroup(const EnumToNameGroupEntry* e2ng,
+                               int32_t count,
+                               int32_t& size);
+
+    static NonContiguousEnumToOffset*
+        buildNCEnumToValue(const EnumToValueEntry* e2v,
+                           int32_t count,
+                           int32_t& size);
+
+    static NameToEnum* buildNameToEnum(const NameToEnumEntry* nameToEnum,
+                                       int32_t count,
+                                       int32_t& size);
+
+    Offset stringIndexToOffset(int32_t index, UBool allowNeg=FALSE) const;
+    void fixupNameToEnum(NameToEnum* n);
+    void fixupEnumToNameGroup(EnumToOffset* e2ng);
+    void fixupNCEnumToNameGroup(NonContiguousEnumToOffset* e2ng);
+
+    void computeOffsets();
+    void fixupStringPoolOffsets();
+    void fixupNameGroupPoolOffsets();
+    void fixupMiscellaneousOffsets();
+
+    static int32_t align(int32_t a);
+    static void erase(void* p, int32_t size);
+};
+
+Builder::Builder(int32_t debugLevel) {
+    debug = debugLevel;
+    enumToName = 0;
+    nameToEnum = 0;
+    enumToValue = 0;
+    valueMap_count = 0;
+    valueMap = 0;
+    valueEnumToName = 0;
+    valueNCEnumToName = 0;
+    valueEnumToName_size = 0;
+    valueEnumToName_offset = 0;
+    valueNameToEnum = 0;
+    valueNameToEnum_size = 0;
+    valueNameToEnum_offset = 0;
+    nameGroupPool = 0;
+    stringPool = 0;
+    stringPool_offsetArray = 0;
+}
+
+Builder::~Builder() {
+    uprv_free(enumToName);
+    uprv_free(nameToEnum);
+    uprv_free(enumToValue);
+    uprv_free(valueMap);
+    for (int32_t i=0; i<valueMap_count; ++i) {
+        uprv_free(valueEnumToName[i]);
+        uprv_free(valueNCEnumToName[i]);
+        uprv_free(valueNameToEnum[i]);
+    }
+    uprv_free(valueEnumToName);
+    uprv_free(valueNCEnumToName);
+    uprv_free(valueEnumToName_size);
+    uprv_free(valueEnumToName_offset);
+    uprv_free(valueNameToEnum);
+    uprv_free(valueNameToEnum_size);
+    uprv_free(valueNameToEnum_offset);
+    uprv_free(nameGroupPool);
+    uprv_free(stringPool);
+    uprv_free(stringPool_offsetArray);
+}
+
+int32_t Builder::align(int32_t a) {
+    U_ASSERT(a >= 0);
+    int32_t k = a % sizeof(int32_t);
+    if (k == 0) {
+        return a;
+    }
+    a += sizeof(int32_t) - k;
+    return a;
+}
+
+void Builder::erase(void* p, int32_t size) {
+    U_ASSERT(size >= 0);
+    int8_t* q = (int8_t*) p;
+    while (size--) {
+        *q++ = 0;
+    }
+}
+
+EnumToOffset* Builder::buildEnumToOffset(const EnumToNameGroupEntry* e2ng,
+                                         int32_t count,
+                                         int32_t& size) {
+    U_ASSERT(e2ng->isContiguous(count));
+    size = align(EnumToOffset::getSize(count));
+    EnumToOffset* result = (EnumToOffset*) uprv_malloc(size);
+    erase(result, size);
+    result->enumStart = e2ng->enumValue;
+    result->enumLimit = e2ng->enumValue + count;
+    Offset* p = result->getOffsetArray();
+    for (int32_t i=0; i<count; ++i) {
+        // set these to NGI index values
+        // fix them up to NGI offset values
+        U_ASSERT(IS_VALID_OFFSET(e2ng[i].nameGroupIndex));
+        p[i] = (Offset) e2ng[i].nameGroupIndex; // FIXUP later
+    }
+    return result;
+}
+
+NonContiguousEnumToOffset*
+Builder::buildNCEnumToNameGroup(const EnumToNameGroupEntry* e2ng,
+                                int32_t count,
+                                int32_t& size) {
+    U_ASSERT(!e2ng->isContiguous(count));
+    size = align(NonContiguousEnumToOffset::getSize(count));
+    NonContiguousEnumToOffset* nc = (NonContiguousEnumToOffset*) uprv_malloc(size);
+    erase(nc, size);
+    nc->count = count;
+    EnumValue* e = nc->getEnumArray();
+    Offset* p = nc->getOffsetArray();
+    for (int32_t i=0; i<count; ++i) {
+        // set these to NGI index values
+        // fix them up to NGI offset values
+        e[i] = e2ng[i].enumValue;
+        U_ASSERT(IS_VALID_OFFSET(e2ng[i].nameGroupIndex));
+        p[i] = (Offset) e2ng[i].nameGroupIndex; // FIXUP later
+    }
+    return nc;
+}
+
+NonContiguousEnumToOffset*
+Builder::buildNCEnumToValue(const EnumToValueEntry* e2v,
+                            int32_t count,
+                            int32_t& size) {
+    U_ASSERT(!e2v->isContiguous(count));
+    size = align(NonContiguousEnumToOffset::getSize(count));
+    NonContiguousEnumToOffset* result = (NonContiguousEnumToOffset*) uprv_malloc(size);
+    erase(result, size);
+    result->count = count;
+    EnumValue* e = result->getEnumArray();
+    for (int32_t i=0; i<count; ++i) {
+        e[i] = e2v[i].enumValue;
+        // offset must be set later
+    }
+    return result;
+}
+
+/**
+ * Given an index into the string pool, return an offset.  computeOffsets()
+ * must have been called already.  If allowNegative is true, allow negatives
+ * and preserve their sign.
+ */
+Offset Builder::stringIndexToOffset(int32_t index, UBool allowNegative) const {
+    // Index 0 is ""; we turn this into an Offset of zero
+    if (index == 0) return 0;
+    if (index < 0) {
+        if (allowNegative) {
+            return -Builder::stringIndexToOffset(-index);
+        } else {
+            die("Negative string pool index");
+        }
+    } else {
+        if (index >= stringPool_count) {
+            die("String pool index too large");
+        }
+        Offset result = stringPool_offset + stringPool_offsetArray[index];
+        U_ASSERT(result >= 0 && result < total_size);
+        return result;
+    }
+    return 0; // never executed; make compiler happy
+}
+
+NameToEnum* Builder::buildNameToEnum(const NameToEnumEntry* nameToEnum,
+                                     int32_t count,
+                                     int32_t& size) {
+    size = align(NameToEnum::getSize(count));
+    NameToEnum* n2e = (NameToEnum*) uprv_malloc(size);
+    erase(n2e, size);
+    n2e->count = count;
+    Offset* p = n2e->getNameArray();
+    EnumValue* e = n2e->getEnumArray();
+    for (int32_t i=0; i<count; ++i) {
+        // set these to SP index values
+        // fix them up to SP offset values
+        U_ASSERT(IS_VALID_OFFSET(nameToEnum[i].nameIndex));
+        p[i] = (Offset) nameToEnum[i].nameIndex; // FIXUP later
+        e[i] = nameToEnum[i].enumValue;
+    }
+    return n2e;
+}
+
+
+void Builder::buildTopLevelProperties(const NameToEnumEntry* propName,
+                                      int32_t propNameCount,
+                                      const EnumToNameGroupEntry* propEnum,
+                                      int32_t propEnumCount) {
+    enumToName = buildNCEnumToNameGroup(propEnum,
+                                        propEnumCount,
+                                        enumToName_size);
+    nameToEnum = buildNameToEnum(propName,
+                                 propNameCount,
+                                 nameToEnum_size);
+}
+
+void Builder::buildValues(const EnumToValueEntry* e2v,
+                          int32_t count) {
+    int32_t i;
+    
+    U_ASSERT(!e2v->isContiguous(count));
+
+    valueMap_count = count;
+
+    enumToValue = buildNCEnumToValue(e2v, count,
+                                     enumToValue_size);
+
+    valueMap_size = align(count * sizeof(ValueMap));
+    valueMap = (ValueMap*) uprv_malloc(valueMap_size);
+    erase(valueMap, valueMap_size);
+
+    valueEnumToName = MALLOC(EnumToOffset*, count);
+    valueNCEnumToName = MALLOC(NonContiguousEnumToOffset*, count);
+    valueEnumToName_size = MALLOC(int32_t, count);
+    valueEnumToName_offset = MALLOC(Offset, count);
+    valueNameToEnum = MALLOC(NameToEnum*, count);
+    valueNameToEnum_size = MALLOC(int32_t, count);
+    valueNameToEnum_offset = MALLOC(Offset, count);
+
+    for (i=0; i<count; ++i) {
+        UBool isContiguous =
+            e2v[i].enumToName->isContiguous(e2v[i].enumToName_count);
+        valueEnumToName[i] = 0;
+        valueNCEnumToName[i] = 0;
+        if (isContiguous) {
+            valueEnumToName[i] = buildEnumToOffset(e2v[i].enumToName,
+                                                   e2v[i].enumToName_count,
+                                                   valueEnumToName_size[i]);
+        } else {
+            valueNCEnumToName[i] = buildNCEnumToNameGroup(e2v[i].enumToName,
+                                                          e2v[i].enumToName_count,
+                                                          valueEnumToName_size[i]);
+        }
+        valueNameToEnum[i] =
+            buildNameToEnum(e2v[i].nameToEnum,
+                            e2v[i].nameToEnum_count,
+                            valueNameToEnum_size[i]);
+    }
+}
+
+void Builder::buildStringPool(const AliasName* propertyNames,
+                              int32_t propertyNameCount,
+                              const int32_t* nameGroupIndices,
+                              int32_t nameGroupIndicesCount) {
+    int32_t i;
+
+    nameGroupPool_count = nameGroupIndicesCount;
+    nameGroupPool_size = sizeof(Offset) * nameGroupPool_count;
+    nameGroupPool = MALLOC(Offset, nameGroupPool_count);
+
+    for (i=0; i<nameGroupPool_count; ++i) {
+        // Some indices are negative.
+        int32_t a = nameGroupIndices[i];
+        if (a < 0) a = -a;
+        U_ASSERT(IS_VALID_OFFSET(a));
+        nameGroupPool[i] = (Offset) nameGroupIndices[i];
+    }
+
+    stringPool_count = propertyNameCount;
+    stringPool_size = 0;
+    // first string must be "" -- we skip it
+    U_ASSERT(*propertyNames[0].str == 0);
+    for (i=1 /*sic*/; i<propertyNameCount; ++i) {
+        stringPool_size += (int32_t)(uprv_strlen(propertyNames[i].str) + 1);
+    }
+    stringPool = MALLOC(char, stringPool_size);
+    stringPool_offsetArray = MALLOC(Offset, stringPool_count);
+    Offset soFar = 0;
+    char* p = stringPool;
+    stringPool_offsetArray[0] = -1; // we don't use this entry
+    for (i=1 /*sic*/; i<propertyNameCount; ++i) {
+        const char* str = propertyNames[i].str;
+        int32_t len = (int32_t)uprv_strlen(str);
+        uprv_strcpy(p, str);
+        p += len;
+        *p++ = 0;
+        stringPool_offsetArray[i] = soFar;
+        soFar += (Offset)(len+1);
+    }
+    U_ASSERT(soFar == stringPool_size);
+    U_ASSERT(p == (stringPool + stringPool_size));
+}
+
+// Confirm that PropertyAliases is a POD (plain old data; see C++
+// std).  The following union will _fail to compile_ if
+// PropertyAliases is _not_ a POD.  (Note: We used to use the offsetof
+// macro to check this, but that's not quite right, so that test is
+// commented out -- see below.)
+typedef union {
+    int32_t i;
+    PropertyAliases p;
+} PropertyAliasesPODTest;
+
+void Builder::computeOffsets() {
+    int32_t i;
+    Offset off = sizeof(header);
+
+    if (debug>0) {
+        printf("header   \t offset=%4d  size=%5d\n", 0, off);
+    }
+
+    // PropertyAliases must have no v-table and must be
+    // padded (if necessary) to the next 32-bit boundary.
+    //U_ASSERT(offsetof(PropertyAliases, enumToName_offset) == 0); // see above
+    U_ASSERT(sizeof(header) % sizeof(int32_t) == 0);
+
+    #define COMPUTE_OFFSET(foo) COMPUTE_OFFSET2(foo,int32_t)
+
+    #define COMPUTE_OFFSET2(foo,type) \
+      if (debug>0)\
+        printf(#foo "\t offset=%4d  size=%5d\n", off, (int)foo##_size);\
+      foo##_offset = off;\
+      U_ASSERT(IS_VALID_OFFSET(off + foo##_size));\
+      U_ASSERT(foo##_offset % sizeof(type) == 0);\
+      off = (Offset) (off + foo##_size);
+
+    COMPUTE_OFFSET(enumToName);     // 0:
+    COMPUTE_OFFSET(nameToEnum);     // 2:
+    COMPUTE_OFFSET(enumToValue);    // 3:
+    COMPUTE_OFFSET(valueMap);       // 4:
+        
+    for (i=0; i<valueMap_count; ++i) {
+        if (debug>0) {
+            printf(" enumToName[%d]\t offset=%4d  size=%5d\n",
+                   (int)i, off, (int)valueEnumToName_size[i]);
+        }
+
+        valueEnumToName_offset[i] = off;   // 5:
+        U_ASSERT(IS_VALID_OFFSET(off + valueEnumToName_size[i]));
+        off = (Offset) (off + valueEnumToName_size[i]);
+
+        if (debug>0) {
+            printf(" nameToEnum[%d]\t offset=%4d  size=%5d\n",
+                   (int)i, off, (int)valueNameToEnum_size[i]);
+        }
+
+        valueNameToEnum_offset[i] = off;   // 6:
+        U_ASSERT(IS_VALID_OFFSET(off + valueNameToEnum_size[i]));
+        off = (Offset) (off + valueNameToEnum_size[i]);
+    }
+    
+    // These last two chunks have weaker alignment needs
+    COMPUTE_OFFSET2(nameGroupPool,Offset); // 98:
+    COMPUTE_OFFSET2(stringPool,char);      // 99:
+
+    total_size = off;
+    if (debug>0) printf("total                         size=%5d\n\n", (int)total_size);
+    U_ASSERT(total_size <= (MAX_OFFSET+1));
+}
+
+void Builder::fixupNameToEnum(NameToEnum* n) {
+    // Fix the string pool offsets in n
+    Offset* p = n->getNameArray();
+    for (int32_t i=0; i<n->count; ++i) {
+        p[i] = stringIndexToOffset(p[i]);
+    }
+}
+
+void Builder::fixupStringPoolOffsets() {
+    int32_t i;
+    
+    // 2:
+    fixupNameToEnum(nameToEnum);
+
+    // 6:
+    for (i=0; i<valueMap_count; ++i) {
+        fixupNameToEnum(valueNameToEnum[i]);
+    }
+
+    // 98:
+    for (i=0; i<nameGroupPool_count; ++i) {
+        nameGroupPool[i] = stringIndexToOffset(nameGroupPool[i], TRUE);
+    }
+}
+
+void Builder::fixupEnumToNameGroup(EnumToOffset* e2ng) {
+    EnumValue i;
+    int32_t j;
+    Offset* p = e2ng->getOffsetArray();
+    for (i=e2ng->enumStart, j=0; i<e2ng->enumLimit; ++i, ++j) {
+        p[j] = nameGroupPool_offset + sizeof(Offset) * p[j];
+    }
+}
+
+void Builder::fixupNCEnumToNameGroup(NonContiguousEnumToOffset* e2ng) {
+    int32_t i;
+    /*EnumValue* e = e2ng->getEnumArray();*/
+    Offset* p = e2ng->getOffsetArray();
+    for (i=0; i<e2ng->count; ++i) {
+        p[i] = nameGroupPool_offset + sizeof(Offset) * p[i];
+    }    
+}
+
+void Builder::fixupNameGroupPoolOffsets() {
+    int32_t i;
+
+    // 0:
+    fixupNCEnumToNameGroup(enumToName);
+
+    // 1: (deleted)
+
+    // 5:
+    for (i=0; i<valueMap_count; ++i) {
+        // 5a:
+        if (valueEnumToName[i] != 0) {
+            fixupEnumToNameGroup(valueEnumToName[i]);
+        }
+        // 5b:
+        if (valueNCEnumToName[i] != 0) {
+            fixupNCEnumToNameGroup(valueNCEnumToName[i]);
+        }
+    }
+}
+
+void Builder::fixupMiscellaneousOffsets() {
+    int32_t i;
+
+    // header:
+    erase(&header, sizeof(header));
+    header.enumToName_offset = enumToName_offset;
+    header.nameToEnum_offset = nameToEnum_offset;
+    header.enumToValue_offset = enumToValue_offset;
+    // header meta-info used by Java:
+    U_ASSERT(total_size > 0 && total_size < 0x7FFF);
+    header.total_size = (int16_t) total_size;
+    header.valueMap_offset = valueMap_offset;
+    header.valueMap_count = (int16_t) valueMap_count;
+    header.nameGroupPool_offset = nameGroupPool_offset;
+    header.nameGroupPool_count = (int16_t) nameGroupPool_count;
+    header.stringPool_offset = stringPool_offset;
+    header.stringPool_count = (int16_t) stringPool_count - 1; // don't include "" entry
+
+    U_ASSERT(valueMap_count <= 0x7FFF);
+    U_ASSERT(nameGroupPool_count <= 0x7FFF);
+    U_ASSERT(stringPool_count <= 0x7FFF);
+
+    // 3:
+    Offset* p = enumToValue->getOffsetArray();
+    /*EnumValue* e = enumToValue->getEnumArray();*/
+    U_ASSERT(valueMap_count == enumToValue->count);
+    for (i=0; i<valueMap_count; ++i) {
+        p[i] = (Offset)(valueMap_offset + sizeof(ValueMap) * i);
+    }
+
+    // 4:
+    for (i=0; i<valueMap_count; ++i) {
+        ValueMap& v = valueMap[i];
+        v.enumToName_offset = v.ncEnumToName_offset = 0;
+        if (valueEnumToName[i] != 0) {
+            v.enumToName_offset = valueEnumToName_offset[i];
+        }
+        if (valueNCEnumToName[i] != 0) {
+            v.ncEnumToName_offset = valueEnumToName_offset[i];
+        }
+        v.nameToEnum_offset = valueNameToEnum_offset[i];
+    }
+}
+
+void Builder::fixup() {
+    computeOffsets();
+    fixupStringPoolOffsets();
+    fixupNameGroupPoolOffsets();
+    fixupMiscellaneousOffsets();
+}
+
+int8_t* Builder::createData(int32_t& length) const {
+    length = total_size;
+    int8_t* result = MALLOC(int8_t, length);
+    
+    int8_t* p = result;
+    int8_t* limit = result + length;
+    
+    #define APPEND2(x, size)   \
+      U_ASSERT((p+size)<=limit); \
+      uprv_memcpy(p, x, size); \
+      p += size
+
+    #define APPEND(x) APPEND2(x, x##_size)
+
+    APPEND2(&header, sizeof(header));
+    APPEND(enumToName);
+    APPEND(nameToEnum);
+    APPEND(enumToValue);
+    APPEND(valueMap);
+ 
+    for (int32_t i=0; i<valueMap_count; ++i) {
+        U_ASSERT((valueEnumToName[i] != 0 && valueNCEnumToName[i] == 0) ||
+               (valueEnumToName[i] == 0 && valueNCEnumToName[i] != 0));
+        if (valueEnumToName[i] != 0) {
+            APPEND2(valueEnumToName[i], valueEnumToName_size[i]);
+        }
+        if (valueNCEnumToName[i] != 0) {
+            APPEND2(valueNCEnumToName[i], valueEnumToName_size[i]);
+        }
+        APPEND2(valueNameToEnum[i], valueNameToEnum_size[i]);
+    }
+
+    APPEND(nameGroupPool);
+    APPEND(stringPool);
+
+    if (p != limit) {
+        fprintf(stderr, "p != limit; p = %p, limit = %p", p, limit);
+        exit(1);
+    }
+    return result;
+}
+
+// END Builder
+//----------------------------------------------------------------------
+
+/* UDataInfo cf. udata.h */
+static UDataInfo dataInfo = {
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    sizeof(UChar),
+    0,
+
+    {PNAME_SIG_0, PNAME_SIG_1, PNAME_SIG_2, PNAME_SIG_3},
+    {PNAME_FORMAT_VERSION, 0, 0, 0},                 /* formatVersion */
+    {VERSION_0, VERSION_1, VERSION_2, VERSION_3} /* Unicode version */
+};
+
+class genpname {
+
+    // command-line options
+    UBool useCopyright;
+    UBool verbose;
+    int32_t debug;
+
+public:
+    int      MMain(int argc, char *argv[]);
+
+private:
+    NameToEnumEntry* createNameIndex(const AliasList& list,
+                                     int32_t& nameIndexCount);
+
+    EnumToNameGroupEntry* createEnumIndex(const AliasList& list);
+
+    int32_t  writeDataFile(const char *destdir, const Builder&);
+};
+
+int main(int argc, char *argv[]) {
+    UErrorCode status = U_ZERO_ERROR;
+    u_init(&status);
+    if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) {
+        // Note: u_init() will try to open ICU property data.
+        //       failures here are expected when building ICU from scratch.
+        //       ignore them.
+        fprintf(stderr, "genpname: can not initialize ICU.  Status = %s\n",
+            u_errorName(status));
+        exit(1);
+    }
+
+    genpname app;
+    U_MAIN_INIT_ARGS(argc, argv);
+    int retVal = app.MMain(argc, argv);
+    u_cleanup();
+    return retVal;
+}
+
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_COPYRIGHT,
+    UOPTION_DESTDIR,
+    UOPTION_VERBOSE,
+    UOPTION_DEF("debug", 'D', UOPT_REQUIRES_ARG),
+};
+
+NameToEnumEntry* genpname::createNameIndex(const AliasList& list,
+                                           int32_t& nameIndexCount) {
+
+    // Build name => enum map
+
+    // This is an n->1 map.  There are typically multiple names
+    // mapping to one enum.  The name index is sorted in order of the name,
+    // as defined by the uprv_compareAliasNames() function.
+
+    int32_t i, j;
+    int32_t count = list.count();
+    
+    // compute upper limit on number of names in the index
+    int32_t nameIndexCapacity = count * MAX_NAMES_PER_GROUP;
+    NameToEnumEntry* nameIndex = MALLOC(NameToEnumEntry, nameIndexCapacity);
+
+    nameIndexCount = 0;
+    int32_t names[MAX_NAMES_PER_GROUP];
+    for (i=0; i<count; ++i) {
+        const Alias& p = list[i];
+        int32_t n = p.getUniqueNames(names);
+        for (j=0; j<n; ++j) {
+            U_ASSERT(nameIndexCount < nameIndexCapacity);
+            nameIndex[nameIndexCount++] =
+                NameToEnumEntry(names[j], p.enumValue);
+        }
+    }
+
+    /*
+     * use a stable sort to ensure consistent results between
+     * genpname.cpp and the propname.cpp swapping code
+     */
+    UErrorCode errorCode = U_ZERO_ERROR;
+    uprv_sortArray(nameIndex, nameIndexCount, sizeof(nameIndex[0]),
+                   compareNameToEnumEntry, NULL, TRUE, &errorCode);
+    if (debug>1) {
+        printf("Alias names: %d\n", (int)nameIndexCount);
+        for (i=0; i<nameIndexCount; ++i) {
+            printf("%s => %d\n",
+                   STRING_TABLE[nameIndex[i].nameIndex].str,
+                   (int)nameIndex[i].enumValue);
+        }
+        printf("\n");
+    }
+    // make sure there are no duplicates.  for a sorted list we need
+    // only compare adjacent items.  Alias.getUniqueNames() has
+    // already eliminated duplicate names for a single property, which
+    // does occur, so we're checking for duplicate names between two
+    // properties, which should never occur.
+    UBool ok = TRUE;
+    for (i=1; i<nameIndexCount; ++i) {
+        if (STRING_TABLE[nameIndex[i-1].nameIndex] ==
+            STRING_TABLE[nameIndex[i].nameIndex]) {
+            printf("Error: Duplicate names in property list: \"%s\", \"%s\"\n",
+                   STRING_TABLE[nameIndex[i-1].nameIndex].str,
+                   STRING_TABLE[nameIndex[i].nameIndex].str);
+            ok = FALSE;
+        }
+    }
+    if (!ok) {
+        die("Two or more duplicate names in property list");
+    }
+
+    return nameIndex;
+}
+
+EnumToNameGroupEntry* genpname::createEnumIndex(const AliasList& list) {
+
+    // Build the enum => name map
+
+    // This is a 1->n map.  Each enum maps to 1 or more names.  To
+    // accomplish this the index entry points to an element of the
+    // NAME_GROUP array.  This is the short name (which may be empty).
+    // From there, subsequent elements of NAME_GROUP are alternate
+    // names for this enum, up to and including the first one that is
+    // negative (negate for actual index).
+
+    int32_t i, j, k;
+    int32_t count = list.count();
+    
+    EnumToNameGroupEntry* enumIndex = MALLOC(EnumToNameGroupEntry, count);
+    for (i=0; i<count; ++i) {
+        const Alias& p = list[i];
+        enumIndex[i] = EnumToNameGroupEntry(p.enumValue, p.nameGroupIndex);
+    }
+
+    UErrorCode errorCode = U_ZERO_ERROR;
+    uprv_sortArray(enumIndex, count, sizeof(enumIndex[0]),
+                   compareEnumToNameGroupEntry, NULL, FALSE, &errorCode);
+    if (debug>1) {
+        printf("Property enums: %d\n", (int)count);
+        for (i=0; i<count; ++i) {
+            printf("%d => %d: ",
+                   (int)enumIndex[i].enumValue,
+                   (int)enumIndex[i].nameGroupIndex);
+            UBool done = FALSE;
+            for (j=enumIndex[i].nameGroupIndex; !done; ++j) {
+                k = NAME_GROUP[j];
+                if (k < 0) {
+                    k = -k;
+                    done = TRUE;
+                }
+                printf("\"%s\"", STRING_TABLE[k].str);
+                if (!done) printf(", ");
+            }
+            printf("\n");
+        }
+        printf("\n");
+    }
+    return enumIndex;
+}
+
+int genpname::MMain(int argc, char* argv[])
+{
+    int32_t i, j;
+    UErrorCode status = U_ZERO_ERROR;
+
+    u_init(&status);
+    if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) {
+        fprintf(stderr, "Error: u_init returned %s\n", u_errorName(status));
+        status = U_ZERO_ERROR;
+    }
+
+
+    /* preset then read command line options */
+    options[3].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if (argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+
+    debug = options[5].doesOccur ? (*options[5].value - '0') : 0;
+
+    if (argc!=1 || options[0].doesOccur || options[1].doesOccur ||
+       debug < 0 || debug > 9) {
+        fprintf(stderr,
+            "usage: %s [-options]\n"
+            "\tcreate " PNAME_DATA_NAME "." PNAME_DATA_TYPE "\n"
+            "options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     turn on verbose output\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-D or --debug 0..9  emit debugging messages (if > 0)\n",
+            argv[0]);
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    useCopyright=options[2].doesOccur;
+    verbose = options[4].doesOccur;
+
+    // ------------------------------------------------------------
+    // Do not sort the string table, instead keep it in data.h order.
+    // This simplifies data swapping and testing thereof because the string
+    // table itself need not be sorted during swapping.
+    // The NameToEnum sorter sorts each such map's string offsets instead.
+
+    if (debug>1) {
+        printf("String pool: %d\n", (int)STRING_COUNT);
+        for (i=0; i<STRING_COUNT; ++i) {
+            if (i != 0) {
+                printf(", ");
+            }
+            printf("%s (%d)", STRING_TABLE[i].str, (int)STRING_TABLE[i].index);
+        }
+        printf("\n\n");
+    }
+
+    // ------------------------------------------------------------
+    // Create top-level property indices
+
+    PropertyArrayList props(PROPERTY, PROPERTY_COUNT);
+    int32_t propNameCount;
+    NameToEnumEntry* propName = createNameIndex(props, propNameCount);
+    EnumToNameGroupEntry* propEnum = createEnumIndex(props);
+
+    // ------------------------------------------------------------
+    // Create indices for the value list for each enumerated property
+
+    // This will have more entries than we need...
+    EnumToValueEntry* enumToValue = MALLOC(EnumToValueEntry, PROPERTY_COUNT);
+    int32_t enumToValue_count = 0;
+    for (i=0, j=0; i<PROPERTY_COUNT; ++i) {
+        if (PROPERTY[i].valueCount == 0) continue;
+        AliasArrayList values(PROPERTY[i].valueList,
+                              PROPERTY[i].valueCount);
+        enumToValue[j].enumValue = PROPERTY[i].enumValue;
+        enumToValue[j].enumToName = createEnumIndex(values);
+        enumToValue[j].enumToName_count = PROPERTY[i].valueCount;
+        enumToValue[j].nameToEnum = createNameIndex(values,
+                                                    enumToValue[j].nameToEnum_count);
+        ++j;
+    }
+    enumToValue_count = j;
+
+    uprv_sortArray(enumToValue, enumToValue_count, sizeof(enumToValue[0]),
+                   compareEnumToValueEntry, NULL, FALSE, &status);
+
+    // ------------------------------------------------------------
+    // Build PropertyAliases layout in memory
+
+    Builder builder(debug);
+
+    builder.buildTopLevelProperties(propName,
+                                    propNameCount,
+                                    propEnum,
+                                    PROPERTY_COUNT);
+    
+    builder.buildValues(enumToValue,
+                        enumToValue_count);
+
+    builder.buildStringPool(STRING_TABLE,
+                            STRING_COUNT,
+                            NAME_GROUP,
+                            NAME_GROUP_COUNT);
+
+    builder.fixup();
+
+    ////////////////////////////////////////////////////////////
+    // Write the output file
+    ////////////////////////////////////////////////////////////
+    int32_t wlen = writeDataFile(options[3].value, builder);
+    if (verbose) {
+        fprintf(stdout, "Output file: %s.%s, %ld bytes\n",
+            U_ICUDATA_NAME "_" PNAME_DATA_NAME, PNAME_DATA_TYPE, (long)wlen);
+    }
+
+    return 0; // success
+}
+
+int32_t genpname::writeDataFile(const char *destdir, const Builder& builder) {
+    int32_t length;
+    int8_t* data = builder.createData(length);
+
+    UNewDataMemory *pdata;
+    UErrorCode status = U_ZERO_ERROR;
+
+    pdata = udata_create(destdir, PNAME_DATA_TYPE, PNAME_DATA_NAME, &dataInfo,
+                         useCopyright ? U_COPYRIGHT_STRING : 0, &status);
+    if (U_FAILURE(status)) {
+        die("Unable to create data memory");
+    }
+
+    udata_writeBlock(pdata, data, length);
+
+    int32_t dataLength = (int32_t) udata_finish(pdata, &status);
+    if (U_FAILURE(status)) {
+        die("Error writing output file");
+    }
+    if (dataLength != length) {
+        die("Written file doesn't match expected size");
+    }
+
+    return dataLength;
+}
+
+//eof
diff --git a/unicode/c/genpname/genpname.vcproj b/unicode/c/genpname/genpname.vcproj
new file mode 100644
index 0000000..b733d6c
--- /dev/null
+++ b/unicode/c/genpname/genpname.vcproj
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="genpname"
+	ProjectGUID="{DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/genpname.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/genpname.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/genpname.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/genpname.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/genpname.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/genpname.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/genpname.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/genpname.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/genpname.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/genpname.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/genpname.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/genpname.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/genpname.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/genpname.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/genpname.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/genpname.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<File
+			RelativePath=".\data.h"
+			>
+		</File>
+		<File
+			RelativePath=".\genpname.cpp"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/genpname/gensvpa.pl b/unicode/c/genpname/gensvpa.pl
new file mode 100755
index 0000000..bcbf1cc
--- /dev/null
+++ b/unicode/c/genpname/gensvpa.pl
@@ -0,0 +1,161 @@
+#!/usr/bin/perl
+#*
+#*******************************************************************************
+#*   Copyright (C) 2006, International Business Machines
+#*   Corporation and others.  All Rights Reserved.
+#*******************************************************************************
+#*
+#*   file name:  genspva.pl
+#*   encoding:   US-ASCII
+#*   tab size:   8 (not used)
+#*   indentation:4
+#*
+#*   Created by: Ram Viswanadha
+#*
+#* This file filters iso15924-utf8-<date>.txt
+#*
+
+use File::Find;
+use File::Basename;
+use IO::File;
+use Cwd;
+use File::Copy;
+use Getopt::Long;
+use File::Path;
+use File::Copy;
+
+#run the program
+main();
+
+#---------------------------------------------------------------------
+# The main program
+
+sub main(){
+    GetOptions(
+           "--destdir=s" => \$destdir,
+           "--iso15924=s"  => \$iso,
+           "--prop=s"  => \$prop,
+           "--code-start=s"  => \$code,
+           );
+    usage() unless defined $destdir;
+    usage() unless defined $iso;
+    usage() unless defined $prop;
+    
+    $outfile = "$destdir/SyntheticPropertyValueAliases.txt";
+    $propFH = IO::File->new($prop,"r")
+            or die  "could not open the file $prop for reading: $! \n";
+    $isoFH = IO::File->new($iso,"r")
+            or die  "could not open the file $iso for reading: $! \n";
+    $outFH = IO::File->new($outfile,"w")
+            or die  "could not open the file $outfile for reading: $! \n";
+    my @propLines;
+    while (<$propFH>) {
+        next if(!($_ =~/sc ; /));
+        push(@propLines, $_);
+    }
+    printHeader($outFH);
+    if(defined $code){
+        print "Please add the following to UScriptCode enum in uscript.h.\n";
+        print "#ifndef U_HIDE_DRAFT_API\n";
+    }
+    while (<$isoFH>) {
+        next if($_=~/^#/);#skip if the line starts with a comment char
+        ($script, $t, $name, $rest) = split(/;/,$_,4);
+        #sc ; Arab
+        $outstr = "sc ; $script";
+        $encoded = 0; #false
+        
+        # seach the propLines to make sure that this scipt code is not 
+        # encoded in Unicode
+        foreach $key (@propLines){
+            if($key =~ /$outstr/){
+                $encoded = 1;
+            }
+        }
+        next if($encoded == 1);
+        #ignore private use codes 
+        next if($script =~ /Qa[ab][a-z]/);
+        
+        #if($script eq "Qaaa"){
+        #    $outstr = $outstr." ; Private_Use_Start\n";
+        #}elsif($script eq  "Qabx"){
+        #    $outstr = $outstr." ; Private_Use_End\n";
+        #}else{
+        #    $outstr = $outstr." ; $script \n";
+        #} 
+        
+        $outstr = $outstr." ; $script \n";
+        print $outFH $outstr;
+        
+        #print to console
+        if(defined $code){
+            if($name =~ /[(\s,\x80-\xFF]/){
+                $name = $script;
+            }
+            $name =~s/-/_/g;
+        
+            $scriptcode =  "USCRIPT_".uc($name);
+            print "      $scriptcode          = $code, /* $script */\n";
+            $code++;
+        }
+        
+    }
+    if(defined $code){
+        print "#endif /* U_HIDE_DRAFT_API */\n";
+    }
+    for($i=0; $i<2; $i++){
+        
+    }
+    close($isoFH);
+    close($propFH);
+    close($outFH);
+}
+#-----------------------------------------------------------------------
+sub printHeader{
+    ($outFH) = @_;
+    ($DAY, $MONTH, $YEAR) = (localtime)[3,4,5];
+    $YEAR += 1900;
+    #We will print our copyright here + warnings
+print $outFH <<END_HEADER_COMMENT;
+########################################################################
+# Copyright (c) 2006-$YEAR, International Business Machines
+# Corporation and others.  All Rights Reserved.
+########################################################################
+#   file name:      SyntheticPropertyValueAliases.txt
+#   encoding:       US-ASCII
+#   tab size:       8 (not used)
+#   indentation:    4
+#   created by:     gensvpa.pl
+########################################################################
+
+# This file follows the format of PropertyValueAliases.txt
+# It contains synthetic property value aliases not present
+# in the UCD.  Unlike PropertyValueAliases.txt, it should
+# NOT contain a version number.
+
+########################################################################
+#  THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW
+#  WHAT YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
+########################################################################
+
+# set the same names as short and long names to fit the syntax without 
+# inventing names that we would have to support forever
+
+# Script (sc)
+
+END_HEADER_COMMENT
+}
+#-----------------------------------------------------------------------
+sub usage {
+    print << "END";
+Usage:
+gensvpa.pl
+Options:
+        --destdir=<directory>
+        --iso15924=<file name>
+        --prop=<PropertyValueAliases.txt>
+        --code-start=s
+e.g.: gensvpa.pl  --destdir=<icu>/source/tools/genpname --iso15924=iso15924-utf8-20041025.txt --prop=<icu>/source/data/unidata --code-start=60
+END
+    exit(0);
+}
\ No newline at end of file
diff --git a/unicode/c/genpname/preparse.pl b/unicode/c/genpname/preparse.pl
new file mode 100755
index 0000000..90e57c2
--- /dev/null
+++ b/unicode/c/genpname/preparse.pl
@@ -0,0 +1,1323 @@
+#!/bin/perl -w
+#*******************************************************************
+# COPYRIGHT:
+# Copyright (c) 2002-2010, International Business Machines Corporation and
+# others. All Rights Reserved.
+#*******************************************************************
+
+# This script reads in UCD files PropertyAliases.txt and
+# PropertyValueAliases.txt and correlates them with ICU enums
+# defined in uchar.h and uscript.h.  It then outputs a header
+# file which contains all names and enums.  The header is included
+# by the genpname tool C++ source file, which produces the actual
+# binary data file.
+#
+# See usage note below.
+#
+# NOTE: As of ICU 2.6, this script has been modified to know about the
+# pseudo-property gcm/General_Category_Mask, which corresponds to the
+# uchar.h property UCHAR_GENERAL_CATEGORY_MASK.  This property
+# corresponds to General_Category but is a bitmask value.  It does not
+# exist in the UCD.  Therefore, I special case it in several places
+# (search for General_Category_Mask and gcm).
+#
+# NOTE: As of ICU 2.6, this script reads an auxiliary data file,
+# SyntheticPropertyAliases.txt, containing property aliases not
+# present in the UCD but present in ICU.  This file resides in the
+# same directory as this script.  Its contents are merged into those
+# of PropertyAliases.txt as if the two files were appended.
+#
+# NOTE: The following names are handled specially.  See script below
+# for details.
+#
+#   T/True
+#   F/False
+#   No_Block
+#
+# Author: Alan Liu
+# Created: October 14 2002
+# Since: ICU 2.4
+
+use FileHandle;
+use strict;
+use Dumpvalue;
+
+my $DEBUG = 1;
+my $DUMPER = new Dumpvalue;
+
+my $count = @ARGV;
+my $ICU_DIR = shift() || '';
+my $OUT_FILE = shift() || 'data.h';
+my $HEADER_DIR = "$ICU_DIR/source/common/unicode";
+my $UNIDATA_DIR = "$ICU_DIR/source/data/unidata";
+
+# Get the current year from the system
+my $YEAR = 1900+@{[localtime]}[5]; # Get the current year
+
+# Used to make "n/a" property [value] aliases (Unicode or Synthetic) unique
+my $propNA = 0;
+my $valueNA = 0;
+
+#----------------------------------------------------------------------
+# Top level property keys for binary, enumerated, string, double, and other props
+my @TOP     = qw( _bp _ep _sp _dp _op );
+
+# Top level properties are grouped into output arrays.
+my %TOP_PROPS = ( ""   => [ '_bp', '_ep', '_sp', '_dp', '_op' ] );
+
+my %PROP_TYPE = (Binary => "_bp",
+                 String => "_sp",
+                 Double => "_dp",
+                 Enumerated => "_ep",
+                 Other => "_op");
+#----------------------------------------------------------------------
+
+# Properties that are unsupported in ICU
+my %UNSUPPORTED = (Composition_Exclusion => 1,
+                   Decomposition_Mapping => 1,
+                   Expands_On_NFC => 1,
+                   Expands_On_NFD => 1,
+                   Expands_On_NFKC => 1,
+                   Expands_On_NFKD => 1,
+                   FC_NFKC_Closure => 1,
+                   ID_Start_Exceptions => 1,
+                   Special_Case_Condition => 1,
+                   );
+
+# Short names of properties that weren't seen in uchar.h.  If the
+# properties weren't seen, don't complain about the property values
+# missing.
+my %MISSING_FROM_UCHAR;
+
+# Additional property aliases beyond short and long names,
+# like space in addition to WSpace and White_Space in Unicode 4.1.
+# Hashtable, maps long name to alias.
+# For example, maps White_Space->space.
+#
+# If multiple additional aliases are defined,
+# then they are separated in the value string with '|'.
+# For example, White_Space->space|outer_space
+my %additional_property_aliases;
+
+#----------------------------------------------------------------------
+
+# Emitted class names
+my ($STRING_CLASS, $ALIAS_CLASS, $PROPERTY_CLASS) = qw(AliasName Alias Property);
+
+if ($count < 1 || $count > 2 ||
+    !-d $HEADER_DIR ||
+    !-d $UNIDATA_DIR) {
+    my $me = $0;
+    $me =~ s|.+[/\\]||;
+    my $lm = ' ' x length($me);
+    print <<"END";
+
+$me: Reads ICU4C headers and Unicode data files and creates
+$lm  a C header file that is included by genpname.  The header
+$lm  file matches constants defined in the ICU4C headers with
+$lm  property|value aliases in the Unicode data files.
+
+Usage: $me <icu_dir> [<out_file>]
+
+<icu_dir>   ICU4C root directory, containing
+               source/common/unicode/uchar.h
+               source/common/unicode/uscript.h
+               source/data/unidata/Blocks.txt
+               source/data/unidata/PropertyAliases.txt
+               source/data/unidata/PropertyValueAliases.txt
+<out_file>  File name of header to be written;
+            default is 'data.h'.
+
+The Unicode versions of all input files must match.
+END
+    exit(1);
+}
+
+my ($h, $version) = readAndMerge($HEADER_DIR, $UNIDATA_DIR);
+
+if ($DEBUG) {
+    print "Merged hash:\n";
+    for my $key (sort keys %$h) {
+        my $hh = $h->{$key};
+        for my $subkey (sort keys %$hh) {
+            print "$key:$subkey:", $hh->{$subkey}, "\n";
+        }
+    }
+}
+
+my $out = new FileHandle($OUT_FILE, 'w');
+die "Error: Can't write to $OUT_FILE: $!" unless (defined $out);
+my $save = select($out);
+formatData($h, $version);
+select($save);
+$out->close();
+
+exit(0);
+
+#----------------------------------------------------------------------
+# From PropList.html: "The properties of the form Other_XXX
+# are used to generate properties in DerivedCoreProperties.txt.
+# They are not intended for general use, such as in APIs that
+# return property values.
+# Non_Break is not a valid property as of 3.2.
+sub isIgnoredProperty {
+    local $_ = shift;
+    /^Other_/i || /^Non_Break$/i;
+}
+
+# 'qc' is a pseudo-property matching any quick-check property
+# see PropertyValueAliases.txt file comments.  'binprop' is
+# a synthetic binary value alias "True"/"False", not present
+# in PropertyValueAliases.txt until Unicode 5.0.
+# Starting with Unicode 5.1, PropertyValueAliases.txt does have
+# explicit values for binary properties.
+sub isPseudoProperty {
+    $_[0] eq 'qc' ||
+        $_[0] eq 'binprop';
+}
+
+#----------------------------------------------------------------------
+# Emit the combined data from headers and the Unicode database as a
+# C source code header file.
+#
+# @param ref to hash with the data
+# @param Unicode version, as a string
+sub formatData {
+    my $h = shift;
+    my $version = shift;
+
+    my $date = scalar localtime();
+    print <<"END";
+/**
+ * Copyright (C) 2002-$YEAR, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ *
+ * MACHINE GENERATED FILE.  !!! Do not edit manually !!!
+ *
+ * Generated from
+ *   uchar.h
+ *   uscript.h
+ *   Blocks.txt
+ *   PropertyAliases.txt
+ *   PropertyValueAliases.txt
+ *
+ * Date: $date
+ * Unicode version: $version
+ * Script: $0
+ */
+
+END
+
+    #------------------------------------------------------------
+    # Emit Unicode version
+    print "/* Unicode version $version */\n";
+    my @v = split(/\./, $version);
+    push @v, '0' while (@v < 4);
+    for (my $i=0; $i<@v; ++$i) {
+        print "const uint8_t VERSION_$i = $v[$i];\n";
+    }
+    print "\n";
+
+    #------------------------------------------------------------
+    # Emit String table
+    # [A table of all identifiers, that is, all long or short property
+    # or value names.  The list need NOT be sorted; it will be sorted
+    # by the C program.  Strings are referenced by their index into
+    # this table.  After sorting, a REMAP[] array is used to map the
+    # old position indices to the new positions.]
+    my %strings;
+    for my $prop (sort keys %$h) {
+        my $hh = $h->{$prop};
+        for my $enum (sort keys %$hh) {
+            my @a = split(/\|/, $hh->{$enum});
+            for (@a) {
+                $strings{$_} = 1 if (length($_));
+            }
+        }
+    }
+    my @strings = sort keys %strings;
+    unshift @strings, "";
+
+    print "const int32_t STRING_COUNT = ", scalar @strings, ";\n\n"; 
+
+    # while printing, create a mapping hash from string table entry to index
+    my %stringToID;
+    print "/* to be sorted */\n";
+    print "const $STRING_CLASS STRING_TABLE[] = {\n";
+    for (my $i=0; $i<@strings; ++$i) {
+        print "    $STRING_CLASS(\"$strings[$i]\", $i),\n";
+        $stringToID{$strings[$i]} = $i;
+    }
+    print "};\n\n";
+
+    # placeholder for the remapping index.  this is used to map
+    # indices that we compute here to indices of the sorted
+    # STRING_TABLE.  STRING_TABLE will be sorted by the C++ program
+    # using the uprv_comparePropertyNames() function.  this will
+    # reshuffle the order.  we then use the indices (passed to the
+    # String constructor) to create a REMAP[] array.
+    print "/* to be filled in */\n";
+    print "int32_t REMAP[", scalar @strings, "];\n\n";
+    
+    #------------------------------------------------------------
+    # Emit the name group table
+    # [A table of name groups.  A name group is one or more names
+    # for a property or property value.  The Unicode data files specify
+    # that there may be more than 2, although as of Unicode 3.2 there
+    # are at most 2.  The name group table looks like this:
+    #
+    #  114, -115, 116, -117, 0, -118, 65, -64, ...
+    #  [0]        [2]        [4]      [6]
+    #
+    # The entry at [0] consists of 2 strings, 114 and 115.
+    # The entry at [2] consists of 116 and 117.  The entry at
+    # [4] is one string, 118.  There is always at least one
+    # string; typically there are two.  If there are two, the first
+    # is the SHORT name and the second is the LONG.  If there is
+    # one, then the missing entry (always the short name, in 3.2)
+    # is zero, which is by definition the index of "".  The
+    # 'preferred' name will generally be the LONG name, if there are
+    # more than 2 entries.  The last entry is negative.
+
+    # Build name group list and replace string refs with nameGroup indices
+    my @nameGroups;
+    
+    # Check for duplicate name groups, and reuse them if possible
+    my %groupToInt; # Map group strings to ints
+    for my $prop (sort keys %$h) {
+        my $hh = $h->{$prop};
+        for my $enum (sort keys %$hh) {
+            my $groupString = $hh->{$enum};
+            my $i;
+            if (exists $groupToInt{$groupString}) {
+                $i = $groupToInt{$groupString};
+            } else {
+                my @names = split(/\|/, $groupString);
+                die "Error: Wrong number of names in " . $groupString if (@names < 1);
+                $i = @nameGroups; # index of group we are making 
+                $groupToInt{$groupString} = $i; # Cache for reuse
+                push @nameGroups, map { $stringToID{$_} } @names;
+                $nameGroups[$#nameGroups] = -$nameGroups[$#nameGroups]; # mark end
+            }
+            # now, replace string list with ref to name group
+            $hh->{$enum} = $i;
+        }
+    }
+
+    print "const int32_t NAME_GROUP_COUNT = ",
+          scalar @nameGroups, ";\n\n";
+
+    print "int32_t NAME_GROUP[] = {\n";
+    # emit one group per line, with annotations
+    my $max_names = 0;
+    for (my $i=0; $i<@nameGroups; ) {
+        my @a;
+        my $line;
+        my $start = $i;
+        for (;;) {
+            my $j = $nameGroups[$i++];
+            $line .= "$j, ";
+            push @a, abs($j);
+            last if ($j < 0);
+        }
+        print "    ",
+              $line,
+              ' 'x(20-length($line)),
+              "/* ", sprintf("%3d", $start),
+              ": \"", join("\", \"", map { $strings[$_] } @a), "\" */\n";
+        $max_names = @a if(@a > $max_names);
+          
+    }
+    print "};\n\n";
+    
+    # This is fixed for 3.2 at "2" but should be calculated dynamically
+    # when more than 2 names appear in Property[Value]Aliases.txt.
+    print "#define MAX_NAMES_PER_GROUP $max_names\n\n";
+
+    #------------------------------------------------------------
+    # Emit enumerated property values
+    for my $prop (sort keys %$h) {
+        next if ($prop =~ /^_/);
+        my $vh = $h->{$prop};
+        my $count = scalar keys %$vh;
+
+        print "const int32_t VALUES_${prop}_COUNT = ",
+              $count, ";\n\n";
+        
+        print "const $ALIAS_CLASS VALUES_${prop}\[] = {\n";
+        for my $enum (sort keys %$vh) {
+            #my @names = split(/\|/, $vh->{$enum});
+            #die "Error: Wrong number of names for $prop:$enum in [" . join(",", @names) . "]"
+            #    if (@names != 2);
+            print "    $ALIAS_CLASS((int32_t) $enum, ", $vh->{$enum}, "),\n";
+                  #$stringToID{$names[0]}, ", ",
+                  #$stringToID{$names[1]}, "),\n";
+            #      "\"", $names[0], "\", ",
+            #      "\"", $names[1], "\"),\n";
+        }
+        print "};\n\n";
+    }
+
+    #------------------------------------------------------------
+    # Emit top-level properties (binary, enumerated, etc.)
+    for my $topName (sort keys %TOP_PROPS) {
+        my $a = $TOP_PROPS{$topName};
+        my $count = 0;
+        for my $type (@$a) { # "_bp", "_ep", etc.
+            $count += scalar keys %{$h->{$type}};
+        }
+
+        print "const int32_t ${topName}PROPERTY_COUNT = $count;\n\n";
+        
+        print "const $PROPERTY_CLASS ${topName}PROPERTY[] = {\n";
+
+        for my $type (@$a) { # "_bp", "_ep", etc.
+            my $p = $h->{$type};
+
+            for my $enum (sort keys %$p) {
+                my $name = $strings[$nameGroups[$p->{$enum}]];
+            
+                my $valueRef = "0, NULL";
+                if ($type eq '_bp') {
+                    $valueRef = "VALUES_binprop_COUNT, VALUES_binprop";
+                }
+                elsif (exists $h->{$name}) {
+                    $valueRef = "VALUES_${name}_COUNT, VALUES_$name";
+                }
+                
+                print "    $PROPERTY_CLASS((int32_t) $enum, ",
+                      $p->{$enum}, ", $valueRef),\n";
+            }
+        }
+        print "};\n\n";
+    }
+
+    print "/*eof*/\n";
+}
+
+#----------------------------------------------------------------------
+# Read in the files uchar.h, uscript.h, Blocks.txt,
+# PropertyAliases.txt, and PropertyValueAliases.txt,
+# and combine them into one hash.
+#
+# @param directory containing headers
+# @param directory containin Unicode data files
+#
+# @return hash ref, Unicode version
+sub readAndMerge {
+
+    my ($headerDir, $unidataDir) = @_;
+
+    my $h = read_uchar("$headerDir/uchar.h");
+    my $s = read_uscript("$headerDir/uscript.h");
+    my $b = read_Blocks("$unidataDir/Blocks.txt");
+    my $pa = {};
+    read_PropertyAliases($pa, "$unidataDir/PropertyAliases.txt");
+    read_PropertyAliases($pa, "SyntheticPropertyAliases.txt");
+    my $va = {};
+    read_PropertyValueAliases($va, "$unidataDir/PropertyValueAliases.txt");
+    read_PropertyValueAliases($va, "SyntheticPropertyValueAliases.txt");
+    
+    # Extract property family hash
+    my $fam = $pa->{'_family'};
+    delete $pa->{'_family'};
+    
+    # Note: uscript.h has no version string, so don't check it
+    my $version = check_versions([ 'uchar.h', $h ],
+                                 [ 'Blocks.txt', $b ],
+                                 [ 'PropertyAliases.txt', $pa ],
+                                 [ 'PropertyValueAliases.txt', $va ]);
+    
+    # Do this BEFORE merging; merging modifies the hashes
+    check_PropertyValueAliases($pa, $va);
+    
+    # Dump out the $va hash for debugging
+    if ($DEBUG) {
+        print "Property values hash:\n";
+        for my $key (sort keys %$va) {
+            my $hh = $va->{$key};
+            for my $subkey (sort keys %$hh) {
+                print "$key:$subkey:", $hh->{$subkey}, "\n";
+            }
+        }
+    }
+    
+    # Dump out the $s hash for debugging
+    if ($DEBUG) {
+        print "Script hash:\n";
+        for my $key (sort keys %$s) {
+            print "$key:", $s->{$key}, "\n";
+        }
+    }
+    
+    # Link in the script data
+    $h->{'sc'} = $s;
+    
+    merge_Blocks($h, $b);
+    
+    merge_PropertyAliases($h, $pa, $fam);
+    
+    merge_PropertyValueAliases($h, $va);
+    
+    ($h, $version);
+}
+
+#----------------------------------------------------------------------
+# Ensure that the version strings in the given hashes (under the key
+# '_version') are compatible.  Currently this means they must be
+# identical, with the exception that "X.Y" will match "X.Y.0".
+# All hashes must define the key '_version'.
+#
+# @param a list of pairs of (file name, hash reference)
+#
+# @return the version of all the hashes.  Upon return, the '_version'
+# will be removed from all hashes.
+sub check_versions {
+    my $version = '';
+    my $msg = '';
+    foreach my $a (@_) {
+        my $name = $a->[0];
+        my $h    = $a->[1];
+        die "Error: No version found" unless (exists $h->{'_version'});
+        my $v = $h->{'_version'};
+        delete $h->{'_version'};
+
+        # append ".0" if necessary, to standardize to X.Y.Z
+        $v .= '.0' unless ($v =~ /\.\d+\./);
+        $v .= '.0' unless ($v =~ /\.\d+\./);
+        $msg .= "$name = $v\n";
+        if ($version) {
+            die "Error: Mismatched Unicode versions\n$msg"
+                unless ($version eq $v);
+        } else {
+            $version = $v;
+        }
+    }
+    $version;
+}
+
+#----------------------------------------------------------------------
+# Make sure the property names in PropertyValueAliases.txt match those
+# in PropertyAliases.txt.
+#
+# @param a hash ref from read_PropertyAliases.
+# @param a hash ref from read_PropertyValueAliases.
+sub check_PropertyValueAliases {
+    my ($pa, $va) = @_;
+
+    # make a reverse hash of short->long
+    my %rev;
+    for (keys %$pa) { $rev{$pa->{$_}} = $_; }
+    
+    for my $prop (keys %$va) {
+        if (!exists $rev{$prop} && !isPseudoProperty($prop)) {
+            print "Warning: Property $prop from PropertyValueAliases not listed in PropertyAliases\n";
+        }
+    }
+}
+
+#----------------------------------------------------------------------
+# Merge blocks data into uchar.h enum data.  In the 'blk' subhash all
+# code point values, as returned from read_uchar, are replaced by
+# block names, as read from Blocks.txt and returned by read_Blocks.
+# The match must be 1-to-1.  If there is any failure of 1-to-1
+# mapping, an error is signaled.  Upon return, the read_Blocks hash
+# is emptied of all contents, except for those that failed to match.
+#
+# The mapping in the 'blk' subhash, after this function returns, is
+# from uchar.h enum name, e.g. "UBLOCK_BASIC_LATIN", to Blocks.h
+# pseudo-name, e.g. "Basic Latin".
+#
+# @param a hash ref from read_uchar.
+# @param a hash ref from read_Blocks.
+sub merge_Blocks {
+    my ($h, $b) = @_;
+
+    die "Error: No blocks data in uchar.h"
+        unless (exists $h->{'blk'});
+    my $blk = $h->{'blk'};
+    for my $enum (keys %$blk) {
+        my $cp = $blk->{$enum};
+        if ($cp && !exists $b->{$cp}) {
+            die "Error: No block found at $cp in Blocks.txt";
+        }
+        # Convert code point to pseudo-name:
+        $blk->{$enum} = $b->{$cp};
+        delete $b->{$cp};
+    }
+    my $err = '';
+    for my $cp (keys %$b) {
+        $err .= "Error: Block " . $b->{$cp} . " not listed in uchar.h\n";
+    }
+    die $err if ($err);
+}
+
+#----------------------------------------------------------------------
+# Merge property alias names into the uchar.h hash.  The subhashes
+# under the keys _* (b(inary, e(numerated, s(tring, d(ouble) are
+# examined and the values of those subhashes are assumed to be long
+# names in PropertyAliases.txt.  They are validated and replaced by
+# "<short>|<long>".  Upon return, the read_PropertyAliases hash is
+# emptied of all contents, except for those that failed to match.
+# Unmatched names in PropertyAliases are listed as a warning but do
+# NOT cause the script to die.
+#
+# @param a hash ref from read_uchar.
+# @param a hash ref from read_PropertyAliases.
+# @param a hash mapping long names to property family (e.g., 'binary')
+sub merge_PropertyAliases {
+    my ($h, $pa, $fam) = @_;
+
+    for my $k (@TOP) {
+        die "Error: No properties data for $k in uchar.h"
+            unless (exists $h->{$k});
+    }
+
+    for my $subh (map { $h->{$_} } @TOP) {
+        for my $enum (keys %$subh) {
+            my $long_name = $subh->{$enum};
+            if (!exists $pa->{$long_name}) {
+                die "Error: Property $long_name not found (or used more than once)";
+            }
+
+            my $value;
+            if($pa->{$long_name} =~ m|^n/a\d*$|) {
+                # replace an "n/a" short name with an empty name (nothing before "|");
+                # don't remove it (don't remove the "|"): there must always be a long name,
+                # and if the short name is removed, then the long name becomes the
+                # short name and there is no long name left (unless there is another alias)
+                $value = "|" . $long_name;
+            } else {
+                $value = $pa->{$long_name} . "|" . $long_name;
+            }
+            if (exists $additional_property_aliases{$long_name}) {
+                $value .= "|" . $additional_property_aliases{$long_name};
+            }
+            $subh->{$enum} = $value;
+            delete $pa->{$long_name};
+        }
+    }
+
+    my @err;
+    for my $name (keys %$pa) {
+        $MISSING_FROM_UCHAR{$pa->{$name}} = 1;
+        if (exists $UNSUPPORTED{$name}) {
+            push @err, "Info: No enum for " . $fam->{$name} . " property $name in uchar.h";
+        } elsif (!isIgnoredProperty($name)) {
+            push @err, "Warning: No enum for " . $fam->{$name} . " property $name in uchar.h";
+        }
+    }
+    print join("\n", sort @err), "\n" if (@err);
+}
+
+#----------------------------------------------------------------------
+# Return 1 if two names match ignoring whitespace, '-', and '_'.
+# Used to match names in Blocks.txt with those in PropertyValueAliases.txt
+# as of Unicode 4.0.
+sub matchesLoosely {
+    my ($a, $b) = @_;
+    $a =~ s/[\s\-_]//g;
+    $b =~ s/[\s\-_]//g;
+    $a =~ /^$b$/i;
+}
+
+#----------------------------------------------------------------------
+# Merge PropertyValueAliases.txt data into the uchar.h hash.  All
+# properties other than blk, _bp, and _ep are analyzed and mapped to
+# the names listed in PropertyValueAliases.  They are then replaced
+# with a string of the form "<short>|<long>".  The short or long name
+# may be missing.
+#
+# @param a hash ref from read_uchar.
+# @param a hash ref from read_PropertyValueAliases.
+sub merge_PropertyValueAliases {
+    my ($h, $va) = @_;
+
+    my %gcCount;
+    for my $prop (keys %$h) {
+        # _bp, _ep handled in merge_PropertyAliases
+        next if ($prop =~ /^_/);
+
+        # Special case: gcm
+        my $prop2 = ($prop eq 'gcm') ? 'gc' : $prop;
+
+        # find corresponding PropertyValueAliases data
+        die "Error: Can't find $prop in PropertyValueAliases.txt"
+            unless (exists $va->{$prop2});
+        my $pva = $va->{$prop2};
+
+        # match up data
+        my $hh = $h->{$prop};
+        for my $enum (keys %$hh) {
+
+            my $name = $hh->{$enum};
+
+            # look up both long and short & ignore case
+            my $n;
+            if (exists $pva->{$name}) {
+                $n = $name; 
+            } else {
+                # iterate (slow)
+iterateAliases:
+                for my $a (keys %$pva) {
+                    # case-insensitive match
+                    # & case-insensitive reverse match
+                    if ($a =~ /^$name$/i) {
+                        $n = $a;
+                        last;
+                    } else {
+                        my @aliases = split(/\|/, $pva->{$a});
+                        for (@aliases) {
+                            if (/^$name$/i) {
+                                $n = $a;
+                                last iterateAliases;
+                            }
+                        }
+                    }
+                }
+            }
+
+            # For blocks, do a loose match from Blocks.txt pseudo-name
+            # to PropertyValueAliases long name.
+            if (!$n && $prop eq 'blk') {
+                for my $a (keys %$pva) {
+                    # The block is only going to match the long name,
+                    # but we check both for completeness.  As of Unicode
+                    # 4.0, blocks do not have short names.
+                    if (matchesLoosely($name, $pva->{$a}) ||
+                        matchesLoosely($name, $a)) {
+                        $n = $a;
+                        last;
+                    }
+                }
+            }
+
+            die "Error: Property value $prop:$name not found" unless ($n);
+
+            my $l = $n;
+            my $r = $pva->{$n};
+            # convert |n/a\d*| to blank
+            $l = '' if ($l =~ m|^n/a\d*$|);
+            $r = '' if ($r =~ m|^n/a\d*$|);
+
+            $hh->{$enum} = "$l|$r";
+            # Don't delete the 'gc' properties because we need to share
+            # them between 'gc' and 'gcm'.  Count each use instead.
+            if ($prop2 eq 'gc') {
+                ++$gcCount{$n};
+            } else {
+                delete $pva->{$n};
+            }
+        }
+    }
+
+    # Merge the combining class values in manually
+    # Add the same values to the synthetic lccc and tccc properties
+    die "Error: No ccc data"
+        unless exists $va->{'ccc'};
+    for my $ccc (keys %{$va->{'ccc'}}) {
+        die "Error: Can't overwrite ccc $ccc"
+            if (exists $h->{'ccc'}->{$ccc});
+        $h->{'lccc'}->{$ccc} =
+        $h->{'tccc'}->{$ccc} =
+        $h->{'ccc'}->{$ccc} = $va->{'ccc'}->{$ccc};
+    }
+    delete $va->{'ccc'};
+
+    # Merge synthetic binary property values in manually.
+    # These are the "True" and "False" value aliases.
+    die "Error: No True/False value aliases"
+        unless exists $va->{'binprop'};
+    for my $bp (keys %{$va->{'binprop'}}) {
+        $h->{'binprop'}->{$bp} = $va->{'binprop'}->{$bp};
+    }
+    delete $va->{'binprop'};
+
+    my $err = '';
+    for my $prop (sort keys %$va) {
+        my $hh = $va->{$prop};
+        for my $subkey (sort keys %$hh) {
+            # 'gc' props are shared with 'gcm'; make sure they were used
+            # once or twice.
+            if ($prop eq 'gc') {
+                my $n = $gcCount{$subkey};
+                next if ($n >= 1 && $n <= 2);
+            }
+            $err .= "Warning: Enum for value $prop:$subkey not found in uchar.h\n"
+                unless exists $MISSING_FROM_UCHAR{$prop};
+        }
+    }
+    print $err if ($err);
+}
+
+#----------------------------------------------------------------------
+# Read the PropertyAliases.txt file.  Return a hash that maps the long
+# name to the short name.  The special key '_version' will map to the
+# Unicode version of the file.  The special key '_family' holds a
+# subhash that maps long names to a family string, for descriptive
+# purposes.
+#
+# @param a filename for PropertyAliases.txt
+# @param reference to hash to receive data.  Keys are long names.
+# Values are short names.
+sub read_PropertyAliases {
+
+    my $hash = shift;         # result
+
+    my $filename = shift; 
+
+    my $fam = {};  # map long names to family string
+    $fam = $hash->{'_family'} if (exists $hash->{'_family'});
+
+    my $family; # binary, enumerated, etc.
+
+    my $in = new FileHandle($filename, 'r');
+    die "Error: Cannot open $filename" if (!defined $in);
+
+    while (<$in>) {
+
+        # Read version (embedded in a comment)
+        if (/PropertyAliases-(\d+\.\d+\.\d+)/i) {
+            die "Error: Multiple versions in $filename"
+                if (exists $hash->{'_version'});
+            $hash->{'_version'} = $1;
+        }
+
+        # Read family heading
+        if (/^\s*\#\s*(.+?)\s*Properties\s*$/) {
+            $family = $1;
+        }
+
+        # Ignore comments and blank lines
+        s/\#.*//;
+        next unless (/\S/);
+
+        if (/^\s*(.+?)\s*;/) {
+            my $short = $1;
+            my @fields = /;\s*([^\s;]+)/g;
+            if (@fields < 1) {
+                my $number = @fields;
+                die "Error: Wrong number of fields ($number) in $filename at $_";
+            }
+
+            # Make "n/a" strings unique
+            if ($short eq 'n/a') {
+                $short .= sprintf("%03d", $propNA++);
+            }
+            my $long = $fields[0];
+            if ($long eq 'n/a') {
+                $long .= sprintf("%03d", $propNA++);
+            }
+
+            # Add long name->short name to the hash=pa hash table
+            if (exists $hash->{$long}) {
+                die "Error: Duplicate property $long in $filename"
+            }
+            $hash->{$long} = $short;
+            $fam->{$long} = $family;
+
+            # Add the list of further aliases to the additional_property_aliases hash table,
+            # using the long property name as the key.
+            # For example:
+            #   White_Space->space|outer_space
+            if (@fields > 1) {
+                my $value = pop @fields;
+                while (@fields > 1) {
+                    $value .= "|" . pop @fields;
+                }
+                $additional_property_aliases{$long} = $value;
+            }
+        } else {
+            die "Error: Can't parse $_ in $filename";
+        }
+    }
+
+    $in->close();
+
+    $hash->{'_family'} = $fam;
+}
+
+#----------------------------------------------------------------------
+# Read the PropertyValueAliases.txt file.  Return a two level hash
+# that maps property_short_name:value_short_name:value_long_name.  In
+# the case of the 'ccc' property, the short name is the numeric class
+# and the long name is "<short>|<long>".  The special key '_version'
+# will map to the Unicode version of the file.
+#
+# @param a filename for PropertyValueAliases.txt
+#
+# @return a hash reference.
+sub read_PropertyValueAliases {
+
+    my $hash = shift;         # result
+
+    my $filename = shift; 
+
+    my $in = new FileHandle($filename, 'r');
+    die "Error: Cannot open $filename" if (!defined $in);
+
+    while (<$in>) {
+
+        # Read version (embedded in a comment)
+        if (/PropertyValueAliases-(\d+\.\d+\.\d+)/i) {
+            die "Error: Multiple versions in $filename"
+                if (exists $hash->{'_version'});
+            $hash->{'_version'} = $1;
+        }
+
+        # Ignore comments and blank lines
+        s/\#.*//;
+        next unless (/\S/);
+
+        if (/^\s*(.+?)\s*;/i) {
+            my $prop = $1;
+            my @fields = /;\s*([^\s;]+)/g;
+            die "Error: Wrong number of fields in $filename"
+                if (@fields < 2 || @fields > 5);
+            # Make "n/a" strings unique
+            $fields[0] .= sprintf("%03d", $valueNA++) if ($fields[0] eq 'n/a');
+            # Squash extra fields together
+            while (@fields > 2) {
+                my $f = pop @fields;
+                $fields[$#fields] .= '|' . $f;
+            }
+            addDatum($hash, $prop, @fields);
+        }
+
+        else {
+            die "Error: Can't parse $_ in $filename";
+        }
+    }
+
+    $in->close();
+
+    # Script Copt=Qaac (Coptic) is a special case.
+    # Before the Copt code was defined, the private-use code Qaac was used.
+    # Starting with Unicode 4.1, PropertyValueAliases.txt contains
+    # Copt as the short name as well as Qaac as an alias.
+    # For use with older Unicode data files, we add here a Qaac->Coptic entry.
+    # This should not do anything for 4.1-and-later Unicode data files.
+    # See also UAX #24: Script Names http://www.unicode.org/unicode/reports/tr24/
+    $hash->{'sc'}->{'Qaac'} = 'Coptic'
+        unless (exists $hash->{'sc'}->{'Qaac'} || exists $hash->{'sc'}->{'Copt'});
+
+    # Add N|No|T|True and Y|Yes|F|False -- these are values we recognize for
+    # binary properties (until Unicode 5.0 NOT from PropertyValueAliases.txt).
+    # These are of the same form as the 'ccc' value aliases.
+    # Starting with Unicode 5.1, PropertyValueAliases.txt does have values
+    # for binary properties.
+    if (!exists $hash->{'binprop'}->{'0'}) {
+        if (exists $hash->{'Alpha'}->{'N'}) {
+            # Unicode 5.1 and later: Make the numeric value the key.
+            $hash->{'binprop'}->{'0'} = 'N|' . $hash->{'Alpha'}->{'N'};
+            $hash->{'binprop'}->{'1'} = 'Y|' . $hash->{'Alpha'}->{'Y'};
+        } elsif (exists $hash->{'Alpha'}) {
+            die "Error: Unrecognized short value name for binary property 'Alpha'\n";
+        } else {
+            # Unicode 5.0 and earlier: Add manually.
+            $hash->{'binprop'}->{'0'} = 'N|No|F|False';
+            $hash->{'binprop'}->{'1'} = 'Y|Yes|T|True';
+        }
+    }
+}
+
+#----------------------------------------------------------------------
+# Read the Blocks.txt file.  Return a hash that maps the code point
+# range start to the block name.  The special key '_version' will map
+# to the Unicode version of the file.
+#
+# As of Unicode 4.0, the names in the Blocks.txt are no longer the
+# proper names.  The proper names are now listed in PropertyValueAliases.
+# They are similar but not identical.  Furthermore, 4.0 introduces
+# a new block name, No_Block, which is listed only in PropertyValueAliases
+# and not in Blocks.txt.  As a result, we handle blocks as follows:
+#
+# 1. Read Blocks.txt to map code point range start to quasi-block name.
+# 2. Add to Blocks.txt a synthetic No Block code point & name:
+#    X -> No Block
+# 3. Map quasi-names from Blocks.txt (including No Block) to actual
+#    names from PropertyValueAliases.  This occurs in
+#    merge_PropertyValueAliases.
+#
+# @param a filename for Blocks.txt
+#
+# @return a ref to a hash.  Keys are code points, as text, e.g.,
+# "1720".  Values are pseudo-block names, e.g., "Hanunoo".
+sub read_Blocks {
+
+    my $filename = shift; 
+
+    my $hash = {};         # result
+
+    my $in = new FileHandle($filename, 'r');
+    die "Error: Cannot open $filename" if (!defined $in);
+
+    while (<$in>) {
+
+        # Read version (embedded in a comment)
+        if (/Blocks-(\d+\.\d+\.\d+)/i) {
+            die "Error: Multiple versions in $filename"
+                if (exists $hash->{'_version'});
+            $hash->{'_version'} = $1;
+        }
+
+        # Ignore comments and blank lines
+        s/\#.*//;
+        next unless (/\S/);
+
+        if (/^([0-9a-f]+)\.\.[0-9a-f]+\s*;\s*(.+?)\s*$/i) {
+            die "Error: Duplicate range $1 in $filename"
+                if (exists $hash->{$1});
+            $hash->{$1} = $2;
+        }
+
+        else {
+            die "Error: Can't parse $_ in $filename";
+        }
+    }
+
+    $in->close();
+
+    # Add pseudo-name for No Block
+    $hash->{'none'} = 'No Block';
+
+    $hash;
+}
+
+#----------------------------------------------------------------------
+# Read the uscript.h file and compile a mapping of Unicode symbols to
+# icu4c enum values.
+#
+# @param a filename for uscript.h
+#
+# @return a ref to a hash.  The keys of the hash are enum symbols from
+# uscript.h, and the values are script names.
+sub read_uscript {
+
+    my $filename = shift; 
+
+    my $mode = '';         # state machine mode and submode
+    my $submode = '';
+
+    my $last = '';         # for line folding
+
+    my $hash = {};         # result
+    my $key;               # first-level key
+
+    my $in = new FileHandle($filename, 'r');
+    die "Error: Cannot open $filename" if (!defined $in);
+
+    while (<$in>) {
+        # Fold continued lines together
+        if (/^(.*)\\$/) {
+            $last = $1;
+            next;
+        } elsif ($last) {
+            $_ = $last . $_;
+            $last = '';
+        }
+
+        # Exit all modes here
+        if ($mode && $mode ne 'DEPRECATED') {
+            if (/^\s*\}/) {
+                $mode = '';
+                next;
+            }
+        }
+
+        # Handle individual modes
+
+        if ($mode eq 'UScriptCode') {
+            if (m|^\s*(USCRIPT_\w+).+?/\*\s*(\w+)|) {
+                my ($enum, $code) = ($1, $2);
+                die "Error: Duplicate script $enum"
+                    if (exists $hash->{$enum});
+                $hash->{$enum} = $code;
+            }
+        }
+
+        elsif ($mode eq 'DEPRECATED') {
+            if (/\s*\#ifdef/) {
+                die "Error: Nested #ifdef";
+                }
+            elsif (/\s*\#endif/) {
+                $mode = '';
+            }
+        }
+
+        elsif (!$mode) {
+            if (/^\s*typedef\s+enum\s+(\w+)\s*\{/ ||
+                   /^\s*typedef\s+enum\s+(\w+)\s*$/) {
+                $mode = $1;
+                #print "Parsing $mode\n";
+            }
+
+            elsif (/^\s*\#ifdef\s+ICU_UCHAR_USE_DEPRECATES\b/) {
+                $mode = 'DEPRECATED';
+            }
+        }
+    }
+
+    $in->close();
+
+    $hash;
+}
+
+#----------------------------------------------------------------------
+# Read the uchar.h file and compile a mapping of Unicode symbols to
+# icu4c enum values.
+#
+# @param a filename for uchar.h
+#
+# @return a ref to a hash.  The keys of the hash are '_bp' for binary
+# properties, '_ep' for enumerated properties, '_dp'/'_sp'/'_op' for
+# double/string/mask properties, and 'gc', 'gcm', 'bc', 'blk',
+# 'ea', 'dt', 'jt', 'jg', 'lb', or 'nt' for corresponding property
+# value aliases.  The values of the hash are subhashes.  The subhashes
+# have a key of the uchar.h enum symbol, and a value of the alias
+# string (as listed in PropertyValueAliases.txt).  NOTE: The alias
+# string is whatever alias uchar.h lists.  This may be either short or
+# long, depending on the specific enum.  NOTE: For blocks ('blk'), the
+# value is a hex code point for the start of the associated block.
+# NOTE: The special key _version will map to the Unicode version of
+# the file.
+sub read_uchar {
+
+    my $filename = shift; 
+
+    my $mode = '';         # state machine mode and submode
+    my $submode = '';
+
+    my $last = '';         # for line folding
+
+    my $hash = {};         # result
+    my $key;               # first-level key
+
+    my $in = new FileHandle($filename, 'r');
+    die "Error: Cannot open $filename" if (!defined $in);
+
+    while (<$in>) {
+        # Fold continued lines together
+        if (/^(.*)\\$/) {
+            $last .= $1;
+            next;
+        } elsif ($last) {
+            $_ = $last . $_;
+            $last = '';
+        }
+
+        # Exit all modes here
+        if ($mode && $mode ne 'DEPRECATED') {
+            if (/^\s*\}/) {
+                $mode = '';
+                next;
+            }
+        }
+
+        # Handle individual modes
+
+        if ($mode eq 'UProperty') {
+            if (/^\s*(UCHAR_\w+)\s*[,=]/ || /^\s+(UCHAR_\w+)\s*$/) {
+                if ($submode) {
+                    addDatum($hash, $key, $1, $submode);
+                    $submode = '';
+                } else {
+                    #print "Warning: Ignoring $1\n";
+                }
+            }
+
+            elsif (m|^\s*/\*\*\s*(\w+)\s+property\s+(\w+)|i) {
+                die "Error: Unmatched tag $submode" if ($submode);
+                if (exists $PROP_TYPE{$1}) {
+                    $key = $PROP_TYPE{$1};
+                } else {
+                    $key = $PROP_TYPE{"Other"};
+                }
+                $submode = $2;
+            }
+        }
+
+        elsif ($mode eq 'UCharCategory') {
+            if (/^\s*(U_\w+)\s*=/) {
+                if ($submode) {
+                    addDatum($hash, 'gc', $1, $submode);
+                    $submode = '';
+                } else {
+                    #print "Warning: Ignoring $1\n";
+                }
+            }
+
+            elsif (m|^\s*/\*\*\s*([A-Z][a-z])\s|) {
+                die "Error: Unmatched tag $submode" if ($submode);
+                $submode = $1;
+            }
+        }
+
+        elsif ($mode eq 'UCharDirection') {
+            if (/^\s*(U_\w+)\s*[,=]/ || /^\s+(U_\w+)\s*$/) {
+                if ($submode) {
+                    addDatum($hash, $key, $1, $submode);
+                    $submode = '';
+                } else {
+                    #print "Warning: Ignoring $1\n";
+                }
+            }
+
+            elsif (m|/\*\*\s*([A-Z]+)\s|) {
+                die "Error: Unmatched tag $submode" if ($submode);
+                $key = 'bc';
+                $submode = $1;
+            }
+        }
+
+        elsif ($mode eq 'UBlockCode') {
+            if (m|^\s*(UBLOCK_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'blk', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UEastAsianWidth') {
+            if (m|^\s*(U_EA_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'ea', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UDecompositionType') {
+            if (m|^\s*(U_DT_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'dt', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UJoiningType') {
+            if (m|^\s*(U_JT_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'jt', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UJoiningGroup') {
+            # Ignore aliases like U_JG_HAMZA_ON_HEH_GOAL=U_JG_TEH_MARBUTA_GOAL.
+            # (They have an = sign rather than a comma after the constant name.)
+            if (/^\s*(U_JG_(\w+))\s*,/) {
+                addDatum($hash, 'jg', $1, $2) unless ($2 eq 'COUNT');
+            }
+        }
+
+        elsif ($mode eq 'UGraphemeClusterBreak') {
+            if (m|^\s*(U_GCB_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'GCB', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UWordBreakValues') {
+            if (m|^\s*(U_WB_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'WB', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'USentenceBreak') {
+            if (m|^\s*(U_SB_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'SB', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'ULineBreak') {
+            if (m|^\s*(U_LB_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'lb', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UNumericType') {
+            if (m|^\s*(U_NT_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'nt', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'UHangulSyllableType') {
+            if (m|^\s*(U_HST_\w+).+?/\*\[(.+?)\]\*/|) {
+                addDatum($hash, 'hst', $1, $2);
+            }
+        }
+
+        elsif ($mode eq 'DEPRECATED') {
+            if (/\s*\#ifdef/) {
+                die "Error: Nested #ifdef";
+                }
+            elsif (/\s*\#endif/) {
+                $mode = '';
+            }
+        }
+
+        elsif (!$mode) {
+            if (/^\s*\#define\s+(\w+)\s+(.+)/) {
+                # #define $left $right
+                my ($left, $right) = ($1, $2);
+
+                if ($left eq 'U_UNICODE_VERSION') {
+                    my $version = $right;
+                    $version = $1 if ($version =~ /^\"(.*)\"/);
+                    # print "Unicode version: ", $version, "\n";
+                    die "Error: Multiple versions in $filename"
+                        if (defined $hash->{'_version'});
+                    $hash->{'_version'} = $version;
+                }
+
+                elsif ($left =~ /U_GC_(\w+?)_MASK/) {
+                    addDatum($hash, 'gcm', $left, $1);
+                }
+            }
+
+            elsif (/^\s*typedef\s+enum\s+(\w+)\s*\{/ ||
+                   /^\s*typedef\s+enum\s+(\w+)\s*$/) {
+                $mode = $1;
+                #print "Parsing $mode\n";
+            }
+
+            elsif (/^\s*enum\s+(\w+)\s*\{/ ||
+                   /^\s*enum\s+(\w+)\s*$/) {
+                $mode = $1;
+                #print "Parsing $mode\n";
+            }
+
+            elsif (/^\s*\#ifdef\s+ICU_UCHAR_USE_DEPRECATES\b/) {
+                $mode = 'DEPRECATED';
+            }
+        }
+    }
+
+    $in->close();
+
+    # hardcode known values for the normalization quick check properties
+    # see unorm.h for the UNormalizationCheckResult enum
+
+    addDatum($hash, 'NFC_QC', 'UNORM_NO',    'N');
+    addDatum($hash, 'NFC_QC', 'UNORM_YES',   'Y');
+    addDatum($hash, 'NFC_QC', 'UNORM_MAYBE', 'M');
+
+    addDatum($hash, 'NFKC_QC', 'UNORM_NO',    'N');
+    addDatum($hash, 'NFKC_QC', 'UNORM_YES',   'Y');
+    addDatum($hash, 'NFKC_QC', 'UNORM_MAYBE', 'M');
+
+    # no "maybe" values for NF[K]D
+
+    addDatum($hash, 'NFD_QC', 'UNORM_NO',    'N');
+    addDatum($hash, 'NFD_QC', 'UNORM_YES',   'Y');
+
+    addDatum($hash, 'NFKD_QC', 'UNORM_NO',    'N');
+    addDatum($hash, 'NFKD_QC', 'UNORM_YES',   'Y');
+
+    $hash;
+}
+
+#----------------------------------------------------------------------
+# Add a new value to a two-level hash.  That is, given a ref to
+# a hash, two keys, and a value, add $hash->{$key1}->{$key2} = $value.
+sub addDatum {
+    my ($h, $k1, $k2, $v) = @_;
+    if (exists $h->{$k1}->{$k2}) {
+        die "Error: $k1:$k2 already set to " .
+            $h->{$k1}->{$k2} . ", cannot set to " . $v;
+    }
+    $h->{$k1}->{$k2} = $v;
+}
+
+#eof
diff --git a/unicode/c/genprops/CMakeLists.txt b/unicode/c/genprops/CMakeLists.txt
new file mode 100644
index 0000000..bbf4854
--- /dev/null
+++ b/unicode/c/genprops/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(genprops genprops.cpp props2.cpp store.c)
+target_link_libraries(genprops icuuc icutu)
diff --git a/unicode/c/genprops/Makefile.in b/unicode/c/genprops/Makefile.in
new file mode 100644
index 0000000..2856edf
--- /dev/null
+++ b/unicode/c/genprops/Makefile.in
@@ -0,0 +1,97 @@
+## Makefile.in for ICU - tools/genprops
+## Copyright (c) 1999-2005, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Steven R. Loomis
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/genprops
+
+TARGET_STUB_NAME = genprops
+
+SECTION = 8
+
+#MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = genprops.o props2.o store.o
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+#	$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+#	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
+install-man: $(MAN_FILES)
+#	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+#	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) 
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/genprops/genprops.cpp b/unicode/c/genprops/genprops.cpp
new file mode 100644
index 0000000..b72dd6a
--- /dev/null
+++ b/unicode/c/genprops/genprops.cpp
@@ -0,0 +1,592 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genprops.cpp
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 1999dec08
+*   created by: Markus W. Scherer
+*
+*   This program reads several of the Unicode character database text files,
+*   parses them, and extracts most of the properties for each character.
+*   It then writes a binary file containing the properties
+*   that is designed to be used directly for random-access to
+*   the properties of each Unicode character.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "unewdata.h"
+#include "uoptions.h"
+#include "uparse.h"
+#include "uprops.h"
+#include "propsvec.h"
+
+U_CDECL_BEGIN
+#include "genprops.h"
+U_CDECL_END
+
+#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_USE
+
+UBool beVerbose=FALSE, haveCopyright=TRUE;
+
+/* prototypes --------------------------------------------------------------- */
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode);
+
+/* -------------------------------------------------------------------------- */
+
+enum
+{
+    HELP_H,
+    HELP_QUESTION_MARK,
+    VERBOSE,
+    COPYRIGHT,
+    DESTDIR,
+    SOURCEDIR,
+    UNICODE_VERSION,
+    ICUDATADIR,
+    CSOURCE
+};
+
+/* Keep these values in sync with the above enums */
+static UOption options[]={
+    UOPTION_HELP_H,
+    UOPTION_HELP_QUESTION_MARK,
+    UOPTION_VERBOSE,
+    UOPTION_COPYRIGHT,
+    UOPTION_DESTDIR,
+    UOPTION_SOURCEDIR,
+    UOPTION_DEF("unicode", 'u', UOPT_REQUIRES_ARG),
+    UOPTION_ICUDATADIR,
+    UOPTION_DEF("csource", 'C', UOPT_NO_ARG)
+};
+
+extern int
+main(int argc, char* argv[]) {
+    char filename[300];
+    const char *srcDir=NULL, *destDir=NULL, *suffix=NULL;
+    char *basename=NULL;
+    UErrorCode errorCode=U_ZERO_ERROR;
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[DESTDIR].value=u_getDataDirectory();
+    options[SOURCEDIR].value="";
+    options[UNICODE_VERSION].value="";
+    options[ICUDATADIR].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+    if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) {
+        /*
+         * Broken into chucks because the C89 standard says the minimum
+         * required supported string length is 509 bytes.
+         */
+        fprintf(stderr,
+            "Usage: %s [-options] [suffix]\n"
+            "\n"
+            "read the UnicodeData.txt file and other Unicode properties files and\n"
+            "create a binary file " DATA_NAME "." DATA_TYPE " with the character properties\n"
+            "\n",
+            argv[0]);
+        fprintf(stderr,
+            "Options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-v or --verbose     verbose output\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-u or --unicode     Unicode version, followed by the version like 3.0.0\n"
+            "\t-C or --csource     generate a .c source file rather than the .icu binary\n");
+        fprintf(stderr,
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-s or --sourcedir   source directory, followed by the path\n"
+            "\t-i or --icudatadir  directory for locating any needed intermediate data files,\n"
+            "\t                    followed by path, defaults to %s\n"
+            "\tsuffix              suffix that is to be appended with a '-'\n"
+            "\t                    to the source file basenames before opening;\n"
+            "\t                    'genprops new' will read UnicodeData-new.txt etc.\n",
+            u_getDataDirectory());
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    beVerbose=options[VERBOSE].doesOccur;
+    haveCopyright=options[COPYRIGHT].doesOccur;
+    srcDir=options[SOURCEDIR].value;
+    destDir=options[DESTDIR].value;
+
+    if(argc>=2) {
+        suffix=argv[1];
+    } else {
+        suffix=NULL;
+    }
+
+    if(options[UNICODE_VERSION].doesOccur) {
+        setUnicodeVersion(options[UNICODE_VERSION].value);
+    }
+    /* else use the default dataVersion in store.c */
+
+    if (options[ICUDATADIR].doesOccur) {
+        u_setDataDirectory(options[ICUDATADIR].value);
+    }
+
+    /* prepare the filename beginning with the source dir */
+    uprv_strcpy(filename, srcDir);
+    basename=filename+uprv_strlen(filename);
+    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
+        *basename++=U_FILE_SEP_CHAR;
+    }
+
+    /* initialize */
+    initStore();
+
+    /* process UnicodeData.txt */
+    writeUCDFilename(basename, "UnicodeData", suffix);
+    parseDB(filename, &errorCode);
+
+    /* process additional properties files */
+    *basename=0;
+    generateAdditionalProperties(filename, suffix, &errorCode);
+
+    /* process parsed data */
+    if(U_SUCCESS(errorCode)) {
+        /* write the properties data file */
+        generateData(destDir, options[CSOURCE].doesOccur);
+    }
+
+    exitStore();
+    u_cleanup();
+    return errorCode;
+}
+
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix) {
+    int32_t length=(int32_t)uprv_strlen(filename);
+    uprv_strcpy(basename, filename);
+    if(suffix!=NULL) {
+        basename[length++]='-';
+        uprv_strcpy(basename+length, suffix);
+        length+=(int32_t)uprv_strlen(suffix);
+    }
+    uprv_strcpy(basename+length, ".txt");
+}
+
+U_CFUNC UBool
+isToken(const char *token, const char *s) {
+    const char *z;
+    int32_t j;
+
+    s=u_skipWhitespace(s);
+    for(j=0;; ++j) {
+        if(token[j]!=0) {
+            if(s[j]!=token[j]) {
+                break;
+            }
+        } else {
+            z=u_skipWhitespace(s+j);
+            if(*z==';' || *z==0) {
+                return TRUE;
+            } else {
+                break;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+U_CFUNC int32_t
+getTokenIndex(const char *const tokens[], int32_t countTokens, const char *s) {
+    const char *t, *z;
+    int32_t i, j;
+
+    s=u_skipWhitespace(s);
+    for(i=0; i<countTokens; ++i) {
+        t=tokens[i];
+        if(t!=NULL) {
+            for(j=0;; ++j) {
+                if(t[j]!=0) {
+                    if(s[j]!=t[j]) {
+                        break;
+                    }
+                } else {
+                    z=u_skipWhitespace(s+j);
+                    if(*z==';' || *z==0 || *z=='#' || *z=='\r' || *z=='\n') {
+                        return i;
+                    } else {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+/* parser for UnicodeData.txt ----------------------------------------------- */
+
+/* general categories */
+const char *const
+genCategoryNames[U_CHAR_CATEGORY_COUNT]={
+    "Cn",
+    "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Me",
+    "Mc", "Nd", "Nl", "No",
+    "Zs", "Zl", "Zp",
+    "Cc", "Cf", "Co", "Cs",
+    "Pd", "Ps", "Pe", "Pc", "Po",
+    "Sm", "Sc", "Sk", "So",
+    "Pi", "Pf"
+};
+
+const char *const
+decompositionTypeNames[U_DT_COUNT]={
+    NULL,
+    NULL,
+    "compat",
+    "circle",
+    "final",
+    "font",
+    "fraction",
+    "initial",
+    "isolated",
+    "medial",
+    "narrow",
+    "noBreak",
+    "small",
+    "square",
+    "sub",
+    "super",
+    "vertical",
+    "wide"
+};
+
+static struct {
+    uint32_t first, last, props;
+    char name[80];
+} unicodeAreas[32];
+
+static int32_t unicodeAreaIndex=0;
+
+static void U_CALLCONV
+unicodeDataLineFn(void *context,
+                  char *fields[][2], int32_t fieldCount,
+                  UErrorCode *pErrorCode) {
+    Props p;
+    char *end;
+    static uint32_t prevCode=0;
+    uint32_t value;
+    int32_t i;
+
+    /* reset the properties */
+    uprv_memset(&p, 0, sizeof(Props));
+
+    /* get the character code, field 0 */
+    p.code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16);
+    if(end<=fields[0][0] || end!=fields[0][1]) {
+        fprintf(stderr, "genprops: syntax error in field 0 at %s\n", fields[0][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get general category, field 2 */
+    i=getTokenIndex(genCategoryNames, U_CHAR_CATEGORY_COUNT, fields[2][0]);
+    if(i>=0) {
+        p.generalCategory=(uint8_t)i;
+    } else {
+        fprintf(stderr, "genprops: unknown general category \"%s\" at code 0x%lx\n",
+            fields[2][0], (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* get decomposition type, field 5 */
+    if(fields[5][0]<fields[5][1]) {
+        /* there is some decomposition */
+        if(*fields[5][0]!='<') {
+            /* canonical */
+            i=U_DT_CANONICAL;
+        } else {
+            /* get compatibility type */
+            end=fields[5][0]+1;
+            while(end<fields[5][1] && *end!='>') {
+                ++end;
+            }
+            *end='#';
+            i=getTokenIndex(decompositionTypeNames, U_DT_COUNT, fields[5][0]+1);
+            if(i<0) {
+                fprintf(stderr, "genprops: unknown decomposition type \"%s\" at code 0x%lx\n",
+                    fields[5][0], (unsigned long)p.code);
+                *pErrorCode=U_PARSE_ERROR;
+                exit(U_PARSE_ERROR);
+            }
+        }
+        upvec_setValue(pv, p.code, p.code, 2, (uint32_t)i, UPROPS_DT_MASK, pErrorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "genprops error: unable to set decomposition type: %s\n", u_errorName(*pErrorCode));
+            exit(*pErrorCode);
+        }
+    }
+
+    /* decimal digit value, field 6 */
+    if(fields[6][0]<fields[6][1]) {
+        value=(uint32_t)uprv_strtoul(fields[6][0], &end, 10);
+        if(end!=fields[6][1] || value>0x7fff) {
+            fprintf(stderr, "genprops: syntax error in field 6 at code 0x%lx\n",
+                (unsigned long)p.code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+        p.numericValue=(int32_t)value;
+        p.numericType=1;
+    }
+
+    /* digit value, field 7 */
+    if(fields[7][0]<fields[7][1]) {
+        value=(uint32_t)uprv_strtoul(fields[7][0], &end, 10);
+        if(end!=fields[7][1] || value>0x7fff) {
+            fprintf(stderr, "genprops: syntax error in field 7 at code 0x%lx\n",
+                (unsigned long)p.code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+        if(p.numericType==0) {
+            p.numericValue=(int32_t)value;
+            p.numericType=2;
+        } else if((int32_t)value!=p.numericValue) {
+            fprintf(stderr, "genprops error: numeric values in fields 6 & 7 different at code 0x%lx\n",
+                (unsigned long)p.code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+    }
+
+    /* numeric value, field 8 */
+    if(fields[8][0]<fields[8][1]) {
+        char *s=fields[8][0];
+        UBool isNegative;
+
+        /* get a possible minus sign */
+        if(*s=='-') {
+            isNegative=TRUE;
+            ++s;
+        } else {
+            isNegative=FALSE;
+        }
+
+        value=(uint32_t)uprv_strtoul(s, &end, 10);
+        if(value>0 && *end=='/') {
+            /* field 8 may contain a fractional value, get the denominator */
+            if(p.numericType>0) {
+                fprintf(stderr, "genprops error: numeric values in fields 6..8 different at code 0x%lx\n",
+                    (unsigned long)p.code);
+                *pErrorCode=U_PARSE_ERROR;
+                exit(U_PARSE_ERROR);
+            }
+
+            p.denominator=(uint32_t)uprv_strtoul(end+1, &end, 10);
+            if(p.denominator==0) {
+                fprintf(stderr, "genprops: denominator is 0 in field 8 at code 0x%lx\n",
+                    (unsigned long)p.code);
+                *pErrorCode=U_PARSE_ERROR;
+                exit(U_PARSE_ERROR);
+            }
+        }
+        if(end!=fields[8][1] || value>0x7fffffff) {
+            fprintf(stderr, "genprops: syntax error in field 8 at code 0x%lx\n",
+                (unsigned long)p.code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+
+        if(p.numericType==0) {
+            if(isNegative) {
+                p.numericValue=-(int32_t)value;
+            } else {
+                p.numericValue=(int32_t)value;
+            }
+            p.numericType=3;
+        } else if((int32_t)value!=p.numericValue) {
+            fprintf(stderr, "genprops error: numeric values in fields 6..8 different at code 0x%lx\n",
+                (unsigned long)p.code);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+    }
+
+    value=makeProps(&p);
+
+    if(*fields[1][0]=='<') {
+        /* first or last entry of a Unicode area */
+        size_t length=fields[1][1]-fields[1][0];
+
+        if(length<9) {
+            /* name too short for an area name */
+        } else if(0==uprv_memcmp(", First>", fields[1][1]-8, 8)) {
+            /* set the current area */
+            if(unicodeAreas[unicodeAreaIndex].first==0xffffffff) {
+                length-=9;
+                unicodeAreas[unicodeAreaIndex].first=p.code;
+                unicodeAreas[unicodeAreaIndex].props=value;
+                uprv_memcpy(unicodeAreas[unicodeAreaIndex].name, fields[1][0]+1, length);
+                unicodeAreas[unicodeAreaIndex].name[length]=0;
+            } else {
+                /* error: a previous area is incomplete */
+                fprintf(stderr, "genprops: error - area \"%s\" is incomplete\n", unicodeAreas[unicodeAreaIndex].name);
+                *pErrorCode=U_PARSE_ERROR;
+                exit(U_PARSE_ERROR);
+            }
+            return;
+        } else if(0==uprv_memcmp(", Last>", fields[1][1]-7, 7)) {
+            /* check that the current area matches, and complete it with the last code point */
+            length-=8;
+            if( unicodeAreas[unicodeAreaIndex].props==value &&
+                0==uprv_memcmp(unicodeAreas[unicodeAreaIndex].name, fields[1][0]+1, length) &&
+                unicodeAreas[unicodeAreaIndex].name[length]==0 &&
+                unicodeAreas[unicodeAreaIndex].first<p.code
+            ) {
+                unicodeAreas[unicodeAreaIndex].last=p.code;
+                if(beVerbose) {
+                    printf("Unicode area U+%04lx..U+%04lx \"%s\"\n",
+                        (unsigned long)unicodeAreas[unicodeAreaIndex].first,
+                        (unsigned long)unicodeAreas[unicodeAreaIndex].last,
+                        unicodeAreas[unicodeAreaIndex].name);
+                }
+                unicodeAreas[++unicodeAreaIndex].first=0xffffffff;
+            } else {
+                /* error: different properties between first & last, different area name, first>=last */
+                fprintf(stderr, "genprops: error - Last of area \"%s\" is incorrect\n", unicodeAreas[unicodeAreaIndex].name);
+                *pErrorCode=U_PARSE_ERROR;
+                exit(U_PARSE_ERROR);
+            }
+            return;
+        } else {
+            /* not an area name */
+        }
+    }
+
+    /* check for non-character code points */
+    if((p.code&0xfffe)==0xfffe || (uint32_t)(p.code-0xfdd0)<0x20) {
+        fprintf(stderr, "genprops: error - properties for non-character code point U+%04lx\n",
+                (unsigned long)p.code);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    /* check that the code points (p.code) are in ascending order */
+    if(p.code<=prevCode && p.code>0) {
+        fprintf(stderr, "genprops: error - UnicodeData entries out of order, U+%04lx after U+%04lx\n",
+                (unsigned long)p.code, (unsigned long)prevCode);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    prevCode=p.code;
+
+    /* properties for a single code point */
+    addProps(p.code, value);
+}
+
+/* set repeated properties for the areas */
+static void
+repeatAreaProps() {
+    uint32_t puaProps;
+    int32_t i;
+    UBool hasPlane15PUA, hasPlane16PUA;
+    UErrorCode errorCode;
+
+    /*
+     * UnicodeData.txt before 3.0.1 did not contain the PUAs on
+     * planes 15 and 16.
+     * If that is the case, then we add them here, using the properties
+     * from the BMP PUA.
+     */
+    puaProps=0;
+    hasPlane15PUA=hasPlane16PUA=FALSE;
+
+    for(i=0; i<unicodeAreaIndex; ++i) {
+        repeatProps(unicodeAreas[i].first,
+                    unicodeAreas[i].last,
+                    unicodeAreas[i].props);
+        if(unicodeAreas[i].first==0xe000) {
+            puaProps=unicodeAreas[i].props;
+        } else if(unicodeAreas[i].first==0xf0000) {
+            hasPlane15PUA=TRUE;
+        } else if(unicodeAreas[i].first==0x100000) {
+            hasPlane16PUA=TRUE;
+        }
+    }
+
+    if(puaProps!=0) {
+        if(!hasPlane15PUA) {
+            repeatProps(0xf0000, 0xffffd, puaProps);
+        }
+        if(!hasPlane16PUA) {
+            repeatProps(0x100000, 0x10fffd, puaProps);
+        }
+    }
+
+    /* Hangul have canonical decompositions */
+    errorCode=U_ZERO_ERROR;
+    upvec_setValue(pv, 0xac00, 0xd7a3, 2, (uint32_t)U_DT_CANONICAL, UPROPS_DT_MASK, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "genprops error: unable to set decomposition type: %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+}
+
+static void
+parseDB(const char *filename, UErrorCode *pErrorCode) {
+    char *fields[15][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    /* while unicodeAreas[unicodeAreaIndex] is unused, set its first to a bogus value */
+    unicodeAreas[0].first=0xffffffff;
+
+    u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode);
+
+    if(unicodeAreas[unicodeAreaIndex].first!=0xffffffff) {
+        fprintf(stderr, "genprops: error - the last area \"%s\" from U+%04lx is incomplete\n",
+            unicodeAreas[unicodeAreaIndex].name,
+            (unsigned long)unicodeAreas[unicodeAreaIndex].first);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+
+    repeatAreaProps();
+
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/genprops/genprops.h b/unicode/c/genprops/genprops.h
new file mode 100644
index 0000000..79ab229
--- /dev/null
+++ b/unicode/c/genprops/genprops.h
@@ -0,0 +1,92 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genprops.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 1999dec13
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __GENPROPS_H__
+#define __GENPROPS_H__
+
+#include "unicode/utypes.h"
+#include "utrie.h"
+#include "propsvec.h"
+
+/* file definitions */
+#define DATA_NAME "uprops"
+#define DATA_TYPE "icu"
+
+/* character properties */
+typedef struct {
+    uint32_t code;
+    int32_t numericValue; /* see numericType */
+    uint32_t denominator; /* 0: no value */
+    uint8_t generalCategory, numericType, exponent;
+} Props;
+
+/* global flags */
+U_CFUNC UBool beVerbose, haveCopyright;
+
+U_CFUNC const char *const
+genCategoryNames[];
+
+/* properties vectors in props2.cpp */
+U_CFUNC UPropsVectors *pv;
+
+/* prototypes */
+U_CFUNC void
+writeUCDFilename(char *basename, const char *filename, const char *suffix);
+
+U_CFUNC UBool
+isToken(const char *token, const char *s);
+
+U_CFUNC int32_t
+getTokenIndex(const char *const tokens[], int32_t countTokens, const char *s);
+
+U_CFUNC void
+setUnicodeVersion(const char *v);
+
+U_CFUNC void
+initStore(void);
+
+U_CFUNC void
+exitStore(void);
+
+U_CFUNC uint32_t
+makeProps(Props *p);
+
+U_CFUNC void
+addProps(uint32_t c, uint32_t props);
+
+U_CFUNC uint32_t
+getProps(uint32_t c);
+
+U_CFUNC void
+repeatProps(uint32_t first, uint32_t last, uint32_t props);
+
+U_CFUNC void
+generateData(const char *dataDir, UBool csource);
+
+/* props2.c */
+U_CFUNC void
+initAdditionalProperties(void);
+
+U_CFUNC void
+exitAdditionalProperties(void);
+
+U_CFUNC void
+generateAdditionalProperties(char *filename, const char *suffix, UErrorCode *pErrorCode);
+
+U_CFUNC int32_t
+writeAdditionalData(FILE *f, uint8_t *p, int32_t capacity, int32_t indexes[16]);
+
+#endif
diff --git a/unicode/c/genprops/genprops.vcproj b/unicode/c/genprops/genprops.vcproj
new file mode 100644
index 0000000..871abf3
--- /dev/null
+++ b/unicode/c/genprops/genprops.vcproj
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="genprops"
+	ProjectGUID="{6F744648-D15F-478A-90C6-58E353B5DDB3}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/genprops.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/genprops.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/genprops.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/genprops.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/genprops.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/genprops.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/genprops.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/genprops.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/genprops.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/genprops.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/genprops.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/genprops.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/genprops.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/genprops.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/genprops.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/genprops.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="c;cpp;rc"
+			>
+			<File
+				RelativePath=".\genprops.c"
+				>
+			</File>
+			<File
+				RelativePath=".\props2.c"
+				>
+			</File>
+			<File
+				RelativePath=".\store.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h"
+			>
+			<File
+				RelativePath=".\genprops.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/genprops/misc/ucdcopy.py b/unicode/c/genprops/misc/ucdcopy.py
new file mode 100755
index 0000000..f07f540
--- /dev/null
+++ b/unicode/c/genprops/misc/ucdcopy.py
@@ -0,0 +1,182 @@
+#!/usr/bin/python2.4
+# Copyright (c) 2009-2010 International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+#   file name:  ucdcopy.py
+#   encoding:   US-ASCII
+#   tab size:   8 (not used)
+#   indentation:4
+#
+#   created on: 2009aug04
+#   created by: Markus W. Scherer
+#
+# Copy Unicode Character Database (ucd) files from a tree
+# of files downloaded from ftp://www.unicode.org/Public/5.2.0/
+# to a folder like ICU's source/data/unidata/
+# and modify some of the files to make them more compact.
+#
+# Invoke with two command-line parameters, for the source
+# and destination folders.
+
+import os
+import os.path
+import re
+import shutil
+import sys
+
+_strip_re = re.compile("^([0-9a-fA-F]+.+?) *#.*")
+_code_point_re = re.compile("\s*([0-9a-fA-F]+)\s*;")
+
+def CopyAndStripWithOptionalMerge(s, t, do_merge):
+  in_file = open(s, "r")
+  out_file = open(t, "w")
+  first = -1  # First code point with first_data.
+  last = -1  # Last code point with first_data.
+  first_data = ""  # Common data for code points [first..last].
+  for line in in_file:
+    match = _strip_re.match(line)
+    if match:
+      line = match.group(1)
+    else:
+      line = line.rstrip()
+    if do_merge:
+      match = _code_point_re.match(line)
+      if match:
+        c = int(match.group(1), 16)
+        data = line[match.end() - 1:]
+      else:
+        c = -1
+        data = ""
+      if last >= 0 and (c != (last + 1) or data != first_data):
+        # output the current range
+        if first == last:
+          out_file.write("%04X%s\n" % (first, first_data))
+        else:
+          out_file.write("%04X..%04X%s\n" % (first, last, first_data))
+        first = -1
+        last = -1
+        first_data = ""
+      if c < 0:
+        # no data on this line, output as is
+        out_file.write(line)
+        out_file.write("\n")
+      else:
+        # data on this line, store for possible range compaction
+        if last < 0:
+          # set as the first line in a possible range
+          first = c
+          last = c
+          first_data = data
+        else:
+          # must be c == (last + 1) and data == first_data
+          # because of previous conditions
+          # continue with the current range
+          last = c
+    else:
+      # Only strip, don't merge: just output the stripped line.
+      out_file.write(line)
+      out_file.write("\n")
+  if do_merge and last >= 0:
+    # output the last range in the file
+    if first == last:
+      out_file.write("%04X%s\n" % (first, first_data))
+    else:
+      out_file.write("%04X..%04X%s\n" % (first, last, first_data))
+    first = -1
+    last = -1
+    first_data = ""
+  in_file.close()
+  out_file.flush()
+  out_file.close()
+
+
+def CopyAndStrip(s, t):
+  """Copies a file and removes comments behind data lines but not in others."""
+  CopyAndStripWithOptionalMerge(s, t, False)
+
+
+def CopyAndStripAndMerge(s, t):
+  """Copies and strips a file and merges lines.
+
+  Copies a file, removes comments, and
+  merges lines with adjacent code point ranges and identical per-code point
+  data lines into one line with range syntax.
+  """
+  CopyAndStripWithOptionalMerge(s, t, True)
+
+
+_files = {
+  # Simply copy these files.
+  "BidiMirroring.txt": shutil.copy,
+  "BidiTest.txt": (shutil.copy, "testdata"),
+  "Blocks.txt": shutil.copy,
+  "CaseFolding.txt": shutil.copy,
+  "DerivedAge.txt": shutil.copy,
+  "DerivedBidiClass.txt": shutil.copy,
+  "DerivedJoiningGroup.txt": shutil.copy,
+  "DerivedJoiningType.txt": shutil.copy,
+  "DerivedNumericValues.txt": shutil.copy,
+  "GraphemeBreakTest.txt": (shutil.copy, "testdata"),
+  "LineBreakTest.txt": (shutil.copy, "testdata"),
+  "NameAliases.txt": shutil.copy,
+  "NormalizationCorrections.txt": shutil.copy,
+  "PropertyAliases.txt": shutil.copy,
+  "PropertyValueAliases.txt": shutil.copy,
+  "SentenceBreakTest.txt": (shutil.copy, "testdata"),
+  "ScriptExtensions.txt": shutil.copy,
+  "SpecialCasing.txt": shutil.copy,
+  "UnicodeData.txt": shutil.copy,
+  "WordBreakTest.txt": (shutil.copy, "testdata"),
+
+  # Copy these files and remove comments behind data lines but not in others.
+  "DerivedCoreProperties.txt": CopyAndStrip,
+  "DerivedNormalizationProps.txt": CopyAndStrip,
+  "GraphemeBreakProperty.txt": CopyAndStrip,
+  "NormalizationTest.txt": CopyAndStrip,
+  "PropList.txt": CopyAndStrip,
+  "Scripts.txt": CopyAndStrip,
+  "SentenceBreakProperty.txt": CopyAndStrip,
+  "WordBreakProperty.txt": CopyAndStrip,
+
+  # Also merge lines with adjacent code point ranges.
+  "EastAsianWidth.txt": CopyAndStripAndMerge,
+  "LineBreak.txt": CopyAndStripAndMerge
+}
+
+_file_version_re = re.compile("^([a-zA-Z0-9]+)" +
+                              "-[0-9](?:\\.[0-9])*(?:d[0-9]+)?" +
+                              "(\\.[a-z]+)$")
+
+def main():
+  source_root = sys.argv[1]
+  dest_root = sys.argv[2]
+  source_files = []
+  for root, dirs, files in os.walk(source_root):
+    for file in files:
+      source_files.append(os.path.join(root, file))
+  files_processed = set()
+  for source_file in source_files:
+    basename = os.path.basename(source_file)
+    match = _file_version_re.match(basename)
+    if match:
+      basename = match.group(1) + match.group(2)
+      print basename
+    if basename in _files:
+      if basename in files_processed:
+        print "duplicate file basename %s!" % basename
+        sys.exit(1)
+      files_processed.add(basename)
+      action = _files[basename]
+      if isinstance(action, tuple):
+        dest_folder = action[1]
+        action = action[0]
+      else:
+        dest_folder = "unidata"
+      dest_path = os.path.join(dest_root, dest_folder)
+      if not os.path.exists(dest_path): os.makedirs(dest_path)
+      dest_file = os.path.join(dest_path, basename)
+      action(source_file, dest_file)
+
+
+if __name__ == "__main__":
+  main()
diff --git a/unicode/c/genprops/misc/ucdmerge.c b/unicode/c/genprops/misc/ucdmerge.c
new file mode 100644
index 0000000..35f6850
--- /dev/null
+++ b/unicode/c/genprops/misc/ucdmerge.c
@@ -0,0 +1,149 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  ucdmerge.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2003feb20
+*   created by: Markus W. Scherer
+*
+*   Simple tool for Unicode Character Database files with semicolon-delimited fields.
+*   Merges adjacent, identical per-code point data lines into one line with range syntax.
+*
+*   To compile, just call a C compiler/linker with this source file.
+*   On Windows: cl ucdmerge.c
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+static const char *
+skipWhitespace(const char *s) {
+    while(*s==' ' || *s=='\t') {
+        ++s;
+    }
+    return s;
+}
+
+/* return the first character position after the end of the data */
+static char *
+endOfData(const char *l) {
+    char *end;
+    char c;
+
+    end=strchr(l, '#');
+    if(end!=NULL) {
+        /* ignore whitespace before the comment */
+        while(l!=end && ((c=*(end-1))==' ' || c=='\t')) {
+            --end;
+        }
+    } else {
+        end=strchr(l, 0);
+    }
+    return end;
+}
+
+static int
+sameData(const char *l1, const char *l2) {
+    char *end1, *end2;
+    int length;
+
+    /* find the first semicolon in each line - there must be one */
+    l1=strchr(l1, ';')+1;
+    l2=strchr(l2, ';')+1;
+
+    /* find the end of data: end of string or start of comment */
+    end1=endOfData(l1);
+    end2=endOfData(l2);
+
+    /* compare the line data portions */
+    length=end1-l1;
+    return length==(end2-l2) && 0==memcmp(l1, l2, length);
+}
+
+extern int
+main(int argc, const char *argv[]) {
+    static char line[2000], firstLine[2000], lastLine[2000];
+    char *end;
+    long first, last, c;
+    int finished;
+
+    first=last=-1;
+    finished=0;
+
+    for(;;) {
+        if(gets(line)!=NULL) {
+            /* parse the initial code point, if any */
+            c=strtol(line, &end, 16);
+            if(end!=line && *skipWhitespace(end)==';') {
+                /* single code point followed by semicolon and data, keep c */
+            } else {
+                c=-1;
+            }
+        } else {
+            line[0]=0;
+            c=-1;
+            finished=1;
+        }
+
+        if(last>=0 && (c!=(last+1) || !sameData(firstLine, line))) {
+            /* output the current range */
+            if(first==last) {
+                /* there was no range, just output the one line we found */
+                puts(firstLine);
+            } else {
+                /* there was a real range, merge their lines */
+                end=strchr(lastLine, '#');
+                if(end==NULL) {
+                    /* no comment in second line */
+                    printf("%04lX..%04lX%s\n",
+                            first, last,            /* code point range */
+                            strchr(firstLine, ';'));/* first line starting from the first ; */
+                } else if(strchr(firstLine, '#')==NULL) {
+                    /* no comment in first line */
+                    printf("%04lX..%04lX%s%s\n",
+                            first, last,            /* code point range */
+                            strchr(firstLine, ';'), /* first line starting from the first ; */
+                            end);                   /* comment from second line */
+                } else {
+                    /* merge comments from both lines */
+                    printf("%04lX..%04lX%s..%s\n",
+                            first, last,            /* code point range */
+                            strchr(firstLine, ';'), /* first line starting from the first ; */
+                            skipWhitespace(end+1)); /* comment from second line, after # and spaces */
+                }
+            }
+            first=last=-1;
+        }
+
+        if(c<0) {
+            if(finished) {
+                break;
+            }
+
+            /* no data on this line, output as is */
+            puts(line);
+        } else {
+            /* data on this line, store for possible range compaction */
+            if(last<0) {
+                /* set as the first line in a possible range */
+                first=last=c;
+                strcpy(firstLine, line);
+                lastLine[0]=0;
+            } else /* must be c==(last+1) && sameData() because of previous conditions */ {
+                /* continue with the current range */
+                last=c;
+                strcpy(lastLine, line);
+            }
+        }
+    }
+
+    return 0;
+}
diff --git a/unicode/c/genprops/misc/ucdstrip.c b/unicode/c/genprops/misc/ucdstrip.c
new file mode 100644
index 0000000..33ef53f
--- /dev/null
+++ b/unicode/c/genprops/misc/ucdstrip.c
@@ -0,0 +1,59 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  ucdstrip.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2003feb20
+*   created by: Markus W. Scherer
+*
+*   Simple tool for Unicode Character Database files with semicolon-delimited fields.
+*   Removes comments behind data lines but not in others.
+*
+*   To compile, just call a C compiler/linker with this source file.
+*   On Windows: cl ucdstrip.c
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* return the first character position after the end of the data */
+static char *
+endOfData(const char *l) {
+    char *end;
+    char c;
+
+    end=strchr(l, '#');
+    if(end!=NULL) {
+        /* ignore whitespace before the comment */
+        while(l!=end && ((c=*(end-1))==' ' || c=='\t')) {
+            --end;
+        }
+    } else {
+        end=strchr(l, 0);
+    }
+    return end;
+}
+
+extern int
+main(int argc, const char *argv[]) {
+    static char line[2000];
+    char *end;
+
+    while(gets(line)!=NULL) {
+        if(strtol(line, &end, 16)>=0 && end!=line) {
+            /* code point or range followed by semicolon and data, remove comment */
+            *endOfData(line)=0;
+        }
+        puts(line);
+    }
+
+    return 0;
+}
diff --git a/unicode/c/genprops/misc/ucdstrip.pl b/unicode/c/genprops/misc/ucdstrip.pl
new file mode 100755
index 0000000..6109770
--- /dev/null
+++ b/unicode/c/genprops/misc/ucdstrip.pl
@@ -0,0 +1,7 @@
+#!/usr/lib/perl -p
+# Copyright (c) 2001-2003 International Business Machines
+# Corporation and others. All Rights Reserved.
+# Simple tool for Unicode Character Database files with semicolon-delimited fields.
+# Removes comments behind data lines but not in others.
+# The Perl option -p above runs a while(<>) loop and prints the expression output.
+s/^([0-9a-fA-F]+.+?) *#.*/\1/;
diff --git a/unicode/c/genprops/props2.cpp b/unicode/c/genprops/props2.cpp
new file mode 100644
index 0000000..3f8bd5a
--- /dev/null
+++ b/unicode/c/genprops/props2.cpp
@@ -0,0 +1,920 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2002-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  props2.cpp
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2002feb24
+*   created by: Markus W. Scherer
+*
+*   Parse more Unicode Character Database files and store
+*   additional Unicode character properties in bit set vectors.
+*/
+
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "unicode/unistr.h"
+#include "unicode/uscript.h"
+#include "cstring.h"
+#include "cmemory.h"
+#include "utrie2.h"
+#include "uprops.h"
+#include "propsvec.h"
+#include "uparse.h"
+#include "writesrc.h"
+#include "genprops.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_USE
+
+/* data --------------------------------------------------------------------- */
+
+static UTrie2 *newTrie;
+UPropsVectors *pv;
+
+static UnicodeString *scriptExtensions;
+
+/* miscellaneous ------------------------------------------------------------ */
+
+static char *
+trimTerminateField(char *s, char *limit) {
+    /* trim leading whitespace */
+    s=(char *)u_skipWhitespace(s);
+
+    /* trim trailing whitespace */
+    while(s<limit && U_IS_INV_WHITESPACE(*(limit-1))) {
+        --limit;
+    }
+    *limit=0;
+
+    return s;
+}
+
+static void
+parseTwoFieldFile(char *filename, char *basename,
+                  const char *ucdFile, const char *suffix,
+                  UParseLineFn *lineFn,
+                  UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, lineFn, NULL, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+static void U_CALLCONV
+ageLineFn(void *context,
+          char *fields[][2], int32_t fieldCount,
+          UErrorCode *pErrorCode);
+
+static void U_CALLCONV
+scriptExtensionsLineFn(void *context,
+                       char *fields[][2], int32_t fieldCount,
+                       UErrorCode *pErrorCode);
+
+static void
+parseMultiFieldFile(char *filename, char *basename,
+                    const char *ucdFile, const char *suffix,
+                    int32_t fieldCount,
+                    UParseLineFn *lineFn,
+                    UErrorCode *pErrorCode) {
+    char *fields[20][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, fieldCount, lineFn, NULL, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+static void U_CALLCONV
+numericLineFn(void *context,
+              char *fields[][2], int32_t fieldCount,
+              UErrorCode *pErrorCode);
+
+/* parse files with single enumerated properties ---------------------------- */
+
+struct SingleEnum {
+    const char *ucdFile, *propName;
+    UProperty prop;
+    int32_t vecWord, vecShift;
+    uint32_t vecMask;
+};
+typedef struct SingleEnum SingleEnum;
+
+static void
+parseSingleEnumFile(char *filename, char *basename, const char *suffix,
+                    const SingleEnum *sen,
+                    UErrorCode *pErrorCode);
+
+static const SingleEnum scriptSingleEnum={ 
+    "Scripts", "script", 
+    UCHAR_SCRIPT, 
+    0, 0, UPROPS_SCRIPT_MASK
+};
+
+static const SingleEnum blockSingleEnum={
+    "Blocks", "block",
+    UCHAR_BLOCK,
+    0, UPROPS_BLOCK_SHIFT, UPROPS_BLOCK_MASK
+};
+
+static const SingleEnum graphemeClusterBreakSingleEnum={
+    "GraphemeBreakProperty", "Grapheme_Cluster_Break",
+    UCHAR_GRAPHEME_CLUSTER_BREAK,
+    2, UPROPS_GCB_SHIFT, UPROPS_GCB_MASK
+};
+
+static const SingleEnum wordBreakSingleEnum={
+    "WordBreakProperty", "Word_Break",
+    UCHAR_WORD_BREAK,
+    2, UPROPS_WB_SHIFT, UPROPS_WB_MASK
+};
+
+static const SingleEnum sentenceBreakSingleEnum={
+    "SentenceBreakProperty", "Sentence_Break",
+    UCHAR_SENTENCE_BREAK,
+    2, UPROPS_SB_SHIFT, UPROPS_SB_MASK
+};
+
+static const SingleEnum lineBreakSingleEnum={
+    "LineBreak", "line break",
+    UCHAR_LINE_BREAK,
+    2, UPROPS_LB_SHIFT, UPROPS_LB_MASK
+};
+
+static const SingleEnum eawSingleEnum={
+    "EastAsianWidth", "east asian width",
+    UCHAR_EAST_ASIAN_WIDTH,
+    0, UPROPS_EA_SHIFT, UPROPS_EA_MASK
+};
+
+static void U_CALLCONV
+singleEnumLineFn(void *context,
+                 char *fields[][2], int32_t fieldCount,
+                 UErrorCode *pErrorCode) {
+    const SingleEnum *sen;
+    char *s;
+    uint32_t start, end, uv;
+    int32_t value;
+
+    sen=(const SingleEnum *)context;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: syntax error in %s.txt field 0 at %s\n", sen->ucdFile, fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse property alias */
+    s=trimTerminateField(fields[1][0], fields[1][1]);
+    value=u_getPropertyValueEnum(sen->prop, s);
+    if(value<0) {
+        if(sen->prop==UCHAR_BLOCK) {
+            if(isToken("Greek", s)) {
+                value=UBLOCK_GREEK; /* Unicode 3.2 renames this to "Greek and Coptic" */
+            } else if(isToken("Combining Marks for Symbols", s)) {
+                value=UBLOCK_COMBINING_MARKS_FOR_SYMBOLS; /* Unicode 3.2 renames this to "Combining Diacritical Marks for Symbols" */
+            } else if(isToken("Private Use", s)) {
+                value=UBLOCK_PRIVATE_USE; /* Unicode 3.2 renames this to "Private Use Area" */
+            }
+        }
+    }
+    if(value<0) {
+        fprintf(stderr, "genprops error: unknown %s name in %s.txt field 1 at %s\n",
+                        sen->propName, sen->ucdFile, s);
+        exit(U_PARSE_ERROR);
+    }
+
+    uv=(uint32_t)(value<<sen->vecShift);
+    if((uv&sen->vecMask)!=uv) {
+        fprintf(stderr, "genprops error: %s value overflow (0x%x) at %s\n",
+                        sen->propName, (int)uv, s);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+
+    if(start==0 && end==0x10ffff) {
+        /* Also set bits for initialValue and errorValue. */
+        end=UPVEC_MAX_CP;
+    }
+    upvec_setValue(pv, start, end, sen->vecWord, uv, sen->vecMask, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops error: unable to set %s code: %s\n",
+                        sen->propName, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+static void
+parseSingleEnumFile(char *filename, char *basename, const char *suffix,
+                    const SingleEnum *sen,
+                    UErrorCode *pErrorCode) {
+    char *fields[2][2];
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, sen->ucdFile, suffix);
+
+    u_parseDelimitedFile(filename, ';', fields, 2, singleEnumLineFn, (void *)sen, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", sen->ucdFile, u_errorName(*pErrorCode));
+    }
+}
+
+/* parse files with multiple binary properties ------------------------------ */
+
+struct Binary {
+    const char *propName;
+    int32_t vecWord, vecShift;
+};
+typedef struct Binary Binary;
+
+struct Binaries {
+    const char *ucdFile;
+    const Binary *binaries;
+    int32_t binariesCount;
+};
+typedef struct Binaries Binaries;
+
+static const Binary
+propListNames[]={
+    { "White_Space",                        1, UPROPS_WHITE_SPACE },
+    { "Dash",                               1, UPROPS_DASH },
+    { "Hyphen",                             1, UPROPS_HYPHEN },
+    { "Quotation_Mark",                     1, UPROPS_QUOTATION_MARK },
+    { "Terminal_Punctuation",               1, UPROPS_TERMINAL_PUNCTUATION },
+    { "Hex_Digit",                          1, UPROPS_HEX_DIGIT },
+    { "ASCII_Hex_Digit",                    1, UPROPS_ASCII_HEX_DIGIT },
+    { "Ideographic",                        1, UPROPS_IDEOGRAPHIC },
+    { "Diacritic",                          1, UPROPS_DIACRITIC },
+    { "Extender",                           1, UPROPS_EXTENDER },
+    { "Noncharacter_Code_Point",            1, UPROPS_NONCHARACTER_CODE_POINT },
+    { "Grapheme_Link",                      1, UPROPS_GRAPHEME_LINK },
+    { "IDS_Binary_Operator",                1, UPROPS_IDS_BINARY_OPERATOR },
+    { "IDS_Trinary_Operator",               1, UPROPS_IDS_TRINARY_OPERATOR },
+    { "Radical",                            1, UPROPS_RADICAL },
+    { "Unified_Ideograph",                  1, UPROPS_UNIFIED_IDEOGRAPH },
+    { "Deprecated",                         1, UPROPS_DEPRECATED },
+    { "Logical_Order_Exception",            1, UPROPS_LOGICAL_ORDER_EXCEPTION },
+
+    /* new properties in Unicode 4.0.1 */
+    { "STerm",                              1, UPROPS_S_TERM },
+    { "Variation_Selector",                 1, UPROPS_VARIATION_SELECTOR },
+
+    /* new properties in Unicode 4.1 */
+    { "Pattern_Syntax",                     1, UPROPS_PATTERN_SYNTAX },
+    { "Pattern_White_Space",                1, UPROPS_PATTERN_WHITE_SPACE }
+};
+
+static const Binaries
+propListBinaries={
+    "PropList", propListNames, LENGTHOF(propListNames)
+};
+
+static const Binary
+derCorePropsNames[]={
+    { "XID_Start",                          1, UPROPS_XID_START },
+    { "XID_Continue",                       1, UPROPS_XID_CONTINUE },
+
+    /* before Unicode 4/ICU 2.6/format version 3.2, these used to be Other_XYZ from PropList.txt */
+    { "Math",                               1, UPROPS_MATH },
+    { "Alphabetic",                         1, UPROPS_ALPHABETIC },
+    { "Grapheme_Extend",                    1, UPROPS_GRAPHEME_EXTEND },
+    { "Default_Ignorable_Code_Point",       1, UPROPS_DEFAULT_IGNORABLE_CODE_POINT },
+
+    /* new properties bits in ICU 2.6/format version 3.2 */
+    { "ID_Start",                           1, UPROPS_ID_START },
+    { "ID_Continue",                        1, UPROPS_ID_CONTINUE },
+    { "Grapheme_Base",                      1, UPROPS_GRAPHEME_BASE },
+
+    /*
+     * Unicode 5/ICU 3.6 moves Grapheme_Link from PropList.txt
+     * to DerivedCoreProperties.txt and deprecates it.
+     */
+    { "Grapheme_Link",                      1, UPROPS_GRAPHEME_LINK }
+};
+
+static const Binaries
+derCorePropsBinaries={
+    "DerivedCoreProperties", derCorePropsNames, LENGTHOF(derCorePropsNames)
+};
+
+static char ignoredProps[100][64];
+static int32_t ignoredPropsCount;
+
+static void
+addIgnoredProp(char *s, char *limit) {
+    int32_t i;
+
+    s=trimTerminateField(s, limit);
+    for(i=0; i<ignoredPropsCount; ++i) {
+        if(0==uprv_strcmp(ignoredProps[i], s)) {
+            return;
+        }
+    }
+    uprv_strcpy(ignoredProps[ignoredPropsCount++], s);
+}
+
+static void U_CALLCONV
+binariesLineFn(void *context,
+               char *fields[][2], int32_t fieldCount,
+               UErrorCode *pErrorCode) {
+    const Binaries *bin;
+    char *s;
+    uint32_t start, end, uv;
+    int32_t i;
+
+    bin=(const Binaries *)context;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse binary property name */
+    s=(char *)u_skipWhitespace(fields[1][0]);
+    for(i=0;; ++i) {
+        if(i==bin->binariesCount) {
+            /* ignore unrecognized properties */
+            if(beVerbose) {
+                addIgnoredProp(s, fields[1][1]);
+            }
+            return;
+        }
+        if(isToken(bin->binaries[i].propName, s)) {
+            break;
+        }
+    }
+
+    if(bin->binaries[i].vecShift>=32) {
+        fprintf(stderr, "genprops error: shift value %d>=32 for %s %s\n",
+                        (int)bin->binaries[i].vecShift, bin->ucdFile, bin->binaries[i].propName);
+        exit(U_INTERNAL_PROGRAM_ERROR);
+    }
+    uv=U_MASK(bin->binaries[i].vecShift);
+
+    if(start==0 && end==0x10ffff) {
+        /* Also set bits for initialValue and errorValue. */
+        end=UPVEC_MAX_CP;
+    }
+    upvec_setValue(pv, start, end, bin->binaries[i].vecWord, uv, uv, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops error: unable to set %s code: %s\n",
+                        bin->binaries[i].propName, u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+static void
+parseBinariesFile(char *filename, char *basename, const char *suffix,
+                  const Binaries *bin,
+                  UErrorCode *pErrorCode) {
+    char *fields[2][2];
+    int32_t i;
+
+    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+        return;
+    }
+
+    writeUCDFilename(basename, bin->ucdFile, suffix);
+
+    ignoredPropsCount=0;
+
+    u_parseDelimitedFile(filename, ';', fields, 2, binariesLineFn, (void *)bin, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "error parsing %s.txt: %s\n", bin->ucdFile, u_errorName(*pErrorCode));
+    }
+
+    if(beVerbose) {
+        for(i=0; i<ignoredPropsCount; ++i) {
+            printf("genprops: ignoring property %s in %s.txt\n", ignoredProps[i], bin->ucdFile);
+        }
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+
+U_CFUNC void
+initAdditionalProperties() {
+    UErrorCode errorCode=U_ZERO_ERROR;
+    pv=upvec_open(UPROPS_VECTOR_WORDS, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "error: upvec_open() failed - %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+    scriptExtensions=new UnicodeString;
+}
+
+U_CFUNC void
+exitAdditionalProperties() {
+    utrie2_close(newTrie);
+    upvec_close(pv);
+    delete scriptExtensions;
+}
+
+U_CFUNC void
+generateAdditionalProperties(char *filename, const char *suffix, UErrorCode *pErrorCode) {
+    char *basename;
+
+    basename=filename+uprv_strlen(filename);
+
+    /* process various UCD .txt files */
+
+    /* add Han numeric types & values */
+    parseMultiFieldFile(filename, basename, "DerivedNumericValues", suffix, 2, numericLineFn, pErrorCode);
+
+    parseTwoFieldFile(filename, basename, "DerivedAge", suffix, ageLineFn, pErrorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &scriptSingleEnum, pErrorCode);
+
+    parseTwoFieldFile(filename, basename, "ScriptExtensions", suffix, scriptExtensionsLineFn, pErrorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &blockSingleEnum, pErrorCode);
+
+    parseBinariesFile(filename, basename, suffix, &propListBinaries, pErrorCode);
+
+    parseBinariesFile(filename, basename, suffix, &derCorePropsBinaries, pErrorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &graphemeClusterBreakSingleEnum, pErrorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &wordBreakSingleEnum, pErrorCode);
+
+    parseSingleEnumFile(filename, basename, suffix, &sentenceBreakSingleEnum, pErrorCode);
+
+    /*
+     * LineBreak-4.0.0.txt:
+     *  - All code points, assigned and unassigned, that are not listed 
+     *         explicitly are given the value "XX".
+     *
+     * XX==U_LB_UNKNOWN==0 - nothing to do
+     */
+    parseSingleEnumFile(filename, basename, suffix, &lineBreakSingleEnum, pErrorCode);
+
+    /*
+     * Preset East Asian Width defaults:
+     *
+     * http://www.unicode.org/reports/tr11/#Unassigned
+     * 7.1 Unassigned and Private Use characters
+     *
+     * All unassigned characters are by default classified as non-East Asian neutral,
+     * except for the range U+20000 to U+2FFFD,
+     * since all code positions from U+20000 to U+2FFFD are intended for CJK ideographs (W).
+     * All Private use characters are by default classified as ambiguous,
+     * since their definition depends on context.
+     *
+     * N for all ==0 - nothing to do
+     * A for Private Use
+     * W for plane 2
+     */
+    *pErrorCode=U_ZERO_ERROR;
+    upvec_setValue(pv, 0xe000, 0xf8ff, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode);
+    upvec_setValue(pv, 0xf0000, 0xffffd, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode);
+    upvec_setValue(pv, 0x100000, 0x10fffd, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode);
+    upvec_setValue(pv, 0x20000, 0x2fffd, 0, (uint32_t)(U_EA_WIDE<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: unable to set default East Asian Widths: %s\n", u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+
+    /* parse EastAsianWidth.txt */
+    parseSingleEnumFile(filename, basename, suffix, &eawSingleEnum, pErrorCode);
+
+    newTrie=upvec_compactToUTrie2WithRowIndexes(pv, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops error: unable to build trie for additional properties: %s\n",
+                u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+/* DerivedAge.txt ----------------------------------------------------------- */
+
+static void U_CALLCONV
+ageLineFn(void *context,
+          char *fields[][2], int32_t fieldCount,
+          UErrorCode *pErrorCode) {
+    char *s, *numberLimit;
+    uint32_t value, start, end, version;
+
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 0 at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* ignore "unassigned" (the default is already set to 0.0) */
+    s=(char *)u_skipWhitespace(fields[1][0]);
+    if(0==uprv_strncmp(s, "unassigned", 10)) {
+        return;
+    }
+
+    /* parse version number */
+    value=(uint32_t)uprv_strtoul(s, &numberLimit, 10);
+    if(s==numberLimit || value==0 || value>15 || (*numberLimit!='.' && *numberLimit!=' ' && *numberLimit!='\t' && *numberLimit!=0)) {
+        fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 1 at %s\n", fields[1][0]);
+        *pErrorCode=U_PARSE_ERROR;
+        exit(U_PARSE_ERROR);
+    }
+    version=value<<4;
+
+    /* parse minor version number */
+    if(*numberLimit=='.') {
+        s=(char *)u_skipWhitespace(numberLimit+1);
+        value=(uint32_t)uprv_strtoul(s, &numberLimit, 10);
+        if(s==numberLimit || value>15 || (*numberLimit!=' ' && *numberLimit!='\t' && *numberLimit!=0)) {
+            fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 1 at %s\n", fields[1][0]);
+            *pErrorCode=U_PARSE_ERROR;
+            exit(U_PARSE_ERROR);
+        }
+        version|=value;
+    }
+
+    if(start==0 && end==0x10ffff) {
+        /* Also set bits for initialValue and errorValue. */
+        end=UPVEC_MAX_CP;
+    }
+    upvec_setValue(pv, start, end, 0, version<<UPROPS_AGE_SHIFT, UPROPS_AGE_MASK, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops error: unable to set character age: %s\n", u_errorName(*pErrorCode));
+        exit(*pErrorCode);
+    }
+}
+
+/* ScriptExtensions.txt ----------------------------------------------------- */
+
+static void U_CALLCONV
+scriptExtensionsLineFn(void *context,
+                       char *fields[][2], int32_t fieldCount,
+                       UErrorCode *pErrorCode) {
+    uint32_t start, end;
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: syntax error in ScriptExtensions.txt field 0 at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /* parse list of script codes */
+    UnicodeString codes;  // vector of 16-bit UScriptCode values
+    char *s=fields[1][0];
+    for(;;) {
+        // skip whitespace before each token
+        s=(char *)u_skipWhitespace(s);
+        if(*s==0 || *s==';') {
+            break;
+        }
+        // skip non-whitespace, non-terminator characters to find the token limit
+        char *limit=s;
+        char c;
+        do {
+            c=*++limit;
+        } while(!U_IS_INV_WHITESPACE(c) && c!=0 && c!=';');
+        // NUL-terminated this token
+        *limit=0;
+        // convert the token (script property value alias) into a UScriptCode value
+        int32_t value=u_getPropertyValueEnum(UCHAR_SCRIPT, s);
+        if(value<0) {
+            fprintf(stderr, "genprops: syntax error in ScriptExtensions.txt field 1 at %s\n", s);
+            exit(U_INVALID_FORMAT_ERROR);
+        }
+        // Insertion sort into the list of script codes.
+        for(int32_t i=0;; ++i) {
+            if(i<codes.length()) {
+                if(value<codes[i]) {
+                    codes.insert(i, (UChar)value);
+                    break;
+                } else if(value==codes[i]) {
+                    fprintf(stderr,
+                            "genprops: duplicate script code in ScriptExtensions.txt field 1 at %s "
+                            "for U+%04lx..U+%04lx\n",
+                            s, (long)start, (long)end);
+                    exit(U_INVALID_FORMAT_ERROR);
+                }
+                // continue while value>codes[i]
+            } else {
+                codes.append((UChar)value);
+                break;
+            }
+        }
+        if(c==0 || c==';') {
+            // the token ended at a terminator
+            break;
+        } else {
+            // the token ended at U_IS_INV_WHITESPACE(c), continue after c
+            s=limit+1;
+        }
+    }
+    int32_t length=codes.length();
+    if(length==0) {
+        fprintf(stderr,
+                "genprops: missing values in ScriptExtensions.txt field 1 "
+                "for U+%04lx..U+%04lx\n",
+                (long)start, (long)end);
+        exit(U_INVALID_FORMAT_ERROR);
+    }
+    // Set bit 15 on the last script code, for termination.
+    codes.setCharAt(length-1, (UChar)(codes[length-1]|0x8000));
+    // Find this list of codes in the Script_Extensions data so far, or add this list.
+    int32_t index=scriptExtensions->indexOf(codes);
+    if(index<0) {
+        index=scriptExtensions->length();
+        scriptExtensions->append(codes);
+    }
+    // Modify the Script data for each of the start..end code points
+    // to include the Script_Extensions index.
+    do {
+        uint32_t scriptX=upvec_getValue(pv, (UChar32)start, 0)&UPROPS_SCRIPT_X_MASK;
+        // Find the next code point that has a different script value.
+        // We want to add the Script_Extensions index to the code point range start..next-1.
+        UChar32 next;
+        for(next=(UChar32)start+1;
+            next<=(UChar32)end && scriptX==(upvec_getValue(pv, next, 0)&UPROPS_SCRIPT_X_MASK);
+            ++next) {}
+        if(scriptX>=UPROPS_SCRIPT_X_WITH_COMMON) {
+            fprintf(stderr,
+                    "genprops: ScriptExtensions.txt has values for U+%04lx..U+%04lx "
+                    "which overlaps with a range including U+%04lx..U+%04lx\n",
+                    (long)start, (long)end, (long)start, (long)(next-1));
+            exit(U_INVALID_FORMAT_ERROR);
+        }
+        // Encode the (Script, Script_Extensions index) pair.
+        if(scriptX==USCRIPT_COMMON) {
+            scriptX=UPROPS_SCRIPT_X_WITH_COMMON|(uint32_t)index;
+        } else if(scriptX==USCRIPT_INHERITED) {
+            scriptX=UPROPS_SCRIPT_X_WITH_INHERITED|(uint32_t)index;
+        } else {
+            // Store an additional pair of 16-bit units for an unusual main Script code
+            // together with the Script_Extensions index.
+            UnicodeString codeIndexPair;
+            codeIndexPair.append((UChar)scriptX).append((UChar)index);
+            index=scriptExtensions->indexOf(codeIndexPair);
+            if(index<0) {
+                index=scriptExtensions->length();
+                scriptExtensions->append(codeIndexPair);
+            }
+            scriptX=UPROPS_SCRIPT_X_WITH_OTHER|(uint32_t)index;
+        }
+        if(index>UPROPS_SCRIPT_MASK) {
+            fprintf(stderr, "genprops: Script_Extensions indexes overflow bit field\n");
+            exit(U_BUFFER_OVERFLOW_ERROR);
+        }
+        // Write the (Script, Script_Extensions index) pair into
+        // the properties vector for start..next-1.
+        upvec_setValue(pv, (UChar32)start, (UChar32)(next-1),
+                        0, scriptX, UPROPS_SCRIPT_X_MASK, pErrorCode);
+        if(U_FAILURE(*pErrorCode)) {
+            fprintf(stderr, "genprops error: unable to set Script_Extensions: %s\n", u_errorName(*pErrorCode));
+            exit(*pErrorCode);
+        }
+        start=next;
+    } while(start<=end);
+}
+
+/* DerivedNumericValues.txt ------------------------------------------------- */
+
+static void U_CALLCONV
+numericLineFn(void *context,
+              char *fields[][2], int32_t fieldCount,
+              UErrorCode *pErrorCode) {
+    Props newProps={ 0 };
+    char *s, *numberLimit;
+    uint32_t start, end, value, oldProps32;
+    char c;
+    UBool isFraction;
+
+    /* get the code point range */
+    u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        fprintf(stderr, "genprops: syntax error in DerivedNumericValues.txt field 0 at %s\n", fields[0][0]);
+        exit(*pErrorCode);
+    }
+
+    /*
+     * Ignore the
+     * # @missing: 0000..10FFFF; NaN
+     * line from Unicode 5.1's DerivedNumericValues.txt:
+     * The following code cannot parse "NaN", and we don't want to overwrite
+     * the numeric values for all characters after reading most
+     * from UnicodeData.txt already.
+     */
+    if(start==0 && end==0x10ffff) {
+        return;
+    }
+
+    /* check if the numeric value is a fraction (this code does not handle any) */
+    isFraction=FALSE;
+    s=uprv_strchr(fields[1][0], '.');
+    if(s!=NULL) {
+        numberLimit=s+1;
+        while('0'<=(c=*numberLimit++) && c<='9') {
+            if(c!='0') {
+                isFraction=TRUE;
+                break;
+            }
+        }
+    }
+
+    if(isFraction) {
+        value=0;
+    } else {
+        /* parse numeric value */
+        s=(char *)u_skipWhitespace(fields[1][0]);
+
+        /* try large, single-significant-digit numbers, may otherwise overflow strtoul() */
+        if('1'<=s[0] && s[0]<='9' && s[1]=='0' && s[2]=='0') {
+            /* large integers are encoded in a special way, see store.c */
+            uint8_t exp=0;
+
+            value=s[0]-'0';
+            numberLimit=s;
+            while(*(++numberLimit)=='0') {
+                ++exp;
+            }
+            newProps.exponent=exp;
+        } else {
+            /* normal number parsing */
+            value=(uint32_t)uprv_strtoul(s, &numberLimit, 10);
+        }
+        if(numberLimit<=s || (*numberLimit!='.' && u_skipWhitespace(numberLimit)!=fields[1][1]) || value>=0x80000000) {
+            fprintf(stderr, "genprops: syntax error in DerivedNumericValues.txt field 1 at %s\n", fields[0][0]);
+            exit(U_PARSE_ERROR);
+        }
+    }
+
+    /*
+     * Unicode 4.0.1 removes the third column that used to list the numeric type.
+     * Assume that either the data is the same as in UnicodeData.txt,
+     * or else that the numeric type is "numeric".
+     * This should work because we only expect to add numeric values for
+     * Han characters; for those, UnicodeData.txt lists only ranges without
+     * specific properties for single characters.
+     */
+
+    /* set the new numeric value */
+    newProps.code=start;
+    newProps.numericValue=(int32_t)value;       /* newly parsed numeric value */
+    /* the exponent may have been set above */
+
+    for(; start<=end; ++start) {
+        uint32_t newProps32;
+        int32_t oldNtv;
+        oldProps32=getProps(start);
+        oldNtv=(int32_t)GET_NUMERIC_TYPE_VALUE(oldProps32);
+
+        if(isFraction) {
+            if(UPROPS_NTV_FRACTION_START<=oldNtv && oldNtv<UPROPS_NTV_LARGE_START) {
+                /* this code point was already listed with its numeric value in UnicodeData.txt */
+                continue;
+            } else {
+                fprintf(stderr, "genprops: not prepared for new fractions in DerivedNumericValues.txt field 1 at %s\n", fields[1][0]);
+                exit(U_PARSE_ERROR);
+            }
+        }
+
+        /*
+         * For simplicity, and because we only expect to set numeric values for Han characters,
+         * for now we only allow to set these values for Lo characters.
+         */
+        if(oldNtv==UPROPS_NTV_NONE && GET_CATEGORY(oldProps32)!=U_OTHER_LETTER) {
+            fprintf(stderr, "genprops error: new numeric value for a character other than Lo in DerivedNumericValues.txt at %s\n", fields[0][0]);
+            exit(U_PARSE_ERROR);
+        }
+
+        /* verify that we do not change an existing value (fractions were excluded above) */
+        if(oldNtv!=UPROPS_NTV_NONE) {
+            /* the code point already has a value stored */
+            newProps.numericType=UPROPS_NTV_GET_TYPE(oldNtv);
+            newProps32=makeProps(&newProps);
+            if(oldNtv!=GET_NUMERIC_TYPE_VALUE(newProps32)) {
+                fprintf(stderr, "genprops error: new numeric value differs from old one for U+%04lx\n", (long)start);
+                exit(U_PARSE_ERROR);
+            }
+            /* same value, continue */
+        } else {
+            /* the code point is getting a new numeric value */
+            newProps.numericType=(uint8_t)U_NT_NUMERIC; /* assumed numeric type, see Unicode 4.0.1 comment */
+            newProps32=makeProps(&newProps);
+            if(beVerbose) {
+                printf("adding U+%04x numeric type %d encoded-numeric-type-value 0x%03x from %s\n",
+                       (int)start, U_NT_NUMERIC, (int)GET_NUMERIC_TYPE_VALUE(newProps32), fields[0][0]);
+            }
+
+            addProps(start, newProps32|GET_CATEGORY(oldProps32));
+        }
+    }
+}
+
+/* data serialization ------------------------------------------------------- */
+
+U_CFUNC int32_t
+writeAdditionalData(FILE *f, uint8_t *p, int32_t capacity, int32_t indexes[UPROPS_INDEX_COUNT]) {
+    const uint32_t *pvArray;
+    int32_t pvRows, pvCount;
+    int32_t length;
+    UErrorCode errorCode;
+
+    pvArray=upvec_getArray(pv, &pvRows, NULL);
+    pvCount=pvRows*UPROPS_VECTOR_WORDS;
+
+    errorCode=U_ZERO_ERROR;
+    length=utrie2_serialize(newTrie, p, capacity, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr,
+                "genprops error: utrie2_freeze(additional properties)+utrie2_serialize() failed: %s\n",
+                u_errorName(errorCode));
+        exit(errorCode);
+    }
+
+    /* round up scriptExtensions to multiple of 4 bytes */
+    if(scriptExtensions->length()&1) {
+        scriptExtensions->append((UChar)0);
+    }
+
+    /* set indexes */
+    indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]=
+        indexes[UPROPS_ADDITIONAL_TRIE_INDEX]+length/4;
+    indexes[UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX]=UPROPS_VECTOR_WORDS;
+    indexes[UPROPS_SCRIPT_EXTENSIONS_INDEX]=
+        indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]+pvCount;
+    indexes[UPROPS_RESERVED_INDEX_7]=
+        indexes[UPROPS_SCRIPT_EXTENSIONS_INDEX]+scriptExtensions->length()/2;
+    indexes[UPROPS_RESERVED_INDEX_8]=indexes[UPROPS_RESERVED_INDEX_7];
+    indexes[UPROPS_DATA_TOP_INDEX]=indexes[UPROPS_RESERVED_INDEX_8];
+
+    indexes[UPROPS_MAX_VALUES_INDEX]=
+        (((int32_t)U_EA_COUNT-1)<<UPROPS_EA_SHIFT)|
+        (((int32_t)UBLOCK_COUNT-1)<<UPROPS_BLOCK_SHIFT)|
+        (((int32_t)USCRIPT_CODE_LIMIT-1)&UPROPS_SCRIPT_MASK);
+    indexes[UPROPS_MAX_VALUES_2_INDEX]=
+        (((int32_t)U_LB_COUNT-1)<<UPROPS_LB_SHIFT)|
+        (((int32_t)U_SB_COUNT-1)<<UPROPS_SB_SHIFT)|
+        (((int32_t)U_WB_COUNT-1)<<UPROPS_WB_SHIFT)|
+        (((int32_t)U_GCB_COUNT-1)<<UPROPS_GCB_SHIFT)|
+        ((int32_t)U_DT_COUNT-1);
+
+    int32_t additionalPropsSize=4*(indexes[UPROPS_DATA_TOP_INDEX]-indexes[UPROPS_ADDITIONAL_TRIE_INDEX]);
+    if(p!=NULL && additionalPropsSize<=capacity) {
+        if(beVerbose) {
+            printf("size in bytes of additional props trie:%5u\n", (int)length);
+        }
+        if(f!=NULL) {
+            usrc_writeUTrie2Arrays(f,
+                "static const uint16_t propsVectorsTrie_index[%ld]={\n", NULL,
+                newTrie,
+                "\n};\n\n");
+            usrc_writeUTrie2Struct(f,
+                "static const UTrie2 propsVectorsTrie={\n",
+                newTrie, "propsVectorsTrie_index", NULL,
+                "};\n\n");
+
+            usrc_writeArray(f,
+                "static const uint32_t propsVectors[%ld]={\n",
+                pvArray, 32, pvCount,
+                "};\n\n");
+            fprintf(f, "static const int32_t countPropsVectors=%ld;\n", (long)pvCount);
+            fprintf(f, "static const int32_t propsVectorsColumns=%ld;\n", (long)indexes[UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX]);
+
+            usrc_writeArray(f,
+                "static const uint16_t scriptExtensions[%ld]={\n",
+                scriptExtensions->getBuffer(), 16, scriptExtensions->length(),
+                "};\n\n");
+        } else {
+            p+=length;
+            length=pvCount*4;
+            uprv_memcpy(p, pvArray, length);
+
+            p+=length;
+            length=scriptExtensions->length()*2;
+            uprv_memcpy(p, scriptExtensions->getBuffer(), length);
+        }
+        if(beVerbose) {
+            printf("number of additional props vectors:    %5u\n", (int)pvRows);
+            printf("number of 32-bit words per vector:     %5u\n", UPROPS_VECTOR_WORDS);
+            printf("number of 16-bit scriptExtensions:     %5u\n", (int)scriptExtensions->length());
+        }
+    }
+
+    return additionalPropsSize;
+}
diff --git a/unicode/c/genprops/store.c b/unicode/c/genprops/store.c
new file mode 100644
index 0000000..f25ccac
--- /dev/null
+++ b/unicode/c/genprops/store.c
@@ -0,0 +1,503 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 1999-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  store.c
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 1999dec11
+*   created by: Markus W. Scherer
+*
+*   Store Unicode character properties efficiently for
+*   random access.
+*/
+
+#include <stdio.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "utrie2.h"
+#include "unicode/udata.h"
+#include "unewdata.h"
+#include "writesrc.h"
+#include "uprops.h"
+#include "genprops.h"
+
+#define DO_DEBUG_OUT 0
+
+/* Unicode character properties file format ------------------------------------
+
+The file format prepared and written here contains several data
+structures that store indexes or data.
+
+Before the data contents described below, there are the headers required by
+the udata API for loading ICU data. Especially, a UDataInfo structure
+precedes the actual data. It contains platform properties values and the
+file format version.
+
+The following is a description of format version 7 .
+
+Data contents:
+
+The contents is a parsed, binary form of several Unicode character
+database files, most prominently UnicodeData.txt.
+
+Any Unicode code point from 0 to 0x10ffff can be looked up to get
+the properties, if any, for that code point. This means that the input
+to the lookup are 21-bit unsigned integers, with not all of the
+21-bit range used.
+
+It is assumed that client code keeps a uint32_t pointer
+to the beginning of the data:
+
+    const uint32_t *p32;
+
+Formally, the file contains the following structures:
+
+    const int32_t indexes[16] with values i0..i15:
+
+  i0 indicates the length of the main trie.
+  i0..i3 all have the same value in format versions 4.0 and higher;
+         the related props32[] and exceptions[] and uchars[] were used in format version 3
+
+    i0 propsIndex; -- 32-bit unit index to the table of 32-bit properties words
+    i1 exceptionsIndex;  -- 32-bit unit index to the table of 32-bit exception words
+    i2 exceptionsTopIndex; -- 32-bit unit index to the array of UChars for special mappings
+
+    i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties
+    i4 additionalVectorsIndex; -- 32-bit unit index to the table of properties vectors
+    i5 additionalVectorsColumns; -- number of 32-bit words per properties vector
+
+    i6 scriptExtensionsIndex; -- 32-bit unit index to the Script_Extensions data
+    i7 reservedIndex7; -- 32-bit unit index to the top of the Script_Extensions data
+    i8 reservedIndex8; -- for now: i7, i8 and i9 have the same values
+    i9 dataTopIndex; -- size of the data file (number of 32-bit units after the header)
+
+    i10 maxValues; -- maximum code values for vector word 0, see uprops.h (new in format version 3.1+)
+    i11 maxValues2; -- maximum code values for vector word 2, see uprops.h (new in format version 3.2)
+    i12..i15 reservedIndexes; -- reserved values; 0 for now
+
+    PT serialized properties trie, see utrie2.h (byte size: 4*(i0-16))
+
+  P, E, and U are not used (empty) in format versions 4 and above
+
+    P  const uint32_t props32[i1-i0];
+    E  const uint32_t exceptions[i2-i1];
+    U  const UChar uchars[2*(i3-i2)];
+
+    AT serialized trie for additional properties (byte size: 4*(i4-i3))
+    PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4];
+
+    SCX const uint16_t scriptExtensions[2*(i7-i6)];
+
+      SCX contains Script_Extensions lists and (Script code, Script_Extensions index) pairs.
+      A Script_Extensions list is a sequence of UScriptCode values in ascending order,
+      with the last code having bit 15 set for termination.
+      A (Script code, Script_Extensions index) pair is the main UScriptCode (Script value)
+      followed by the index of the Script_Extensions list.
+      If the propsVectors[] column 0 value indicates that there are Script_Extensions,
+      then the UPROPS_SCRIPT_MASK bit field is an index to either a list or a pair in SCX,
+      rather than the Script itself. The high bits in the UPROPS_SCRIPT_X_MASK fields
+      indicate whether the main Script value is Common or Inherited (and the index is to a list)
+      vs. another value (and the index is to a pair).
+      (See UPROPS_SCRIPT_X_WITH_COMMON etc. in uprops.h.)
+
+Trie lookup and properties:
+
+In order to condense the data for the 21-bit code space, several properties of
+the Unicode code assignment are exploited:
+- The code space is sparse.
+- There are several 10k of consecutive codes with the same properties.
+- Characters and scripts are allocated in groups of 16 code points.
+- Inside blocks for scripts the properties are often repetitive.
+- The 21-bit space is not fully used for Unicode.
+
+The lookup of properties for a given code point is done with a trie lookup,
+using the UTrie implementation.
+The trie lookup result is a 16-bit properties word.
+
+With a given Unicode code point
+
+    UChar32 c;
+
+and 0<=c<0x110000, the lookup is done like this:
+
+    uint16_t props;
+    UTRIE_GET16(trie, c, props);
+
+Each 16-bit properties word contains:
+
+ 0.. 4  general category
+     5  reserved
+ 6..15  numeric type and value (ntv)
+
+Encoding of numeric type and value in the 10-bit ntv field:
+    ntv             type            value
+    0               U_NT_NONE       0
+    1..10           U_NT_DECIMAL    0..9
+    11..20          U_NT_DIGIT      0..9
+    21..0x2ff       U_NT_NUMERIC    see below
+    0x300..0x3ff    reserved
+
+    For U_NT_NUMERIC:
+    ntv             value
+    21..0xaf        integer     0..154
+    0xb0..0x1df     fraction    ((ntv>>4)-12) / ((ntv&0xf)+1) = -1..17 / 1..16
+    0x1e0..0x2ff    large int   ((ntv>>5)-14) * 10^((ntv&0x1f)+2) = (1..9)*(10^2..10^33)
+                    (only one significant decimal digit)
+
+--- Additional properties (new in format version 2.1) ---
+
+The second trie for additional properties (AT) is also a UTrie with 16-bit data.
+The data words consist of 32-bit unit indexes (not row indexes!) into the
+table of unique properties vectors (PV).
+Each vector contains a set of properties.
+The width of a vector (number of uint32_t per row) may change
+with the formatVersion, it is stored in i5.
+
+Current properties: see icu/source/common/uprops.h
+
+--- Changes in format version 3.1 ---
+
+See i10 maxValues above, contains only UBLOCK_COUNT and USCRIPT_CODE_LIMIT.
+
+--- Changes in format version 3.2 ---
+
+- The tries use linear Latin-1 ranges.
+- The additional properties bits store full properties XYZ instead
+  of partial Other_XYZ, so that changes in the derivation formulas
+  need not be tracked in runtime library code.
+- Joining Type and Line Break are also stored completely, so that uprops.c
+  needs no runtime formulas for enumerated properties either.
+- Store the case-sensitive flag in the main properties word.
+- i10 also contains U_LB_COUNT and U_EA_COUNT.
+- i11 contains maxValues2 for vector word 2.
+
+--- Changes in format version 4 ---
+
+The format changes between version 3 and 4 because the properties related to
+case mappings and bidi/shaping are pulled out into separate files
+for modularization.
+In order to reduce the need for code changes, some of the previous data
+structures are omitted, rather than rearranging everything.
+
+(The change to format version 4 is for ICU 3.4. The last CVS revision of
+genprops/store.c for format version 3.2 is 1.48.)
+
+The main trie's data is significantly simplified:
+- The trie's 16-bit data word is used directly instead of as an index
+  into props32[].
+- The trie uses the default trie folding functions instead of custom ones.
+- Numeric values are stored directly in the trie data word, with special
+  encodings.
+- No more exception data (the data that needed it was pulled out, or, in the
+  case of numeric values, encoded differently).
+- No more string data (pulled out - was for case mappings).
+
+Also, some of the previously used properties vector bits are reserved again.
+
+The indexes[] values for the omitted structures are still filled in
+(indicating zero-length arrays) so that the swapper code remains unchanged.
+
+--- Changes in format version 5 ---
+
+Format version 5 became necessary because the bit field for script codes
+overflowed. The changes are incompatible because
+old code would have seen nonsensically low values for new, higher script codes.
+
+Rearranged bit fields in the second trie (AT) and widened three (Script, Block,
+Word_Break) by one bit each.
+
+Modified bit fields in icu/source/common/uprops.h
+
+--- Changes in format version 6 ---
+
+Format version 6 became necessary because Unicode 5.2 adds fractions with
+denominators 9, 10 and 16, and it was easier to redesign the encoding of numeric
+types and values rather than add another variant to the previous format.
+
+--- Changes in format version 7 ---
+
+Unicode 6.0 adds Script_Extensions. For characters with script extensions data,
+the script code bits are an index into the new Script_Extensions array rather
+than a script code.
+
+Change from UTrie to UTrie2.
+
+----------------------------------------------------------------------------- */
+
+/* UDataInfo cf. udata.h */
+static UDataInfo dataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    U_SIZEOF_UCHAR,
+    0,
+
+    { 0x55, 0x50, 0x72, 0x6f },                 /* dataFormat="UPro" */
+    { 7, 0, 0, 0 },                             /* formatVersion */
+    { 6, 0, 0, 0 }                              /* dataVersion */
+};
+
+static UTrie2 *pTrie=NULL;
+
+/* -------------------------------------------------------------------------- */
+
+U_CFUNC void
+setUnicodeVersion(const char *v) {
+    UVersionInfo version;
+    u_versionFromString(version, v);
+    uprv_memcpy(dataInfo.dataVersion, version, 4);
+}
+
+U_CFUNC void
+initStore() {
+    UErrorCode errorCode=U_ZERO_ERROR;
+    pTrie=utrie2_open(0, 0, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "error: utrie2_open() failed - %s\n", u_errorName(errorCode));
+        exit(errorCode);
+    }
+
+    initAdditionalProperties();
+}
+
+U_CFUNC void
+exitStore() {
+    utrie2_close(pTrie);
+    exitAdditionalProperties();
+}
+
+/* store a character's properties ------------------------------------------- */
+
+U_CFUNC uint32_t
+makeProps(Props *p) {
+    uint32_t den;
+    int32_t type, value, exp, ntv;
+
+    /* encode numeric type & value */
+    type=p->numericType;
+    value=p->numericValue;
+    den=p->denominator;
+    exp=p->exponent;
+
+    ntv=-1; /* the numeric type and value cannot be encoded if ntv remains -1 */
+    switch(type) {
+    case U_NT_NONE:
+        if(value==0 && den==0 && exp==0) {
+            ntv=UPROPS_NTV_NONE;
+        }
+        break;
+    case U_NT_DECIMAL:
+        if(0<=value && value<=9 && den==0 && exp==0) {
+            ntv=UPROPS_NTV_DECIMAL_START+value;
+        }
+        break;
+    case U_NT_DIGIT:
+        if(0<=value && value<=9 && den==0 && exp==0) {
+            ntv=UPROPS_NTV_DIGIT_START+value;
+        }
+        break;
+    case U_NT_NUMERIC:
+        if(den==0) {
+            if(exp==2 && (value*100)<=UPROPS_NTV_MAX_SMALL_INT) {
+                /* small integer parsed like a large one */
+                ntv=UPROPS_NTV_NUMERIC_START+value*100;
+            } else if(exp==0 && value>=0) {
+                if(value<=UPROPS_NTV_MAX_SMALL_INT) {
+                    /* small integer */
+                    ntv=UPROPS_NTV_NUMERIC_START+value;
+                } else {
+                    /* large integer parsed like a small one */
+                    /* split the value into mantissa and exponent, base 10 */
+                    int32_t mant=value;
+                    while((mant%10)==0) {
+                        mant/=10;
+                        ++exp;
+                    }
+                    if(mant<=9) {
+                        ntv=((mant+14)<<5)+(exp-2);
+                    }
+                }
+            } else if(2<=exp && exp<=33 && 1<=value && value<=9) {
+                /* large, single-significant-digit integer */
+                ntv=((value+14)<<5)+(exp-2);
+            }
+        } else if(exp==0) {
+            if(-1<=value && value<=17 && 1<=den && den<=16) {
+                /* fraction */
+                ntv=((value+12)<<4)+(den-1);
+            }
+        }
+    default:
+        break;
+    }
+    if(ntv<0) {
+        fprintf(stderr, "genprops error: unable to encode numeric type %d & value %ld/%lu E%d\n",
+                (int)type, (long)value, (unsigned long)den, exp);
+        exit(U_ILLEGAL_ARGUMENT_ERROR);
+    }
+
+    /* encode the properties */
+    return
+        (uint32_t)p->generalCategory |
+        (ntv<<UPROPS_NUMERIC_TYPE_VALUE_SHIFT);
+}
+
+U_CFUNC void
+addProps(uint32_t c, uint32_t x) {
+    UErrorCode errorCode=U_ZERO_ERROR;
+    utrie2_set32(pTrie, (UChar32)c, x, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "error: utrie2_set32(properties trie) failed - %s\n",
+                u_errorName(errorCode));
+        exit(errorCode);
+    }
+}
+
+U_CFUNC uint32_t
+getProps(uint32_t c) {
+    return utrie2_get32(pTrie, (UChar32)c);
+}
+
+/* areas of same properties ------------------------------------------------- */
+
+U_CFUNC void
+repeatProps(uint32_t first, uint32_t last, uint32_t x) {
+    UErrorCode errorCode=U_ZERO_ERROR;
+    utrie2_setRange32(pTrie, (UChar32)first, (UChar32)last, x, FALSE, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "error: utrie2_set32(properties trie) failed - %s\n",
+                u_errorName(errorCode));
+        exit(errorCode);
+    }
+}
+
+/* generate output data ----------------------------------------------------- */
+
+U_CFUNC void
+generateData(const char *dataDir, UBool csource) {
+    static int32_t indexes[UPROPS_INDEX_COUNT]={
+        0, 0, 0, 0,
+        0, 0, 0, 0,
+        0, 0, 0, 0,
+        0, 0, 0, 0
+    };
+    static uint8_t trieBlock[40000];
+    static uint8_t additionalProps[120000];
+
+    UNewDataMemory *pData;
+    UErrorCode errorCode=U_ZERO_ERROR;
+    uint32_t size = 0;
+    int32_t trieSize, additionalPropsSize, offset;
+    long dataLength;
+
+    utrie2_freeze(pTrie, UTRIE2_16_VALUE_BITS, &errorCode);
+    trieSize=utrie2_serialize(pTrie, trieBlock, sizeof(trieBlock), &errorCode);
+    if(U_FAILURE(errorCode)) {
+        fprintf(stderr, "error: utrie2_freeze(main trie)+utrie2_serialize() failed: %s (length %ld)\n",
+                u_errorName(errorCode), (long)trieSize);
+        exit(errorCode);
+    }
+
+    offset=sizeof(indexes)/4;               /* uint32_t offset to the properties trie */
+
+    /* round up trie size to 4-alignment */
+    while(trieSize&3) {
+        trieBlock[trieSize++]=0;
+    }
+    offset+=trieSize>>2;
+    indexes[UPROPS_PROPS32_INDEX]=          /* set indexes to the same offsets for empty */
+    indexes[UPROPS_EXCEPTIONS_INDEX]=       /* structures from the old format version 3 */
+    indexes[UPROPS_EXCEPTIONS_TOP_INDEX]=   /* so that less runtime code has to be changed */
+    indexes[UPROPS_ADDITIONAL_TRIE_INDEX]=offset;
+
+    if(beVerbose) {
+        printf("trie size in bytes:                    %5u\n", (int)trieSize);
+    }
+
+    if(csource) {
+        /* write .c file for hardcoded data */
+        FILE *f=usrc_create(dataDir, "uchar_props_data.c");
+        if(f!=NULL) {
+            /* unused
+            usrc_writeArray(f,
+                "static const UVersionInfo formatVersion={",
+                dataInfo.formatVersion, 8, 4,
+                "};\n\n");
+             */
+            usrc_writeArray(f,
+                "static const UVersionInfo dataVersion={",
+                dataInfo.dataVersion, 8, 4,
+                "};\n\n");
+            usrc_writeUTrie2Arrays(f,
+                "static const uint16_t propsTrie_index[%ld]={\n", NULL,
+                pTrie,
+                "\n};\n\n");
+            usrc_writeUTrie2Struct(f,
+                "static const UTrie2 propsTrie={\n",
+                pTrie, "propsTrie_index", NULL,
+                "};\n\n");
+
+            additionalPropsSize=writeAdditionalData(f, additionalProps, sizeof(additionalProps), indexes);
+            size=4*offset+additionalPropsSize;      /* total size of data */
+
+            usrc_writeArray(f,
+                "static const int32_t indexes[UPROPS_INDEX_COUNT]={",
+                indexes, 32, UPROPS_INDEX_COUNT,
+                "};\n\n");
+            fclose(f);
+        }
+    } else {
+        /* write the data */
+        pData=udata_create(dataDir, DATA_TYPE, DATA_NAME, &dataInfo,
+                        haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "genprops: udata_create(%s, %s.%s) failed - %s\n",
+                    dataDir, DATA_NAME, DATA_TYPE,
+                    u_errorName(errorCode));
+            exit(errorCode);
+        }
+
+        additionalPropsSize=writeAdditionalData(NULL, additionalProps, sizeof(additionalProps), indexes);
+        size=4*offset+additionalPropsSize;      /* total size of data */
+
+        udata_writeBlock(pData, indexes, sizeof(indexes));
+        udata_writeBlock(pData, trieBlock, trieSize);
+        udata_writeBlock(pData, additionalProps, additionalPropsSize);
+
+        /* finish up */
+        dataLength=udata_finish(pData, &errorCode);
+        if(U_FAILURE(errorCode)) {
+            fprintf(stderr, "genprops: error %d writing the output file\n", errorCode);
+            exit(errorCode);
+        }
+
+        if(dataLength!=(long)size) {
+            fprintf(stderr, "genprops: data length %ld != calculated size %lu\n",
+                dataLength, (unsigned long)size);
+            exit(U_INTERNAL_PROGRAM_ERROR);
+        }
+    }
+
+    if(beVerbose) {
+        printf("data size:                            %6lu\n", (unsigned long)size);
+    }
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/genuca/CMakeLists.txt b/unicode/c/genuca/CMakeLists.txt
new file mode 100644
index 0000000..f2d7595
--- /dev/null
+++ b/unicode/c/genuca/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(genuca genuca.cpp)
+target_link_libraries(genuca icuuc icui18n icutu)
diff --git a/unicode/c/genuca/Makefile.in b/unicode/c/genuca/Makefile.in
new file mode 100644
index 0000000..2f138e2
--- /dev/null
+++ b/unicode/c/genuca/Makefile.in
@@ -0,0 +1,96 @@
+## Makefile.in for ICU - tools/genuca
+## Copyright (c) 1999-2008, International Business Machines Corporation and
+## others. All Rights Reserved.
+
+## Source directory information
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+top_builddir = ../..
+
+include $(top_builddir)/icudefs.mk
+
+## Build directory information
+subdir = tools/genuca
+
+TARGET_STUB_NAME = genuca
+
+SECTION = 8
+
+MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
+
+
+## Extra files to remove for 'make clean'
+CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+## Target information
+TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+
+ifneq ($(top_builddir),$(top_srcdir))
+CPPFLAGS += -I$(top_builddir)/common
+endif
+CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil
+LIBS = $(LIBICUTOOLUTIL) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+
+OBJECTS = genuca.o 
+
+DEPS = $(OBJECTS:.o=.d)
+
+## List of phony targets
+.PHONY : all all-local install install-local clean clean-local	\
+distclean distclean-local dist dist-local check check-local install-man
+
+## Clear suffix list
+.SUFFIXES :
+
+## List of standard targets
+all: all-local
+install: install-local
+clean: clean-local
+distclean : distclean-local
+dist: dist-local
+check: all check-local
+
+all-local: $(TARGET) $(MAN_FILES)
+
+install-local: all-local install-man
+	$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
+install-man: $(MAN_FILES)
+	$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+	$(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
+
+dist-local:
+
+clean-local:
+	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
+	$(RMV) $(TARGET) $(OBJECTS)
+
+distclean-local: clean-local
+	$(RMV) Makefile
+
+check-local: all-local
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(TARGET) : $(OBJECTS)
+	$(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) 
+	$(POST_BUILD_STEP)
+
+
+%.$(SECTION): $(srcdir)/%.$(SECTION).in
+	cd $(top_builddir) \
+	 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+ifeq (,$(MAKECMDGOALS))
+-include $(DEPS)
+else
+ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
+-include $(DEPS)
+endif
+endif
+
diff --git a/unicode/c/genuca/genteststub.py b/unicode/c/genuca/genteststub.py
new file mode 100755
index 0000000..e3fde85
--- /dev/null
+++ b/unicode/c/genuca/genteststub.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+#   Copyright (C) 2009, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+#   file name:  genteststub.py
+#   encoding:   US-ASCII
+#   tab size:   8 (not used)
+#   indentation:2
+
+__author__ = "Claire Ho"
+
+import sys
+
+# read file
+print "command:  python genteststub.py <inputFileName.txt>  <outputFileName.txt>"
+print "if the fileName.txt is omitted, the default data file is CollationTest_NON_IGNORABLE_SHORT.txt"
+if len(sys.argv) >= 2:
+  fname=sys.argv[1]
+else :
+  fname="CollationTest_NON_IGNORABLE_SHORT.txt"
+openfile = open(fname, 'r');
+
+#output file name
+ext=fname.find(".txt");
+if len(sys.argv) >=3 :
+  wFname = sys.argv[2]
+elif (ext>0) :
+  wFname = fname[:ext+1]+"_STUB.txt"
+else :
+  wFname = "out.txt"
+wrfile = open(wFname,'w')
+
+print "Reading file: "+fname+" ..."
+print "Writing file: "+wFname+" ..."
+count=10
+for line in openfile.readlines():
+  pos = line.find("#")
+  if pos == 0:
+    # print the header
+    wrfile.write(line.rstrip()+"\n")
+    continue
+  if pos >= 0: line = line[:pos]
+  line = line.rstrip()
+  if line:
+    if (count==10):
+      wrfile.write(line+"\n")
+      count=0
+    count=count+1
+if count!=1:
+  if line:
+    wrfile.write(line+"\n")  # write the last case
+wrfile.close()
+openfile.close()
diff --git a/unicode/c/genuca/genuca.8.in b/unicode/c/genuca/genuca.8.in
new file mode 100644
index 0000000..e8ab27d
--- /dev/null
+++ b/unicode/c/genuca/genuca.8.in
@@ -0,0 +1,94 @@
+.\" Hey, Emacs! This is -*-nroff-*- you know...
+.\"
+.\" genuca.8: manual page for the genuca utility
+.\"
+.\" Copyright (C) 2000-2001 IBM, Inc. and others.
+.\"
+.TH GENUCA 8 "22 February 2001" "ICU MANPAGE" "ICU @VERSION@ Manual"
+.SH NAME
+.B genuca
+\- create the UCA data table
+.SH SYNOPSIS
+.B genuca
+[
+.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
+]
+[
+.BR "\-V\fP, \fB\-\-version"
+]
+[
+.BR "\-v\fP, \fB\-\-verbose"
+]
+[
+.BI "\-c\fP, \fB\-\-copyright"
+]
+[
+.BI "\-s\fP, \fB\-\-sourcedir" " source"
+]
+[
+.BI "\-d\fP, \fB\-\-destdir" " destination"
+]
+[
+.IR file
+]
+.SH DESCRIPTION
+.B genuca
+compiles the Unicode Collation Algorithm (UCA) data from
+.I file
+(or from
+.B FractionalUCA.txt
+if
+.I file
+is omitted) into its binary form, the files
+.B ucadata.dat
+and
+.BR invuca.dat .
+These binary files can then be read directly by ICU, or used by
+.BR pkgdata (8)
+for incorporation into a larger archive or library.
+.SH OPTIONS
+.TP
+.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
+Print help about usage and exit.
+.TP
+.BR "\-V\fP, \fB\-\-version"
+Print the version of
+.B genuca
+and exit.
+.TP
+.BR "\-v\fP, \fB\-\-verbose"
+Display extra informative messages during execution.
+.TP
+.BI "\-c\fP, \fB\-\-copyright"
+Include a copyright notice into the binary data.
+.TP
+.BI "\-s\fP, \fB\-\-sourcedir" " source"
+Set the source directory to
+.IR source .
+The default source directory is specified by the environment variable
+.BR ICU_DATA .
+.TP
+.BI "\-d\fP, \fB\-\-destdir" " destination"
+Set the destination directory to
+.IR destination .
+The default destination directory is specified by the environment variable
+.BR ICU_DATA .
+.SH ENVIRONMENT
+.TP 10
+.B ICU_DATA
+Specifies the directory containing ICU data. Defaults to
+.BR @thepkgicudatadir@/@PACKAGE@/@VERSION@/ .
+Some tools in ICU depend on the presence of the trailing slash. It is thus
+important to make sure that it is present if
+.B ICU_DATA
+is set.
+.SH FILES
+.TP 15
+.B FractionalUCA.txt
+Machine-readable file containing data for the Unicode collation algorithm.
+.SH VERSION
+@VERSION@
+.SH COPYRIGHT
+Copyright (C) 2001 IBM, Inc. and others.
+.SH SEE ALSO
+.BR pkgdata (8)
diff --git a/unicode/c/genuca/genuca.cpp b/unicode/c/genuca/genuca.cpp
new file mode 100644
index 0000000..b6ec9d5
--- /dev/null
+++ b/unicode/c/genuca/genuca.cpp
@@ -0,0 +1,1590 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2000-2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genuca.cpp
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created at the end of XX century
+*   created by: Vladimir Weinstein
+*
+*   This program reads the Franctional UCA table and generates
+*   internal format for UCA table as well as inverse UCA table.
+*   It then writes binary files containing the data: ucadata.dat 
+*   & invuca.dat
+*   Change history:
+*   02/23/2001  grhoten                 Made it into a tool
+*   02/23/2001  weiv                    Moved element & table handling code to i18n
+*   05/09/2001  weiv                    Case bits are now in the CEs, not in front
+*   10/26/2010  sgill                   Support for reordering codes
+*/
+
+#include "unicode/utypes.h"
+#include "unicode/putil.h"
+#include "unicode/udata.h"
+#include "unicode/uclean.h"
+#include "unicode/uscript.h"
+#include "unicode/ustring.h"
+#include "ucol_bld.h"
+#include "ucol_imp.h"
+#include "genuca.h"
+#include "uoptions.h"
+#include "uparse.h"
+#include "toolutil.h"
+#include "unewdata.h"
+#include "cstring.h"
+#include "cmemory.h"
+
+#include <stdio.h>
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+
+// script reordering structures
+typedef struct {
+    uint16_t reorderCode;
+    uint16_t offset;
+} ReorderIndex;
+
+typedef struct {
+    uint16_t LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH;
+    uint16_t* LEAD_BYTE_TO_SCRIPTS_INDEX;
+    uint16_t LEAD_BYTE_TO_SCRIPTS_DATA_LENGTH;
+    uint16_t* LEAD_BYTE_TO_SCRIPTS_DATA;
+    uint16_t LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET;
+    
+    uint16_t SCRIPT_TO_LEAD_BYTES_INDEX_LENGTH;
+    ReorderIndex* SCRIPT_TO_LEAD_BYTES_INDEX;
+    uint16_t SCRIPT_TO_LEAD_BYTES_INDEX_COUNT;
+    uint16_t SCRIPT_TO_LEAD_BYTES_DATA_LENGTH;
+    uint16_t* SCRIPT_TO_LEAD_BYTES_DATA;
+    uint16_t SCRIPT_TO_LEAD_BYTES_DATA_OFFSET;
+} LeadByteConstants;
+
+int ReorderIndexComparer(const void *a, const void *b) {
+    return reinterpret_cast<const ReorderIndex*>(a)->reorderCode - reinterpret_cast<const ReorderIndex*>(b)->reorderCode;    
+}
+
+/*
+ * Global - verbosity
+ */
+UBool VERBOSE = FALSE;
+
+static UVersionInfo UCAVersion;
+
+#if UCONFIG_NO_COLLATION
+
+/* dummy UDataInfo cf. udata.h */
+static UDataInfo dummyDataInfo = {
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    U_SIZEOF_UCHAR,
+    0,
+
+    { 0, 0, 0, 0 },                 /* dummy dataFormat */
+    { 0, 0, 0, 0 },                 /* dummy formatVersion */
+    { 0, 0, 0, 0 }                  /* dummy dataVersion */
+};
+
+#else
+
+static const UDataInfo ucaDataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    sizeof(UChar),
+    0,
+
+    {UCA_DATA_FORMAT_0, UCA_DATA_FORMAT_1, UCA_DATA_FORMAT_2, UCA_DATA_FORMAT_3},     /* dataFormat="UCol"            */
+    /* 03/26/2002 bumped up version since format has changed */
+    /* 09/16/2002 bumped up version since we went from UColAttributeValue */
+    /*            to int32_t in UColOptionSet */
+    /* 05/13/2003 This one also updated since we added UCA and UCD versions */
+    /*            to header */
+    /* 09/11/2003 Adding information required by data swapper */
+    {UCA_FORMAT_VERSION_0, UCA_FORMAT_VERSION_1, UCA_FORMAT_VERSION_2, UCA_FORMAT_VERSION_3},                 /* formatVersion                */
+    {0, 0, 0, 0}                  /* dataVersion = Unicode Version*/
+};
+
+static const UDataInfo invUcaDataInfo={
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    sizeof(UChar),
+    0,
+
+    {INVUCA_DATA_FORMAT_0, INVUCA_DATA_FORMAT_1, INVUCA_DATA_FORMAT_2, INVUCA_DATA_FORMAT_3},     /* dataFormat="InvC"            */
+    /* 03/26/2002 bumped up version since format has changed */
+    /* 04/29/2003 2.1 format - we have added UCA version to header */
+    {INVUCA_FORMAT_VERSION_0, INVUCA_FORMAT_VERSION_1, INVUCA_FORMAT_VERSION_2, INVUCA_FORMAT_VERSION_3},                 /* formatVersion                */
+    {0, 0, 0, 0}                  /* dataVersion = Unicode Version*/
+};
+
+UCAElements le;
+
+// returns number of characters read
+int32_t readElement(char **from, char *to, char separator, UErrorCode *status) {
+    if(U_FAILURE(*status)) {
+        return 0;
+    }
+    char buffer[1024];
+    int32_t i = 0;
+    while(**from != separator) {
+        if (**from == '\0') {
+            return 0;
+        }
+        if(**from != ' ') {
+            *(buffer+i++) = **from;
+        }
+        (*from)++;
+    }
+    (*from)++;
+    *(buffer + i) = 0;
+    //*to = (char *)malloc(strlen(buffer)+1);
+    strcpy(to, buffer);
+    return i;
+}
+
+int32_t skipUntilWhiteSpace(char **from, UErrorCode *status) {
+    if (U_FAILURE(*status)) {
+        return 0;
+    }
+    int32_t count = 0;
+    while (**from != ' ' && **from != '\t' && **from != '\0') {
+        (*from)++;
+        count++;
+    }
+    return count;
+}
+
+int32_t skipWhiteSpace(char **from, UErrorCode *status) {
+    if (U_FAILURE(*status)) {
+        return 0;
+    }
+    int32_t count = 0;
+    while (**from == ' ' || **from == '\t') {
+        (*from)++;
+        count++;
+    }
+    return count;
+}
+
+uint32_t getSingleCEValue(char *primary, char *secondary, char *tertiary, UErrorCode *status) {
+    if(U_FAILURE(*status)) {
+        return 0;
+    }
+    uint32_t value = 0;
+    char primsave = '\0';
+    char secsave = '\0';
+    char tersave = '\0';
+    char *primend = primary+4;
+    if(strlen(primary) > 4) {
+        primsave = *primend;
+        *primend = '\0';
+    }
+    char *secend = secondary+2;
+    if(strlen(secondary) > 2) {
+        secsave = *secend;
+        *secend = '\0';
+    }
+    char *terend = tertiary+2;
+    if(strlen(tertiary) > 2) {
+        tersave = *terend;
+        *terend = '\0';
+    }
+    uint32_t primvalue = (uint32_t)((*primary!='\0')?strtoul(primary, &primend, 16):0);
+    uint32_t secvalue = (uint32_t)((*secondary!='\0')?strtoul(secondary, &secend, 16):0);
+    uint32_t tervalue = (uint32_t)((*tertiary!='\0')?strtoul(tertiary, &terend, 16):0);
+    if(primvalue <= 0xFF) {
+      primvalue <<= 8;
+    }
+
+    value = ((primvalue<<UCOL_PRIMARYORDERSHIFT)&UCOL_PRIMARYORDERMASK)|
+        ((secvalue<<UCOL_SECONDARYORDERSHIFT)&UCOL_SECONDARYORDERMASK)|
+        (tervalue&UCOL_TERTIARYORDERMASK);
+
+    if(primsave!='\0') {
+        *primend = primsave;
+    }
+    if(secsave!='\0') {
+        *secend = secsave;
+    }
+    if(tersave!='\0') {
+        *terend = tersave;
+    }
+    return value;
+}
+
+static uint32_t inverseTable[0xFFFF][3];
+static uint32_t inversePos = 0;
+static UChar stringContinue[0xFFFF];
+static uint32_t sContPos = 0;
+
+static void addNewInverse(UCAElements *element, UErrorCode *status) {
+  if(U_FAILURE(*status)) {
+    return;
+  }
+  if(VERBOSE && isContinuation(element->CEs[1])) {
+    //fprintf(stdout, "+");
+  }
+  inversePos++;
+  inverseTable[inversePos][0] = element->CEs[0];
+  if(element->noOfCEs > 1 && isContinuation(element->CEs[1])) {
+    inverseTable[inversePos][1] = element->CEs[1];
+  } else {
+    inverseTable[inversePos][1] = 0;
+  }
+  if(element->cSize < 2) {
+    inverseTable[inversePos][2] = element->cPoints[0];
+  } else { /* add a new store of cruft */
+    inverseTable[inversePos][2] = ((element->cSize+1) << UCOL_INV_SHIFTVALUE) | sContPos;
+    memcpy(stringContinue+sContPos, element->cPoints, element->cSize*sizeof(UChar));
+    sContPos += element->cSize+1;
+  }
+}
+
+static void insertInverse(UCAElements *element, uint32_t position, UErrorCode *status) {
+  if(U_FAILURE(*status)) {
+    return;
+  }
+
+  if(VERBOSE && isContinuation(element->CEs[1])) {
+    //fprintf(stdout, "+");
+  }
+  if(position <= inversePos) {
+    /*move stuff around */
+    uint32_t amountToMove = (inversePos - position+1)*sizeof(inverseTable[0]);
+    uprv_memmove(inverseTable[position+1], inverseTable[position], amountToMove);
+  }
+  inverseTable[position][0] = element->CEs[0];
+  if(element->noOfCEs > 1 && isContinuation(element->CEs[1])) {
+    inverseTable[position][1] = element->CEs[1];
+  } else {
+    inverseTable[position][1] = 0;
+  }
+  if(element->cSize < 2) {
+    inverseTable[position][2] = element->cPoints[0];
+  } else { /* add a new store of cruft */
+    inverseTable[position][2] = ((element->cSize+1) << UCOL_INV_SHIFTVALUE) | sContPos;
+    memcpy(stringContinue+sContPos, element->cPoints, element->cSize*sizeof(UChar));
+    sContPos += element->cSize+1;
+  }
+  inversePos++;
+}
+
+static void addToExistingInverse(UCAElements *element, uint32_t position, UErrorCode *status) {
+
+  if(U_FAILURE(*status)) {
+    return;
+  }
+
+      if((inverseTable[position][2] & UCOL_INV_SIZEMASK) == 0) { /* single element, have to make new extension place and put both guys there */
+        stringContinue[sContPos] = (UChar)inverseTable[position][2];
+        inverseTable[position][2] = ((element->cSize+3) << UCOL_INV_SHIFTVALUE) | sContPos;
+        sContPos++;
+        stringContinue[sContPos++] = 0xFFFF;
+        memcpy(stringContinue+sContPos, element->cPoints, element->cSize*sizeof(UChar));
+        sContPos += element->cSize;
+        stringContinue[sContPos++] = 0xFFFE;
+      } else { /* adding to the already existing continuing table */
+        uint32_t contIndex = inverseTable[position][2] & UCOL_INV_OFFSETMASK;
+        uint32_t contSize = (inverseTable[position][2] & UCOL_INV_SIZEMASK) >> UCOL_INV_SHIFTVALUE;
+
+        if(contIndex+contSize < sContPos) {
+          /*fprintf(stderr, ".", sContPos, contIndex+contSize);*/
+          memcpy(stringContinue+contIndex+contSize+element->cSize+1, stringContinue+contIndex+contSize, (element->cSize+1)*sizeof(UChar));
+        }
+
+        stringContinue[contIndex+contSize-1] = 0xFFFF;
+        memcpy(stringContinue+contIndex+contSize, element->cPoints, element->cSize*sizeof(UChar));
+        sContPos += element->cSize+1;
+        stringContinue[contIndex+contSize+element->cSize] = 0xFFFE;
+
+        inverseTable[position][2] = ((contSize+element->cSize+1) << UCOL_INV_SHIFTVALUE) | contIndex;
+      }
+}
+
+/* 
+ * Takes two CEs (lead and continuation) and 
+ * compares them as CEs should be compared:
+ * primary vs. primary, secondary vs. secondary
+ * tertiary vs. tertiary
+ */
+static int32_t compareCEs(uint32_t *source, uint32_t *target) {
+  uint32_t s1 = source[0], s2, t1 = target[0], t2;
+  if(isContinuation(source[1])) {
+    s2 = source[1];
+  } else {
+    s2 = 0;
+  }
+  if(isContinuation(target[1])) {
+    t2 = target[1];
+  } else {
+    t2 = 0;
+  }
+  
+  uint32_t s = 0, t = 0;
+  if(s1 == t1 && s2 == t2) {
+    return 0;
+  }
+  s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16); 
+  t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16); 
+  if(s < t) {
+    return -1;
+  } else if(s > t) {
+    return 1;
+  } else {
+    s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8;
+    t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8;
+    if(s < t) {
+      return -1;
+    } else if(s > t) {
+      return 1;
+    } else {
+      s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF);
+      t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF);
+      if(s < t) {
+        return -1;
+      } else {
+        return 1;
+      }
+    }
+  }
+}
+
+static uint32_t addToInverse(UCAElements *element, UErrorCode *status) {
+  uint32_t position = inversePos;
+  uint32_t saveElement = element->CEs[0];
+  int32_t compResult = 0;
+  element->CEs[0] &= 0xFFFFFF3F;
+  if(element->noOfCEs == 1) {
+    element->CEs[1] = 0;
+  }
+  if(inversePos == 0) {
+    inverseTable[0][0] = inverseTable[0][1] = inverseTable[0][2] = 0;
+    addNewInverse(element, status);
+  } else if(compareCEs(inverseTable[inversePos], element->CEs) > 0) {
+    while((compResult = compareCEs(inverseTable[--position], element->CEs)) > 0);
+    if(VERBOSE) { fprintf(stdout, "p:%u ", (int)position); }
+    if(compResult == 0) {
+      addToExistingInverse(element, position, status);
+    } else {
+      insertInverse(element, position+1, status);
+    }
+  } else if(compareCEs(inverseTable[inversePos], element->CEs) == 0) {
+    addToExistingInverse(element, inversePos, status);
+  } else {
+    addNewInverse(element, status);
+  }
+  element->CEs[0] = saveElement;
+  if(VERBOSE) { fprintf(stdout, "+"); }
+  return inversePos;
+}
+
+static InverseUCATableHeader *assembleInverseTable(UErrorCode *status)
+{
+  InverseUCATableHeader *result = NULL;
+  uint32_t headerByteSize = paddedsize(sizeof(InverseUCATableHeader));
+  uint32_t inverseTableByteSize = (inversePos+2)*sizeof(uint32_t)*3;
+  uint32_t contsByteSize = sContPos * sizeof(UChar);
+  uint32_t i = 0;
+
+  result = (InverseUCATableHeader *)uprv_malloc(headerByteSize + inverseTableByteSize + contsByteSize);
+  uprv_memset(result, 0, headerByteSize + inverseTableByteSize + contsByteSize);
+  if(result != NULL) {
+    result->byteSize = headerByteSize + inverseTableByteSize + contsByteSize;
+
+    inversePos++;
+    inverseTable[inversePos][0] = 0xFFFFFFFF;
+    inverseTable[inversePos][1] = 0xFFFFFFFF;
+    inverseTable[inversePos][2] = 0x0000FFFF;
+    inversePos++;
+
+    for(i = 2; i<inversePos; i++) {
+      if(compareCEs(inverseTable[i-1], inverseTable[i]) > 0) { 
+        fprintf(stderr, "Error at %i: %08X & %08X\n", (int)i, (int)inverseTable[i-1][0], (int)inverseTable[i][0]);
+      } else if(inverseTable[i-1][0] == inverseTable[i][0] && !(inverseTable[i-1][1] < inverseTable[i][1])) {
+        fprintf(stderr, "Continuation error at %i: %08X %08X & %08X %08X\n", (int)i, (int)inverseTable[i-1][0], (int)inverseTable[i-1][1], (int)inverseTable[i][0], (int)inverseTable[i][1]);
+      }
+    }
+
+    result->tableSize = inversePos;
+    result->contsSize = sContPos;
+
+    result->table = headerByteSize;
+    result->conts = headerByteSize + inverseTableByteSize;
+
+    memcpy((uint8_t *)result + result->table, inverseTable, inverseTableByteSize);
+    memcpy((uint8_t *)result + result->conts, stringContinue, contsByteSize);
+
+  } else {
+    *status = U_MEMORY_ALLOCATION_ERROR;
+    return NULL;
+  }
+
+  return result; 
+}
+
+
+static void writeOutInverseData(InverseUCATableHeader *data, 
+                  const char *outputDir, 
+                  const char *copyright,
+                  UErrorCode *status)
+{
+    UNewDataMemory *pData;
+    
+    long dataLength;
+
+    UDataInfo invUcaInfo;
+    uprv_memcpy(&invUcaInfo, &invUcaDataInfo, sizeof(UDataInfo));
+    u_getUnicodeVersion(invUcaInfo.dataVersion);
+
+    pData=udata_create(outputDir, INVC_DATA_TYPE, INVC_DATA_NAME, &invUcaInfo,
+                       copyright, status);
+
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "Error: unable to create %s"INVC_DATA_NAME", error %s\n", outputDir, u_errorName(*status));
+        return;
+    }
+
+    /* write the data to the file */
+    if (VERBOSE) {
+        fprintf(stdout, "Writing out inverse UCA table: %s%c%s.%s\n", outputDir, U_FILE_SEP_CHAR,
+                                                                INVC_DATA_NAME,
+                                                                INVC_DATA_TYPE);
+    }
+    udata_writeBlock(pData, data, data->byteSize);
+
+    /* finish up */
+    dataLength=udata_finish(pData, status);
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "Error: error %d writing the output file\n", *status);
+        return;
+    }
+}
+
+static int32_t hex2num(char hex) {
+    if(hex>='0' && hex <='9') {
+        return hex-'0';
+    } else if(hex>='a' && hex<='f') {
+        return hex-'a'+10;
+    } else if(hex>='A' && hex<='F') {
+        return hex-'A'+10;
+    } else {
+        return 0;
+    }
+}
+
+// static char* CHARACTER_CATEGORY_REORDER_CODES[] = {
+//     "Zs", "Nd", "Sc"
+// };
+// static const uint16_t CHARACTER_CATEGORY_REORDER_CODE_OFFSET = 0x1000;
+// static uint16_t CHARACTER_CATEGORY_REORDER_CODES_VALUE[] = {
+//     U_SPACE_SEPARATOR + CHARACTER_CATEGORY_REORDER_CODE_OFFSET,
+//     U_DECIMAL_DIGIT_NUMBER + CHARACTER_CATEGORY_REORDER_CODE_OFFSET, 
+//     U_CURRENCY_SYMBOL + CHARACTER_CATEGORY_REORDER_CODE_OFFSET
+// };
+
+int32_t getReorderCode(const char* name, int32_t* fillIn, int32_t capacity, UErrorCode *err) {
+    if(U_FAILURE(*err)) {
+        return 0;
+    }
+    if (capacity < 1) {
+        return 0;
+    }
+    int32_t code = ucol_findReorderingEntry(name);
+    if (code != USCRIPT_INVALID_CODE) {
+        *fillIn = code;
+        return 1;
+    }
+
+    int32_t length = uscript_getCode(name, reinterpret_cast<UScriptCode*>(fillIn), capacity, err);
+    return length;
+}
+
+UCAElements *readAnElement(FILE *data, tempUCATable *t, UCAConstants *consts, LeadByteConstants *leadByteConstants, UErrorCode *status) {
+    static int itemsToDataBlock = 0;
+    static int scriptDataWritten = 0;
+    char buffer[2048], primary[100], secondary[100], tertiary[100];
+    UChar uBuffer[2048];
+    UChar uBuffer2[2048];
+    UChar leadByte[100], scriptCode[100];
+    int32_t i = 0;
+    unsigned int theValue;
+    char *pointer = NULL;
+    char *commentStart = NULL;
+    char *startCodePoint = NULL;
+    char *endCodePoint = NULL;
+    char *result = fgets(buffer, 2048, data);
+    int32_t buflen = (int32_t)uprv_strlen(buffer);
+    if(U_FAILURE(*status)) {
+        return 0;
+    }
+    *primary = *secondary = *tertiary = '\0';
+    *leadByte = *scriptCode = '\0';
+    if(result == NULL) {
+        if(feof(data)) {
+            return NULL;
+        } else {
+            fprintf(stderr, "empty line but no EOF!\n");
+            *status = U_INVALID_FORMAT_ERROR;
+            return NULL;
+        }
+    }
+    while(buflen>0 && (buffer[buflen-1] == '\r' || buffer[buflen-1] == '\n')) {
+      buffer[--buflen] = 0;
+    }
+
+    if(buffer[0] == 0 || buffer[0] == '#') {
+        return NULL; // just a comment, skip whole line
+    }
+
+    UCAElements *element = &le;
+    memset(element, 0, sizeof(*element));
+
+    enum ActionType {
+      READCE,
+      READHEX1,
+      READHEX2,
+      READUCAVERSION,
+      READLEADBYTETOSCRIPTS,
+      READSCRIPTTOLEADBYTES,
+      IGNORE,
+    };
+
+    // Directives.
+    if(buffer[0] == '[') {
+      uint32_t cnt = 0;
+      static const struct {
+        char name[128];
+        uint32_t *what;
+        ActionType what_to_do;
+      } vt[]  = { {"[first tertiary ignorable",  consts->UCA_FIRST_TERTIARY_IGNORABLE,  READCE},
+                  {"[last tertiary ignorable",   consts->UCA_LAST_TERTIARY_IGNORABLE,   READCE},
+                  {"[first secondary ignorable", consts->UCA_FIRST_SECONDARY_IGNORABLE, READCE},
+                  {"[last secondary ignorable",  consts->UCA_LAST_SECONDARY_IGNORABLE,  READCE},
+                  {"[first primary ignorable",   consts->UCA_FIRST_PRIMARY_IGNORABLE,   READCE},
+                  {"[last primary ignorable",    consts->UCA_LAST_PRIMARY_IGNORABLE,    READCE},
+                  {"[first variable",            consts->UCA_FIRST_VARIABLE,            READCE},
+                  {"[last variable",             consts->UCA_LAST_VARIABLE,             READCE},
+                  {"[first regular",             consts->UCA_FIRST_NON_VARIABLE,        READCE},
+                  {"[last regular",              consts->UCA_LAST_NON_VARIABLE,         READCE},
+                  {"[first implicit",            consts->UCA_FIRST_IMPLICIT,            READCE},
+                  {"[last implicit",             consts->UCA_LAST_IMPLICIT,             READCE},
+                  {"[first trailing",            consts->UCA_FIRST_TRAILING,            READCE},
+                  {"[last trailing",             consts->UCA_LAST_TRAILING,             READCE},
+
+                  {"[fixed top",                    &consts->UCA_PRIMARY_TOP_MIN,       READHEX1},
+                  {"[fixed first implicit byte",    &consts->UCA_PRIMARY_IMPLICIT_MIN,  READHEX1},
+                  {"[fixed last implicit byte",     &consts->UCA_PRIMARY_IMPLICIT_MAX,  READHEX1},
+                  {"[fixed first trail byte",       &consts->UCA_PRIMARY_TRAILING_MIN,  READHEX1},
+                  {"[fixed last trail byte",        &consts->UCA_PRIMARY_TRAILING_MAX,  READHEX1},
+                  {"[fixed first special byte",     &consts->UCA_PRIMARY_SPECIAL_MIN,   READHEX1},
+                  {"[fixed last special byte",      &consts->UCA_PRIMARY_SPECIAL_MAX,   READHEX1},
+                  {"[variable top = ",              &t->options->variableTopValue,      READHEX2},
+                  {"[UCA version = ",               NULL,                               READUCAVERSION},
+                  {"[top_byte\t",                   NULL,                               READLEADBYTETOSCRIPTS},
+                  {"[reorderingTokens\t",           NULL,                               READSCRIPTTOLEADBYTES},
+                  {"[categories\t",                 NULL,                               IGNORE},
+                  {"[first tertiary in secondary non-ignorable",                 NULL,                               IGNORE},
+                  {"[last tertiary in secondary non-ignorable",                 NULL,                               IGNORE},
+                  {"[first secondary in primary non-ignorable",                 NULL,                               IGNORE},
+                  {"[last secondary in primary non-ignorable",                 NULL,                               IGNORE},
+      };
+      for (cnt = 0; cnt<sizeof(vt)/sizeof(vt[0]); cnt++) {
+        uint32_t vtLen = (uint32_t)uprv_strlen(vt[cnt].name);
+        if(uprv_strncmp(buffer, vt[cnt].name, vtLen) == 0) {
+            ActionType what_to_do = vt[cnt].what_to_do;
+            if (what_to_do == IGNORE) { //vt[cnt].what_to_do == IGNORE
+                return NULL;
+            } else if(what_to_do == READHEX1 || what_to_do == READHEX2) {
+              pointer = buffer+vtLen;
+              int32_t numBytes = readElement(&pointer, primary, ']', status) / 2;
+              if(numBytes != (what_to_do == READHEX1 ? 1 : 2)) {
+                  fprintf(stderr, "Value of \"%s\" has unexpected number of %d bytes\n",
+                          buffer, (int)numBytes);
+                  //*status = U_INVALID_FORMAT_ERROR;
+                  return NULL;
+              }
+              *(vt[cnt].what) = (uint32_t)uprv_strtoul(primary, &pointer, 16);
+              if(*pointer != 0) {
+                  fprintf(stderr, "Value of \"%s\" is not a hexadecimal number\n", buffer);
+                  //*status = U_INVALID_FORMAT_ERROR;
+                  return NULL;
+              }
+            } else if (what_to_do == READCE) {
+              // TODO: combine & clean up the two CE parsers
+              pointer = strchr(buffer+vtLen, '[');
+              if(pointer) {
+                pointer++;
+                element->sizePrim[0]=readElement(&pointer, primary, ',', status) / 2;
+                element->sizeSec[0]=readElement(&pointer, secondary, ',', status) / 2;
+                element->sizeTer[0]=readElement(&pointer, tertiary, ']', status) / 2;
+                vt[cnt].what[0] = getSingleCEValue(primary, secondary, tertiary, status);
+                if(element->sizePrim[0] > 2 || element->sizeSec[0] > 1 || element->sizeTer[0] > 1) {
+                  uint32_t CEi = 1;
+                  uint32_t value = UCOL_CONTINUATION_MARKER; /* Continuation marker */
+                    if(2*CEi<element->sizePrim[i]) {
+                        value |= ((hex2num(*(primary+4*CEi))&0xF)<<28);
+                        value |= ((hex2num(*(primary+4*CEi+1))&0xF)<<24);
+                    }
+
+                    if(2*CEi+1<element->sizePrim[i]) {
+                        value |= ((hex2num(*(primary+4*CEi+2))&0xF)<<20);
+                        value |= ((hex2num(*(primary+4*CEi+3))&0xF)<<16);
+                    }
+
+                    if(CEi<element->sizeSec[i]) {
+                        value |= ((hex2num(*(secondary+2*CEi))&0xF)<<12);
+                        value |= ((hex2num(*(secondary+2*CEi+1))&0xF)<<8);
+                    }
+
+                    if(CEi<element->sizeTer[i]) {
+                        value |= ((hex2num(*(tertiary+2*CEi))&0x3)<<4);
+                        value |= (hex2num(*(tertiary+2*CEi+1))&0xF);
+                    }
+
+                    CEi++;
+
+                    vt[cnt].what[1] = value;
+                    //element->CEs[CEindex++] = value;
+                } else {
+                  vt[cnt].what[1] = 0;
+                }
+              } else {
+                fprintf(stderr, "Failed to read a CE from line %s\n", buffer);
+              }
+            } else if (what_to_do == READUCAVERSION) { //vt[cnt].what_to_do == READUCAVERSION
+              u_versionFromString(UCAVersion, buffer+vtLen);
+              if(VERBOSE) {
+                fprintf(stdout, "UCA version [%hu.%hu.%hu.%hu]\n", UCAVersion[0], UCAVersion[1], UCAVersion[2], UCAVersion[3]);
+              }
+            } else if (what_to_do == READLEADBYTETOSCRIPTS) { //vt[cnt].what_to_do == READLEADBYTETOSCRIPTS
+                pointer = buffer + vtLen;
+                
+                uint16_t leadByte = (hex2num(*pointer++) * 16) + hex2num(*pointer++);
+                //fprintf(stdout, "~~~~ processing lead byte = %02x\n", leadByte);
+                if (leadByte >= leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH) {
+                    fprintf(stderr, "Lead byte larger than allocated table!");
+                    // set status and return
+                    *status = U_INTERNAL_PROGRAM_ERROR;
+                    return NULL;
+                }
+                skipWhiteSpace(&pointer, status);
+                
+                int32_t reorderCodeArray[100];
+                uint32_t reorderCodeArrayCount = 0;
+                char scriptName[100];
+                int32_t elementLength = 0;
+                while ((elementLength = readElement(&pointer, scriptName, ' ', status)) > 0) {
+                    if (scriptName[0] == ']') {
+                        break;
+                    }
+
+                    // TODO: fix the FractionalUCA data and then the parsing code
+                    if (strcmp(scriptName, "IMPLICIT") == 0) {
+                        strcpy(scriptName, "Hani");
+                    }
+                    int32_t reorderCodeCount = getReorderCode(scriptName, &reorderCodeArray[reorderCodeArrayCount], sizeof(reorderCodeArray) / sizeof(reorderCodeArray[0]) - reorderCodeArrayCount, status);
+                    //fprintf(stdout, "\treorderCodeCount = %d, status = %x\n", reorderCodeCount, status);
+                    reorderCodeArrayCount += reorderCodeCount;
+                    if (reorderCodeArrayCount > sizeof(reorderCodeArray) / sizeof(reorderCodeArray[0])) {
+                        fprintf(stdout, "reorder code array count is greater than allocated size!");
+                        *status = U_INTERNAL_PROGRAM_ERROR;
+                        return NULL;
+                    }
+                }
+                //fprintf(stdout, "reorderCodeArrayCount = %d\n", reorderCodeArrayCount);
+                switch (reorderCodeArrayCount) {
+                    case 0:
+                        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX[leadByte] = 0;
+                        break;
+                    case 1:
+                        // TODO = move 0x8000 into defined constant
+                        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX[leadByte] = 0x8000 | reorderCodeArray[0];
+                        break;
+                    default:
+                        if (reorderCodeArrayCount + leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET > leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_LENGTH) {
+                            // Error condition
+                        }
+                        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX[leadByte] = leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET;
+                        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA[leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET++] = reorderCodeArrayCount;
+                        for (int reorderCodeIndex = 0; reorderCodeIndex < reorderCodeArrayCount; reorderCodeIndex++) {
+                            leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA[leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET++] = reorderCodeArray[reorderCodeIndex];
+                        }
+                }
+            } else if (what_to_do == READSCRIPTTOLEADBYTES) { //vt[cnt].what_to_do == READSCRIPTTOLEADBYTES
+                uint16_t leadByteArray[100];
+                uint32_t leadByteArrayCount = 0;
+                int32_t reorderCodeArray[100];
+                uint32_t reorderCodeArrayCount = 0;
+                char scriptName[100];
+
+                pointer = buffer + vtLen;
+                uint32_t scriptNameLength = readElement(&pointer, scriptName, '\t', status);
+                int32_t reorderCodeCount = getReorderCode(scriptName, &reorderCodeArray[reorderCodeArrayCount], sizeof(reorderCodeArray) / sizeof(reorderCodeArray[0]), status);
+                if (reorderCodeCount > 0 && reorderCodeArray[0] != USCRIPT_INVALID_CODE) {
+                    //fprintf(stdout, "^^^ processing reorder code = %04x (%s)\n", reorderCodeArray[0], scriptName);
+                    skipWhiteSpace(&pointer, status);
+                
+                    int32_t elementLength = 0;
+                    char leadByteString[100];
+                    while ((elementLength = readElement(&pointer, leadByteString, '=', status)) == 2) {
+                        //fprintf(stdout, "\tleadByteArrayCount = %d, elementLength = %d, leadByteString = %s\n", leadByteArrayCount, elementLength, leadByteString);
+                        uint32_t leadByte = (hex2num(leadByteString[0]) * 16) + hex2num(leadByteString[1]);
+                        leadByteArray[leadByteArrayCount++] = (uint16_t) leadByte;
+                        skipUntilWhiteSpace(&pointer, status);
+                    }
+                    
+                    if (leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT >= leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_LENGTH) {
+                        //fprintf(stdout, "\tError condition\n");
+                        //fprintf(stdout, "\tindex count = %d, total index size = %d\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT, sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX) / sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[0]));
+                        // Error condition
+                        *status = U_INTERNAL_PROGRAM_ERROR;
+                        return NULL;
+                    }
+                    leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].reorderCode = reorderCodeArray[0];
+                    
+                    //fprintf(stdout, "\tlead byte count = %d\n", leadByteArrayCount);
+                    //fprintf(stdout, "\tlead byte array = ");
+                    //for (int i = 0; i < leadByteArrayCount; i++) {
+                    //    fprintf(stdout, "%02x, ", leadByteArray[i]);
+                    //}
+                    //fprintf(stdout, "\n");
+                    
+                    switch (leadByteArrayCount) {
+                        case 0:
+                            leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].offset = 0;
+                            break;
+                        case 1:
+                            // TODO = move 0x8000 into defined constant
+                            //fprintf(stdout, "\t+++++ lead byte = &x\n", leadByteArray[0]);
+                            leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].offset = 0x8000 | leadByteArray[0];
+                            break;
+                        default:
+                            //fprintf(stdout, "\t+++++ lead bytes written to data block - %d\n", itemsToDataBlock++);
+                            //fprintf(stdout, "\tlead bytes = ");
+                            //for (int i = 0; i < leadByteArrayCount; i++) {
+                            //    fprintf(stdout, "%02x, ", leadByteArray[i]);
+                            //}
+                            //fprintf(stdout, "\n");
+                            //fprintf(stdout, "\tBEFORE data bytes = ");
+                            //for (int i = 0; i < leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET; i++) {
+                            //    fprintf(stdout, "%02x, ", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[i]);
+                            //}
+                            //fprintf(stdout, "\n");
+                            //fprintf(stdout, "\tdata offset = %d, data length = %d\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET, leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_LENGTH);
+                            if ((leadByteArrayCount + leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET) > leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_LENGTH) {
+                                //fprintf(stdout, "\tError condition\n");
+                                // Error condition
+                                *status = U_INTERNAL_PROGRAM_ERROR;
+                                return NULL;
+                            }
+                            leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].offset = leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET;
+                            leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET++] = leadByteArrayCount;
+                            scriptDataWritten++;
+                            memcpy(&leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET],
+                                leadByteArray, leadByteArrayCount * sizeof(leadByteArray[0]));
+                            scriptDataWritten += leadByteArrayCount;
+                            //fprintf(stdout, "\tlead byte data written = %d\n", scriptDataWritten);
+                            //fprintf(stdout, "\tcurrentIndex.reorderCode = %04x, currentIndex.offset = %04x\n", 
+                            //    leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT.reorderCode, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT.offset);
+                            leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET += leadByteArrayCount;
+                            //fprintf(stdout, "\tdata offset = %d\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET);
+                            //fprintf(stdout, "\tAFTER data bytes = ");
+                            //for (int i = 0; i < leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET; i++) {
+                            //    fprintf(stdout, "%02x, ", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[i]);
+                            //}
+                            //fprintf(stdout, "\n");
+                    }
+                    //if (reorderCodeArray[0] >= 0x1000) {
+                     //   fprintf(stdout, "@@@@ reorderCode = %x, offset = %x\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].reorderCode, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT].offset);
+                     //   for (int i = 0; i < leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET; i++) {
+                    //        fprintf(stdout, "%02x, ", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[i]);
+                     //   }
+                    //    fprintf(stdout, "\n");
+                   // }
+                    leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT++;
+                }
+            }
+            return NULL;
+        }
+      }
+      fprintf(stderr, "Warning: unrecognized option: %s\n", buffer);
+      //*status = U_INVALID_FORMAT_ERROR;
+      return NULL;
+    }
+
+    startCodePoint = buffer;
+    endCodePoint = strchr(startCodePoint, ';');
+
+    if(endCodePoint == 0) {
+        fprintf(stderr, "error - line with no code point!\n");
+        *status = U_INVALID_FORMAT_ERROR; /* No code point - could be an error, but probably only an empty line */
+        return NULL;
+    } else {
+        *(endCodePoint) = 0;
+    }
+
+    char *pipePointer = strchr(buffer, '|');
+    if (pipePointer != NULL) {
+        // Read the prefix string which precedes the actual string.
+        *pipePointer = 0;
+        element->prefixSize =
+            u_parseString(startCodePoint,
+                          element->prefixChars, LENGTHOF(element->prefixChars),
+                          NULL, status);
+        if(U_FAILURE(*status)) {
+            fprintf(stderr, "error - parsing of prefix \"%s\" failed: %s\n",
+                    startCodePoint, u_errorName(*status));
+            *status = U_INVALID_FORMAT_ERROR;
+            return NULL;
+        }
+        element->prefix = element->prefixChars;
+        startCodePoint = pipePointer + 1;
+    }
+
+    // Read the string which gets the CE(s) assigned.
+    element->cSize =
+        u_parseString(startCodePoint,
+                      element->uchars, LENGTHOF(element->uchars),
+                      NULL, status);
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "error - parsing of code point(s) \"%s\" failed: %s\n",
+                startCodePoint, u_errorName(*status));
+        *status = U_INVALID_FORMAT_ERROR;
+        return NULL;
+    }
+    element->cPoints = element->uchars;
+
+    startCodePoint = endCodePoint+1;
+
+    commentStart = strchr(startCodePoint, '#');
+    if(commentStart == NULL) {
+        commentStart = strlen(startCodePoint) + startCodePoint;
+    }
+
+    i = 0;
+    uint32_t CEindex = 0;
+    element->noOfCEs = 0;
+    for(;;) {
+        endCodePoint = strchr(startCodePoint, ']');
+        if(endCodePoint == NULL || endCodePoint >= commentStart) {
+            break;
+        }
+        pointer = strchr(startCodePoint, '[');
+        pointer++;
+
+        element->sizePrim[i]=readElement(&pointer, primary, ',', status) / 2;
+        element->sizeSec[i]=readElement(&pointer, secondary, ',', status) / 2;
+        element->sizeTer[i]=readElement(&pointer, tertiary, ']', status) / 2;
+
+
+        /* I want to get the CEs entered right here, including continuation */
+        element->CEs[CEindex++] = getSingleCEValue(primary, secondary, tertiary, status);
+
+        uint32_t CEi = 1;
+        while(2*CEi<element->sizePrim[i] || CEi<element->sizeSec[i] || CEi<element->sizeTer[i]) {
+          uint32_t value = UCOL_CONTINUATION_MARKER; /* Continuation marker */
+            if(2*CEi<element->sizePrim[i]) {
+                value |= ((hex2num(*(primary+4*CEi))&0xF)<<28);
+                value |= ((hex2num(*(primary+4*CEi+1))&0xF)<<24);
+            }
+
+            if(2*CEi+1<element->sizePrim[i]) {
+                value |= ((hex2num(*(primary+4*CEi+2))&0xF)<<20);
+                value |= ((hex2num(*(primary+4*CEi+3))&0xF)<<16);
+            }
+
+            if(CEi<element->sizeSec[i]) {
+                value |= ((hex2num(*(secondary+2*CEi))&0xF)<<12);
+                value |= ((hex2num(*(secondary+2*CEi+1))&0xF)<<8);
+            }
+
+            if(CEi<element->sizeTer[i]) {
+                value |= ((hex2num(*(tertiary+2*CEi))&0x3)<<4);
+                value |= (hex2num(*(tertiary+2*CEi+1))&0xF);
+            }
+
+            CEi++;
+
+            element->CEs[CEindex++] = value;
+        }
+
+      startCodePoint = endCodePoint+1;
+      i++;
+    }
+    element->noOfCEs = CEindex;
+#if 0
+    element->isThai = UCOL_ISTHAIPREVOWEL(element->cPoints[0]);
+#endif
+    // we don't want any strange stuff after useful data!
+    if (pointer == NULL) {
+        /* huh? Did we get ']' without the '['? Pair your brackets! */
+        *status=U_INVALID_FORMAT_ERROR;
+    }
+    else {
+        while(pointer < commentStart)  {
+            if(*pointer != ' ' && *pointer != '\t')
+            {
+                *status=U_INVALID_FORMAT_ERROR;
+                break;
+            }
+            pointer++;
+        }
+    }
+    if(element->cSize == 1 && element->cPoints[0] == 0xfffe) {
+        // UCA 6.0 gives U+FFFE a special minimum weight using the
+        // byte 02 which is the merge-sort-key separator and illegal for any
+        // other characters.
+    } else {
+        // Rudimentary check for valid bytes in CE weights.
+        // For a more comprehensive check see cintltst /tscoll/citertst/TestCEValidity
+        for (i = 0; i < (int32_t)CEindex; ++i) {
+            uint32_t value = element->CEs[i];
+            uint8_t bytes[4] = {
+                (uint8_t)(value >> 24),
+                (uint8_t)(value >> 16),
+                (uint8_t)(value >> 8),
+                (uint8_t)(value & UCOL_NEW_TERTIARYORDERMASK)
+            };
+            for (int j = 0; j < 4; ++j) {
+                if (0 != bytes[j] && bytes[j] < 3) {
+                    fprintf(stderr, "Warning: invalid UCA weight byte %02X for %s\n", bytes[j], buffer);
+                    return NULL;
+                }
+            }
+            // Primary second bytes 03 and FF are compression terminators.
+            if (!isContinuation(value) && (bytes[1] == 3 || bytes[1] == 0xFF)) {
+                fprintf(stderr, "Warning: invalid UCA primary second weight byte %02X for %s\n",
+                        bytes[1], buffer);
+                return NULL;
+            }
+        }
+    }
+
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "problem putting stuff in hash table %s\n", u_errorName(*status));
+        *status = U_INTERNAL_PROGRAM_ERROR;
+        return NULL;
+    }
+
+    return element;
+}
+
+
+void writeOutData(UCATableHeader *data,
+                  UCAConstants *consts,
+                  LeadByteConstants *leadByteConstants,
+                  UChar contractions[][3],
+                  uint32_t noOfcontractions,
+                  const char *outputDir,
+                  const char *copyright,
+                  UErrorCode *status)
+{
+    if(U_FAILURE(*status)) {
+        return;
+    }
+
+    uint32_t size = data->size;
+
+    data->UCAConsts = data->size;
+    data->size += paddedsize(sizeof(UCAConstants));
+
+    if(noOfcontractions != 0) {
+      contractions[noOfcontractions][0] = 0;
+      contractions[noOfcontractions][1] = 0;
+      contractions[noOfcontractions][2] = 0;
+      noOfcontractions++;
+
+
+      data->contractionUCACombos = data->size;
+      data->contractionUCACombosWidth = 3;
+      data->contractionUCACombosSize = noOfcontractions;
+      data->size += paddedsize((noOfcontractions*3*sizeof(UChar)));
+    }
+    data->scriptToLeadByte = data->size;
+    //fprintf(stdout, "@@@@ script to lead byte offset = 0x%x (%d)\n", data->size, data->size);
+    data->size +=
+        sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT) +                                                       // index table header
+        leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT * sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[0]) +    // index table
+        sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET) +                                                       // data table header
+        leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET * sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA[0]);        // data table
+    data->leadByteToScript = data->size;
+    //fprintf(stdout, "@@@@ lead byte to script offset = 0x%x (%d)\n", data->size, data->size);
+    data->size +=
+        sizeof(leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH) +                                                      // index table header
+        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH * sizeof(leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX[0]) +   // index table
+        sizeof(leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET) +                                                       // data table header
+        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET * sizeof(leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA[0]);        // data table
+
+    UNewDataMemory *pData;
+    
+    long dataLength;
+    UDataInfo ucaInfo;
+    uprv_memcpy(&ucaInfo, &ucaDataInfo, sizeof(UDataInfo));
+    u_getUnicodeVersion(ucaInfo.dataVersion);
+
+    pData=udata_create(outputDir, UCA_DATA_TYPE, UCA_DATA_NAME, &ucaInfo,
+                       copyright, status);
+
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "Error: unable to create %s"UCA_DATA_NAME", error %s\n", outputDir, u_errorName(*status));
+        return;
+    }
+
+    /* write the data to the file */
+    if (VERBOSE) {
+        fprintf(stdout, "Writing out UCA table: %s%c%s.%s\n", outputDir,
+                                                        U_FILE_SEP_CHAR,
+                                                        U_ICUDATA_NAME "_" UCA_DATA_NAME,
+                                                        UCA_DATA_TYPE);
+    }
+    udata_writeBlock(pData, data, size);
+
+    // output the constants here
+    udata_writeBlock(pData, consts, sizeof(UCAConstants));
+
+    if (VERBOSE) {
+        fprintf(stdout, "first tertiary ignorable = %x %x\n", consts->UCA_FIRST_TERTIARY_IGNORABLE[0], consts->UCA_FIRST_TERTIARY_IGNORABLE[1]);
+        fprintf(stdout, "last tertiary ignorable = %x %x\n", consts->UCA_LAST_TERTIARY_IGNORABLE[0], consts->UCA_LAST_TERTIARY_IGNORABLE[1]);
+        fprintf(stdout, "first secondary ignorable = %x %x\n", consts->UCA_FIRST_SECONDARY_IGNORABLE[0], consts->UCA_FIRST_SECONDARY_IGNORABLE[1]);
+        fprintf(stdout, "contractionUCACombosSize = %d\n", data->contractionUCACombosSize);
+        fprintf(stdout, "contractionSize = %d\n", data->contractionSize);
+        fprintf(stdout, "number of UCA contractions = %d\n", noOfcontractions);
+    }
+    
+    if(noOfcontractions != 0) {
+      udata_writeBlock(pData, contractions, noOfcontractions*3*sizeof(UChar));
+      udata_writePadding(pData, paddedsize((noOfcontractions*3*sizeof(UChar))) - noOfcontractions*3*sizeof(uint16_t));
+    }
+
+    // output the script to lead bytes table here
+    if (VERBOSE) {
+        fprintf(stdout, "Writing Script to Lead Byte Data\n");
+        fprintf(stdout, "\tindex table size = %x\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT);
+        fprintf(stdout, "\tdata block size = %x\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET);
+    }
+    udata_write16(pData, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT);
+    udata_write16(pData, leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET);
+//     fprintf(stdout, "#### Script to Lead Byte Index Before Sort\n");
+//     for (int reorderCodeIndex = 0; reorderCodeIndex < leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT; reorderCodeIndex++) {
+//         fprintf(stdout, "\t%04x = %04x\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[reorderCodeIndex].reorderCode, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[reorderCodeIndex].offset);
+//     }
+    qsort(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT, sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[0]), ReorderIndexComparer);
+    udata_writeBlock(pData, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT * sizeof(leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[0]));
+//     fprintf(stdout, "#### Script to Lead Byte Index After Sort\n");
+//     for (int reorderCodeIndex = 0; reorderCodeIndex < leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX_COUNT; reorderCodeIndex++) {
+//         fprintf(stdout, "\t%04x = %04x\n", leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[reorderCodeIndex].reorderCode, leadByteConstants->SCRIPT_TO_LEAD_BYTES_INDEX[reorderCodeIndex].offset);
+//     }
+    
+    // write out the script to lead bytes data block
+    udata_writeBlock(pData, leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA, leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA_OFFSET * sizeof(*leadByteConstants->SCRIPT_TO_LEAD_BYTES_DATA));
+    
+    if (VERBOSE) {
+        fprintf(stdout, "Writing Lead Byte To Script Data\n");
+        fprintf(stdout, "\tindex table size = %x\n", leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH);
+        fprintf(stdout, "\tdata block size = %x\n", leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET);
+    }
+    // output the header info
+    udata_write16(pData, leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH);
+    udata_write16(pData, leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET);
+    
+    // output the index table
+    udata_writeBlock(pData, leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX, 
+        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH * sizeof(leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX)[0]);
+//     for (int leadByte = 0; leadByte < leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH; leadByte++) {
+//         fprintf(stdout, "\t%02x = %04x\n", leadByte, leadByteConstants->LEAD_BYTE_TO_SCRIPTS_INDEX[leadByte]);
+//     }
+
+    // output the data
+    udata_writeBlock(pData, leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA, 
+        leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET * sizeof(*leadByteConstants->LEAD_BYTE_TO_SCRIPTS_DATA));
+
+    
+    /* finish up */
+    dataLength=udata_finish(pData, status);
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "Error: error %d writing the output file\n", *status);
+        return;
+    }
+}
+
+enum {
+    /*
+     * Maximum number of UCA contractions we can store.
+     * May need to be increased for a new Unicode version.
+     */
+    MAX_UCA_CONTRACTION_CES=2048
+};
+
+static int32_t
+write_uca_table(const char *filename,
+                const char *outputDir,
+                const char *copyright,
+                UErrorCode *status)
+{
+    FILE *data = fopen(filename, "r");
+    if(data == NULL) {
+        fprintf(stderr, "Couldn't open file: %s\n", filename);
+        return -1;
+    }
+    uint32_t line = 0;
+    UCAElements *element = NULL;
+    UCATableHeader *myD = (UCATableHeader *)uprv_malloc(sizeof(UCATableHeader));
+    /* test for NULL */
+    if(myD == NULL) {
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        fclose(data);
+        return 0;
+    }
+    uprv_memset(myD, 0, sizeof(UCATableHeader));
+    UColOptionSet *opts = (UColOptionSet *)uprv_malloc(sizeof(UColOptionSet));
+    /* test for NULL */
+    if(opts == NULL) {
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        uprv_free(myD);
+        fclose(data);
+        return 0;
+    }
+    uprv_memset(opts, 0, sizeof(UColOptionSet));
+    UChar contractionCEs[MAX_UCA_CONTRACTION_CES][3];
+    uprv_memset(contractionCEs, 0, sizeof(contractionCEs));
+    uint32_t noOfContractions = 0;
+    UCAConstants consts;
+    uprv_memset(&consts, 0, sizeof(consts));
+#if 0
+    UCAConstants consts = {
+      UCOL_RESET_TOP_VALUE,
+      UCOL_FIRST_PRIMARY_IGNORABLE,
+      UCOL_LAST_PRIMARY_IGNORABLE,
+      UCOL_LAST_PRIMARY_IGNORABLE_CONT,
+      UCOL_FIRST_SECONDARY_IGNORABLE,
+      UCOL_LAST_SECONDARY_IGNORABLE,
+      UCOL_FIRST_TERTIARY_IGNORABLE,
+      UCOL_LAST_TERTIARY_IGNORABLE,
+      UCOL_FIRST_VARIABLE,
+      UCOL_LAST_VARIABLE,
+      UCOL_FIRST_NON_VARIABLE,
+      UCOL_LAST_NON_VARIABLE,
+
+      UCOL_NEXT_TOP_VALUE,
+/*
+      UCOL_NEXT_FIRST_PRIMARY_IGNORABLE,
+      UCOL_NEXT_LAST_PRIMARY_IGNORABLE,
+      UCOL_NEXT_FIRST_SECONDARY_IGNORABLE,
+      UCOL_NEXT_LAST_SECONDARY_IGNORABLE,
+      UCOL_NEXT_FIRST_TERTIARY_IGNORABLE,
+      UCOL_NEXT_LAST_TERTIARY_IGNORABLE,
+      UCOL_NEXT_FIRST_VARIABLE,
+      UCOL_NEXT_LAST_VARIABLE,
+*/
+
+      PRIMARY_IMPLICIT_MIN,
+      PRIMARY_IMPLICIT_MAX
+    };
+#endif
+
+    //fprintf(stdout, "Allocating LeadByteConstants\n");
+    LeadByteConstants leadByteConstants;
+    uprv_memset(&leadByteConstants, 0x00, sizeof(LeadByteConstants));
+    
+    leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX_LENGTH = 256;
+    leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX = (ReorderIndex*) uprv_malloc(leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX_LENGTH * sizeof(ReorderIndex));
+    uprv_memset(leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX, 0x00, leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX_LENGTH * sizeof(ReorderIndex));
+    leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA_LENGTH = 1024;
+    leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA = (uint16_t*) uprv_malloc(leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA_LENGTH * sizeof(uint16_t));
+    uprv_memset(leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA, 0x00, leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA_LENGTH * sizeof(uint16_t));
+    //fprintf(stdout, "\tFinished Allocating LeadByteConstants\n");
+    
+    leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH = 256;
+    leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX = (uint16_t*) uprv_malloc(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH * sizeof(uint16_t));
+    uprv_memset(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX, 0x8000 | USCRIPT_INVALID_CODE, leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX_LENGTH * sizeof(uint16_t));
+    leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA_LENGTH = 1024;
+    leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA_OFFSET = 1;     // offset by 1 to leave zero location for those lead bytes with no reorder codes
+    leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA = (uint16_t*) uprv_malloc(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA_LENGTH * sizeof(uint16_t));
+    uprv_memset(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA, 0x00, leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA_LENGTH * sizeof(uint16_t));
+
+    uprv_memset(inverseTable, 0xDA, sizeof(int32_t)*3*0xFFFF);
+
+    opts->variableTopValue = 0;
+    opts->strength = UCOL_TERTIARY;
+    opts->frenchCollation = UCOL_OFF;
+    opts->alternateHandling = UCOL_NON_IGNORABLE; /* attribute for handling variable elements*/
+    opts->caseFirst = UCOL_OFF;         /* who goes first, lower case or uppercase */
+    opts->caseLevel = UCOL_OFF;         /* do we have an extra case level */
+    opts->normalizationMode = UCOL_OFF; /* attribute for normalization */
+    opts->hiraganaQ = UCOL_OFF; /* attribute for JIS X 4061, used only in Japanese */
+    opts->numericCollation = UCOL_OFF;
+    myD->jamoSpecial = FALSE;
+
+    tempUCATable *t = uprv_uca_initTempTable(myD, opts, NULL, IMPLICIT_TAG, LEAD_SURROGATE_TAG, status);
+    if(U_FAILURE(*status))
+    {
+        fprintf(stderr, "Failed to init UCA temp table: %s\n", u_errorName(*status));
+        uprv_free(opts);
+        uprv_free(myD);
+        fclose(data);
+        return -1;
+    }
+
+    // * set to zero
+    struct {
+        UChar32 start;
+        UChar32 end;
+        int32_t value;
+    } ranges[] =
+    {
+        {0xAC00, 0xD7B0, UCOL_SPECIAL_FLAG | (HANGUL_SYLLABLE_TAG << 24) },  //0 HANGUL_SYLLABLE_TAG,/* AC00-D7AF*/
+        //{0xD800, 0xDC00, UCOL_SPECIAL_FLAG | (LEAD_SURROGATE_TAG << 24)  },  //1 LEAD_SURROGATE_TAG, already set in utrie_open() /* D800-DBFF*/
+        {0xDC00, 0xE000, UCOL_SPECIAL_FLAG | (TRAIL_SURROGATE_TAG << 24) },  //2 TRAIL_SURROGATE DC00-DFFF
+        // Now directly handled in the collation code by the swapCJK function.
+        //{0x3400, 0x4DB6, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24)    },  //3 CJK_IMPLICIT_TAG,   /* 0x3400-0x4DB5*/
+        //{0x4E00, 0x9FA6, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24)    },  //4 CJK_IMPLICIT_TAG,   /* 0x4E00-0x9FA5*/
+        //{0xF900, 0xFA2E, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24)    },  //5 CJK_IMPLICIT_TAG,   /* 0xF900-0xFA2D*/
+        //{0x20000, 0x2A6D7, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24)  },  //6 CJK_IMPLICIT_TAG,   /* 0x20000-0x2A6D6*/
+        //{0x2F800, 0x2FA1E, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24)  },  //7 CJK_IMPLICIT_TAG,   /* 0x2F800-0x2FA1D*/
+    };
+    uint32_t i = 0;
+
+    for(i = 0; i<sizeof(ranges)/sizeof(ranges[0]); i++) {
+      /*ucmpe32_setRange32(t->mapping, ranges[i].start, ranges[i].end, ranges[i].value); */
+      utrie_setRange32(t->mapping, ranges[i].start, ranges[i].end, ranges[i].value, TRUE);
+    }
+
+
+    int32_t surrogateCount = 0;
+    while(!feof(data)) {
+        if(U_FAILURE(*status)) {
+            fprintf(stderr, "Something returned an error %i (%s) while processing line %u of %s. Exiting...\n",
+                *status, u_errorName(*status), (int)line, filename);
+            exit(*status);
+        }
+
+        line++;
+        if(VERBOSE) {
+          fprintf(stdout, "%u ", (int)line);
+        }
+        element = readAnElement(data, t, &consts, &leadByteConstants, status);
+        if(element != NULL) {
+            // we have read the line, now do something sensible with the read data!
+
+            // if element is a contraction, we want to add it to contractions
+            if(element->cSize > 1 && element->cPoints[0] != 0xFDD0) { // this is a contraction
+              if(UTF_IS_LEAD(element->cPoints[0]) && UTF_IS_TRAIL(element->cPoints[1]) && element->cSize == 2) {
+                surrogateCount++;
+              } else {
+                if(noOfContractions>=MAX_UCA_CONTRACTION_CES) {
+                  fprintf(stderr,
+                          "\nMore than %d contractions. Please increase MAX_UCA_CONTRACTION_CES in genuca.cpp. "
+                          "Exiting...\n",
+                          (int)MAX_UCA_CONTRACTION_CES);
+                  exit(*status);
+                }
+                contractionCEs[noOfContractions][0] = element->cPoints[0];
+                contractionCEs[noOfContractions][1] = element->cPoints[1];
+                if(element->cSize > 2) { // the third one
+                  contractionCEs[noOfContractions][2] = element->cPoints[2];
+                } else {
+                  contractionCEs[noOfContractions][2] = 0;
+                }
+                noOfContractions++;
+              }
+            }
+            else {
+                // TODO (claireho): does this work? Need more tests
+                // The following code is to handle the UCA pre-context rules
+                // for L/l with middle dot. We share the structures for contractionCombos.
+                // The format for pre-context character is
+                // contractionCEs[0]: codepoint in element->cPoints[0]
+                // contractionCEs[1]: '\0' to differentiate with contractions.
+                // contractionCEs[2]: prefix char
+                if (element->prefixSize>0) {
+                    if(element->cSize > 1 || element->prefixSize > 1) {
+                        fprintf(stderr,
+                                "\nCharacter with prefix, "
+                                "either too many characters or prefix too long.\n");
+                        exit(*status);
+                    }
+                    if(noOfContractions>=MAX_UCA_CONTRACTION_CES) {
+                      fprintf(stderr,
+                              "\nMore than %d contractions. Please increase MAX_UCA_CONTRACTION_CES in genuca.cpp. "
+                              "Exiting...\n",
+                              (int)MAX_UCA_CONTRACTION_CES);
+                      exit(*status);
+                    }
+                    contractionCEs[noOfContractions][0]=element->cPoints[0];
+                    contractionCEs[noOfContractions][1]='\0';
+                    contractionCEs[noOfContractions][2]=element->prefixChars[0];
+                    noOfContractions++;
+                }
+            }
+
+            /* we're first adding to inverse, because addAnElement will reverse the order */
+            /* of code points and stuff... we don't want that to happen */
+            if((element->CEs[0] >> 24) != 2) {
+                // Add every element except for the special minimum-weight character U+FFFE
+                // which has 02 weights.
+                // If we had 02 weights in the invuca table, then tailoring primary
+                // after an ignorable would try to put a weight before 02 which is not valid.
+                // We could fix this in a complicated way in the from-rule-string builder,
+                // but omitting this special element from invuca is simple and effective.
+                addToInverse(element, status);
+            }
+            if(!(element->cSize > 1 && element->cPoints[0] == 0xFDD0)) {
+              uprv_uca_addAnElement(t, element, status);
+            }
+        }
+    }
+
+    if(UCAVersion[0] == 0 && UCAVersion[1] == 0 && UCAVersion[2] == 0 && UCAVersion[3] == 0) {
+        fprintf(stderr, "UCA version not specified. Cannot create data file!\n");
+        uprv_uca_closeTempTable(t);
+        uprv_free(opts);
+        uprv_free(myD);
+        fclose(data);
+        return -1;
+    }
+/*    {
+        uint32_t trieWord = utrie_get32(t->mapping, 0xDC01, NULL);
+    }*/
+
+    if (VERBOSE) {
+        fprintf(stdout, "\nLines read: %u\n", (int)line);
+        fprintf(stdout, "Surrogate count: %i\n", (int)surrogateCount);
+        fprintf(stdout, "Raw data breakdown:\n");
+        /*fprintf(stdout, "Compact array stage1 top: %i, stage2 top: %i\n", t->mapping->stage1Top, t->mapping->stage2Top);*/
+        fprintf(stdout, "Number of contractions: %u\n", (int)noOfContractions);
+        fprintf(stdout, "Contraction image size: %u\n", (int)t->image->contractionSize);
+        fprintf(stdout, "Expansions size: %i\n", (int)t->expansions->position);
+    }
+
+
+    /* produce canonical closure for table */
+    /* first set up constants for implicit calculation */
+    uprv_uca_initImplicitConstants(status);
+    /* do the closure */
+    UnicodeSet closed;
+    int32_t noOfClosures = uprv_uca_canonicalClosure(t, NULL, &closed, status);
+    if(noOfClosures != 0) {
+        fprintf(stderr, "Warning: %i canonical closures occured!\n", (int)noOfClosures);
+        UnicodeString pattern;
+        std::string utf8;
+        closed.toPattern(pattern, TRUE).toUTF8String(utf8);
+        fprintf(stderr, "UTF-8 pattern string: %s\n", utf8.c_str());
+    }
+
+    /* test */
+    UCATableHeader *myData = uprv_uca_assembleTable(t, status);  
+
+    if (VERBOSE) {
+        fprintf(stdout, "Compacted data breakdown:\n");
+        /*fprintf(stdout, "Compact array stage1 top: %i, stage2 top: %i\n", t->mapping->stage1Top, t->mapping->stage2Top);*/
+        fprintf(stdout, "Number of contractions: %u\n", (int)noOfContractions);
+        fprintf(stdout, "Contraction image size: %u\n", (int)t->image->contractionSize);
+        fprintf(stdout, "Expansions size: %i\n", (int)t->expansions->position);
+    }
+
+    if(U_FAILURE(*status)) {
+        fprintf(stderr, "Error creating table: %s\n", u_errorName(*status));
+        uprv_uca_closeTempTable(t);
+        uprv_free(opts);
+        uprv_free(myD);
+        fclose(data);
+        return -1;
+    }
+
+    /* populate the version info struct with version info*/
+    myData->version[0] = UCOL_BUILDER_VERSION;
+    myData->version[1] = UCAVersion[0];
+    myData->version[2] = UCAVersion[1];
+    myData->version[3] = UCAVersion[2];
+    /*TODO:The fractional rules version should be taken from FractionalUCA.txt*/
+    // Removed this macro. Instead, we use the fields below
+    //myD->version[1] = UCOL_FRACTIONAL_UCA_VERSION;
+    //myD->UCAVersion = UCAVersion; // out of FractionalUCA.txt
+    uprv_memcpy(myData->UCAVersion, UCAVersion, sizeof(UVersionInfo));
+    u_getUnicodeVersion(myData->UCDVersion);
+
+    writeOutData(myData, &consts, &leadByteConstants, contractionCEs, noOfContractions, outputDir, copyright, status);
+
+    InverseUCATableHeader *inverse = assembleInverseTable(status);
+    uprv_memcpy(inverse->UCAVersion, UCAVersion, sizeof(UVersionInfo));
+    writeOutInverseData(inverse, outputDir, copyright, status);
+
+    uprv_uca_closeTempTable(t);
+    uprv_free(myD);
+    uprv_free(opts);
+
+    uprv_free(myData);
+    uprv_free(inverse);
+    
+    uprv_free(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_INDEX);
+    uprv_free(leadByteConstants.LEAD_BYTE_TO_SCRIPTS_DATA);
+    uprv_free(leadByteConstants.SCRIPT_TO_LEAD_BYTES_INDEX);
+    uprv_free(leadByteConstants.SCRIPT_TO_LEAD_BYTES_DATA);
+    
+    fclose(data);
+
+    return 0;
+}
+
+#endif /* #if !UCONFIG_NO_COLLATION */
+
+static UOption options[]={
+    UOPTION_HELP_H,              /* 0  Numbers for those who*/ 
+    UOPTION_HELP_QUESTION_MARK,  /* 1   can't count. */
+    UOPTION_COPYRIGHT,           /* 2 */
+    UOPTION_VERSION,             /* 3 */
+    UOPTION_DESTDIR,             /* 4 */
+    UOPTION_SOURCEDIR,           /* 5 */
+    UOPTION_VERBOSE,             /* 6 */
+    UOPTION_ICUDATADIR           /* 7 */
+    /* weiv can't count :))))) */
+};
+
+int main(int argc, char* argv[]) {
+    UErrorCode status = U_ZERO_ERROR;
+    const char* destdir = NULL;
+    const char* srcDir = NULL;
+    char filename[300];
+    char *basename = NULL;
+    const char *copyright = NULL;
+    uprv_memset(&UCAVersion, 0, 4);
+
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[4].value=u_getDataDirectory();
+    options[5].value="";
+    argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options);
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    } else if(argc<2) {
+        argc=-1;
+    }
+    if(options[0].doesOccur || options[1].doesOccur) {
+        fprintf(stderr,
+            "usage: %s [-options] file\n"
+            "\tRead in UCA collation text data and write out the binary collation data\n"
+            "options:\n"
+            "\t-h or -? or --help  this usage text\n"
+            "\t-V or --version     show a version message\n"
+            "\t-c or --copyright   include a copyright notice\n"
+            "\t-d or --destdir     destination directory, followed by the path\n"
+            "\t-s or --sourcedir   source directory, followed by the path\n"
+            "\t-v or --verbose     turn on verbose output\n"
+            "\t-i or --icudatadir  directory for locating any needed intermediate data files,\n"
+            "\t                    followed by path, defaults to %s\n",
+            argv[0], u_getDataDirectory());
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+    if(options[3].doesOccur) {
+        fprintf(stdout, "genuca version %hu.%hu, ICU tool to read UCA text data and create UCA data tables for collation.\n",
+#if UCONFIG_NO_COLLATION
+            0, 0
+#else
+            UCA_FORMAT_VERSION_0, UCA_FORMAT_VERSION_1
+#endif
+            );
+        fprintf(stdout, U_COPYRIGHT_STRING"\n");
+        exit(0);
+    }
+
+    /* get the options values */
+    destdir = options[4].value;
+    srcDir = options[5].value;
+    VERBOSE = options[6].doesOccur;
+
+    if (options[2].doesOccur) {
+        copyright = U_COPYRIGHT_STRING;
+    }
+
+    if (options[7].doesOccur) {
+        u_setDataDirectory(options[7].value);
+    }
+    /* Initialize ICU */
+    u_init(&status);
+    if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) {
+        fprintf(stderr, "%s: can not initialize ICU.  status = %s\n",
+            argv[0], u_errorName(status));
+        exit(1);
+    }
+    status = U_ZERO_ERROR;
+
+
+    /* prepare the filename beginning with the source dir */
+    uprv_strcpy(filename, srcDir);
+    basename=filename+uprv_strlen(filename);
+
+    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
+        *basename++ = U_FILE_SEP_CHAR;
+    }
+
+    if(argc < 0) { 
+      uprv_strcpy(basename, "FractionalUCA.txt");
+    } else {
+      argv++;
+      uprv_strcpy(basename, getLongPathname(*argv));
+    }
+
+#if 0
+    if(u_getCombiningClass(0x0053) == 0)
+    {
+        fprintf(stderr, "SEVERE ERROR: Normalization data is not functioning! Bailing out.  Was not able to load unorm.dat.\n");
+        exit(1);
+    }
+#endif 
+
+#if UCONFIG_NO_COLLATION
+
+    UNewDataMemory *pData;
+    const char *msg;
+    
+    msg = "genuca writes dummy " UCA_DATA_NAME "." UCA_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h";
+    fprintf(stderr, "%s\n", msg);
+    pData = udata_create(destdir, UCA_DATA_TYPE, UCA_DATA_NAME, &dummyDataInfo,
+                         NULL, &status);
+    udata_writeBlock(pData, msg, strlen(msg));
+    udata_finish(pData, &status);
+
+    msg = "genuca writes dummy " INVC_DATA_NAME "." INVC_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h";
+    fprintf(stderr, "%s\n", msg);
+    pData = udata_create(destdir, INVC_DATA_TYPE, INVC_DATA_NAME, &dummyDataInfo,
+                         NULL, &status);
+    udata_writeBlock(pData, msg, strlen(msg));
+    udata_finish(pData, &status);
+
+    return (int)status;
+
+#else
+
+    return write_uca_table(filename, destdir, copyright, &status);
+
+#endif
+}
+
+/*
+ * Hey, Emacs, please set the following:
+ *
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * End:
+ *
+ */
diff --git a/unicode/c/genuca/genuca.h b/unicode/c/genuca/genuca.h
new file mode 100644
index 0000000..a98e669
--- /dev/null
+++ b/unicode/c/genuca/genuca.h
@@ -0,0 +1,47 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2000-2004, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  genuca.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created at the end of XX century
+*   created by: Vladimir Weinstein
+*
+*   This program reads the Franctional UCA table and generates
+*   internal format for UCA table as well as inverse UCA table.
+*   It then writes binary files containing the data: ucadata.dat 
+*   & invuca.dat
+*/
+
+#ifndef UCADATA_H
+#define UCADATA_H
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "ucol_elm.h"
+#include <stdio.h>
+#include <string.h>
+#include "unicode/utypes.h"
+#include "unicode/uchar.h"
+#include "ucol_imp.h"
+#include "uhash.h"
+#include "unewdata.h"
+
+
+void deleteElement(void *element);
+int32_t readElement(char **from, char *to, char separator, UErrorCode *status);
+uint32_t getSingleCEValue(char *primary, char *secondary, char *tertiary, UBool caseBit, UErrorCode *status);
+void printOutTable(UCATableHeader *myData, UErrorCode *status);
+UCAElements *readAnElement(FILE *data, tempUCATable *t, UCAConstants *consts, UErrorCode *status);
+
+#endif /* #if !UCONFIG_NO_COLLATION */
+
+#endif
diff --git a/unicode/c/genuca/genuca.vcproj b/unicode/c/genuca/genuca.vcproj
new file mode 100644
index 0000000..0056316
--- /dev/null
+++ b/unicode/c/genuca/genuca.vcproj
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="genuca"
+	ProjectGUID="{86829694-A375-4C58-B4EA-96EF514E3225}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+		<Platform
+			Name="x64"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\x86\Debug"
+			IntermediateDirectory=".\x86\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Debug/genuca.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\..\i18n;..\toolutil"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Debug/genuca.pch"
+				AssemblerListingLocation=".\x86\Debug/"
+				ObjectFile=".\x86\Debug/"
+				ProgramDataBaseFileName=".\x86\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Debug/genuca.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x86\Debug/genuca.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\x86\Release"
+			IntermediateDirectory=".\x86\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin&#x0D;&#x0A;"
+				Outputs="..\..\..\bin\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\x86\Release/genuca.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\..\i18n;..\toolutil"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x86\Release/genuca.pch"
+				AssemblerListingLocation=".\x86\Release/"
+				ObjectFile=".\x86\Release/"
+				ProgramDataBaseFileName=".\x86\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x86\Release/genuca.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x86\Release/genuca.pdb"
+				SubSystem="1"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|x64"
+			OutputDirectory=".\x64\Debug"
+			IntermediateDirectory=".\x64\Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Debug/genuca.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\common;..\..\i18n;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				BufferSecurityCheck="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Debug/genuca.pch"
+				AssemblerListingLocation=".\x64\Debug/"
+				ObjectFile=".\x64\Debug/"
+				ProgramDataBaseFileName=".\x64\Debug/"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Debug/genuca.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\x64\Debug/genuca.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				UseFAT32Workaround="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory=".\x64\Release"
+			IntermediateDirectory=".\x64\Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+				CommandLine="copy &quot;$(TargetPath)&quot; ..\..\..\bin64&#x0D;&#x0A;"
+				Outputs="..\..\..\bin64\$(TargetFileName)"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TargetEnvironment="3"
+				TypeLibraryName=".\x64\Release/genuca.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\common;..\..\i18n;..\toolutil"
+				PreprocessorDefinitions="WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				DisableLanguageExtensions="true"
+				TreatWChar_tAsBuiltInType="true"
+				PrecompiledHeaderFile=".\x64\Release/genuca.pch"
+				AssemblerListingLocation=".\x64\Release/"
+				ObjectFile=".\x64\Release/"
+				ProgramDataBaseFileName=".\x64\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				CompileAs="0"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile=".\x64\Release/genuca.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				ProgramDatabaseFile=".\x64\Release/genuca.pdb"
+				SubSystem="1"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath=".\genuca.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath=".\genuca.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/genuts46/CMakeLists.txt b/unicode/c/genuts46/CMakeLists.txt
new file mode 100644
index 0000000..703782e
--- /dev/null
+++ b/unicode/c/genuts46/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun03
+# created by: Markus W. Scherer
+# edited on: 2010jul20
+# edited by: Stuart G. Gill
+add_executable(genuts46 genuts46.cpp)
+target_link_libraries(genuts46 icuuc icutu)
diff --git a/unicode/c/genuts46/genuts46.cpp b/unicode/c/genuts46/genuts46.cpp
new file mode 100644
index 0000000..7b8647a
--- /dev/null
+++ b/unicode/c/genuts46/genuts46.cpp
@@ -0,0 +1,364 @@
+/*
+*******************************************************************************
+*   Copyright (C) 2010, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*******************************************************************************
+*   file name:  genuts46.cpp
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2010mar02
+*   created by: Markus W. Scherer
+*
+* quick & dirty tool to recreate the UTS #46 data table according to the spec
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+#include <string.h>
+#include "unicode/utypes.h"
+#include "unicode/errorcode.h"
+#include "unicode/normalizer2.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/usetiter.h"
+#include "unicode/usprep.h"
+#include "sprpimpl.h"  // HACK
+
+/**
+ * icu::ErrorCode subclass for easy UErrorCode handling.
+ * The destructor calls handleFailure() which calls exit(errorCode) when isFailure().
+ */
+class ExitingErrorCode : public icu::ErrorCode {
+public:
+    /**
+     * @param loc A short string describing where the ExitingErrorCode is used.
+     */
+    ExitingErrorCode(const char *loc) : location(loc) {}
+    virtual ~ExitingErrorCode();
+protected:
+    virtual void handleFailure() const;
+private:
+    const char *location;
+};
+
+ExitingErrorCode::~ExitingErrorCode() {
+    // Safe because our handleFailure() does not throw exceptions.
+    if(isFailure()) { handleFailure(); }
+}
+
+void ExitingErrorCode::handleFailure() const {
+    fprintf(stderr, "error at %s: %s\n", location, errorName());
+    exit(errorCode);
+}
+
+static int
+toIDNA2003(const UStringPrepProfile *prep, UChar32 c, icu::UnicodeString &destString) {
+    UChar src[2];
+    int32_t srcLength=0;
+    U16_APPEND_UNSAFE(src, srcLength, c);
+    UChar *dest;
+    int32_t destLength;
+    dest=destString.getBuffer(32);
+    if(dest==NULL) {
+        return FALSE;
+    }
+    UErrorCode errorCode=U_ZERO_ERROR;
+    destLength=usprep_prepare(prep, src, srcLength,
+                              dest, destString.getCapacity(),
+                              USPREP_DEFAULT, NULL, &errorCode);
+    destString.releaseBuffer(destLength);
+    if(errorCode==U_STRINGPREP_PROHIBITED_ERROR) {
+        return -1;
+    } else {
+        // Returns FALSE=0 for U_STRINGPREP_UNASSIGNED_ERROR and processing errors,
+        // TRUE=1 if c is valid or mapped.
+        return U_SUCCESS(errorCode);
+    }
+}
+
+enum Status {
+    DISALLOWED, IGNORED, MAPPED, DEVIATION, VALID,
+    DISALLOWED_STD3_VALID, DISALLOWED_STD3_MAPPED
+};
+static const char *const statusNames[]={
+    "disallowed", "ignored", "mapped", "deviation", "valid",
+    "disallowed_STD3_valid", "disallowed_STD3_mapped"
+};
+
+static void
+printLine(UChar32 start, UChar32 end, Status status, const icu::UnicodeString &mapping) {
+    if(start==end) {
+        printf("%04lX          ", (long)start);
+    } else {
+        printf("%04lX..%04lX    ", (long)start, (long)end);
+    }
+    printf("; %s", statusNames[status]);
+    if(status==MAPPED || status==DEVIATION || !mapping.isEmpty()) {
+        printf(" ;");
+        const UChar *buffer=mapping.getBuffer();
+        int32_t length=mapping.length();
+        int32_t i=0;
+        UChar32 c;
+        while(i<length) {
+            U16_NEXT(buffer, i, length, c);
+            printf(" %04lX", (long)c);
+        }
+    }
+    puts("");
+}
+
+static void
+getAgeIfAssigned(UChar32 c, UVersionInfo age) {
+    if(u_isdefined(c)) {
+        u_charAge(c, age);
+    } else if(U_IS_UNICODE_NONCHAR(c)) {
+        age[0]=0;
+        age[1]=0;
+        age[2]=0;
+        age[3]=1;
+    } else {
+        memset(age, 0, 4);
+    }
+}
+
+extern int
+main(int argc, const char *argv[]) {
+    ExitingErrorCode errorCode("genuts46");
+
+    // predefined base sets
+    icu::UnicodeSet unassignedSet(UNICODE_STRING_SIMPLE("[:Cn:]"), errorCode);
+
+    icu::UnicodeSet labelSeparators(
+        UNICODE_STRING_SIMPLE("[\\u002E\\u3002\\uFF0E\\uFF61]"), errorCode);
+
+    icu::UnicodeSet mappedSet(
+        UNICODE_STRING_SIMPLE("[:Changes_When_NFKC_Casefolded:]"), errorCode);
+    mappedSet.removeAll(labelSeparators);  // simplifies checking of mapped characters
+
+    icu::UnicodeSet baseValidSet(icu::UnicodeString(
+        "[[[[:^Changes_When_NFKC_Casefolded:]"
+        "-[:C:]-[:Z:]"
+        "-[:Block=Ideographic_Description_Characters:]]"
+        "[:ascii:]]-[.]]", -1, US_INV), errorCode);
+
+    // Characters that are disallowed when STD3 rules are applied,
+    // but valid when STD3 rules are not applied.
+    icu::UnicodeSet disallowedSTD3Set(icu::UnicodeString(
+        "[[:ascii:]-[\\u002D.a-zA-Z0-9]]", -1, US_INV), errorCode);
+
+    icu::UnicodeSet deviationSet(
+        UNICODE_STRING_SIMPLE("[\\u00DF\\u03C2\\u200C\\u200D]"), errorCode);
+    errorCode.assertSuccess();
+
+    // derived sets
+    icu::LocalUStringPrepProfilePointer namePrep(usprep_openByType(USPREP_RFC3491_NAMEPREP, errorCode));
+    const icu::Normalizer2 *nfkc_cf=
+        icu::Normalizer2::getInstance(NULL, "nfkc_cf", UNORM2_COMPOSE, errorCode);
+    errorCode.assertSuccess();
+
+    // HACK: The StringPrep API performs a BiDi check according to the data.
+    // We need to override that for this data generation, by resetting an internal flag.
+    namePrep->checkBiDi=FALSE;
+
+    icu::UnicodeSet baseExclusionSet;
+    icu::UnicodeString cString, mapping, namePrepResult;
+    for(UChar32 c=0; c<=0x10ffff; ++c) {
+        if(c==0xd800) {
+            c=0xe000;
+        }
+        int namePrepStatus=toIDNA2003(namePrep.getAlias(), c, namePrepResult);
+        if(namePrepStatus!=0) {
+            // get the UTS #46 base mapping value
+            switch(c) {
+            case 0xff0e:
+            case 0x3002:
+            case 0xff61:
+                mapping.setTo(0x2e);
+                break;
+            default:
+                cString.setTo(c);
+                nfkc_cf->normalize(cString, mapping, errorCode);
+                break;
+            }
+            if(
+                namePrepStatus>0 ?
+                    // c is valid or mapped in IDNA2003
+                    !labelSeparators.contains(c) && namePrepResult!=mapping :
+                    // namePrepStatus<0: c is prohibited in IDNA2003
+                    baseValidSet.contains(c) || (cString!=mapping && baseValidSet.containsAll(mapping))
+            ) {
+                baseExclusionSet.add(c);
+            }
+        }
+    }
+
+    icu::UnicodeSet disallowedSet(0, 0x10ffff);
+    disallowedSet.
+        removeAll(labelSeparators).
+        removeAll(deviationSet).
+        removeAll(mappedSet).
+        removeAll(baseValidSet).
+        addAll(baseExclusionSet).
+        addAll(unassignedSet);
+
+    const icu::Normalizer2 *nfd=
+        icu::Normalizer2::getInstance(NULL, "nfc", UNORM2_DECOMPOSE, errorCode);
+    errorCode.assertSuccess();
+
+    icu::UnicodeSet ignoredSet;  // will be a subset of mappedSet
+    icu::UnicodeSet removeSet;
+    icu::UnicodeString nfdString;
+    {
+        icu::UnicodeSetIterator iter(mappedSet);
+        while(iter.next()) {
+            UChar32 c=iter.getCodepoint();
+            cString.setTo(c);
+            nfkc_cf->normalize(cString, mapping, errorCode);
+            if(!baseValidSet.containsAll(mapping)) {
+                fprintf(stderr, "U+%04lX mapped -> disallowed: mapping not wholly in base valid set\n", (long)c);
+                disallowedSet.add(c);
+                removeSet.add(c);
+            } else if(mapping.isEmpty()) {
+                ignoredSet.add(c);
+            }
+        }
+        mappedSet.removeAll(removeSet);
+    }
+    errorCode.assertSuccess();
+
+    icu::UnicodeSet validSet(baseValidSet);
+    validSet.
+        removeAll(labelSeparators).  // non-ASCII label separators will be mapped in the end
+        removeAll(deviationSet).
+        removeAll(disallowedSet).
+        removeAll(mappedSet).
+        add(0x2e);  // not mapped, simply valid
+    UBool madeChange;
+    do {
+        madeChange=FALSE;
+        {
+            removeSet.clear();
+            icu::UnicodeSetIterator iter(validSet);
+            while(iter.next()) {
+                UChar32 c=iter.getCodepoint();
+                if(nfd->getDecomposition(c, nfdString) && !validSet.containsAll(nfdString)) {
+                    fprintf(stderr, "U+%04lX valid -> disallowed: NFD not wholly valid\n", (long)c);
+                    disallowedSet.add(c);
+                    removeSet.add(c);
+                    madeChange=TRUE;
+                }
+            }
+            validSet.removeAll(removeSet);
+        }
+        {
+            removeSet.clear();
+            icu::UnicodeSetIterator iter(mappedSet);
+            while(iter.next()) {
+                UChar32 c=iter.getCodepoint();
+                cString.setTo(c);
+                nfkc_cf->normalize(cString, mapping, errorCode);
+                nfd->normalize(mapping, nfdString, errorCode);
+                if(!validSet.containsAll(nfdString)) {
+                    fprintf(stderr, "U+%04lX mapped -> disallowed: NFD of mapping not wholly valid\n", (long)c);
+                    disallowedSet.add(c);
+                    removeSet.add(c);
+                    madeChange=TRUE;
+                }
+            }
+            mappedSet.removeAll(removeSet);
+        }
+    } while(madeChange);
+    errorCode.assertSuccess();
+
+    // finish up
+    labelSeparators.remove(0x2e).freeze();  // U+002E is simply valid
+    deviationSet.freeze();
+    ignoredSet.freeze();
+    validSet.freeze();
+    mappedSet.freeze();
+    disallowedSTD3Set.freeze();
+
+    // output
+    UChar32 prevStart=0, c=0;
+    Status prevStatus=DISALLOWED_STD3_VALID, status;
+    icu::UnicodeString prevMapping;
+    UVersionInfo prevAge={ 1, 1, 0, 0 }, age;
+
+    icu::UnicodeSetIterator iter(disallowedSet);
+    while(iter.nextRange()) {
+        UChar32 start=iter.getCodepoint();
+        while(c<start) {
+            mapping.remove();
+            if(labelSeparators.contains(c)) {
+                status=MAPPED;
+                mapping.setTo(0x2e);
+            } else if(deviationSet.contains(c)) {
+                status=DEVIATION;
+                cString.setTo(c);
+                nfkc_cf->normalize(cString, mapping, errorCode);
+            } else if(ignoredSet.contains(c)) {
+                status=IGNORED;
+            } else if(validSet.contains(c)) {
+                if(disallowedSTD3Set.contains(c)) {
+                    fprintf(stderr, "U+%04lX valid -> disallowed_STD3_valid: itself not STD3\n", (long)c);
+                    status=DISALLOWED_STD3_VALID;
+                } else if( nfd->getDecomposition(c, nfdString) &&
+                    disallowedSTD3Set.containsSome(nfdString)
+                ) {
+                    fprintf(stderr, "U+%04lX valid -> disallowed_STD3_valid: NFD not wholly STD3\n", (long)c);
+                    status=DISALLOWED_STD3_VALID;
+                } else {
+                    status=VALID;
+                }
+            } else if(mappedSet.contains(c)) {
+                cString.setTo(c);
+                nfkc_cf->normalize(cString, mapping, errorCode);
+                if(disallowedSTD3Set.containsSome(mapping)) {
+                    fprintf(stderr, "U+%04lX mapped -> disallowed_STD3_mapped\n", (long)c);
+                    status=DISALLOWED_STD3_MAPPED;
+                } else {
+                    status=MAPPED;
+                }
+            } else {
+                fprintf(stderr, "*** undetermined status of U+%04lX\n", (long)c);
+            }
+            // Print a new line where the status, the mapping or
+            // the character age change.
+            getAgeIfAssigned(c, age);
+            if( prevStart<c &&
+                (status!=prevStatus || mapping!=prevMapping || 0!=memcmp(prevAge, age, 4))
+            ) {
+                printLine(prevStart, c-1, prevStatus, prevMapping);
+                prevStart=c;
+                prevStatus=status;
+                prevMapping=mapping;
+                memcpy(prevAge, age, 4);
+            }
+            ++c;
+        }
+        // c==start is disallowed
+        if(prevStart<c) {
+            printLine(prevStart, c-1, prevStatus, prevMapping);
+        }
+        prevStart=c;
+        prevStatus=DISALLOWED;
+        prevMapping.remove();
+        getAgeIfAssigned(c, prevAge);
+        UChar32 end=iter.getCodepointEnd();
+        while(++c<=end) {
+            getAgeIfAssigned(c, age);
+            if(prevStart<c && 0!=memcmp(prevAge, age, 4)) {
+                printLine(prevStart, c-1, prevStatus, prevMapping);
+                prevStart=c;
+                memcpy(prevAge, age, 4);
+            }
+        }
+    }
+    if(prevStart<c) {
+        printLine(prevStart, c-1, prevStatus, prevMapping);
+    }
+    return 0;
+}
diff --git a/unicode/c/genuts46/genuts46.sln b/unicode/c/genuts46/genuts46.sln
new file mode 100644
index 0000000..1f0a130
--- /dev/null
+++ b/unicode/c/genuts46/genuts46.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genuts46", "genuts46.vcproj", "{20F9F1B1-E362-4A4D-84BA-548557745CD9}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{20F9F1B1-E362-4A4D-84BA-548557745CD9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{20F9F1B1-E362-4A4D-84BA-548557745CD9}.Debug|Win32.Build.0 = Debug|Win32
+		{20F9F1B1-E362-4A4D-84BA-548557745CD9}.Release|Win32.ActiveCfg = Release|Win32
+		{20F9F1B1-E362-4A4D-84BA-548557745CD9}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/unicode/c/genuts46/genuts46.vcproj b/unicode/c/genuts46/genuts46.vcproj
new file mode 100644
index 0000000..f54f843
--- /dev/null
+++ b/unicode/c/genuts46/genuts46.vcproj
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="genuts46"
+	ProjectGUID="{20F9F1B1-E362-4A4D-84BA-548557745CD9}"
+	RootNamespace="genuts46"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="196613"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\..\..\..\icu\trunk\include, ..\..\..\..\..\icu\trunk\source\common"
+				PreprocessorDefinitions="U_USING_ICU_NAMESPACE=0"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="icuucd.lib"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="..\..\..\..\..\icu\trunk\lib"
+				GenerateDebugInformation="true"
+				SubSystem="1"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				EnableIntrinsicFunctions="true"
+				AdditionalIncludeDirectories="..\..\..\..\..\icu\trunk\include, ..\..\..\..\..\icu\trunk\source\common"
+				PreprocessorDefinitions="U_USING_ICU_NAMESPACE=0"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="icuuc.lib"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="..\..\..\..\..\icu\trunk\lib"
+				GenerateDebugInformation="true"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<File
+			RelativePath=".\genuts46.cpp"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/unicode/c/readme.txt b/unicode/c/readme.txt
new file mode 100644
index 0000000..509a302
--- /dev/null
+++ b/unicode/c/readme.txt
@@ -0,0 +1,31 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# created on: 2010jun04
+# created by: Markus W. Scherer
+
+These tools parse Unicode Character Database files and generate
+data files (text, source code and binary) for use in ICU.
+They are used during the Unicode beta period and after a Unicode release.
+
+For a log of actions and changes for recent Unicode version upgrades of ICU, see
+http://bugs.icu-project.org/trac/browser/icu/trunk/source/data/unidata/changes.txt
+
+Since the Unicode 5.2 upgrade, these tools have been moved out of the ICU source
+tree to here. They have not been fully tested and probably need some more work
+and setup. They might benefit from additional shell or Python scripts.
+
+There are autoconf makefiles (Makefile.in) and Visual C++ project files (.vcproj)
+in the subfolders. They are copied over from the ICU source tree and will not
+work without modifications. However, I started to use CMake (CMakeLists.txt)
+which is much simpler, and if it works well enough then I plan to just
+delete the old makefiles and project files. The CMake files should
+work on Linux and MacOS X.
+I should use more variables to make the CMake files more portable, and should
+use ICU's installed icu-config or Makefile.inc to get the values for these
+variables.
+(If and when ICU itself uses CMake, we should be able to point to its modules.)
+
+Things will improve as I work on Unicode 6...
+
+markus
diff --git a/unicode/makedefs.sh b/unicode/makedefs.sh
new file mode 100755
index 0000000..9496164
--- /dev/null
+++ b/unicode/makedefs.sh
@@ -0,0 +1,16 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# Basic definitions for building ICU Unicode data.
+# Sourced from makeprops.sh for example.
+UNICODE_VERSION=6.0
+# Assume that there are parallel src & bld trees with the Unicode tools
+# source files and the out-of-source build files.
+# Assume that the current folder is some/path/src/unicode
+UNITOOLS_BLD=../../bld/unicode
+# The sourcing script must define ICU_SRC and ICU_BLD for the ICU library
+# source files and the out-of-source build files.
+UNIDATA=$ICU_SRC/source/data/unidata
+COMMON=$ICU_SRC/source/common
+SRC_DATA_IN=$ICU_SRC/source/data/in
+BLD_DATA_FILES=$ICU_BLD/data/out/build/icudt45l
diff --git a/unicode/makeprops.sh b/unicode/makeprops.sh
new file mode 100755
index 0000000..83c7651
--- /dev/null
+++ b/unicode/makeprops.sh
@@ -0,0 +1,50 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# Parses Unicode Character Database files and build ICU core properties files.
+#
+# Invoke as
+#   ./makeprops.sh path/to/ICU/src/tree path/to/ICU/build/tree
+#
+# Prerequisite:
+# In a Unicode version upgrade, pnames.icu must be generated first so that the
+# tools here see new property names and property value names.
+# See (ICU)/source/data/unidata/changes.txt.
+ICU_SRC=$1
+ICU_BLD=$2
+source ./makedefs.sh
+
+# uprops.icu
+$UNITOOLS_BLD/c/genprops/genprops -d $SRC_DATA_IN      -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+$UNITOOLS_BLD/c/genprops/genprops -d $COMMON --csource -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+
+# ubidi.icu
+$UNITOOLS_BLD/c/genbidi/genbidi -d $SRC_DATA_IN      -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+$UNITOOLS_BLD/c/genbidi/genbidi -d $COMMON --csource -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+
+# ucase.icu
+$UNITOOLS_BLD/c/gencase/gencase -d $SRC_DATA_IN      -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+$UNITOOLS_BLD/c/gencase/gencase -d $COMMON --csource -s $UNIDATA -i $BLD_DATA_FILES -u $UNICODE_VERSION
+
+# unames.icu
+$UNITOOLS_BLD/c/gennames/gennames -d $SRC_DATA_IN -1 -q $UNIDATA/UnicodeData.txt $UNIDATA/NameAliases.txt -u $UNICODE_VERSION
+
+# unidata/norm2/*.txt
+$UNITOOLS_BLD/c/gennorm/gennorm -d $UNIDATA/norm2 -s $UNIDATA -i $BLD_DATA_FILES
+
+# *.nrm
+export LD_LIBRARY_PATH=$ICU_BLD/lib
+$ICU_BLD/bin/gennorm2 -o $SRC_DATA_IN/nfc.nrm     -s $UNIDATA/norm2 nfc.txt              -u $UNICODE_VERSION
+$ICU_BLD/bin/gennorm2 -o $SRC_DATA_IN/nfkc.nrm    -s $UNIDATA/norm2 nfkc.txt             -u $UNICODE_VERSION
+$ICU_BLD/bin/gennorm2 -o $SRC_DATA_IN/nfkc_cf.nrm -s $UNIDATA/norm2 nfkc.txt nfkc_cf.txt -u $UNICODE_VERSION
+$ICU_BLD/bin/gennorm2 -o $SRC_DATA_IN/uts46.nrm   -s $UNIDATA/norm2 nfc.txt uts46.txt    -u $UNICODE_VERSION
+
+# Let genuca see the latest normalization data.
+cp $SRC_DATA_IN/nfc.nrm $BLD_DATA_FILES
+
+# UCA
+$UNITOOLS_BLD/c/genuca/genuca -d $SRC_DATA_IN/coll -s $UNIDATA -i $BLD_DATA_FILES
+# If this is the first pass through rebuilding ICU data files,
+# then genuca has not yet seen the new core properties (e.g., case mappings)
+# from genprops --csource. Rebuild ICU and then the UCA data (makeuca.sh).
+# See (ICU)/source/data/unidata/changes.txt.
diff --git a/unicode/makeuca.sh b/unicode/makeuca.sh
new file mode 100755
index 0000000..575361e
--- /dev/null
+++ b/unicode/makeuca.sh
@@ -0,0 +1,15 @@
+# Copyright (C) 2010, International Business Machines
+# Corporation and others.  All Rights Reserved.
+#
+# Parses Unicode Character Database files and build ICU UCA data files.
+#
+# Requires: 1. run makeprops.sh  2. rebuild ICU & Unicode tools
+# See (ICU)/source/data/unidata/changes.txt
+#
+# Invoke as
+#   ./makeuca.sh path/to/ICU/src/tree path/to/ICU/build/tree
+ICU_SRC=$1
+ICU_BLD=$2
+source ./makedefs.sh
+
+$UNITOOLS_BLD/c/genuca/genuca -d $SRC_DATA_IN/coll -s $UNIDATA -i $BLD_DATA_FILES
diff --git a/unicode/py/idna2nrm.py b/unicode/py/idna2nrm.py
new file mode 100755
index 0000000..ec8a983
--- /dev/null
+++ b/unicode/py/idna2nrm.py
@@ -0,0 +1,89 @@
+#!/usr/bin/python2.4
+#   Copyright (C) 2010, International Business Machines
+#   Corporation and others.  All Rights Reserved.
+#
+#   file name:  idna2nrm.py
+#   encoding:   US-ASCII
+#   tab size:   8 (not used)
+#   indentation:4
+#
+#   created on: 2010jan28
+#   created by: Markus W. Scherer
+
+"""Turn Unicode IdnaMappingTable.txt into ICU gennorm2 source file format."""
+
+__author__ = "Markus Scherer"
+
+import re
+
+replacements = [
+  # Several versions of avoiding circular FFFD>FFFD mappings,
+  # depending on the version of the input file.
+  (re.compile(r"FFFD          ; disallowed"), "# FFFD (avoid circular mapping)"),
+  (re.compile(r"\.\.FFFD"), "..FFFC"),
+  (re.compile(r"(FFF[^E])\.\.FFFF"), "\1..FFFC"),
+  # Since we switch between checking and not checking for STD3 character
+  # restrictions at runtime, checking the non-LDH ASCII characters in code,
+  # we treat these values here like their regular siblings.
+  (re.compile(r"^([^;]+)  ; disallowed_STD3_valid"), r"# \1disallowed_STD3_valid"),
+  (re.compile(r"; disallowed_STD3_mapped +; "), ">"),
+  # Normal transformations.
+  (re.compile(r"; disallowed"), ">FFFD"),
+  (re.compile(r"; ignored"), ">"),
+  (re.compile(r"^([^;]+)  ; valid"), r"# \1valid"),
+  (re.compile(r"; mapped +; "), ">"),
+  (re.compile(r"^([^;]+)  ; deviation +; "), r"# \1deviation >")
+]
+
+in_file = open("IdnaMappingTable.txt", "r")
+out_file = open("uts46.txt", "w")
+
+out_file.write("# Original file:\n")
+for line in in_file:
+  orig_line = line
+  if line.startswith("# For documentation, see"):
+    out_file.write(line)
+    out_file.write(r"""
+# ================================================
+# This file has been reformatted into syntax for the
+# gennorm2 Normalizer2 data generator tool.
+#
+# "valid", "disallowed_STD3_valid" and "deviation" lines are commented out.
+# "mapped" and "disallowed_STD3_mapped" are changed to use the ">" mapping syntax.
+# "disallowed" lines map to U+FFFD.
+# "ignored" lines map to an empty string.
+#
+# Characters disallowed under STD3 rules are treated as valid or mapped;
+# they are handled in code.
+# Deviation characters are also handled in code.
+#
+# Use this file as the second gennorm2 input file after nfc.txt.
+# ================================================
+""")
+    continue
+  if line[0] in "#\r\n":
+    out_file.write(line)
+    continue
+  for rep in replacements: line = rep[0].sub(rep[1], line)
+  # Align inline comments at column 40.
+  comment_pos = line.find("#", 1)
+  if comment_pos < 40:
+    line = line[:comment_pos] + ((40 - comment_pos) * ' ') + line[comment_pos:]
+  elif comment_pos > 40:
+    space_pos = comment_pos
+    while space_pos > 0 and line[space_pos - 1] == ' ':
+      space_pos = space_pos - 1
+    if space_pos < 40:
+      # Fewer than 40 characters before the comment:
+      # Align comments at column 40.
+      line = line[:40] + line[comment_pos:]
+    else:
+      # 40 or more characters before the comment:
+      # Keep one space between contents and comment.
+      line = line[:space_pos] + " " + line[comment_pos:]
+  # Write the modified line.
+  out_file.write(line)
+  if "..FFFF" in orig_line and "..FFFC" in line:
+    out_file.write("FFFE..FFFF    >FFFD\n");
+in_file.close()
+out_file.close()
diff --git a/unicodetools/com/ibm/rbm/Bundle.java b/unicodetools/com/ibm/rbm/Bundle.java
new file mode 100644
index 0000000..ca1eecd
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/Bundle.java
@@ -0,0 +1,470 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+/**
+ * A class representing the entire Bundle of Resources for a particular language, country, variant.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class Bundle {
+    
+    /**
+     * The following public class variables reflect the various properties that can be included as
+     * meta-data in a resource bundle formatted by RBManager
+     */
+    public String name;
+    /**
+     * The encoding of the bundle (e.g. 'en', 'en_US', 'de', etc.)
+     */
+    public String encoding;
+    /**
+     * A descriptor of the language in the encoding (e.g. English, German, etc.)
+     */
+    public String language;
+    /**
+     * A descriptor of the country in the encoding (e.g. US, Canada, Great Britain)
+     */
+    public String country;
+    /**
+     * The descriptor of the variant in the encoding (e.g. Euro, Irish, etc.)
+     */
+    public String variant;
+    /**
+     * A comment concerning the bundle
+     */
+    public String comment;
+    /**
+     * The name of the person responsible for the managerment of this bundle
+     */
+    public String manager;
+    
+    private TreeSet groups;                                 // A vector of groups of NLS items, the key is the group name
+    
+    /**
+     * A hashtable of all of the items in the bundle, hashed according to their
+     * NLS key.
+     */
+    
+    public Hashtable allItems;                              // A hashtable of all items in the file, the key is the NLS key
+    
+    private TreeSet untranslatedItems;                      // A vector of all items which are untranslated
+    
+    /**
+     * A vector containing all of the items which are duplicates (based on the NLS keys)
+     * of items previously declared in the bundle.
+     */
+    
+    public Vector duplicates;                               // A vector of items which are duplicates (NLS Keys) of previous items
+		
+    /**
+     * Constructor for creating an empty bundle with a given encoding
+     */
+    
+    public Bundle(String encoding) {
+        this.encoding = encoding;
+        language = null;
+        country  = null;
+        variant  = null;
+        comment  = null;
+        manager  = null;
+        groups = new TreeSet(new Comparator() {
+            public boolean equals(Object o) { return false; }
+            
+            public int compare(Object o1, Object o2) {
+                if (!(o1 instanceof BundleGroup) || !(o2 instanceof BundleGroup))
+                	return 0;
+                BundleGroup g1 = (BundleGroup)o1;
+                BundleGroup g2 = (BundleGroup)o2;
+                return g1.getName().compareTo(g2.getName());
+            }
+        });
+            
+        untranslatedItems = new TreeSet(new Comparator() {
+            public boolean equals(Object o) { return false; }
+            
+            public int compare(Object o1, Object o2) {
+                if (!(o1 instanceof BundleItem) || !(o2 instanceof BundleItem)) return 0;
+                BundleItem i1 = (BundleItem)o1;
+                BundleItem i2 = (BundleItem)o2;
+                return i1.getKey().compareTo(i2.getKey());
+            }
+        });
+        
+        duplicates = new Vector();
+        allItems = new Hashtable();
+    }
+		
+    /**
+     * Encodings are of the form -> language_country_variant <- (for example: "en_us_southern").
+     * This method returns the language encoding string, or null if it is not specified
+     */
+		
+    public String getLanguageEncoding() {
+        if (encoding == null)
+            return null;
+        if (encoding.indexOf("_") >= 0)
+            return encoding.substring(0,encoding.indexOf("_"));
+        return encoding.trim();
+    }
+		
+    /**
+     * Encodings are of the form -> language_country_variant <- (for example: "en_us_southern").
+     * This method returns the country encoding string, or null if it is not specified
+     */
+		
+    public String getCountryEncoding() {
+        if (encoding == null || encoding.indexOf("_") < 0)
+            return null;
+        // Strip off the language
+        String workStr = encoding.substring(encoding.indexOf("_")+1,encoding.length());
+        if (workStr.indexOf("_") >= 0)
+            return workStr.substring(0,encoding.indexOf("_"));
+        return workStr.trim();
+    }
+		
+    /**
+     * Encodings are of the form -> language_country_variant <- (for example: "en_us_southern").
+     * This method returns the variant encoding string, or null if it is not specified
+     */
+		
+    public String getVariantEncoding() {
+        if (encoding == null || encoding.indexOf("_") < 0)
+        	return null;
+        // Strip off the language
+        String workStr = encoding.substring(encoding.indexOf("_")+1,encoding.length());
+        if (workStr == null || workStr.length() < 1 || workStr.indexOf("_") < 0)
+        	return null;
+        // Strip off the country
+        workStr = workStr.substring(encoding.indexOf("_")+1, workStr.length());
+        return workStr.trim();
+    }
+    
+    /**
+     * Returns the UntranslatedItems as a vector. I should find where this happens and stop it.
+     */
+		
+    public Vector getUntranslatedItemsAsVector() {
+        Iterator iter = untranslatedItems.iterator();
+        Vector v = new Vector();
+        while (iter.hasNext())
+        	v.addElement(iter.next());
+        return v;
+    }
+		
+    /**
+     * Checks all items in the untranslated items set. If they belong to a group whose name
+     * matches the passed in name, then they are removed.
+     */
+		
+    public void removeUntranslatedItemsByGroup(String groupName) {
+        Iterator iter = untranslatedItems.iterator();
+        try {
+            while(iter.hasNext()) {
+                BundleItem item = null;
+                item = (BundleItem)iter.next();
+                if (item != null && item.getParentGroup().getName().equals(groupName)) {
+                    removeUntranslatedItem(item.getKey());
+                }
+            }
+        } catch (Exception e) {
+            RBManagerGUI.debugMsg(e.getMessage());
+        }
+    }
+		
+    /**
+     * Checks to see if an item of the given key name exists in the set of untranslated items. If
+     * it does exist, then it is removed.
+     */
+		
+    public void removeUntranslatedItem(String name) {
+        Iterator iter = untranslatedItems.iterator();
+        while (iter.hasNext()) {
+            BundleItem item = (BundleItem)iter.next();
+            if (item.getKey().equals(name)) {
+                untranslatedItems.remove(item);
+                break;
+            }
+        }
+    }
+		
+    /**
+     * Returns the boolean of wether a group of a given name exists in the bundle
+     */
+		
+    public boolean hasGroup(String groupName) {
+        Iterator iter = groups.iterator();
+        while (iter.hasNext()) {
+            BundleGroup group = (BundleGroup)iter.next();
+            if (group.getName().equals(groupName))
+            	return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Creates a group of the given name and optionally associates a comment with
+     * that group.
+     */
+    
+    public void addBundleGroup(String groupName, String groupComment) {
+        BundleGroup bg = new BundleGroup(this, groupName);
+        bg.setComment(groupComment);
+        addBundleGroup(bg);
+    }
+		
+    /**
+     * Removes the group of the given name if it exists in the bundle
+     */
+		
+    public void removeGroup(String groupName) {
+        Iterator iter = groups.iterator();
+        while (iter.hasNext()) {
+            BundleGroup tempGroup = (BundleGroup)iter.next();
+            if (tempGroup.getName().equals(groupName)) {
+                groups.remove(tempGroup);
+                break;
+            }
+        }
+        // Remove the items from the untanslated items
+        removeUntranslatedItemsByGroup(groupName);
+			
+        // Loop through all Items
+        Enumeration elems = allItems.elements();
+        while(elems.hasMoreElements()) {
+            BundleItem item = (BundleItem)elems.nextElement();
+            if (item.getParentGroup().getName().equals(groupName)) {
+                allItems.remove(item);
+            }
+        }
+    }
+		
+    /**
+     * Removes a single resource item from the bundle
+     */
+		
+    public void removeItem(String key) {
+        Object o = allItems.get(key);
+        if (o != null) {
+            BundleItem item = (BundleItem)o;
+            // Remove from allItems Hashtable
+            allItems.remove(key);
+            // Remove from item's group
+            if (item.getParentGroup() != null) {
+                BundleGroup group = item.getParentGroup();
+                group.removeBundleItem(key);
+            }
+            // Remove from untranslatedItems Hashtable
+            removeUntranslatedItem(key);
+        }
+    }
+		
+    /**
+     * Attempts to add a BundleItem to the untranslatedItems. The addition will fail in two cases: One, if
+     * the item does not all ready belong to this Bundle, and Two, if the item is all ready in the set of
+     * untranslated items.
+     */
+		
+    public void addUntranslatedItem(BundleItem item) {
+        if (item.getParentGroup().getParentBundle() != this)
+        	return;
+        // Remove it if it exists.
+        if (untranslatedItems.contains(item)) {
+        	untranslatedItems.remove(item);
+        }
+    	untranslatedItems.add(item);
+    }
+		
+    /**
+     * Returns the number of items currently marked as untranslated
+     */
+		
+    public int getUntranslatedItemsSize() {
+        return untranslatedItems.size();
+    }
+		
+    /**
+     * Returns the indexth untranslated item
+     */
+		
+    public BundleItem getUntranslatedItem(int index) {
+        if (index >= untranslatedItems.size())
+        	return null;
+        Iterator iter = untranslatedItems.iterator();
+        for (int i=0; i < index; i++)
+        	iter.next();
+        return (BundleItem)iter.next();
+    }
+    
+    /**
+     * Return the various resource bundle groups stored in a Vector collection.
+     */
+    
+    public Vector getGroupsAsVector() {
+        Vector v = new Vector();
+        Iterator iter = groups.iterator();
+        while (iter.hasNext()) {
+            BundleGroup group = (BundleGroup)iter.next();
+            v.addElement(group);
+        }
+        return v;
+    }
+    
+    /**
+     * Returns the number of groups in the bundle.
+     */
+    
+    public int getGroupCount() {
+        return groups.size();
+    }
+    
+    /**
+     * Returns a bundle group given a certain index.
+     */
+    
+    public BundleGroup getBundleGroup(int index) {
+        if (index >= getGroupCount())
+        	return null;
+        Iterator iter = groups.iterator();
+        for (int i=0; i < index; i++)
+        	iter.next();
+        return (BundleGroup)iter.next();
+    }
+
+    /**
+     * Looks for a bundle group of a given name within a bundle and
+     * returns it if found.
+     */
+		
+    public BundleGroup getBundleGroup(String groupName) {
+        Iterator iter = groups.iterator();
+        while(iter.hasNext()) {
+            BundleGroup group = (BundleGroup)iter.next();
+            if (group.getName().equals(groupName))
+            	return group;
+        }
+        return null;
+    }
+    
+    /**
+     * Looks up and returns a bundle item stored in the bundle based on its
+     * NLS lookup key.
+     */
+    
+    public BundleItem getBundleItem(String key) {
+        return (BundleItem)allItems.get(key);
+    }
+                    
+    /**
+     * One group is created for all bundles called 'Ungrouped Items'. This is the bundle
+     * group in which bundle items are placed that are not specifically grouped in the
+     * resource bundle file. This method returns that bundle group.
+     */
+    
+    public BundleGroup getUngroupedGroup() {
+        return getBundleGroup("Ungrouped Items");
+    }
+		
+    /**
+     * Add a bundle group to the bundle
+     */
+     
+    public void addBundleGroup(BundleGroup bg) {
+        groups.add(bg);
+    }
+
+    /**
+     * Add a bundle item to the bundle. This bundle item should all ready have its
+     * bundle group assigned.
+     */
+		
+    public void addBundleItem(BundleItem item) {
+        if (allItems.containsKey(item.getKey())) {
+            duplicates.addElement(item);
+        } else {
+            if (!(groups.contains(item.getParentGroup())))
+            	addBundleGroup(item.getParentGroup());
+            item.getParentGroup().addBundleItem(item);
+            allItems.put(item.getKey(), item);
+            removeUntranslatedItem(item.getKey());
+            if (!item.isTranslated())
+            	addUntranslatedItem(item);
+        }
+    }
+    
+    /**
+     * A method useful in debugging. The string returned displays the encoding
+     * information about the bundle and wether or not it is the base class of
+     * a resource bundle.
+     */
+    
+    public String toString() {
+        String retStr = new String();
+        if (language != null && !language.equals("")) retStr = language;
+        if (country != null && !country.equals("")) retStr += ", " + country;
+        if (variant != null && !variant.equals("")) retStr += ", " + variant;
+			
+        retStr += " (" + (encoding == null || encoding.equals("") ? "Base Class" : encoding) + ")";
+        return retStr;
+    }
+    
+    /**
+     * This method produces a String which is suitable for inclusion in a .properties
+     * style resource bundle. It attaches (in comments) the meta data that RBManager
+     * reads to manage the resource bundle file. This portion of the output should
+     * be included at the beginning of the resource bundle file.
+     */
+    
+    public String toOutputString() {
+        String                retStr  = "# @file          " + name     + "\n";
+        if (encoding != null) retStr += "# @fileEncoding  " + encoding + "\n";
+        if (language != null) retStr += "# @fileLanguage  " + language + "\n";
+        if (country  != null) retStr += "# @fileCountry   " + country  + "\n";
+        if (variant  != null) retStr += "# @fileVariant   " + variant  + "\n";
+        if (manager  != null) retStr += "# @fileManager   " + manager  + "\n";
+        if (comment  != null) retStr += "# @fileComment   " + comment  + "\n";
+        return retStr;
+    }
+
+    /**
+     * A helping method for outputting the formatted contents of the bundle to a
+     * print stream. The method first outputs the header information and then outputs
+     * each bundle group's formatted data which includes each bundle item.
+     */
+		
+    public void writeContents(PrintStream ps) {
+        ps.println(this.toOutputString());
+        Iterator iter = groups.iterator();
+        while (iter.hasNext()) {
+            ((BundleGroup)iter.next()).writeContents(ps);
+        }
+    }
+
+    /**
+     * A helping method for outputting the formatted contents of the bundle to a
+     * ouput Writer (such as a FileWriter). The method first outputs the header
+     * information and then outputs each bundle group's formatted data which includes
+     * each bundle item.
+     */
+		
+    public void writeContents(Writer w) throws IOException {
+        w.write(this.toOutputString() + "\n");
+        Iterator iter = groups.iterator();
+        while (iter.hasNext()) {
+            ((BundleGroup)iter.next()).writeContents(w);
+        }
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/BundleGroup.java b/unicodetools/com/ibm/rbm/BundleGroup.java
new file mode 100644
index 0000000..a5ccedb
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/BundleGroup.java
@@ -0,0 +1,188 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.*;
+
+/**
+ * A class representing a group of BundleItems and the meta data associated with that group
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class BundleGroup {
+    private String name;                        // The name of the group
+    private String comment;                     // A comment describing this group
+    private TreeSet items;                      // The NLS items contained in this group
+    private Bundle bundle;                      // The parent Bundle object of this group
+		
+    /**
+     * Basic data constructor.
+     * Creates a BundleGroup with a parent bundle and a given name.
+     */
+    public BundleGroup(Bundle parent, String name) {
+        bundle = parent;
+        this.name = name;
+        comment = null;
+        items = new TreeSet(new Comparator(){
+            public boolean equals(Object o) { return false; }
+            public int compare(Object o1, Object o2) {
+                if (!(o1 instanceof BundleItem) || !(o2 instanceof BundleItem))
+                	return 0;
+                BundleItem i1 = (BundleItem)o1;
+                BundleItem i2 = (BundleItem)o2;
+                return i1.getKey().compareTo(i2.getKey());
+            }
+        });
+    }
+
+    /**
+     * Two bundle groups are considered equal iff their names are the same.
+     */
+    public boolean equals(Object o) {
+        return (o instanceof BundleGroup && ((BundleGroup)o).getName().equals(name));
+    }
+	
+    // This should be changed anywhere it is used
+	
+    public Vector getItemsAsVector() {
+        Vector v = new Vector();
+        Iterator iter = items.iterator();
+        while (iter.hasNext()) {
+            v.addElement(iter.next());
+        }
+        return v;
+    }
+	
+    /**
+     * Adds a BundleItem to the group as long as that item is not currently in the group.
+     * If the item.group is not equal to this group, then it is changed to be this group.
+     * This method should, in most cases, only be called from the Bundle class.
+     */
+    public void addBundleItem(BundleItem item) {
+    	if (items.contains(item)) {
+    		items.remove(item);
+    	}
+        item.setParentGroup(this);
+        items.add(item);
+    }
+	
+    /**
+     * Remove an item of the given name from the group
+     */
+    public void removeBundleItem(String itemName) {
+        Iterator iter = items.iterator();
+        while(iter.hasNext()) {
+            BundleItem item = (BundleItem)iter.next();
+            if (item.getKey().equals(itemName)) {
+                items.remove(item);
+                break;
+            }
+        }
+    }
+	
+    /**
+     * Returns the number of items stored in the group
+     */
+    public int getItemCount() {
+        return items.size();
+    }
+	
+    /**
+     * Returns a BundleItem from the set of items at a particular index point.
+     * If the index is greater than or equal to the number of items in the set,
+     * null is returned.
+     */
+    public BundleItem getBundleItem(int index) {
+        if (index >= items.size())
+        	return null;
+        Iterator iter = items.iterator();
+        for (int i=0; i < index; i++)
+        	iter.next();
+        return (BundleItem)iter.next();
+    }
+    
+    /**
+     * Returns the bundle to which this group belongs
+     */
+    public Bundle getParentBundle() {
+        return bundle;
+    }
+    
+    /**
+     * Returns the comment associated with this bundle
+     */
+    public String getComment() {
+        return comment;
+    }
+    
+    /**
+     * Returns the name of the bundle
+     */
+    public String getName() {
+        return name;
+    }
+	
+    protected void setParentBundle(Bundle bundle) {
+        this.bundle = bundle;
+    }
+	
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+	
+    public void setName(String name) {
+        this.name = name;
+    }
+	
+    /**
+     * The translation to a string returns the name of the group
+     */
+    public String toString() {
+        return name;
+    }
+	
+    /**
+     * Returns the output for a group heading.
+     * This will be found in comment lines above the group items
+     */
+	public String toOutputString() {
+        String retStr = "\n#\n# @group " + name + "\n#\n";
+        if (comment != null)
+        	retStr += "# @groupComment " + comment + "\n";
+        return retStr;
+    }
+	
+    /**
+     * Writes the output contents to a particular PrintStream.
+     * The output will be suitable for a properly formatted .properties file.
+     */
+    public void writeContents(PrintStream ps) {
+        if (!name.equals("Ungrouped Items"))
+        	ps.println(this.toOutputString());
+        Iterator iter = items.iterator();
+        while (iter.hasNext()) {
+            ((BundleItem) iter.next()).writeContents(ps);	
+        }
+    }
+	
+    /**
+     * Writes the output contents to a particular Writer.
+     * The output will be suitable for a properly formatted .properties file.
+     */
+    public void writeContents(Writer w) throws IOException {
+        if (!name.equals("Ungrouped Items"))
+        	w.write(this.toOutputString() + "\n");
+        Iterator iter = items.iterator();
+        while (iter.hasNext()) {
+            ((BundleItem) iter.next()).writeContents(w);
+        }
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/BundleItem.java b/unicodetools/com/ibm/rbm/BundleItem.java
new file mode 100644
index 0000000..0ed0360
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/BundleItem.java
@@ -0,0 +1,387 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
+import java.util.*;
+
+/**
+ * A class representing a single translation item and all of the meta-data associated with that translation
+ * 
+ * @author Jared Jackson - Email: <a href="mailto:jjared@almaden.ibm.com">jjared@almaden.ibm.com</a>
+ * @see com.ibm.rbm.RBManager
+ */
+public class BundleItem {
+    private String name;                                   // The name of the NLS item key
+    private String value;                                  // The translation of the key item
+    private String comment;                                // A comment about this item
+    private boolean translated;                            // Has this item been translated?
+    private Date created;                                  // The date of creation of the item
+    private Date modified;                                 // The last modification date of the item
+    private String creator;                                // The name of the person who created the item
+    private String modifier;                               // The name of the person who last modified the item
+    private Hashtable lookups;                             // A hastable of lookups for the item (i.e. ({#}, Meaning) pairs)
+    private BundleGroup group;                             // The parent group of the item
+		
+    /**
+     * Basic data constructor for a resource bundle item.
+     * @param parent The BundleGroup to which the item belongs. This group will have its own Bundle parent.
+     * @param name The NLS lookup key common across all bundle files in the resource bundle
+     * @param value The translated value of the item appropriate for the encoding of the bundle file to which the item belongs
+     */
+     
+    public BundleItem(BundleGroup parent, String name, String value) {
+        this.name = name;
+        this.value = value;
+        this.group = parent;
+        comment = null;
+        translated = false;
+        created = new Date();                               // Defaults to the system's current date
+        modified = new Date();                              // Defaults to the system's current date
+        creator = null;
+        modifier = null;
+        lookups = new Hashtable();
+    }
+
+    /**
+     * Returns the BundleGroup to which this item belongs
+     */
+	
+    public BundleGroup getParentGroup() {
+        return group;
+    }
+
+    /**
+     * Returns the date this item was last modified.
+     */
+	
+    public Date getModifiedDate() {
+        return modified;
+    }
+    
+    /**
+     * Returns the date the item was first created.
+     */
+	
+    public Date getCreatedDate() {
+        return created;
+    }
+    
+    /**
+     * Returns the login name of the user that created the item.
+     */
+	
+    public String getCreator() {
+        return creator;
+    }
+    
+    /**
+     * Returns the login name of the user that last modified the item.
+     */
+    
+    public String getModifier() {
+        return modifier;
+    }
+    
+    /**
+     * Returns the NLS lookup key for the item.
+     */
+	
+    public String getKey() {
+        return name;
+    }
+
+    /**
+     * Returns the translation value for the item.
+     */
+	
+    public String getTranslation() {
+        return value;
+    }
+    
+    /**
+     * Returns a comment associated with the item.
+     */
+    
+    public String getComment() {
+        return comment;
+    }
+    
+    /**
+     * Has the item yet been translated, or was it merely derived from a previous
+     * bundle file?
+     */
+	
+    public boolean isTranslated() {
+        return translated;
+    }
+    
+    /**
+     * Returns a hashtable of the various lookups associated with the item. Lookups are
+     * context sensitive information stored within the resource item and have their own
+     * meta-data associated with themselves.
+     */
+	
+    public Hashtable getLookups() {
+        return lookups;
+    }
+
+    /**
+     * Sets the translated value of the item. A true mark indicates that the item has
+     * been examined or modified and is ready for use in the encoding specified by the
+     * parent Bundle.
+     */
+	
+    public void setTranslated(boolean isTranslated) {
+        if (translated == isTranslated) return;
+        translated = isTranslated;
+        if (this.getParentGroup() != null && this.getParentGroup().getParentBundle() != null) {
+            Bundle bundle = this.getParentGroup().getParentBundle();
+            if (isTranslated) bundle.removeUntranslatedItem(this.name);
+            else bundle.addUntranslatedItem(this);
+        }
+    }
+    
+    /**
+     * Sets the comment associated with this item.
+     */
+    
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+    
+    /**
+     * Given a hashtable of lookups, associates those lookups with this item.
+     */
+	
+    public void setLookups(Hashtable lookups) {
+        this.lookups = lookups;
+    }
+    
+    /**
+     * Sets the NLS key associated with this item. Be careful using this method, as
+     * it does not change the lookup value of any other items in the resource bundle.
+     * This must be done at a higher level.
+     */
+    
+    public void setKey(String keyName) {
+        name = keyName;
+    }
+    
+    /**
+     * Sets the translation value of the item.
+     */
+    
+    public void setTranslation(String translationValue) {
+        value = translationValue;
+    }
+    
+    /**
+     * Sets the parent BundleGroup of the item.
+     */
+    
+    public void setParentGroup(BundleGroup group) {
+        this.group = group;
+    }
+    
+    /**
+     * Associates a login name of the creator of the item with the item.
+     */
+	
+    public void setCreator(String name) {
+        creator = name;
+    }
+
+    /**
+     * Associates a login name of the last modifier of the item with the item.
+     */
+	
+    public void setModifier(String name) {
+        modifier = name;
+    }
+
+    /**
+     * Sets the created date of the item given a date formatted string.
+     * The format can be either 'YYYY-MM-DD' (e.g. 20002-02-05) or
+     * the format can be 'YYYMMDDTHHMMSSZ' (e.g. 20020205T103000Z)
+     */
+    
+    public void setCreatedDate(String dateStr) {
+        if (dateStr != null) created = parseDateFromString(dateStr);
+    }
+    
+    /**
+     * Sets the created date of the item.
+     */
+    
+    public void setCreatedDate(Date date) {
+        created = date;
+    }
+    
+    /**
+     * Sets the last modififcation date of the item given a date formatted string.
+     * The format can be either 'YYYY-MM-DD' (e.g. 2002-02-05) or
+     * the format can be 'YYYMMDDTHHMMSSZ' (e.g. 20020205T103000Z)
+     */
+    
+    public void setModifiedDate(String dateStr) {
+        if (dateStr != null)
+        	modified = parseDateFromString(dateStr);
+    }
+    
+    /**
+     * Sets the last modification date of the item.
+     */
+    
+    public void setModifiedDate(Date date) {
+        modified = date;
+    }
+    
+    /**
+     * Simply returns the lookup name of the item.
+     */
+    
+    public String toString() {
+        return name;
+    }
+    
+    /**
+     * Returns the formatted output of this bundle item as it would be included in a .properties
+     * formatted resource bundle file. This format also contains the meta-data used by RBManager in
+     * the form of parseable comments.
+     */
+
+    public String toOutputString() {
+        String retStr = (translated ? "# @translated true" : "# @translated false");
+        if (created != null) {
+            GregorianCalendar createdCal = new GregorianCalendar();
+            createdCal.setTime(created);
+            int year = createdCal.get(Calendar.YEAR);
+            int month = createdCal.get(Calendar.MONTH)+1;
+            int day = createdCal.get(Calendar.DAY_OF_MONTH);
+            retStr += " @created " + String.valueOf(year) + "-"
+                + (month > 9 ? String.valueOf(month) : "0" + String.valueOf(month)) + "-"
+                + (day > 9 ? String.valueOf(day) : "0" + String.valueOf(day));
+        }
+        if (modified != null) {
+            GregorianCalendar modifiedCal = new GregorianCalendar();
+            modifiedCal.setTime(modified);
+            int year = modifiedCal.get(Calendar.YEAR);
+            int month = modifiedCal.get(Calendar.MONTH)+1;
+            int day = modifiedCal.get(Calendar.DAY_OF_MONTH);
+            retStr += " @modified " + String.valueOf(year) + "-"
+                + (month > 9 ? String.valueOf(month) : "0" + String.valueOf(month)) + "-"
+                + (day > 9 ? String.valueOf(day) : "0" + String.valueOf(day));
+        }
+        if (creator != null) retStr += " @creator " + creator;
+        if (modifier != null) retStr += " @modifier " + modifier;
+        Enumeration elems = lookups.keys();
+        while (elems.hasMoreElements()) {
+            String str = (String)elems.nextElement();
+            retStr += "\n# @{" + str + "} " + (String)lookups.get(str);
+        }
+        if (comment != null) retStr += "\n# @comment " + comment;
+		
+        retStr += "\n" + name + "=" + saveConvert(value);
+        return retStr;
+    }
+    
+    /**
+     * Writes the formatted contents to a PrintStream.
+     */
+    
+    public void writeContents(PrintStream ps) {
+        ps.println(this.toOutputString());
+    }
+	
+    /**
+     * Writes the formatted contents to a writer such as a FileWriter.
+     */
+
+    public void writeContents(Writer w) throws IOException {
+        w.write(this.toOutputString() + "\n");
+    }
+		
+    /*
+     * Converts unicodes to encoded \\uxxxx
+     * and writes out any of the characters in specialSaveChars
+     * with a preceding slash
+     */
+    // Taken from java.util.Properties
+    private String saveConvert(String theString) {
+        char aChar;
+        int len = theString.length();
+        StringBuffer outBuffer = new StringBuffer(len*2);
+
+        for(int x=0; x<len; ) {
+            aChar = theString.charAt(x++);
+            switch(aChar) {
+                case '\\':outBuffer.append('\\'); outBuffer.append('\\');
+                          continue;
+                case '\t':outBuffer.append('\\'); outBuffer.append('t');
+                          continue;
+                case '\n':outBuffer.append('\\'); outBuffer.append('n');
+                          continue;
+                case '\r':outBuffer.append('\\'); outBuffer.append('r');
+                          continue;
+                case '\f':outBuffer.append('\\'); outBuffer.append('f');
+                          continue;
+                default:
+                    if ((aChar < 20) || (aChar > 127)) {
+                        outBuffer.append('\\');
+                        outBuffer.append('u');
+                        outBuffer.append(toHex((aChar >> 12) & 0xF));
+                        outBuffer.append(toHex((aChar >> 8) & 0xF));
+                        outBuffer.append(toHex((aChar >> 4) & 0xF));
+                        outBuffer.append(toHex((aChar >> 0) & 0xF));
+                    }
+                    else {
+                        if (specialSaveChars.indexOf(aChar) != -1)
+                            outBuffer.append('\\');
+                        outBuffer.append(aChar);
+                    }
+            }
+        }
+        return outBuffer.toString();
+    }
+	
+    /**
+     * Convert a nibble to a hex character
+     * @param	nibble	the nibble to convert.
+     */
+	// Taken from java.util.Properties
+    private static char toHex(int nibble) {
+        return hexDigit[(nibble & 0xF)];
+    }
+	
+    /** A table of hex digits */
+    // Taken from java.util.Properties
+    private static final char[] hexDigit = {
+	'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+    };
+	
+    // Taken from java.util.Properties
+    private static final String specialSaveChars = "=: \t\r\n\f#!";
+	
+    private Date parseDateFromString(String dateStr) {
+        SimpleDateFormat format = null;
+        if (dateStr.length() == 10)
+        	format = new SimpleDateFormat("yyyy-MM-dd"); // Simple format
+        else
+        	format = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");              // TMX ISO format
+        try {
+            return format.parse(dateStr);
+        } catch (ParseException pe) {
+            return new Date();
+        }
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/Occurance.java b/unicodetools/com/ibm/rbm/Occurance.java
new file mode 100644
index 0000000..b9bcbda
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/Occurance.java
@@ -0,0 +1,63 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+/**
+ * This is a class used by the RBReporter to track occurances of a resource
+ * key found while scanning a text code file. It is used mainly to produce error
+ * messages with helpful context information.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBReporter
+ */
+public class Occurance {
+    private String file_name;
+    private String file_path;
+    private int line_number;
+    
+    /**
+     * Basic data constructor.
+     */
+    
+    Occurance (String file_name, String file_path, int line_number) {
+        this.file_name = file_name;
+        this.file_path = file_path;
+        this.line_number = line_number;
+    }
+    
+    /**
+     * Returns the associated file name of the occurance
+     */
+    
+    public String getFileName() {
+        return file_name;
+    }
+    
+    /**
+     * Returns the associated file path of the occurance
+     */
+    
+    public String getFilePath() {
+        return file_path;
+    }
+    
+    /**
+     * Returns the line number of the occurance.
+     */
+    
+    public int getLineNumber() {
+        return line_number;
+    }
+    
+    /**
+     * A representation of the occurance of the form 'Occurance: _file_path_ (_line_number_)'
+     */
+    
+    public String toString() {
+        return "Occurance: " + file_path + " (" + line_number + ")";
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/Preferences.java b/unicodetools/com/ibm/rbm/Preferences.java
new file mode 100644
index 0000000..3d94b8a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/Preferences.java
@@ -0,0 +1,181 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.util.*;
+import java.io.*;
+
+/**
+ * This class defines the methods used by RBManager to access, set, and store
+ * individual user preferences for the application. All of the public methods defined
+ * in this class are static, and so the class need not be instantiated.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class Preferences {
+    // Default values
+    private static final int NUM_RECENT_FILES = 4;
+    private static final String EMPTY_STRING = "";
+    private static Properties prop;
+	
+    /**
+     * Retrieve a preference by its key name
+     * @param name The name of the key associated with one preference
+     * @return The value of the preference sought
+     */
+	
+    public static String getPreference(String name) {
+        if (prop == null) init();
+        Object o = prop.get(name);
+        if (o == null || !(o instanceof String)) return EMPTY_STRING;
+        return (String)o;
+    }
+	
+    /**
+     * Sets a preference by key name and value. If the key name all ready exists, that
+     * preference is overwritten without warning.
+     * @param name The name of the key associated with the preference
+     * @param value The value of the preference to be set and later retrieved. If this value is null, the property of this name is erased.
+     */
+	
+    public static void setPreference(String name, String value) {
+        if (prop == null) init();
+        if (value == null) {
+            // In this case, we will remove the property
+            prop.remove(name);
+        }
+        prop.put(name, value);
+    }
+	
+    /**
+     * Writes the results of the buffered preferences to file. There is no option for
+     * where this file is saved on the file system.
+     */
+	
+    public static void savePreferences() throws IOException {
+        if (prop == null) init();
+        FileOutputStream fos = new FileOutputStream("preferences.properties");
+        prop.store(fos, "RBManager Preferences");
+        fos.flush();
+        fos.close();
+    }
+	
+    /**
+     * Given the name of a resource bundle and the file path location of the base
+     * document for that resource bundle, this method will insert that file into
+     * a list of recent files. Currently the past 4 resource bundles visited will
+     * be displayed. This method also sorts the prefences so that the most recently
+     * added will be the first returned, even if that file had all ready existed
+     * in the preferences when it was added.
+     * @param name The name of this file as it will be displayed to the user
+     * @param location The file path to this file (should be absolute).
+     */
+	
+    public static void addRecentFilePreference(String name, String location) {
+        Vector existingNames = new Vector();
+        Vector existingLocations = new Vector();
+        for (int i=0; i < NUM_RECENT_FILES; i++) {
+            String oldName = getPreference("recentfileid" + String.valueOf(i));
+            String oldLocation = getPreference("recentfileloc" + String.valueOf(i));
+            if (oldName.equals(EMPTY_STRING) || oldLocation.equals(EMPTY_STRING)) break;
+            existingNames.addElement(oldName);
+            existingLocations.addElement(oldLocation);
+        }
+        // Check to see if the file is all ready in there
+        int swap_start = 0;
+        int old_size = existingLocations.size();
+        for (int i=0; i <= old_size; i++) {
+            if (i == existingLocations.size()) {
+                // No match was found, pull all the elements down one
+                swap_start = i;
+                if (swap_start >= NUM_RECENT_FILES) swap_start = NUM_RECENT_FILES-1;
+                else {
+                    // Extend the length of the vectors
+                    existingNames.addElement(EMPTY_STRING);
+                    existingLocations.addElement(EMPTY_STRING);
+                }
+            } else {
+                String oldLocation = (String)existingLocations.elementAt(i);
+                if (oldLocation.equals(location)) {
+                    // We found a match, pull this one to the front
+                    swap_start = i;
+                    break;
+                }
+            }
+        }
+		
+        // Move the files down the line as appropriate
+        for (int i=swap_start; i > 0; i--) {
+            existingLocations.setElementAt(existingLocations.elementAt(i-1),i);
+            existingNames.setElementAt(existingNames.elementAt(i-1),i);
+        }
+        existingLocations.setElementAt(location, 0);
+        existingNames.setElementAt(name, 0);
+		
+        // Set the properties
+        for (int i=0; i < existingLocations.size(); i++) {
+            setPreference("recentfileid" + String.valueOf(i), (String)existingNames.elementAt(i));
+            setPreference("recentfileloc" + String.valueOf(i), (String)existingLocations.elementAt(i));
+        }
+        for (int i=existingLocations.size(); i < NUM_RECENT_FILES; i++) {
+            setPreference("recentfileid" + String.valueOf(i), EMPTY_STRING);
+            setPreference("recentfileloc" + String.valueOf(i), EMPTY_STRING);
+        }
+        try {
+            savePreferences();
+        } catch (IOException ioe) {} // Ignore, its not critical
+    }
+    
+    /**
+     * Returns a list of the names and locations of the various recently used files.
+     * @return A Vector of Strings which is twice in length the number of files known about. The vector contains name 1 then location 1, then name 2 ...
+     */
+	
+    public static Vector getRecentFilesPreferences() {
+        if (prop == null) init();
+        Vector existing = new Vector();
+        for (int i=0; i < NUM_RECENT_FILES; i++) {
+            String name = getPreference("recentfileid" + String.valueOf(i));
+            String location = getPreference("recentfileloc" + String.valueOf(i));
+            if (name.equals(EMPTY_STRING) || location.equals(EMPTY_STRING)) break;
+            existing.addElement(name);
+            existing.addElement(location);
+        }
+        return existing;
+    }
+
+    private static void init() {
+        Properties defaults = new Properties();
+        // This values are needed and are specified by default
+        // If they exist in the file, they will be overwritten
+        defaults.put("username", Resources.getTranslation("unknown_user"));
+        defaults.put("locale", "en");
+        defaults.put("lookandfeel", "");
+		
+        prop = new Properties(defaults);
+        try {
+            FileInputStream fis = new FileInputStream("preferences.properties");
+            prop.load(fis);
+        } catch (IOException ioe) {
+            System.err.println("Error reading properties");
+            ioe.printStackTrace(System.err);
+        }
+        try {
+            savePreferences();
+        } catch (IOException ioe) {
+            System.err.println("Error saving preferences " + ioe.getMessage());
+        }
+    }
+	
+    /*
+    public static void main(String args[]) {
+        // Test
+        init();
+    }
+    */
+}
diff --git a/unicodetools/com/ibm/rbm/RBExporter.java b/unicodetools/com/ibm/rbm/RBExporter.java
new file mode 100644
index 0000000..7da5804
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBExporter.java
@@ -0,0 +1,24 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.IOException;
+
+import javax.swing.*;
+
+/**
+ * This is the super class for all exporter plug-in classes. As of yet, there
+ * is little contained in this class.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public abstract class RBExporter {
+    protected static JFileChooser chooser;
+	
+    public abstract void export(RBManager rbm) throws IOException;
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBICUExporter.java b/unicodetools/com/ibm/rbm/RBICUExporter.java
new file mode 100644
index 0000000..babc11e
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBICUExporter.java
@@ -0,0 +1,191 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import javax.swing.*;
+import java.util.*;
+
+/**
+ * This class provides a plug-in exporter utility for RBManager that outputs ICU
+ * resource bundle files in the according to the file structure of Resource
+ * Bundles. Most of the meta-data is lost in this export.
+ * 
+ * @author George Rhoten
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBICUExporter extends RBExporter {
+    /** Do characters beyond \\u007f need \\u escape notation? */
+    private boolean escapeNonAscii = false;
+
+    /** Write the meta data for each resource? */
+    private boolean writeMetaData = true;
+	
+    /** Write the groups as keys? */
+    private boolean writeGroupsAsKeys = false;
+
+    public RBICUExporter() {
+        super();
+		
+        // Initialize the file chooser if necessary
+        if (chooser == null) {
+            chooser = new JFileChooser();
+            chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+                public String getDescription() {
+                    return "root ICU File";
+                }
+                public boolean accept(File f) {
+                    if (f.isDirectory()) return true;
+                    return (f.getName().startsWith("root."));
+                }
+            });
+        } // end if
+    }
+	
+    public void export(RBManager rbm) throws IOException {
+        if (rbm == null) return;
+        // Open the Save Dialog
+        int ret_val = chooser.showSaveDialog(null);
+        if (ret_val != JFileChooser.APPROVE_OPTION) {
+            return;
+        }
+        // Retrieve basic file information
+        File file = chooser.getSelectedFile();                  // The file(s) we will be working with
+        File directory = new File(file.getParent());            // The directory we will be writing to
+        String base_name = file.getName();                      // The base name of the files we will write
+        if (base_name == null || base_name.equals("")) {
+            base_name = rbm.getBaseClass();
+        }
+        if (base_name.toLowerCase().endsWith(".properties")) {
+            base_name = base_name.substring(0,base_name.length()-11);
+        }
+		
+        Vector bundle_v = rbm.getBundles();
+        for (int i=0; i < bundle_v.size(); i++) {
+            Bundle bundle = (Bundle)bundle_v.elementAt(i);
+            String base_enc = base_name;
+            if (bundle.encoding != null && !bundle.encoding.equals("")) {
+                base_enc = base_enc + "_" + bundle.encoding;
+            }
+            String file_name = base_enc + ".txt";
+            String header = "\ufeff// Resource Bundle: " + file_name + " - File automatically generated by RBManager at " + (new Date());
+
+            OutputStream fos = new FileOutputStream(new File(directory, file_name));
+            PrintWriter resOut = new PrintWriter(new OutputStreamWriter(fos, "UTF-8"));
+
+            Vector group_v = bundle.getGroupsAsVector();
+            resOut.println(header);
+            resOut.println(base_enc + " { ");
+            for (int j=0; j < group_v.size(); j++) {
+                BundleGroup group = (BundleGroup)group_v.elementAt(j);
+
+                Vector itemVect = group.getItemsAsVector();
+                int itemVectSize = itemVect.size();
+                if (itemVectSize > 0) {
+                    if (writeMetaData) {
+                        String groupComment = group.getComment();
+                        if (groupComment != null && !groupComment.equals("")) {
+                            resOut.println("    // @groupComment " + groupComment);
+                        }
+                    }
+
+                    boolean writeGroupName = !bundle.getUngroupedGroup().getName().equals(group.getName());
+                    if (writeGroupName) {
+	                    if (writeGroupsAsKeys) {
+		                    resOut.println("    " + escapeString(group.getName(), true) + " { ");
+	                    }
+	                    else if (writeMetaData) {
+		                    resOut.println("    // @group " + escapeString(group.getName(), true));
+	                    }
+                    }
+                    for (int k=0; k < itemVectSize; k++) {
+                        BundleItem item = (BundleItem)itemVect.elementAt(k);
+
+                        if (writeMetaData) {
+                            resOut.print("        //");
+                            resOut.print(" @translated " + item.isTranslated());
+                            resOut.print(" @created " + item.getCreatedDate());
+                            resOut.print(" @modified " + item.getModifiedDate());
+                            resOut.print(" @creator " + item.getCreator());
+                            resOut.println(" @modifier " + item.getModifier());
+                            String itemComment = item.getComment();
+                            if (itemComment != null && !itemComment.equals("")) {
+                                resOut.println("        // @comment " + itemComment);
+                            }
+                        }
+
+                        resOut.println("        " + escapeString(item.getKey(), true)
+                                       + " { " + escapeString(item.getTranslation(), false) + " }");
+                    } // end for - k
+                    if (writeGroupName && writeGroupsAsKeys) {
+	                    resOut.println("    }");
+                    }
+                }
+            } // end for - j
+            resOut.println("}");
+			
+            // Write out the file
+            resOut.close();
+            fos.close();
+        } // end for - i
+    }
+
+    /**
+     * Escape a string according to how the ICU tool "genrb" handles strings.
+     * @param str The string to escape
+     * @param isKey If this is a key, then quotes are optional.
+     * @return A string that can be used in an ICU resource bundle.
+     */
+    protected String escapeString(String str, boolean isKey) throws IOException {
+        StringBuffer strBuf = new StringBuffer();
+        int len = str.length();
+        boolean quoteRequired = !isKey;
+        for (int idx = 0; idx < len; idx++) {
+            int ch = str.charAt(idx);
+            if (ch <= ' ' || '~' < ch) {
+                if (isKey && ch != ' ') {
+                    IOException e = new IOException(str + " needs to use invariant characters for the key.");
+                    e.fillInStackTrace();
+                    throw e;
+                } else if (escapeNonAscii && ch != ' ') {
+                    String zeros;
+                    String hexNum;
+                    if ((ch & 0xf800) == 0xd800) {
+                        // We assume that we found a valid UTF-16 string with a surrogate
+                        int ch2 = str.charAt(idx++);
+                        int chSurrogate = (((ch)<<10)+(ch2)-((0xd800<<10)+0xdc00-0x10000));
+
+                        zeros = "00000000";
+                        hexNum = Integer.toHexString(chSurrogate);
+                        strBuf.append("\\U");
+                    } else {
+                        zeros = "0000";
+                        hexNum = Integer.toHexString(ch);
+                        strBuf.append("\\u");
+                    }
+                    strBuf.append(zeros.substring(hexNum.length()) + hexNum.toUpperCase());
+                } else {
+                    quoteRequired = true;
+                    strBuf.append(ch);
+                }
+            } else if (ch == '\"') {
+                quoteRequired = true;
+                strBuf.append("\\\"");
+            } else  {
+                if (ch == '{' || ch == '}') {
+                    quoteRequired = true;
+                }
+                strBuf.append(ch);
+            }
+        }
+        if (quoteRequired) {
+            strBuf.insert(0, '\"');
+            strBuf.append('\"');
+        }
+        return strBuf.toString();
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBImporter.java b/unicodetools/com/ibm/rbm/RBImporter.java
new file mode 100644
index 0000000..724a5b9
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBImporter.java
@@ -0,0 +1,452 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import javax.swing.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+import java.util.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * <P>This is the super class for all importer plug-in classes.</P>
+ * <P>
+ * In terms of general functionality of this class or its children classes, the following steps should happen in order:
+ * <OL>
+ * <LI>A Dialog is shown from which the user may select options about the import, including the file from which to import.</LI>
+ * <LI>The 'Import' button is pressed, closing the options dialog and opening a progress bar dialog box.</LI>
+ * <LI>The class should resolve all conflicts with locale encodings existing in the import files, but not in the active resource bundle.</LI>
+ * <LI>The class should parse resources one at a time and use the importResource() method to insert them into the resource bundle.</LI>
+ * <LI>The class should report when all resources have been read and the import is complete.</LI>
+ * </OL>
+ * </P>
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBImporter extends JDialog {
+    private final static int FILE_OPTION_POPULATE      = 0;            // Create a new locale file populated from base file
+    private final static int FILE_OPTION_EMPTY         = 1;            // Create a new empty locale file
+    private final static int FILE_OPTION_IGNORE        = 2;            // Ignore all resources from this encoding
+    private final static int FILE_OPTION_PROMPT        = 3;            // Prompt for each conflict
+    private final static int RESOURCE_OPTION_OVERWRITE = 0;            // Use the value from the source import file
+    private final static int RESOURCE_OPTION_IGNORE    = 1;            // Ignore the import and use existing value
+    private final static int RESOURCE_OPTION_PROMPT    = 2;            // Propmpt for each conflict
+	
+    protected static JFileChooser chooser;
+    protected int    num_conflicts;
+    protected int    num_extra_files;
+    protected String title;
+    protected RBManager rbm;
+    protected RBManagerGUI gui;
+    protected boolean pathSet = false;
+	
+    // Visual Components
+    JRadioButton resourceOverwriteRadio    = new JRadioButton(Resources.getTranslation("import_resource_conflict_overwrite"), false);
+    JRadioButton resourceIgnoreRadio       = new JRadioButton(Resources.getTranslation("import_resource_conflict_ignore"), false);
+    JRadioButton resourcePromptRadio       = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true);
+    JRadioButton fileGeneratePopulateRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_populate"), false);
+    JRadioButton fileGenerateEmptyRadio    = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_empty"), false);
+    JRadioButton fileIgnoreRadio           = new JRadioButton(Resources.getTranslation("import_file_conflict_ignore"), false);
+    JRadioButton filePromptRadio           = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true);
+	
+    JCheckBox markTranslatedCheck = new JCheckBox(Resources.getTranslation("import_default_translated"), true);
+    JCheckBox createGroupsCheck = new JCheckBox(Resources.getTranslation("import_default_group_creation"), true);
+    JComboBox groupComboBox = new JComboBox();
+	
+    JLabel sourceLabel;
+	
+    JDialog progressBarDialog;
+    JProgressBar progressBar;
+    
+    /**
+     * Constructor
+     * @param title The title that appears in the Dialog box
+     * @param rbm An RBManager instance
+     * @param gui The RBManager GUI instance associated with the RBManager instance
+     */
+    
+    public RBImporter(String title, RBManager rbm, RBManagerGUI gui) {
+        super(new Frame(), title, true);
+        this.title = title;
+        this.rbm = rbm;
+        this.gui = gui;
+        init();
+    }
+	
+    protected void init() {
+        chooser = new JFileChooser();
+        setupFileChooser();
+        num_conflicts = 0;
+        num_extra_files = 0;
+        initComponents();
+        setVisible(true);
+    }
+	
+    protected void setupFileChooser() {
+        // To be overwritten
+    }
+	
+    protected void beginImport() throws IOException {
+        // To be overwritten
+        if (!pathSet)
+            throw new IOException("Path not set yet");
+    }
+	
+    protected void chooseFile() {
+        int result = chooser.showOpenDialog(this);
+        if (result == JFileChooser.APPROVE_OPTION) {
+            File f = chooser.getSelectedFile();
+            sourceLabel.setText(Resources.getTranslation("import_source_file",f.getAbsolutePath()));
+            pathSet = true;
+        }
+    }
+	
+    protected File getChosenFile() {
+        return chooser.getSelectedFile();
+    }
+	
+    /**
+     * A super class method intended for use of nearly all subclass importers, once a resource
+     * is found by those subclasses. This method is called in order to create the new resource
+     * and handle the various conflict errors that may result as a part of that import.
+     */
+	
+    protected void importResource(BundleItem item, String encoding, String group_name) {
+        Bundle bundle = null;
+        BundleGroup group = null;
+        BundleGroup backup_group = null;
+		
+        if (group_name == null)
+        	group_name = getDefaultGroup();
+        if (encoding == null)
+        	return;
+        // Get the bundle to which we will be adding this resource
+        bundle = rbm.getBundle(encoding);
+        // Skip this import if the bundle is non-existent (Should have been resolved if wanted)
+        if (bundle == null)
+        	return;
+        // Find the group in the bundle, Ungrouped if non-existent
+        Vector gv = bundle.getGroupsAsVector();
+        for (int i=0; i < gv.size(); i++) {
+            BundleGroup tempg = (BundleGroup)gv.elementAt(i);
+            if (i==0) backup_group = tempg;
+            if (tempg.getName().equals("Ungrouped Items")) backup_group = tempg;
+            else if (tempg.getName().equals(group_name)) {
+                group = tempg;
+                break;
+            }
+        }
+        if (group == null) {
+            if (getDefaultGroupCreation()) {
+                // Create a new group by this name
+                bundle.addBundleGroup(group_name, "");
+                gv = bundle.getGroupsAsVector();
+                for (int i=0; i < gv.size(); i++) {
+                    BundleGroup tempg = (BundleGroup)gv.elementAt(i);
+                    if (tempg.getName().equals(group_name)) {
+                        group = tempg;
+                        break;
+                    }
+                }
+            } else {
+                // Use the backup_group
+                group = backup_group;
+            }
+        }
+        // If all group identification efforts fail, we fail
+        if (group == null)
+        	return;
+        item.setParentGroup(group);
+        // Check for and resolve conflicts
+        if (bundle.allItems.containsKey(item.getKey())) {
+            resolveResource(bundle,item); 
+            RBManagerGUI.debugMsg("Resolve conflict");
+        } else {
+            // Insert the resource
+            bundle.addBundleItem(item);
+        }
+    }
+    
+    /**
+     * This method should be called when trying to import and item whose key all ready exists within the bundle.
+     */
+	
+    protected void resolveResource(Bundle bundle, BundleItem item) {
+        if (this.getResourceConflictOption() == RESOURCE_OPTION_IGNORE)
+        	return;
+        else if (this.getResourceConflictOption() == RESOURCE_OPTION_OVERWRITE) {
+            bundle.removeItem(item.getKey());
+            bundle.addBundleItem(item);
+        } else if (this.getResourceConflictOption() == RESOURCE_OPTION_PROMPT) {
+            BundleItem original = (BundleItem)bundle.allItems.get(item.getKey());
+            if (original == null)
+            	return;
+            String trans = original.getTranslation();
+            String options[] = { Resources.getTranslation("import_resource_conflict_overwrite"),
+                                 Resources.getTranslation("import_resource_conflict_ignore")};
+            String insert[] = {item.getKey(), (bundle.encoding.equals("") ? "(Base Class)" : bundle.encoding)};
+            String result = (String)JOptionPane.showInputDialog(this,  Resources.getTranslation("import_resource_conflict_choose", insert) + 
+                "\n" + Resources.getTranslation("import_resource_conflict_choose_source", item.getTranslation()) +
+                "\n" + Resources.getTranslation("import_resource_conflict_choose_target", trans),
+                Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE,
+                null, options, options[0]);
+            if (result == null)
+            	return;
+            if (result.equals(Resources.getTranslation("import_resource_conflict_overwrite"))) {
+                bundle.removeItem(item.getKey());
+                bundle.addBundleItem(item);
+            } else if (result.equals(Resources.getTranslation("import_resource_conflict_ignore")))
+            	return;
+        }
+    }
+	
+    /**
+     * Given a vector of strings containing locale encodings (e.g. {"en", "en_us", "de"}), attempts
+     * to resolve those conflicts according to the preferences selected by the user.
+     */
+	
+    protected void resolveEncodings(Vector v) {
+        for (int i=0; i < v.size(); i++) {
+            String encoding = (String)v.elementAt(i);
+            if (encoding == null || encoding.equals("") || rbm.hasResource(encoding)) {
+                continue;
+            }
+
+            // We need to resolve this conflict
+            if (this.getFileConflictOption() == FILE_OPTION_IGNORE) continue;
+            else if (this.getFileConflictOption() == FILE_OPTION_POPULATE) {
+                rbm.createResource(null, null, null, encoding, null, null, null, true);
+            } else if (this.getFileConflictOption() == FILE_OPTION_EMPTY) {
+                rbm.createResource(null, null, null, encoding, null, null, null, true);
+            } else if (this.getFileConflictOption() == FILE_OPTION_PROMPT) {
+                String options[] = { Resources.getTranslation("import_file_conflict_generate_populate"),
+                                     Resources.getTranslation("import_file_conflict_generate_empty"),
+                                     Resources.getTranslation("import_file_conflict_ignore")};
+				
+                String result = (String)JOptionPane.showInputDialog(this, Resources.getTranslation("import_file_conflict_choose", encoding),
+                    Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE,
+                    null, options, options[0]);
+                if (result == null) continue;
+                if (result.equals(Resources.getTranslation("import_file_conflict_ignore"))) continue;
+                else if (result.equals(Resources.getTranslation("import_file_conflict_generate_populate"))) {
+                    rbm.createResource(null, null, null, encoding, null, null, null, true);
+                } else if (result.equals(Resources.getTranslation("import_file_conflict_generate_empty"))) {
+                    rbm.createResource(null, null, null, encoding, null, null, null, false);
+                }
+            }
+        }
+        gui.updateDisplayTree();
+    }
+	
+    // Returns an integer mask describing the user's selection for file resolving missing file locale conflicts
+	
+    private int getFileConflictOption() {
+        if (fileGeneratePopulateRadio.isSelected()) return FILE_OPTION_POPULATE;
+        if (fileGenerateEmptyRadio.isSelected()) return FILE_OPTION_EMPTY;
+        if (fileIgnoreRadio.isSelected()) return FILE_OPTION_IGNORE;
+        if (filePromptRadio.isSelected()) return FILE_OPTION_PROMPT;
+        return FILE_OPTION_PROMPT;
+    }
+	
+    // Returns an integer mask describing the user's selection for duplicate resource key conflicts
+	
+    private int getResourceConflictOption() {
+        if (resourceOverwriteRadio.isSelected()) return RESOURCE_OPTION_OVERWRITE;
+        if (resourceIgnoreRadio.isSelected()) return RESOURCE_OPTION_IGNORE;
+        if (resourcePromptRadio.isSelected()) return RESOURCE_OPTION_PROMPT;
+        return RESOURCE_OPTION_PROMPT;
+    }
+	
+    // Returns the group name for use when no group name is specified
+	
+    protected String getDefaultGroup() {
+        return groupComboBox.getSelectedItem().toString();
+    }
+	
+    // Returns the default translation value
+	
+    protected boolean getDefaultTranslated() {
+        return markTranslatedCheck.isSelected();
+    }
+	
+    // Returns whether or not a group of name non-existant in the active bundle is created
+	
+    protected boolean getDefaultGroupCreation() {
+        return createGroupsCheck.isSelected();
+    }
+	
+    protected void showProgressBar(int steps) {
+        thisWindowClosing();
+        JDialog progressBarDialog = new JDialog(this, Resources.getTranslation("dialog_title_import_progress"), false);
+        JProgressBar progressBar = new JProgressBar(0, steps);
+        progressBar.setValue(0);
+        progressBarDialog.getContentPane().add(progressBar);
+        progressBarDialog.pack();
+        progressBarDialog.setVisible(true);
+    }
+	
+    protected void incrementProgressBar() {
+        if (progressBar == null) return;
+        progressBar.setValue(progressBar.getValue()+1);
+        if (progressBar.getValue() == progressBar.getMaximum()) hideProgressBar();
+    }
+	
+    protected void hideProgressBar() {
+        if (progressBarDialog != null) progressBarDialog.setVisible(false);
+    }
+	
+    /**
+     * Initialize the visual components for selecting an import file and setting the appropriate
+     * options
+     */
+	
+    protected void initComponents() {
+        // Create Components
+        JLabel titleLabel       = new JLabel(title);
+        sourceLabel             = new JLabel(Resources.getTranslation("import_source_file","--"));
+        JLabel insertGroupLabel = new JLabel(Resources.getTranslation("import_insert_group"));
+        
+        JButton fileChooseButton = new JButton(Resources.getTranslation("button_choose"));
+        JButton cancelButton     = new JButton(Resources.getTranslation("button_cancel"));
+        JButton importButton     = new JButton(Resources.getTranslation("button_import"));
+        
+        ButtonGroup resourceGroup = new ButtonGroup();
+        ButtonGroup fileGroup = new ButtonGroup();
+		
+        JPanel topPanel = new JPanel(new BorderLayout());
+        JPanel midPanel = new JPanel(new BorderLayout());
+        JPanel botPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        
+        JPanel topInnerPanel = new JPanel(new BorderLayout());
+        
+        Box midBox = new Box(BoxLayout.Y_AXIS);
+		
+        JPanel resourcePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        JPanel filePanel     = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        JPanel defaultPanel  = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        JPanel defaultPanel2 = new JPanel(new BorderLayout());
+        
+        Box resourceBox = new Box(BoxLayout.Y_AXIS);
+        Box fileBox     = new Box(BoxLayout.Y_AXIS);
+        Box groupBox    = new Box(BoxLayout.X_AXIS);
+		
+        // Setup title
+        titleLabel.setFont(new Font("Serif",Font.BOLD,16));
+		
+        // Setup panels
+        midPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_options")));
+        resourcePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_resource_conflicts")));
+        filePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_file_conflicts")));
+        defaultPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_default_values")));
+		
+        // Arrange button groups
+        fileGroup.add(fileGeneratePopulateRadio);
+        fileGroup.add(fileGenerateEmptyRadio);
+        fileGroup.add(fileIgnoreRadio);
+        fileGroup.add(filePromptRadio);
+        resourceGroup.add(resourceOverwriteRadio);
+        resourceGroup.add(resourceIgnoreRadio);
+        resourceGroup.add(resourcePromptRadio);
+		
+        // Add action listeners
+        cancelButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent ev) {
+                thisWindowClosing();
+            }
+        });
+		
+        importButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent ev) {
+                try {
+                    beginImport();
+                    gui.updateProjectTree();
+                    gui.updateDisplayTree();
+                    thisWindowClosing();
+                } catch (IOException ioe) {
+                	ioe.printStackTrace(System.err);
+                    JOptionPane.showMessageDialog(null,
+                        Resources.getTranslation("error") + "\n" + ioe.getLocalizedMessage(),
+                        Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);	
+                }
+            }
+        });
+		
+        fileChooseButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent ev) {
+                chooseFile();
+            }
+        });
+		
+        // Setup combo box
+        Bundle baseBundle = ((Bundle)rbm.getBundles().elementAt(0));
+        BundleGroup ungroupedGroup = baseBundle.getUngroupedGroup();
+        groupComboBox = new JComboBox(baseBundle.getGroupsAsVector());
+        int groupComboBoxCount = groupComboBox.getItemCount();
+        for (int selectedIndex = 0; selectedIndex < groupComboBoxCount; selectedIndex++) {
+        	BundleGroup bundGroup = ((BundleGroup)groupComboBox.getItemAt(selectedIndex));
+        	if (bundGroup.getName().equals(ungroupedGroup.getName())) {
+        		// By default, use the ungrouped group. Probably named 'Ungrouped Items'.
+        		groupComboBox.setSelectedIndex(selectedIndex);
+        		break;
+        	}
+        }
+		
+        // Arange components
+        groupBox.add(Box.createHorizontalGlue());
+        groupBox.add(insertGroupLabel);
+        groupBox.add(Box.createHorizontalStrut(5));
+        groupBox.add(groupComboBox);
+		
+        defaultPanel2.add(groupBox, BorderLayout.NORTH);
+        defaultPanel2.add(markTranslatedCheck, BorderLayout.CENTER);
+        defaultPanel2.add(createGroupsCheck, BorderLayout.SOUTH);
+		
+        fileBox.add(fileGeneratePopulateRadio);
+        fileBox.add(fileGenerateEmptyRadio);
+        fileBox.add(fileIgnoreRadio);
+        fileBox.add(filePromptRadio);
+		
+        resourceBox.add(resourceOverwriteRadio);
+        resourceBox.add(resourceIgnoreRadio);
+        resourceBox.add(resourcePromptRadio);
+		
+        defaultPanel.add(defaultPanel2);
+        filePanel.add(fileBox);
+        resourcePanel.add(resourceBox);
+		
+        midBox.add(resourcePanel);
+        midBox.add(filePanel);
+        midBox.add(defaultPanel);
+            
+        midPanel.add(midBox, BorderLayout.CENTER);
+		
+        topInnerPanel.add(sourceLabel, BorderLayout.CENTER);
+        topInnerPanel.add(fileChooseButton, BorderLayout.EAST);
+		
+        topPanel.add(titleLabel, BorderLayout.NORTH);
+        topPanel.add(topInnerPanel, BorderLayout.CENTER);
+		
+        botPanel.add(cancelButton);
+        botPanel.add(importButton);
+		
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(topPanel, BorderLayout.NORTH);
+        getContentPane().add(midPanel, BorderLayout.CENTER);
+        getContentPane().add(botPanel, BorderLayout.SOUTH);
+		
+        pack();
+    }
+	
+    protected void thisWindowClosing() {
+        setVisible(false);
+        dispose();
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBJavaExporter.java b/unicodetools/com/ibm/rbm/RBJavaExporter.java
new file mode 100644
index 0000000..c1648fc
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBJavaExporter.java
@@ -0,0 +1,203 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.util.*;
+
+/**
+ * An exporter plug-in class for RBManager. The resources exported here conform to
+ * the Java standard for Resource Bundles as specified in java.util.ListResourceBundle.
+ * The output files are compilable java files that are not associated with any
+ * package.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBJavaExporter extends RBExporter {
+    private String packageName = null;
+    private boolean publicClass = true;
+    private boolean publicMethods = true;
+	
+	
+    public RBJavaExporter() {
+        super();
+		
+        // Initialize the file chooser if necessary
+        if (chooser == null) {
+            chooser = new JFileChooser();
+            chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+                public String getDescription() {
+                    return "Java Source Files";
+                }
+                public boolean accept(File f) {
+                    if (f.isDirectory()) return true;
+                    if (f.getName().endsWith(".java") && f.getName().indexOf("_") < 0) return true;
+                    return false;
+                }
+            });
+        }
+    }
+	
+    public void export(RBManager rbm) throws IOException {
+        if (rbm == null) return;
+        // Open the additional Dialog
+        RBJavaExporterDialog parametersDialog = new RBJavaExporterDialog();
+        packageName = parametersDialog.getPackageName();
+        publicClass = parametersDialog.isClassPublic();
+        publicMethods = parametersDialog.isMethodsPublic();
+		
+        // Open the Save Dialog
+        int ret_val = chooser.showSaveDialog(null);
+        if (ret_val != JFileChooser.APPROVE_OPTION) return;
+        // Retrieve basic file information
+        File file = chooser.getSelectedFile();                  // The file(s) we will be working with
+        File directory = new File(file.getParent());            // The directory we will be writing to
+        String base_name = file.getName();                      // The base name of the files we will write
+        if (base_name == null || base_name.equals("")) base_name = rbm.getBaseClass();
+        if (base_name.endsWith(".java")) base_name = base_name.substring(0,base_name.length()-5);
+		
+        Vector bundle_v = rbm.getBundles();
+        for (int i=0; i < bundle_v.size(); i++) {
+            Bundle bundle = (Bundle)bundle_v.elementAt(i);
+            String base_enc = base_name;
+            if (bundle.encoding != null && !bundle.encoding.equals("")) base_enc = base_enc + "_" + bundle.encoding;
+            String file_name = base_enc + ".java";
+			
+            StringBuffer buffer = new StringBuffer();
+            buffer.append("/* File:    " + file_name + "\n");
+            buffer.append(" * Date:    " + (new Date()) + "\n");
+            buffer.append(" * Comment: This file was generated automatically by RBManager" + "\n");
+            buffer.append(" */\n\n");
+            if (packageName != null) {
+                buffer.append("package " + packageName + ";\n\n");
+            }	
+            buffer.append("import java.util.ListResourceBundle;\n\n");
+            buffer.append((publicClass ? "public " : "protected "));
+            buffer.append("class " + base_enc + " extends ListResourceBundle {\n");
+            buffer.append("\t" + (publicMethods ? "public" : "protected") + " Object[][] getContents() {\n");
+            buffer.append("\t\treturn contents;\n");
+            buffer.append("\t}\n");
+            buffer.append("\tprivate static final Object[][] contents = {\n");
+            buffer.append("\t// LOCALIZE THIS\n");
+            
+            Vector group_v = bundle.getGroupsAsVector();
+            for (int j=0; j < group_v.size(); j++) {
+                BundleGroup group = (BundleGroup)group_v.elementAt(j);
+                Vector item_v = group.getItemsAsVector();
+                for (int k=0; k < item_v.size(); k++) {
+                    BundleItem item = (BundleItem)item_v.elementAt(k);
+                    buffer.append("\t\t{\"" + item.getKey() + "\", \"" + item.getTranslation() + "\"},\t// " + item.getComment() + "\n");
+                } // end for - k
+            } // end for - j
+            
+            buffer.append("\t// END OF MATERIAL TO LOCALIZE\n");
+            buffer.append("\t};\n");
+            buffer.append("}");
+            
+            // Write out the file
+            File write_file = new File(directory, file_name);
+            FileWriter writer = new FileWriter(write_file);
+            writer.write(buffer.toString());
+            writer.flush();
+            writer.close();
+        } // end for - i
+    }
+}
+
+class RBJavaExporterDialog extends JDialog {
+    JCheckBox packageCheck;
+    JRadioButton classPublicRadio;
+    JRadioButton classProtectedRadio;
+    JRadioButton methodsPublicRadio;
+    JRadioButton methodsProtectedRadio;
+    JTextField packageField;
+	
+    public RBJavaExporterDialog() {
+        super(new JFrame(), Resources.getTranslation("dialog_title_export_java_options"), true);
+        initComponents();
+    }
+	
+    public String getPackageName() {
+        if (!(packageCheck.isSelected())) return null;
+        String retVal = packageField.getText();
+        if (retVal == null || retVal.trim().equals("")) return null;
+        return retVal.trim();
+    }
+	
+    public boolean isClassPublic() {	
+        return classPublicRadio.isSelected();	
+    }
+    
+    public boolean isMethodsPublic() {
+        return methodsPublicRadio.isSelected();
+    }
+	
+    private void handleClose() {
+        setVisible(false);
+        dispose();
+    }
+	
+    private void initComponents() {
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().removeAll();
+		
+        packageCheck = new JCheckBox(Resources.getTranslation("export_java_package"), false);
+        classPublicRadio = new JRadioButton(Resources.getTranslation("export_java_class_public"), true);
+        classProtectedRadio = new JRadioButton(Resources.getTranslation("export_java_class_protected"), false);
+        methodsPublicRadio = new JRadioButton(Resources.getTranslation("export_java_class_public"), true);
+        methodsProtectedRadio = new JRadioButton(Resources.getTranslation("export_java_class_protected"), false);
+        packageField = new JTextField();
+        packageField.setColumns(30);
+		
+        JButton okButton = new JButton(Resources.getTranslation("OK"));
+        JLabel titleLabel = new JLabel(Resources.getTranslation("export_java_title"), SwingConstants.LEFT);
+		
+        JPanel okPanel = new JPanel();
+        okPanel.add(okButton);
+        JPanel centerPanel = new JPanel(new GridLayout(1,1));
+        centerPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+        Box centerBox = Box.createVerticalBox();
+        Box packageBox = Box.createHorizontalBox();
+        packageBox.add(packageCheck);
+        packageBox.add(packageField);
+        centerBox.add(packageBox);
+        centerBox.add(new JSeparator());
+        centerBox.add(classPublicRadio);
+        centerBox.add(classProtectedRadio);
+        centerBox.add(new JSeparator());
+        centerBox.add(methodsPublicRadio);
+        centerBox.add(methodsProtectedRadio);
+        centerPanel.add(centerBox);
+		
+        getContentPane().add(titleLabel, BorderLayout.NORTH);
+        getContentPane().add(okPanel, BorderLayout.SOUTH);
+        getContentPane().add(centerPanel, BorderLayout.CENTER);
+		
+        okButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent ev) {
+                handleClose();
+            }
+        });
+		
+        ButtonGroup classGroup = new ButtonGroup();
+        ButtonGroup methodsGroup = new ButtonGroup();
+        classGroup.add(classPublicRadio);
+        classGroup.add(classProtectedRadio);
+        methodsGroup.add(methodsPublicRadio);
+        methodsGroup.add(methodsProtectedRadio);
+		
+        //validateTree();
+        pack();
+        //setLocation(new Point(25,25));
+        setVisible(true);
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBJavaImporter.java b/unicodetools/com/ibm/rbm/RBJavaImporter.java
new file mode 100644
index 0000000..922ffe8
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBJavaImporter.java
@@ -0,0 +1,84 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+import java.util.*;
+import java.net.*;
+
+/**
+ * This is the super class for all importer plug-in classes. As of yet, there
+ * is little contained in this class.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBJavaImporter extends RBImporter {
+	
+    public RBJavaImporter(String title, RBManager rbm, RBManagerGUI gui) {
+        super(title, rbm, gui);
+    }
+	
+    protected void setupFileChooser() {
+        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+            public boolean accept(File f) {
+                if (f.isDirectory()) return true;
+                if (f.getName().endsWith(".class") && f.getName().indexOf("_") < 0) return true;
+                return false;
+            }
+			
+            public String getDescription() {
+                return Resources.getTranslation("import_java_file_description");
+            }
+        });
+    }
+	
+    protected void beginImport() throws IOException {
+        super.beginImport();
+        ListResourceBundle base_lrb = null;
+        URLClassLoader urlLoader = null;
+        try {
+            File baseFile = getChosenFile();
+            URL baseURL = baseFile.toURL();
+            URL urls[] = new URL[1];
+            urls[0] = baseURL;
+            urlLoader = new URLClassLoader(urls);
+            String baseName = baseFile.getName();
+            baseName = baseName.substring(0, baseName.indexOf(".class"));
+            
+            Class baseClass = urlLoader.loadClass(baseName);
+            base_lrb = (ListResourceBundle)baseClass.newInstance();
+        } catch (Exception e) {
+            RBManagerGUI.debugMsg(e.toString());
+            RBManagerGUI.debugMsg(e.getMessage());
+            e.printStackTrace(System.err);
+        }
+        if (base_lrb != null) {
+            Enumeration keys = base_lrb.getKeys();
+            while (keys.hasMoreElements()) {
+                String key = keys.nextElement().toString();
+                RBManagerGUI.debugMsg("Resource -> " + key + " = " + base_lrb.getString(key));
+            }
+        }
+    }
+}
+
+/*
+class myClassLoader extends ClassLoader {
+    public myClassLoader() {
+        super();
+    }
+	
+    public Class myDefineClass(String name, byte array[], int off, int len) {
+        return super.defineClass(name, array, off, len);
+    }
+}
+*/
diff --git a/unicodetools/com/ibm/rbm/RBManager.java b/unicodetools/com/ibm/rbm/RBManager.java
new file mode 100644
index 0000000..ca07a70
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBManager.java
@@ -0,0 +1,946 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.util.*;
+import java.io.*;
+import javax.swing.UIManager;
+import javax.swing.JOptionPane;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+/**
+ * A utility class to aid in the process of updating the Natural Language Support of Tempus Fugit.
+ * This class scans the directory containing NLS files and checks the various languages found there
+ * for completeness, duplication of entry, and status of translation. The class can be instantiated
+ * through a constructor, or it can be run from the command line. For additional information on the
+ * command line results, see the <CODE>main</CODE> method.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBManager {
+	
+    // *** DATA ***
+    private Vector allBundleKeys;                               // A Vector of Strings with all defined NLS properties
+    private Vector bundles;                                   // A Vector of NLSbundles, one for each language
+    private String currentUser;                                 // The name of the person currently using the editor
+    private String baseClass;                                   // The name of the base class of the active resource bundle
+    private File   currentDirectory;
+	
+    // *** CONSTRUCTORS ***
+	
+    // The default constructor is not publicly available
+    private RBManager() {
+        try {
+            // Look and Feel check
+            try {
+                String laf = Preferences.getPreference("lookandfeel");
+                if (!laf.equals("")) UIManager.setLookAndFeel(laf);
+            } catch (Exception e) { 
+                // Ignored
+            }
+			
+            Resources.initBundle();
+            RBManagerGUI guiFrame = new RBManagerGUI();
+            if (!Preferences.getPreference("username").equals(""))
+                guiFrame.setUser(Preferences.getPreference("username"));
+            if (!Preferences.getPreference("locale").equals("")) {
+                String localeStr = Preferences.getPreference("locale");
+                String language = Resources.getLanguage(localeStr);
+                String country = Resources.getCountry(localeStr);
+                String variant = Resources.getVariant(localeStr);
+                if (language == null || language.equals("") || language.length() > 3) language = "en";
+                if (country == null) country = new String();
+                if (variant == null) Resources.setLocale(new Locale(language, country));
+                else Resources.setLocale(new Locale(language, country, variant));
+            }
+            Resources.initBundle();
+            guiFrame.initComponents();
+            guiFrame.setVisible(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+	
+    /**
+     * This constructor creates an entirely blank RBManager and base Bundle. Only the base class name is defined.
+     * All other properties need to be defined.
+     */
+	
+    public RBManager(String baseClassName) {
+        allBundleKeys = new Vector();
+        bundles = new Vector();
+        currentUser = "Unknown";
+        baseClass = baseClassName;
+        currentDirectory = new File("");
+		
+        Bundle mainBundle = new Bundle("");
+        // Create a default group
+        mainBundle.addBundleGroup("Ungrouped Items", "These are resource items that have not been assigned a group");
+        bundles.addElement(mainBundle);
+    }
+	
+    /**
+     * This is the standard constructor for RBManager. It is constructed from the root of a resource bundle.
+     * In the current implementation, each file is parsed separately starting with the base class file (root).
+     * In this implementation, the lookup keys are represented to the user as they appear in the files. The
+     * translation values however are translated according to the basic rules defined in java.util.Properties.
+     * Thus in the key, the user may see '\"' when in the value it would have been converted to '"'. This
+     * translation is reversed when saving the resource bundle.
+     * @param mainFile The base class file of the resource bundle to be read
+     */
+	
+    public RBManager(File mainFile) throws FileNotFoundException, IOException {
+        init();
+		
+        currentDirectory = new File(mainFile.getParent());
+		
+        String[] encodings;
+		
+        // Initiailize the readers to the main NLS file
+        FileReader fr = new FileReader(mainFile);
+        BufferedReader br = new BufferedReader(fr);
+		
+        // Load the java readable values from the main NLS file;
+        Properties p = new Properties();
+        p.load(new FileInputStream(mainFile));
+		
+        // Count the number of language files and set up the encoding and dictionary data
+        int numLanguages = 1;
+        String NLSbaseClass = null;
+        String NLSpostfix   = null;
+		
+        if (mainFile.getName().indexOf(".") >= 0) {
+            NLSbaseClass = mainFile.getName().substring(0,mainFile.getName().indexOf("."));
+            NLSpostfix = ".properties";
+        } else {
+            NLSbaseClass = mainFile.getName();
+            NLSpostfix = "";
+        }
+		
+        baseClass = NLSbaseClass;
+        
+        String filePrefix = mainFile.getName().substring(0,mainFile.getName().lastIndexOf("."));
+        String filePostfix = mainFile.getName().substring(mainFile.getName().lastIndexOf("."),mainFile.getName().length());
+        File resDir = currentDirectory;
+        if (resDir != null && resDir.isDirectory()) {
+            String[] temp = resDir.list();
+            numLanguages = 0;
+            // Count the number of language files
+            for (int i = 0; i < temp.length; i++) {
+                if (temp[i].startsWith(NLSbaseClass) && (temp[i].endsWith(NLSpostfix) 
+                    || temp[i].endsWith(NLSpostfix.toUpperCase()) || NLSpostfix.equals(""))) {
+                    // Starts with the base class name and ends in proper suffix (above)
+                    // Base name is followed by . or _ (below)
+                    RBManagerGUI.debugMsg("Character is: " + temp[i].charAt(NLSbaseClass.length()));
+                    if (temp[i].charAt(NLSbaseClass.length()) == '.' || temp[i].charAt(NLSbaseClass.length()) == '_')
+                        numLanguages++;
+                }
+            }
+            // Initialize the bundles and encodings
+            encodings = new String[numLanguages];
+			
+            int count = 1;
+            for (int i = 0; i < temp.length; i++) {
+                if (temp[i].equals(mainFile.getName())) {
+                    encodings[0] = "";
+                } else if (temp[i].startsWith(NLSbaseClass) && (temp[i].endsWith(NLSpostfix) 
+                    || temp[i].endsWith(NLSpostfix.toUpperCase()) || NLSpostfix.equals(""))) {
+                    if (temp[i].charAt(NLSbaseClass.length()) == '.' || temp[i].charAt(NLSbaseClass.length()) == '_') {
+                        encodings[count] = new String(temp[i].substring(filePrefix.length()+1,temp[i].indexOf(filePostfix)));							count++;
+                    }
+                }
+            }
+        } else {
+            // Initialize the bundles and encodings in case the directory information is not available
+            // In this case, only the main NLS file will be handled
+            encodings = new String[numLanguages];
+            encodings[0] = new String("");
+        } // end the count and initialization
+		
+        // Read in the entries from the main file
+        String line;
+        // Set the dictionary for the main file
+        Bundle dict = new Bundle(encodings[0]);
+        bundles.addElement(dict);
+        // Set up the first group in case there are NLS items which were not assigned to a group
+        BundleGroup group = new BundleGroup(dict, "Ungrouped Items");
+        group.setComment("NLS Items which were not initially assigned to a group");
+        dict.addBundleGroup(group);
+        BundleItem item = new BundleItem(group,null,null);
+        int count = 0;
+        while ((line = br.readLine()) != null) {
+            // Test to make sure this is a file that was generated by RBManager
+            if (!line.trim().equals("")) count++;
+            if (count == 1 && !line.startsWith("# @file")) {
+                // Not generated by RBManager
+                JOptionPane.showMessageDialog(null,
+                    Resources.getTranslation("error_not_rbmanager_format") + "\n" + Resources.getTranslation("error_suggest_import_properties"),
+                    Resources.getTranslation("dialog_title_error_not_rbmanager_format"), JOptionPane.ERROR_MESSAGE);
+                throw new FileNotFoundException("Improper format for file: " + mainFile.getName());
+            }
+            String commentLine = null;
+            // Grab text following the # sign
+            if (line.indexOf("#") >= 0) {
+                commentLine = line.substring(line.indexOf("#")+1,line.length());
+                line = line.substring(0,line.indexOf("#"));
+            }
+            if (commentLine != null && commentLine.trim().length() > 0) {
+                // Process any information made available in comment '@' information
+                Hashtable descriptors = getDescriptors(null,commentLine);
+                if (descriptors != null) {
+                    Object o;
+                    // File tags
+                    o = descriptors.get("file"); if (o != null) dict.name = ((String) o);
+                    o = descriptors.get("fileComment");  if (o != null) dict.comment  = ((String) o);
+                    o = descriptors.get("fileLanguage"); if (o != null) dict.language = ((String) o);
+                    o = descriptors.get("fileCountry");  if (o != null) dict.country  = ((String) o);
+                    o = descriptors.get("fileVariant");  if (o != null) dict.variant  = ((String) o);
+                    o = descriptors.get("fileManager");  if (o != null) dict.manager  = ((String) o);
+                    
+                    // Group tags
+                    o = descriptors.get("group");
+                    if (o != null) {
+                        group = new BundleGroup(dict, (String)o);
+                        item.setParentGroup(group);
+                        dict.addBundleGroup(group);
+                    }
+                    o = descriptors.get("groupComment"); if (o != null) group.setComment((String) o);
+					
+                    // Item tags
+                    o = descriptors.get("comment");    if (o != null) item.setComment((String) o);
+                    o = descriptors.get("translated"); if (o != null) item.setTranslated(((String) o).equalsIgnoreCase("true"));
+                    o = descriptors.get("creator");    if (o != null) item.setCreator((String) o);
+                    o = descriptors.get("modifier");   if (o != null) item.setModifier((String) o);
+                    o = descriptors.get("created");    if (o != null) item.setCreatedDate((String) o);
+                    o = descriptors.get("modified");   if (o != null) item.setModifiedDate((String) o);
+					
+                    // Lookup tags (e.g. {_#_} _description_)
+                    Enumeration keys = descriptors.keys();
+                    while (keys.hasMoreElements()) {
+                        String tag = (String)keys.nextElement();
+                        if (tag.startsWith("{")) {
+                            if (tag.indexOf("}") < 0) continue;
+                            String lookup = tag.substring(1,tag.indexOf("}"));
+                            item.getLookups().put(lookup, descriptors.get(tag));
+                        }
+                    }
+                } 
+            } // end check of comment line
+            if (line.trim().length() < 1) continue;
+			
+            // Grab the name and value (translation) from the line
+            int breakpoint = 0;
+            boolean started = false;
+            char array[] = line.toCharArray();
+            for (int i=0; i < array.length; i++) {
+                if (!started && array[i] != ' ' && array[i] != '\t') started = true;
+                if (started && (array[i] == '=' || array[i] == ':' || array[i] == ' ' || array[i] == '\t')) {
+                    breakpoint = i;
+                    break;
+                }
+            }
+            String key = String.valueOf(array,0,breakpoint);
+			
+            item.setKey(key);
+            String translation = p.getProperty(key);
+            if (translation == null || translation.equals(""))
+                item.setTranslation(line.substring(line.indexOf("=")+1,line.length()).trim());
+            else item.setTranslation(translation);
+			
+            dict.addBundleItem(item);
+            item = new BundleItem(group,null,null);
+        } // end while - main NLS file
+		
+        // Now that we have parsed the entire main language file, populate the allNLSKey set with the dictionary keys
+        allBundleKeys = new Vector();
+        Enumeration keys = ((Bundle)bundles.elementAt(0)).allItems.keys();
+        while (keys.hasMoreElements()) {
+            allBundleKeys.addElement(keys.nextElement());
+        }
+		
+        // Now go through all of the other languages
+        for (int i = 1; i < encodings.length; i++) {
+            if (encodings[i].equals("kr")) continue; // I can't handle double byte character sets yet
+            // Try to obtain the new file
+            File tempFile = new File(resDir, NLSbaseClass + "_" + encodings[i] + NLSpostfix);
+            fr = new FileReader(tempFile);
+            br = new BufferedReader(fr);
+			
+            // Try to obtain the java readable properties for the file
+            p = new Properties();
+            p.load(new FileInputStream(tempFile));
+            
+            // Set the dictionary for the main file
+            dict = new Bundle(encodings[i]);
+            bundles.addElement(dict);
+            // Set up the first group in case there are NLS items which were not assigned to a group
+            group = new BundleGroup(dict, "Ungrouped Items");
+            dict.addBundleGroup(group);
+            group.setComment("NLS Items which were not initially assigned to a group");
+            item = new BundleItem(group,null,null);
+            // Create the rest of the groups
+            while ((line = br.readLine()) != null) {
+                String commentLine = null;
+                // Grab the text following the # sign
+                if (line.indexOf("#") >= 0) {
+                    commentLine = line.substring(line.indexOf("#")+1,line.length());
+                    line = line.substring(0,line.indexOf("#"));
+                }
+                if (commentLine != null && commentLine.trim().length() > 0) {
+                    // Process any information made available in comment '@' information
+                    Hashtable descriptors = getDescriptors(null,commentLine);
+                    if (descriptors != null) {
+                        Object o;
+                        // File tags
+                        o = descriptors.get("file"); if (o != null) dict.name = ((String) o);
+                        o = descriptors.get("fileComment");  if (o != null) dict.comment  = ((String) o);
+                        o = descriptors.get("fileLanguage"); if (o != null) dict.language = ((String) o);
+                        o = descriptors.get("fileCountry");  if (o != null) dict.country  = ((String) o);
+                        o = descriptors.get("fileVariant");  if (o != null) dict.variant  = ((String) o);
+                        o = descriptors.get("fileManager");  if (o != null) dict.manager  = ((String) o);
+						
+                        // Group tags
+                        o = descriptors.get("group");
+                        if (o != null) {
+                            group = new BundleGroup(dict, (String)o);
+                            item.setParentGroup(group);
+                            dict.addBundleGroup(group);
+                        }
+                        o = descriptors.get("groupComment"); if (o != null) group.setComment((String) o);
+                        
+                        // Item tags
+                        o = descriptors.get("comment");    if (o != null) item.setComment((String) o);
+                        o = descriptors.get("translated"); if (o != null) item.setTranslated(((String) o).equalsIgnoreCase("true"));
+                        o = descriptors.get("creator");    if (o != null) item.setCreator((String) o);
+                        o = descriptors.get("modifier");   if (o != null) item.setModifier((String) o);
+                        o = descriptors.get("created");    if (o != null) item.setCreatedDate((String) o);
+                        o = descriptors.get("modified");   if (o != null) item.setModifiedDate((String) o);
+                        
+                        // Lookup tags (e.g. {_#_} _description_)
+                        Enumeration descKeys = descriptors.keys();
+                        while (descKeys.hasMoreElements()) {
+                            String tag = (String)descKeys.nextElement();
+                            if (tag.startsWith("{")) {
+                                if (tag.indexOf("}") < 0) continue;
+                                String lookup = tag.substring(1,tag.indexOf("}"));
+                                item.getLookups().put(lookup, descriptors.get(tag));
+                            }
+                        }
+                    }	
+                } // end check of comment line
+                if (line.trim().length() < 1) continue;
+			
+                // Grab the name and value (translation) from the line
+                int breakpoint = 0;
+                boolean started = false;
+                char array[] = line.toCharArray();
+                for (int j=0; j < array.length; j++) {
+                    if (!started && array[j] != ' ' && array[j] != '\t') started = true;
+                    if (started && (array[j] == '=' || array[j] == ':' || array[j] == ' ' || array[j] == '\t')) {
+                        breakpoint = j;
+                        break;
+                    }
+                }
+                String key = String.valueOf(array,0,breakpoint);
+                item.setKey(key);
+                String translation = p.getProperty(key);
+                if (translation == null || translation.equals(""))
+                    item.setTranslation(line.substring(line.indexOf("=")+1,line.length()).trim());
+                else item.setTranslation(translation);
+				
+                dict.addBundleItem(item);
+                item = new BundleItem(group,null,null);
+            } // end while - next line
+        } // end for looop through languages
+        // Add this opened file to our recent files
+        Preferences.addRecentFilePreference(mainFile.getName(), mainFile.getAbsolutePath());
+    } // end RBManager()
+	
+    // *** METHODS ***
+	
+    /**
+     * Main
+     */
+	
+    public static void main(String args[]) {
+        // Make sure the user specified a path
+        if (args.length < 1) { 
+            new RBManager();
+            return;
+        }
+    } // main
+	
+    public String toString() { return baseClass; }
+	
+    /**
+     * Write the contents of the file to the output stream
+     */
+	
+    public void writeToFile() throws IOException {
+        for (int i = 0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            File outputFile = new File(currentDirectory, baseClass + 
+                                       ((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
+                                        ".properties");
+            FileWriter fw = new FileWriter(outputFile);
+            bundle.writeContents(fw);
+            fw.flush();
+            fw.close();
+        }
+        // In case this is a newly created bundle or the location has changed recently, update the recent files, preference
+        Preferences.addRecentFilePreference(baseClass + ".properties", currentDirectory.getAbsolutePath() + File.separator +
+                                            baseClass + ".properties");
+    }
+	
+    /**
+     * Calling this method removes a resource from the resource bundle. This method does not permanently
+     * erase the file containing the resources at this encoding, however any changes or saves that take
+     * place once this file has been removed will not be reflected in this hidden file. To restore the resource, 
+     * the bundle will have to be recreated. (This last point may change)
+     */
+	
+    public void hideResource(String encoding) {
+        for (int i=0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            if (bundle.encoding.equals(encoding)) {
+                bundles.removeElement(bundle);
+                break;
+            }
+        }
+    }
+	
+    /**
+     * Erases permanently one of the resource files. Be careful about calling this method there is nothing you can do
+     * once a file is erased.
+     */
+	
+    public void eraseFile(String encoding) throws IOException {
+        for (int i = 0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            if (!(bundle.encoding.equals(encoding))) continue;
+            File outputFile = new File(currentDirectory, baseClass + 
+                                       ((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
+                                        ".properties");
+            boolean success = outputFile.delete();
+            if (!success) throw new IOException(Resources.getTranslation("error_deletion_not_possible"));
+            hideResource(encoding);
+            break;
+        }
+    }
+	
+    /**
+     * Writes only one of the resource files to the file system. This file is specified by the encoding parameter
+     */
+	
+    public void writeToFile(String encoding) throws IOException {
+        for (int i = 0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            if (bundle.encoding.equals(encoding) || (i==0 && encoding.equals(""))) {
+                File outputFile = new File(currentDirectory, baseClass + 
+                                           ((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
+                                            ".properties");
+                FileWriter fw = new FileWriter(outputFile);
+                bundle.writeContents(fw);
+                fw.flush();
+                fw.close();
+                break;
+            }
+        }
+        // In case this is a newly created bundle or the location has changed recently, update the recent files, preference
+        Preferences.addRecentFilePreference(baseClass + ".properties", currentDirectory.getAbsolutePath() + File.separator +
+                                            baseClass + ".properties");
+    }
+
+    /**
+     * Given a BundleItem and some properties to change for that item, this method first checks to make sure the passed
+     * item is valid and if it is, the properties of that item are changed to reflect those passed in as parameters to this
+     * method.
+     * @return true if the BundleItem was valid and updateable, false if otherwise (in this case no changes were made).
+     */
+     
+    public boolean editItem(BundleItem item, String name, String value, String groupName, String comment, Hashtable lookups) {
+        if (name == null || name.equals("") || groupName == null || groupName.equals("") || item == null) return false;
+        String oldName = item.getKey();
+        String oldComment = item.getComment();
+        String oldValue = item.getTranslation();
+        //String oldGroupName = item.getParentGroup().getName();
+        // Loop through the bundles
+        for (int i = 0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            BundleItem oldItem = (BundleItem)bundle.allItems.get(oldName);
+            if (oldItem == null) break;
+            if (!oldName.equals(name)) {
+                // A new key
+                oldItem.setKey(name);
+                bundle.allItems.remove(oldItem);
+                bundle.allItems.put(oldItem.getKey(), oldItem);
+            }
+            if (oldItem.getComment() == null || oldItem.getComment().equals(oldComment)) oldItem.setComment(comment);
+            if (oldItem.getTranslation().equals(oldValue)) oldItem.setTranslation(value);
+            oldItem.setLookups(lookups);
+            if (!oldItem.getParentGroup().getName().equals(groupName)) {
+                // A new group
+                oldItem.getParentGroup().removeBundleItem(oldItem.getKey());
+                BundleGroup bg = bundle.getBundleGroup(groupName);
+                if (bg == null) bg = bundle.getUngroupedGroup();
+                oldItem.setParentGroup(bg);
+                bg.addBundleItem(oldItem);
+            }
+        }
+        return true;
+    }
+	
+    /**
+     * Attempts to create a new item in each of the language files. The method first checks the base Resource Bundle
+     * to make sure that the item name does not all ready exist. If it does exist the item is not created.
+     * @param name The unique key of the item
+     * @param value The translation of the item for the base class
+     * @param groupName The group name, should all ready exist in the base class
+     * @param comment An optional comment to be added to the item, can be <CODE>null</CODE>
+     * @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
+     */
+	
+    public boolean createItem(String name, String value, String groupName, String comment, Hashtable lookups) {
+        if (name == null || name.equals("") || groupName == null || groupName.equals("")) return false;
+        Bundle mainBundle = (Bundle)bundles.firstElement();
+        BundleGroup mainGroup = null;
+        if (mainBundle.allItems.containsKey(name)) return false;
+        for (int i=0; i < mainBundle.getGroupCount(); i++) {
+            BundleGroup bg = mainBundle.getBundleGroup(i);
+            if (bg.getName().equals(groupName)) {mainGroup = bg; break;}
+        }
+        if (mainGroup == null) return false;
+        // Add to the base class
+        BundleItem mainItem = new BundleItem(mainGroup, name, value);
+        mainItem.setTranslated(true);
+        mainItem.setCreator(currentUser);
+        mainItem.setModifier(currentUser);
+        mainItem.setComment(comment);
+        mainBundle.allItems.put(name, mainItem);
+        mainGroup.addBundleItem(mainItem);
+        if (lookups != null) mainItem.setLookups(lookups);
+        // Add to the rest of the bundles
+        for (int i=1; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            // Find the group
+            BundleGroup group = null;
+            for (int j=0; j < bundle.getGroupCount(); j++) {
+                BundleGroup bg = bundle.getBundleGroup(j);
+                if (bg.getName().equals(groupName)) {group = bg; break;}
+            }
+            if (group == null) {
+                group = new BundleGroup(bundle, groupName);
+                bundle.addBundleGroup(group);
+            }
+            BundleItem item = new BundleItem(group, name, value);
+            item.setCreator(currentUser);
+            item.setModifier(currentUser);
+            item.setComment(comment);
+            if (lookups != null) item.setLookups(lookups);
+            bundle.allItems.put(name, item);
+            bundle.addUntranslatedItem(item);
+            group.addBundleItem(item);
+        }
+        return true;
+    }
+    
+    /**
+     * Attempts to create a new group in each of the language files. The method first checks the base Resource Bundle
+     * to make sure that the group name does not all ready exist. If it does exist the group is not created.
+     * @param groupName The unique group name to be created
+     * @param groupComment An optional comment to be added to the group, can be <CODE>null</CODE>
+     * @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
+     */
+    public boolean createGroup(String groupName, String groupComment) {
+        if (groupName == null || groupName.equals(""))
+        	return false;
+        // Check to see if the group exists
+        Bundle mainBundle = (Bundle)bundles.firstElement();
+        if (mainBundle.hasGroup(groupName))
+        	return false;
+		
+        // Create the group
+        for (int i=0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            BundleGroup bg = new BundleGroup(bundle, groupName);
+            if (groupComment != null)
+            	bg.setComment(groupComment);
+            bundle.addBundleGroup(bg);
+        }
+        return true;
+    }
+	
+    /**
+     * Removes a group and all of the items within that group from the various
+     * Resource Bundles known to the system. This method removes the group from
+     * the protected vector of groups, then removes all items in that group from
+     * the protected vector of untranslated items, and the protected hashtable of
+     * all items.
+     */
+	
+    public void deleteGroup(String groupName) {
+        if (groupName == null) return;
+        // Loop through all of the bundles;
+        for (int i=0; i < bundles.size(); i++) {
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            bundle.removeGroup(groupName);
+        }
+    }
+	
+    /**
+     * Remove resource items of the given name from each of the resource bundles that the system
+     * knows about. This works by first removing the item from the protected vector of translated
+     * items, if it is there, and then removing it from the the hashtable of all items, and then
+     * removing it from its respective group. 
+     */
+	
+    public void deleteItem(String itemName) {
+        if (itemName == null) return;
+        // Loop through all of the bundles;
+        for (int i=0; i < bundles.size(); i++) {
+            // Loop through untranslated items
+            Bundle bundle = (Bundle)bundles.elementAt(i);
+            bundle.removeUntranslatedItem(itemName);
+                    
+            // Loop through all Items
+            Enumeration items = bundle.allItems.elements();
+            while(items.hasMoreElements()) {
+                BundleItem item = (BundleItem)items.nextElement();
+                if (item.getKey().equals(itemName)) {
+                    bundle.allItems.remove(item);
+                    item.getParentGroup().removeBundleItem(item.getKey());
+                }
+            }
+        }
+    }
+	
+    /**
+     * Looks through the resources contained in the bundle for a resource of the given encoding. Note that this
+     * search is case sensitive.
+     * @return True if the encoding exists as one of the resource files, false otherwise
+     */
+	
+    public boolean hasResource(String encoding) {
+        // Check to see if the encoding exists
+        for (int i=0; i < bundles.size(); i++) {
+            Bundle b = (Bundle)bundles.elementAt(i);
+            if (b.encoding.equals(encoding)) return true;
+        }
+        return false;
+    }
+	
+    /**
+     * Attempts to create a new resource file with the given encoding. The method first checks the base Resource Bundle
+     * to make sure that encoding does not all ready exist. If it does exist the resource file is not created.
+     * @param title An optional, quick title for the file, can be <CODE>null</CODE>
+     * @param comment An optional comment to be added to the resource, can be <CODE>null</CODE>
+     * @param manager The name of the person responsible for this resource, can be <CODE>null</CODE>
+     * @param encoding The proper encoding for the resource. Must be of form 'language', 'language_country', or 'language_country_variant'
+     * @param language A more formal name for the language (e.g. 'English', 'Deutsch', etc.), can be <CODE>null</CODE>
+     * @param country A more formal name for the country described by the resource, can be <CODE>null</CODE>
+     * @param variant A more formal name for the variant described by the resource, can be <CODE>null</CODE>
+     * @param copyValues An indication of wether or not to populate the resource with the items in the base class
+     * @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
+     */
+	
+    public boolean createResource(String title, String comment, String manager, String encoding, 
+                                  String language, String country, String variant, boolean copyValues) {
+        if (encoding == null || encoding.equals("") || encoding.startsWith("_")) return false;
+        // Check to see if the encoding exists
+        if (hasResource(encoding)) return false;
+        // Create the resource
+        Bundle bundle = new Bundle(encoding);
+        bundle.name = title;
+        bundle.comment = comment;
+        bundle.manager = manager;
+        bundle.language = language;
+        bundle.country = country;
+        bundle.variant = variant;
+		
+        // Create a default group
+        bundle.addBundleGroup("Ungrouped Items", "These are resource items that have not been assigned a group");
+        
+        if (copyValues) {
+            Bundle mainBundle = (Bundle)bundles.firstElement();
+            for (int i=0; i < mainBundle.getGroupCount(); i++) {
+                BundleGroup mainGroup = mainBundle.getBundleGroup(i);
+                BundleGroup bg = new BundleGroup(bundle,mainGroup.getName());
+                bg.setComment(mainGroup.getComment());
+                bundle.addBundleGroup(bg);
+                for (int j=0; j < mainGroup.getItemCount(); j++) {
+                    BundleItem mainItem = mainGroup.getBundleItem(j);
+                    BundleItem item = new BundleItem(bg, mainItem.getKey(), mainItem.getTranslation());
+                    item.setComment(mainItem.getComment());
+                    item.setCreator(mainItem.getCreator());
+                    item.setModifier(mainItem.getModifier());
+                    item.setLookups(new Hashtable());
+                    // TODO: This should be done in the Bundle class
+                    Enumeration keys = mainItem.getLookups().keys();
+                    while (keys.hasMoreElements()) {
+                        String name = (String)keys.nextElement();
+                        String value = (String)mainItem.getLookups().get(name);
+                        item.getLookups().put(new String(name), new String(value));
+                    }
+                    bg.addBundleItem(item);
+                    bundle.addUntranslatedItem(item);
+                }
+            }
+        }
+		
+        bundles.addElement(bundle);
+        
+        return true;
+    }
+
+    /**
+     * Returns the number of duplicate NLS entries
+     */
+	
+    public int getNumberDuplicates() {
+        return ((Bundle)bundles.firstElement()).duplicates.size();
+    }
+	
+    /**
+     * Returns a single string with a comma delimited listing of all duplicate entries found in the NLS resources
+     */
+	
+    public String getDuplicatesListing() {
+        return listStrings(getDuplicatesListingVector());
+    }
+
+    /**
+     * Returns a Vector collection of duplicate BundleItems found in the bundle
+     */
+	
+    public Vector getDuplicatesListingVector() {
+        return ((Bundle)bundles.firstElement()).duplicates;
+    }
+
+    /**
+     * A useful debugging method that lists the various BundleGroup names in a String.
+     */
+	
+    public String getGroupListing() {
+        return listStrings(getGroupListingVector());
+    }
+            
+    /**
+     * Returns a vector collection of all of the BundleGroup items founds int the bundle.
+     */
+    
+    public Vector getGroupListingVector() {
+        Vector v = new Vector();
+        Bundle bundle = (Bundle)bundles.firstElement();
+        for (int i=0; i < bundle.getGroupCount(); i++) {
+            String name = bundle.getBundleGroup(i).getName();
+            v.addElement(name);
+        }
+        return v;
+    }
+	
+    /**
+     * Returns the total number of languages that the system seems to support
+     */
+	
+    public int getNumberLanguages() {
+        return bundles.size();
+    }
+	
+    /**
+     * Returns a single string comprised of a comma delimited listing of all languages the system seems to support
+     */
+	
+    public String getLanguageListing() {
+        return listStrings(getLanguageListingVector());
+    }
+	
+    /**
+     * Returns a vector of strings comprising a list of all languages in the system
+     */
+	
+    public Vector getLanguageListingVector() {
+        Vector v = new Vector();
+		
+        for (int i = 0; i < bundles.size(); i++) {
+            Bundle dict = (Bundle)bundles.elementAt(i);
+            String dictStr = new String();
+            if (dict.language != null) dictStr += dict.language;
+            if (dict.country != null) dictStr += " " + dict.country;
+            if (dict.variant != null) dictStr += " " + dict.variant;
+            if (dictStr.trim().equals("")) dictStr = (dict.encoding.trim().equals("") ? "Base Resource Bundle" : dict.encoding);
+            v.addElement(dictStr);
+        }
+		
+        return v;
+    }
+	
+    /**
+     * Returns the number of translations contained across all language files
+     */
+	
+    public int getNumberTotalTranslations() {
+        return allBundleKeys.size();
+    }
+
+    /**
+     * Returns the number of BundleGroups in  the bundle.
+     */
+	
+    public int getNumberGroups() {
+        return ((Bundle)bundles.firstElement()).getGroupCount();
+    }
+	
+    /**
+     * Returns the name of the user currently using the editor
+     */
+	
+    public String getUser() {
+        return currentUser;	
+    }
+	
+    /**
+     * Sets the name of the user currently using the editor
+     */
+	
+    public void setUser(String user) {
+        currentUser = user;	
+    }
+    
+    /**
+     * Sets the name of the base class associated with this resource bundle
+     */
+    
+    public void setBaseClass(String baseClassName) {
+        baseClass = baseClassName;
+    }
+    
+    /**
+     * Sets the directory in the file system in which this resource bundle is to be
+     * saved and retrieved.
+     */
+    
+    public void setFileDirectory(File directory) {
+        if (directory.isDirectory()) currentDirectory = directory;
+    }
+
+    /**
+     * Returns the base class name if known, or "Unknown Base Class" otherwise.
+     */
+    public String toSring() {
+        return (baseClass == null ? "Unknown Base Class" : baseClass);
+    }
+
+    /**
+     * Returns the base class name or null if it does not exist.
+     */
+	
+    public String getBaseClass() {
+        return baseClass;
+    }
+	
+    /**
+     * A Vector of NLSbundles, one for each language
+     */
+    public Vector getBundles() {
+        return bundles;
+    }
+    
+    /**
+     * Return a bundle from a locale
+     * @return The requested resource bundle
+     */
+    public Bundle getBundle(String locale) {
+    	Bundle bundle = null;
+        if (hasResource(locale)) {
+            for (int i = 0; i < bundles.size(); i++) {
+                Bundle tempb = (Bundle)bundles.elementAt(i);
+                if (tempb.encoding.equals(locale)) {
+                    bundle = tempb;
+                    break;
+                }
+            }
+        }
+        return bundle;
+    }
+
+    /**
+     * Returns the name of the file that is the base class file for the resource bundle.
+     */
+    
+    public File getBaseFile() {
+        return new File(currentDirectory,baseClass + ".properties");
+    }
+	
+    // Return a single comma delimited string made from a vector of strings
+    private String listStrings(Vector v) {
+        String retStr = new String();
+        for (int i = 0; i < v.size(); i++) {
+            Object o = v.elementAt(i);
+            if (!(o instanceof String)) continue;
+            String s = (String)o;
+            if (i > 0) retStr += ", ";
+            retStr += s;
+        }
+        return retStr;
+    }
+	
+    // Init - called before ant construction
+    private void init() {
+        allBundleKeys = new Vector();
+        bundles = new Vector();
+        currentUser = "Unknown";
+    }
+	
+    // Return a hashtable of the tags in a comment line (i.e. the text after each '@' character) and their values
+    private Hashtable getDescriptors(Hashtable result, String line) {
+        // Recursion terminating condition
+        if (line == null || line.length() <= 0 || line.indexOf("@") < 0) return result;
+        // Otherwise generate what information we can and recurse
+        if (result == null) result = new Hashtable();
+        // Strip off any information before and including a '@'
+        line = line.substring(line.indexOf("@")+1, line.length());
+        // There should be a space after the '@_tag_' and the value of this property
+        if (line.indexOf(" ") < 0) return result;        // This shouldn't happen if things are formatted right
+        // Add the text after the '@' character up to the first whitespace (has to be a space, not tab or other whitespace)
+        String name = line.substring(0,line.indexOf(" ")).trim();
+        // Now strip off the tag name
+        line = line.substring(line.indexOf(" "), line.length());
+        // If there is another '@' character we take the value up until that character
+        if (line.indexOf("@") >= 0) {
+            result.put(name,line.substring(0,line.indexOf("@")).trim());
+        }
+        // Otherwise we take the rest of the characters in the line
+        else {
+            result.put(name,line.trim());
+            return result;
+        }
+        // Recurse
+        return getDescriptors(result, line.substring(line.indexOf("@"), line.length()));
+    }
+
+    // Checks an array of strings to see if it contains a particular string
+/*    private static boolean arrayContains(String[] array, String match) {
+        for (int i = 0; i < array.length; i++) {
+            if (array[i].equals(match)) return true;
+        }
+        return false;
+    }*/
+	
+    // Prints the usage of the program when called from main
+/*    private static void printUsage() {
+        String usage = new String();
+        usage += "Usage:\n\njava com.ibm.almaden.TempusFugit.Tools.RBManager fileName ((-r | -d) encoding?)?";
+        usage += "\n\n  fileName -> The file (and path?) representing the main NLS resource\n\t\t(i.e. TempusFugit.resources)\n";
+        usage += "  encoding -> Returns results for only the language encoding specified\n";
+        usage += "  flag -r  -> Gives only a status report on the state of the translations\n"; 
+        System.out.println(usage);
+    }*/
+    
+}
+
diff --git a/unicodetools/com/ibm/rbm/RBPropertiesExporter.java b/unicodetools/com/ibm/rbm/RBPropertiesExporter.java
new file mode 100644
index 0000000..b7df7cb
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBPropertiesExporter.java
@@ -0,0 +1,81 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import javax.swing.*;
+import java.util.*;
+
+/**
+ * This class provides a plug-in exporter utility for RBManager that outputs Java
+ * standard .properties files in the according to the file structure of Resource
+ * Bundles. Most all meta-data is lost in this export.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBPropertiesExporter extends RBExporter {
+	
+    public RBPropertiesExporter() {
+        super();
+		
+        // Initialize the file chooser if necessary
+        if (chooser == null) {
+            chooser = new JFileChooser();
+            chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+                public String getDescription() {
+                    return "Base Class Properties Files";
+                }
+                public boolean accept(File f) {
+                    if (f.isDirectory()) return true;
+                    String name = f.getName();
+                    if (name.toLowerCase().endsWith(".properties") && f.getName().indexOf("_") < 0) return true;
+                    return false;
+                }
+            });
+        } // end if
+    }
+	
+    public void export(RBManager rbm) throws IOException {
+        if (rbm == null) return;
+        // Open the Save Dialog
+        int ret_val = chooser.showSaveDialog(null);
+        if (ret_val != JFileChooser.APPROVE_OPTION) return;
+        // Retrieve basic file information
+        File file = chooser.getSelectedFile();                  // The file(s) we will be working with
+        File directory = new File(file.getParent());            // The directory we will be writing to
+        String base_name = file.getName();                      // The base name of the files we will write
+        if (base_name == null || base_name.equals("")) base_name = rbm.getBaseClass();
+        if (base_name.toLowerCase().endsWith(".properties")) 
+            base_name = base_name.substring(0,base_name.length()-11);
+		
+        Vector bundle_v = rbm.getBundles();
+        for (int i=0; i < bundle_v.size(); i++) {
+            Properties prop = new Properties();
+            Bundle bundle = (Bundle)bundle_v.elementAt(i);
+            String base_enc = base_name;
+            if (bundle.encoding != null && !bundle.encoding.equals("")) base_enc = base_enc + "_" + bundle.encoding;
+            String file_name = base_enc + ".properties";
+            String header = "Resource Bundle: " + file_name + " - File automatically generated by RBManager at " + (new Date());
+			
+            Vector group_v = bundle.getGroupsAsVector();
+            for (int j=0; j < group_v.size(); j++) {
+                BundleGroup group = (BundleGroup)group_v.elementAt(j);
+                Vector item_v = group.getItemsAsVector();
+                for (int k=0; k < item_v.size(); k++) {
+                    BundleItem item = (BundleItem)item_v.elementAt(k);
+                    prop.setProperty(item.getKey(), item.getTranslation());
+                } // end for - k
+            } // end for - j
+			
+            // Write out the file
+            File write_file = new File(directory, file_name);
+            FileOutputStream fos = new FileOutputStream(write_file);
+            prop.store(fos, header);
+        } // end for - i
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBPropertiesImporter.java b/unicodetools/com/ibm/rbm/RBPropertiesImporter.java
new file mode 100644
index 0000000..0c6cd29
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBPropertiesImporter.java
@@ -0,0 +1,120 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+import java.util.*;
+
+/**
+ * This is the super class for all importer plug-in classes. As of yet, there
+ * is little contained in this class.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBPropertiesImporter extends RBImporter {
+	
+    boolean isRBMFile = true;
+    
+    /**
+     * Constructs the importer given the parent data classes and a Dialog title.
+     */
+	
+    public RBPropertiesImporter(String title, RBManager rbm, RBManagerGUI gui) {
+        super(title, rbm, gui);
+    }
+	
+    protected void setupFileChooser() {
+        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+            public boolean accept(File f) {
+                if (f.isDirectory()) return true;
+                if (f.getName().toLowerCase().endsWith(".properties") && f.getName().indexOf("_") < 0) return true;
+                return false;
+            }
+            
+            public String getDescription() {
+                return Resources.getTranslation("import_properties_file_description");
+            }
+        });
+    }
+	
+    protected void beginImport() throws IOException {
+        super.beginImport();
+        File baseFile = getChosenFile();
+        FileReader fr = new FileReader(baseFile);
+        BufferedReader br = new BufferedReader(fr);
+		
+        // Test if this is an RBManager generated file or not
+        int count = 0;
+        String line = null;
+        isRBMFile = true;
+        while ((line = br.readLine()) != null) {
+            if (!line.trim().equals("")) count++;
+            if (count == 1 && !line.startsWith("# @file")) {
+                // Not generated by RBManager
+                isRBMFile = false;
+            }
+        } // end while
+        if (isRBMFile) {
+            // Treat the file as generated by RBManager
+            // Parse the resource bundle through RBManager
+            RBManager import_rbm = new RBManager(baseFile);
+            // Merge the two resource bundles
+            Vector bundles = import_rbm.getBundles();
+            Vector encodings = new Vector();
+            for (int i=0; i < bundles.size(); i++) {
+                Bundle b = (Bundle)bundles.elementAt(i);
+                encodings.addElement(b.encoding);
+            }
+            resolveEncodings(encodings);
+            for (int i=0; i < bundles.size(); i++) {
+                Bundle b = (Bundle)bundles.elementAt(i);
+                Enumeration keys = b.allItems.keys();
+                while (keys.hasMoreElements()) {
+                    String key = (String)keys.nextElement();
+                    BundleItem item = (BundleItem)b.allItems.get(key);
+                    importResource(item, b.encoding, (item.getParentGroup() == null ? getDefaultGroup(): item.getParentGroup().getName())); 
+                }
+            }
+        } else {
+            // Just treat it as a regular properties file
+            // Check if there are any missing target locale files
+            String baseName = baseFile.getName().substring(0,baseFile.getName().length()-11); // |'.properties'| == 11
+            File baseDir = new File(baseFile.getParent());
+            String allChildren[] = baseDir.list();
+            Vector children_v = new Vector();
+            for (int i=0; i < allChildren.length; i++) {
+                if (allChildren[i].startsWith(baseName) && allChildren[i].toLowerCase().endsWith(".properties")) {
+                    if (allChildren[i].length() == (baseName + ".properties").length()) children_v.addElement("");
+                    else children_v.addElement(allChildren[i].substring(baseName.length()+1, allChildren[i].indexOf(".properties")));
+                }
+            }
+            showProgressBar(children_v.size());
+            resolveEncodings(children_v);
+            // Run through each source locale file importing as necessary
+            for (int i=0; i < children_v.size(); i++) {
+                Properties p = new Properties();
+                FileInputStream fis = new FileInputStream(new File(baseDir, baseName + 
+                                        (children_v.elementAt(i).toString().equals("") ? "" : "_" + children_v.elementAt(i).toString()) +
+                                        ".properties"));
+                p.load(fis);
+                Enumeration keys = p.keys();
+                while (keys.hasMoreElements()) {
+                    String key = (String)keys.nextElement();
+                    BundleItem item = new BundleItem(null, key, p.getProperty(key));
+                    item.setTranslated(this.getDefaultTranslated());
+                    importResource(item, children_v.elementAt(i).toString(), getDefaultGroup());
+                }
+                incrementProgressBar();
+            }
+            hideProgressBar();
+        }
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBReporter.bat b/unicodetools/com/ibm/rbm/RBReporter.bat
new file mode 100755
index 0000000..eb8fb33
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBReporter.bat
@@ -0,0 +1,2 @@
+@echo off
+java -classpath RBManager.jar;lib\xerces.jar;. com.ibm.rbm.RBReporter %1
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBReporter.java b/unicodetools/com/ibm/rbm/RBReporter.java
new file mode 100644
index 0000000..6e7ac8d
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBReporter.java
@@ -0,0 +1,1191 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.*;
+
+import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xml.serialize.*;
+import org.w3c.dom.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+/**
+ * RBReporter is a fully functional application that runs separate from RBManager.
+ * The report produces statistically based reports on specified resource bundles,
+ * and it allows the user to set time intervals at which those reports will be
+ * generated. For more information on command line arguments and usage see the
+ * comments for the main() method.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBReporter extends JFrame {
+	
+	// ** COMPONENTS **
+	JLabel       statusLabel;                       // Indicates if the reported is running
+	JButton      statusButton;                      // Button for toggling the reporter on/off
+	JLabel       nextReportLabel;                   // Indicates date/time of next report
+	JLabel       lastReportLabel;                   // Indicates date/time of last report
+	JTextField   bundleField;                       // Indicates input base class file
+	JTextField   directoryField;                    // Indicates output directory
+	JCheckBox    textCheck;                         // Is text report generated?
+	JCheckBox    htmlCheck;                         // Is HTML report generated?
+	JCheckBox    xmlCheck;                          // Is XML report generated?
+	JCheckBox    scanCheck;                         // Is code scan performed?
+	JTextField   textField;                         // Text report file name
+	JTextField   htmlField;                         // HTML report file name
+	JTextField   xmlField;                          // XML report file name
+	JTextField   scanField;                         // XML scanner file location
+	JComboBox    textCombo;                         // Text report detail level
+	JComboBox    htmlCombo;                         // HTML report detail level
+	JComboBox    xmlCombo;                          // XML report detail level
+	JRadioButton sequentialRadio;                   // Report at sequential interval?
+	JRadioButton definedRadio;                      // Report at defined time?
+	JComboBox    valueCombo;                        // Number of units to wait between reports
+	JComboBox    unitCombo;                         // Units of time
+	JComboBox    hourCombo;                         // Defined time to report -- hours
+	JComboBox    minuteCombo;                       // Defined time to report -- minutes
+	JComboBox    dayCombo;                          // Defined time to report -- day
+	
+	// ** File Chooser **
+	JFileChooser bundleFileChooser = new JFileChooser();
+	JFileChooser directoryFileChooser = new JFileChooser();
+	JFileChooser scanFileChooser = new JFileChooser();
+	
+	// ** DATA **
+	Date lastReport = null;
+	Date nextReport = null;
+	boolean running = false;
+    /** For generating a report */
+    RBManager rbm;
+	
+	private RBReporter(boolean makeVisible) {
+		try {
+			// Get the look and feel from preferences	
+			try {
+				String laf = Preferences.getPreference("lookandfeel");
+				if (!laf.equals(""))
+					UIManager.setLookAndFeel(laf);
+			} 
+			catch (Exception e) { 
+			}
+			// Get the locale from preferences
+			if (!Preferences.getPreference("locale").equals("")) {
+				String localeStr = Preferences.getPreference("locale");
+				String language = Resources.getLanguage(localeStr);
+				String country = Resources.getCountry(localeStr);
+				String variant = Resources.getVariant(localeStr);
+				if (language == null || language.equals("") || language.length() > 3) language = "en";
+				if (country == null) country = new String();
+				if (variant == null) Resources.setLocale(new Locale(language, country));
+				else Resources.setLocale(new Locale(language, country, variant));
+			}
+			Resources.initBundle();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+		initComponents();
+		setVisible(makeVisible);
+		Thread reportThread = new Thread(){
+			public void run() {
+				if (nextReport != null && (nextReport.compareTo(new Date()) <= 0)) {
+					try { generateReports(); } catch (IOException ioe) {}
+				}
+				if (nextReport == null)
+				    nextReport = generateNextReportDate();
+				updateStatusComponents();
+				updateDateFields();
+				while (true) {
+					if (running && (nextReport.compareTo(new Date()) < 0)) {
+						try {generateReports();}
+						catch (IOException ioe) {
+							JOptionPane.showMessageDialog(null, ioe.getMessage(),
+														  Resources.getTranslation("error"),
+														  JOptionPane.ERROR_MESSAGE);
+						}
+					}
+					try {
+						sleep(1000);
+					} catch (Exception e) {
+						e.printStackTrace(System.err);
+					}
+				}
+			}
+		};
+		reportThread.start();
+	}
+	
+	// Called when a report should be generated. Does not check if it should be generated
+	private void generateReports() throws IOException {
+		File baseFile = new File(bundleField.getText());
+		if (baseFile == null || !baseFile.isFile())
+		    throw new IOException("Specified input file is unusable");
+		File directory = new File(directoryField.getText());
+		rbm = new RBManager(baseFile);
+		
+		if (rbm == null)
+		    throw new IOException("Unable to load the resource bundle file");
+		if (directory == null || !directory.isDirectory())
+		    throw new IOException("Specified output directory is unusable");
+		RBReporterScanner scanner = null;
+		if (scanCheck.isSelected()) {
+			scanner = new RBReporterScanner((Bundle)rbm.getBundles().elementAt(0),
+										    new File(scanField.getText()));
+			scanner.performScan();
+		}
+		if (textCheck.isSelected()) {
+			File textFile = new File(directory, textField.getText());
+			String textReport = getAllLanguageReports(textCombo.getSelectedIndex() == 0);
+			if (scanCheck.isSelected()) {
+				// Add file scan information
+				StringBuffer buffer = new StringBuffer();
+				buffer.append("\n\nCode Scan Results:\n\n");
+				buffer.append("\n\tNumber of unique resources found: " + scanner.getNumberResourcesFound());
+				buffer.append("\n\tNumber of resources missing from bundle: " + scanner.getNumberMissingResources());
+				// Missing resources from the bundle
+				buffer.append("\n\tMissing Resources: ");
+				Vector v = scanner.getMissingResources();
+				for (int i=0; i < v.size(); i++) {
+					ScanResult result = (ScanResult)v.elementAt(i);
+					if (textCombo.getSelectedIndex() == 0) {
+						buffer.append("\n\t\t" + result.getName() + " (" + result.getOccurances().size() + " Occurances)");
+						buffer.append("\n\t\t\t" + result.getOccurances());
+					} else {
+						buffer.append((i==0 ? "" : ", ") + result.getName() + " (" + result.getOccurances().size() + " Occurances)");
+					}
+				}
+				// Bundle resources not found in the code
+				buffer.append("\n\tNumber of potentially unused resources in bundle: " + scanner.getNumberUnusedResources());
+				v = scanner.getUnusedResources();
+				for (int i=0; i < v.size(); i++) {
+					ScanResult result = (ScanResult)v.elementAt(i);
+					if (textCombo.getSelectedIndex() == 0) {
+						buffer.append("\n\t\t" + result.getName() + " (Group: " + result.getGroupName() + ")");
+					} else {
+						buffer.append((i==0 ? "" : ", ") + result.getName());
+					}
+				}
+				
+				textReport = textReport + buffer.toString();
+			}
+			FileWriter fw = new FileWriter(textFile);
+			fw.write(textReport);
+			fw.flush();
+			fw.close();
+		}
+		if (htmlCheck.isSelected()) {
+			File htmlFile = new File(directory, htmlField.getText());
+			Document htmlReport = getHTMLReportz(htmlCombo.getSelectedIndex() == 0);
+			if (scanCheck.isSelected()) {
+				// Add file scan information
+				Element html_elem = htmlReport.getDocumentElement();
+				NodeList nl = html_elem.getElementsByTagName("BODY");
+				Element body_elem = (Element)nl.item(0);
+				Element h2_elem = htmlReport.createElement("H2");
+				Text    h2_text = htmlReport.createTextNode("Code Scan Results");
+				Element block_elem = htmlReport.createElement("BLOCKQUOTE");
+				Element p1_elem = htmlReport.createElement("P");
+				Element p2_elem = htmlReport.createElement("P");
+				Element p3_elem = htmlReport.createElement("P");
+				Text    p1_text = htmlReport.createTextNode("Number of unique resources found: " +
+															scanner.getNumberMissingResources());
+				Text    p2_text = htmlReport.createTextNode("Number of resources missing from bundle: " +
+															scanner.getNumberMissingResources());
+				Text    p3_text = htmlReport.createTextNode("Number of potentially unused resources in bundle: " +
+															scanner.getNumberUnusedResources());
+				
+				h2_elem.appendChild(h2_text);
+				p1_elem.appendChild(p1_text);
+				p2_elem.appendChild(p2_text);
+				p3_elem.appendChild(p3_text);
+				block_elem.appendChild(p1_elem);
+				block_elem.appendChild(p2_elem);
+				block_elem.appendChild(p3_elem);
+				body_elem.appendChild(h2_elem);
+				body_elem.appendChild(block_elem);
+				
+				// Missing resources from the bundle
+				Text   missing_text = null;
+				Vector v = scanner.getMissingResources();
+				if (htmlCombo.getSelectedIndex() == 0) {
+					Element ul_elem = htmlReport.createElement("UL");
+					missing_text = htmlReport.createTextNode("Missing Resources:");
+					ul_elem.appendChild(missing_text);
+					for (int i=0; i < v.size(); i++) {
+						ScanResult result = (ScanResult)v.elementAt(i);
+						Element li_elem = htmlReport.createElement("LI");
+						Element br_elem = htmlReport.createElement("BR");
+						Text    t1_text = htmlReport.createTextNode(result.getName() + " (" +
+																				  result.getOccurances().size() + " Occurances)");
+						Text    t2_text = htmlReport.createTextNode(result.getOccurances().toString());
+						li_elem.appendChild(t1_text);
+						li_elem.appendChild(br_elem);
+						li_elem.appendChild(t2_text);
+						ul_elem.appendChild(li_elem);
+					}
+					p2_elem.appendChild(ul_elem);
+				} else {
+					StringBuffer buffer = new StringBuffer();
+					buffer.append("Missing Resources: ");
+					for (int i=0; i < v.size(); i++) {
+						ScanResult result = (ScanResult)v.elementAt(i);
+						buffer.append((i==0 ? "" : ", ") + result.getName() + " (" + result.getOccurances().size() + " Occurances)");
+					}
+					missing_text = htmlReport.createTextNode(buffer.toString());
+					Element br_elem = htmlReport.createElement("BR");
+					p2_elem.appendChild(br_elem);
+					p2_elem.appendChild(missing_text);
+				}
+				// Bundle resources not found in the code
+				Text   unused_text = null;
+				v = scanner.getUnusedResources();
+				if (htmlCombo.getSelectedIndex() == 0) {
+					Element ul_elem = htmlReport.createElement("UL");
+					unused_text = htmlReport.createTextNode("Unused Resources:");
+					ul_elem.appendChild(unused_text);
+					for (int i=0; i < v.size(); i++) {
+						ScanResult result = (ScanResult)v.elementAt(i);
+						Element li_elem = htmlReport.createElement("LI");
+						Text    t1_text = htmlReport.createTextNode(result.getName() + " (Group: " +
+																				  result.getGroupName() + ")");
+						li_elem.appendChild(t1_text);
+						ul_elem.appendChild(li_elem);
+					}
+					p3_elem.appendChild(ul_elem);
+				} else {
+					StringBuffer buffer = new StringBuffer();
+					buffer.append("Unused Resources: ");
+					for (int i=0; i < v.size(); i++) {
+						ScanResult result = (ScanResult)v.elementAt(i);
+						buffer.append((i==0 ? "" : ", ") + result.getName());
+					}
+					unused_text = htmlReport.createTextNode(buffer.toString());
+					Element br_elem = htmlReport.createElement("BR");
+					p3_elem.appendChild(br_elem);
+					p3_elem.appendChild(unused_text);
+				}
+			}
+			FileWriter fw = new FileWriter(htmlFile);
+			OutputFormat of = new OutputFormat(htmlReport);
+			of.setIndenting(true);
+			of.setEncoding("ISO-8859-1");
+			HTMLSerializer serializer = new HTMLSerializer(fw, of);
+			serializer.serialize(htmlReport);
+		}
+		if (xmlCheck.isSelected()) {
+			File xmlFile = new File(directory, xmlField.getText());
+			Document xmlReport = getXMLReportz(xmlCombo.getSelectedIndex() == 0);
+			if (scanCheck.isSelected()) {
+				// Add file scan information
+				Element root = xmlReport.getDocumentElement();
+				Element code_scan_elem = xmlReport.createElement("CODE_SCAN");
+				Element unique_elem = xmlReport.createElement("UNIQUE_RESOURCES");
+				Element missing_elem = xmlReport.createElement("MISSING_RESOURCES");
+				Element unused_elem = xmlReport.createElement("UNUSED_RESOURCES");
+				Element unique_total_elem = xmlReport.createElement("TOTAL");
+				Element missing_total_elem = xmlReport.createElement("TOTAL");
+				Element unused_total_elem = xmlReport.createElement("TOTAL");
+				Text    unique_total_text = xmlReport.createTextNode(String.valueOf(scanner.getNumberMissingResources()));
+				Text    missing_total_text = xmlReport.createTextNode(String.valueOf(scanner.getNumberMissingResources()));
+				Text    unused_total_text = xmlReport.createTextNode(String.valueOf(scanner.getNumberUnusedResources()));
+				
+				unique_total_elem.appendChild(unique_total_text);
+				missing_total_elem.appendChild(missing_total_text);
+				unused_total_elem.appendChild(unused_total_text);
+				unique_elem.appendChild(unique_total_elem);
+				missing_elem.appendChild(missing_total_elem);
+				unused_elem.appendChild(unused_total_elem);
+				code_scan_elem.appendChild(unique_elem);
+				code_scan_elem.appendChild(missing_elem);
+				code_scan_elem.appendChild(unused_elem);
+				root.appendChild(code_scan_elem);
+				// Missing resources from the bundle
+				Vector v = scanner.getMissingResources();
+				for (int i=0; i < v.size(); i++) {
+					ScanResult result = (ScanResult)v.elementAt(i);
+					Element item_elem = xmlReport.createElement("RESOURCE");
+					item_elem.setAttribute("NAME",result.getName());
+					if (xmlCombo.getSelectedIndex() == 0) {
+						Vector occ_v = result.getOccurances();
+						for (int j=0; j < occ_v.size(); j++) {
+							Occurance occ = (Occurance)occ_v.elementAt(j);
+							Element occ_elem = xmlReport.createElement("OCCURANCE");
+							occ_elem.setAttribute("FILE_NAME", occ.getFileName());
+							occ_elem.setAttribute("FILE_PATH", occ.getFilePath());
+							occ_elem.setAttribute("LINE_NUMBER", String.valueOf(occ.getLineNumber()));
+							item_elem.appendChild(occ_elem);
+						}
+					}
+					missing_elem.appendChild(item_elem);
+				}
+				// Bundle resources not found in the code
+				v = scanner.getUnusedResources();
+				for (int i=0; i < v.size(); i++) {
+					ScanResult result = (ScanResult)v.elementAt(i);
+					Element item_elem = xmlReport.createElement("RESOURCE");
+					item_elem.setAttribute("NAME",result.getName());
+					item_elem.setAttribute("GROUP",result.getGroupName());
+					unused_elem.appendChild(item_elem);
+				}
+			}
+			FileWriter fw = new FileWriter(xmlFile);
+			OutputFormat of = new OutputFormat(xmlReport);
+			of.setIndenting(true);
+			of.setEncoding("ISO-8859-1");
+			XMLSerializer serializer = new XMLSerializer(fw, of);
+			serializer.serialize(xmlReport);
+		}
+		
+		lastReport = new Date();
+		nextReport = generateNextReportDate();
+		updateDateFields();
+		if (!isVisible()) {
+			System.out.println("RBReporter: Generated report at " + lastReport.toString());
+			System.out.println("RBReporter: Next report at " + nextReport.toString());
+		}
+	}
+	
+	// Assumes the last report was just generated, and computes the next report time accordingly
+	private Date generateNextReportDate() {
+		Date retDate = null;
+		GregorianCalendar now = new GregorianCalendar();
+		if (sequentialRadio.isSelected()) {
+			int value = Integer.parseInt(valueCombo.getSelectedItem().toString());
+			if (unitCombo.getSelectedIndex() == 0) now.add(Calendar.MINUTE, value);
+			else if (unitCombo.getSelectedIndex() == 1) now.add(Calendar.HOUR, value);
+			else if (unitCombo.getSelectedIndex() == 2) now.add(Calendar.DATE, value);
+			retDate = now.getTime();
+		} else if (definedRadio.isSelected()) {
+			int hour = Integer.parseInt(hourCombo.getSelectedItem().toString());
+			int minute = Integer.parseInt(minuteCombo.getSelectedItem().toString());
+			int day = dayCombo.getSelectedIndex();
+			
+			GregorianCalendar then = new GregorianCalendar();
+			then.set(Calendar.HOUR, hour);
+			then.set(Calendar.MINUTE, minute);
+			then.set(Calendar.SECOND, 0);
+			
+			if (then.getTime().compareTo(now.getTime()) <= 0) then.add(Calendar.DATE, 1);
+			if (day > 0 && day <= 7) {
+				// Make sure we are at the right day
+				boolean rightDay = false;
+				while (!rightDay) {
+					int weekDay = then.get(Calendar.DAY_OF_WEEK);
+					if ((day == 1 && weekDay == Calendar.MONDAY) ||
+						(day == 2 && weekDay == Calendar.TUESDAY) ||
+						(day == 3 && weekDay == Calendar.WEDNESDAY) ||
+						(day == 4 && weekDay == Calendar.THURSDAY) ||
+						(day == 5 && weekDay == Calendar.FRIDAY) ||
+						(day == 6 && weekDay == Calendar.SATURDAY) ||
+						(day == 7 && weekDay == Calendar.SUNDAY)) rightDay = true;
+					else then.add(Calendar.DATE, 1);
+				}
+			}
+			retDate = then.getTime();
+		}
+		RBManagerGUI.debugMsg("Next Date: " + retDate.toString());
+		return retDate;
+	}
+
+    /**
+     * Returns a string based text report about all of the language files on record
+     */
+    public String getAllLanguageReports(boolean detailed) {
+        String retStr = new String();
+        retStr =    "Resource Bundle Report: " + rbm.getBaseClass();
+        retStr += "\nReport Generated:       " + (new Date()).toString() + "\n\n";
+        Vector bundles = rbm.getBundles();
+        for (int i=0; i < bundles.size(); i++) {
+            retStr += getLanguageReport(detailed, (Bundle)bundles.elementAt(i));	
+        }
+        return retStr;
+    }
+	
+    private String getLanguageReport(boolean detailed, Bundle dict) {
+        if (dict == null) return "";
+        String retStr = new String();
+        retStr += "\nLanguage: " + (dict.language == null ? dict.encoding : dict.language);
+        retStr += (dict.country == null ? "" : " - Country: " + dict.country);
+        retStr += (dict.variant == null ? "" : " - Variant: " + dict.variant);
+        retStr += "\n";
+        retStr += "  Number of NLS items in the file: " + dict.allItems.size() + "\n";
+		
+        int untranslated = 0;
+        String untransStr = new String();
+        Enumeration items = dict.allItems.elements();
+        while (items.hasMoreElements()) {
+            BundleItem tempItem = (BundleItem)items.nextElement();
+            if (tempItem.isTranslated()) continue;
+            untranslated++;
+            untransStr += " " + tempItem.getKey();
+        }
+        retStr += "  Number of NLS items not translated: " + untranslated;
+        if (detailed) {
+            retStr += "\n  Untranslated NLS keys: " + untransStr;	
+        }
+		
+        return retStr;
+    }
+    
+    /**
+     * Returns an XHTML formatted report on the status of the currently opened resource bundle
+     */
+    public Document getHTMLReportz(boolean detailed) {
+        Document html = new DocumentImpl();
+        Element root = html.createElement("HTML");
+        html.appendChild(root);
+        Element head_elem = html.createElement("HEAD");
+        Element title_elem = html.createElement("TITLE");
+        Text    title_text = html.createTextNode("Resource Bundle Report - " + rbm.getBaseClass());
+        Element body_elem = html.createElement("BODY");
+        Element center1_elem = html.createElement("CENTER");
+        Element h1_elem = html.createElement("H1");
+        Element center2_elem = html.createElement("CENTER");
+        Element h3_elem = html.createElement("H1");
+        Text    title1_text = html.createTextNode("Resource Bundle Report: " + rbm.getBaseClass());
+        Text    title2_text = html.createTextNode("Report Generated: " + (new Date()).toString());
+        Vector bundles = rbm.getBundles();
+		
+        title_elem.appendChild(title_text);
+        head_elem.appendChild(title_elem);
+        h1_elem.appendChild(title1_text);
+        h3_elem.appendChild(title2_text);
+        center1_elem.appendChild(h1_elem);
+        center2_elem.appendChild(h3_elem);
+        body_elem.appendChild(center1_elem);
+        body_elem.appendChild(center2_elem);
+        root.appendChild(head_elem);
+        root.appendChild(body_elem);
+        
+        for (int i=0; i < bundles.size(); i++) {
+            getHTMLLanguageReportz(html, body_elem, detailed, (Bundle)bundles.elementAt(i));
+        }
+            
+        return html;
+    }
+    
+    /**
+     * Returns a HTML report as a String object on the status of the currently opened resource bundle
+     */
+    public String getHTMLReport(boolean detailed) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("<HTML>\n<HEAD><TITLE>Resource Bundle Report - " + rbm.getBaseClass() + "</TITLE></HEAD>\n<BODY>\n");
+        buffer.append("<CENTER><H1>Resource Bundle Report: " + rbm.getBaseClass() + "</H1></CENTER>\n");
+        buffer.append("<CENTER><H3>Report Generated: " + (new Date()).toString() + "</H3></CENTER>\n");
+		
+        Vector bundles = rbm.getBundles();
+        for (int i=0; i < bundles.size(); i++) {
+            buffer.append(getHTMLLanguageReport(detailed, (Bundle)bundles.elementAt(i)));	
+        }
+		
+        buffer.append("</BODY>\n</HTML>");
+        return buffer.toString();
+    }
+	
+    private void getHTMLLanguageReportz(Document html, Element body_elem, boolean detailed, Bundle dict) {
+        Element h2_elem = html.createElement("H2");
+        Text    h2_text = html.createTextNode("Language: " + (dict.language == null ? dict.encoding : dict.language) +
+                          (dict.country == null ? "" : " - Country: " + dict.country) +
+                          (dict.variant == null ? "" : " - Variant: " + dict.variant));
+        Element block_elem = html.createElement("BLOCKQUOTE");
+        Element p_elem = html.createElement("P");
+        Text    p_text = html.createTextNode("Number of NLS items in the file: " +
+                         String.valueOf(dict.allItems.size()));
+        Element ul_elem = html.createElement("UL");
+        Text    ul_text = html.createTextNode("Untranslated NLS keys:");
+		
+        h2_elem.appendChild(h2_text);
+        p_elem.appendChild(p_text);
+        ul_elem.appendChild(ul_text);
+        block_elem.appendChild(p_elem);
+        body_elem.appendChild(h2_elem);
+        body_elem.appendChild(block_elem);
+		
+        int untranslated = 0;
+        Enumeration items = dict.allItems.elements();
+        while (items.hasMoreElements()) {
+            BundleItem tempItem = (BundleItem)items.nextElement();
+            if (tempItem.isTranslated()) continue;
+            untranslated++;
+            if (detailed) {
+                Element li_elem = html.createElement("LI");
+                Text    li_text = html.createTextNode(tempItem.getKey());
+                li_elem.appendChild(li_text);
+                ul_elem.appendChild(li_elem);
+            }
+        }
+        Element p2_elem = html.createElement("P");
+        Text    p2_text = html.createTextNode("Number of NLS items not translated: " +
+                          String.valueOf(untranslated));
+        p2_elem.appendChild(p2_text);
+        block_elem.appendChild(p2_elem);
+        if (detailed) block_elem.appendChild(ul_elem);
+    }
+	
+    private String getHTMLLanguageReport(boolean detailed, Bundle dict) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("\n<H2>Language: " + (dict.language == null ? dict.encoding : dict.language));
+        buffer.append(dict.country == null ? "" : " - Country: " + dict.country);
+        buffer.append(dict.variant == null ? "" : " - Variant: " + dict.variant);
+        buffer.append("</H2>\n");
+        buffer.append("<BLOCKQUOTE>\n");
+        
+        buffer.append("<P>Number of NLS items in the file: " + String.valueOf(dict.allItems.size()) + "</P>\n");
+        int untranslated = 0;
+        Enumeration items = dict.allItems.elements();
+        StringBuffer innerBuffer = new StringBuffer();
+        while (items.hasMoreElements()) {
+            BundleItem tempItem = (BundleItem)items.nextElement();
+            if (tempItem.isTranslated()) continue;
+            untranslated++;
+            innerBuffer.append("<LI>" + tempItem.getKey() + "</LI>\n");
+        }
+        buffer.append("<P>Number of NLS items not translated: " + String.valueOf(untranslated) + "</P>\n");
+        if (detailed) {
+            buffer.append("<UL>Untranslated NLS keys:\n");
+            buffer.append(innerBuffer.toString());
+            buffer.append("</UL>\n");
+        }
+		
+        buffer.append("</BLOCKQUOTE>\n");
+        return buffer.toString();
+    }
+
+    /**
+     * Returns an XML formatted report on the status of the currently open resource bundle
+     */ 
+	
+    public Document getXMLReportz(boolean detailed) {
+        Document xml = new DocumentImpl();
+        Element root = xml.createElement("REPORT");
+        root.setAttribute("BASECLASS", rbm.getBaseClass());
+        root.setAttribute("DATE", (new Date()).toString());
+        xml.appendChild(root);
+
+        Vector bundles = rbm.getBundles();
+        for (int i=0; i < bundles.size(); i++) {
+            root.appendChild(getXMLLanguageReportz(xml, detailed, (Bundle)bundles.elementAt(i)));
+        }
+        return xml;
+    }
+    
+    /**
+     * Returns an XML formatted report as a String object on the status of the currently open resource bundle
+     */
+    
+    public String getXMLReport(boolean detailed) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("<?xml version=\"1.0\"?>\n");
+        buffer.append("<REPORT BASECLASS=\"" + rbm.getBaseClass() + "\" DATE=\"" + (new Date()).toString() + "\">\n");
+
+        Vector bundles = rbm.getBundles();
+        for (int i=0; i < bundles.size(); i++) {
+            buffer.append(getXMLLanguageReport(detailed, (Bundle)bundles.elementAt(i)));	
+        }
+        buffer.append("</REPORT>");
+        return buffer.toString();
+    }
+	
+    private Element getXMLLanguageReportz(Document xml, boolean detailed, Bundle dict) {
+        Element lang_report_elem = xml.createElement("LANGUAGE_REPORT");
+        Element locale_elem = xml.createElement("LOCALE");
+        locale_elem.setAttribute("LANGUAGE", (dict.language == null ? dict.encoding : dict.language));
+        locale_elem.setAttribute("COUNTRY", (dict.country == null ? "" : dict.country));
+        locale_elem.setAttribute("VARIANT", (dict.variant == null ? "" : dict.variant));
+        Element nls_total_elem = xml.createElement("NLS_TOTAL");
+        Text    nls_total_text = xml.createTextNode(String.valueOf(dict.allItems.size()));
+        Element untranslated_total_elem = xml.createElement("UNTRANSLATED_TOTAL");
+        Element untranslated_elem = xml.createElement("UNTRANSLATED");
+        
+        nls_total_elem.appendChild(nls_total_text);
+        lang_report_elem.appendChild(locale_elem);
+        lang_report_elem.appendChild(nls_total_elem);
+        lang_report_elem.appendChild(untranslated_total_elem);
+        if (detailed) lang_report_elem.appendChild(untranslated_elem);
+		
+        int untranslated = 0;
+        Enumeration items = dict.allItems.elements();
+        while (items.hasMoreElements()) {
+            BundleItem tempItem = (BundleItem)items.nextElement();
+            if (tempItem.isTranslated()) continue;
+            untranslated++;
+            Element resource_elem = xml.createElement("RESOURCEKEY");
+            Text    resource_text = xml.createTextNode(tempItem.getKey());
+            resource_elem.appendChild(resource_text);
+            untranslated_elem.appendChild(resource_elem);
+        }
+        Text untranslated_total_text = xml.createTextNode(String.valueOf(untranslated));
+        untranslated_total_elem.appendChild(untranslated_total_text);
+		
+        return lang_report_elem;
+    }
+	
+    private String getXMLLanguageReport(boolean detailed, Bundle dict) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("<LANGUAGE_REPORT>\n");
+        
+        buffer.append("\n\t<LOCALE LANGUAGE=\"" + (dict.language == null ? dict.encoding : dict.language));
+        buffer.append("\" COUNTRY=\"" + (dict.country == null ? "" : dict.country));
+        buffer.append("\" VARIANT=\"" + (dict.variant == null ? "" : dict.variant) + "\"/>\n");
+		
+        buffer.append("\t<NLS_TOTAL>" + String.valueOf(dict.allItems.size()) + "</NLS_TOTAL>\n");
+        int untranslated = 0;
+        Enumeration items = dict.allItems.elements();
+        StringBuffer innerBuffer = new StringBuffer();
+        while (items.hasMoreElements()) {
+            BundleItem tempItem = (BundleItem)items.nextElement();
+            if (tempItem.isTranslated()) continue;
+            untranslated++;
+            innerBuffer.append("\t\t<RESOURCEKEY>" + tempItem.getKey() + "</RESOURCEKEY>\n");
+        }
+        buffer.append("\t<UNTRANSLATED_TOTAL>" + String.valueOf(untranslated) + "</UNTRANSLATED_TOTAL>\n");
+        if (detailed) {
+            buffer.append("\t<UNTRANSLATED>\n");
+            buffer.append(innerBuffer.toString());
+            buffer.append("\t</UNTRANSLATED>\n");
+        }
+		
+        buffer.append("</LANGUAGE_REPORT>\n");
+        return buffer.toString();
+    }
+	
+	private void updateDateFields() {
+		if (nextReport == null) nextReportLabel.setText(Resources.getTranslation("reporter_next_report", "--"));
+		else nextReportLabel.setText(Resources.getTranslation("reporter_next_report", nextReport.toString()));
+		if (lastReport == null) lastReportLabel.setText(Resources.getTranslation("reporter_last_report", "--"));
+		else lastReportLabel.setText(Resources.getTranslation("reporter_last_report", lastReport.toString()));
+	}
+	
+	private void updateStatusComponents() {
+		if (running) {
+			statusLabel.setText(Resources.getTranslation("reporter_status_running"));
+			statusLabel.setForeground(Color.green);
+			statusButton.setText(Resources.getTranslation("reporter_button_stop"));
+		} else {
+			statusLabel.setText(Resources.getTranslation("reporter_status_stopped"));
+			statusLabel.setForeground(Color.red);
+			statusButton.setText(Resources.getTranslation("reporter_button_start"));
+		}
+	}
+	
+	private void setComponentsToDefaults() {
+		if ((running && Preferences.getPreference("reporter_enabled").equals("No")) ||
+			(!running && Preferences.getPreference("reporter_enabled").equals("Yes"))) toggleStatus();
+		if (Preferences.getPreference("reporter_format_text_enabled") != null)
+			textCheck.setSelected(Preferences.getPreference("reporter_format_text_enabled").equals("Yes"));
+		if (Preferences.getPreference("reporter_format_html_enabled") != null)
+			htmlCheck.setSelected(Preferences.getPreference("reporter_format_html_enabled").equals("Yes"));
+		if (Preferences.getPreference("reporter_format_xml_enabled") != null)
+				xmlCheck.setSelected(Preferences.getPreference("reporter_format_xml_enabled").equals("Yes"));
+		if (Preferences.getPreference("reporter_format_text_file") != null &&
+			!Preferences.getPreference("reporter_format_text_file").equals(""))
+			textField.setText(Preferences.getPreference("reporter_format_text_file"));
+		if (Preferences.getPreference("reporter_format_html_file") != null &&
+			!Preferences.getPreference("reporter_format_html_file").equals(""))
+			htmlField.setText(Preferences.getPreference("reporter_format_html_file"));
+		if (Preferences.getPreference("reporter_format_xml_file") != null &&
+			!Preferences.getPreference("reporter_format_xml_file").equals(""))
+			xmlField.setText(Preferences.getPreference("reporter_format_xml_file"));
+		if (Preferences.getPreference("reporter_format_text_detail") != null &&
+			!Preferences.getPreference("reporter_format_text_detail").equals(""))
+			selectComboValue(textCombo, Preferences.getPreference("reporter_format_text_detail"));
+		if (Preferences.getPreference("reporter_format_html_detail") != null &&
+			!Preferences.getPreference("reporter_format_html_detail").equals(""))
+			selectComboValue(htmlCombo, Preferences.getPreference("reporter_format_html_detail"));
+		if (Preferences.getPreference("reporter_format_xml_detail") != null &&
+			!Preferences.getPreference("reporter_format_xml_detail").equals(""))
+			selectComboValue(xmlCombo, Preferences.getPreference("reporter_format_xml_detail"));
+		if (Preferences.getPreference("reporter_interval").equals("Sequential"))
+			sequentialRadio.setSelected(true);
+		else definedRadio.setSelected(true);
+		if (Preferences.getPreference("reporter_interval_sequential_value") != null &&
+			!Preferences.getPreference("reporter_interval_sequential_value").equals(""))
+			selectComboValue(valueCombo, Preferences.getPreference("reporter_interval_sequential_value"));
+		if (Preferences.getPreference("reporter_interval_sequential_units") != null &&
+			!Preferences.getPreference("reporter_interval_sequential_units").equals(""))
+			selectComboValue(valueCombo, Preferences.getPreference("reporter_interval_sequential_units"));
+		if (Preferences.getPreference("reporter_interval_defined_hour") != null &&
+			!Preferences.getPreference("reporter_interval_defined_hour").equals(""))
+			selectComboValue(hourCombo, Preferences.getPreference("reporter_interval_defined_hour"));
+		if (Preferences.getPreference("reporter_interval_defined_day") != null &&
+			!Preferences.getPreference("reporter_interval_defined_day").equals(""))
+			selectComboValue(dayCombo, Preferences.getPreference("reporter_interval_defined_day"));
+		if (Preferences.getPreference("reporter_interval_defined_minute") != null &&
+			!Preferences.getPreference("reporter_interval_defined_minute").equals(""))
+			selectComboValue(minuteCombo, Preferences.getPreference("reporter_interval_defined_minute"));
+		if (Preferences.getPreference("reporter_scan_file") != null &&
+			!Preferences.getPreference("reporter_scan_file").equals(""))
+			scanField.setText(Preferences.getPreference("reporter_scan_file"));
+		if (Preferences.getPreference("reporter_perform_scan") != null)
+			scanCheck.setSelected(Preferences.getPreference("reporter_perform_scan").equals("Yes"));
+	}
+	
+	private static void selectComboValue(JComboBox box, String value) {
+		for (int i=0; i < box.getItemCount(); i++) {
+			if (box.getItemAt(i).toString().equals(value)) {
+				box.setSelectedIndex(i);
+				break;
+			}
+		}
+	}
+	
+	private void saveDefaults() {
+		// Save format options
+		Preferences.setPreference("reporter_format_text_enabled", (textCheck.isSelected() ? "Yes" : "No"));
+		Preferences.setPreference("reporter_format_text_file", textField.getText());
+		Preferences.setPreference("reporter_format_text_detail", textCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_format_html_enabled", (htmlCheck.isSelected() ? "Yes" : "No"));
+		Preferences.setPreference("reporter_format_html_file", htmlField.getText());
+		Preferences.setPreference("reporter_format_html_detail", htmlCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_format_xml_enabled", (xmlCheck.isSelected() ? "Yes" : "No"));
+		Preferences.setPreference("reporter_format_xml_file", xmlField.getText());
+		Preferences.setPreference("reporter_format_xml_detail", xmlCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_scan_file", scanField.getText());
+		Preferences.setPreference("reporter_perform_scan", (scanCheck.isSelected() ? "Yes" : "No"));
+		// Save interval options
+		Preferences.setPreference("reporter_interval", (sequentialRadio.isSelected() ? "Sequential" : "Defined"));
+		Preferences.setPreference("reporter_interval_sequential_value", valueCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_interval_sequential_units", unitCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_interval_defined_hour", hourCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_interval_defined_minute", minuteCombo.getSelectedItem().toString());
+		Preferences.setPreference("reporter_interval_defined_day", dayCombo.getSelectedItem().toString());
+		// Save system options
+		Preferences.setPreference("reporter_enabled", (running ? "Yes" : "No"));
+		// Write the preferences
+		try {
+			Preferences.savePreferences();
+		} catch (IOException ioe) {
+			// TODO: Warn of error through JOptionPane
+			ioe.printStackTrace();
+		}
+	}
+	
+	private void toggleStatus() {
+		if (running) {
+			running = false;
+		} else {
+			running = true;
+		}
+		updateStatusComponents();
+	}
+	
+	private void initComponents() {
+		
+		// File choosers
+		bundleFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				
+				String name = f.getName();
+				if (!(name.toLowerCase().endsWith(".properties"))) return false;
+				if (name.indexOf("_") > 0) return false;
+				return true;
+			}
+	
+			public String getDescription() {
+				return Resources.getTranslation("dialog_file_filter_description");
+			}
+		});
+		bundleFileChooser.setSelectedFile(new File(Preferences.getPreference("reporter_base_class_file")));
+		
+		directoryFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				return false;
+			}
+	
+			public String getDescription() {
+				return Resources.getTranslation("directory");
+			}
+		});
+		directoryFileChooser.setSelectedFile(new File(Preferences.getPreference("reporter_output_directory")));
+		
+		scanFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				if (f.getName().endsWith(".xml")) return true;
+				return false;
+			}
+	
+			public String getDescription() {
+				return Resources.getTranslation("dialog_file_filter_description_scan");
+			}
+		});
+		scanFileChooser.setSelectedFile(new File(Preferences.getPreference("reporter_scan_file")));
+		
+		// New top level components
+		JPanel statusPanel = new JPanel();
+		JPanel intervalPanel = new JPanel();
+		JPanel optionsPanel = new JPanel();
+		JPanel formatPanel = new JPanel();
+		Box mainBox = new Box(BoxLayout.Y_AXIS);
+		int width = 600;
+		int height = 600;
+		int compHeight = 20;
+		Dimension mainDim = new Dimension(width,height);
+		
+		statusPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															   Resources.getTranslation("reporter_panel_status")));
+		intervalPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															   Resources.getTranslation("reporter_panel_interval")));
+		optionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															   Resources.getTranslation("reporter_panel_options")));
+		formatPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															   Resources.getTranslation("reporter_panel_output_format")));
+		
+		// ** STATUS PANEL SETUP **
+		JButton nowButton = new JButton(Resources.getTranslation("reporter_button_now"));
+		Box     statusBox = new Box(BoxLayout.Y_AXIS);
+		JPanel  statusPanel1 = new JPanel();
+		JPanel  statusPanel2 = new JPanel();
+		JPanel  statusPanel3 = new JPanel();
+		JPanel  statusPanel4 = new JPanel();
+		statusButton = new JButton(Resources.getTranslation("reporter_button_start"));
+		statusLabel = new JLabel(Resources.getTranslation("reporter_status_stopped"));
+		nextReportLabel = new JLabel(Resources.getTranslation("reporter_next_report", "--"));
+		lastReportLabel = new JLabel(Resources.getTranslation("reporter_last_report", "--"));
+		statusLabel.setFont(new Font("serif",Font.BOLD,14));
+		statusLabel.setForeground(Color.red);
+		statusPanel2.setLayout(new FlowLayout(FlowLayout.LEFT));
+		statusPanel3.setLayout(new FlowLayout(FlowLayout.LEFT));
+		statusPanel.setLayout(new BorderLayout());
+		
+		nowButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				try {
+					generateReports();
+				} catch (Exception e) {
+					JOptionPane.showMessageDialog(null, e.getMessage(), Resources.getTranslation("error"),
+												  JOptionPane.ERROR_MESSAGE);
+					RBManagerGUI.debugMsg(e.toString());
+					if (RBManagerGUI.debug) e.printStackTrace(System.err);
+				}
+			}
+		});
+		
+		statusButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				toggleStatus();
+			}
+		});
+		
+		statusPanel1.add(statusLabel);
+		statusPanel2.add(nextReportLabel);
+		statusPanel3.add(lastReportLabel);
+		statusPanel4.add(nowButton);
+		statusPanel4.add(Box.createHorizontalStrut(7));
+		statusPanel4.add(statusButton);
+		statusBox.add(statusPanel1);
+		statusBox.add(Box.createVerticalStrut(7));
+		//statusBox.add(Box.createHorizontalGlue());
+		statusBox.add(statusPanel2);
+		//statusBox.add(Box.createHorizontalGlue());
+		statusBox.add(statusPanel3);
+		statusBox.add(Box.createVerticalStrut(7));
+		statusBox.add(statusPanel4);
+		statusPanel.add(statusBox, BorderLayout.CENTER);
+		
+		// ** OPTIONS PANEL SETUP **
+		JLabel  inputLabel    = new JLabel(Resources.getTranslation("reporter_input_bundle"));
+		JLabel  outputLabel   = new JLabel(Resources.getTranslation("reporter_output_directory"));
+		JButton inputButton   = new JButton(Resources.getTranslation("reporter_button_choose"));
+		JButton outputButton  = new JButton(Resources.getTranslation("reporter_button_choose"));
+		JButton scanButton    = new JButton(Resources.getTranslation("reporter_button_choose"));
+		JButton defaultButton = new JButton(Resources.getTranslation("reporter_button_save_defaults"));
+		JLabel  textLabel     = new JLabel(Resources.getTranslation("reporter_output_file"));
+		JLabel  htmlLabel     = new JLabel(Resources.getTranslation("reporter_output_file"));
+		JLabel  xmlLabel      = new JLabel(Resources.getTranslation("reporter_output_file"));
+		JLabel  textLabel2    = new JLabel(Resources.getTranslation("reporter_detail_level"));
+		JLabel  htmlLabel2    = new JLabel(Resources.getTranslation("reporter_detail_level"));
+		JLabel  xmlLabel2     = new JLabel(Resources.getTranslation("reporter_detail_level"));
+		JPanel  optionsPanel1 = new JPanel();
+		JPanel  optionsPanel2 = new JPanel();
+		JPanel  optionsPanelA = new JPanel();
+		JPanel  optionsPanel3 = new JPanel();
+		JPanel  optionsPanel4 = new JPanel();
+		JPanel  optionsPanel5 = new JPanel();
+		JPanel  optionsPanel6 = new JPanel();
+		Box     optionsBox    = new Box(BoxLayout.Y_AXIS);
+		Box     outputBox     = new Box(BoxLayout.Y_AXIS);
+		
+		bundleField    = new JTextField(Preferences.getPreference("reporter_base_class_file"));
+		directoryField = new JTextField(Preferences.getPreference("reporter_output_directory"));
+		textCheck      = new JCheckBox(Resources.getTranslation("reporter_format_text"));
+		htmlCheck      = new JCheckBox(Resources.getTranslation("reporter_format_html"));
+		xmlCheck       = new JCheckBox(Resources.getTranslation("reporter_format_xml"));
+		scanCheck      = new JCheckBox(Resources.getTranslation("reporter_perform_scan"), false);
+		textField      = new JTextField("report.txt");
+		htmlField      = new JTextField("report.html");
+		xmlField       = new JTextField("report.xml");
+		scanField      = new JTextField();
+		String [] detailLevels = {Resources.getTranslation("reporter_detail_high"),
+								  Resources.getTranslation("reporter_detail_normal")};
+		textCombo      = new JComboBox(detailLevels);
+		htmlCombo      = new JComboBox(detailLevels);
+		xmlCombo       = new JComboBox(detailLevels);
+		
+		bundleField.setColumns(30);
+		directoryField.setColumns(30);
+		scanField.setColumns(30);
+		textField.setColumns(15);
+		htmlField.setColumns(15);
+		xmlField.setColumns(15);
+		Dimension checkDim = new Dimension(55,compHeight);
+		textCheck.setPreferredSize(checkDim);
+		htmlCheck.setPreferredSize(checkDim);
+		xmlCheck.setPreferredSize(checkDim);
+		optionsPanel1.setLayout(new FlowLayout(FlowLayout.RIGHT));
+		optionsPanel2.setLayout(new FlowLayout(FlowLayout.RIGHT));
+		optionsPanelA.setLayout(new FlowLayout(FlowLayout.RIGHT));
+		
+		inputButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				setInputBundle();
+			}
+		});
+		
+		outputButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				setOutputBundle();
+			}
+		});
+		
+		scanButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent ev) {
+				setScanFile();
+			}
+		});
+		
+		defaultButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				saveDefaults();
+			}
+		});
+		
+		optionsPanel6.add(defaultButton);
+		optionsPanel3.add(textCheck);
+		optionsPanel3.add(Box.createHorizontalStrut(5));
+		optionsPanel3.add(textLabel);
+		optionsPanel3.add(Box.createHorizontalStrut(5));
+		optionsPanel3.add(textField);
+		optionsPanel3.add(Box.createHorizontalStrut(5));
+		optionsPanel3.add(textLabel2);
+		optionsPanel3.add(Box.createHorizontalStrut(5));
+		optionsPanel3.add(textCombo);
+		optionsPanel4.add(htmlCheck);
+		optionsPanel4.add(Box.createHorizontalStrut(5));
+		optionsPanel4.add(htmlLabel);
+		optionsPanel4.add(Box.createHorizontalStrut(5));
+		optionsPanel4.add(htmlField);
+		optionsPanel4.add(Box.createHorizontalStrut(5));
+		optionsPanel4.add(htmlLabel2);
+		optionsPanel4.add(Box.createHorizontalStrut(5));
+		optionsPanel4.add(htmlCombo);
+		optionsPanel5.add(xmlCheck);
+		optionsPanel5.add(Box.createHorizontalStrut(5));
+		optionsPanel5.add(xmlLabel);
+		optionsPanel5.add(Box.createHorizontalStrut(5));
+		optionsPanel5.add(xmlField);
+		optionsPanel5.add(Box.createHorizontalStrut(5));
+		optionsPanel5.add(xmlLabel2);
+		optionsPanel5.add(Box.createHorizontalStrut(5));
+		optionsPanel5.add(xmlCombo);
+		outputBox.add(optionsPanel3);
+		outputBox.add(optionsPanel4);
+		outputBox.add(optionsPanel5);
+		formatPanel.add(outputBox);
+		optionsPanel1.add(inputLabel);
+		optionsPanel1.add(Box.createHorizontalStrut(5));
+		optionsPanel1.add(bundleField);
+		optionsPanel1.add(Box.createHorizontalStrut(5));
+		optionsPanel1.add(inputButton);
+		optionsPanel2.add(outputLabel);
+		optionsPanel2.add(Box.createHorizontalStrut(5));
+		optionsPanel2.add(directoryField);
+		optionsPanel2.add(Box.createHorizontalStrut(5));
+		optionsPanel2.add(outputButton);
+		optionsPanelA.add(scanCheck);
+		optionsPanelA.add(Box.createHorizontalStrut(5));
+		optionsPanelA.add(scanField);
+		optionsPanelA.add(Box.createHorizontalStrut(5));
+		optionsPanelA.add(scanButton);
+		optionsBox.add(optionsPanel1);
+		optionsBox.add(optionsPanel2);
+		optionsBox.add(optionsPanelA);
+		optionsBox.add(formatPanel);
+		optionsBox.add(optionsPanel6);
+		optionsPanel.add(optionsBox);
+		
+		// ** INTERVAL PANEL SETUP **
+		String boxArray1[] = {"1","2","3","4","5","6","7","8","9","10","11","12","15","20","24","25","30"};
+		String boxArray2[] = {Resources.getTranslation("reporter_time_minutes"),
+							  Resources.getTranslation("reporter_time_hours"),
+							  Resources.getTranslation("reporter_time_days")};
+		String boxArray3[] = {"1","2","3","4","5","6","7","8","9","10","11","12",
+							  "13","14","15","16","17","18","19","20","21","22","23","0"};
+		String boxArray4[] = {"00","15","30","45"};
+		String boxArray5[] = {Resources.getTranslation("reporter_time_everyday"),
+							  Resources.getTranslation("reporter_time_monday"),
+							  Resources.getTranslation("reporter_time_tuesday"),
+							  Resources.getTranslation("reporter_time_wednesday"),
+							  Resources.getTranslation("reporter_time_thursday"),
+							  Resources.getTranslation("reporter_time_friday"),
+							  Resources.getTranslation("reporter_time_saturday"),
+							  Resources.getTranslation("reporter_time_sunday")};
+		
+		JLabel colonLabel = new JLabel(":");
+		sequentialRadio = new JRadioButton(Resources.getTranslation("reporter_interval_sequential"));
+		definedRadio = new JRadioButton(Resources.getTranslation("reporter_interval_defined"), true);
+		valueCombo = new JComboBox(boxArray1);
+		unitCombo = new JComboBox(boxArray2);
+		hourCombo = new JComboBox(boxArray3);
+		minuteCombo = new JComboBox(boxArray4);
+		dayCombo = new JComboBox(boxArray5);
+		JPanel intervalPanel1 = new JPanel();
+		JPanel intervalPanel2 = new JPanel();
+		intervalPanel1.setLayout(new FlowLayout(FlowLayout.LEFT));
+		intervalPanel2.setLayout(new FlowLayout(FlowLayout.LEFT));
+		Box intervalBox = new Box(BoxLayout.Y_AXIS);
+		intervalPanel.setLayout(new BorderLayout());
+		
+		ButtonGroup bg = new ButtonGroup();
+		bg.add(sequentialRadio);
+		bg.add(definedRadio);
+		
+		intervalPanel1.add(sequentialRadio);
+		intervalPanel1.add(Box.createHorizontalStrut(5));
+		intervalPanel1.add(valueCombo);
+		intervalPanel1.add(Box.createHorizontalStrut(5));
+		intervalPanel1.add(unitCombo);
+		intervalPanel2.add(definedRadio);
+		intervalPanel2.add(Box.createHorizontalStrut(5));
+		intervalPanel2.add(hourCombo);
+		intervalPanel2.add(colonLabel);
+		intervalPanel2.add(minuteCombo);
+		intervalPanel2.add(Box.createHorizontalStrut(5));
+		intervalPanel2.add(dayCombo);
+		intervalBox.add(intervalPanel1);
+		intervalBox.add(intervalPanel2);
+		intervalPanel.add(intervalBox, BorderLayout.WEST);
+		
+		// ** MAINBOX SETUP **
+		mainBox.removeAll();
+		mainBox.add(statusPanel);
+		mainBox.add(intervalPanel);
+		mainBox.add(optionsPanel);
+		
+		// ** MAIN FRAME SETUP **
+		setLocation(new java.awt.Point(25, 25));
+		setSize(mainDim);
+		//((JComponent)getContentPane()).setMaximumSize(dimMainMax);
+		//((JComponent)getContentPane()).setMinimumSize(dimMainMin);
+		//setJMenuBar(jMenuBarMain);
+		getContentPane().setLayout(new BorderLayout());
+		getContentPane().removeAll();
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		setTitle(Resources.getTranslation("resource_bundle_reporter"));
+		//validateTree();
+		setComponentsToDefaults();
+		nextReport = generateNextReportDate();
+		updateDateFields();
+		repaint();
+		
+		addWindowListener(new java.awt.event.WindowAdapter() {
+			public void windowClosing(java.awt.event.WindowEvent ev) {
+				thisWindowClosing(ev);
+			}
+		});
+	}
+	
+	public void thisWindowClosing(WindowEvent ev) {
+		setVisible(false);
+		dispose();
+		System.exit(0);
+	}
+	
+	private void setInputBundle() {
+		int result = bundleFileChooser.showOpenDialog(this);
+		if (result == JFileChooser.APPROVE_OPTION) {
+			File f = bundleFileChooser.getSelectedFile();
+			if (f != null) {
+				bundleField.setText(f.getAbsolutePath());
+				Preferences.setPreference("reporter_base_class_file",f.getAbsolutePath());
+				try {Preferences.savePreferences();} catch (IOException ioe) {}
+			}
+		}
+	}
+	
+	private void setOutputBundle() {
+		int result = directoryFileChooser.showOpenDialog(this);
+		if (result == JFileChooser.APPROVE_OPTION) {
+			File f = directoryFileChooser.getSelectedFile();
+			if (!f.isDirectory()) f = new File(f.getParent());
+			if (f != null) {
+				directoryField.setText(f.getAbsolutePath());
+				Preferences.setPreference("reporter_output_directory",f.getAbsolutePath());
+				try {Preferences.savePreferences();} catch (IOException ioe) {}
+			}
+		}
+	}
+	
+	private void setScanFile() {
+		int result = scanFileChooser.showOpenDialog(this);
+		if (result == JFileChooser.APPROVE_OPTION) {
+			File f = scanFileChooser.getSelectedFile();
+			if (f != null) {
+				scanField.setText(f.getAbsolutePath());
+				Preferences.setPreference("reporter_scan_file",f.getAbsolutePath());
+				try {Preferences.savePreferences();} catch (IOException ioe) {}
+			}
+		}
+	}
+	
+	private static String getUsage() {
+		return "\nRBReporter Command Line Usage:\n\n" +
+			   "Default Usage (GUI):   java com.ibm.rbm.RBReporter\n" +
+			   "Options Usage:         java com.ibm.rbm.RBReporter [-gui | -now | -line]\n\n" + 
+			   "Options:               -gui     Run the Graphical User Interface\n" +
+			   "                       -now     Execute the Report Generation Immediately\n" +
+			   "                       -line    Run the Reporter without the GUI";
+	}
+	
+	public static void main(String args[]) {
+	    RBReporter reporter;
+		if (args.length == 1) {
+			if (args[0].equals("-gui")) {
+			    reporter = new RBReporter(true);	
+			} else if (args[0].equals("-now")) {
+				reporter = new RBReporter(false);
+				try {
+					reporter.generateReports();
+					System.out.println("RBReporter: Generation of reports successful. " + new Date());
+				} catch (IOException ioe) {
+					System.out.println("There was an error generating the reports...\n\n\t" + ioe.getMessage());
+				}
+				reporter.thisWindowClosing(null);
+			} else if (args[0].equals("-line")) {
+				reporter = new RBReporter(false);
+				if (!reporter.running)
+				    reporter.toggleStatus();
+				System.out.println("RBReporter: Next Report at " + reporter.nextReport.toString());
+			} else {
+				System.out.println(getUsage());
+			}
+		} else if (args.length == 0) {
+			reporter = new RBReporter(true);
+		} else {
+			System.out.println(getUsage());
+		}
+	}
+	
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBReporterScanner.java b/unicodetools/com/ibm/rbm/RBReporterScanner.java
new file mode 100644
index 0000000..5617de9
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBReporterScanner.java
@@ -0,0 +1,305 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.xerces.parsers.DOMParser;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+/**
+ * RBReporterScaner is a utility class for RBReporter. It creates a report from an xml settings
+ * file that scans code for resources and compares them against a resource bundle.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBReporter
+ */
+public class RBReporterScanner {
+	private Bundle       bundle;
+	private Document     config;
+	private Hashtable    fileRules;
+	private Hashtable    parseRules;
+	private Hashtable    results;
+	private Hashtable    missing;
+	private boolean      resultsFound;
+	
+	protected RBReporterScanner(Bundle bundle, File configFile) throws IOException {
+		resultsFound = false;
+		this.bundle = bundle;
+		
+		try {
+			InputSource is = new InputSource(new FileInputStream(configFile));
+			DOMParser parser = new DOMParser();
+			parser.parse(is);
+			config = parser.getDocument();
+		} catch (SAXException saxe) {
+			throw new IOException("Illegal XML Document: " + saxe.getMessage());
+		}
+		
+		Element root = config.getDocumentElement();
+		fileRules = getFileRules(root);
+		parseRules = getParseRules(root);
+		
+		results = new Hashtable();
+		Enumeration keys = bundle.allItems.keys();
+		while (keys.hasMoreElements()) {
+			String key = (String)keys.nextElement();
+			BundleItem item = (BundleItem)bundle.allItems.get(key);
+			results.put(key, new ScanResult(item));
+		}
+		
+		missing = new Hashtable();
+	}
+	
+	protected int getNumberResourcesFound() {
+		return results.size();
+	}
+	
+	protected int getNumberMissingResources() {
+		return missing.size();
+	}
+	
+	protected int getNumberUnusedResources() {
+		int count = 0;
+		Enumeration elems = results.elements();
+		while (elems.hasMoreElements()) {
+			ScanResult result = (ScanResult)elems.nextElement();
+			if (result.getOccurances().size() < 1) count++;
+		}
+		return count;
+	}
+	
+	protected Vector getMissingResources() {
+		Enumeration elems = missing.elements();
+		Vector v = new Vector();
+		while (elems.hasMoreElements())
+			v.addElement(elems.nextElement());
+		return v;
+	}
+	
+	protected Vector getUnusedResources() {
+		Enumeration elems = results.elements();
+		Vector v = new Vector();
+		while (elems.hasMoreElements()) {
+			ScanResult result = (ScanResult)elems.nextElement();
+			if (result.getOccurances().size() < 1) {
+				v.addElement(result);
+			}
+		}
+		return v;
+	}
+	
+	protected boolean performScan() throws IOException {
+		resultsFound = false;
+		
+		Element root = config.getDocumentElement();
+		NodeList nl = root.getElementsByTagName("Scan");
+		if (nl.getLength() < 1) return resultsFound;
+		Element scan_elem = (Element)nl.item(0);
+		nl = scan_elem.getElementsByTagName("Directory");
+		for (int i=0; i < nl.getLength(); i++) {
+			Element dir_elem = (Element)nl.item(i);
+			File directory = new File(dir_elem.getAttribute("location"));
+			boolean recurse = dir_elem.getAttribute("recurse_directories").equalsIgnoreCase("true");
+			NodeList rules_list = dir_elem.getElementsByTagName("Rules");
+			if (rules_list.getLength() < 1) continue;
+			Element rules_elem = (Element)rules_list.item(0);
+			NodeList frules_list = rules_elem.getElementsByTagName("ApplyFileRule");
+			// For each file rule
+			for (int j=0; j < frules_list.getLength(); j++) {
+				Element frule_elem = (Element)frules_list.item(j);
+				FileRule frule = (FileRule)fileRules.get(frule_elem.getAttribute("name"));
+				if (frule == null) continue;
+				NodeList prules_list = frule_elem.getElementsByTagName("ApplyParseRule");
+				Vector prules_v = new Vector();
+				// For each parse rule
+				for (int k=0; k < prules_list.getLength(); k++) {
+					Element prule_elem = (Element)prules_list.item(k);
+					ParseRule prule = (ParseRule)parseRules.get(prule_elem.getAttribute("name"));
+					if (prule == null) continue;
+					prules_v.addElement(prule);
+				}
+				if (prules_v.size() < 1) continue;
+				scanDirectory(directory, frule, prules_v, recurse);
+			}
+		}
+		
+		return resultsFound;
+	}
+	
+	private void scanDirectory(File directory, FileRule frule, Vector prules, boolean recurse) throws IOException {
+		
+		// Recursion step
+		if (recurse) {
+			File children[] = directory.listFiles(new java.io.FileFilter(){
+				public boolean accept(File f) {
+					return f.isDirectory();
+				}
+				
+				public String getDescription() {
+					return "";
+				}
+			});
+			for (int i=0; i < children.length; i++) {
+				File new_directory = children[i];
+				scanDirectory(new_directory, frule, prules, recurse);
+			}
+		}
+		// Go through each acceptable file
+		File children[] = directory.listFiles();
+		for (int i=0; i < children.length; i++) {
+			File f = children[i];
+			if (f.isDirectory() || !(frule.applyRule(f.getName()))) continue;
+			FileReader fr = new FileReader(f);
+			BufferedReader br = new BufferedReader(fr);
+			String line = null;
+			int line_count = 0;
+			// Read the file line by line
+			while ((line = br.readLine()) != null) {
+				line_count++;
+				Vector findings = new Vector();
+				// Apply all parse rules to each line
+				for (int j=0; j < prules.size(); j++) {
+					ParseRule prule = (ParseRule)prules.elementAt(j);
+					Vector temp_results = prule.applyRule(line);
+					for (int k=0; k < temp_results.size(); k++) {
+						findings.addElement(temp_results.elementAt(k));
+					}
+				}
+				for (int j=0; j < findings.size(); j++) {
+					String name = (String)findings.elementAt(j);
+					Occurance occ = new Occurance(f.getName(), f.getAbsolutePath(), line_count);
+					// If the name is found in the resource bundles derived hashtable
+					if (results.containsKey(name)) {
+						ScanResult scan_res = (ScanResult)results.get(name);
+						scan_res.addOccurance(occ);
+					} else {
+						// Add it to the missing results
+						ScanResult scan_res = new ScanResult(new BundleItem(null, name, "*unknown*"));
+						scan_res.addOccurance(occ);
+						missing.put(name, scan_res);
+						results.put(name, scan_res);
+					}
+				}
+			}
+		}
+	}
+	
+	private Hashtable getFileRules(Element root) {
+		Hashtable result = new Hashtable();
+		NodeList frules_list = root.getElementsByTagName("FileRules");
+		Element frules_elem = null;
+		if (frules_list.getLength() > 0) frules_elem = (Element)frules_list.item(0);
+		if (frules_elem == null) return result;
+		frules_list = frules_elem.getElementsByTagName("FileRule");
+		for (int i=0; i < frules_list.getLength(); i++) {
+			Element elem = (Element)frules_list.item(i);
+			FileRule frule = new FileRule(elem.getAttribute("name"), elem.getAttribute("starts_with"),
+										  elem.getAttribute("ends_with"), elem.getAttribute("contains"));
+			result.put(elem.getAttribute("name"), frule);
+		}
+		return result;
+	}
+	
+	private Hashtable getParseRules(Element root) {
+		Hashtable result = new Hashtable();
+		NodeList prules_list = root.getElementsByTagName("ParseRules");
+		Element prules_elem = null;
+		if (prules_list.getLength() > 0)
+			prules_elem = (Element)prules_list.item(0);
+		if (prules_elem == null)
+			return result;
+		prules_list = prules_elem.getElementsByTagName("ParseRule");
+		for (int i=0; i < prules_list.getLength(); i++) {
+			Element elem = (Element)prules_list.item(i);
+			ParseRule prule = new ParseRule(elem.getAttribute("name"), elem.getAttribute("follows"),
+											elem.getAttribute("precedes"));
+			result.put(elem.getAttribute("name"), prule);
+		}
+		return result;
+	}
+}
+
+class FileRule {
+	String name;
+	String starts_with;
+	String ends_with;
+	String contains;
+	
+	FileRule(String name, String starts_with, String ends_with, String contains) {
+		this.name = name;
+		this.starts_with = starts_with;
+		this.ends_with = ends_with;
+		this.contains = contains;
+	}
+	
+	boolean applyRule(String source) {
+		boolean accept = true;
+		if (starts_with != null && starts_with.length() > 0 && !(source.startsWith(starts_with))) accept = false;
+		if (ends_with != null && ends_with.length() > 0 && !(source.endsWith(ends_with))) accept = false;
+		if (contains != null && contains.length() > 0 && source.indexOf(contains) < 0) accept = false;
+		return accept;
+	}
+}
+
+class ParseRule {
+	String name;
+	String before;
+	String after;
+	
+	ParseRule(String name, String before, String after) {
+		this.name = name;
+		this.before = before;
+		this.after = after;
+	}
+	
+	// returns the vector of strings found after before and before after
+	
+	Vector applyRule(String source) {
+		Vector v = new Vector();
+		if (before != null && before.length() > 0) {
+			if (after != null && after.length() > 0) {
+				// Both before and after non-empty
+				int before_index = -1;
+				int after_index = -1;
+				while ((before_index = source.indexOf(before, ++before_index)) >= 0) {
+					//before_index = source.indexOf(before, before_index);
+					after_index = -1;
+					after_index = source.indexOf(after, before_index + before.length()+1);
+					if (after_index < 0 || before_index < 0 || before.length() < 0) {
+					    break;
+					}
+					v.addElement(source.substring(before_index + before.length(), after_index));
+					before_index = after_index;
+				}
+			} else {
+				// Before non-empty, after empty
+				int index = -1;
+				while (source.indexOf(before, ++index) >= 0) {
+					index = source.indexOf(before, index);
+					String result = source.substring(index + before.length(), source.length());
+					if (result != null && result.length() > 0) v.addElement(result);
+				}
+			}
+		} else if (after != null && after.length() > 0) {
+			// Before empty, after not
+			int index = -1;
+			while (source.indexOf(after, ++index) >= 0) {
+				index = source.indexOf(before, index);
+				String result = source.substring(0, index);
+				if (result != null && result.length() > 0) v.addElement(result);
+			}
+		} else {
+			// Before and after empty
+			v.addElement(source);
+		}
+		return v;
+	}
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBTMXExporter.java b/unicodetools/com/ibm/rbm/RBTMXExporter.java
new file mode 100644
index 0000000..80aedaa
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBTMXExporter.java
@@ -0,0 +1,225 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.*;
+import javax.swing.*;
+import java.util.*;
+
+import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xml.serialize.*;
+import org.w3c.dom.*;
+
+/**
+ * This class is a plug-in to RBManager that allows the user to export Resource Bundles
+ * along with some of the meta-data associated by RBManager to the TMX specification.
+ * For more information on TMX visit the web site <a href="http://www.lisa.org/tmx/">http://www.lisa.org/tmx/</a>
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBTMXExporter extends RBExporter {
+    private static final String VERSION = "0.5a";
+	
+    /**
+     * Default constructor for the TMX exporter.
+     */
+        
+    public RBTMXExporter() {
+        super();
+		
+        // Initialize the file chooser if necessary
+        if (chooser == null) {
+            chooser = new JFileChooser();
+            chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+                public String getDescription() {
+                    return "TMX Files";
+                }
+                public boolean accept(File f) {
+                    if (f.isDirectory()) return true;
+                    if (f.getName().endsWith(".tmx")) return true;
+                    return false;
+                }
+            });
+        } // end if
+    }
+	
+    private String convertToISO(Date d) {
+        GregorianCalendar gc = new GregorianCalendar();
+        gc.setTime(d);
+        return convertToISO(gc);
+    }
+	
+    private String convertToISO(GregorianCalendar gc) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(String.valueOf(gc.get(Calendar.YEAR)));
+        int month = gc.get(Calendar.MONTH)+1;
+        buffer.append(((month < 10) ? "0" : "") + String.valueOf(month));
+        int day = gc.get(Calendar.DAY_OF_MONTH);
+        buffer.append(((day < 10) ? "0" : "") + String.valueOf(day));
+        buffer.append("T");
+        int hour = gc.get(Calendar.HOUR_OF_DAY);
+        buffer.append(((hour < 10) ? "0" : "") + String.valueOf(hour));
+        int minute = gc.get(Calendar.MINUTE);
+        buffer.append(((minute < 10) ? "0" : "") + String.valueOf(minute));
+        int second = gc.get(Calendar.SECOND);
+        buffer.append(((second < 10) ? "0" : "") + String.valueOf(second));
+        buffer.append("Z");
+        return buffer.toString();
+    }
+	
+    private String convertEncoding(BundleItem item) {
+        if (item != null && item.getParentGroup() != null && item.getParentGroup().getParentBundle() != null) {
+            String language = item.getParentGroup().getParentBundle().getLanguageEncoding();
+            String country = item.getParentGroup().getParentBundle().getCountryEncoding();
+            String variant = item.getParentGroup().getParentBundle().getVariantEncoding();
+            if (language != null && !language.equals("")) {
+                //language = language.toUpperCase();
+                if (country != null && !country.equals("")) {
+                    //country = country.toUpperCase();
+                    if (variant != null && !variant.equals("")) {
+                        //variant = variant.toUpperCase();
+                        return language + "-" + country + "-" + variant;
+                    }
+                    return language + "-" + country;
+                }
+                return language;
+            }
+        }
+        return "";
+    }
+	
+    private void appendTUV(Document xml, Element tu, BundleItem item) {
+        Element tuv = xml.createElement("tuv");
+        tuv.setAttribute("lang", convertEncoding(item));
+        tuv.setAttribute("creationdate",convertToISO(item.getCreatedDate()));
+        tuv.setAttribute("creationid",item.getCreator());
+        tuv.setAttribute("changedate",convertToISO(item.getModifiedDate()));
+        tuv.setAttribute("changeid",item.getModifier());
+        item.getComment();
+        item.isTranslated();
+		
+        Element comment_prop = xml.createElement("prop");
+        comment_prop.appendChild(xml.createTextNode(item.getComment()));
+        comment_prop.setAttribute("type","x-Comment");
+        tuv.appendChild(comment_prop);
+        
+        Element translated_prop = xml.createElement("prop");
+        translated_prop.appendChild(xml.createTextNode(String.valueOf(item.isTranslated())));
+        translated_prop.setAttribute("type","x-Translated");
+        tuv.appendChild(translated_prop);
+		
+        Hashtable lookups = item.getLookups();
+        Enumeration keys = lookups.keys();
+        while (keys.hasMoreElements()) {
+            String key = (String)keys.nextElement();
+            String value = (String)lookups.get(key);
+            Element lookup_prop = xml.createElement("prop");
+            lookup_prop.appendChild(xml.createTextNode(key + "=" + value));
+            lookup_prop.setAttribute("type","x-Lookup");
+            tuv.appendChild(lookup_prop);
+        }
+		
+        Element seg = xml.createElement("seg");
+        seg.appendChild(xml.createTextNode(item.getTranslation()));
+        tuv.appendChild(seg);
+		
+        tu.appendChild(tuv);
+    }
+	
+    public void export(RBManager rbm) throws IOException {
+        if (rbm == null) return;
+        // Open the Save Dialog
+        int ret_val = chooser.showSaveDialog(null);
+        if (ret_val != JFileChooser.APPROVE_OPTION) return;
+        // Retrieve basic file information
+        File file = chooser.getSelectedFile();                  // The file(s) we will be working with
+        File directory = new File(file.getParent());            // The directory we will be writing to
+        String base_name = file.getName();                      // The base name of the files we will write
+        if (base_name == null || base_name.equals("")) base_name = rbm.getBaseClass();
+        if (base_name.endsWith(".tmx")) base_name = base_name.substring(0,base_name.length()-4);
+		
+        String file_name = base_name + ".tmx";
+        
+        Vector bundle_v = rbm.getBundles();
+        Bundle main_bundle = (Bundle)bundle_v.elementAt(0);
+        
+        Document xml = new DocumentImpl();
+        Element root = xml.createElement("tmx");
+        root.setAttribute("version", "1.2");
+        xml.appendChild(root);
+		
+        Element header = xml.createElement("header");
+        Element note = xml.createElement("note");
+        note.appendChild(xml.createTextNode("This document was created automatically by RBManager"));
+        header.appendChild(note);
+        header.setAttribute("creationtool", "RBManager");
+        header.setAttribute("creationtoolversion", VERSION);
+        header.setAttribute("datatype", "PlainText");
+        header.setAttribute("segtype", "sentance");
+        header.setAttribute("adminlang", "en-us");
+        header.setAttribute("srclang", "EN");
+        header.setAttribute("o-tmf", "none");
+        header.setAttribute("creationdate", convertToISO(new Date()));
+        root.appendChild(header);
+		
+        Element body = xml.createElement("body");
+        root.appendChild(body);
+		
+        Vector group_v = main_bundle.getGroupsAsVector();
+        // Loop through each bundle group in main_bundle
+        for (int i=0; i < group_v.size(); i++) {
+            BundleGroup main_group = (BundleGroup)group_v.elementAt(i);
+            // Gather a group of groups of the same name as main_group
+            Vector all_groups_v = new Vector();
+            for (int j=1; j < bundle_v.size(); j++) {
+                Bundle bundle = (Bundle)bundle_v.elementAt(j);
+                if (bundle.hasGroup(main_group.getName())) {
+                    Vector groups = bundle.getGroupsAsVector();
+                    for (int k=0; k < groups.size(); k++) {
+                        BundleGroup group = (BundleGroup)groups.elementAt(k);
+                        if (group.getName().equals(main_group.getName())) all_groups_v.addElement(group);
+                    }
+                }
+            } // end for - j
+            // Loop through each item in main_group
+            for (int j=0; j < main_group.getItemCount(); j++) {
+                BundleItem main_item = main_group.getBundleItem(j);
+                Element tu = xml.createElement("tu");
+                tu.setAttribute("tuid",main_item.getKey());
+                tu.setAttribute("datatype","Text");
+                // Insert the group name for the item
+                Element group_prop = xml.createElement("prop");
+                group_prop.appendChild(xml.createTextNode(main_group.getName()));
+                group_prop.setAttribute("type", "x-Group");
+                tu.appendChild(group_prop);
+                // Add the main_item to the xml
+                appendTUV(xml, tu, main_item);
+                // Loop through the rest of the groups of the same name as main_group
+                for (int k=0; k < all_groups_v.size(); k++) {
+                    BundleGroup group = (BundleGroup)all_groups_v.elementAt(k);
+                    // Loop through the items in each group
+                    for (int l=0; l < group.getItemCount(); l++) {
+                        BundleItem item = group.getBundleItem(l);
+                        if (item.getKey().equals(main_item.getKey())) {
+                            appendTUV(xml, tu, item);
+                            break;
+                        }
+                    } // end for - l
+                } // end for - k
+                body.appendChild(tu);
+            } // end for - j
+        } // end for - i
+        FileWriter fw = new FileWriter(new File(directory,file_name));
+        OutputFormat of = new OutputFormat(xml);
+        of.setIndenting(true);
+        of.setEncoding("ISO-8859-1");
+        XMLSerializer serializer = new XMLSerializer(fw, of);
+        serializer.serialize(xml);
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBTMXImporter.java b/unicodetools/com/ibm/rbm/RBTMXImporter.java
new file mode 100644
index 0000000..fdc8d63
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBTMXImporter.java
@@ -0,0 +1,241 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import java.util.*;
+
+import javax.xml.parsers.*;
+
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+
+/**
+ * This is the super class for all importer plug-in classes. This class defines the methods
+ * and functionality common to all importers. This includes setting up the options dialog and
+ * displaying it to the user, performing the actual insertions into the resource bundle manager,
+ * and managing any import conflicts.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBTMXImporter extends RBImporter {
+	
+    Document tmx_xml = null;
+
+    /**
+     * Basic constructor for the TMX importer from the parent RBManager data and a Dialog title.
+     */
+    
+    public RBTMXImporter(String title, RBManager rbm, RBManagerGUI gui) {
+        super(title, rbm, gui);
+    }
+	
+    protected void setupFileChooser() {
+        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+            public boolean accept(File f) {
+                if (f.isDirectory()) return true;
+                if (f.getName().endsWith(".tmx")) return true;
+                return false;
+            }
+        
+            public String getDescription() {
+                return Resources.getTranslation("import_TMX_file_description");
+            }
+        });
+    }
+	
+    protected void beginImport() throws IOException {
+        super.beginImport();
+        File tmx_file = getChosenFile();
+		
+        try {
+        	FileInputStream fis = new FileInputStream(tmx_file);
+            InputSource is = new InputSource(fis);
+            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        	tmx_xml = builder.parse(is);
+            fis.close();
+        } catch (Exception e) {
+            e.printStackTrace(System.err);
+        	throw new IOException(e.getMessage());
+        }
+        if (tmx_xml == null)
+        	return;
+        
+        importDoc();
+    }
+    
+    private void importDoc() {
+        if (tmx_xml == null)
+        	return;
+        Element root = tmx_xml.getDocumentElement();
+        Node node = root.getFirstChild();
+        while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("header")))) {
+            node = node.getNextSibling();
+        }
+        //ElementImpl header = (ElementImpl)node;
+        node = root.getFirstChild();
+        while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("body")))) {
+            node = node.getNextSibling();
+        }
+        Element body = (Element)node;
+        resolveEncodings(getEncodingsVector(body));
+		
+        // Now do the actual import resource by resource
+        NodeList tu_list = body.getElementsByTagName("tu");
+        for (int i=0; i < tu_list.getLength(); i++) {
+            Element tu_elem = (Element)tu_list.item(i);
+            // Get the key value
+            String name = tu_elem.getAttribute("tuid");
+            if (name == null || name.length() < 1)
+            	continue;
+            // Get the group if it exists
+            String group = null;
+            NodeList prop_list = tu_elem.getElementsByTagName("prop");
+            for (int j=0; j < prop_list.getLength(); j++) {
+                Element prop_elem = (Element)prop_list.item(j);
+                String type = prop_elem.getAttribute("type");
+                if (type != null && type.equals("x-Group")) {
+                    prop_elem.normalize();
+                    NodeList text_list = prop_elem.getChildNodes();
+                    if (text_list.getLength() < 1)
+                    	continue;
+                    Text text_elem = (Text)text_list.item(0);
+                    group = text_elem.getNodeValue();
+                }
+            }
+            if (group == null || group.length() < 1) group = getDefaultGroup();
+            
+            NodeList tuv_list = tu_elem.getElementsByTagName("tuv");
+            // For each tuv element
+            for (int j=0; j < tuv_list.getLength(); j++) {
+                Element tuv_elem = (Element)tuv_list.item(j);
+                String encoding = tuv_elem.getAttribute("lang");
+                // Get the current encoding
+                if (encoding == null) continue;
+                char array[] = encoding.toCharArray();
+                for (int k=0; k < array.length; k++) {
+                    if (array[k] == '-')
+                    	array[k] = '_';
+                }
+                encoding = String.valueOf(array);
+                // Get the translation value
+                NodeList seg_list = tuv_elem.getElementsByTagName("seg");
+                if (seg_list.getLength() < 1)
+                	continue;
+                Element seg_elem = (Element)seg_list.item(0);
+                seg_elem.normalize();
+                NodeList text_list = seg_elem.getChildNodes();
+                if (text_list.getLength() < 1)
+                	continue;
+                Text text_elem = (Text)text_list.item(0);
+                String value = text_elem.getNodeValue();
+                if (value == null || value.length() < 1)
+                	continue;
+                // Create the bundle item
+                BundleItem item = new BundleItem(null, name, value);
+                // Get creation, modification values
+                item.setCreatedDate(tuv_elem.getAttribute("creationdate"));
+                item.setModifiedDate(tuv_elem.getAttribute("changedate"));
+                if (tuv_elem.getAttribute("changeid") != null)
+                	item.setModifier(tuv_elem.getAttribute("changeid"));
+                if (tuv_elem.getAttribute("creationid") != null)
+                	item.setCreator(tuv_elem.getAttribute("creationid"));
+                // Get properties specified
+                prop_list = tuv_elem.getElementsByTagName("prop");
+                Hashtable lookups = null;
+                for (int k=0; k < prop_list.getLength(); k++) {
+                    Element prop_elem = (Element)prop_list.item(k);
+                    String type = prop_elem.getAttribute("type");
+                    if (type != null && type.equals("x-Comment")) {
+                        // Get the comment
+                        prop_elem.normalize();
+                        text_list = prop_elem.getChildNodes();
+                        if (text_list.getLength() < 1) continue;
+                        text_elem = (Text)text_list.item(0);
+                        String comment = text_elem.getNodeValue();
+                        if (comment != null && comment.length() > 0)
+                        	item.setComment(comment);
+                    } else if (type != null && type.equals("x-Translated")) {
+                        // Get the translated flag value
+                        prop_elem.normalize();
+                        text_list = prop_elem.getChildNodes();
+                        if (text_list.getLength() < 1) continue;
+                        text_elem = (Text)text_list.item(0);
+                        if (text_elem.getNodeValue() != null) {
+                            if (text_elem.getNodeValue().equalsIgnoreCase("true"))
+                            	item.setTranslated(true);
+                            else if (text_elem.getNodeValue().equalsIgnoreCase("false"))
+                            	item.setTranslated(false);
+                            else
+                            	item.setTranslated(getDefaultTranslated());
+                        }
+                        else
+                        	item.setTranslated(getDefaultTranslated());
+                    } else if (type != null && type.equals("x-Lookup")) {
+                        // Get a lookup value
+                        prop_elem.normalize();
+                        text_list = prop_elem.getChildNodes();
+                        if (text_list.getLength() < 1)
+                        	continue;
+                        text_elem = (Text)text_list.item(0);
+                        if (text_elem.getNodeValue() != null) {
+                            String text = text_elem.getNodeValue();
+                            if (text.indexOf("=") > 0) {
+                                try {
+                                    if (lookups == null) lookups = new Hashtable();
+                                    String lkey = text.substring(0,text.indexOf("="));
+                                    String lvalue = text.substring(text.indexOf("=")+1,text.length());
+                                    lookups.put(lkey, lvalue);
+                                } catch (Exception ex) { /* String out of bounds - Ignore and go on */ }
+                            }
+                        }
+                        else
+                        	item.setTranslated(getDefaultTranslated());
+                    }
+                }
+                if (lookups != null) item.setLookups(lookups);
+                importResource(item, encoding, group);
+            }
+        }
+    }
+	
+    private Vector getEncodingsVector(Element body) {
+        String empty = "";
+        if (body == null)
+        	return null;
+        Hashtable hash = new Hashtable();
+        NodeList tu_list = body.getElementsByTagName("tu");
+        for (int i=0; i < tu_list.getLength(); i++) {
+            Element tu_elem = (Element)tu_list.item(i);
+            NodeList tuv_list = tu_elem.getElementsByTagName("tuv");
+            for (int j=0; j < tuv_list.getLength(); j++) {
+                Element tuv_elem = (Element)tuv_list.item(j);
+                String encoding = tuv_elem.getAttribute("lang");
+                if (encoding == null)
+                	continue;
+                char array[] = encoding.toCharArray();
+                for (int k=0; k < array.length; k++) {
+                    if (array[k] == '-')
+                    	array[k] = '_';
+                }
+                encoding = String.valueOf(array);
+                if (!(hash.containsKey(encoding)))
+                	hash.put(encoding,empty);
+            }
+        }
+        Vector v = new Vector();
+        Enumeration keys = hash.keys();
+        while (keys.hasMoreElements()) {
+        	v.addElement(keys.nextElement());
+        }
+        return v;
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/RBxliffExporter.java b/unicodetools/com/ibm/rbm/RBxliffExporter.java
new file mode 100644
index 0000000..87e7b6b
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBxliffExporter.java
@@ -0,0 +1,388 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+import java.io.*;
+import java.util.*;
+import java.text.*;
+
+import javax.swing.*;
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+
+import org.w3c.dom.*;
+
+/**
+ * This class is a plug-in to RBManager that allows the user to export Resource Bundles
+ * along with some of the meta-data associated by RBManager to the XLIFF specification.
+ * For more information on XLIFF visit the web site
+ * <a href="http://www.lisa.org/xliff/">http://www.lisa.org/xliff/</a>
+ * 
+ * @author George Rhoten
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBxliffExporter extends RBExporter {
+    private static final String VERSION = "0.7";
+    private static final String XLIFF_DTD = "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd";
+    private static final String XLIFF_PUBLIC_NAME = "-//XLIFF//DTD XLIFF//EN";
+    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+	
+    /**
+     * Default constructor for the XLIFF exporter.
+     */
+        
+    public RBxliffExporter() {
+        super();
+		
+        // Initialize the file chooser if necessary
+        if (chooser == null) {
+            chooser = new JFileChooser();
+            chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+                public String getDescription() {
+                    return "XLIFF Files";
+                }
+                public boolean accept(File f) {
+                    return (f.isDirectory() || f.getName().endsWith(".xlf"));
+                }
+            });
+        }
+    }
+	
+    private String convertToISO(Date d) {
+        GregorianCalendar gc = new GregorianCalendar();
+        gc.setTime(d);
+        return convertToISO(gc);
+    }
+	
+    private String convertToISO(GregorianCalendar gc) {
+    	dateFormat.setCalendar(gc);
+        return dateFormat.format(gc.getTime());
+    }
+	
+    private String getLocale(Bundle item) {
+        String language = item.getLanguageEncoding();
+        if (language != null && !language.equals("")) {
+            //language = language.toUpperCase();
+            String country = item.getCountryEncoding();
+            if (country != null && !country.equals("")) {
+                //country = country.toUpperCase();
+                String variant = item.getVariantEncoding();
+                if (variant != null && !variant.equals("")) {
+                    //variant = variant.toUpperCase();
+                    return language + "-" + country + "-" + variant;
+                }
+                return language + "-" + country;
+            }
+            return language;
+        }
+        return "";
+    }
+
+    private String getParentLocale(String locale) {
+    	
+    	int truncIndex = locale.lastIndexOf('-');
+    	if (truncIndex > 0) {
+    		locale = locale.substring(0, truncIndex);
+    	}
+    	else {
+    		locale = "";
+    	}
+    	return locale;
+    }
+	
+    private void addTransUnit(Document xml, Element groupElem, BundleItem item, BundleItem parent_item) {
+        Element transUnit = xml.createElement("trans-unit");
+        transUnit.setAttribute("date",convertToISO(item.getModifiedDate()));
+        transUnit.setAttribute("id",item.getKey());
+		
+        String sourceOrTarget = "target";
+        if (parent_item == null) {
+        	sourceOrTarget = "source";
+        }
+        else {
+            Element source = xml.createElement("source");
+            source.setAttribute("xml:space","preserve");
+            source.appendChild(xml.createTextNode(parent_item.getTranslation()));
+            transUnit.appendChild(source);
+        }
+        Element target = xml.createElement(sourceOrTarget);
+        target.setAttribute("xml:space","preserve");
+    	// This is different from the translate attribute
+        if (item.isTranslated()) {
+        	// TODO Handle the other states in the future.
+        	transUnit.setAttribute("state", "translated");
+        }
+        target.appendChild(xml.createTextNode(item.getTranslation()));
+        transUnit.appendChild(target);
+		
+        if (item.getComment() != null && item.getComment().length() > 1) {
+	        Element comment_prop = xml.createElement("note");
+	        comment_prop.setAttribute("xml:space","preserve");
+	        comment_prop.appendChild(xml.createTextNode(item.getComment()));
+	        transUnit.appendChild(comment_prop);
+        }
+        
+        if ((item.getCreator() != null && item.getCreator().length() > 1)
+        	|| (item.getModifier() != null && item.getModifier().length() > 1))
+        {
+            Element transUnit_prop_group_elem = xml.createElement("prop-group");
+
+            if (item.getCreator() != null && item.getCreator().length() > 1) {
+	            Element creator_prop = xml.createElement("prop");
+	            creator_prop.setAttribute("prop-type","creator");
+	            creator_prop.appendChild(xml.createTextNode(item.getCreator()));
+		        transUnit_prop_group_elem.appendChild(creator_prop);
+            }
+	        
+            if (item.getCreator() != null && item.getCreator().length() > 1) {
+	            Element created_prop = xml.createElement("prop");
+	            created_prop.setAttribute("prop-type","created");
+	            created_prop.appendChild(xml.createTextNode(convertToISO(item.getCreatedDate())));
+		        transUnit_prop_group_elem.appendChild(created_prop);
+            }
+	        
+        	if (item.getModifier() != null && item.getModifier().length() > 1) {
+		        Element modifier_prop = xml.createElement("prop");
+		        modifier_prop.setAttribute("prop-type","modifier");
+		        modifier_prop.appendChild(xml.createTextNode(item.getModifier()));
+		        transUnit_prop_group_elem.appendChild(modifier_prop);
+        	}
+	        
+	        transUnit.appendChild(transUnit_prop_group_elem);
+        }
+
+        groupElem.appendChild(transUnit);
+    }
+	
+    public void export(RBManager rbm) throws IOException {
+        if (rbm == null)
+        	return;
+        // Open the Save Dialog
+        int ret_val = chooser.showSaveDialog(null);
+        if (ret_val != JFileChooser.APPROVE_OPTION)
+        	return;
+        // Retrieve basic file information
+        File file = chooser.getSelectedFile();              // The file(s) we will be working with
+        File directory = new File(file.getParent());        // The directory we will be writing to
+        String base_name = file.getName();                  // The base name of the files we will write
+        if (base_name == null || base_name.equals(""))
+        	base_name = rbm.getBaseClass();
+        if (base_name.endsWith(".xlf"))
+        	base_name = base_name.substring(0,base_name.length()-4);
+		
+        String file_name = base_name + ".xlf";
+        
+        Vector bundle_v = rbm.getBundles();
+        Enumeration bundleIter = bundle_v.elements();
+        while (bundleIter.hasMoreElements()) {
+        	exportFile(rbm, directory, base_name, (Bundle)bundleIter.nextElement());
+        }
+    }
+    
+    private void addHeaderProperties(Document xml, Element header, Bundle main_bundle) {
+        if (main_bundle.comment != null && main_bundle.comment.length() > 0) {
+            Element note = xml.createElement("note");
+        	header.appendChild(note);
+            note.appendChild(xml.createTextNode(main_bundle.comment));
+            note.setAttribute("xml:space","preserve");
+        }
+        if ((main_bundle.name != null && main_bundle.name.length() > 0)
+    		|| (main_bundle.manager != null && main_bundle.manager.length() > 0)
+        	|| (main_bundle.language != null && main_bundle.language.length() > 0)
+			|| (main_bundle.country != null && main_bundle.country.length() > 0)
+			|| (main_bundle.variant != null && main_bundle.variant.length() > 0))
+        {
+            Element prop_group = xml.createElement("prop-group");
+        	header.appendChild(prop_group);
+            if (main_bundle.name != null && main_bundle.name.length() > 0) {
+                Element prop = xml.createElement("prop");
+            	header.appendChild(prop);
+            	prop.setAttribute("xml:space","preserve");
+            	prop.setAttribute("prop-type","name");
+            	prop.appendChild(xml.createTextNode(main_bundle.name));
+            	prop_group.appendChild(prop);
+            }
+            if (main_bundle.manager != null && main_bundle.manager.length() > 0) {
+                Element prop = xml.createElement("prop");
+            	header.appendChild(prop);
+            	prop.setAttribute("xml:space","preserve");
+            	prop.setAttribute("prop-type","manager");
+            	prop.appendChild(xml.createTextNode(main_bundle.manager));
+            	prop_group.appendChild(prop);
+            }
+            if (main_bundle.language != null && main_bundle.language.length() > 0) {
+                Element prop = xml.createElement("prop");
+            	header.appendChild(prop);
+            	prop.setAttribute("xml:space","preserve");
+            	prop.setAttribute("prop-type","language");
+            	prop.appendChild(xml.createTextNode(main_bundle.language));
+            	prop_group.appendChild(prop);
+            }
+            if (main_bundle.country != null && main_bundle.country.length() > 0) {
+                Element prop = xml.createElement("prop");
+            	header.appendChild(prop);
+            	prop.setAttribute("xml:space","preserve");
+            	prop.setAttribute("prop-type","country");
+            	prop.appendChild(xml.createTextNode(main_bundle.country));
+            	prop_group.appendChild(prop);
+            }
+            if (main_bundle.variant != null && main_bundle.variant.length() > 0) {
+                Element prop = xml.createElement("prop");
+            	header.appendChild(prop);
+            	prop.setAttribute("xml:space","preserve");
+            	prop.setAttribute("prop-type","variant");
+            	prop.appendChild(xml.createTextNode(main_bundle.variant));
+            	prop_group.appendChild(prop);
+            }
+        }
+    }
+    
+    private void exportFile(RBManager rbm, File directory, String base_name, Bundle main_bundle)
+    	throws IOException
+    {
+        Bundle parent_bundle = null;
+        String parent_bundle_name = null;
+        if (!getLocale(main_bundle).equals("")) {
+        	// If this isn't the root locale, find the parent
+            parent_bundle_name = getParentLocale(getLocale(main_bundle));
+	        do {
+	        	parent_bundle = rbm.getBundle(parent_bundle_name);
+	        	if (parent_bundle != null) {
+	        		break;
+	        	}
+	            parent_bundle_name = getParentLocale(parent_bundle_name);
+	        } while (!parent_bundle_name.equals(""));
+        }
+
+        
+        // Find the implementation
+        DocumentBuilder builder;
+        try {
+        	builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        }
+        catch (ParserConfigurationException pce) {
+        	throw new IOException(pce.getMessage());
+        }
+        
+        // Create the document
+        Document xml = builder.getDOMImplementation().createDocument(null, "xliff", null);
+         
+        // Fill the document
+        Element root = xml.getDocumentElement();
+        root.setAttribute("version", "1.1");
+        //root.appendChild(root);
+        
+        Element file_elem = xml.createElement("file");
+        String mainLocale = getLocale(main_bundle);
+        Bundle parentBundle = null;
+        if (mainLocale.equals("")) {
+        	file_elem.setAttribute("source-language", getLocale(main_bundle));
+        }
+        else {
+        	file_elem.setAttribute("source-language", parent_bundle_name);
+        	file_elem.setAttribute("target-language", getLocale(main_bundle));
+        }
+        file_elem.setAttribute("datatype", "plaintext");
+        file_elem.setAttribute("date", convertToISO(new Date()));
+        root.appendChild(file_elem);
+		
+        Element header = xml.createElement("header");
+        Element tool = xml.createElement("tool");
+        tool.setAttribute("tool-name", "RBManager");
+        tool.setAttribute("tool-id", "RBManager");
+        tool.setAttribute("tool-version", VERSION);
+        // TODO Add file attribute
+        //header.setAttribute("file", "");
+        header.appendChild(tool);
+        addHeaderProperties(xml, header, main_bundle);
+        file_elem.appendChild(header);
+		
+        Element body = xml.createElement("body");
+        file_elem.appendChild(body);
+		
+        Vector group_v = main_bundle.getGroupsAsVector();
+        Vector parent_group_v = null;
+        if (parent_bundle != null) {
+        	parent_group_v = parent_bundle.getGroupsAsVector();
+        }
+        // Loop through each bundle group in main_bundle
+        for (int i=0; i < group_v.size(); i++) {
+            BundleGroup curr_group = (BundleGroup)group_v.elementAt(i);
+            BundleGroup parent_group = null;
+            if (parent_group_v != null) { 
+	            Enumeration parentGroupIter = parent_group_v.elements();
+	            
+	            while (parentGroupIter.hasMoreElements()) {
+	            	BundleGroup groupToFind = (BundleGroup)parentGroupIter.nextElement();
+	            	if (groupToFind.getName().equals(curr_group.getName())) {
+	            		parent_group = groupToFind;
+	            		break;
+	            	}
+	            }
+            }
+            Element group_elem = xml.createElement("group");
+            group_elem.setAttribute("id", curr_group.getName());
+            if (curr_group.getComment() != null && curr_group.getComment().length() > 1) {
+    	        Element comment_prop = xml.createElement("note");
+    	        comment_prop.setAttribute("xml:space","preserve");
+    	        comment_prop.appendChild(xml.createTextNode(curr_group.getComment()));
+    	        group_elem.appendChild(comment_prop);
+            }
+            
+            Vector group_items = curr_group.getItemsAsVector();
+            for (int j=0; j < group_items.size(); j++) {
+            	BundleItem main_item = (BundleItem)group_items.get(j);
+            	BundleItem parent_item = null;
+            	if (parent_group != null) {
+	            	Enumeration parentIter = parent_group.getItemsAsVector().elements();
+	            	BundleItem itemToFind = null;
+	                while (parentIter.hasMoreElements()) {
+	                	itemToFind = (BundleItem)parentIter.nextElement();
+	                	if (itemToFind.getKey().equals(main_item.getKey())) {
+	                		parent_item = itemToFind;
+	                		break;
+	                	}
+	                }
+            	}
+                addTransUnit(xml, group_elem, main_item, parent_item);
+                //group_elem.appendChild(tu);
+            }
+            body.appendChild(group_elem);
+        } // end for - i
+        String suffix = mainLocale;
+        if (!suffix.equals("")) {
+        	suffix = '_' + suffix;
+        }
+        char array[] = suffix.toCharArray();
+        for (int k=0; k < array.length; k++) {
+            if (array[k] == '-')
+                array[k] = '_';
+        }
+        suffix = String.valueOf(array);
+        
+        // serialize document
+        OutputStreamWriter osw = new OutputStreamWriter(
+        		new FileOutputStream(new File(directory, base_name + suffix + ".xlf")), "UTF-8");
+        try {
+			Transformer transformer = TransformerFactory.newInstance().newTransformer();
+			transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+			transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, XLIFF_DTD);
+			transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, XLIFF_PUBLIC_NAME);
+			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+			transformer.transform(new DOMSource(xml), new StreamResult(osw));
+        }
+        catch (TransformerException te) {
+        	throw new IOException(te.getMessage());
+        }
+        
+        osw.close();
+    }
+}
diff --git a/unicodetools/com/ibm/rbm/RBxliffImporter.java b/unicodetools/com/ibm/rbm/RBxliffImporter.java
new file mode 100644
index 0000000..5aec430
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/RBxliffImporter.java
@@ -0,0 +1,335 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.*;
+import java.util.*;
+
+import javax.xml.parsers.*;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+import org.xml.sax.*;
+import org.w3c.dom.*;
+
+/**
+ * This imports XLIFF files into RBManager.
+ * For more information see
+ * <a href="http://www.oasis-open.org/committees/xliff/documents/xliff-specification.htm">
+ * http://www.oasis-open.org/committees/xliff/documents/xliff-specification.htm</a>
+ * 
+ * @author George Rhoten
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBxliffImporter extends RBImporter {
+	
+    Document xlf_xml = null;
+
+    /**
+     * Basic constructor for the XLIFF importer from the parent RBManager data and a Dialog title.
+     */
+    public RBxliffImporter(String title, RBManager rbm, RBManagerGUI gui) {
+        super(title, rbm, gui);
+    }
+	
+    protected void setupFileChooser() {
+        chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
+            public boolean accept(File f) {
+                return (f.isDirectory() || f.getName().endsWith(".xlf"));
+            }
+        
+            public String getDescription() {
+                return Resources.getTranslation("import_XLF_file_description");
+            }
+        });
+    }
+	
+    protected void beginImport() throws IOException {
+        super.beginImport();
+        File xlf_file = getChosenFile();
+		
+        try {
+        	FileInputStream fis = new FileInputStream(xlf_file);
+            InputSource is = new InputSource(fis);
+            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+            xlf_xml = builder.parse(is);
+            fis.close();
+        }
+        catch (SAXException e) {
+            e.printStackTrace(System.err);
+        	throw new IOException(e.getMessage());
+        }
+        catch (ParserConfigurationException pce) {
+            pce.printStackTrace(System.err);
+        	throw new IOException(pce.getMessage());
+        }
+        if (xlf_xml == null)
+        	return;
+        
+        importDoc();
+        
+    }
+    
+    private void importDoc() {
+        if (xlf_xml == null)
+            return;
+        String language = "";
+        String bundle_note = null;
+    	String bundle_name = null;
+    	String manager_name = null;
+    	String language_name = null;
+    	String country_name = null;
+    	String variant_name = null;
+        
+        Element root = xlf_xml.getDocumentElement();
+        Node fileNode = root.getFirstChild();
+        Node header = null;
+        Node node = null;
+        while (fileNode != null && !(fileNode instanceof Element && fileNode.getNodeName().equalsIgnoreCase("file"))) {
+            fileNode = fileNode.getNextSibling();
+        }
+        header = fileNode.getFirstChild();
+        while (header != null
+        		&& !(header.getNodeType() == Node.ELEMENT_NODE
+        		&& (header.getNodeName().equalsIgnoreCase("header")
+				|| header.getNodeName().equalsIgnoreCase("body"))))
+        {
+        	header = header.getNextSibling();
+        }
+        if (header.getNodeName().equalsIgnoreCase("header")) {
+        	// Get the notes if from the header if they exist.
+            NodeList header_note_list = ((Element)header).getElementsByTagName("note");
+            if (header_note_list.getLength() > 0) {
+	            Text text_elem = (Text)header_note_list.item(0).getChildNodes().item(0);
+	            if (text_elem != null) {
+		            String value = text_elem.getNodeValue();
+		            if (value != null && value.length() > 0) {
+		            	bundle_note = value;
+		            }
+	            }
+            }
+            Node prop_group_list = ((Element)header).getElementsByTagName("prop-group").item(0);
+            NodeList prop_list = prop_group_list.getChildNodes();
+        	int propertyNum = prop_list.getLength();
+            if (propertyNum > 0) {
+                for (int prop = 0; prop < propertyNum; prop++) {
+                	if (prop_list.item(prop) instanceof Element) {
+    	            	Element property_elem = (Element)prop_list.item(prop);
+    	            	String propertyType = property_elem.getAttribute("prop-type");
+    	            	if (propertyType != null) {
+    			            String value = property_elem.getChildNodes().item(0).getNodeValue();
+    			            if (value != null && value.length() > 0) {
+    			            	if (propertyType.equals("name")) {
+    				            	bundle_name = value;
+    			            	}
+    			            	else if (propertyType.equals("manager")) {
+    				            	manager_name = value;
+    			            	}
+    			            	else if (propertyType.equals("language")) {
+    				            	language_name = value;
+    			            	}
+    			            	else if (propertyType.equals("country")) {
+    			            		country_name = value;
+    			            	}
+    			            	else if (propertyType.equals("variant")) {
+    			            		variant_name = value;
+    			            	}
+    			            }
+    	            	}
+                	}
+                }
+            }
+        }
+        node = header.getNextSibling();
+        while (node != null && !(node instanceof Element && node.getNodeName().equalsIgnoreCase("body"))) {
+            node = node.getNextSibling();
+        }
+        
+        Element body = (Element)node;
+        //resolveEncodings(getEncodingsVector(body));
+        
+        String sourceLocale = ((Element)fileNode).getAttribute("source-language");
+        String targetLocale = ((Element)fileNode).getAttribute("target-language");
+        if (!sourceLocale.equals("")) {
+            language = sourceLocale;
+        }
+        if (!targetLocale.equals("")) {
+            // The target language is the real data. The source is only for reference.
+            // We could do verification that all the data is translated the same though.
+            language = targetLocale;
+        }
+		
+        // Now do the actual import resource by resource
+        NodeList tu_list = body.getElementsByTagName("group");
+        int body_nodes_length = body.getChildNodes().getLength();
+        NodeList body_list = body.getChildNodes();
+        int groupCount = 0, elementCount = 0;
+        Node last_group_node = null;
+        for (int i=0; i < body_nodes_length; i++) {
+            Node body_elem = body_list.item(i);
+	        if (body_elem.getNodeType() == Node.ELEMENT_NODE) {
+	            if (body_elem.getNodeName().equalsIgnoreCase("group")) {
+		            groupCount++;
+		            last_group_node = body_elem;
+		        }
+	            elementCount++;
+	        }
+        }
+        if (elementCount == 1 && groupCount == 1) {
+	        // ICU style group where the top group is just the locale.
+	        Element localeNode = (Element)last_group_node; 
+	        tu_list = last_group_node.getChildNodes();
+            String rootGroupName = localeNode.getAttribute("id");
+            if (rootGroupName != null && rootGroupName.equals("root")) {
+                rootGroupName = "";
+            }
+            // It's done this way because ICU handles rfc3066bis (the successor of rfc3066)
+            // XLIFF requires rfc3066, which doesn't handle scripts.
+            language = rootGroupName;
+        }
+        
+        // Add the locale if needed, and normalize it to the correct format.
+        Vector localeNames = new Vector();
+        char array[] = language.toCharArray();
+        for (int k=0; k < array.length; k++) {
+            if (array[k] == '-')
+                array[k] = '_';
+        }
+        language = String.valueOf(array);
+        localeNames.add(language);
+        resolveEncodings(localeNames);
+        Bundle main_bundle = rbm.getBundle(language);
+		main_bundle.name = bundle_name;
+		main_bundle.comment = bundle_note;
+		main_bundle.manager = manager_name;
+		main_bundle.language = language_name;
+		main_bundle.country = country_name;
+		main_bundle.variant = variant_name;
+
+        for (int i=0; i < tu_list.getLength(); i++) {
+            if (!(tu_list.item(i) instanceof Element)) {
+                continue;
+            }
+            Element tu_elem = (Element)tu_list.item(i);
+            
+            // Get the key value
+            String name = tu_elem.getAttribute("id");
+            if (name == null || name.length() < 1)
+                continue;
+            // Get the group if it exists
+            String group = null;
+            if (tu_elem.getNodeName().equalsIgnoreCase("group")) {
+                group = name;
+                String groupComment = "";
+                NodeList notes_list = tu_elem.getElementsByTagName("note");
+                if (notes_list.getLength() > 0) {
+    	            Text text_elem = (Text)notes_list.item(0).getChildNodes().item(0);
+    	            String value = text_elem.getNodeValue();
+    	            if (value != null && value.length() > 0) {
+    	            	groupComment = value;
+    	            }
+                }
+                rbm.createGroup(group, groupComment);
+                //NodeList group_list = tu_elem.getElementsByTagName("group");
+            }
+            
+            if (group == null || group.length() < 1) {
+                group = getDefaultGroup();
+                parseTranslationUnit(language, group, tu_elem);
+            }
+            
+            NodeList trans_unit_list = tu_elem.getElementsByTagName("trans-unit");
+            // For each trans-unit element
+            for (int j=0; j < trans_unit_list.getLength(); j++) {
+                parseTranslationUnit(language, group, (Element)trans_unit_list.item(j));
+            }
+        }
+    }
+
+    private void parseTranslationUnit(String language, String group, Element trans_unit_elem) {
+        // Get the translation value
+    	Node target_elem = trans_unit_elem.getElementsByTagName("target").item(0);
+        if (target_elem == null) {
+            // This is a template, or a skeleton
+            target_elem = trans_unit_elem.getElementsByTagName("source").item(0);
+        }
+        // If there is a source or target, even if empty, it must be parsed.
+        if (target_elem == null)
+            return;
+        target_elem.normalize();
+        NodeList text_list = target_elem.getChildNodes();
+        if (text_list.getLength() < 1)
+            return;
+        Text text_elem = (Text)text_list.item(0);
+        String transValue = text_elem.getNodeValue();
+        if (transValue == null || transValue.length() < 1)
+            return;
+        /*NamedNodeMap attribMap = trans_unit_elem.getAttributes();
+        for (int k = 0; k < attribMap.getLength(); k++) {
+            String attribMapName = attribMap.item(k).getNodeName();
+            System.out.println(attribMapName);
+        }*/
+        String name = trans_unit_elem.getAttribute("id");
+        if (name == null || name.length() < 1)
+            return;
+        // Create the bundle item
+        BundleItem item = new BundleItem(null, name, transValue);
+        // Get creation, modification values
+
+        String state = trans_unit_elem.getAttribute("state");
+        if (state != null && state.length() > 0) {
+            item.setTranslated(state.equalsIgnoreCase("translated"));
+        }
+
+        String date = trans_unit_elem.getAttribute("date");
+        if (date != null && date.length() > 0) {
+            item.setModifiedDate(date);
+        }
+
+        Element note_elem = (Element)trans_unit_elem.getElementsByTagName("note").item(0);
+        if (note_elem != null) {
+            NodeList note_list = note_elem.getChildNodes();
+            if (note_list.getLength() > 0) {
+	            Text note_text_elem = (Text)note_list.item(0);
+	            String comment = note_text_elem.getNodeValue();
+	            if (comment != null && comment.length() > 0) {
+	            	item.setComment(comment);
+	            }
+            }
+        }
+
+        Element prop_group_elem = (Element)trans_unit_elem.getElementsByTagName("prop-group").item(0);
+        if (prop_group_elem != null) {
+            NodeList prop_list = prop_group_elem.getChildNodes();
+        	int propertyLen = prop_list.getLength();
+            for (int prop = 0; prop < propertyLen; prop++) {
+            	if (prop_list.item(prop) instanceof Element) {
+	            	Element property_elem = (Element)prop_list.item(prop);
+	            	String propertyType = property_elem.getAttribute("prop-type");
+	            	if (propertyType != null) {
+			            String value = property_elem.getChildNodes().item(0).getNodeValue();
+			            if (value != null && value.length() > 0) {
+			            	if (propertyType.equals("creator")) {
+				            	item.setCreator(value);
+			            	}
+			            	else if (propertyType.equals("created")) {
+				            	item.setCreatedDate(value);
+			            	}
+			            	else if (propertyType.equals("modifier")) {
+				            	item.setModifier(value);
+			            	}
+			            }
+	            	}
+            	}
+            }
+        }
+
+//        if (lookups != null)
+//            item.setLookups(lookups);
+        importResource(item, language, group);
+    }
+}
diff --git a/unicodetools/com/ibm/rbm/Resources.java b/unicodetools/com/ibm/rbm/Resources.java
new file mode 100644
index 0000000..9d4976a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/Resources.java
@@ -0,0 +1,246 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.io.*;
+import java.net.URL;
+import java.net.JarURLConnection;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.zip.ZipEntry;
+
+import com.ibm.rbm.gui.RBManagerGUI;
+
+/**
+ * A class not to be instantiated. Provides methods for translating items from a resource bundle. To use this class
+ * make sure you first call initBundle(). Once this is done, calling any of the getTranslation() methods will return
+ * the appropriate String.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class Resources {
+    private static ResourceBundle resource_bundle;
+    private static Locale locale;
+
+    /**
+     * Initialize the properties of this resource bundle. This method must be called once before any
+     * other method can be called (unless that method performs a check that calls this method). This is
+     * also the method to use in case the resource data on the data store has changed and those changes
+     * need to be reflected in future use of this class.
+     */
+	
+    public static void initBundle() {
+        try {
+            if (locale == null) locale = Locale.getDefault();
+            resource_bundle = ResourceBundle.getBundle("com/ibm/rbm/resources/RBManager", locale);
+        } catch(MissingResourceException mre) {
+            System.err.println("Missing Resource for default locale, " + Locale.getDefault().toString());
+            mre.printStackTrace(System.err);
+        }
+    }
+    
+    /**
+     * Set the locale to be used when making a query on the resource
+     */
+    
+    public static void setLocale(Locale locale) {
+        try {
+            Resources.locale = locale;
+            Resources.resource_bundle = ResourceBundle.getBundle("com/ibm/rbm/resources/RBManager", locale);
+        } catch (MissingResourceException mre) {
+            System.err.println("Missing Resource for locale, " + locale.toString());
+            mre.printStackTrace(System.err);
+        }
+    }
+
+    /**
+     * Returns the currently set Locales object.
+     */
+	
+    public static Locale getLocale() {
+        if (Resources.locale == null) Resources.initBundle();
+        return Resources.locale;
+    }
+    
+    /**
+     * Returns an array of strings containing the locale encoding (e.g. 'en_US', 'de', etc.)
+     * of the locales defined in the current resource bundle. These are all of the locales for
+     * which unique translation of resource bundle items are possible. If a locale encoding is
+     * used to query on that is not in this array, the base class translation will be returned.
+     */
+	
+    public static String[] getAvailableLocales() {
+        //Locale loc[] = null;
+        String list[] = new String[0];
+        Vector locVect = new Vector();
+        try {
+            URL resURL = ClassLoader.getSystemResource("com/ibm/rbm/resources/RBManager.properties");
+            JarURLConnection resConnection = (JarURLConnection)resURL.openConnection();
+            Enumeration enumRes = resConnection.getJarFile().entries();
+            String baseName = "com/ibm/rbm/resources/RBManager";
+            while (enumRes.hasMoreElements()) {
+                String entryName = ((ZipEntry)enumRes.nextElement()).getName();
+                if (entryName.startsWith(baseName)) {
+                    entryName = entryName.substring(baseName.length(), entryName.lastIndexOf('.'));
+                    if (entryName.startsWith("_")) {
+                        entryName = entryName.substring(1);
+                    }
+                    else if (entryName.length() == 0) {
+                        /* For our resources we consider root as English */
+                        entryName = "en";
+                    }
+                    locVect.add(entryName);
+                }
+            }
+
+/*            File locDir = new File("resources");
+            list = locDir.list(new FilenameFilter() {
+                public boolean accept(File dir, String name) {
+                    boolean accept = true;
+                    if (!name.toLowerCase().endsWith(".properties")) accept = false; // Must be property file
+                    if (!name.startsWith("RBManager")) accept = false;               // Must be a RBManager file
+                    if (name.equals("RBManager.properties")) accept = false;         // Base class does not count
+                    return accept;
+                }
+            });
+*/
+            int listSize = locVect.size();
+            list = new String[listSize];
+            for (int i=0; i < listSize; i++) {
+                list[i] = (String)locVect.get(i);
+            }
+        }
+        catch (IOException ioe) {
+            System.err.println("Can't get resources");
+            ioe.printStackTrace(System.err);
+        }
+        catch (ClassCastException cce) {
+            System.err.println("Can't get resources");
+            cce.printStackTrace(System.err);
+        }
+        return list;
+    }
+
+    /**
+     * Looks up a translation in the currently set Locale by the NLS lookup key provided.
+     * If no resource by that key is found, the key itself is returned.
+     */
+	
+    public static String getTranslation(String key) {
+        if (key == null || resource_bundle == null) return "";
+        try {
+            String retStr = resource_bundle.getString(key);
+            return retStr;
+        } catch (Exception e) {
+            return key;
+        }
+    }
+	
+    /**
+     * Given a locale encoding, returns the language portion of that encoding.
+     *<br>
+     * For instance 'en', 'en_US', 'en_GB', all return 'en'
+     */
+        
+    public static String getLanguage(String encoding) {
+        if (encoding == null) return null;
+        if (encoding.indexOf("_") < 0) return encoding.trim();
+        return encoding.substring(0, encoding.indexOf("_"));
+    }
+    
+    /**
+     * Given a locale encoding, returns the country portion of that encoding.
+     * <br>
+     * For instance 'en_US', 'sp_US', both return 'US'
+     * <br>
+     * Returns null if no country is specified (e.g. 'en' or 'de')
+     */
+    
+    public static String getCountry(String encoding) {
+        if (encoding == null) return null;
+        if (encoding.indexOf("_") < 0) return null;
+        String result = encoding.substring(encoding.indexOf("_")+1, encoding.length());
+        if (result.indexOf("_") < 0) return result.trim();
+        return result.substring(0, encoding.indexOf("_"));
+    }
+    
+    /**
+     * Given a locale encoding, returns the variant portion of that encoding.
+     * <br>
+     * For instance 'en_GB_EURO', 'de_DE_EURO', both return 'EURO'
+     * <br>
+     * Returns null if no variant is specified (e.g. 'en' or 'en_US')
+     */
+    
+    public static String getVariant(String encoding) {
+        RBManagerGUI.debugMsg(encoding);
+        if (encoding == null) return null;
+        if (encoding.indexOf("_") < 0) return null;
+        String result = encoding.substring(encoding.indexOf("_")+1, encoding.length());
+        if (result.indexOf("_") < 0) return null;
+        result = result.substring(result.indexOf("_")+1, result.length());
+        return result.trim();
+    }
+
+    /**
+     * Gets a translation given the currently set locale, a lookup key, and a single lookup item replacement.
+     * For an understanding of the lookup item replacement see getTranslation(String key, String[] lookup).
+     */
+	
+    public static String getTranslation(String key, String lookup) {
+        if (key == null || resource_bundle == null) return "";
+        try {
+            Object objects[] = {lookup};
+            String retStr = resource_bundle.getString(key);
+            retStr = MessageFormat.format(retStr, objects);
+            return retStr;
+        } catch (Exception e) {
+            return key;
+        }
+    }
+    
+    /**
+     * Gets a translation given the currently set locale, a lookup key, and zero or more lookup item replacements.
+     * Lookup items are contextual translation material stored in the resource according to the format dictated in
+     * the java.text package. In short, numbered markers are replaced by strings passed in as parameters.
+     * <p>
+     * For example, suppose you have the following resource:
+     * <p>
+     * myResource = Hello {1}, Isn't this a great {2}?
+     * <p>
+     * You want to replace the '{1}' witht the current user name and the '{2}' with the name of the day today.
+     * You can do this by calling:
+     * <p>
+     * String lookups[] = { "Joe", "Friday" };
+     * <br>
+     * Resources.getTranslation("myResource", lookups);
+     * <p>
+     * The result would be:
+     * <p>
+     * 'Hello Joe, Isn't this a great Friday?'
+     * <p>
+     * This method (as well as the getTranslation(String key, String lookup) method) is useful for using nested
+     * lookups from the resource bundle. For instance, the above line could be replaced with:
+     * <p>
+     * String lookups[] = { getUserName(), Resources.getTranslation("Friday") };
+     */
+    
+    public static String getTranslation(String key, String[] lookup) {
+        if (key == null || resource_bundle == null) return "";
+        try {
+            Object objects[] = new Object[lookup.length];
+            for (int i=0; i < lookup.length; i++) objects[i] = lookup[i];
+            String retStr = resource_bundle.getString(key);
+            retStr = MessageFormat.format(retStr, lookup);
+            return retStr;
+        } catch (Exception e) {
+            return key;
+        }
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/ScanResult.java b/unicodetools/com/ibm/rbm/ScanResult.java
new file mode 100644
index 0000000..91a2c01
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/ScanResult.java
@@ -0,0 +1,52 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm;
+
+
+import java.util.*;
+
+/**
+ * This class represents the results found for each resource key while
+ * performing the code scan done by RBReporter.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBReporter
+ */
+public class ScanResult {
+    BundleItem item;
+    Vector occurances;
+    
+    ScanResult(BundleItem item) {
+        this.item = item;
+        occurances = new Vector();
+    }
+	
+    BundleItem getItem() {
+        return item;
+    }
+	
+    int getNumberOccurances() {
+        return occurances.size();
+    }
+	
+    Vector getOccurances() {
+        return occurances;
+    }
+	
+    void addOccurance(Occurance o) {
+        occurances.addElement(o);
+    }
+	
+    String getName() {
+        return item.getKey();
+    }
+	
+    String getGroupName() {
+        if (item.getParentGroup() != null) return item.getParentGroup().getName();
+        return "Unknown";
+    }
+}
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/compile.bat b/unicodetools/com/ibm/rbm/compile.bat
new file mode 100755
index 0000000..8512d56
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/compile.bat
@@ -0,0 +1,26 @@
+@echo off
+
+rem *****************************************************************************
+rem * Copyright (C) 2000-2002, International Business Machines Corporation and  *
+rem * others. All Rights Reserved.                                              *
+rem *****************************************************************************
+
+cd ..\..\..\
+echo compiling source code %1
+javac -d . -classpath com/ibm/rbm/lib/xerces.jar -deprecation %1 com/ibm/rbm/*.java com/ibm/rbm/gui/*.java
+if errorlevel 1 goto error
+
+echo creating jar file
+erase com\ibm\rbm\RBManager.jar
+jar cfm com/ibm/rbm/RBManager.jar com/ibm/rbm/manifest.stub com/ibm/rbm/*.class com/ibm/rbm/gui/*.class com/ibm/rbm/gui/images/*.gif com/ibm/rbm/resources/RBManager*.properties
+if errorlevel 1 goto error
+
+echo cleaning up class files
+cd com\ibm\rbm
+erase *.class gui\*.class
+goto end
+
+:error
+cd com\ibm\rbm
+pause
+:end
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/compile.sh b/unicodetools/com/ibm/rbm/compile.sh
new file mode 100755
index 0000000..c6a8799
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/compile.sh
@@ -0,0 +1,19 @@
+# *****************************************************************************
+# * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+# * others. All Rights Reserved.                                              *
+# *****************************************************************************
+
+cd ../../../
+echo compiling source code $1
+javac -d . -classpath com/ibm/rbm/lib/xerces.jar -deprecation $1 com/ibm/rbm/*.java com/ibm/rbm/gui/*.java
+#if errorlevel 1 goto error
+
+echo creating jar file
+rm com/ibm/rbm/RBManager.jar
+jar cfm com/ibm/rbm/RBManager.jar com/ibm/rbm/manifest.stub com/ibm/rbm/*.class com/ibm/rbm/gui/*.class com/ibm/rbm/gui/images/*.gif com/ibm/rbm/resources/RBManager*.properties
+#if errorlevel 1 goto error
+
+echo cleaning up class files
+cd com/ibm/rbm
+rm -rf *.class gui/*.class
+
diff --git a/unicodetools/com/ibm/rbm/createdoc.bat b/unicodetools/com/ibm/rbm/createdoc.bat
new file mode 100755
index 0000000..84a3cdb
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/createdoc.bat
@@ -0,0 +1,8 @@
+@rem *****************************************************************************
+@rem * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+@rem * others. All Rights Reserved.                                              *
+@rem *****************************************************************************
+mkdir docs\api
+@set DOC_TYPE=-private
+javadoc -d docs/api -classpath lib/xerces.jar -sourcepath ../../../ -windowTitle "RBManager" -bottom "Copyright IBM 2000-2004" %DOC_TYPE% com.ibm.rbm com.ibm.rbm.gui
+@if errorlevel 1 pause
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/docs/RBReporter.html b/unicodetools/com/ibm/rbm/docs/RBReporter.html
new file mode 100644
index 0000000..8116243
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/RBReporter.html
@@ -0,0 +1,205 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>Resource Bundle Reporter</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H1 ALIGN="CENTER">Resource Bundle Reporter</H1>
+      <H1 ALIGN="CENTER"><IMG SRC="images/screenshots/RBReporter.gif" WIDTH="600" HEIGHT="600"></H1>
+      <H4 ALIGN="LEFT">What is RBReporter?</H4>
+      <P ALIGN="LEFT">Frequently, managers and developers working on an inernationalized 
+        product request the ability to quickly view the status and progress of 
+        the translation efforts in their project. RBReporter generates such reports 
+        on a periodic basis and stores them to a specified location in a variety 
+        of formats. The information included in the reports includes the names 
+        and meta data associated with each of the resource files, the number or 
+        resources held in each file, the number of untranslated resources in each 
+        file, and, if the detail level is set to 'High,' a list of all of the 
+        untranslated resource keys for each file.</P>
+      <H4 ALIGN="LEFT">How is RBReporter started?</H4>
+      <P ALIGN="LEFT">From the command line, RBReporter is run by typing in the 
+        following command:</P>
+      <P ALIGN="LEFT"><CODE>java com.ibm.rbm.RBReporter</CODE></P>
+      <P ALIGN="LEFT">This will bring up the window seen above. Alternatively, 
+        Windows users can run the batch file RBReporter.bat. RBReporter will also 
+        take command line arguments that will run the program in a variety of 
+        modes. An equivalent command line argument to the one above is:</P>
+      <P ALIGN="LEFT"><CODE>java com.ibm.rbm.RBReporter -gui</CODE></P>
+      <P ALIGN="LEFT">This argument works the same as the first, bringing up the 
+        Graphical User Interface. This is the only way to set the properties of 
+        the reporter, such as the bundle to report on, the types of reports generated, 
+        and the interval between report generation.</P>
+      <P ALIGN="LEFT">Another option is to run the reporter with the following 
+        argument:</P>
+      <P ALIGN="LEFT"><CODE>java com.ibm.rbm.RBReporter -now</CODE></P>
+      <P ALIGN="LEFT">When the -now option is used, the interval setting between 
+        reports is ignored, and the reports are generated immediately according 
+        to the other saved settings. This option does not bring up the window 
+        for changing settings. Using this option is helpful if you would like 
+        to use you operating system instead of RBReporter to schedule the generation 
+        of reports.</P>
+      <P ALIGN="LEFT">The last option is the following:</P>
+      <P ALIGN="LEFT"><code>java com.ibm.rbm.RBReporter -line</CODE></P>
+      <P ALIGN="LEFT">When this option is used, the reporter is run through the 
+        command line only. None of the settings will be accessible for changing. 
+        Whenever it is time for a report to be generated, a message will appear 
+        on the command line. Another message will appear when the reports have 
+        been successfully written. This last message will include the date and 
+        time of the next report generation.</P>
+      <H4 ALIGN="LEFT">What do the settings mean?</H4>
+      <P ALIGN="LEFT">When the graphical user interface is initially brought up, 
+        the reporter may not be active. An indication at the top of the window 
+        indicates whether or not the reporter will report at the time that has 
+        been specified. The 'Started' message does not indicate that report generation 
+        has started; it merely indicates that the reporter has started and will 
+        generate reports according to the other settings. To toggle whether or 
+        not the reporter is running press the 'Start' or 'Stop' button near the 
+        top of the window. To generate a report immediately, press the 'Update 
+        Now' button.</P>
+      <P ALIGN="LEFT">The report interval determines when a report is generated. 
+        There are two main options for determining the interval. Either an amount 
+        of time is specified that must pass in between reports, or a specific 
+        time during the week or day is specified at which time the report is generated 
+        irregardless of when the last report was generated.</P>
+      <P ALIGN="LEFT">The Resource Bundle setting is an indication of the base 
+        file from concerning which the report is generated. To change the base 
+        file, either type in the new file path to a resource bundle, or select 
+        the 'Choose' button immediately to the right to bring up the graphical 
+        file chooser. The output directory is the file directory into which the 
+        reports are saved. Note that the reports are overwritten each time they 
+        are newly generated.</P>
+      <P ALIGN="LEFT">The output format has three options. Any combination of 
+        these options is permissible, though it makes little sense to turn them 
+        all off. The 'Text' format produces a simple text file in English reporting 
+        on the status of each of the resource files. The 'HTML' format produces 
+        a page that is viewable in a web browser. The 'XML' format produces a 
+        well formed XML report that can be imported into a database, transformed 
+        into another format, or used in a variety of other ways.</P>
+      <P ALIGN="LEFT">Each output format has associated with it a file name. This 
+        name can be chosen as appropriate for the project to which the bundle 
+        belongs. Also, these file names can be modified in order to place the 
+        files in a directory other than the one specified in the output directory. 
+        For instance, a UNIX user might change the text file name to '../../log/report.txt'. 
+        A detail level is also associated with each report. The 'High' detail 
+        level merely includes each of the resource keys that are untranslated 
+        or duplicated instead of just reporting the number of such resources.</P>
+      <P ALIGN="LEFT">The last button saves the settings currently being displayed 
+        to a preferences file so that these settings will be in place the next 
+        time the program is run. If the settings are not meant to be saved as 
+        such, do not click this button. The reporter will still run according 
+        to the displayed settings as long as the RBReporter program is running.</P>
+      <H4 ALIGN="LEFT">What is the code scan?</H4>
+      <P ALIGN="LEFT">Starting with version 0.3a, the reporter included a function 
+        that can scan text files looking for instances of resource bundle usage 
+        and compare those instances with the selected resource bundle. This scan 
+        can then report on any resource keys called on by a program but not existing 
+        in a resource bundle, as well as point out resources in the bundle that 
+        are potentially not used at all by the code.</P>
+      <P ALIGN="LEFT">The reporter is turned on by selecting the check box next 
+        to the text 'Scan Code File' and pointing the scan to a properly specified 
+        scan XML file. The report generated is appended to the normal reports 
+        generated in text, HTML, or XML. The report is also sensitive to the detail 
+        level selected for each of these three output formats.</P>
+      <P ALIGN="LEFT">The scan XML file provides the configuration information 
+        for the code scan. In it rules for what directories and files to scan 
+        are set as well as what type of text is looked for to find a resource 
+        key. More <A HREF="scanfile.html">detailed information on setting up a 
+        scan XML file</A> can be found by following the link.</P>
+      <P ALIGN="LEFT">&nbsp;</P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/faq.html b/unicodetools/com/ibm/rbm/docs/faq.html
new file mode 100644
index 0000000..ffcbf29
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/faq.html
@@ -0,0 +1,159 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>Template</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Frequently Asked Questions</H3>
+      <P><B> What is the advantage of using RB Manager when I can edit resource 
+        bundle property files in a simple text editor?</B></P>
+      <P>Trying to manage internationalization efforts in anything but the smallest 
+        of projects can be a difficult and time consuming task. In fact, RB Manager 
+        as a project grew out of the frustrations and errors that developed as 
+        the result of trying to maintain multiple language support in a moderately 
+        large project. Relying on text editors and the like decreases the chance 
+        that developers will properly comment each aspect of each translation, 
+        increases the chance that errors such as duplicate key names and inconsistencies 
+        across language files, and increases the amount of time developers and 
+        translators have to spend tracking down inconsistencies and untranslated 
+        resources.</P>
+      <P>RBManager offers the following features to correct these problems:</P>
+      <P> 
+        <UL>
+          
+        <LI> RB Manager can edit multiple language files when appropriate</LI>
+          <LI>Entries are checked for proper format and assured not to be duplicates</LI>
+          
+        <LI>RB Manager provides a better grouping of resources, so that individual 
+          translations are easy to find</LI>
+          <LI>Each language file will display in its own view a list of only resources 
+            that are untranslated</LI>
+          
+        <LI>RB Manager keeps track of statistics such as number of resources, 
+          untranslated items, etc.</LI>
+          
+        <LI>RB Manager allows importing and exporting of translation data into 
+          multiple formats</LI>
+          <LI>Use of the application cuts down on development, translation, and 
+            debugging time in any internationalized setting</LI>
+        </UL>
+        
+      <P><B>Will RB Manager work on my computer?</B></P>
+        
+      <P>RB Manager is written using only the Java API. It has been tested under 
+        the Java 1.2.2 runtime environment and higher. If your computer has a 
+        Java Virtual Machine (JVM) in this environment, RBManager should work 
+        for you. Instructions for setting up and running the program are found 
+        in <A HREF="tutorial/step1.html">Step 1</A> of the tutorial.</P>
+        
+      <P><B>Why doesn't RB Manager run in language X?</B></P>
+      <P></P>
+      <P>RB Manager will allow you to edit language files for any language/country/variant 
+        encoding. To demonstrate the usefulness of internationalization, RB Manager 
+        has its own resource bundle. The application can currently be run in English, 
+        German, Swedish, and Finnish. You are welcome to use the program to edit 
+        its own resource bundle and add any other language. If you do so, you 
+        may submit the new language file to the
+        <A HREF="http://www.jtcsv.com/cgibin/icu-bugs/">ICU bug database</A>. 
+        Each submission will be considered for future submissions, but the submittor 
+        must give the rights to the translation to IBM if the file is to be included.</P>
+      <P><B>I found a bug. Where do I report it?</B></P>
+      <P>Please submit a bug to the <a href="http://www.jtcsv.com/cgibin/icu-bugs/">ICU bug database</a>.</P>
+      <P><B>What can I expect from future versions of RB Manager?</B></P>
+      <P><A HREF="future_features.html">Answer</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/future_features.html b/unicodetools/com/ibm/rbm/docs/future_features.html
new file mode 100644
index 0000000..57ce8f0
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/future_features.html
@@ -0,0 +1,163 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - Features and Version History</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	    <UL>
+            <LI><A HREF="RBReporter.html">Home</A></LI>
+            <LI>Report Types</LI>
+            <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+        </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Future Features and Version History</H3>
+      <P>Some of the features all ready in the works for future versions of RB 
+        Manager:</P>
+      <UL>
+        <LI>The ability to lookup suggested translations using imported dictionaries</LI>
+        <LI>Multiple selections across resource tables</LI>
+        <LI>Editing subtrees within the resource bundle tree</LI>
+        <LI>The ability to print various views of resources</LI>
+        <LI>A character table for selecting characters not common to keyboards</LI>
+        <LI>...and of course all of the bug fixes</LI>
+      </UL>
+      
+      <p>Features added in the latest version (0.7) of RB Manager:</p>
+        
+      <ul>
+        <li>Add initial support for importing and exporting XLIFF files</li>
+        <li>Fix some panel updating issues</li>
+        <li>... and some other bug fixes</li>
+      </ul>
+
+      <P>Features added in the latest version (0.6) of RB Manager:</P>
+        
+      <UL>
+        <LI>The program window now has an icon</LI>
+        <LI>Integrate the images and resources into the jar files</LI>
+        <LI>Source code made publicly available</LI>
+        <LI>Allow exporting of ICU4C resource bundles</LI>
+        <LI>... and some bug fixes</LI>
+      </UL>
+      
+      <P>Features added in version 0.4a of RB Manager:</P>
+      
+      <UL>
+        <LI>Recently accessed resource bundles appear in the File menu for easy 
+          opening</LI>
+        <LI>New icons for the tree view</LI>
+        <LI>Ability to save, hide, or delete specific resource files without affecting 
+          the resource bundle as a whole</LI>
+        <LI>Exporting to Java class files allows for specification of the package 
+          name as well as the ability to specify public or protected objects</LI>
+        <LI>Translations can now easily accomidate multiple line text</LI>
+        <LI>RB Manager is no longer restriced to resource bundles that end in 
+          '.properties' in lower-case</LI>
+        <LI>... and some bug fixes</LI>
+      </UL>
+
+      <P>Features added in version 0.3a of RB Manager:</P>
+      <UL>
+        <LI>The ability to merge property files and other resource bundles with 
+          the open resource bundle</LI>
+        <LI>Exporting Java compilable files (ListResourceBundle extension files)</LI>
+        <LI>Import and export support for TMX formatted XML translation files</LI>
+        <LI>The ability to search resource bundles and language files for particular 
+          translations</LI>
+        <LI>Keyboard shortcuts for the most common functions</LI>
+        <LI>A file scanning extension to the reporting tool</LI>
+        <LI>... and some bug fixes</LI>
+      </UL>
+      <P>Have another idea? Send any thoughts or comments to
+      <a href="http://www.jtcsv.com/cgibin/icu-bugs/">ICU's Jitterbug database</a>.</P>
+      <br>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2004 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/images/TitleLogo_transparent.gif b/unicodetools/com/ibm/rbm/docs/images/TitleLogo_transparent.gif
new file mode 100644
index 0000000..bce8494
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/TitleLogo_transparent.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:214d6c25c4a222feeb5ecd1d7e701c6bf1801f1549b87500f06dbb50652e59a7
+size 1674
diff --git a/unicodetools/com/ibm/rbm/docs/images/arrow_bullet.gif b/unicodetools/com/ibm/rbm/docs/images/arrow_bullet.gif
new file mode 100644
index 0000000..7001825
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/arrow_bullet.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2854f358648dcc2ea21b4a3c9ca65a82762b3d02b18b5334e44ee9a88c2ba490
+size 70
diff --git a/unicodetools/com/ibm/rbm/docs/images/diamond_bullet.gif b/unicodetools/com/ibm/rbm/docs/images/diamond_bullet.gif
new file mode 100644
index 0000000..441f288
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/diamond_bullet.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b29b7501c7b062d87436384916182a5754ccb3c33faf92df52f96fcd79ad292
+size 94
diff --git a/unicodetools/com/ibm/rbm/docs/images/ibm_logo_small_white.gif b/unicodetools/com/ibm/rbm/docs/images/ibm_logo_small_white.gif
new file mode 100644
index 0000000..0fe5bb7
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/ibm_logo_small_white.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:936b84d7c37c4dfe4c2007a1b36a7c4b9e7f99a76a992d6fe52a8478268e838d
+size 138
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/RBReporter.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/RBReporter.gif
new file mode 100644
index 0000000..6fa3ff8
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/RBReporter.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c533ec4859833b6545c3ece7b04f205c706a559d1b9cc13b2358e8a6c1f7fbb
+size 13984
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_file.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_file.gif
new file mode 100644
index 0000000..507e2d2
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5000446f0de3cd6bb58068f0a1812143c61bfaf8f12377d85944f1955ff43802
+size 9741
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_group.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_group.gif
new file mode 100644
index 0000000..610d5a2
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_group.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a0677bcacd381e409812ec083761a35bf01aaa46fbe754eff0ce11a08e79d93
+size 15042
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_resource.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_resource.gif
new file mode 100644
index 0000000..d470695
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_resource.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d9b02fd17e78781ab0087841e57db5f4f01829ac2d0e4705be77ce0f9e07773
+size 6266
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_translation.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_translation.gif
new file mode 100644
index 0000000..21c8e0a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_translation.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69ede7a8d3d5611bff67b816769970b00bbb26375dd7bcb5dc12bff6e635bab9
+size 7875
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_untranslated.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_untranslated.gif
new file mode 100644
index 0000000..6cd3860
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/basic_untranslated.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9c95945a8aefb6cc0b3ab40c47e3db9bcc477253deebf8c1d9068a51db9012b
+size 13182
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/create_group.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/create_group.gif
new file mode 100644
index 0000000..67ebea7
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/create_group.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96b7bdcd935da20b4e8dcc2f7a3c0b794db3ab6ebb9671f7a124b906b8c5bd9e
+size 3907
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_group.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_group.gif
new file mode 100644
index 0000000..7890262
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_group.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f79bafcbd83c0b48d05ea1e92e38771380c7f0237e3d19a1455b679e1b1cceb
+size 14569
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_resource.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_resource.gif
new file mode 100644
index 0000000..ec75baa
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_resource.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b126edb2f68d349be71a318faa857aea46733e2b1f06977c3872a6b8923e265f
+size 5103
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_screen.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_screen.gif
new file mode 100644
index 0000000..abe8cdd
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_screen.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4be9cc01af6622b32b8990b03028f35eb2bf35a38f81765e22017b275bb8932d
+size 9993
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_with_preferences.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_with_preferences.gif
new file mode 100644
index 0000000..ba510b8
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/empty_with_preferences.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cef4419a481aab80b6c2b4ebd3d825f41ff9a3e1d3ad316b23d38d6b7306bd25
+size 9907
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_metal.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_metal.gif
new file mode 100644
index 0000000..1588020
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_metal.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:75b62dfce347952ab181a058068a0770386adde7b9e369d814c6530c16dd72ff
+size 44433
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_motif.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_motif.gif
new file mode 100644
index 0000000..6095a99
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_motif.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e532590fc6a29094385c22aa83505a3d1581e9c5639abe85d4e81e2a2af47443
+size 53322
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_windows.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_windows.gif
new file mode 100644
index 0000000..71f7673
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/laf_windows.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea4d85e2055d8f5b80f357914594be1363b0da81ccd0d58f4e2cb44ddb4020c3
+size 46077
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/lookup_resource.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/lookup_resource.gif
new file mode 100644
index 0000000..80d4d7b
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/lookup_resource.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a971a496893fcd47316854c794eba841947be399b734dbc41a49b7c4e4766cfe
+size 6445
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/main_page.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/main_page.gif
new file mode 100644
index 0000000..0204b3b
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/main_page.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c79589e7a5b2777c955bff00153acb12c0578fa6544ec8d5d29c6630de7a9f1
+size 19085
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file.gif
new file mode 100644
index 0000000..0fc51e1
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9869d4b7d5abee4f08c41d47040decc5ad7b5a12a5956e69d449285f09e22423
+size 2741
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_export.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_export.gif
new file mode 100644
index 0000000..16b5d8a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_export.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bf3015ac1aee031a7277a5692e54ff75db4da80aed1fddf4f08fb820310f0d4
+size 3985
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_import.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_import.gif
new file mode 100644
index 0000000..7c36546
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_file_import.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:60e0f095ce0cebcd7b9ab4f02885651e44919d8d017645f711c7656288d80478
+size 4086
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_help.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_help.gif
new file mode 100644
index 0000000..cc75077
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_help.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5066031f1468a4a67f9476a9b2be896746e9408bbc55b4c12c0f8a4bf960abea
+size 974
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_options.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_options.gif
new file mode 100644
index 0000000..31034d0
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_options.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:279d55a2ae2c6a39ad5f95e5f3637b9df58b3ae0bc61355a88f408aa65cf1496
+size 1363
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_popup_tree.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_popup_tree.gif
new file mode 100644
index 0000000..d89cfad
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/menu_popup_tree.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5d5baed9ac56fb489419f134d01cfe08ddd268a8b5e8e972af952cbae0a2f8d
+size 24413
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/new_baseclass.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/new_baseclass.gif
new file mode 100644
index 0000000..6f6097d
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/new_baseclass.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90d5d1fae8caed6906f140afb496101c93020041837b77098ffc61b1d32ffb36
+size 13419
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/new_bundle.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/new_bundle.gif
new file mode 100644
index 0000000..60681b4
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/new_bundle.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6cdad7205629826ee50d35c564591ea01c1e222cd347f7f1750d64feee8c660d
+size 11696
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/preferences_dialog.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/preferences_dialog.gif
new file mode 100644
index 0000000..04da1e0
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/preferences_dialog.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2320a515f0723fbada80edf20c43c2fde785d2a851e7f0caf134e943d8618ff2
+size 7187
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_bundle.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_bundle.gif
new file mode 100644
index 0000000..3a308b6
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_bundle.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3042bba691113cb0dd6022dc841d6dc5d6f38d2e1a9e92b37cb631261f60d4f4
+size 18087
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_file.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_file.gif
new file mode 100644
index 0000000..4bb39a5
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_groups_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc6cba42c8941716e5223e8976d6af48ff71d7a10bd6299b5c90f3e9310e86ac
+size 19343
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_search.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_search.gif
new file mode 100644
index 0000000..21666fc
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_search.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0fc768d02640e331352cd5e47a270f7302990dde6d633e49d4fc545cd96e2d3b
+size 21681
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_bundle.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_bundle.gif
new file mode 100644
index 0000000..43ffeb5
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_bundle.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c59bbe195eae957f07c31d334ad8006a1ebb1c24d7333963797558541777dd64
+size 17090
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_file.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_file.gif
new file mode 100644
index 0000000..0a2b2a6
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_stats_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:80e3851066ce3cad5dca32e2246531cfc30a40a98c8513208354322c5208f96d
+size 16525
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_tree_basic.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_tree_basic.gif
new file mode 100644
index 0000000..f89d974
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_tree_basic.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6560c25dcba6797709156efbeb477326c4b6d7656af6787f5806ad7e721eaedc
+size 16313
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_bundle.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_bundle.gif
new file mode 100644
index 0000000..3cd7238
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_bundle.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a87d31236ae9552427e6f6ca2b62f31d082ec2e337363dcd94030a735280135
+size 19558
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_dialog0.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_dialog0.gif
new file mode 100644
index 0000000..b86bc50
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_dialog0.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a236e065a890fab49e0cdadde7c5b0ff0a4e3c385662fe0fb57523daa752027
+size 7367
diff --git a/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_file.gif b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_file.gif
new file mode 100644
index 0000000..b887680
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/screenshots/view_untrans_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15d339561a2293c014051540b208c4463b40b1be3221ca5a09922f6df97a973c
+size 24230
diff --git a/unicodetools/com/ibm/rbm/docs/images/spacer.gif b/unicodetools/com/ibm/rbm/docs/images/spacer.gif
new file mode 100644
index 0000000..88c5e3c
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/spacer.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b4c63ce5e8bb367cc4863072d9d01cdbfe11b6578fa2f61f120f6665aba50d3
+size 870
diff --git a/unicodetools/com/ibm/rbm/docs/images/template_l.gif b/unicodetools/com/ibm/rbm/docs/images/template_l.gif
new file mode 100644
index 0000000..c329572
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/template_l.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cdf8c3821377b329065b7e3b323f1d8a46e9f47793d22b6f8b1634e32cf5f43
+size 128
diff --git a/unicodetools/com/ibm/rbm/docs/images/template_line.gif b/unicodetools/com/ibm/rbm/docs/images/template_line.gif
new file mode 100644
index 0000000..9de90c6
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/template_line.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc3c724b1d540bbeaefc2849f5b5553948c281ce9f87e33c1ef800957d7ceeb9
+size 87
diff --git a/unicodetools/com/ibm/rbm/docs/images/template_ll.gif b/unicodetools/com/ibm/rbm/docs/images/template_ll.gif
new file mode 100644
index 0000000..f1fd7af
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/template_ll.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88811dcefd14320da9eafcb0091d2b114203d0036d57ad973e61e484aa6e661e
+size 748
diff --git a/unicodetools/com/ibm/rbm/docs/images/template_u.gif b/unicodetools/com/ibm/rbm/docs/images/template_u.gif
new file mode 100644
index 0000000..7df8c45
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/template_u.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5db7769208ffcb95631d9727e6fc93d82073eee5e7c26da78949ecc2a37a3ab8
+size 93
diff --git a/unicodetools/com/ibm/rbm/docs/images/template_ul.gif b/unicodetools/com/ibm/rbm/docs/images/template_ul.gif
new file mode 100644
index 0000000..7e0cbc5
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/images/template_ul.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0089ba9d41f0d6234d623aef965fab44c190097c94c9472fcdc99abdd5124bdf
+size 1069
diff --git a/unicodetools/com/ibm/rbm/docs/index.html b/unicodetools/com/ibm/rbm/docs/index.html
new file mode 100644
index 0000000..5a23527
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/index.html
@@ -0,0 +1,145 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>Resource Bundle Manager</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" -->
+      <DIV ALIGN="CENTER">
+        <H2>Welcome to Resource Bundle Manager (v0.6)</H2>
+        <P ALIGN="CENTER"><IMG SRC="images/screenshots/main_page.gif"></P>
+        <P ALIGN="CENTER">These pages are meant to help you and your development 
+          team get started with this translation management tool.</P>
+        <P ALIGN="CENTER">The tool was developed to be easy to use and intutitive. 
+          If you all ready understand the process of internationalization and 
+          just want to learn how this tool can be used to make your efforts more 
+          efficient and less error prone go straight to the <A HREF="tutorial/index.html">step-by-step 
+          tutorial</A>, <A HREF="views/index.html">functions and views</A>, or 
+          <A HREF="faq.html">frequently asked questions</A>. If you are new to 
+          internationalization in development, you may want to first check out 
+          this<A HREF="http://www-106.ibm.com/developerworks/library/j-rbmgr/index.html"> 
+          introduction to internationalization</A>.</P>
+        <P ALIGN="CENTER">If you would like to report a bug, feel free to
+          <A HREF="http://www.jtcsv.com/cgibin/icu-bugs/">submit a bug to our
+          bug database</A>.</P>
+      </DIV>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+<!--
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="2">
+  <TR>
+    <TD WIDTH="200" BGCOLOR="#CCCCFF">&nbsp;</TD>
+    <TD>
+      <DIV ALIGN="CENTER"><IMG SRC="../images/TitleLogo_transparent.gif" WIDTH="175" HEIGHT="50"></DIV>
+    </TD>
+  </TR>
+  <TR VALIGN="TOP"> 
+    <TD WIDTH="200" BGCOLOR="#CCCCFF"> 
+      <P><A HREF="index.html">RBManager</A></P>
+      <P><A HREF="RBReporter.html">RBReporter</A></P>
+      <P><A HREF="../tutorial/step1.html">System Requirements</A></P>
+      <P><A HREF="faq.html">FAQ</A></P>
+      <P>Topics</P>
+      <UL>
+        <LI><A HREF="../tutorial/index.html">Step-by-step Tutorial</A></LI>
+        <LI><A HREF="step1.html">Changing Prefences</A></LI>
+        <LI><A HREF="future_features.html">Future Release Features</A></LI>
+      </UL>
+    </TD>
+    <TD></TD>
+  </TR>
+</TABLE>
+-->
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/lookandfeel.html b/unicodetools/com/ibm/rbm/docs/lookandfeel.html
new file mode 100644
index 0000000..29a6016
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/lookandfeel.html
@@ -0,0 +1,119 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RBManager - Look and Feel</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Look and Feel</H3>
+      <P>RB Manager is written purely in Java, and therefore is a cross-platform 
+        application. Using the Preferences menu item, the look and feel of the 
+        application can be changed to any one of the look and feels supported 
+        by the virtual machine running on the system.</P>
+      <P>This page shows some examples of how the system looks under four common 
+        look and feels: <A HREF="#Windows">Windows</A>, <A HREF="#Metal">Metal</A>, 
+        <A HREF="#Mac">Mac OSX (aqua)</A>, and <A HREF="#Motif">Motif</A>.</P>
+      <P><B><a name="Windows">Windows</A></B></P>
+      <P><IMG SRC="images/screenshots/laf_windows.gif" WIDTH="600" HEIGHT="444"></P>
+      <P><B><a name="Metal">Metal</A></B></P>
+      <P><IMG SRC="images/screenshots/laf_metal.gif" WIDTH="600" HEIGHT="444"></P>
+      <P><B><a name="Mac">Mac OSX (aqua)</A></B></P>
+      <P>&nbsp;</P>
+      <P><B><a name="Motif">Motif</A></B></P>
+      <P><IMG SRC="images/screenshots/laf_motif.gif" WIDTH="600" HEIGHT="444"></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/menu.html b/unicodetools/com/ibm/rbm/docs/menu.html
new file mode 100644
index 0000000..00ac4c4
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/menu.html
@@ -0,0 +1,257 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - Menu Items</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H2 ALIGN="CENTER">RB Manager - Menu Items</H2>
+      <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="2">
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"> 
+            <P><B>The File Menu</B></P>
+          </TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_file.gif" WIDTH="258" HEIGHT="219" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>New Resource Bundle...</I></TD>
+          <TD>Create a new resource bundle. You will need to select the base class 
+            name for this bundle.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Open Resource Bundle...</I></TD>
+          <TD>Select a resource bundle from the file sysetem. The bundle should 
+            have been one created by RB Manager, otherwise use the Merge option.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Save Resource Bundle</I></TD>
+          <TD>Save the bundle to the file system.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Save Resource Bundle As...</I></TD>
+          <TD>Save the resource bundle in a selected location within the file 
+            system.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_file_import.gif" WIDTH="454" HEIGHT="219" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><B>Merge To Resource Bundle</B></I></TD>
+          <TD>Import resource bundles from different formats and merge them with 
+            the currently open resource bundle.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><IMG SRC="images/arrow_bullet.gif" WIDTH="12" HEIGHT="10">Simple 
+            Resource Bundles...</I></TD>
+          <TD>Import from other resource bundles made up of .properties text files 
+            created by RB Manager or not.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><IMG SRC="images/arrow_bullet.gif" WIDTH="12" HEIGHT="10">TMX 
+            Documents...</I></TD>
+          <TD>Import from XML documents that conform to the TMX specification 
+            created by the LISA group.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_file_export.gif" WIDTH="439" HEIGHT="219" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><B>Export Resource Bundles</B></I></TD>
+          <TD>Save the translations in other formats.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><IMG SRC="images/arrow_bullet.gif" WIDTH="12" HEIGHT="10">Compilable 
+            Java Files...</I></TD>
+          <TD>Export to compilable java class files that extend the ListResourceBundle 
+            class. </TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><IMG SRC="images/arrow_bullet.gif" WIDTH="12" HEIGHT="10">Minimal 
+            Properties Files...</I></TD>
+          <TD>Export to .properties text files just as in the Save option, except 
+            that these files will be stripped of all unnecessary meta data.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><IMG SRC="images/arrow_bullet.gif" WIDTH="12" HEIGHT="10">TMX 
+            Documents...</I></TD>
+          <TD>Export to XML documents that conform to the TMX specification created 
+            by the LISA group.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/spacer.gif" WIDTH="15" HEIGHT="15"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><B>The Options Menu</B></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_options.gif" WIDTH="211" HEIGHT="111" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Add New Entry...</I></TD>
+          <TD>Create a new resource for the entire resource bundle.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Add New Group...</I></TD>
+          <TD>Create a new resource group for the entire resource bundle.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Add New Resource File...</I></TD>
+          <TD>Create a new resource file for the resource bundle. Optionally select 
+            whether or not to populate this file with currently defined resources.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Preferences...</I></TD>
+          <TD>Bring up the preferences dialog box.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/spacer.gif" WIDTH="15" HEIGHT="15"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><B>The Help Menu</B></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_help.gif" WIDTH="353" HEIGHT="46" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>About Resource Bundle Manager...</I></TD>
+          <TD>Brings up a dialog box displaying the version of RB Manager and 
+            other information.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/spacer.gif" WIDTH="15" HEIGHT="15"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><B>The Resource File Popup Menu</B></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD COLSPAN="2"><IMG SRC="images/screenshots/menu_popup_tree.gif" WIDTH="671" HEIGHT="543" VSPACE="5" HSPACE="5"></TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I><B>Resource File Popup Menu</B></I></TD>
+          <TD>Pops up from an individual resource file.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Save Resource File</I></TD>
+          <TD>Save only the selected resource file to the file system.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Hide Resource File</I></TD>
+          <TD>Remove the selected resource file from the resource bundle tree. 
+            All future changes to the bundle will not affect this file. This will 
+            also remove any changes made to the file since last saving it.</TD>
+        </TR>
+        <TR VALIGN="TOP"> 
+          <TD><I>Delete Resource File</I></TD>
+          <TD>If the operating system allows, deletes the resource file from the 
+            file system. This is a permanent change and can not be undone.</TD>
+        </TR>
+      </TABLE>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <P>&nbsp;</P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/scanfile.html b/unicodetools/com/ibm/rbm/docs/scanfile.html
new file mode 100644
index 0000000..4e1b315
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/scanfile.html
@@ -0,0 +1,195 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RBReporter Scan File</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H1 ALIGN="CENTER">RBReporter Scan XML Configuration File</H1>
+      <P><B>Introduction</B></P>
+      <P>The configuration file for RBReporter scans is a text file stored in 
+        XML. The design on the format for this configuration file was kept simple 
+        and so the general application of the scanner is not meant for complicated 
+        analysis. The design works around three types of rules: Directory Rules, 
+        File Rules, and Parse Rules. Each of these will be explained below. First, 
+        here is an example file for reference. This file is the configuration 
+        file used to scan the resource bundle associated with RBManager.</P>
+      <P><B>Sample Scan File </B>(rbmanager_scan.xml<B>)</B></P>
+      <BLOCKQUOTE><CODE>
+        <PRE>
+&lt;?xml version="1.0" ?>
+&lt;RBFILESCANNER NAME="RBManager Scanner" FILENAME="rbmanager_scanner.xml">
+	&lt;FILERULES>
+		&lt;!--  FileRules can have attributes starts_with, ends_with, and contains -->
+		&lt;FILERULE NAME="Java File" ENDS_WITH=".java" />
+		&lt;FILERULE NAME="XSL File" ENDS_WITH=".xsl" />
+	&lt;/FILERULES>
+	&lt;PARSERULES>
+		&lt;!--  ParseRules can have attributes follows and precedes --> 
+		&lt;PARSERULE NAME="Java static resource" FOLLOWS="Resources.getTranslation(&amp;quot;" PRECEDES="&amp;quot;" /> 
+	&lt;/PARSERULES>
+	&lt;SCAN>
+		&lt;DIRECTORY LOCATION="\C:\Development\RBManager\Source" RECURSE_DIRECTORIES="true"> 
+			&lt;RULES>
+				&lt;APPLYFILERULE NAME="Java File">
+					&lt;APPLYPARSERULE NAME="Java static resource" />
+				&lt;/APPLYFILERULE>
+			&lt;/RULES>
+		&lt;/DIRECTORY>
+	&lt;/SCAN>
+&lt;/RBFILESCANNER>
+        </PRE>
+        </CODE></BLOCKQUOTE>
+<P><B>Details</B></P>
+      <P>The root element of the XML file is named 'RBFILESCANNER'. This root 
+        element has two optional attributes for naming the scan file in a human 
+        readable manner and specifying the file name. These attributes are for 
+        the developers reference; they mean nothing to RBReporter. Beneath the 
+        root element are three required elements 'FILERULES', 'PARSERULES' and 
+        'SCAN'. </P>
+      <P>Beneath the FILERULES element are found FILERULE elements. Any number 
+        of these rules can be specified, though each must have a unique name as 
+        specified in the element's NAME attribute. Along with this name attribute, 
+        the attributes STARTS_WITH, ENDS_WITH, and CONTAINS may be optionally 
+        specified. These are the rules applied to each file in a directory to 
+        determine whether or not they will be scanned. The attribute rules are 
+        applied to the file names of each file in the directory and if each is 
+        found to be true, that file is evaluated against the parse rules.</P>
+      <P>Beneath the PARSERULES element are found PARSERULE elements. Any number 
+        of these rules can be specified, though each must have a uniques name 
+        as specifiedn in the element's NAME attrinute. Along with this name attribute, 
+        the attributes FOLLOWS and PRECEDES may optionally be specified. These 
+        are the rules applied to each line of text in a selected file to determine 
+        if that line of text contains one or more resource keys.</P>
+      <P>Beneath the SCAN element are found DIRECTORY elements. Any number of 
+        these elements can be specified. The required LOCATION attribute specifies 
+        in a machine dependent manner the location of a directory for which the 
+        files are to be scanned for resource bundles. An optional RECURSE_DIRECTORIES 
+        attribute may be specified. If the value of this attribute is set to 'true', 
+        then all directories beneath the directory specified are also scanned.</P>
+      <P>Beneath each DIRECTORY element, exactly one RULES elements can be specified.Beneath 
+        this element, any number of APPLY FILE RULE elements may be specified. 
+        The required NAME attribute specifies which of the file rules defined 
+        previously are to be applied. Beneath these element any number of APPLYPARSERULE 
+        elements may be specified. The required NAME attribute specifies which 
+        of the parse rules defined previously are to be applied to the files accepted 
+        by the parent file rule.</P>
+      <P><B>The Example File Explained</B></P>
+      <P>Given the details of the file structure, we can now examine how the example 
+        file specifies which files to scan, and then how it specifies how to find 
+        the resource keys contained in those files.</P>
+      <P>RBReporter first begins by going through each of the directories specified. 
+        In the example file case, there is only one directory. It then goes through 
+        each of the files contained in that directory and its subdirectories looking 
+        for files that pass the 'Java File' file test. The 'Java File' test simply 
+        checks the file name to see if it ends in the extension '.java'. If the 
+        file has such an extension the parse rule 'Java static resource' is applied 
+        to every line of text within that file.</P>
+      <P>Thus if the following file, named Sample.java, were to be found in the 
+        directory. The two resource keys 'Hello' and 'World' would be found.</P>
+        <blockquote><code>
+          <pre>
+public class Sample {
+	public static void main(String args[]) {
+		System.out.println(Resources.getTranslation(&quot;Hello&quot;) + &quot; &quot; + Resources.getTranslation(&quotWorld&quot;));
+	}
+}
+</pre>
+          </code></blockquote>
+
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/system_requirements.html b/unicodetools/com/ibm/rbm/docs/system_requirements.html
new file mode 100644
index 0000000..151c0f9
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/system_requirements.html
@@ -0,0 +1,108 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>Template</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image:  url(images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="images/template_ul.gif" HEIGHT="75"><IMG SRC="images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="faq.html">FAQ</A></LI>
+              <LI><A HREF="future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="index.html">Home</A></LI>
+              <LI><A HREF="tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" -->
+      <H3 ALIGN="CENTER">System Requirements</H3>
+      <P>RB Manager will run on any platform supporting Java 1.4 or higher. It 
+        has been tested on Windows NT, Windows 2000, Linux, and Mac OS X. It is 
+        recommended that the machine running RB Manager have at least 64 MB of 
+        memory.</P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2004 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/index.html b/unicodetools/com/ibm/rbm/docs/tutorial/index.html
new file mode 100644
index 0000000..4781e64
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/index.html
@@ -0,0 +1,159 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <DIV ALIGN="CENTER"> 
+        <H2>Step-by-step Tutorial</H2>
+        <P ALIGN="CENTER">This tutorial takes you step by step through the process 
+          of creating a resource bundle and managing the translations you need 
+          for your application or web based interfaces. You may begin with the 
+          first step, or select from any of the steps listed below. The tutorial 
+          is not meant to give a comprehensive view of the features of RB Manager, 
+          but it will help you familiarize with all of the basic features.</P>
+        <H3 ALIGN="LEFT"> 
+          <UL>
+            <LI>
+              <H4>Step 1. <A HREF="step1.html">Setting Your Personal Prefences</A></H4>
+            </LI>
+            <LI>
+              <H4>Step 2. <A HREF="step2.html">Creating a New Resource Bundle</A></H4>
+            </LI>
+            <LI>
+              <H4>Step 3. <A HREF="step3.html">Creating Groups within the Bundle</A></H4>
+            </LI>
+            <LI>
+              <H4>Step 4. <A HREF="step4.html">Populating the Bundle with Resources</A></H4>
+            </LI>
+            <LI>
+              <H4>Step 5. <A HREF="step5.html">Adding Resource Files for New Languages</A></H4>
+            </LI>
+            <LI>
+              <H4>Step 6. <A HREF="step6.html">Saving the Results</A> </H4>
+            </LI>
+          </UL>
+        </H3>
+        <H4><A HREF="step1.html">Go to Step 1</A></H4>
+      </DIV>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+<!--
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="2">
+  <TR>
+    <TD WIDTH="200" BGCOLOR="#CCCCFF">&nbsp;</TD>
+    <TD>
+      <DIV ALIGN="CENTER"><IMG SRC="../images/TitleLogo_transparent.gif" WIDTH="175" HEIGHT="50"></DIV>
+    </TD>
+  </TR>
+  <TR VALIGN="TOP"> 
+    <TD WIDTH="200" BGCOLOR="#CCCCFF"> 
+      <P><A HREF="index.html">RBManager</A></P>
+      <P><A HREF="RBReporter.html">RBReporter</A></P>
+      <P><A HREF="../tutorial/step1.html">System Requirements</A></P>
+      <P><A HREF="faq.html">FAQ</A></P>
+      <P>Topics</P>
+      <UL>
+        <LI><A HREF="../tutorial/index.html">Step-by-step Tutorial</A></LI>
+        <LI><A HREF="step1.html">Changing Prefences</A></LI>
+        <LI><A HREF="future_features.html">Future Release Features</A></LI>
+      </UL>
+    </TD>
+    <TD></TD>
+  </TR>
+</TABLE>
+-->
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step1.html b/unicodetools/com/ibm/rbm/docs/tutorial/step1.html
new file mode 100644
index 0000000..11783e9
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step1.html
@@ -0,0 +1,168 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Preferences</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Setting Your Personal Preferences</H3>
+      <P><B>Getting Started</B></P>
+      <P>Before you can do anything with the program, of course, you have to get 
+        it running. RB Manager is purely a Java application. The download does 
+        not come with a Java runtime environment. In order to use RBManager, you 
+        will need to hava a Java runtime environment installed on your machine. 
+        The environment is available to most computing platforms at <A HREF="http://java.sun.com">Sun's 
+        internet site</A>. RB Manager has been tested for Java versions 1.2.2 
+        and higher. It is recommended that you use Java version 1.3 if it is available 
+        for your system.</P>
+      <P>To run the program from the command line, first go to the RBManager directory 
+        on your system, then enter:</P>
+      <P><CODE>java -classpath ./lib/RBManager.jar;./lib/xerces.jar com.ibm.rbm.RBManager</CODE></P>
+      <P>Alternatively, Windows users can use the batch file, RBManager.bat to 
+        accomplish the same thing. Linux and Unix users tend not to need their 
+        hands held, and can probably figure out how to write a simple script or 
+        alias to run the application without help. Mac OS X users can run the 
+        program from the Terminal application with the above command line, substituting 
+        a colon for the semi-colon in the classpath argument.</P>
+      <P><B>The Display</B></P>
+      <P>Once you get the application running, you will hopefully see something 
+        like this:</P>
+      <P><IMG SRC="../images/screenshots/empty_screen.gif"></P>
+      <P>The display may differ because of differences in the various Java Virtual 
+        Machines and differences in Look and Feels. At the top is a menu bar and 
+        a logo. Below the logo and to the left is a pane in which all of the various 
+        language files will be listed in a tree view. Since no resource bundle 
+        has been selected, this tree is currently empty. To the right is a tabbed 
+        pane in which three views will be shown. The views will either present 
+        information or provide an interface for editing the various data contained 
+        across your resource bundle.</P>
+      <P><B>Customizing the Application for You</B></P>
+      <P>Go to the Options menu and select Preferences. The first time after opening 
+        the application, it may take a few seconds to get to the preferences as 
+        the application tries to get information from your virtual machine.A dialog 
+        box should appear that looks similar to this:</P>
+      <P><IMG SRC="../images/screenshots/preferences_dialog.gif" WIDTH="429" HEIGHT="269"></P>
+      <P>The first thing to do is to change the user name to your own name. You 
+        will only have to do this once unless someone else uses this application 
+        and changes the name. Second, you should change the look and feel of the 
+        application to your preference. All of the look and feels that your JVM 
+        supports should be listed in the drop down box. (Note that changes will 
+        not take affect until after you are done and have pressed the Update button).</P>
+      <P>The last thing to change is the locale you would like to use to work 
+        with this application. When you download RBManager, it is set by default 
+        to display in U.S. English. As of this writing, you can use the program 
+        in Finnish, Swedish, and German as well. Three lists choices are possible 
+        for selecting a locale. The first, called 'Machine Supported', lists all 
+        of the locals supported by your JVM. The second, called 'Defined for RBManager', 
+        analyzes the Resource Bundle for RBManager and lets you select from the 
+        available translation files. The third option, called 'ISO Standards', 
+        lists all of the language and country 2-letter codes defined by the ISO. 
+        You may select any of the three options by use of the radio button on 
+        the left and then select the encoding you would like to use. Of course 
+        if the encoding you select is not supported by RBManager, the translations 
+        in the base class of the bundle will be used, which are in English. Also 
+        note, that the base class language may not appear in the 'Defined for 
+        RBManager' section because the encoding is not always specified for that 
+        file. </P>
+      <P>When you are done making your personalized selections, click on the Update 
+        button. The preferences will be saved in a file called preferences.properties 
+        stored in your RBManager directory. You will not need to make these selections 
+        in the future, unless you want to change your defaul options.</P>
+      <P><A HREF="index.html">Back to the Tutorial Menu</A> -or- <A HREF="step2.html">Forward 
+        to Step 2</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step2.html b/unicodetools/com/ibm/rbm/docs/tutorial/step2.html
new file mode 100644
index 0000000..04beb47
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step2.html
@@ -0,0 +1,148 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Creating Resources</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Step 2. Creating a New Resource Bundle</H3>
+      <P><B>Things to Consider</B></P>
+      <P>A resource bundle in terms of this application is a group of property 
+        files with the same base class name. For instance, the resource bundle 
+        for RB Manager includes files: <code>RBManager.properties</CODE>, <code>RBManager_de.properties</CODE>, 
+        <code>RBManger_fi.properties</CODE>, etc. In future versions of the program, 
+        RB Manager will be extended to support importing and exporting data from 
+        other language translations schemas such as the XML internationalization 
+        standard, TMX.</P>
+      <P>You can have as many Resource Bundles as you like for an application, 
+        though most teams choose to work with just one. RB Manager allows you 
+        to work on one resource bundle at a time, editing either individual translation 
+        files or groups of translation files within the bundle. When you create 
+        a resource bundle you will be creating the base class translation file 
+        for that bundle. Other files can be added at any time later. The base 
+        class translation file provides a default translation in case locales 
+        are not specified or a resource translation file does not exist for the 
+        locale that is specified.</P>
+      <P>You will have to choose a base class name for the resource bundle. That 
+        name may have no white spaces and no underscores, and it should remind 
+        you in some way of the project or function to which it is attached. You 
+        will also have to enter a name for the person or people in charge of managing 
+        the resource bundle.</P>
+      <P><B>Creating the Resource Bundle</B></P>
+      <P>From the File menu, select 'New Resource Bundle...' You will be prompted 
+        to enter the base class name. If you enter a properly formatted name, 
+        the tree display on the lower left will change to reflect the name you 
+        entered. Click on the name of your resource bundle, and make sure the 
+        'Statistics' tab is selected. You should see something like the following:</P>
+      <P><IMG SRC="../images/screenshots/new_bundle.gif" WIDTH="552" HEIGHT="385"></P>
+      <P>The only resource file you have is that of the base class. Select the 
+        '(Base Class)' node of the tree by clicking on it. You should now see 
+        the following:</P>
+      <P><IMG SRC="../images/screenshots/new_baseclass.gif" WIDTH="676" HEIGHT="511"></P>
+      <P>The fields represented here have no bearing on how the translations will 
+        work in your application, but give RBManager some metadata to better organize 
+        the file. Resource Title should be a short title that represents this 
+        file, such as 'RBTutorial Base Class'. You can enter any comment and file 
+        manager value you like. The language, country, and variant fields provide 
+        a place for listing the full name of the language, country, and variant 
+        so that you do not have to rely on two or three letter encodings. You 
+        can also leave these fields blank if they are not relevant. Once you have 
+        entered these values in, finalize them by pressing the 'Update' button.</P>
+      <P><A HREF="step1.html">Back to Step 1</A> -or- <A HREF="step3.html">Forward 
+        to Step 3</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step3.html b/unicodetools/com/ibm/rbm/docs/tutorial/step3.html
new file mode 100644
index 0000000..2578ede
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step3.html
@@ -0,0 +1,135 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Creating Groups</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" -->
+      <DIV ALIGN="CENTER">
+        <H3>Creating Groups within the Bundle</H3>
+        <P ALIGN="LEFT"><B>What is a Group?</B></P>
+        <P ALIGN="LEFT">One of the fundamental problems with managing resource 
+          bundles across large projects is that individual resources often got 
+          lost in the vast number of translations. By creating groups within resources, 
+          RBManager makes it much simpler to manage the daunting number of translations. 
+          The resource bundle is like a tree with the files at the upper levels. 
+          Beneath the file level is the group level, and beneath that, the individual 
+          resources.</P>
+        <P ALIGN="LEFT">The only meta data that groups contain are name and comment. 
+          The name is a way of identifying the group from a list of groups, and 
+          the comment is a quick description about what the group contains.</P>
+        <P ALIGN="LEFT"><B>Creating a Group</B></P>
+        <P ALIGN="LEFT">Like any other editing that affects the entire resource 
+          bundle, the creation of a group can not be done from the individual 
+          language file level. Two ways exist to create a group. The first is 
+          to select the base class at the top of the resource bundle tree, select 
+          the 'Groups' tab, and click the 'Create Group' button. The second way 
+          is to go to the 'Options' menu and select 'Add New Group'. The second 
+          method can be used no matter what your current view is on the lower 
+          right panel.</P>
+        <P ALIGN="LEFT">Once you have followed one of these two methods, the following 
+          dialog should appear:</P>
+        <P ALIGN="LEFT"><IMG SRC="../images/screenshots/create_group.gif" WIDTH="408" HEIGHT="109"></P>
+        <P ALIGN="LEFT">Enter a name and comment for the group, and click on 'Create'. 
+          Now you have a group. You can add more groups now or at any time. You 
+          can also begin to create new resources under the new group as explained 
+          in the next step.</P>
+        <P ALIGN="LEFT"><A HREF="step2.html">Back to Step 2</A> -or- <A HREF="step4.html">Forward 
+          to Step 4</A></P>
+      </DIV>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step4.html b/unicodetools/com/ibm/rbm/docs/tutorial/step4.html
new file mode 100644
index 0000000..e17f0e1
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step4.html
@@ -0,0 +1,168 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Populating the Bundle</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Step 4. Populating the Bundle with Resources</H3>
+      <P><B>Working within a Group</B></P>
+      <P>In the tutorial file, following the process described in the previous 
+        step, I created a group called 'Questions' and gave it a comment. To view 
+        the group that you created, make sure that the base class at the top of 
+        the file tree to the left is selected, press the 'Groups' tab on the right, 
+        and select your group name from the drop down menu. With any luck, you 
+        will see something like this:</P>
+      <P><IMG SRC="../images/screenshots/empty_group.gif" WIDTH="750" HEIGHT="432"></P>
+      <P>From this view, there are several options that are to be found in the 
+        six buttons to the lower right. We are now going to create a resource. 
+        This can be accomplished by either pressing the button 'Create Resource' 
+        or selecting 'Add New Resource...' from the 'Options' menu at the top 
+        of the screen.</P>
+      <P><B>Filling in Resource Information</B></P>
+      <P>Once you follow one of the above two steps, you should see a dialog similar 
+        to the following:</P>
+      <P><IMG SRC="../images/screenshots/empty_resource.gif"></P>
+      <P>The group shown is the one currently being viewed when you clicked on 
+        the 'Create Resource' button. If you used the menu to bring up this dialog, 
+        it may be a different group. You may move the resource to any group you 
+        wish by changing the value in this drop down box. Both the entry key and 
+        the translation fields are required information. These make up the lookup 
+        value and the translation value respectively stored in your bundle. The 
+        comment field is there in order to aid those who will be translating your 
+        work into other languages. This field provides a way for you to describe 
+        the context of this particular resource.</P>
+      <P>There are a few ways to create the resource once the information is entered. 
+        Pressing 'Create' will add the resource and close the dialog. If you wish 
+        to continue creating resources after the current one, pressing 'Create 
+        &amp; Continue' will create the resource, clear the information you have 
+        just entered, and allow you to enter in a new resource. Pressing 'Cancel' 
+        will close the dialog box and ignore any information currently entered. 
+        As a short cut, you can also hit enter from any of the text boxes but 
+        'Translation'. This will create the resource. Pressing enter from the 
+        translation text box, creates a translation that spans multiple lines 
+        of text.</P>
+      <P>A sample resource creation is show as follows:</P>
+      <P><IMG SRC="../images/screenshots/basic_resource.gif"></P>
+      <P><B>Using 'Look-ups'</B></P>
+      <P>Resource bundles provide a way of translating contextual information 
+        as well. For instance, what if I wanted a translation asking the user 
+        how old they were, and I wanted to ask it with their name inserted into 
+        the question. The placement of their name might be different in different 
+        languages. This is the reason for 'look-ups'. The java.text package defines 
+        a way for implementing these look-ups using numbers surrounded by curly 
+        braces. Thus, I might want to create a resource like the one below:</P>
+      <P><IMG SRC="../images/screenshots/lookup_resource.gif"></P>
+      <P>Once you enter anything into your translation surrounded by curly braces 
+        and change the focus away from the translation field, the dialog box will 
+        update itself with areas for you to enter descriptions of the look-ups 
+        you have entered. This feature of RBManager allows future translators 
+        to understand the context of each look-up.</P>
+      <P><B>Editing the Resources</B></P>
+      <P>From the 'Groups' tab view, you can at any time edit the default values 
+        for a resource. As you enter in new resources they will appear in the 
+        group view as shown:</P>
+      <P><IMG SRC="../images/screenshots/basic_group.gif" WIDTH="750" HEIGHT="432"></P>
+      <P>Double clicking on a resource will bring a dialog box up similar to the 
+        one for creating a resource. Remember that it is only from this view that 
+        you will be able to change the resource in a way that will effect the 
+        entire bundle. Thus it is only in this view that you can change the resource's 
+        group, key name, and default translation and comment.</P>
+      <P><A HREF="step3.html">Back to Step 3</A> -or- <A HREF="step5.html">Forward 
+        to Step 5</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step5.html b/unicodetools/com/ibm/rbm/docs/tutorial/step5.html
new file mode 100644
index 0000000..07d2e4a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step5.html
@@ -0,0 +1,158 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Creating Resource Files</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">Step 5. Adding Resource Files for New Languages</H3>
+      <P><B>Creating a New Language File</B></P>
+      <P>The only way by which to create a new language file is by selecting the 
+        'Add New Resource File...' option from the 'Options' menu. When you do 
+        so a dialog box will appear similar to this:</P>
+      <P><IMG SRC="../images/screenshots/basic_file.gif" WIDTH="620" HEIGHT="421"></P>
+      <P>The top three fields identify the file. The bottom three sections, Language, 
+        Country, and Variant define the role of the resource file within the bundle. 
+        The only required field is the encoding field for the language. The encoding 
+        fields are inserted into the name of the resource file whenever the fields 
+        are filled. The file name would following the pattern <CODE>baseclass_language_encoding_variant.properties</CODE>. 
+        In the above example, the file would be named<CODE> RBTutorial_de.properties</CODE>. 
+        Note that it is important to define fallback files for each language (i.e. 
+        if you have a file for <CODE>RBTutorial_de_DE.properties</CODE>, you should 
+        also have a file for <CODE>RBTutorial_de.properties</CODE>).</P>
+      <P>Since there may be instances where the language file being created may 
+        have few differences from the base class property file, an option is given 
+        for copying or not all of the resources from the base class file to the 
+        new file. By default, this option is selected and each resource will be 
+        copied from the base file and marked as untranslated in the new resource 
+        file.</P>
+      <P><B>Working with the New Language File</B><BR>
+      </P>
+      <P>Once a language file has been created, there will be resources that need 
+        to be translated. This can be done from two different views. First, go 
+        to the tree on the lower left of the screen and select the file that you 
+        have just created. In this case it will be under the language encoding 
+        de node of the tree. Select the file by clicking on it once. Selecting 
+        the 'Untranslated' tab on the right should result in a view similar to 
+        this:</P>
+      <P><IMG SRC="../images/screenshots/basic_untranslated.gif" WIDTH="750" HEIGHT="416"> 
+      </P>
+      <P>This section displays all of the resources that are marked as untranslated 
+        in the file. Alternatively, you could select the 'Groups' tab and see 
+        all of the resources, one group at a time, whether or not they have been 
+        marked as translated. Double clicking on a row in the the tables present 
+        in either view will bring up a dialog box similar to one you have all 
+        ready seen:</P>
+      <P><IMG SRC="../images/screenshots/basic_translation.gif" WIDTH="513" HEIGHT="269"></P>
+      <P>The top three editable components are all disabled. This is because changing 
+        them would required editing files other than the one currently being viewed. 
+        This type of editing can be accomplished only from the base class. To 
+        change the translation value, alter the field labeled 'Translation:' with 
+        the new translation. You may also change the resource comment and lookup 
+        comments if you like, but this change will be visible only from RBManager. 
+        You also may find that the resource requires no translation if this is 
+        the case, just select the 'Translated' check box at the bottom of the 
+        dialog and press 'Edit'. If you change the translation, the 'Translated' 
+        check box will automatically check itself when you are finished.</P>
+      <P>Continue this process until you have completely translated this file, 
+        or leave the file untranslated, but save your work so that you or someone 
+        else can return to it later. To learn how to save your results, go to 
+        the next step.</P>
+      <P><A HREF="step4.html">Back to Step 4</A> -or- <A HREF="step6.html">Forward 
+        to Step 6</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/tutorial/step6.html b/unicodetools/com/ibm/rbm/docs/tutorial/step6.html
new file mode 100644
index 0000000..ba2580f
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/tutorial/step6.html
@@ -0,0 +1,131 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager Tutorial - Saving</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="index.html">Tutorial</A></LI>
+              <LI><A HREF="../views/index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" -->
+      <H2 ALIGN="CENTER">Step 6. Saving the Results</H2>
+      <P><B>Always Save Periodically</B></P>
+      <P>None of the work you do in managing the resource bundle is final until 
+        you have saved the results. The first time you save the resource bundle, 
+        you should select the 'Save Resource Bundle As...' option from the file 
+        menu. Select a folder in which to save the file and enter in the base 
+        class name or the base class name followed by the .properties suffix and 
+        press save.</P>
+      <P>Once this has been done, it is sufficient to chose the 'Save Resource 
+        Bundle' option from the file menu. If you are working with a versioning 
+        tool such as Microsoft's Visual Source Safe, etc., be sure that you have 
+        write priveleges to the entire bundle of files. Otherwise, you will recieve 
+        warning from RBManager that it was unable to write to all of the files.</P>
+      <P>A way to get around this is to save the resource files individually. 
+        In order to do this, right click on a resource file in the tree view and 
+        select the 'Save Resource File' option. This is not recommended if you 
+        have made changes to the entire resource bundle, but if you have only 
+        been doing translation work for a particular file, or a few files, saving 
+        in this manner can be useful.</P>
+      <P>If you ever want to change the location or base class name of the resource 
+        bundle, you may do so by resaving with the 'Save Resource Bundle As...' 
+        option.</P>
+      <P><B>Good Luck</B></P>
+      <P>You will find that using this tool will speed up the development process 
+        for your international application or web service. As this is only an 
+        alpha version release, be sure to check alphaworks frequently for updates 
+        in functionality and bug fixes.</P>
+      <P><A HREF="step5.html">Back to Step 5</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/index.html b/unicodetools/com/ibm/rbm/docs/views/index.html
new file mode 100644
index 0000000..6eaf8a6
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/index.html
@@ -0,0 +1,155 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - Functionality and Views</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <DIV ALIGN="CENTER"> 
+        <H2>Functionality and Views</H2>
+        <P ALIGN="CENTER">RB Manager offers five different ways to look at and 
+          manipulate resource bundles. Four of these views are found in the tabs 
+          located in the right portion of the display. The fifth is the tree view 
+          located to the left. In the following pages, the use of each of these 
+          views is explained.</P>
+        <H3 ALIGN="LEFT"> 
+          <UL>
+            <LI> 
+              <H4>View 1. <A HREF="view1.html">The Resource Bundle Tree</A></H4>
+            </LI>
+            <LI> 
+              <H4>View 2. <A HREF="view2.html">The Statistics Tab</A></H4>
+            </LI>
+            <LI> 
+              <H4>View 3. <A HREF="view3.html">The Untranslated Tab</A></H4>
+            </LI>
+            <LI> 
+              <H4>View 4. <A HREF="view4.html">The Groups Tab</A></H4>
+            </LI>
+            <LI> 
+              <H4>View 5. <A HREF="view5.html">The Search Tab</A></H4>
+            </LI>
+          </UL>
+        </H3>
+        <H4><A HREF="view1.html">Go to View 1</A></H4>
+      </DIV>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+<!--
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="2">
+  <TR>
+    <TD WIDTH="200" BGCOLOR="#CCCCFF">&nbsp;</TD>
+    <TD>
+      <DIV ALIGN="CENTER"><IMG SRC="../images/TitleLogo_transparent.gif" WIDTH="175" HEIGHT="50"></DIV>
+    </TD>
+  </TR>
+  <TR VALIGN="TOP"> 
+    <TD WIDTH="200" BGCOLOR="#CCCCFF"> 
+      <P><A HREF="index.html">RBManager</A></P>
+      <P><A HREF="RBReporter.html">RBReporter</A></P>
+      <P><A HREF="../tutorial/step1.html">System Requirements</A></P>
+      <P><A HREF="faq.html">FAQ</A></P>
+      <P>Topics</P>
+      <UL>
+        <LI><A HREF="../tutorial/index.html">Step-by-step Tutorial</A></LI>
+        <LI><A HREF="step1.html">Changing Prefences</A></LI>
+        <LI><A HREF="future_features.html">Future Release Features</A></LI>
+      </UL>
+    </TD>
+    <TD></TD>
+  </TR>
+</TABLE>
+-->
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/view1.html b/unicodetools/com/ibm/rbm/docs/views/view1.html
new file mode 100644
index 0000000..fe5d957
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/view1.html
@@ -0,0 +1,150 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - The Resource Bundle Tree</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">View 1. The Resource Bundle Tree</H3>
+      <P>Located on the left of the RB Manager application is a section for displaying 
+        a resource bundle in a tree view. Resource Bundles usually are made up 
+        of text or class files in a flat directory structure. However, the locale 
+        encodings given to each file makes a tree view a natural way to look at 
+        the bundle.</P>
+      <P>When RB Manager is initially launched, this view is empty, since there 
+        is no open resource bundle. Upon opening a valid resource bundle, the 
+        tree is updated to reflect the opened bundle. In the following screen 
+        shots, you will see the tree for the resource bundle associate with RB 
+        Manager itself.</P>
+      <P><IMG SRC="../images/screenshots/view_tree_basic.gif" WIDTH="642" HEIGHT="499"></P>
+      <P>The top most element of the tree (the root of the tree) represents the 
+        resource bundle as a whole. Below the root are resource files, which are 
+        represented with the file icons with a letter in the middle, and language, 
+        country, and variant branches. Language branches are represented by an 
+        icon with a globe. Beneath these can be language branches represented 
+        by an icon with a flag. Beneath these can be variant branches represented 
+        by an icon with a cartoon dialog symbol. Beneath any of the branch nodes, 
+        resource files can be found.</P>
+      <P>The name of the root of the tree is the base name of the resource bundle, 
+        in the example above, the bundle is called RBManager. The name of the 
+        file nodes in the tree will vary according to where in the tree they are. 
+        Each language file will display the language, country, and variant information 
+        that it knows about followed by the encoding of the file's locale in parenthesies. 
+        The branch nodes will indicate whether they are language, country, or 
+        variant branches, and will display the encoding associated with that branch.</P>
+      <P>RB Manager functions in two basic ways for everything it does, either 
+        for the resource bundle as a whole or for an individual resource file. 
+        To make changes and updates to the entire resource bundle, select the 
+        root node notated by the 'RB' icon at the top of the tree. This will also 
+        cause the statistics and search views to present results reflecting the 
+        status of the entire bundle. To work with an individual resource file, 
+        select a file from the tree by clicking on it. Now changes and views will 
+        reflect only this selected resource file.</P>
+      <P>Note that selecting the various branch nodes does not have any meaning 
+        in the current version of RBManager. In future versions the ability to 
+        work on subtrees may be added, but for now either select the resource 
+        bundle or an individual file.</P>
+      <P>Understanding the difference between working with the resource bundle 
+        and working with a resource file is crucial to using RB Manager. Normally 
+        developers adding resources or manager wishing to know the statuts of 
+        translation efforts will work from the root level. Translators and managers 
+        of individual resource files will more often work from the resource file 
+        level. Once the difference is understood, the functionality of the views 
+        in the tab will be easier to understand.</P>
+      <P ALIGN="CENTER"><A HREF="view2.html">View 2. The Statistics Tab</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/view2.html b/unicodetools/com/ibm/rbm/docs/views/view2.html
new file mode 100644
index 0000000..e249c49
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/view2.html
@@ -0,0 +1,161 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - The Statistics Tab</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">View 2. The Statistics Tab</H3>
+      <P>The first tab on the right panel of the RB Manager application is the 
+        Statistics tab. As with all of the tab views, the statistics tab looks 
+        and functions differently when working with the resource bundle as a whole 
+        than when working with an individual resource file. For an overview of 
+        this difference see <A HREF="view1.html">View 1</A>.</P>
+      <P><B>Working with a Resource Bundle</B></P>
+      <P>The screen shot below shows RB Manager and some statistics concerning 
+        the resource bundle associated with the application.</P>
+      <P><IMG SRC="../images/screenshots/view_stats_bundle.gif" WIDTH="642" HEIGHT="543"></P>
+      <P>Three basic areas are covered by this view, Resource Files, Resource 
+        Groups, and Resource Items.</P>
+      <P>In the Resource Files section, the total number of individual files is 
+        shown as well as the names of these files (made up of the language, country, 
+        and variant information known about the files). New resource files can 
+        be added to the bundle by pressing the 'Add a New Resource File' button 
+        or using the accelerator key (in this case 'N') in the manner specified 
+        by your operating system. New files can also be added through the Options 
+        menu.</P>
+      <P>In the Resource Groups section, the total number of groups associated 
+        with the bundle as well as an alphabetical list of the groups is displayed. 
+        For more information on Resource Groups, see the <A HREF="../tutorial/index.html">Tutorial</A>. 
+        New groups can be created by pressing the 'Add a New Resourece Group' 
+        button. This can also be done from the Options menu or the Groups tab 
+        view.</P>
+      <P>In the Resource Items view, the total number of resources in the bundle 
+        is displayed. This number represents the number of resources in the base 
+        class file, as the other resource files are not required to posses all 
+        of the resource items. In addition, the number of duplicated resource 
+        keys is displayed. This number should be zero or the resource bundle may 
+        not function the way it was intended to. The list box will display the 
+        names of the duplicated keys, so that the errors can be removed. Note 
+        that if you create your Resource Bundles through RB Manager, you should 
+        never have duplicate keys. However, if you imported the bundles from another 
+        source, this error can be a common one.</P>
+      <P><B>Working with a Resource File</B></P>
+      <P>The screen shot below shows the statistics view for an individual resource 
+        file, in this case the German (Deutsch) file. For our example, I have 
+        removed some of the translations from this file.</P>
+      <P><IMG SRC="../images/screenshots/view_stats_file.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>This view shows some meta data that is associated with the Resource File. 
+        This meta data has absolutely no impact on the functioning of the resource 
+        bundle within an application. It is there solely to aid development and 
+        translation teams in managing their efforts.</P>
+      <P>The Resource Title is a way to identify this file and will show at the 
+        top of most views when working with a resource file. The Comment can be 
+        used to specify anything special about this file. The Resource File Manager 
+        is the person in charge of translations in the locale associated with 
+        the file. The Language, Country, and Variant represent the long names 
+        (i.e. not the ISO encodings) of the language, country, and variant associate 
+        with the file. These are the names that show up in the Resource Tree.</P>
+      <P>Also displayed for the selected file is the total number of translations 
+        in this file. This number should be less than or equal to the number of 
+        translations in the bundle. The number of untranslated resource items 
+        is also shown. These statistics are useful in monitoring the progress 
+        of translation. To work with the untranslated items, a convenient view 
+        is given in the Untranslated tab view.</P>
+      <P ALIGN="CENTER"><A HREF="view3.html">View 3. The Untranslated Tab</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/view3.html b/unicodetools/com/ibm/rbm/docs/views/view3.html
new file mode 100644
index 0000000..eca2c47
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/view3.html
@@ -0,0 +1,155 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - The Untranslated Tab</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">View 3. The Untranslated Tab</H3>
+      <P>The Untranslated tab view, like all tab views, looks and functions differently 
+        when working with the resource bundle as a whole than when working with 
+        an individual resource file. For an overview of this difference see <A HREF="view1.html">View 
+        1</A>. The Untranslated tab view is most often used when working with 
+        individual resource files, and is probably the largest convenience that 
+        RB Manager offers over other methods of working with resource bundles.</P>
+      <P><B>Working with a Resource Bundle</B></P>
+      <P>The screen shot below shows RB Manager and a view of untranslated items 
+        for the entire resource bundle.</P>
+      <P><IMG SRC="../images/screenshots/view_untrans_bundle.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>From this view, resource bundles can not be edited. To do this you either 
+        have to go to the Groups tab view or select an individual resource file. 
+        The view is useful though for getting a picture of the translation status 
+        of the entire resource bundle.</P>
+      <P>In this view, each of the resource files is represented and the number 
+        of untranslated items is displayed as well as the resource key for each 
+        of those items. Scrolling up and down the view gives a complete look at 
+        the various files.</P>
+      <P><B>Working with a Resource File</B></P>
+      <P>The next screen shot shows the Untranslated tab view when working with 
+        an individual resource file. This is the view translators will probably 
+        use the most.</P>
+      <P><IMG SRC="../images/screenshots/view_untrans_file.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>Listed in the table is each of the resource currently marked as untranslated 
+        (for more on the meta data associated with each resource, see the <A HREF="../tutorial/index.html">Tutorial</A>). 
+        The table shows the resource key and group of the resource, which can 
+        not be edited from a resource file view, and the translation of the resource, 
+        which can be edited here.</P>
+      <P>To translate a resource, simply double click the row containing the resource. 
+        A dialog box will pop up allowing the resource file specific elements 
+        of the resource to be edited. That dialog box is shown here. Its use can 
+        be found in the Tutorial.</P>
+      <P><IMG SRC="../images/screenshots/view_untrans_dialog0.gif" WIDTH="513" HEIGHT="269"></P>
+      <P>In some cases, you may want to leave the translation as it stands. This 
+        is common for instance when working with variants of a language with little 
+        change from the language parent (e.g. Canadian English and U.S. English 
+        have relatively few differences).</P>
+      <P>There are two ways to handle this. One way is to select the resource 
+        and mark it as translated. This can be done by pressing the 'Mark Resource 
+        as Translated' button or double clicking the resource, checking the 'Translated' 
+        check box and clicking the 'Edit' button. The other way is to remove the 
+        resource from the resource file by selecting the resource and clicking 
+        'Delete Resource'.</P>
+      <P>Either way, the resource bundle should act the same when presenting translations 
+        to the user. In the former case, the translation from the resource file 
+        is used. In the latter case, the translation falls back to the one found 
+        in an ancestor resource file.</P>
+      <P>Note that only one resource can be edited at a time in the current version 
+        of RB Manager. Future versions will allow multiple selections of resources 
+        in this view.</P>
+      <P ALIGN="CENTER"><A HREF="view4.html">View 4. The Groups Tab</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/view4.html b/unicodetools/com/ibm/rbm/docs/views/view4.html
new file mode 100644
index 0000000..3be4292
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/view4.html
@@ -0,0 +1,145 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - The Groups Tab</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">View 4. The Groups Tab</H3>
+      <P>The Groups tab view, like all tab views, looks and functions differently 
+        when working with the resource bundle as a whole than when working with 
+        an individual resource file. For an overview of this difference see <A HREF="view1.html">View 
+        1</A>. RB Manager adds a level of heirarchy not commonly found in resource 
+        bundles. This addtional level is called Groups. For more information on 
+        Resource Groups see the <A HREF="../tutorial/index.html">Tutorial</A>.</P>
+      <P><B>Working with a Resource Bundle</B></P>
+      <P>The screen shot below shows RB Manager and a view of groups for the entire 
+        resource bundle.</P>
+      <P><IMG SRC="../images/screenshots/view_groups_bundle.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>Unlike the Untranslated tab view, this view allows the editing of resources. 
+        Editing or adding resources at this level affects the resource bundle 
+        as a whole. Thus if a resource has all ready been translated in a resource 
+        file, it will be marked as untranslated to reflect the change in the entire 
+        bundle.</P>
+      <P>Editing a resource is as simple as selecting the group from the drop 
+        down box at the top of the screen, double clicking a resource, making 
+        the desired change, and clicking 'Edit' on the dialog box resulting from 
+        the double click. Optionally, the resource can be edited by selecting 
+        it and pressing the 'Edit Resource' button instead of double clicking.</P>
+      <P>The Resource Group can also be edited. The name and comment associate 
+        with the group can be changed by pressing the 'Edit Group' button. Pressing 
+        the 'Delete Group' button will delete both the group and all resources 
+        contained within it. A dialog will prompt you when this button is pressed 
+        to make sure this is what you intend to do.</P>
+      <P>Resources created in the Group view will by default be placed in the 
+        group currently being shown. This can be changed however by selecting 
+        another group name from the resource creation dialog box.</P>
+      <P>This view is probably the most commonly used view by developers inserting 
+        new resources into a bundle.</P>
+      <P><B>Working with a Resource File</B></P>
+      <P>The next screen shot shows the Group tab view when working with an individual 
+        resource file.</P>
+      <P><IMG SRC="../images/screenshots/view_groups_file.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>The functionality of this view mostly mirrors that of the Untranslated 
+        tab view. More on that view is found in <A HREF="view3.html">View 3</A>. 
+        The only addition is that resources all ready marked as translated can 
+        be seen and edited from this view. Selecting a group from the drop down 
+        box will update the display with all resources, translated or not, from 
+        that group.</P>
+      <P ALIGN="CENTER"><A HREF="view5.html">View 5. The Search Tab</A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/docs/views/view5.html b/unicodetools/com/ibm/rbm/docs/views/view5.html
new file mode 100644
index 0000000..3cec09d
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/docs/views/view5.html
@@ -0,0 +1,131 @@
+<HTML><!-- #BeginTemplate "/Templates/MainTemplate.dwt" -->
+<HEAD>
+<!-- #BeginEditable "doctitle" --> 
+<TITLE>RB Manager - The Search Tab</TITLE>
+<!-- #EndEditable --> 
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<STYLE TYPE="TEXT/CSS">
+<!--
+.topicHead {  font-family: "Times New Roman", Times, serif; font-size: 14pt; font-weight: bold; text-align: center; color: #333333}
+.topicList {  font-family: Georgia, "Times New Roman", Times, serif; font-size: 9pt; color: #FF0099; list-style-image: url(../images/diamond_bullet.gif); text-decoration: none; font-weight: bold}
+.mainBlock {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify}
+-->
+</STYLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" TOPMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
+  <TR>
+    <TD ROWSPAN="2" COLSPAN="2" BACKGROUND="../images/template_ul.gif" HEIGHT="75"><IMG SRC="../images/spacer.gif" WIDTH="280" HEIGHT="1" HSPACE="0"></TD>
+		<TD HEIGHT="15"  WIDTH="100%" BACKGROUND="../images/template_u.gif"></TD>
+	</TR>
+	<TR>
+		<TD HEIGHT="60" >
+			<CENTER><IMG SRC="../images/TitleLogo_transparent.gif" VSPACE="0"></CENTER>
+		</TD>
+	</TR>
+	<TR>
+		
+    <TD WIDTH="200" BACKGROUND="../images/template_l.gif" VALIGN="top">
+		<TABLE WIDTH="180" CELLSPACING="0" CELLPADDING="1"> 
+      	<TR>
+			<TD CLASS="topicHead">General</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../system_requirements.html">System Requirements</A></LI>
+              <LI><A HREF="../faq.html">FAQ</A></LI>
+              <LI><A HREF="../future_features.html">Future Releases</A></LI>
+              <LI CLASS="topicList"><A HREF="../future_features.html">Version 
+                History</A></LI>
+            </UL>
+			</TD>
+		</TR>
+      	<TR>
+			<TD CLASS="topicHead">RB Manager</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	        <UL>
+              <LI><A HREF="../index.html">Home</A></LI>
+              <LI><A HREF="../tutorial/index.html">Tutorial</A></LI>
+              <LI><A HREF="index.html">Functionality and Views</A></LI>
+              <LI><A HREF="../lookandfeel.html">Look and Feel</A></LI>
+              <LI><A HREF="../menu.html">Menu Items</A></LI>
+              <LI CLASS="topicList"><A HREF="../tutorial/step1.html">Preferences</A></LI>
+            </UL>
+			</TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicHead">RB Reporter</TD>
+		</TR>
+		<TR>
+			<TD VALIGN="center"><IMG SRC="../images/template_line.gif"></TD>
+		</TR>
+		<TR>
+			<TD CLASS="topicList">
+	  <UL>
+              <LI><A HREF="../RBReporter.html">Home</A></LI>
+        <LI>Report Types</LI>
+              <LI><A HREF="../scanfile.html">Code Scanning</A></LI>
+            </UL>
+			</TD>
+		</TR>
+	</TABLE>
+
+      <P>&nbsp; </P>
+      </TD>
+		
+    <TD COLSPAN="2" VALIGN="top" CLASS="mainBlock"><!-- #BeginEditable "Main" --> 
+      <H3 ALIGN="CENTER">View 5. The Search Tab</H3>
+      <P>The Groups tab view, like all tab views, looks and functions differently 
+        when working with the resource bundle as a whole than when working with 
+        an individual resource file. However, unlike the other tab views, the 
+        differences are minimal. Searching from the bundle performs the search 
+        on the base class and edits to the found resources affect the entire bundle. 
+        Searching from a resource file restricts the search to that file and the 
+        changes are also restricted to that resource file.</P>
+      <P>A screen shot of the Search tab view for the resource bundle is given 
+        below. The view for the individual resource files is nearly identical.</P>
+      <P><IMG SRC="../images/screenshots/view_search.gif" WIDTH="671" HEIGHT="543"></P>
+      <P>There are two basic functions to this view, Find All and Replace All. 
+        Find All takes the parameters given it and populates the result table 
+        with any matches found (note that the current version of RB Manager does 
+        not support wild card characters or regular expressions). The resulting 
+        table can be edited as in the other views by doubling clicking a row in 
+        the table.</P>
+      <P>Replace All works by first finding all of the resources in the same manner 
+        as Find All and then replacing the text that is found with the text given 
+        in the Replace text box. It is recommended that you first perform Find 
+        All before Replace All. The current version of RB Manager does an all 
+        or nothing replace. Future versions may allow step by step replacement.</P>
+      <P>Using the check boxes on the page, you can specify any combination of 
+        three parts of the resources to search: Resource Keys, Translations, and 
+        Comments. A fourth check box allows you to make the search case sensitive.</P>
+      <P>This view was introduced in version 0.3a of RB Manager.</P>
+      <P ALIGN="CENTER"><A HREF="index.html">Back to the Functionality and View 
+        Index </A></P>
+      <!-- #EndEditable --></TD>
+	</TR>
+	<TR>
+		<TD BACKGROUND="../images/template_ll.gif" HEIGHT="40" WIDTH="200">
+			<!-- Comment -->
+		</TD>
+		<TD WIDTH="80">
+			<!-- Comment -->
+		</TD>
+		<TD>
+			<CENTER><SPAN CLASS="Copyright">Copyright 2000-2001 International Business Machines, All Rights Reserved</SPAN></CENTER>
+		</TD>
+	</TR>
+</TABLE>
+
+</BODY>
+<!-- #EndTemplate --></HTML>
diff --git a/unicodetools/com/ibm/rbm/gui/AboutDialog.java b/unicodetools/com/ibm/rbm/gui/AboutDialog.java
new file mode 100644
index 0000000..3925cb8
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/AboutDialog.java
@@ -0,0 +1,74 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import com.ibm.rbm.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+
+/** A dialog displaying information about this application */
+class AboutDialog {
+	private static JDialog dialog = null;
+	
+	public static void showDialog(Frame parent) {
+		if (dialog == null) {
+			dialog = new JDialog(parent, Resources.getTranslation("dialog_title_about_rbmanager"), false);
+			initComponents();
+		}
+		dialog.setVisible(true);
+	}
+	
+	private static void initComponents() {
+		dialog.getContentPane().setLayout(new BorderLayout());
+        JLabel logoLabel = null;
+		JLabel titleLabel = new JLabel(Resources.getTranslation("rbmanager"));
+		JLabel versionLabel = new JLabel(Resources.getTranslation("version", Package.getPackage("com.ibm.rbm").getImplementationVersion()));
+		JLabel copyrightLabel = new JLabel(Resources.getTranslation("copyright"));
+		JLabel contactLabel = new JLabel(Resources.getTranslation("rbmanager_contact"));
+		JPanel panel = new JPanel();
+		Box box = new Box(BoxLayout.Y_AXIS);
+		
+        try {
+            Class thisClass = Class.forName("com.ibm.rbm.gui.AboutDialog");
+		    logoLabel = new JLabel(new ImageIcon(thisClass.getResource("images/" +
+									      Resources.getTranslation("logo_filename"))));
+        } catch (ClassNotFoundException e) {
+            RBManagerGUI.debugMsg(e.toString());
+        }
+
+		box.add(titleLabel);
+		box.add(versionLabel);
+		box.add(Box.createVerticalStrut(10));
+		box.add(copyrightLabel);
+		box.add(Box.createVerticalStrut(5));
+		box.add(contactLabel);
+		
+		panel.add(box);
+		dialog.getContentPane().add(logoLabel, BorderLayout.WEST);
+		dialog.getContentPane().add(panel, BorderLayout.CENTER);
+		
+		dialog.addMouseListener(new MouseAdapter() {
+			public void mouseReleased(MouseEvent ev) {
+				hideDialog();
+			}
+		});
+		
+		//dialog.validate();
+		dialog.pack();
+		Point parentLoc = dialog.getParent().getLocation();
+		dialog.setLocation(new Point(parentLoc.x + 50, parentLoc.y + 50));
+		dialog.setResizable(false);
+	}
+	
+	private static void hideDialog() {
+		dialog.setVisible(false);
+		dialog.dispose();
+		dialog = null;
+	}
+}
diff --git a/unicodetools/com/ibm/rbm/gui/BundleGroupCreationDialog.java b/unicodetools/com/ibm/rbm/gui/BundleGroupCreationDialog.java
new file mode 100644
index 0000000..1ead212
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/BundleGroupCreationDialog.java
@@ -0,0 +1,145 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * A dialog which allows the user to create a new Bundle Group
+ */
+class BundleGroupCreationDialog extends JDialog {
+	RBManager rbm;
+	
+	// Helper data
+	int left_col_width = 125;
+	int right_col_width = 275;
+	int row_height = 25;
+	Dimension leftDim = new Dimension(left_col_width, row_height);
+	Dimension rightDim = new Dimension(right_col_width, row_height);
+	
+	// Components
+	Box mainBox = new Box(BoxLayout.Y_AXIS);
+	Box box1 = new Box(BoxLayout.X_AXIS);
+	Box box2 = new Box(BoxLayout.X_AXIS);
+	Box box3 = new Box(BoxLayout.X_AXIS);
+	
+	JTextArea instructionsArea = new JTextArea("");
+	JLabel nameLabel = new JLabel(Resources.getTranslation("dialog_group"));
+	JLabel commentLabel = new JLabel(Resources.getTranslation("dialog_group_comment"));
+	JTextField nameField = new JTextField("");
+	JTextField commentField = new JTextField("");
+	JButton createButton = new JButton(Resources.getTranslation("button_create"));
+	JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+	
+	
+	public BundleGroupCreationDialog(RBManager rbm, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.rbm = rbm;
+		initComponents();
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+	}
+	
+	boolean createGroup() {
+		if (rbm == null) return false;
+		return rbm.createGroup(nameField.getText().trim(), commentField.getText().trim());
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
+			boolean success = createGroup();
+			if (!success) {
+				String alert = Resources.getTranslation("error_create_group") + " " +
+							   Resources.getTranslation("error_try_again_group");
+				JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			} else {
+				setVisible(false);
+				dispose();
+			}
+		} else if (ev.getKeyCode() == KeyEvent.VK_CANCEL) {
+			closeWindow();
+		}
+	}
+	
+	private void initComponents(){
+		// Error check
+		if (rbm == null) {
+			String alert = Resources.getTranslation("error_no_bundle_for_group");
+			JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			closeWindow();
+			return;
+		}
+		
+		// Initialize values
+		
+		// Set up the components
+		nameLabel.setPreferredSize(leftDim);
+		nameField.setColumns(30);
+		commentLabel.setPreferredSize(leftDim);
+		commentField.setColumns(30);
+		getRootPane().setDefaultButton(createButton);
+		
+		box1.add(nameLabel); box1.add(nameField);
+		box2.add(commentLabel); box2.add(commentField);
+		box3.add(createButton);
+		box3.add(Box.createHorizontalStrut(5));
+		box3.add(cancelButton);
+		
+		instructionsArea.setBorder(BorderFactory.createEtchedBorder());
+		
+		// Add the appropriate listeners
+		cancelButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				JDialog dialog = (JDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent();
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		});
+		
+		createButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				BundleGroupCreationDialog dialog =
+					(BundleGroupCreationDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent();
+				boolean success = dialog.createGroup();
+				if (!success) {
+					String alert = Resources.getTranslation("error_create_group") + " " +
+								   Resources.getTranslation("error_try_again_group");
+					JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				} else {
+					dialog.setVisible(false);
+					dialog.dispose();
+				}
+			}
+		});
+		
+		// Complete the initialization of the frame
+		setLocation(new java.awt.Point(50, 50));
+		mainBox.removeAll();
+		mainBox.add(box1);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box2);
+		getContentPane().setLayout(new BorderLayout());
+		getContentPane().removeAll();
+		//getContentPane().add(instructionsArea, BorderLayout.NORTH);
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		getContentPane().add(box3, BorderLayout.SOUTH);
+		validateTree();
+		pack();
+		setVisible(true);
+		//setResizable(false);
+	}
+	
+	void closeWindow() {
+		setVisible(false);
+		dispose();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/BundleGroupEditDialog.java b/unicodetools/com/ibm/rbm/gui/BundleGroupEditDialog.java
new file mode 100644
index 0000000..a274bed
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/BundleGroupEditDialog.java
@@ -0,0 +1,146 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * A dialog which allows the user to create a new Bundle Group
+ */
+class BundleGroupEditDialog extends JDialog {
+	BundleGroup group;
+	
+	// Helper data
+	int left_col_width = 125;
+	int right_col_width = 275;
+	int row_height = 25;
+	Dimension leftDim = new Dimension(left_col_width, row_height);
+	Dimension rightDim = new Dimension(right_col_width, row_height);
+	
+	// Components
+	Box mainBox = new Box(BoxLayout.Y_AXIS);
+	Box box1 = new Box(BoxLayout.X_AXIS);
+	Box box2 = new Box(BoxLayout.X_AXIS);
+	Box box3 = new Box(BoxLayout.X_AXIS);
+	
+	JLabel nameLabel = new JLabel(Resources.getTranslation("dialog_group"));
+	JLabel commentLabel = new JLabel(Resources.getTranslation("dialog_group_comment"));
+	JTextField nameField = new JTextField("");
+	JTextField commentField = new JTextField("");
+	JButton editButton = new JButton(Resources.getTranslation("button_edit"));
+	JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+	
+	
+	public BundleGroupEditDialog(BundleGroup group, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.group = group;
+		initComponents();
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
+			boolean success = editGroup();
+			if (!success) {
+				String alert = Resources.getTranslation("error_modify_group");
+				JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error_internal"),
+											  JOptionPane.ERROR_MESSAGE);
+			} else {
+				setVisible(false);
+				dispose();
+			}
+		} else if (ev.getKeyCode() == KeyEvent.VK_CANCEL) {
+			closeWindow();
+		}
+	}
+	
+	boolean editGroup() {
+		if (group == null) return false;
+		group.setName(nameField.getText().trim());
+		group.setComment(commentField.getText().trim());
+		return true;
+	}
+	
+	private void initComponents(){
+		// Error check
+		if (group == null) {
+			String alert = Resources.getTranslation("error_modify_group");
+			JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error_internal"), JOptionPane.ERROR_MESSAGE);
+			closeWindow();
+			return;
+		}
+		
+		// Initialize values
+		
+		// Set up the components
+		nameLabel.setPreferredSize(leftDim);
+		nameField.setColumns(30);
+		commentLabel.setPreferredSize(leftDim);
+		commentField.setColumns(30);
+		
+		nameField.setText(group.getName());
+		commentField.setText(group.getComment());
+		getRootPane().setDefaultButton(editButton);
+		
+		box1.add(nameLabel); box1.add(nameField);
+		box2.add(commentLabel); box2.add(commentField);
+		box3.add(editButton);
+		box3.add(Box.createHorizontalStrut(5));
+		box3.add(cancelButton);
+		
+		// Add the appropriate listeners
+		cancelButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				JDialog dialog = (JDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent();
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		});
+		
+		editButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				BundleGroupEditDialog dialog =
+					(BundleGroupEditDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent();
+				boolean success = dialog.editGroup();
+				if (!success) {
+					String alert = Resources.getTranslation("error_modify_group");
+					JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error_internal"),
+												  JOptionPane.ERROR_MESSAGE);
+				} else {
+					dialog.setVisible(false);
+					dialog.dispose();
+				}
+			}
+		});
+		
+		// Complete the initialization of the frame
+		setLocation(new java.awt.Point(50, 50));
+		mainBox.removeAll();
+		mainBox.add(box1);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box2);
+		getContentPane().setLayout(new BorderLayout());
+		getContentPane().removeAll();
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		getContentPane().add(box3, BorderLayout.SOUTH);
+		validateTree();
+		pack();
+		setVisible(true);
+		//setResizable(false);
+	}
+	
+	void closeWindow() {
+		setVisible(false);
+		dispose();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/BundleItemCreationDialog.java b/unicodetools/com/ibm/rbm/gui/BundleItemCreationDialog.java
new file mode 100644
index 0000000..4333bad
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/BundleItemCreationDialog.java
@@ -0,0 +1,399 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * A dialog which allows the user to create a new Bundle Item
+ */
+class BundleItemCreationDialog extends JDialog {
+	RBManager rbm;
+	String groupName;
+	BundleItem item;
+	boolean firstInit = true;
+	
+	// Helper data
+	int left_col_width = 125;
+	int right_col_width = 275;
+	int row_height = 25;
+	Dimension leftDim = new Dimension(left_col_width, row_height);
+	Dimension rightDim = new Dimension(right_col_width, row_height);
+	
+	// Components
+	Box mainBox = new Box(BoxLayout.Y_AXIS);
+	Box box1 = new Box(BoxLayout.X_AXIS);
+	Box box2 = new Box(BoxLayout.X_AXIS);
+	Box box3 = new Box(BoxLayout.X_AXIS);
+	Box box4 = new Box(BoxLayout.X_AXIS);
+	Box box5 = new Box(BoxLayout.X_AXIS);
+	Box box6 = new Box(BoxLayout.X_AXIS);
+	
+	JLabel instructionsLabel = new JLabel("");
+	JLabel groupLabel = new JLabel(Resources.getTranslation("dialog_group"));
+	JLabel nameLabel = new JLabel(Resources.getTranslation("dialog_key"));
+	JLabel transLabel = new JLabel(Resources.getTranslation("dialog_translation"));
+	JLabel commentLabel = new JLabel(Resources.getTranslation("dialog_comment"));
+	JLabel lookupLabel = new JLabel(Resources.getTranslation("dialog_lookups"));
+	
+	JComboBox groupComboBox = new JComboBox();
+	JTextField nameField = new JTextField("");
+	JTextField transField = new JTextField("");
+	JTextField commentField = new JTextField("");
+	JTextField lookupFields[] = null;
+	JLabel noLookupLabel = null;
+	Box lookupBox = null;
+	Box lookupBoxes[] = null;
+	JLabel lookupLabels[] = null;
+	
+	JButton createButton = new JButton(Resources.getTranslation("button_create"));
+	JButton createMoreButton = new JButton(Resources.getTranslation("button_create_more"));
+	JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+	
+	Hashtable lookups = new Hashtable();
+	
+	public BundleItemCreationDialog(RBManager rbm, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.rbm = rbm;
+		groupName = null;
+		item = null;
+		initComponents();
+	}
+	
+	public BundleItemCreationDialog(String groupName, RBManager rbm, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.rbm = rbm;
+		this.groupName = groupName;
+		item = null;
+		initComponents();
+	}
+	
+	public BundleItemCreationDialog(BundleItem item, RBManager rbm, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.item = item;
+		this.rbm = rbm;
+		groupName = item.getParentGroup().getName();
+		initComponents();
+	}
+	
+	boolean createItem() {
+		if (rbm == null) return false;
+		Hashtable lookupHash = new Hashtable();
+		if (lookupBoxes != null) {
+			for (int i=0; i < lookupBoxes.length; i++) {
+				String nameText = lookupLabels[i].getText().trim();
+				String name = nameText.substring(nameText.indexOf("{")+1,nameText.indexOf("}"));
+				String value = lookupFields[i].getText().trim();
+				lookupHash.put(name,value);
+			}
+		}
+		return rbm.createItem(nameField.getText().trim(), transField.getText().trim(),
+							  ((BundleGroup)groupComboBox.getSelectedItem()).getName(),
+							  commentField.getText().trim(), lookupHash);
+	}
+	
+	boolean editItem() {
+		if (item == null) return false;
+		Hashtable lookupHash = new Hashtable();
+		if (lookupBoxes != null) {
+			for (int i=0; i < lookupBoxes.length; i++) {
+				String nameText = lookupLabels[i].getText().trim();
+				String name = nameText.substring(nameText.indexOf("{")+1,nameText.indexOf("}"));
+				String value = lookupFields[i].getText().trim();
+				lookupHash.put(name,value);
+			}
+		}
+		return rbm.editItem(item, nameField.getText().trim(),
+							transField.getText().trim(), ((BundleGroup)groupComboBox.getSelectedItem()).getName(),
+							commentField.getText().trim(), lookupHash); 
+	}
+	
+	private void clearComponents() {
+		nameField.setText("");
+		transField.setText("");
+		commentField.setText("");
+		initComponents();
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER && ev.getID() == KeyEvent.KEY_RELEASED) {
+			if (transField.hasFocus()) {
+				// If we are in the translation field, then enter should create a new line character, not exit the dialog
+				int caretPos = transField.getCaretPosition();
+				String oldText = transField.getText();
+				transField.setText(oldText.substring(0,caretPos) + "\n" + oldText.substring(caretPos,oldText.length()));
+				transField.setCaretPosition(caretPos+1);
+				validate();
+				setSize(getPreferredSize());
+				return;
+			}
+			
+			BundleItemCreationDialog dialog = this;
+			boolean success = false;
+			if (dialog.item == null) success = dialog.createItem();
+			else success = dialog.editItem();
+			if (!success) {
+				String alert = (item == null ? Resources.getTranslation("error_create_item") :
+											   Resources.getTranslation("error_modify_item"));
+				alert += " " + Resources.getTranslation("error_try_again_item");
+				JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error"),
+											  JOptionPane.ERROR_MESSAGE);
+			} else {
+				((RBManagerGUI)dialog.getParent()).updateDisplayPanels();
+				((RBManagerGUI)dialog.getParent()).invalidate();
+				//((RBManagerGUI)dialog.getParent()).validateMyTree();
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		} else if (ev.getKeyCode() == KeyEvent.VK_ESCAPE) {
+			closeWindow();
+		}
+	}
+	
+	private void initComponents(){
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+		// Error check
+		if (rbm == null || rbm.getBundles() == null) {
+			String alert = Resources.getTranslation("error_no_bundle_for_item");
+			JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			closeWindow();
+			return;
+		}
+		
+		// Initialize values
+		Bundle mainBundle = (Bundle)rbm.getBundles().firstElement();
+		if (firstInit) {
+			groupComboBox = new JComboBox(mainBundle.getGroupsAsVector());
+			if (groupName != null) {
+				for (int i = 0; i < groupComboBox.getItemCount(); i++) {
+					BundleGroup bg = (BundleGroup)groupComboBox.getItemAt(i);
+					if (bg.getName().equals(groupName)) {
+						groupComboBox.setSelectedIndex(i);
+						break;
+					}
+				}
+			}
+		}
+	
+		if (firstInit && item != null) {
+			// We are editing, not creating an item
+			createButton.setText(Resources.getTranslation("button_edit"));
+			createMoreButton.setText(Resources.getTranslation("button_edit_more"));
+			if (item.getKey() != null) nameField.setText(item.getKey());
+			if (item.getComment() != null) commentField.setText(item.getComment());
+			if (item.getTranslation() != null) transField.setText(item.getTranslation());
+			if (item.getLookups() != null) lookups = item.getLookups();
+		}
+		
+		String currentTrans = transField.getText();
+		// ** LOOKUPS **
+		// Update the lookups if necessary
+		if (lookupBoxes != null) {
+			for (int i=0; i < lookupBoxes.length; i++) {
+				String nameText = lookupLabels[i].getText().trim();
+				String name = nameText.substring(nameText.indexOf("{")+1,nameText.indexOf("}"));
+				String value = lookupFields[i].getText().trim();
+				lookups.put(name,value);
+			}
+		}
+		// Remove old lookups if necessary
+		Enumeration keys = lookups.keys();
+		while (keys.hasMoreElements()) {
+			String name = (String)keys.nextElement();
+			if (currentTrans.indexOf("{" + name + "}") < 0) {
+				lookups.remove(name);
+			}
+		}
+		// Add new lookups if neccesary
+		if (currentTrans != null && currentTrans.indexOf("{") >= 0) {
+			while (currentTrans.indexOf("{") >= 0) {
+				currentTrans = currentTrans.substring(currentTrans.indexOf("{")+1,currentTrans.length());
+				String name = currentTrans.substring(0,currentTrans.indexOf("}"));
+				if (!lookups.containsKey(name)) {
+					lookups.put(name,"");
+				}
+			}
+		}
+		// Remove components
+		box5.removeAll();
+		
+		// Now create the visual components for the lookups
+		if (lookups.size() > 0) {
+			noLookupLabel = null;
+			lookupBox = new Box(BoxLayout.Y_AXIS);
+			lookupBoxes = new Box[lookups.size()];
+			lookupFields = new JTextField[lookups.size()];
+			lookupLabels = new JLabel[lookups.size()];
+			int count = 0;
+			keys = lookups.keys();
+			while (keys.hasMoreElements()) {
+				String name = (String)keys.nextElement();
+				String value = (String)lookups.get(name);
+				RBManagerGUI.debugMsg("Lookup: " + name + " -> " + value);
+				RBManagerGUI.debugMsg(lookups.toString());
+				lookupBoxes[count] = new Box(BoxLayout.X_AXIS);
+				lookupFields[count] = new JTextField((value == null ? "" : value));
+				lookupLabels[count] = new JLabel("{" + name + "}");
+				lookupBoxes[count].add(Box.createHorizontalGlue());
+				lookupBoxes[count].add(lookupLabels[count]);
+				lookupBoxes[count].add(Box.createHorizontalStrut(5));
+				lookupBoxes[count].add(lookupFields[count]);
+				lookupBox.add(lookupBoxes[count]);
+				count++;
+			}
+		} else {
+			lookupBox = null;
+			lookupBoxes = null;
+			lookupFields = null;
+			lookupLabels = null;
+			noLookupLabel = new JLabel(Resources.getTranslation("none"));
+		}
+		
+		// Set up the components
+		if (firstInit) {
+			groupLabel.setPreferredSize(leftDim);
+			groupComboBox.setPreferredSize(rightDim);
+			nameLabel.setPreferredSize(leftDim);
+			nameField.setColumns(30);
+			commentLabel.setPreferredSize(leftDim);
+			commentField.setColumns(30);
+			transLabel.setPreferredSize(leftDim);
+			transField.setColumns(30);
+			lookupLabel.setPreferredSize(leftDim);
+			
+			box1.add(groupLabel); box1.add(groupComboBox);
+			box2.add(nameLabel); box2.add(nameField);
+			box4.add(commentLabel); box4.add(commentField);
+			box3.add(transLabel); box3.add(transField);
+			
+			createButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_create_trigger")));
+			createMoreButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_create_more_trigger")));
+			getRootPane().setDefaultButton(createButton);
+		}
+		box5.add(Box.createHorizontalGlue()); box5.add(lookupLabel); box5.add(Box.createHorizontalStrut(5));
+		if (noLookupLabel != null) {
+			noLookupLabel.setPreferredSize(rightDim);
+			box5.add(noLookupLabel);
+		}
+		else
+			box5.add(lookupBox);
+		if (firstInit) {
+			box6.add(createButton);
+			box6.add(Box.createHorizontalStrut(5));
+			if (item == null)
+				box6.add(createMoreButton);
+			box6.add(Box.createHorizontalStrut(5));
+			box6.add(cancelButton);
+		}
+		
+		instructionsLabel.setBorder(BorderFactory.createEtchedBorder());
+		
+		// Add the appropriate listeners
+		if (firstInit) {
+			cancelButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					JDialog dialog = (JDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+					dialog.setVisible(false);
+					dialog.dispose();
+				}
+			});
+		
+			createButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					BundleItemCreationDialog dialog =
+						(BundleItemCreationDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+					boolean success = false;
+					if (dialog.item == null) success = dialog.createItem();
+					else success = dialog.editItem();
+					if (!success) {
+						String alert = (item == null ? Resources.getTranslation("error_create_item") :
+													   Resources.getTranslation("error_modify_item"));
+						alert += " " + Resources.getTranslation("error_try_again_item");
+						JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error"),
+													  JOptionPane.ERROR_MESSAGE);
+					} else {
+						((RBManagerGUI)dialog.getParent()).updateDisplayPanels();
+						((RBManagerGUI)dialog.getParent()).invalidate();
+						//((RBManagerGUI)dialog.getParent()).validateMyTree();
+						dialog.setVisible(false);
+						dialog.dispose();
+					}
+				}
+			});
+			
+			createMoreButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					BundleItemCreationDialog dialog =
+						(BundleItemCreationDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+					boolean success = false;
+					if (dialog.item == null) success = createItem();
+					else success = dialog.editItem();
+					if (!success) {
+						String alert = (item == null ? Resources.getTranslation("error_create_item") :
+													   Resources.getTranslation("error_modify_item"));
+						alert += " " + Resources.getTranslation("error_try_again_item");
+						JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error"),
+													  JOptionPane.ERROR_MESSAGE);
+					} else {
+						((RBManagerGUI)dialog.getParent()).updateDisplayPanels();
+						((RBManagerGUI)dialog.getParent()).invalidate();
+						//((RBManagerGUI)dialog.getParent()).validateMyTree();
+						dialog.clearComponents();
+					}
+				}
+			});
+		
+			transField.addFocusListener(new FocusListener() {
+				public void focusGained(FocusEvent ev) {}
+				public void focusLost(FocusEvent ev) {
+					BundleItemCreationDialog dialog =
+						(BundleItemCreationDialog)((JTextField)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+					firstInit = false;
+					dialog.initComponents();
+				}
+			});
+		}
+		
+		// Complete the initialization of the frame
+		if (firstInit)
+			setLocation(new java.awt.Point(50, 50));
+		mainBox.removeAll();
+		//mainBox.add(instructionsLabel);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box1);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box2);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box3);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box4);
+		mainBox.add(Box.createVerticalStrut(5));
+		if (noLookupLabel == null) {
+			mainBox.add(box5);
+			mainBox.add(Box.createVerticalStrut(5));
+		}
+		mainBox.add(box6);
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		validateTree();
+		pack();
+		setVisible(true);
+		//setResizable(false);
+		firstInit = false;
+	}
+	
+	void closeWindow() {
+		setVisible(false);
+		dispose();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/BundleItemDialog.java b/unicodetools/com/ibm/rbm/gui/BundleItemDialog.java
new file mode 100644
index 0000000..52ec5ce
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/BundleItemDialog.java
@@ -0,0 +1,301 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.text.DateFormat;
+import java.util.*;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+//A dialog which displays the properties of a Bundle Item in an editable way
+
+class BundleItemDialog extends JDialog implements ActionListener {
+	RBManager rbm;
+	BundleItem item;
+	String user;
+	boolean firstInit = true;	
+	
+	// Helper data
+	int left_col_width = 125;
+	int right_col_width = 375;
+	int row_height = 25;
+	Dimension leftDim = new Dimension(left_col_width, row_height);
+	Dimension rightDim = new Dimension(right_col_width, row_height);
+	
+	// Components
+	Box mainBox = new Box(BoxLayout.Y_AXIS);
+	Box box0 = new Box(BoxLayout.X_AXIS);
+	Box box1 = new Box(BoxLayout.X_AXIS);
+	Box box2 = new Box(BoxLayout.X_AXIS);
+	Box box3 = new Box(BoxLayout.X_AXIS);
+	Box box4 = new Box(BoxLayout.X_AXIS);
+	Box box5 = new Box(BoxLayout.X_AXIS);
+	Box box6 = new Box(BoxLayout.X_AXIS);
+	Box box7 = new Box(BoxLayout.X_AXIS);
+	Box box8 = new Box(BoxLayout.X_AXIS);
+	
+	JLabel groupLabel = new JLabel(Resources.getTranslation("dialog_group")); 
+	JLabel keyLabel = new JLabel(Resources.getTranslation("dialog_key"));
+	JLabel defTransLabel = new JLabel(Resources.getTranslation("dialog_default_translation"));
+	JLabel transLabel = new JLabel(Resources.getTranslation("dialog_translation"));
+	JLabel commentLabel = new JLabel(Resources.getTranslation("dialog_comment"));
+	JLabel lookupLabel = new JLabel(Resources.getTranslation("dialog_lookups"));
+	JLabel createdLabel = new JLabel(Resources.getTranslation("dialog_created"));
+	JLabel modifiedLabel = new JLabel(Resources.getTranslation("dialog_modified"));
+	
+	JComboBox groupComboBox;
+	JTextField keyField;
+	JTextField transField;
+	JTextField defTransField;
+	JTextField commentField;
+	JLabel createdLabel2;
+	JLabel modifiedLabel2;
+	JLabel lookupLabel2 = null;
+	JCheckBox transCheckBox;
+	JButton saveButton = new JButton(Resources.getTranslation("button_edit"));
+	JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+	Box lookupBox = null;
+	Box lookups[] = null;
+	JLabel lookupLabels[] = null;
+	JTextField lookupFields[] = null;
+	
+	public BundleItemDialog(RBManager rbm, BundleItem item, String user, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.rbm = rbm;
+		this.user = user;
+		this.item = item;
+		initComponents();
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER && ev.getID() == KeyEvent.KEY_RELEASED) {
+			actionPerformed(null);
+		} else if (ev.getKeyCode() == KeyEvent.VK_CANCEL) {
+			closeWindow();
+		}
+	}
+	
+	private void initComponents(){
+		// Error check
+		if (item == null) closeWindow();
+		if (!firstInit) closeWindow();
+		
+		// Initialize values
+		DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
+		Bundle bundle = item.getParentGroup().getParentBundle();
+		
+		// Lookup the default translation
+		String defTrans = new String();
+		Object o = ((Bundle)rbm.getBundles().firstElement()).allItems.get(item.getKey());
+		if (o != null)
+			defTrans = ((BundleItem)o).getTranslation();
+		
+		keyField = new JTextField(item.getKey());
+		keyField.setEnabled(false);
+		defTransField = new JTextField(defTrans);
+		defTransField.setEnabled(false);
+		transField = new JTextField(item.getTranslation());
+		commentField = new JTextField(item.getComment());
+		String created[] = {df.format(item.getCreatedDate()), item.getCreator()};
+		String modified[] = {df.format(item.getModifiedDate()), item.getModifier()};
+		String createdString = Resources.getTranslation("dialog_date_person", created);
+		String modifiedString = Resources.getTranslation("dialog_date_person", modified);
+		createdLabel2 = new JLabel(item.getCreator() == null ? df.format(item.getCreatedDate()) : createdString);
+		modifiedLabel2 = new JLabel(item.getModifier() == null ? df.format(item.getModifiedDate()) : modifiedString);
+		transCheckBox = new JCheckBox(Resources.getTranslation("dialog_checkbox_translated"),item.isTranslated());
+		
+		groupComboBox = new JComboBox(bundle.getGroupsAsVector());
+		for (int i=0; i < groupComboBox.getItemCount(); i++) {
+			BundleGroup bg = (BundleGroup)groupComboBox.getItemAt(i);
+			if (bg.getName().equals(item.getParentGroup().getName())) {
+				groupComboBox.setSelectedIndex(i);
+				break;
+			}
+		}
+		groupComboBox.setEnabled(false);
+		
+		// Set up the components
+		groupLabel.setPreferredSize(leftDim);
+		groupComboBox.setPreferredSize(rightDim);
+		keyLabel.setPreferredSize(leftDim);
+		//keyField.setPreferredSize(rightDim);
+		keyField.setColumns(30);
+		defTransLabel.setPreferredSize(leftDim);
+		//defTransField.setPreferredSize(rightDim);
+		defTransField.setColumns(30);
+		transLabel.setPreferredSize(leftDim);
+		//transField.setPreferredSize(rightDim);
+		transField.setColumns(30);
+		commentLabel.setPreferredSize(leftDim);
+		//commentField.setPreferredSize(rightDim);
+		commentField.setColumns(30);
+		lookupLabel.setPreferredSize(leftDim);
+		createdLabel.setPreferredSize(leftDim);
+		createdLabel2.setPreferredSize(rightDim);
+		modifiedLabel.setPreferredSize(leftDim);
+		modifiedLabel2.setPreferredSize(rightDim);
+		// Special setup for the lookup items if they exist
+		if (item.getLookups().size() < 1) {
+			lookupLabel2 = new JLabel(Resources.getTranslation("none"));
+			lookupLabel2.setPreferredSize(rightDim);
+		} else {
+			lookupBox = new Box(BoxLayout.Y_AXIS);
+			lookups = new Box[item.getLookups().size()];
+			lookupLabels = new JLabel[item.getLookups().size()];
+			lookupFields = new JTextField[item.getLookups().size()];
+			Enumeration keys = item.getLookups().keys();
+			for (int i = 0; i < item.getLookups().size(); i++) {
+				String name = (String)keys.nextElement();
+				String value = (String)item.getLookups().get(name);
+				RBManagerGUI.debugMsg("X - Lookup: " + name + " -> " + value);
+				lookups[i] = new Box(BoxLayout.X_AXIS);
+				lookupLabels[i] = new JLabel("{" + name + "}");
+				lookupLabels[i].setPreferredSize(new Dimension(30,row_height));
+				lookupFields[i] = new JTextField(value);
+				lookupFields[i].setPreferredSize(new Dimension(right_col_width-35,row_height));
+				lookups[i].add(Box.createHorizontalGlue());
+				lookups[i].add(lookupLabels[i]);
+				lookups[i].add(Box.createHorizontalStrut(5));
+				lookups[i].add(lookupFields[i]);
+				lookupBox.add(lookups[i]);
+			}
+		}
+		
+		// Add the appropriate listeners
+		if (firstInit) {
+			cancelButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					JDialog dialog = (JDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+					dialog.setVisible(false);
+					dialog.dispose();
+				}
+			});
+		
+			saveButton.addActionListener(this);
+			getRootPane().setDefaultButton(saveButton);
+
+			transField.addFocusListener(new TranslationFocusListener(item.getTranslation(),transCheckBox));
+		}
+		
+		box0.add(groupLabel); box0.add(groupComboBox);
+		box1.add(keyLabel); box1.add(keyField);
+		box8.add(defTransLabel); box8.add(defTransField);
+		box2.add(transLabel); box2.add(transField);
+		box3.add(commentLabel); box3.add(commentField);
+		box4.add(Box.createHorizontalGlue()); box4.add(lookupLabel);
+		if (lookupLabel2 != null) {
+			box4.add(Box.createHorizontalStrut(5));
+			box4.add(lookupLabel2);
+		} else if (lookupBox != null) {
+			box4.add(Box.createHorizontalStrut(5));
+			box4.add(lookupBox);
+		}
+		box5.add(Box.createHorizontalGlue()); box5.add(createdLabel);
+		box5.add(Box.createHorizontalStrut(5)); box5.add(createdLabel2);
+		box6.add(Box.createHorizontalGlue()); box6.add(modifiedLabel);
+		box6.add(Box.createHorizontalStrut(5)); box6.add(modifiedLabel2);
+		box7.add(transCheckBox); box7.add(saveButton); box7.add(cancelButton);
+		
+		// Complete the initialization of the frame
+		setLocation(new java.awt.Point(50, 50));
+		mainBox.removeAll();
+		mainBox.add(box0);
+		mainBox.add(box1);
+		mainBox.add(box8);
+		mainBox.add(box2);
+		mainBox.add(box3);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box4);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box5);
+		mainBox.add(box6);
+		mainBox.add(Box.createVerticalStrut(5));
+		mainBox.add(box7);
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		validateTree();
+		pack();
+		setVisible(true);
+		//setResizable(false);
+		
+		firstInit = false;
+	}
+	
+	void closeWindow() {
+		setVisible(false);
+		dispose();
+	}
+	
+	public void actionPerformed(ActionEvent ev) {
+		if (ev == null && transField.hasFocus()) {
+			// If we are in the translation field, then enter should create a new line character, not exit the dialog
+			int caretPos = transField.getCaretPosition();
+			String oldText = transField.getText();
+			transField.setText(oldText.substring(0,caretPos) + "\n" + oldText.substring(caretPos,oldText.length()));
+			transField.setCaretPosition(caretPos+1);
+			validate();
+			setSize(getPreferredSize());
+			return;
+		}
+		
+		// This action is called when the 'Edit' button is pressed
+		item.setTranslation(transField.getText().trim());
+		if (!item.getKey().equals(keyField.getText())) item.setKey(keyField.getText().trim());
+		item.setComment(commentField.getText());
+		item.setModifiedDate(new Date());
+		item.setModifier(user);
+		item.setTranslated(transCheckBox.isSelected());
+		if (transCheckBox.isSelected()) {
+			// Remove this item from the untranslated items, if it is there
+			item.getParentGroup().getParentBundle().removeUntranslatedItem(item.getKey());
+		} else {
+			item.getParentGroup().getParentBundle().addUntranslatedItem(item);
+		}
+		if (lookups != null) {
+			item.setLookups(new Hashtable());
+			for (int i=0; i < lookups.length; i++) {
+				String name = lookupLabels[i].getText().trim();
+				if (name.indexOf("{") >= 0) name = name.substring(name.indexOf("{")+1,name.length());
+				if (name.indexOf("}") >= 0) name = name.substring(0, name.indexOf("}"));
+				String value = lookupFields[i].getText().trim();
+				item.getLookups().put(name,value);
+			}
+		}
+		closeWindow();
+	}
+}
+ 
+/**
+ * A listener which checks a translation box to see if it changes, if it does, it marks the word as translated in a check box
+ */
+class TranslationFocusListener implements FocusListener {
+	String original;
+	JCheckBox cbox;
+	boolean selected;
+	
+	public TranslationFocusListener(String original, JCheckBox cbox) {
+		this.original = original;
+		this.cbox = cbox;
+		selected = cbox.isSelected();
+	}
+	
+	public void focusGained(FocusEvent ev) {}
+	
+	public void focusLost(FocusEvent ev) {
+		JTextField field = (JTextField)ev.getSource();
+		if (field.getText().equals(original)) {
+			cbox.setSelected(selected);
+			return;
+		}
+		cbox.setSelected(true);
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/PreferencesDialog.java b/unicodetools/com/ibm/rbm/gui/PreferencesDialog.java
new file mode 100644
index 0000000..063ce87
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/PreferencesDialog.java
@@ -0,0 +1,282 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.IOException;
+import java.util.Locale;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * Dialog to display to a user about their preferences. 
+ */
+class PreferencesDialog extends JDialog {
+	String userName;
+	Locale locale;
+	LookAndFeel laf;
+	RBManagerGUI gui;
+	
+	// ** COMPONENTS **
+	JTextField   nameField;
+	JRadioButton machineRadio;
+	JRadioButton definedRadio;
+	JRadioButton isoRadio;
+	JComboBox    machineCombo;
+	JComboBox    definedCombo;
+	JComboBox    isoLangCombo;
+	JComboBox    isoCounCombo;
+	JComboBox    lafCombo;
+	JButton      okButton;
+	JButton      cancelButton;
+	
+	public PreferencesDialog(RBManagerGUI gui) {
+		super(gui, Resources.getTranslation("dialog_title_preferences"), true);
+		this.gui = gui;
+		userName = gui.getUser();
+		locale = Resources.getLocale();
+		laf = UIManager.getLookAndFeel();
+		
+		initComponents();
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
+			updatePreferences();
+		} else if (ev.getKeyCode() == KeyEvent.VK_CANCEL) {
+			thisWindowClosing();
+		}
+	}
+	
+	private void initComponents() {
+		UIManager.LookAndFeelInfo lafi[] = UIManager.getInstalledLookAndFeels();
+		String lafn[] = new String[lafi.length];
+		for (int i=0; i < lafi.length; i++) {
+			lafn[i] = lafi[i].getName();
+		}
+		
+		// COMPONENTS
+		
+		JPanel panel1 = new JPanel();
+		JPanel panel2 = new JPanel();
+		JPanel panel3 = new JPanel();
+		JPanel panel4 = new JPanel();
+		Box    mainBox = new Box(BoxLayout.Y_AXIS);
+		Box    localeBox1 = new Box(BoxLayout.Y_AXIS);
+		Box    localeBox2 = new Box(BoxLayout.Y_AXIS);
+		JPanel localePanel = new JPanel();
+		
+		Dimension localeDim1 = new Dimension(200,25);
+		Dimension localeDim2 = new Dimension(150,25);
+		Dimension localeDim3 = new Dimension(50,25);
+		
+		JLabel nameLabel = new JLabel(Resources.getTranslation("dialog_preferences_username"));
+		JLabel lafLabel = new JLabel(Resources.getTranslation("dialog_preferences_lookandfeel"));
+		JLabel warnLabel = new JLabel(Resources.getTranslation("dialog_preferences_locale_warning"));
+		JLabel underscoreLabel = new JLabel("_");
+		
+		nameField = new JTextField(userName);
+		machineRadio = new JRadioButton(Resources.getTranslation("dialog_preferences_locale_machine"), false);
+		definedRadio = new JRadioButton(Resources.getTranslation("dialog_preferences_locale_defined"), true);
+		isoRadio = new JRadioButton(Resources.getTranslation("dialog_preferences_locale_iso"), false);
+		machineCombo = new JComboBox(Locale.getAvailableLocales());
+		definedCombo = new JComboBox(Resources.getAvailableLocales());
+		isoLangCombo = new JComboBox(Locale.getISOLanguages());
+		isoCounCombo = new JComboBox(Locale.getISOCountries());
+		lafCombo = new JComboBox(lafn);
+		okButton = new JButton(Resources.getTranslation("button_update"));
+		cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+		
+		machineRadio.setPreferredSize(localeDim1);
+		definedRadio.setPreferredSize(localeDim1);
+		isoRadio.setPreferredSize(localeDim1);
+		
+		nameLabel.setPreferredSize(localeDim1);
+		lafLabel.setPreferredSize(localeDim1);
+		
+		//localePanel.setPreferredSize(localeDim2);
+		machineCombo.setPreferredSize(localeDim2);
+		definedCombo.setPreferredSize(localeDim2);
+		
+		nameField.setPreferredSize(localeDim2);
+		lafCombo.setPreferredSize(localeDim2);
+		
+		isoLangCombo.setPreferredSize(localeDim3);
+		isoCounCombo.setPreferredSize(localeDim3);
+		
+		// Select the appropriate entries in the combo boxes
+		String lafname = UIManager.getLookAndFeel().getName();
+		for (int i = 0; i < lafCombo.getItemCount(); i++) {
+			if (lafCombo.getItemAt(i).toString().equals(lafname)) {
+				lafCombo.setSelectedIndex(i);
+				break;
+			}
+		}
+		String locname = Resources.getLocale().toString();
+		String loclang = Resources.getLocale().getLanguage();
+		String loccoun = Resources.getLocale().getCountry();
+		for (int i = 0; i < machineCombo.getItemCount(); i++) {
+			if (machineCombo.getItemAt(i).toString().equalsIgnoreCase(locname)) {
+				machineCombo.setSelectedIndex(i);
+				break;
+			}
+		}
+		for (int i = 0; i < definedCombo.getItemCount(); i++) {
+			if (definedCombo.getItemAt(i).toString().equalsIgnoreCase(locname)) {
+				definedCombo.setSelectedIndex(i);
+				break;
+			}
+		}
+		for (int i = 0; i < isoLangCombo.getItemCount(); i++) {
+			if (isoLangCombo.getItemAt(i).toString().equalsIgnoreCase(loclang)) {
+				isoLangCombo.setSelectedIndex(i);
+				break;
+			}
+		}
+		for (int i = 0; i < isoCounCombo.getItemCount(); i++) {
+			if (isoCounCombo.getItemAt(i).toString().equalsIgnoreCase(loccoun)) {
+				isoCounCombo.setSelectedIndex(i);
+				break;
+			}
+		}
+		
+		// Set the radio button group
+		ButtonGroup group = new ButtonGroup();
+		group.add(machineRadio);
+		group.add(definedRadio);
+		group.add(isoRadio);
+		
+		nameField.setColumns(15);
+		
+		// Add action listeners
+		cancelButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				thisWindowClosing();
+			}
+		});
+		
+		okButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				updatePreferences();
+			}
+		});
+		getRootPane().setDefaultButton(okButton);
+		
+		panel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+														  Resources.getTranslation("dialog_preferences_locale")));
+		panel3.setLayout(new BorderLayout());
+		
+		localePanel.add(isoLangCombo);
+		localePanel.add(underscoreLabel);
+		localePanel.add(isoCounCombo);
+		
+		localeBox1.add(machineRadio);
+		localeBox1.add(definedRadio);
+		localeBox1.add(isoRadio);
+		localeBox2.add(machineCombo);
+		localeBox2.add(definedCombo);
+		localeBox2.add(localePanel);
+		localeBox1.add(Box.createVerticalStrut(5));
+		localeBox2.add(Box.createVerticalStrut(5));
+		
+		panel1.add(nameLabel);
+		panel1.add(nameField);
+		panel2.add(lafLabel);
+		panel2.add(lafCombo);
+		panel3.add(localeBox1, BorderLayout.WEST);
+		panel3.add(localeBox2, BorderLayout.EAST);
+		panel3.add(warnLabel, BorderLayout.SOUTH);
+		panel4.add(okButton);
+		panel4.add(cancelButton);
+		
+		mainBox.add(panel1);
+		mainBox.add(panel2);
+		mainBox.add(panel3);
+		mainBox.add(panel4);
+		
+		getContentPane().add(mainBox);
+		//validate();
+		pack();
+		setVisible(true);
+	}
+	
+	private void thisWindowClosing() {
+		setVisible(false);
+		dispose();
+	}
+	
+	void updatePreferences() {
+		// Set the user name
+		gui.setUser(nameField.getText().trim());
+		// Set the look and feel
+		try {
+			UIManager.LookAndFeelInfo lafi[] = UIManager.getInstalledLookAndFeels();
+			for (int i=0; i < lafi.length; i++) {
+				if (lafi[i].getName().equals(lafCombo.getSelectedItem().toString())) {
+					UIManager.setLookAndFeel(lafi[i].getClassName());
+					gui.updateUI();
+					break;
+				}
+			}
+		} catch (Exception e) {
+			System.err.println("Could not change the look and feel");
+			e.printStackTrace(System.err);
+		}
+		// Set the locale
+		String language = null;
+		String country = null;
+		String variant = null;
+		if (definedRadio.isSelected()) {
+			String encoding = "";
+			if (definedCombo.getSelectedItem() != null) {
+				encoding = definedCombo.getSelectedItem().toString();
+			}
+			language = Resources.getLanguage(encoding);
+			country = Resources.getCountry(encoding);
+			variant = Resources.getVariant(encoding);
+			RBManagerGUI.debugMsg("Before: " + language + "_" + country + "_" + variant);
+			if (country == null) country = new String();
+			if (variant == null) locale = new Locale(language, country);
+			else locale = new Locale(language, country, variant);
+			RBManagerGUI.debugMsg("After: " + locale.toString());
+		} else if (machineRadio.isSelected()) {
+			String encoding = machineCombo.getSelectedItem().toString();
+			language = Resources.getLanguage(encoding);
+			country = Resources.getCountry(encoding);
+			variant = Resources.getVariant(encoding);
+			if (country == null) country = new String();
+			if (variant == null) locale = new Locale(language, country);
+			else locale = new Locale(language, country, variant);
+		} else if (isoRadio.isSelected()) {
+			language = isoLangCombo.getSelectedItem().toString();
+			country = isoCounCombo.getSelectedItem().toString();
+			if (variant == null) locale = new Locale(language, country);
+			else locale = new Locale(language, country, variant);
+		}
+		Resources.setLocale(locale);
+		gui.updateLocale(locale);
+			
+		// Write the preferences
+		Preferences.setPreference("username", gui.getUser());
+		Preferences.setPreference("lookandfeel", UIManager.getLookAndFeel().getClass().getName());
+		Preferences.setPreference("locale", locale.toString());
+		try {
+			Preferences.savePreferences();
+		} catch (IOException ioe) {
+			JOptionPane.showMessageDialog(this, Resources.getTranslation("error_preferences_save"),
+										  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			ioe.printStackTrace(System.err);
+		}
+		
+		// Close the window
+		thisWindowClosing();
+	}
+}
diff --git a/unicodetools/com/ibm/rbm/gui/RBGroupPanel.java b/unicodetools/com/ibm/rbm/gui/RBGroupPanel.java
new file mode 100644
index 0000000..91b419f
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBGroupPanel.java
@@ -0,0 +1,530 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+import javax.swing.table.*;
+import javax.swing.event.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * The class used to display groups
+ */
+class RBGroupPanel extends JPanel {
+	RBManager rbm;
+	Bundle bundle;
+	RBManagerGUI listener;
+	
+	// Components
+	JLabel      jLabelGroupTitle;
+	JLabel      jLabelGroupNameTitle;
+	JLabel      jLabelGroupCommentTitle;
+	JLabel      jLabelGroupComment;
+	JComboBox   jComboBoxGroup;
+	JTable      jTableGroupTable;
+	JScrollPane jScrollPaneGroupTable;
+	
+	// Components - Manager
+	JList       jListGroup;
+	JButton     createItemButton;
+	JButton     createGroupButton;
+	JButton     editItemButton;
+	JButton     editGroupButton;
+	JButton     deleteItemButton;
+	JButton     deleteGroupButton;
+	JPanel      itemPanel;
+	JPanel      groupPanel;
+	
+	public RBGroupPanel(RBManagerGUI gui) {
+		super();
+		listener = gui;
+	}
+	
+	public void setBundle(Bundle b) {
+		rbm = null;
+		if (bundle == null) {
+			bundle = b;
+			initComponents();
+		} else if (bundle != b) {
+			bundle = b;
+			updateComponents();
+		}
+	}
+	
+	public void setManager(RBManager m) {
+		bundle = null;
+		if (rbm == null) {
+			rbm = m;
+			initComponents();
+		} else if (rbm != m) {
+			rbm = m;
+			updateComponents();
+		}
+	}
+	
+	public void removeElements() {
+		if (rbm != null || bundle != null) {
+			rbm = null;
+			bundle = null;
+			initComponents();
+		}
+	}
+	
+	// Marks the selected resource as translated and removes from this view
+	private void markSelectedResourceAsTranslated() {
+		if (bundle == null) return;
+		if (jTableGroupTable.getSelectedRow() < 0) return;
+		if (jTableGroupTable.getModel() instanceof GroupItemsTableModel) {
+			int row = jTableGroupTable.getSelectedRow();
+			GroupItemsTableModel model = (GroupItemsTableModel)jTableGroupTable.getModel();
+			BundleItem item = model.getBundleItem(row);
+			item.setTranslated(true);
+			model.update();
+		}
+	}
+	
+	// Removes the selected resource from the resource file
+	private void deleteSelectedResource() {
+		if (bundle == null) return;
+		if (jTableGroupTable.getSelectedRow() < 0) return;
+		if (jTableGroupTable.getModel() instanceof GroupItemsTableModel) {
+			int row = jTableGroupTable.getSelectedRow();
+			GroupItemsTableModel model = (GroupItemsTableModel)jTableGroupTable.getModel();
+			BundleItem item = model.getBundleItem(row);
+			if (item.getParentGroup() != null && item.getParentGroup().getParentBundle() != null) {
+				Bundle parentBundle = item.getParentGroup().getParentBundle();
+				parentBundle.removeItem(item.getKey());
+			}
+			model.update();
+		}
+	}
+		
+	private void initComponents() {
+		// Initialize components
+		if (bundle != null) {
+			jLabelGroupTitle          = new JLabel(bundle.name);
+			jComboBoxGroup            = new JComboBox(new GroupComboBoxModel(bundle));
+			
+			jTableGroupTable          = new JTable(new GroupItemsTableModel((BundleGroup)jComboBoxGroup.getSelectedItem()));
+			jScrollPaneGroupTable     = new JScrollPane(jTableGroupTable);
+			jLabelGroupNameTitle      = new JLabel(Resources.getTranslation("basegroup_group_name"));
+			jLabelGroupCommentTitle   = new JLabel(Resources.getTranslation("basegroup_group_comment"));
+			jLabelGroupComment        = new JLabel(((BundleGroup)jComboBoxGroup.getSelectedItem()).getComment());
+			
+			// Lower panel components
+			JPanel  lowerPanel = new JPanel();
+			JButton deleteButton = new JButton(Resources.getTranslation("button_delete_resource"));
+			JButton translateButton = new JButton(Resources.getTranslation("button_mark_translated"));
+			
+			deleteButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_delete_resource_trigger")));
+			translateButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_mark_translated_trigger")));
+			lowerPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("languageuntrans_selected_resources_options")));
+			lowerPanel.setLayout(new GridLayout(1,2));
+			
+			jLabelGroupNameTitle.setHorizontalAlignment(SwingConstants.LEFT);
+			
+			jTableGroupTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+			jTableGroupTable.addMouseListener(listener);
+			
+			jComboBoxGroup.addActionListener(new GroupComboActionListener(this));
+			
+			jLabelGroupTitle.setFont(new Font("SansSerif",Font.PLAIN,18));
+			
+			// Add action listeners
+			deleteButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					deleteSelectedResource();
+				}
+			});
+			
+			translateButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					markSelectedResourceAsTranslated();
+				}
+			});
+			
+			// Update the display
+			setLayout(new GridBagLayout());
+			GridBagConstraints gbc = new GridBagConstraints();
+			removeAll();
+			lowerPanel.add(deleteButton);
+			lowerPanel.add(translateButton);
+
+			gbc.weightx = 1.0;
+			gbc.weighty = 0.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			gbc.fill = GridBagConstraints.HORIZONTAL;
+			add(jLabelGroupTitle, gbc);
+			gbc.weightx = 0.0;
+			gbc.gridwidth = 1;
+			add(jLabelGroupNameTitle, gbc);
+			gbc.weightx = 1.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			add(jComboBoxGroup, gbc);
+			gbc.weightx = 0.0;
+			gbc.gridwidth = 1;
+			add(jLabelGroupCommentTitle, gbc);
+			gbc.weightx = 1.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			add(jLabelGroupComment, gbc);
+			gbc.fill = GridBagConstraints.BOTH;
+			gbc.weighty = 1.0;
+			add(jScrollPaneGroupTable, gbc);
+			gbc.weighty = 0.0;
+			gbc.fill = GridBagConstraints.HORIZONTAL;
+			add(lowerPanel, gbc);
+		} else if (rbm != null) {
+			Bundle mainBundle = (Bundle)rbm.getBundles().firstElement();
+			jLabelGroupTitle          = new JLabel(rbm.getBaseClass() + " - " + Resources.getTranslation("groups"));
+			jComboBoxGroup            = new JComboBox(new GroupComboBoxModel(mainBundle));//mainBundle.getGroupsAsVector());
+			
+			jListGroup                = new JList(new GroupItemsListModel((BundleGroup)jComboBoxGroup.getSelectedItem()));
+			jScrollPaneGroupTable     = new JScrollPane(jListGroup);
+			jLabelGroupNameTitle      = new JLabel(Resources.getTranslation("basegroup_group_name"));
+			jLabelGroupCommentTitle   = new JLabel(Resources.getTranslation("basegroup_group_comment"));
+			try {
+				jLabelGroupComment    = new JLabel(((BundleGroup)jComboBoxGroup.getSelectedItem()).getComment());
+			} catch (NullPointerException npe) {
+				jLabelGroupComment    = new JLabel("");
+			}
+			
+			createItemButton          = new JButton(Resources.getTranslation("button_create_resource"));
+			createGroupButton         = new JButton(Resources.getTranslation("button_create_group"));
+			deleteItemButton          = new JButton(Resources.getTranslation("button_delete_resource"));
+			deleteGroupButton         = new JButton(Resources.getTranslation("button_delete_group"));
+			editItemButton            = new JButton(Resources.getTranslation("button_edit_resource"));
+			editGroupButton           = new JButton(Resources.getTranslation("button_edit_group"));
+			
+			itemPanel                 = new JPanel();
+			groupPanel                = new JPanel();
+			
+			itemPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+																  Resources.getTranslation("basegroup_item_options")));
+			groupPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+																  Resources.getTranslation("basegroup_group_options")));
+			itemPanel.setLayout(new GridLayout(1,3));
+			groupPanel.setLayout(new GridLayout(1,3));
+			itemPanel.setMaximumSize(new Dimension(20000,50));
+			groupPanel.setMaximumSize(new Dimension(20000,50));
+			
+			createItemButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_create_resource_trigger")));
+			editItemButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_edit_resource_trigger")));
+			deleteItemButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_delete_resource_trigger")));
+			createGroupButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_create_group_trigger")));
+			
+			jListGroup.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+			
+			jComboBoxGroup.addActionListener(new GroupComboActionListener(this));
+			
+			jLabelGroupTitle.setFont(new Font("SansSerif",Font.PLAIN,18));
+
+			// Add the listeners
+			jListGroup.addMouseListener(new MouseAdapter() {
+				public void mouseClicked(MouseEvent ev) { 
+					if(ev.getClickCount() == 2 && ev.getSource() instanceof JList) {
+						// A double click means they want to edit a bundle item
+						if (((JList)ev.getSource()).getSelectedValue() != null)
+							new BundleItemCreationDialog((BundleItem)((JList)ev.getSource()).getSelectedValue(),
+								listener.rbm, listener, Resources.getTranslation("dialog_title_edit_item"), true);
+					}
+				}
+			});
+			
+			createItemButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					new BundleItemCreationDialog(((BundleGroup)jComboBoxGroup.getSelectedItem()).getName(),
+												 listener.rbm, listener,
+												 Resources.getTranslation("dialog_title_new_item"), true);
+					updateComponents();
+				}
+			});
+			createGroupButton.addActionListener(listener);
+			editItemButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					if (jListGroup.getSelectedValue() != null)
+						new BundleItemCreationDialog((BundleItem)jListGroup.getSelectedValue(),
+							listener.rbm, listener, Resources.getTranslation("dialog_title_edit_item"), true);
+					updateComponents();
+				}
+			});
+			editGroupButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					new BundleGroupEditDialog((BundleGroup)jComboBoxGroup.getSelectedItem(),
+											  listener, Resources.getTranslation("dialog_title_edit_group"), true);
+					updateComponents();
+				}
+			});
+			deleteGroupButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					int response = JOptionPane.showConfirmDialog(listener,
+						Resources.getTranslation("dialog_warning_delete_group"),
+						Resources.getTranslation("dialog_title_delete_group"), JOptionPane.OK_CANCEL_OPTION,
+						JOptionPane.WARNING_MESSAGE);
+					if (response == JOptionPane.OK_OPTION) {
+						// Delete the group 
+						int index = jComboBoxGroup.getSelectedIndex();
+						BundleGroup group = (BundleGroup)jComboBoxGroup.getSelectedItem();
+						if (group.getName().equals("Ungrouped Items"))
+							return;
+						if (index < jComboBoxGroup.getItemCount()-1)
+							jComboBoxGroup.setSelectedIndex(index+1);
+						else
+							jComboBoxGroup.setSelectedIndex(index-1);
+						rbm.deleteGroup(group.getName());
+					}
+					updateComponents();
+				}
+			});
+			
+			deleteItemButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					int response = JOptionPane.showConfirmDialog(listener,
+						Resources.getTranslation("dialog_warning_delete_item"),
+						Resources.getTranslation("dialog_title_delete_item"), JOptionPane.OK_CANCEL_OPTION,
+						JOptionPane.WARNING_MESSAGE);
+					if (response == JOptionPane.OK_OPTION) {
+						Object o = jListGroup.getSelectedValue();
+						if (o != null) {
+							BundleItem item = (BundleItem) o;
+							handleDeleteItem(item.getKey());
+							//panel.rbm.deleteItem(item.getKey());
+						}
+					}
+					updateComponents();
+				}
+			});
+			
+			// Update the display
+			setLayout(new GridBagLayout());
+			GridBagConstraints gbc = new GridBagConstraints();
+			removeAll();
+			itemPanel.add(createItemButton, BorderLayout.WEST);
+			itemPanel.add(editItemButton, BorderLayout.CENTER);
+			itemPanel.add(deleteItemButton, BorderLayout.EAST);
+			groupPanel.add(createGroupButton, BorderLayout.WEST);
+			groupPanel.add(editGroupButton, BorderLayout.CENTER);
+			groupPanel.add(deleteGroupButton, BorderLayout.EAST);
+
+			
+			gbc.weightx = 1.0;
+			gbc.weighty = 0.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			gbc.fill = GridBagConstraints.HORIZONTAL;
+			add(jLabelGroupTitle, gbc);
+			gbc.weightx = 0.0;
+			gbc.gridwidth = 1;
+			add(jLabelGroupNameTitle, gbc);
+			gbc.weightx = 1.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			add(jComboBoxGroup, gbc);
+			gbc.weightx = 0.0;
+			gbc.gridwidth = 1;
+			add(jLabelGroupCommentTitle, gbc);
+			gbc.weightx = 1.0;
+			gbc.gridwidth = GridBagConstraints.REMAINDER;
+			add(jLabelGroupComment, gbc);
+			gbc.fill = GridBagConstraints.BOTH;
+			gbc.weighty = 1.0;
+			add(jScrollPaneGroupTable, gbc);
+			gbc.weighty = 0.0;
+			gbc.fill = GridBagConstraints.HORIZONTAL;
+			add(groupPanel, gbc);
+			add(itemPanel, gbc);
+		} else {
+			removeAll();
+		}
+	}
+	
+	public void updateComponents() {
+		// Initialize components
+		if (bundle != null) {
+			jLabelGroupTitle.setText(bundle.name);
+			
+			((GroupItemsTableModel)jTableGroupTable.getModel()).setGroup((BundleGroup)jComboBoxGroup.getSelectedItem());
+			jLabelGroupComment.setText(((BundleGroup)jComboBoxGroup.getSelectedItem()).getComment());
+			
+			jTableGroupTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+			
+			// Update the group comment
+			jLabelGroupComment.setText(((BundleGroup)jComboBoxGroup.getSelectedItem()).getComment());
+			((GroupComboBoxModel)jComboBoxGroup.getModel()).update();
+		} else if (rbm != null) {
+			
+			// Update the list of groups
+//			try {
+				((GroupComboBoxModel)jComboBoxGroup.getModel()).update();
+//			}
+//			catch (Exception e) {}
+			// Update the group comment
+			if ((BundleGroup)jComboBoxGroup.getSelectedItem() != null)
+				jLabelGroupComment.setText(((BundleGroup)jComboBoxGroup.getSelectedItem()).getComment());
+			else
+				jLabelGroupComment.setText("");
+			// Update the list of resources
+			ListModel lmodel = jListGroup.getModel();
+			if (lmodel instanceof GroupItemsListModel) {
+				//((GroupItemsListModel)lmodel).update();
+				((GroupItemsListModel)lmodel).setGroup((BundleGroup)jComboBoxGroup.getSelectedItem());
+			}
+			else {
+				GroupItemsListModel newModel = new GroupItemsListModel((BundleGroup)jComboBoxGroup.getSelectedItem());
+				RBManagerGUI.debugMsg("List Model not as anticipated: " + lmodel.getClass().getName());
+				jListGroup.setModel(newModel);
+				newModel.update();
+			}
+		} else {
+			RBManagerGUI.debugMsg("Update, but no active components");
+			removeAll();
+		}
+		//validate();
+	}
+	
+	private void handleDeleteItem(String key) {
+		if (rbm != null) rbm.deleteItem(key);
+	}
+}
+
+/**
+ * The action listener which monitors changes in the group to display
+ */
+class GroupComboActionListener implements ActionListener {
+	RBGroupPanel panel;
+	
+	protected GroupComboActionListener(RBGroupPanel panel) {
+		this.panel = panel;
+	}
+	
+	public void actionPerformed(ActionEvent ev) {
+		panel.updateComponents();
+	}
+}
+
+/**
+ * The list model for groups
+ */
+class GroupItemsListModel extends AbstractListModel {
+	BundleGroup group;
+	
+	public void setGroup(BundleGroup group) {
+		this.group = group;
+		update();
+	}
+	
+	public GroupItemsListModel(BundleGroup group) {
+		this.group = group;
+	}
+	
+	public int getSize() {
+		if (group == null)
+			return 0;
+		int result = group.getItemCount();
+		return result;
+	}
+	
+	public Object getElementAt(int index) {
+		return group.getBundleItem(index);
+	}
+	
+	public void update() {
+		fireContentsChanged(this, 0, getSize()-1);
+	}
+}
+
+/**
+ * The table model for searched Items
+ */
+class GroupComboBoxModel extends DefaultComboBoxModel {
+	Bundle bundle;
+	
+	public GroupComboBoxModel (Bundle bundle) {
+		this.bundle = bundle;
+		setSelectedItem(bundle.getBundleGroup(0));
+	}
+	
+	public int getSize() {
+		return bundle.getGroupCount();
+	}
+	
+	public Object getElementAt(int index) {
+		return bundle.getBundleGroup(index);
+	}
+	
+	public Object getSelectedItem() {
+		return super.getSelectedItem();
+		//return getElementAt(0);
+	}
+	
+	public void update() {
+		fireContentsChanged(this, 0, getSize()-1);
+	}
+}
+
+/**
+ * The table model for bundle groups
+ */
+class GroupItemsTableModel extends AbstractTableModel {
+	BundleGroup group;
+	
+	public GroupItemsTableModel(BundleGroup group) {
+		this.group = group;
+	}
+	
+	public int getColumnCount() { return 3; }
+		    
+	public int getRowCount() {
+		return group.getItemCount();
+	}
+	
+	public void setGroup(BundleGroup bg) {
+		group = bg;
+		fireTableChanged(new TableModelEvent(this));
+	}
+			
+	public Object getValueAt(int row, int col) {
+		BundleItem item = group.getBundleItem(row);
+				
+		String retStr = null;
+				
+		switch(col) {
+		case 0:
+			retStr = item.getKey();
+			break;
+		case 1:
+			retStr = item.getTranslation();
+			break;
+		case 2:
+			retStr = (item.getComment() == null ? "" : item.getComment());
+			break;
+		default:
+			retStr = Resources.getTranslation("table_cell_error");
+		}
+				
+		return retStr;
+	}
+	
+	public String getColumnName(int col) {
+		if (col == 0) return Resources.getTranslation("languagegroup_column_key");
+		else if (col == 1) return Resources.getTranslation("languagegroup_column_translation");
+		else if (col == 2) return Resources.getTranslation("languagegroup_column_comment");
+		else return Resources.getTranslation("table_column_error");
+	}
+	
+	public BundleItem getBundleItem(int row) {
+		if (row >= group.getItemCount())
+		    return null;
+		return group.getBundleItem(row);
+	}
+	
+	public void update() {
+		fireTableDataChanged();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/RBManagerGUI.java b/unicodetools/com/ibm/rbm/gui/RBManagerGUI.java
new file mode 100644
index 0000000..c9f4566
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBManagerGUI.java
@@ -0,0 +1,1815 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.tree.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * The Graphical User Interface for working with and through a Resource Bundle Manager. The GUI has no public main
+ * method. It is instead instantiated from running the main method in RBManager. For help with using this interface,
+ * consult the documentation included in the project.
+ * 
+ * @author Jared Jackson
+ * @see com.ibm.rbm.RBManager
+ */
+public class RBManagerGUI extends JFrame implements ActionListener, MouseListener, ChangeListener, TreeSelectionListener
+{
+	// CONSTANTS
+	private static final int buffer = 20;
+	private static final Dimension dimMain = new Dimension(750,550);
+	private static final Dimension dimMainMax = new Dimension(2000,1500);
+	private static final Dimension dimMainMin = new Dimension(550,350);
+	private static final Dimension dimTop = new Dimension(dimMain.width - buffer,50);
+	private static final Dimension dimTopMax = new Dimension(dimMainMax.width - buffer,50);
+	private static final Dimension dimTopMin = new Dimension(dimMainMin.width - buffer,50);
+	private static final Dimension dimBottom = new Dimension(dimMain.width - buffer,dimMain.height-dimTop.height - buffer);
+	private static final Dimension dimBottomMax = new Dimension(dimMainMax.width - buffer,dimMainMax.height-dimTopMin.height - buffer);
+	private static final Dimension dimBottomMin = new Dimension(dimMainMin.width - buffer,dimMainMin.height-dimTopMax.height - buffer);
+	private static final Dimension dimLeft = new Dimension(175,dimBottom.height - buffer);
+	private static final Dimension dimRight = new Dimension(dimMain.width-dimLeft.width - buffer,dimBottom.height - buffer);
+	
+	/**
+	 * Used for toggling the debug mode
+	 */
+	public static final boolean debug = false;
+	/**
+	 * Used to count debug messages
+	 */
+	public static int debugcount = 0;
+	
+	// member declarations
+	
+	// ** DATA **
+	RBManager rbm = null;
+	String userName = Resources.getTranslation("unknown_user");
+	
+	DefaultMutableTreeNode activeNode = null;
+	
+	// ** MAIN MENU **
+	RBManagerMenuBar         jMenuBarMain = null;
+
+	// ** CONTENT PANES **
+	Box          boxMain = new Box(BoxLayout.Y_AXIS);
+	//JPanel       jPanelTop = new JPanel();
+	JPanel       jPanelBottom = new JPanel();
+	JSplitPane   jSplitPaneMain = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
+
+	// ** SPLIT PANE COMPONENTS **
+	JTree        jTreeDisplay = new JTree();
+	JTabbedPane  jTabbedPaneMain = new JTabbedPane();
+	RBStatisticsPanel        jPanelStats = new RBStatisticsPanel();
+	RBUntranslatedPanel      jPanelUntrans = new RBUntranslatedPanel(this);
+	RBGroupPanel             jPanelGroups = new RBGroupPanel(this);
+	RBSearchPanel            jPanelSearch = new RBSearchPanel(this);
+	JScrollPane  jScrollPaneTree = new JScrollPane(jTreeDisplay,
+													ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+													ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+	// ** PROJECT VIEW SPLIT PANE COMPONENTS
+	JTabbedPane              treeTabbedPane = new JTabbedPane();
+	JTree                    projectTree = new JTree();
+	JScrollPane              projectScrollPane = new JScrollPane(projectTree, 
+																ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+																ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+	RBProjectItemPanel       projectPanel = new RBProjectItemPanel(this);
+	RBProject                project = null;
+	
+	// ** File Chooser **
+	JFileChooser openFileChooser = new JFileChooser();
+	JFileChooser saveFileChooser = new JFileChooser();
+	JFileChooser projectFileChooser = new JFileChooser();
+	
+	/**
+	 * Creation of the GUI should be immediately followed by the method calls to initComponents() and setVisible(true).
+	 * These methods were not called by default for programming discretion
+	 */
+	
+	public RBManagerGUI()
+	{
+	}
+	
+	/**
+	 * Inherits from JFrame.validate(), with some component updates
+	 */
+	
+	public void validate() {
+		super.validate();
+		updateDisplayPanels();
+	}
+	
+	/**
+	 * Initial construction of all of the GUI components. This method should be called immediately following the
+	 * construction of the GUI object.
+	 */
+	
+	public void initComponents() throws Exception
+	{
+		this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+		// the following code sets the frame's initial state
+		
+		openFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				
+				String name = f.getName();
+				if (!(name.toLowerCase().endsWith(".properties"))) return false;
+				if (name.indexOf("_") > 0) return false;
+				return true;
+			}
+	
+			public String getDescription() {
+				return Resources.getTranslation("dialog_file_filter_description");
+			}
+		});
+		
+		saveFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				
+				String name = f.getName();
+				if (!(name.toLowerCase().endsWith(".properties"))) return false;
+				if (name.indexOf("_") > 0) return false;
+				return true;
+			}
+	
+			public String getDescription() {
+				return Resources.getTranslation("dialog_file_filter_description");
+			}
+		});
+		
+		projectFileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
+			public boolean accept(File f) {
+				if (f.isDirectory()) return true;
+				
+				String name = f.getName();
+				if (!(name.toLowerCase().endsWith(".rbproject"))) return false;
+				return true;
+			}
+			
+			public String getDescription() {
+				return Resources.getTranslation("dialog_project_filter_description");	
+			}
+		});
+
+        // ** The Main program icon **
+        setIconImage((new ImageIcon(getClass().getResource("images/tree_icon_bundle.gif"))).getImage());
+		
+		// ** MAIN MENU BAR ITEMS **
+		jMenuBarMain = new RBManagerMenuBar(this);
+		
+		// ** DISPLAY TREE **
+		//jScrollPaneTree.setSize(dimLeft);
+		updateDisplayTree();
+		updateProjectTree();
+		updateProjectPanels();
+		
+		jPanelStats.setSize(dimRight);
+		jPanelUntrans.setSize(dimRight);
+		jPanelGroups.setSize(dimRight);
+		jPanelSearch.setSize(dimRight);
+		
+		// ** MAIN TABBED PANE **
+		jTabbedPaneMain.setSize(dimRight);
+		jTabbedPaneMain.addTab(Resources.getTranslation("tab_statistics"), jPanelStats);
+		jTabbedPaneMain.addTab(Resources.getTranslation("tab_untranslated"), jPanelUntrans);
+		jTabbedPaneMain.addTab(Resources.getTranslation("tab_groups"), jPanelGroups);
+		jTabbedPaneMain.addTab(Resources.getTranslation("tab_search"), jPanelSearch);
+		
+		// ** LEFT TABBED PANE **
+		treeTabbedPane.setSize(dimLeft);
+		treeTabbedPane.setPreferredSize(dimLeft);
+		treeTabbedPane.addTab(Resources.getTranslation("tab_bundle"), jScrollPaneTree);
+		treeTabbedPane.addTab(Resources.getTranslation("tab_project"), projectScrollPane);
+		treeTabbedPane.addChangeListener(this);
+		
+		// ** MAIN SPLIT PANE **
+		//jSplitPaneMain.setSize(dimBottom);
+		//jSplitPaneMain.setLeftComponent(jScrollPaneTree);
+		jSplitPaneMain.setLeftComponent(treeTabbedPane);
+		jSplitPaneMain.setRightComponent(jTabbedPaneMain);
+		jSplitPaneMain.setContinuousLayout(true);
+		
+		// ** BOTTOM PANEL **
+		//jPanelBottom.setPreferredSize(dimBottom);
+		jPanelBottom.setMaximumSize(dimBottomMax);
+		jPanelBottom.setMinimumSize(dimBottomMin);
+		jPanelBottom.setBorder(BorderFactory.createLineBorder(Color.black));
+		jPanelBottom.setLayout(new BorderLayout(1,1));
+		jPanelBottom.removeAll();
+		jPanelBottom.add(jSplitPaneMain, BorderLayout.CENTER);
+		
+		// ** MAIN FRAME SETUP **
+		dimMain.height += jMenuBarMain.getPreferredSize().height;
+		setSize(dimMain);
+		((JComponent)getContentPane()).setMaximumSize(dimMainMax);
+		((JComponent)getContentPane()).setMinimumSize(dimMainMin);
+		setJMenuBar(jMenuBarMain);
+		getContentPane().removeAll();
+		getContentPane().add(jPanelBottom, BorderLayout.CENTER);
+		setTitle(Resources.getTranslation("resource_bundle_manager"));
+		validateTree();
+		
+		addWindowListener(new java.awt.event.WindowAdapter() {
+			public void windowClosing(java.awt.event.WindowEvent e) {
+				thisWindowClosing(e);
+			}
+		});
+	}
+  
+  	private boolean mShown = false;
+	
+	/**
+	 * Reveals the private method of JFrame.validateTree()
+	 */
+	
+	public void validateMyTree() {
+		validateTree();
+	}
+	
+	/**
+	 * Creates a new Resource File (i.e. English, English Canada, Finnish, etc.)
+	 */
+	
+	public void createResourceFile() {
+		new ResourceCreationDialog(rbm, this, Resources.getTranslation("dialog_title_new_file"), true);
+	}
+	
+	/**
+	 * Creates a new group for grouping BundleItems
+	 */
+	
+	public void createBundleGroup() {
+		new BundleGroupCreationDialog(rbm, this, Resources.getTranslation("dialog_title_new_group"), true);
+		updateDisplayPanels();
+	}
+	
+	/**
+	 * Creates a new BundleItem
+	 */
+	
+	public void createBundleItem() {
+		new BundleItemCreationDialog(rbm, this, Resources.getTranslation("dialog_title_new_item"), true);
+		updateDisplayPanels();
+		updateProjectTree();
+	}
+	
+	/**
+	 * Handles events generated
+	 */
+	
+	public void valueChanged(TreeSelectionEvent ev) {
+		if (ev.getSource() == projectTree) updateProjectPanels();
+		else if (ev.getSource() == jTreeDisplay) {
+			TreePath selPath = jTreeDisplay.getSelectionPath();
+			activeNode = (DefaultMutableTreeNode)selPath.getLastPathComponent();
+			updateDisplayPanels();
+			/*
+			int selRow = jTreeDisplay.getRowForLocation(ev.getX(), ev.getY());
+			TreePath selPath = jTreeDisplay.getPathForLocation(ev.getX(), ev.getY());
+			if (selRow != -1) {
+            if (ev.getClickCount() == 1 && ev.getSource() == jTreeDisplay) {
+				
+				System.out.println("Other tree");
+			} else if (ev.getClickCount() == 1 && ev.getSource() == projectTree) {
+				System.out.println("Mouse pressed");
+				updateProjectPanels();	
+			} else System.out.println(String.valueOf(ev.getClickCount()) + " " + ev.getSource().toString());
+			
+			*/
+		}
+	}
+	
+	public void stateChanged(ChangeEvent ev) {
+		if (ev.getSource() == treeTabbedPane) {
+			int index = treeTabbedPane.getSelectedIndex();	
+			String title = treeTabbedPane.getTitleAt(index);
+			if (title.equals(Resources.getTranslation("tab_bundle"))) {
+				jSplitPaneMain.setRightComponent(jTabbedPaneMain);
+				updateDisplayPanels();
+			} else if (title.equals(Resources.getTranslation("tab_project"))) {
+				jSplitPaneMain.setRightComponent(projectPanel);
+				updateProjectPanels();
+			}
+		}
+	}
+	
+	public void actionPerformed(ActionEvent ev) {
+		if (ev.getID() == ActionEvent.ACTION_PERFORMED) {
+			if (ev.getSource() instanceof JMenuItem && ((JMenuItem)ev.getSource()).getName() != null &&
+				((JMenuItem)ev.getSource()).getName().startsWith("__")) {               // Menu -> File -> __Recent File
+				// This item is a recent file selection. We need to open that file
+				String fileLocation = ((JMenuItem)ev.getSource()).getName();
+				fileLocation = fileLocation.substring(2,fileLocation.length());
+				try {
+					rbm = new RBManager(new File(fileLocation));
+					updateDisplayTree();
+					updateProjectTree();
+					updateProjectPanels();
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this,Resources.getTranslation("error_opening_file", ev.getActionCommand()),
+												  Resources.getTranslation("dialog_title_error_opening_file"),
+												  JOptionPane.ERROR_MESSAGE);
+					rbm = null;
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_save")) &&
+					   ((JMenuItem)ev.getSource()).getName() != null) {                // Popup Tree Menu -> Save
+				String selectedEncoding = ((JMenuItem)ev.getSource()).getName();
+				saveResources(selectedEncoding);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_hide")) &&
+					   ((JMenuItem)ev.getSource()).getName() != null) {                // Popup Tree Menu -> Hide
+				String selectedEncoding = ((JMenuItem)ev.getSource()).getName();
+				// Should I prompt for this?
+				hideResources(selectedEncoding);
+			}  else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_delete")) &&
+					   ((JMenuItem)ev.getSource()).getName() != null) {                // Popup Tree Menu -> Delete
+				String selectedEncoding = ((JMenuItem)ev.getSource()).getName();
+				int response = JOptionPane.showConfirmDialog(this,
+					Resources.getTranslation("dialog_delete_warning"),
+					Resources.getTranslation("dialog_title_quit"), JOptionPane.YES_NO_CANCEL_OPTION,
+					JOptionPane.WARNING_MESSAGE);
+				if (response == JOptionPane.YES_OPTION) {
+					deleteResources(selectedEncoding);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_new_project"))) {
+				String response = JOptionPane.showInputDialog(this,                   // Popup Project Menu -> New Project
+					Resources.getTranslation("dialog_new_project"), Resources.getTranslation("dialog_title_new_project"),
+					JOptionPane.QUESTION_MESSAGE);
+				if (response == null || response.trim().equals("")) return;
+				project = new RBProject(response);
+				updateProjectTree();
+				updateProjectPanels();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_open_project"))) {
+				int result = projectFileChooser.showOpenDialog(this);                // Popup Project Menu -> Open Project
+				if (result == JFileChooser.APPROVE_OPTION) {
+					File f = projectFileChooser.getSelectedFile();
+					try {
+						project = new RBProject(f);
+						updateProjectTree();
+						updateProjectPanels();
+					} catch (Exception ex) {
+						JOptionPane.showMessageDialog(this,
+							Resources.getTranslation("error_creating_project"),
+							Resources.getTranslation("dialog_title_error"), JOptionPane.ERROR_MESSAGE);
+					}
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_save_project"))) {
+				int result = projectFileChooser.showSaveDialog(this);                // Popup Project Menu -> Save Project
+				if (result == JFileChooser.APPROVE_OPTION) {
+					File f = projectFileChooser.getSelectedFile();
+					try {
+						project.write(f);
+					} catch (Exception ex) {
+						JOptionPane.showMessageDialog(this,
+							Resources.getTranslation("error_saving_project"),
+							Resources.getTranslation("dialog_title_error"), JOptionPane.ERROR_MESSAGE);
+					}
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_add_project_bundle"))) {
+				int result = openFileChooser.showOpenDialog(this);                   // Popup Project Menu -> Add Bundle
+				if (result == JFileChooser.APPROVE_OPTION) {
+					File f = openFileChooser.getSelectedFile();
+					try {
+						project.addBundle(f.getAbsolutePath());
+						updateProjectTree();
+						updateProjectPanels();
+					} catch (Exception ex) {
+						JOptionPane.showMessageDialog(this,
+							Resources.getTranslation("error_adding_project_bundle"),
+							Resources.getTranslation("dialog_title_error"), JOptionPane.ERROR_MESSAGE);
+					}
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_remove_project_bundle"))) {
+				String bundleName = ((JMenuItem)ev.getSource()).getName();           // Popup Project Menu -> Remove Bundle
+				project.removeBundle(bundleName);
+				updateProjectTree();
+				updateProjectPanels();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_tree_select_project_bundle"))) {
+				String bundleName = ((JMenuItem)ev.getSource()).getName();           // Popup Project Menu -> Select Bundle
+				RBManager bundle = project.getBundle(bundleName);
+				rbm = bundle;
+				updateDisplayTree();
+				updateDisplayPanels();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_quit"))) {
+																					   // Menu -> File -> Quit
+				thisWindowClosing(null);
+				return;
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_new"))) {
+																					   // Menu -> File -> New Resource Bundle
+				promptForSave(null);
+				String oldUser = getUser();
+				if (rbm != null && rbm.getUser() != null && !(rbm.getUser().equals(Resources.getTranslation("unknown_user"))))
+					oldUser = rbm.getUser();
+				String response = JOptionPane.showInputDialog(this,
+					Resources.getTranslation("dialog_new_baseclass"), Resources.getTranslation("dialog_title_new_bundle"),
+					JOptionPane.QUESTION_MESSAGE);
+				if (response != null) {
+					// Test the response for white space
+					if (response.indexOf(" ") > 0 || response.indexOf("\t") > 0 || response.indexOf("\n") > 0) {
+						JOptionPane.showMessageDialog(this,
+							Resources.getTranslation("error_baseclass_whitespace") + "\n" + Resources.getTranslation("error_bundle_not_created"),
+							Resources.getTranslation("dialog_title_error_creating_bundle"), JOptionPane.ERROR_MESSAGE);
+					} else {
+						rbm = new RBManager(response);
+						updateDisplayTree();
+						updateProjectTree();
+						updateProjectPanels();
+						updateDisplayPanels();
+					}
+				}
+				// Update the user information
+				if (oldUser.equals(Resources.getTranslation("unknown_user"))) {
+					String user = JOptionPane.showInputDialog(this,
+						Resources.getTranslation("dialog_user_name"), Resources.getTranslation("dialog_title_user_name"),
+						JOptionPane.QUESTION_MESSAGE);
+					if (user != null && !(user.equals(""))) setUser(user);
+				} else rbm.setUser(oldUser);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_open"))) {
+																					   // Menu -> File -> Open Resource Bundle
+				promptForSave(null);
+				String oldUser = getUser();
+				if (rbm != null && rbm.getUser() != null && !(rbm.getUser().equals(Resources.getTranslation("unknown_user"))))
+					oldUser = rbm.getUser();
+				openFileChooser.setSelectedFile(new File("Resources" + File.separator + "RBManager.properties"));
+				int status = openFileChooser.showOpenDialog(this);
+				if (status == JFileChooser.CANCEL_OPTION) {
+					// File opening canceled
+				} else if (status == JFileChooser.ERROR_OPTION) {
+					// Error in file open
+				} else {
+					// A file has been selected
+					try {
+						rbm = new RBManager(openFileChooser.getSelectedFile());
+						updateDisplayTree();
+						updateProjectTree();
+						updateProjectPanels();
+					} catch (IOException ioe) {
+						// Should provide some alert here
+						System.err.println("Could not open the file " + openFileChooser.getSelectedFile().getAbsolutePath() +
+										   ": " + ioe.getMessage());
+						rbm = null;
+					}
+				}
+				if (rbm == null) return;
+				// Update the user information
+				if (oldUser.equals(Resources.getTranslation("unknown_user"))) {
+					String user = JOptionPane.showInputDialog(this,
+						Resources.getTranslation("dialog_user_name"), Resources.getTranslation("dialog_title_user_name"),
+						JOptionPane.QUESTION_MESSAGE);
+					if (user != null && !(user.equals("")))
+						setUser(user);
+				} else
+					rbm.setUser(oldUser);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_save"))) {
+																					   // Menu -> File -> Save Resource Bundle
+				saveResources();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_saveas"))) {
+																					   // Menu -> File -> Save Resource Bundle As
+				saveResourcesAs();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_import_properties"))) {
+																					   // Menu -> File -> Import -> Properties
+				if (rbm == null || rbm.getBundles() == null) return;
+				RBPropertiesImporter importer = new RBPropertiesImporter(Resources.getTranslation("import_properties_title"), rbm, this);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_import_java"))) {
+																					   // Menu -> File -> Import -> Java
+				if (rbm == null || rbm.getBundles() == null) return;
+				RBJavaImporter importer = new RBJavaImporter(Resources.getTranslation("import_java_title"), rbm, this);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_import_TMX"))) {
+																					   // Menu -> File -> Import -> TMX
+				if (rbm == null || rbm.getBundles() == null)
+					return;
+				RBTMXImporter importer = new RBTMXImporter(Resources.getTranslation("import_TMX_title"), rbm, this);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_import_XLF"))) {
+				   // Menu -> File -> Import -> XLIFF
+				if (rbm == null || rbm.getBundles() == null)
+				    return;
+				RBxliffImporter importer = new RBxliffImporter(Resources.getTranslation("import_XLF_title"), rbm, this);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_export_properties"))) {
+																					   // Menu -> File -> Export -> Properties
+				RBPropertiesExporter exp = new RBPropertiesExporter();
+				try {
+					if (rbm != null && rbm.getBundles() != null)
+						exp.export(rbm);
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this, Resources.getTranslation("error_export"),
+												  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_export_java"))) {
+																					   // Menu -> File -> Export -> Java
+				RBJavaExporter exp = new RBJavaExporter();
+				try {
+					if (rbm != null && rbm.getBundles() != null) exp.export(rbm);
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this, Resources.getTranslation("error_export"),
+												  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_export_ICU"))) {
+																					   // Menu -> File -> Export -> Java
+				RBICUExporter exp = new RBICUExporter();
+				try {
+					if (rbm != null && rbm.getBundles() != null) exp.export(rbm);
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this, Resources.getTranslation("error_export"),
+												  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_export_TMX"))) {
+																					   // Menu -> File -> Export -> TMX
+				RBTMXExporter exp = new RBTMXExporter();
+				try {
+					if (rbm != null && rbm.getBundles() != null) exp.export(rbm);
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this, Resources.getTranslation("error_export"),
+												  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_file_export_XLF"))) {
+				   // Menu -> File -> Export -> XLIFF
+				RBxliffExporter exp = new RBxliffExporter();
+				try {
+					if (rbm != null && rbm.getBundles() != null)
+					    exp.export(rbm);
+				} catch (IOException ioe) {
+					JOptionPane.showMessageDialog(this, Resources.getTranslation("error_export"),
+					Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				}
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_options_addfile"))) {
+																					   // Menu -> Options -> Add New Resource
+				createResourceFile();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_options_addgroup")) ||
+					   ev.getActionCommand().equals(Resources.getTranslation("button_create_group"))) {
+																					   // Menu -> Options -> Add New Group
+				createBundleGroup();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_options_addentry"))) {
+																					   // Menu -> Options -> Add New Entry
+				createBundleItem();
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_options_preferences"))) {
+																					   // Menu -> Options -> Preferences
+				PreferencesDialog pd = new PreferencesDialog(this);
+			} else if (ev.getActionCommand().equals(Resources.getTranslation("menu_help_about"))) { 
+																					   // Menu -> Help -> About RBManager
+				AboutDialog.showDialog(this);
+			} else RBManagerGUI.debugMsg("Missed Action Command: " + ev.getActionCommand());
+			
+		}
+		
+	}
+	
+	/**
+	 * Handles events generated
+	 */
+	
+	public void mousePopup(MouseEvent ev) {
+		if (ev.getSource() == jTreeDisplay) {
+			int selRow = jTreeDisplay.getRowForLocation(ev.getX(), ev.getY());
+			TreePath selPath = jTreeDisplay.getPathForLocation(ev.getX(), ev.getY());
+			if (selRow != -1) {
+			    if (ev.getClickCount() == 1) {
+					DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
+					Object obj = node.getUserObject();
+					if (obj == null || !(obj instanceof Bundle)) return;
+					Bundle bundle = (Bundle)obj;
+					String encoding = bundle.encoding;
+					if (encoding == null) encoding = new String();
+							
+					// Create the menu to display
+					JPopupMenu popupMenu = new JPopupMenu();
+					JMenuItem saveItem = new JMenuItem(Resources.getTranslation("menu_tree_save"));
+					JMenuItem hideItem = new JMenuItem(Resources.getTranslation("menu_tree_hide"));
+					JMenuItem deleteItem = new JMenuItem(Resources.getTranslation("menu_tree_delete"));
+							
+					saveItem.setName(encoding); saveItem.addActionListener(this);
+					hideItem.setName(encoding); hideItem.addActionListener(this);
+					deleteItem.setName(encoding); deleteItem.addActionListener(this);
+							
+					popupMenu.add(saveItem);
+					if (node.getLevel() != 1) {
+						popupMenu.add(hideItem);
+						popupMenu.add(deleteItem);
+					}
+							
+					popupMenu.show(ev.getComponent(), ev.getX(), ev.getY());
+			    }
+			}
+		} else if (ev.getSource() == projectTree) {
+			int selRow = projectTree.getRowForLocation(ev.getX(), ev.getY());
+			TreePath selPath = projectTree.getPathForLocation(ev.getX(), ev.getY());
+			if (selRow != -1 && ev.getClickCount() == 1) {
+				DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
+				Object obj = node.getUserObject();
+				if (obj == null) return;
+				else if (obj instanceof String) {
+					JPopupMenu popupMenu = new JPopupMenu();
+					JMenuItem newItem = new JMenuItem(Resources.getTranslation("menu_tree_new_project"));
+					JMenuItem openItem = new JMenuItem(Resources.getTranslation("menu_tree_open_project"));
+					JMenuItem saveItem = new JMenuItem(Resources.getTranslation("menu_tree_save_project"));
+					newItem.addActionListener(this);
+					openItem.addActionListener(this);
+					saveItem.addActionListener(this);
+					popupMenu.add(newItem);
+					popupMenu.add(openItem);
+					popupMenu.add(saveItem);
+					popupMenu.show(ev.getComponent(), ev.getX(), ev.getY());
+				} else if (obj instanceof RBProject) {
+					JPopupMenu popupMenu = new JPopupMenu();
+					JMenuItem newItem = new JMenuItem(Resources.getTranslation("menu_tree_new_project"));
+					JMenuItem openItem = new JMenuItem(Resources.getTranslation("menu_tree_open_project"));
+					JMenuItem saveItem = new JMenuItem(Resources.getTranslation("menu_tree_save_project"));
+					JMenuItem addItem = new JMenuItem(Resources.getTranslation("menu_tree_add_project_bundle"));
+					newItem.addActionListener(this);
+					openItem.addActionListener(this);
+					saveItem.addActionListener(this);
+					addItem.addActionListener(this);
+					popupMenu.add(newItem);
+					popupMenu.add(openItem);
+					popupMenu.add(saveItem);
+					popupMenu.add(addItem);
+					popupMenu.show(ev.getComponent(), ev.getX(), ev.getY());
+				} else if (obj instanceof RBManager) {
+					RBManager rbm = (RBManager)obj;
+					JPopupMenu popupMenu = new JPopupMenu();
+					JMenuItem selectItem = new JMenuItem(Resources.getTranslation("menu_tree_select_project_bundle"));
+					JMenuItem removeItem = new JMenuItem(Resources.getTranslation("menu_tree_remove_project_bundle"));
+					selectItem.setName(rbm.getBaseClass());
+					removeItem.setName(rbm.getBaseClass());
+					selectItem.addActionListener(this);
+					removeItem.addActionListener(this);
+					popupMenu.add(selectItem);
+					popupMenu.add(removeItem);
+					popupMenu.show(ev.getComponent(), ev.getX(), ev.getY());
+				}
+			}
+		}
+	}
+	
+	public void mousePressed(MouseEvent ev)  {
+		if (ev.isPopupTrigger()) {
+			mousePopup(ev);
+		}
+	}
+	
+	public void mouseReleased(MouseEvent ev) {
+		if (ev.isPopupTrigger()) {
+			mousePopup(ev);
+			return;
+		}
+		// Not the popup trigger
+	}
+	
+	public void mouseEntered(MouseEvent ev)  { }
+	
+	public void mouseExited(MouseEvent ev)   { }
+	
+	public void mouseClicked(MouseEvent ev) {
+		if (ev.getClickCount() == 2 && ev.getSource() instanceof JTable) {
+			// We are going to display the edit frame for the item selected
+			BundleItem item = null;
+			JTable table = (JTable) ev.getSource();
+			if (table.getModel() instanceof UntranslatedItemsTableModel) {
+				int row = table.getSelectedRow();
+				UntranslatedItemsTableModel model = (UntranslatedItemsTableModel)table.getModel();
+				item = model.getBundleItem(row);
+				BundleItemDialog biDialog = new BundleItemDialog(rbm, item, (rbm == null ? "" : rbm.getUser()),
+															 this, Resources.getTranslation("dialog_title_edit_item"), true);
+				model.update();
+			} else if (table.getModel() instanceof SearchItemsTableModel) {
+				int row = table.getSelectedRow();
+				SearchItemsTableModel model = (SearchItemsTableModel)table.getModel();
+				item = model.getBundleItem(row);
+				BundleItemDialog biDialog = new BundleItemDialog(rbm, item, (rbm == null ? "" : rbm.getUser()),
+															 this, Resources.getTranslation("dialog_title_edit_item"), true);
+				model.update();
+			} else if (table.getModel() instanceof GroupItemsTableModel) {
+				int row = table.getSelectedRow();
+				GroupItemsTableModel model = (GroupItemsTableModel)table.getModel();
+				item = model.getBundleItem(row);
+				BundleItemDialog biDialog = new BundleItemDialog(rbm, item, (rbm == null ? "" : rbm.getUser()),
+															 this, Resources.getTranslation("dialog_title_edit_item"), true);
+				model.update();
+			}
+			updateDisplayPanels();
+		}
+	}
+	
+	protected void updateProjectPanels() {
+		projectPanel.updateComponents();
+	}
+	
+	// Update the display of the main panels (stats, untrans, groups). Should be called after a new tree selection
+	protected void updateDisplayPanels() {
+		debugMsg("Updating Display Panels");
+		
+		Bundle bundle = null;
+		if (activeNode == null) return;
+		Object o = activeNode.getUserObject();
+		if (o == null)
+			return;
+		if (o instanceof String) {
+			// A node that is not a root was selected.... I need to do something here
+			String str = (String)o;
+			if (rbm == null) return;
+			if (str.equals(rbm.getBaseClass())) {
+				// The base class node was selected
+				jPanelStats.setManager(rbm);
+				jPanelUntrans.setManager(rbm);
+				jPanelGroups.setManager(rbm);
+				jPanelSearch.setManager(rbm);
+			} else {
+				jPanelStats.removeElements();
+				jPanelUntrans.removeElements();
+				jPanelGroups.removeElements();
+				jPanelSearch.removeElements();
+			}
+			//return;
+		}
+		else if (o instanceof Bundle) {
+			bundle = (Bundle) activeNode.getUserObject();
+			jPanelStats.setBundle(bundle);
+			jPanelUntrans.setBundle(bundle);
+			jPanelGroups.setBundle(bundle);
+			jPanelSearch.setBundle(bundle);
+		}
+		else
+			RBManagerGUI.debugMsg(o.toString());
+		
+		jPanelStats.updateComponents();
+		jPanelUntrans.updateComponents();
+		jPanelGroups.updateComponents();
+		jPanelSearch.updateComponents();
+		
+		validateTree();
+	}
+	
+	public void updateProjectTree() {
+		debugMsg("Updating Project Trees");
+		
+		DefaultMutableTreeNode root = null;
+		
+		if (project != null) {
+			root = new DefaultMutableTreeNode(project);
+			for (int i=0; i < project.getSize(); i++) {
+				RBManager rbm = project.getBundle(i);
+				DefaultMutableTreeNode bundleNode = new DefaultMutableTreeNode(rbm);
+				root.add(bundleNode);
+				Bundle mainBundle = (Bundle)rbm.getBundles().firstElement();
+				Vector groups = mainBundle.getGroupsAsVector();
+				for (int j=0; j < groups.size(); j++) {
+					BundleGroup group = (BundleGroup)groups.elementAt(j);
+					DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
+					bundleNode.add(groupNode);
+					Vector items = group.getItemsAsVector();
+					for (int k=0; k < items.size(); k++) {
+						BundleItem item = (BundleItem)items.elementAt(k);
+						DefaultMutableTreeNode itemNode = new DefaultMutableTreeNode(item);
+						groupNode.add(itemNode);
+					}
+				}
+			}
+		} else if (rbm != null) {
+			// There is a resource bundle open, but no project
+			root = new DefaultMutableTreeNode(Resources.getTranslation("no_project"));
+			Bundle mainBundle = (Bundle)rbm.getBundles().firstElement();
+			DefaultMutableTreeNode bundleNode = new DefaultMutableTreeNode(rbm);//(rbm.getBaseClass());
+			root.add(bundleNode);
+			Vector groups = mainBundle.getGroupsAsVector();
+			for (int i=0; i < groups.size(); i++) {
+				BundleGroup group = (BundleGroup)groups.elementAt(i);
+				DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
+				bundleNode.add(groupNode);
+				Vector items = group.getItemsAsVector();
+				for (int j=0; j < items.size(); j++) {
+					BundleItem item = (BundleItem)items.elementAt(j);
+					DefaultMutableTreeNode itemNode = new DefaultMutableTreeNode(item);
+					groupNode.add(itemNode);
+				}
+			}
+		} else {
+			root = new DefaultMutableTreeNode(Resources.getTranslation("no_project_bundle"));
+		}
+		
+		// Create the tree from the roots
+		projectTree = new JTree(root);
+		projectTree.addMouseListener(this);
+		projectTree.addTreeSelectionListener(this);
+		projectTree.setCellRenderer(RBTreeCellRenderer.getInstance());
+		projectScrollPane.getViewport().removeAll();
+		projectScrollPane.getViewport().add(projectTree);
+		repaint();
+		validateTree();
+		return;
+	}
+	
+	// Update the display of the tree file map. Should be called when the tree is changed/updated
+	public void updateDisplayTree() {
+		debugMsg("Updating Display Trees");
+		
+		DefaultMutableTreeNode root = null;
+		
+		if (rbm == null || rbm.getBundles() == null) {
+			root = new DefaultMutableTreeNode(Resources.getTranslation("no_resource_bundle"));
+		} else {
+			// From here on out, there is a defined resource bundle manager
+			Bundle mainBundle = (Bundle)rbm.getBundles().firstElement();
+			root = new DefaultMutableTreeNode(rbm.getBaseClass());
+			// Add the base class
+			root.add(new DefaultMutableTreeNode(mainBundle));
+			
+			//DefaultMutableTreeNode currNode = root;
+			for (int i = 1; i < rbm.getBundles().size(); i++) {
+				Bundle currBundle = (Bundle)rbm.getBundles().elementAt(i);
+				String variant = currBundle.getVariantEncoding();
+				String country = currBundle.getCountryEncoding();
+				String language = currBundle.getLanguageEncoding();
+				//DefaultMutableTreeNode languageNode = null;
+				// Look for a node representing this language
+				if (language == null || language.equals("")) continue;
+				boolean languageNodeFound = false;
+				for (int j=0; j < root.getChildCount(); j++) {
+					DefaultMutableTreeNode langNode = (DefaultMutableTreeNode)root.getChildAt(j);
+					Object o = langNode.getUserObject();
+					if (o == null || !(o instanceof String)) continue;
+					String str = (String)o;
+					if (str.equals(Resources.getTranslation("tree_language_node", language))) {
+						// There is a non-leaf node with this language
+						languageNodeFound = true;
+						if (country == null || country.equals(""))
+							 langNode.add(new DefaultMutableTreeNode(currBundle));
+						else {
+							// We need to look at country, variant
+							boolean countryNodeFound = false;
+							for (int k=0; k < langNode.getChildCount(); k++) {
+								DefaultMutableTreeNode countryNode = (DefaultMutableTreeNode)langNode.getChildAt(k);
+								Object o2 = countryNode.getUserObject();
+								if (o2 == null || !(o2 instanceof String)) continue;
+								String str2 = (String)o2;
+								if (str2.equals(Resources.getTranslation("tree_country_node", country))) {
+									// There is a non-leaf node for this country
+									countryNodeFound = true;
+									if (variant == null || variant.equals("")) {
+										countryNode.add(new DefaultMutableTreeNode(currBundle));
+									} else {
+										// We need to look at variant
+										boolean variantNodeFound = false;
+										for (int l=0; l < countryNode.getChildCount(); l++) {
+											DefaultMutableTreeNode variantNode = (DefaultMutableTreeNode)countryNode.getChildAt(l);
+											Object o3 = variantNode.getUserObject();
+											if (o3 == null || !(o3 instanceof String)) continue;
+											String str3 = (String)o3;
+											if (str3.equals(Resources.getTranslation("tree_variant_node"))) {
+												variantNodeFound = true;
+												variantNode.add(new DefaultMutableTreeNode(currBundle));
+											} 
+										} // end for - country node loop
+										if (!variantNodeFound) {
+											DefaultMutableTreeNode variantNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_variant_node"));
+											countryNode.add(variantNode);
+											variantNode.add(new DefaultMutableTreeNode(currBundle));
+										}
+									}
+								}
+							} // end for - language node loop
+							if (!countryNodeFound) {
+								DefaultMutableTreeNode countryNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_country_node", country));
+								langNode.add(countryNode);
+								if (variant == null || variant.equals("")) {
+									countryNode.add(new DefaultMutableTreeNode(currBundle));
+								} else {
+									// We need to look at the variant	
+									boolean variantNodeFound = false;
+									for (int l=0; l < countryNode.getChildCount(); l++) {
+										DefaultMutableTreeNode variantNode = (DefaultMutableTreeNode)countryNode.getChildAt(l);
+										Object o3 = variantNode.getUserObject();
+										if (o3 == null || !(o3 instanceof String)) continue;
+										String str3 = (String)o3;
+										if (str3.equals(Resources.getTranslation("tree_variant_node"))) {
+											variantNodeFound = true;
+											variantNode.add(new DefaultMutableTreeNode(currBundle));
+										} 
+									} // end for - country node loop
+									if (!variantNodeFound) {
+										DefaultMutableTreeNode variantNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_variant_node"));
+										countryNode.add(variantNode);
+										variantNode.add(new DefaultMutableTreeNode(currBundle));
+									}
+								}
+							}
+						}
+					}
+				}
+				if (!languageNodeFound) {
+					// We need to create a node for this country
+					DefaultMutableTreeNode langNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_language_node", language));
+					root.add(langNode);
+					if (country == null || country.equals("")) {
+						langNode.add(new DefaultMutableTreeNode(currBundle));
+					} else {
+						// We need to look at the country, variant
+						boolean countryNodeFound = false;
+						for (int k=0; k < langNode.getChildCount(); k++) {
+							DefaultMutableTreeNode countryNode = (DefaultMutableTreeNode)langNode.getChildAt(k);
+							Object o2 = countryNode.getUserObject();
+							if (o2 == null || !(o2 instanceof String)) continue;
+							String str2 = (String)o2;
+							if (str2.equals(Resources.getTranslation("tree_country_node", country))) {
+								// There is a non-leaf node for this country
+								countryNodeFound = true;
+								if (variant == null || variant.equals("")) {
+									countryNode.add(new DefaultMutableTreeNode(currBundle));
+								} else {
+									// We need to look at variant
+									boolean variantNodeFound = false;
+									for (int l=0; l < countryNode.getChildCount(); l++) {
+										DefaultMutableTreeNode variantNode = (DefaultMutableTreeNode)countryNode.getChildAt(l);
+										Object o3 = variantNode.getUserObject();
+										if (o3 == null || !(o3 instanceof String)) continue;
+										String str3 = (String)o3;
+										if (str3.equals(Resources.getTranslation("tree_variant_node"))) {
+											variantNodeFound = true;
+											variantNode.add(new DefaultMutableTreeNode(currBundle));
+										} 
+									} // end for - country node loop
+									if (!variantNodeFound) {
+										DefaultMutableTreeNode variantNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_variant_node"));
+										countryNode.add(variantNode);
+										variantNode.add(new DefaultMutableTreeNode(currBundle));
+									}
+								}
+							}
+						} // end for - language node loop
+						if (!countryNodeFound) {
+							DefaultMutableTreeNode countryNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_country_node", country));
+							langNode.add(countryNode);
+							if (variant == null || variant.equals("")) {
+								countryNode.add(new DefaultMutableTreeNode(currBundle));
+							} else {
+								// We need to look at the variant	
+								boolean variantNodeFound = false;
+								for (int l=0; l < countryNode.getChildCount(); l++) {
+									DefaultMutableTreeNode variantNode = (DefaultMutableTreeNode)countryNode.getChildAt(l);
+									Object o3 = variantNode.getUserObject();
+									if (o3 == null || !(o3 instanceof String)) continue;
+									String str3 = (String)o3;
+									if (str3.equals(Resources.getTranslation("tree_variant_node"))) {
+										variantNodeFound = true;
+										variantNode.add(new DefaultMutableTreeNode(currBundle));
+									} 
+								} // end for - country node loop
+								if (!variantNodeFound) {
+									DefaultMutableTreeNode variantNode = new DefaultMutableTreeNode(Resources.getTranslation("tree_variant_node", variant));
+									countryNode.add(variantNode);
+									variantNode.add(new DefaultMutableTreeNode(currBundle));
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		
+		// Create the tree from the roots
+		jTreeDisplay = new JTree(root);
+		jTreeDisplay.addMouseListener(this);
+		jTreeDisplay.addTreeSelectionListener(this);
+		jTreeDisplay.setCellRenderer(RBTreeCellRenderer.getInstance());
+		jScrollPaneTree.getViewport().removeAll();
+		jScrollPaneTree.getViewport().add(jTreeDisplay);
+		repaint();
+		validateTree();
+		return;
+	}
+	
+	/**
+	 * Inherits from JFrame.addNotify(), but also inserts the menu bar
+	 */
+	
+	public void addNotify() 
+	{
+		super.addNotify();
+		
+		if (mShown)
+			return;
+			
+		// resize frame to account for menubar
+		JMenuBar jMenuBar = getJMenuBar();
+		if (jMenuBar != null) {
+			int jMenuBarHeight = jMenuBar.getPreferredSize().height;
+			Dimension dimension = getSize();
+			dimension.height += jMenuBarHeight;
+			setSize(dimension);
+		}
+
+		mShown = true;
+	}
+
+	/**
+	 * Called when it may be appropriate to check with the user if they want to save the file
+	 */
+	
+	boolean promptForSave(String message) {
+		if (rbm != null) {
+			int response = JOptionPane.showConfirmDialog(this,
+				(message == null ? Resources.getTranslation("dialog_save") : message),
+				Resources.getTranslation("dialog_title_quit"), JOptionPane.YES_NO_CANCEL_OPTION,
+				JOptionPane.QUESTION_MESSAGE);
+			if (response == JOptionPane.CANCEL_OPTION) return false;
+			if (response == JOptionPane.YES_OPTION) {
+				return saveResources();
+			}
+		}
+		return true;
+	}
+	
+	public boolean deleteResources(String encoding) {
+		if (rbm == null) return false;  // This should never happen
+		try {
+			rbm.eraseFile(encoding);	
+		} catch (IOException ioe) {
+			JOptionPane.showMessageDialog(this, Resources.getTranslation("error_deleting", ioe.getMessage()),
+										  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			if (RBManagerGUI.debug) System.err.println(ioe);
+			return false;
+		}
+		updateDisplayTree();
+		updateProjectTree();
+		updateProjectPanels();
+		updateDisplayPanels();
+		return true;
+	}
+	
+	public void hideResources(String encoding) {
+		rbm.hideResource(encoding);
+		updateDisplayTree();
+		updateProjectTree();
+		updateProjectPanels();
+		updateDisplayPanels();
+	}
+	
+	/**
+	 * Save a particular resources file within the bundle.
+	 */
+	
+	public boolean saveResources(String encoding) {
+		if (rbm == null) return false;  // This should never happen
+		return saveResources(rbm, encoding);
+	}
+	
+	public boolean saveResources(RBManager bundle, String encoding) {
+		try {
+			bundle.writeToFile(encoding);	
+		} catch (IOException ioe) {
+			JOptionPane.showMessageDialog(this, Resources.getTranslation("error_saving", ioe.getMessage()),
+										  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			if (RBManagerGUI.debug) System.err.println(ioe);
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * Called when the resources are to be saved
+	 */
+	
+	public boolean saveResources() {
+		if (rbm == null) return true;
+		return saveResources(rbm);
+	}
+	
+	public boolean saveResources(RBManager bundle) {
+		try {
+			bundle.writeToFile();
+		} catch (IOException ioe) {
+			JOptionPane.showMessageDialog(this, Resources.getTranslation("error_saving", ioe.getMessage()),
+										  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			if (RBManagerGUI.debug) System.err.println(ioe);
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * Called when the resource bundle is to be saved, but displays a window to the user allowing them
+	 * to selecte the file destination of the folder in which to save the bundle as well as the base
+	 * class name for the bundle.
+	 */
+	
+	public boolean saveResourcesAs() {
+		if (rbm == null) return true;
+		int result = saveFileChooser.showSaveDialog(this);
+		if (result == JFileChooser.APPROVE_OPTION) {
+			try {
+				File newFile = saveFileChooser.getSelectedFile();
+				String fileName = newFile.getName();
+				String baseName = fileName;
+				if (fileName.toLowerCase().endsWith(".properties"))
+					baseName = baseName.substring(0,baseName.length()-11);
+				rbm.setBaseClass(baseName);
+				rbm.setFileDirectory(newFile.getParentFile());
+				rbm.writeToFile();
+			} catch (IOException ioe) {
+				JOptionPane.showMessageDialog(this, Resources.getTranslation("error_saving", ioe.getMessage()),
+											  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				if (RBManagerGUI.debug) System.err.println(ioe);
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	void updateLocale(Locale l) {
+		// Update the menubars
+		jMenuBarMain.updateLocale();
+		
+		updateLocale(getContentPane(), l);
+		updateLocale(openFileChooser, l);
+		updateLocale(saveFileChooser, l);
+		// Redraw the panes
+		updateDisplayTree();
+		updateProjectTree();
+		updateProjectPanels();
+		updateDisplayPanels();
+		// update the tab titles
+		jTabbedPaneMain.setTitleAt(0,Resources.getTranslation("tab_statistics"));
+		jTabbedPaneMain.setTitleAt(1,Resources.getTranslation("tab_untranslated"));
+		jTabbedPaneMain.setTitleAt(2,Resources.getTranslation("tab_groups"));
+		setTitle(Resources.getTranslation("resource_bundle_manager"));
+	}
+	
+	static void updateLocale(Container c, Locale l) {
+		Component comp[] = c.getComponents();
+		for (int i=0; i < comp.length; i++) {
+			if (comp[i] instanceof JComponent) {
+				((JComponent)comp[i]).setLocale(l);
+			}
+			if (comp[i] instanceof Container) {
+				updateLocale((Container)comp[i],l);
+			}
+		}
+		if (c instanceof JMenu) {
+			comp = ((JMenu)c).getMenuComponents();
+			for (int i=0; i < comp.length; i++) {
+				if (comp[i] instanceof JComponent) {
+					((JComponent)comp[i]).setLocale(l);
+				}
+				if (comp[i] instanceof Container) {
+					updateLocale((Container)comp[i],l);
+				}
+			}
+		}
+	}
+			
+	void updateUI() {
+		updateUI(getContentPane());
+		jMenuBarMain.updateUI();
+		updateUI(jMenuBarMain);
+		updateUI(openFileChooser);
+		updateUI(saveFileChooser);
+	}
+	
+	static void updateUI(Container c) {
+		Component comp[] = c.getComponents();
+		for (int i=0; i < comp.length; i++) {
+			if (comp[i] instanceof JComponent) {
+				((JComponent)comp[i]).updateUI();
+			}
+			if (comp[i] instanceof Container) {
+				updateUI((Container)comp[i]);
+			}
+		}
+		if (c instanceof JMenu) {
+			comp = ((JMenu)c).getMenuComponents();
+			for (int i=0; i < comp.length; i++) {
+				if (comp[i] instanceof JComponent) {
+					((JComponent)comp[i]).updateUI();
+				}
+				if (comp[i] instanceof Container) {
+					updateUI((Container)comp[i]);
+				}
+			}
+		}
+	}
+	
+	// Close the window when the close box is clicked
+	void thisWindowClosing(java.awt.event.WindowEvent e)
+	{
+		if (promptForSave(Resources.getTranslation("dialog_quit_save"))) {
+			setVisible(false);
+			dispose();
+			System.exit(0);
+		}
+	}
+	
+	public void setUser(String userName) {
+		this.userName = userName;
+		if (rbm != null) rbm.setUser(userName);
+	}
+	
+	public String getUser() {
+		return userName;
+	}
+	
+	public BundleItem getSelectedProjectBundleItem() {
+		TreePath path = projectTree.getSelectionPath();
+		if (path == null) return null;
+		DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
+		Object obj = node.getUserObject();
+		if (obj == null || !(obj instanceof BundleItem)) return null;
+		return (BundleItem)obj;
+	}
+	
+	public RBManager getSelectedProjectBundle() {
+		TreePath path = projectTree.getSelectionPath();
+		if (path == null) return null;
+		for (int i=0; i < path.getPathCount(); i++) {
+			DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getPathComponent(i);
+			Object obj = node.getUserObject();
+			if (obj != null && obj instanceof RBManager) return (RBManager)obj;
+		}
+		return null;
+	}
+	
+	public static void debugMsg(String msg) {
+		if (debug) System.out.println("Debug Message [" + debugcount++ + "]: " + msg);
+	}
+}
+
+class RBTreeCellRenderer extends DefaultTreeCellRenderer {
+	private static RBTreeCellRenderer cellRend = null;
+	private static ImageIcon bundleIcon   = null;
+	private static ImageIcon languageIcon = null;
+	private static ImageIcon countryIcon  = null;
+	private static ImageIcon variantIcon  = null;
+	private static ImageIcon fileIcon     = null;
+	private static ImageIcon groupIcon    = null;
+	private static ImageIcon itemIcon     = null;
+	private static ImageIcon projectIcon  = null;
+	
+	private RBTreeCellRenderer() {
+		
+	}
+	
+	public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
+												  boolean leaf, int row, boolean hasFocus) {
+		super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
+		
+		DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
+		int level = node.getLevel();
+		Object obj = node.getUserObject();
+		
+		if (obj instanceof BundleGroup) {
+			setIcon(groupIcon);
+		} else if (obj instanceof BundleItem) {
+			setIcon(itemIcon);
+		} else if (obj instanceof RBManager) {
+			setIcon(bundleIcon);
+		} else if (obj instanceof RBProject) {
+			setIcon(projectIcon);
+		} else if (leaf) {
+			if (level != 0) setIcon(fileIcon);	
+		} else {	
+			if (level == 0) {
+				if (obj instanceof String && ((String)obj).equals(Resources.getTranslation("no_project"))) 
+					setIcon(projectIcon);
+				else setIcon(bundleIcon);
+			}
+			else if (level == 1) setIcon(languageIcon);
+			else if (level == 2) setIcon(countryIcon);
+			else if (level == 3) setIcon(variantIcon);
+		}
+		
+		return this;
+	}
+	
+	public static RBTreeCellRenderer getInstance() {
+		if (cellRend == null) {
+            try {
+                Class thisClass = Class.forName("com.ibm.rbm.gui.RBManagerGUI");
+			    // Create instances of the icons
+                Image scaledImage = (new ImageIcon(thisClass.getResource("images/tree_icon_bundle.gif"))).getImage().getScaledInstance(16, 16, Image.SCALE_DEFAULT);
+			    bundleIcon   = new ImageIcon(scaledImage);
+			    languageIcon = new ImageIcon(thisClass.getResource("images/tree_icon_language.gif"));
+			    countryIcon  = new ImageIcon(thisClass.getResource("images/tree_icon_country.gif"));
+			    variantIcon  = new ImageIcon(thisClass.getResource("images/tree_icon_variant.gif"));
+			    fileIcon     = new ImageIcon(thisClass.getResource("images/tree_icon_file.gif"));
+			    groupIcon    = new ImageIcon(thisClass.getResource("images/tree_icon_group.gif"));
+			    itemIcon     = new ImageIcon(thisClass.getResource("images/tree_icon_item.gif"));
+			    projectIcon  = new ImageIcon(thisClass.getResource("images/tree_icon_project.gif"));
+            } catch (ClassNotFoundException e) {
+                RBManagerGUI.debugMsg(e.toString());
+            }
+			// Create the instance of the renderer
+			cellRend = new RBTreeCellRenderer();
+		}
+		return cellRend;
+	}
+}
+
+/**
+ * Table model for resource bundle projects
+ */
+class RBProject {
+	java.util.List bundleNames;
+	java.util.List bundleFileNames;
+	java.util.List bundles;
+	String projectName;
+	
+	public RBProject(String projectName) {
+		this.projectName = projectName;
+		bundleNames = new java.util.LinkedList();
+		bundleFileNames = new java.util.LinkedList();
+		bundles = new java.util.LinkedList();
+	}
+	
+	public RBProject(File inputFile) throws IOException {
+		this(inputFile.getName());
+		
+		if (projectName.indexOf(".") > 0) {
+			projectName = projectName.substring(0,projectName.lastIndexOf("."));
+		}
+		
+		FileReader fr = new FileReader(inputFile);
+		BufferedReader br = new BufferedReader(fr);
+		String line = null;
+		int linecount = 0;
+		while ((line = br.readLine()) != null) {
+			if (linecount % 2 == 0) {
+				bundleNames.add(line.trim());
+			} else {
+				bundleFileNames.add(line.trim());
+			}
+			linecount++;
+		}
+		fr.close();
+		try {
+			for (int i=0; i < bundleFileNames.size(); i++) {
+				RBManager rbm = new RBManager(new File((String)bundleFileNames.get(i)));
+				bundles.add(rbm);
+			}
+		} catch (Exception ex) {
+			JOptionPane.showMessageDialog(new JFrame(), Resources.getTranslation("error_load_project"),
+										  Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			ex.printStackTrace();
+			bundleNames.clear();
+			bundleFileNames.clear();
+		}
+	}
+	
+	public String toString() { return projectName; }
+	
+	public int getSize() { return bundleNames.size(); }
+	
+	public String getBundleName(int index) {
+		return (String)bundleNames.get(index);	
+	}
+	
+	public String getFileName(int index) {
+		return (String)bundleFileNames.get(index);	
+	}
+	
+	public RBManager getBundle(int index) {
+		return (RBManager)bundles.get(index);
+	}
+	
+	public RBManager getBundle(String bundleName) {
+		int index = bundleNames.indexOf(bundleName);
+		if (index >= 0) return getBundle(index);
+		return null;
+	}
+	
+	public void write(File outputFile) throws IOException {
+		FileWriter fw = new FileWriter(outputFile);
+		for (int i=0; i < bundleNames.size(); i++) {
+			fw.write((String)bundleNames.get(i));
+			fw.write("\n");
+			fw.write((String)bundleFileNames.get(i));
+			if (i != bundleNames.size()-1) fw.write("\n");
+		}
+		fw.flush();
+		fw.close();
+	}
+	
+	public void addBundle(String bundleFileName) throws IOException {
+		RBManager bundle = new RBManager(new File(bundleFileName));
+		bundles.add(bundle);
+		bundleNames.add(bundle.getBaseClass());
+		bundleFileNames.add(bundleFileName);
+	}
+	
+	public void removeBundle(String bundleName) {
+		int index = bundleNames.indexOf(bundleName);
+		if (index >= 0) {
+			bundleNames.remove(index);
+			bundleFileNames.remove(index);
+			bundles.remove(index);
+		}
+	}
+}
+
+class RBManagerMenuBar extends JMenuBar {
+	RBManagerGUI             listener;
+	
+	JMenu        jMenuFile = new JMenu();                                     // Menu -> File
+	JMenuItem    jMenuFileNewResourceBundle = new JMenuItem();                
+	JMenuItem    jMenuFileOpenResourceBundle = new JMenuItem();
+	JMenuItem    jMenuFileSaveResourceBundle = new JMenuItem();
+	JMenuItem    jMenuFileSaveResourceBundleAs = new JMenuItem();
+	JMenu        jMenuFileImportResourceBundle = new JMenu();                 // Menu -> File -> Import
+	JMenuItem    jMenuFileImportJava = new JMenuItem();
+	JMenuItem    jMenuFileImportProperties = new JMenuItem();
+	JMenuItem    jMenuFileImportTMX = new JMenuItem();
+	JMenuItem    jMenuFileImportXLF = new JMenuItem();
+	JMenu        jMenuFileExportResourceBundle = new JMenu();                 // Menu -> File -> Export
+	JMenuItem    jMenuFileExportJava = new JMenuItem();
+	JMenuItem    jMenuFileExportICU = new JMenuItem();
+	JMenuItem    jMenuFileExportProperties = new JMenuItem();
+	JMenuItem    jMenuFileExportTMX = new JMenuItem();
+	JMenuItem    jMenuFileExportXLF = new JMenuItem();
+	JMenuItem    jMenuFileExit = new JMenuItem();
+	JMenu        jMenuEdit = new JMenu();                                     // Menu -> Edit
+	JMenuItem    jMenuEditCut = new JMenuItem();
+	JMenuItem    jMenuEditCopy = new JMenuItem();
+	JMenuItem    jMenuEditPaste = new JMenuItem();
+	JMenuItem    jMenuEditDelete = new JMenuItem();
+	JMenu        jMenuOptions = new JMenu();                                  // Menu -> Options
+	JMenuItem    jMenuOptionsAddNewEntry = new JMenuItem();
+	JMenuItem    jMenuOptionsAddNewGroup = new JMenuItem();
+	JMenuItem    jMenuOptionsAddNewResourceFile = new JMenuItem();
+	//JMenuItem    jMenuOptionsProjectViewer = new JMenuItem();
+	JMenuItem    jMenuOptionsPreferences = new JMenuItem();
+	JMenu        jMenuView = new JMenu();                                     // Menu -> View
+	JMenuItem    jMenuViewViewStatistics = new JMenuItem();
+	JMenu        jMenuHelp = new JMenu();                                     // Menu -> Help
+	JMenuItem    jMenuHelpAboutResourceBundleManager = new JMenuItem();
+	
+	void updateLocale() {
+		//FILE
+		jMenuFile.setText(Resources.getTranslation("menu_file"));
+		jMenuFile.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_trigger")));
+		jMenuFileNewResourceBundle.setText(Resources.getTranslation("menu_file_new"));
+		jMenuFileNewResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_new_trigger")));
+		jMenuFileOpenResourceBundle.setText(Resources.getTranslation("menu_file_open"));
+		jMenuFileOpenResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_open_trigger")));
+		jMenuFileSaveResourceBundle.setText(Resources.getTranslation("menu_file_save"));
+		jMenuFileSaveResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_save_trigger")));
+		jMenuFileSaveResourceBundleAs.setText(Resources.getTranslation("menu_file_saveas"));
+		jMenuFileSaveResourceBundleAs.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_saveas_trigger")));
+		jMenuFileImportResourceBundle.setText(Resources.getTranslation("menu_file_import"));
+		jMenuFileImportResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_trigger")));
+		jMenuFileImportJava.setText(Resources.getTranslation("menu_file_import_java"));
+		jMenuFileImportJava.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_java_trigger")));
+		jMenuFileImportProperties.setText(Resources.getTranslation("menu_file_import_properties"));
+		jMenuFileImportProperties.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_properties_trigger")));
+		jMenuFileImportTMX.setText(Resources.getTranslation("menu_file_import_TMX"));
+		jMenuFileImportTMX.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_TMX_trigger")));
+		jMenuFileImportXLF.setText(Resources.getTranslation("menu_file_import_XLF"));
+		jMenuFileImportXLF.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_XLF_trigger")));
+		jMenuFileExportResourceBundle.setText(Resources.getTranslation("menu_file_export"));
+		jMenuFileExportResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_trigger")));
+		jMenuFileExportJava.setText(Resources.getTranslation("menu_file_export_java"));
+		jMenuFileExportJava.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_java_trigger")));
+		jMenuFileExportICU.setText(Resources.getTranslation("menu_file_export_ICU"));
+		jMenuFileExportICU.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_ICU_trigger")));
+		jMenuFileExportProperties.setText(Resources.getTranslation("menu_file_export_properties"));
+		jMenuFileExportProperties.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_properties_trigger")));
+		jMenuFileExportTMX.setText(Resources.getTranslation("menu_file_export_TMX"));
+		jMenuFileExportTMX.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_TMX_trigger")));
+		jMenuFileExportXLF.setText(Resources.getTranslation("menu_file_export_XLF"));
+		jMenuFileExportXLF.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_XLF_trigger")));
+		jMenuFileExit.setText(Resources.getTranslation("menu_file_quit"));
+		jMenuFileExit.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_quit_trigger")));
+		//EDIT
+		jMenuEdit.setText(Resources.getTranslation("menu_edit"));
+		jMenuEdit.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_trigger")));
+		jMenuEditCut.setText(Resources.getTranslation("menu_edit_cut"));
+		jMenuEditCut.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_cut_trigger")));
+		jMenuEditCopy.setText(Resources.getTranslation("menu_edit_copy"));
+		jMenuEditCopy.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_copy_trigger")));
+		jMenuEditPaste.setText(Resources.getTranslation("menu_edit_paste"));
+		jMenuEditPaste.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_paste_trigger")));
+		jMenuEditDelete.setText(Resources.getTranslation("menu_edit_delete"));
+		jMenuEditDelete.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_delete_trigger")));
+		//OPTIONS
+		jMenuOptions.setText(Resources.getTranslation("menu_options"));
+		jMenuOptions.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_trigger")));
+		jMenuOptionsAddNewEntry.setText(Resources.getTranslation("menu_options_addentry"));
+		jMenuOptionsAddNewEntry.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addentry_trigger")));
+		jMenuOptionsAddNewGroup.setText(Resources.getTranslation("menu_options_addgroup"));
+		jMenuOptionsAddNewGroup.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addgroup_trigger")));
+		jMenuOptionsAddNewResourceFile.setText(Resources.getTranslation("menu_options_addfile"));
+		jMenuOptionsAddNewResourceFile.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addfile_trigger")));
+		//jMenuOptionsProjectViewer.setText(Resources.getTranslation("menu_options_project_viewer"));
+		//jMenuOptionsProjectViewer.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_project_viewer_trigger")));
+		jMenuOptionsPreferences.setText(Resources.getTranslation("menu_options_preferences"));
+		jMenuOptionsPreferences.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_preferences_trigger")));
+		//VIEW
+		jMenuView.setText(Resources.getTranslation("menu_view"));
+		jMenuView.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_view_trigger")));
+		jMenuViewViewStatistics.setText(Resources.getTranslation("menu_view_statistics"));
+		jMenuViewViewStatistics.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_view_statistics_trigger")));
+		//HELP
+		jMenuHelp.setText(Resources.getTranslation("menu_help"));
+		jMenuHelp.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_trigger")));
+		jMenuHelpAboutResourceBundleManager.setText(Resources.getTranslation("menu_help_about"));
+		jMenuHelpAboutResourceBundleManager.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_help_about_trigger")));
+	}
+	
+	public RBManagerMenuBar(RBManagerGUI gui) {
+		super();	
+		
+        boolean xmlAvailable;
+		try {
+            Class.forName("org.apache.xerces.parsers.DOMParser");
+            Class.forName("javax.xml.parsers.DocumentBuilder");
+            xmlAvailable = true;
+        } catch (ClassNotFoundException e) {
+            xmlAvailable = false;
+        }
+		listener = gui;
+		
+		// Add the menus to the menu bar 
+		setVisible(true);
+		add(jMenuFile);
+		//add(jMenuEdit);
+		add(jMenuOptions);
+		//add(jMenuView);
+		add(jMenuHelp);
+
+		// Add File Menu Items to the File Menu
+		jMenuFile.setVisible(true);
+		jMenuFile.setText(Resources.getTranslation("menu_file"));
+		jMenuFile.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_trigger")));
+		jMenuFile.add(jMenuFileNewResourceBundle);
+		jMenuFile.add(jMenuFileOpenResourceBundle);
+		jMenuFile.add(jMenuFileSaveResourceBundle);
+		jMenuFile.add(jMenuFileSaveResourceBundleAs);
+		jMenuFile.addSeparator();
+		jMenuFile.add(jMenuFileImportResourceBundle);
+		jMenuFile.add(jMenuFileExportResourceBundle);
+		jMenuFile.addSeparator();
+		// Add the recent files to the file menu
+		Vector recentFiles = Preferences.getRecentFilesPreferences();
+		if (recentFiles.size() > 0) {
+			for (int i=0; i < recentFiles.size(); i+=2) {
+				String name = (String)recentFiles.elementAt(i);
+				String location = (String)recentFiles.elementAt(i+1);
+				JMenuItem recentMenuItem = new JMenuItem();
+				recentMenuItem.setVisible(true);
+				recentMenuItem.setText(name);
+				recentMenuItem.setName("__" + location.trim());
+				recentMenuItem.addActionListener(listener);
+				jMenuFile.add(recentMenuItem);
+			}
+			jMenuFile.addSeparator();
+		}
+		jMenuFile.add(jMenuFileExit);
+		
+		//jMenuFileImportResourceBundle.add(jMenuFileImportJava);
+		jMenuFileImportResourceBundle.add(jMenuFileImportProperties);
+        jMenuFileImportTMX.setEnabled(xmlAvailable);
+		jMenuFileImportResourceBundle.add(jMenuFileImportTMX);
+        jMenuFileImportXLF.setEnabled(xmlAvailable);
+		jMenuFileImportResourceBundle.add(jMenuFileImportXLF);
+		jMenuFileExportResourceBundle.add(jMenuFileExportJava);
+		jMenuFileExportResourceBundle.add(jMenuFileExportICU);
+		jMenuFileExportResourceBundle.add(jMenuFileExportProperties);
+        jMenuFileExportTMX.setEnabled(xmlAvailable);
+		jMenuFileExportResourceBundle.add(jMenuFileExportTMX);
+        jMenuFileExportXLF.setEnabled(xmlAvailable);
+		jMenuFileExportResourceBundle.add(jMenuFileExportXLF);
+
+		jMenuFileNewResourceBundle.setVisible(true);
+		jMenuFileNewResourceBundle.setText(Resources.getTranslation("menu_file_new"));
+		jMenuFileNewResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_new_trigger")));
+		jMenuFileNewResourceBundle.setAccelerator(KeyStroke.getKeyStroke(
+                  KeyEvent.VK_N, ActionEvent.CTRL_MASK));
+		jMenuFileNewResourceBundle.addActionListener(listener);
+		
+		jMenuFileOpenResourceBundle.setVisible(true);
+		jMenuFileOpenResourceBundle.setText(Resources.getTranslation("menu_file_open"));
+		jMenuFileOpenResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_open_trigger")));
+		jMenuFileOpenResourceBundle.setAccelerator(KeyStroke.getKeyStroke(
+                  KeyEvent.VK_O, ActionEvent.CTRL_MASK));
+		jMenuFileOpenResourceBundle.addActionListener(listener);
+
+		jMenuFileSaveResourceBundle.setVisible(true);
+		jMenuFileSaveResourceBundle.setText(Resources.getTranslation("menu_file_save"));
+		jMenuFileSaveResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_save_trigger")));
+		jMenuFileSaveResourceBundle.setAccelerator(KeyStroke.getKeyStroke(
+                  KeyEvent.VK_S, ActionEvent.CTRL_MASK));
+		jMenuFileSaveResourceBundle.addActionListener(listener);
+
+		jMenuFileSaveResourceBundleAs.setVisible(true);
+		jMenuFileSaveResourceBundleAs.setText(Resources.getTranslation("menu_file_saveas"));
+		jMenuFileSaveResourceBundleAs.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_saveas_trigger")));
+		jMenuFileSaveResourceBundleAs.setAccelerator(KeyStroke.getKeyStroke(
+                  KeyEvent.VK_S, ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK));
+		jMenuFileSaveResourceBundleAs.addActionListener(listener);
+		
+		jMenuFileImportResourceBundle.setVisible(true);
+		jMenuFileImportResourceBundle.setText(Resources.getTranslation("menu_file_import"));
+		jMenuFileImportResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_trigger")));
+		jMenuFileImportResourceBundle.addActionListener(listener);
+		
+		jMenuFileImportJava.setVisible(true);
+		jMenuFileImportJava.setText(Resources.getTranslation("menu_file_import_java"));
+		jMenuFileImportJava.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_java_trigger")));
+		jMenuFileImportJava.addActionListener(listener);
+		
+		jMenuFileImportProperties.setVisible(true);
+		jMenuFileImportProperties.setText(Resources.getTranslation("menu_file_import_properties"));
+		jMenuFileImportProperties.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_properties_trigger")));
+		jMenuFileImportProperties.addActionListener(listener);
+		
+		jMenuFileImportTMX.setVisible(true);
+		jMenuFileImportTMX.setText(Resources.getTranslation("menu_file_import_TMX"));
+		jMenuFileImportTMX.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_TMX_trigger")));
+		jMenuFileImportTMX.addActionListener(listener);
+		
+		jMenuFileImportXLF.setVisible(true);
+		jMenuFileImportXLF.setText(Resources.getTranslation("menu_file_import_XLF"));
+		jMenuFileImportXLF.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_import_XLF_trigger")));
+		jMenuFileImportXLF.addActionListener(listener);
+		
+		jMenuFileExportResourceBundle.setVisible(true);
+		jMenuFileExportResourceBundle.setText(Resources.getTranslation("menu_file_export"));
+		jMenuFileExportResourceBundle.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_trigger")));
+		jMenuFileExportResourceBundle.addActionListener(listener);
+		
+		jMenuFileExportJava.setVisible(true);
+		jMenuFileExportJava.setText(Resources.getTranslation("menu_file_export_java"));
+		jMenuFileExportJava.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_java_trigger")));
+		jMenuFileExportJava.addActionListener(listener);
+		
+		jMenuFileExportICU.setVisible(true);
+		jMenuFileExportICU.setText(Resources.getTranslation("menu_file_export_ICU"));
+		jMenuFileExportICU.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_ICU_trigger")));
+		jMenuFileExportICU.addActionListener(listener);
+
+		jMenuFileExportProperties.setVisible(true);
+		jMenuFileExportProperties.setText(Resources.getTranslation("menu_file_export_properties"));
+		jMenuFileExportProperties.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_properties_trigger")));
+		jMenuFileExportProperties.addActionListener(listener);
+		
+		jMenuFileExportTMX.setVisible(true);
+		jMenuFileExportTMX.setText(Resources.getTranslation("menu_file_export_TMX"));
+		jMenuFileExportTMX.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_TMX_trigger")));
+		jMenuFileExportTMX.addActionListener(listener);
+		
+		jMenuFileExportXLF.setVisible(true);
+		jMenuFileExportXLF.setText(Resources.getTranslation("menu_file_export_XLF"));
+		jMenuFileExportXLF.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_export_XLF_trigger")));
+		jMenuFileExportXLF.addActionListener(listener);
+
+		jMenuFileExit.setVisible(true);
+		jMenuFileExit.setText(Resources.getTranslation("menu_file_quit"));
+		jMenuFileExit.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_file_quit_trigger")));
+		jMenuFileExit.setAccelerator(KeyStroke.getKeyStroke(
+                  KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
+		jMenuFileExit.addActionListener(listener);
+
+		// Add Edit Menu Items to the Edit Menu
+		jMenuEdit.setVisible(true);
+		jMenuEdit.setText(Resources.getTranslation("menu_edit"));
+		jMenuEdit.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_trigger")));
+		jMenuEdit.add(jMenuEditCut);
+		jMenuEdit.add(jMenuEditCopy);
+		jMenuEdit.add(jMenuEditPaste);
+		jMenuEdit.add(jMenuEditDelete);
+
+		jMenuEditCut.setVisible(true);
+		jMenuEditCut.setText(Resources.getTranslation("menu_edit_cut"));
+		jMenuEditCut.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_cut_trigger")));
+		jMenuEditCut.setAccelerator(KeyStroke.getKeyStroke(
+				KeyEvent.VK_X, ActionEvent.CTRL_MASK));
+
+		jMenuEditCopy.setVisible(true);
+		jMenuEditCopy.setText(Resources.getTranslation("menu_edit_copy"));
+		jMenuEditCopy.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_copy_trigger")));
+		jMenuEditCopy.setAccelerator(KeyStroke.getKeyStroke(
+				KeyEvent.VK_C, ActionEvent.CTRL_MASK));
+
+		jMenuEditPaste.setVisible(true);
+		jMenuEditPaste.setText(Resources.getTranslation("menu_edit_paste"));
+		jMenuEditPaste.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_paste_trigger")));
+		jMenuEditPaste.setAccelerator(KeyStroke.getKeyStroke(
+				KeyEvent.VK_V, ActionEvent.CTRL_MASK));
+		
+		jMenuEditDelete.setVisible(true);
+		jMenuEditDelete.setText(Resources.getTranslation("menu_edit_delete"));
+		jMenuEditDelete.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_edit_delete_trigger")));
+
+		// Add Options Menu Items to the Options Menu
+		jMenuOptions.setVisible(true);
+		jMenuOptions.setText(Resources.getTranslation("menu_options"));
+		jMenuOptions.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_trigger")));
+		jMenuOptions.add(jMenuOptionsAddNewEntry);
+		jMenuOptions.add(jMenuOptionsAddNewGroup);
+		jMenuOptions.add(jMenuOptionsAddNewResourceFile);
+		//jMenuOptions.addSeparator();
+		//jMenuOptions.add(jMenuOptionsProjectViewer);
+		jMenuOptions.addSeparator();
+		jMenuOptions.add(jMenuOptionsPreferences);
+
+		jMenuOptionsAddNewEntry.setVisible(true);
+		jMenuOptionsAddNewEntry.setText(Resources.getTranslation("menu_options_addentry"));
+		jMenuOptionsAddNewEntry.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addentry_trigger")));
+		jMenuOptionsAddNewEntry.addActionListener(listener);
+		
+		jMenuOptionsAddNewGroup.setVisible(true);
+		jMenuOptionsAddNewGroup.setText(Resources.getTranslation("menu_options_addgroup"));
+		jMenuOptionsAddNewGroup.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addgroup_trigger")));
+		jMenuOptionsAddNewGroup.addActionListener(listener);
+
+		jMenuOptionsAddNewResourceFile.setVisible(true);
+		jMenuOptionsAddNewResourceFile.setText(Resources.getTranslation("menu_options_addfile"));
+		jMenuOptionsAddNewResourceFile.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_addfile_trigger")));
+		jMenuOptionsAddNewResourceFile.addActionListener(listener);
+		
+		/*
+		jMenuOptionsProjectViewer.setVisible(true);
+		jMenuOptionsProjectViewer.setText(Resources.getTranslation("menu_options_project_viewer"));
+		jMenuOptionsProjectViewer.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_project_viewer_trigger")));
+		jMenuOptionsProjectViewer.addActionListener(listener);
+		*/
+		
+		jMenuOptionsPreferences.setVisible(true);
+		jMenuOptionsPreferences.setText(Resources.getTranslation("menu_options_preferences"));
+		jMenuOptionsPreferences.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_options_preferences_trigger")));
+		jMenuOptionsPreferences.addActionListener(listener);
+
+		// Add View Menu Items to the View Menu
+		jMenuView.setVisible(true);
+		jMenuView.setText(Resources.getTranslation("menu_view"));
+		jMenuView.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_view_trigger")));
+		jMenuView.add(jMenuViewViewStatistics);
+
+		jMenuViewViewStatistics.setVisible(true);
+		jMenuViewViewStatistics.setText(Resources.getTranslation("menu_view_statistics"));
+		jMenuViewViewStatistics.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_view_statistics_trigger")));
+
+		// Add Help Menu Items to the Help Menu
+		jMenuHelp.setVisible(true);
+		jMenuHelp.setText(Resources.getTranslation("menu_help"));
+		jMenuHelp.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_help_trigger")));
+		jMenuHelp.add(jMenuHelpAboutResourceBundleManager);
+
+		jMenuHelpAboutResourceBundleManager.setVisible(true);
+		jMenuHelpAboutResourceBundleManager.setText(Resources.getTranslation("menu_help_about"));
+		jMenuHelpAboutResourceBundleManager.setMnemonic(getKeyEventKey(Resources.getTranslation("menu_help_about_trigger")));
+		jMenuHelpAboutResourceBundleManager.setAccelerator(KeyStroke.getKeyStroke(
+				KeyEvent.VK_H, ActionEvent.CTRL_MASK));
+		jMenuHelpAboutResourceBundleManager.addActionListener(listener);
+	}
+	
+	public static int getKeyEventKey(String character) {
+		if (character == null) return KeyEvent.VK_A;
+		character = character.toUpperCase();
+	
+		if (character.startsWith("A")) return KeyEvent.VK_A;
+		else if (character.startsWith("B")) return KeyEvent.VK_B;
+		else if (character.startsWith("C")) return KeyEvent.VK_C;
+		else if (character.startsWith("D")) return KeyEvent.VK_D;
+		else if (character.startsWith("E")) return KeyEvent.VK_E;
+		else if (character.startsWith("F")) return KeyEvent.VK_F;
+		else if (character.startsWith("G")) return KeyEvent.VK_G;
+		else if (character.startsWith("H")) return KeyEvent.VK_H;
+		else if (character.startsWith("I")) return KeyEvent.VK_I;
+		else if (character.startsWith("J")) return KeyEvent.VK_J;
+		else if (character.startsWith("K")) return KeyEvent.VK_K;
+		else if (character.startsWith("L")) return KeyEvent.VK_L;
+		else if (character.startsWith("M")) return KeyEvent.VK_M;
+		else if (character.startsWith("N")) return KeyEvent.VK_N;
+		else if (character.startsWith("O")) return KeyEvent.VK_O;
+		else if (character.startsWith("P")) return KeyEvent.VK_P;
+		else if (character.startsWith("Q")) return KeyEvent.VK_Q;
+		else if (character.startsWith("R")) return KeyEvent.VK_R;
+		else if (character.startsWith("S")) return KeyEvent.VK_S;
+		else if (character.startsWith("T")) return KeyEvent.VK_T;
+		else if (character.startsWith("U")) return KeyEvent.VK_U;
+		else if (character.startsWith("V")) return KeyEvent.VK_V;
+		else if (character.startsWith("W")) return KeyEvent.VK_W;
+		else if (character.startsWith("X")) return KeyEvent.VK_X;
+		else if (character.startsWith("Y")) return KeyEvent.VK_Y;
+		else if (character.startsWith("Z")) return KeyEvent.VK_Z;
+		else if (character.startsWith("0")) return KeyEvent.VK_0;
+		else if (character.startsWith("1")) return KeyEvent.VK_1;
+		else if (character.startsWith("2")) return KeyEvent.VK_2;
+		else if (character.startsWith("3")) return KeyEvent.VK_3;
+		else if (character.startsWith("4")) return KeyEvent.VK_4;
+		else if (character.startsWith("5")) return KeyEvent.VK_5;
+		else if (character.startsWith("6")) return KeyEvent.VK_6;
+		else if (character.startsWith("7")) return KeyEvent.VK_7;
+		else if (character.startsWith("8")) return KeyEvent.VK_8;
+		else if (character.startsWith("9")) return KeyEvent.VK_9;
+
+		return KeyEvent.VK_A;
+	}
+	
+}
diff --git a/unicodetools/com/ibm/rbm/gui/RBProjectItemPanel.java b/unicodetools/com/ibm/rbm/gui/RBProjectItemPanel.java
new file mode 100644
index 0000000..641df35
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBProjectItemPanel.java
@@ -0,0 +1,183 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.Vector;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ */
+class RBProjectItemPanel extends JPanel implements ActionListener {
+	RBManagerGUI gui;
+	
+	// Visual Components
+	Box mainBox;
+	JTextField itemFields[];
+	JLabel     itemLabels[];
+	JButton    commitButtons[];
+	JButton    commitButton;
+	JLabel     titleLabel;
+	JLabel     keyLabel;
+	JLabel     commentLabel;
+	
+	public RBProjectItemPanel(RBManagerGUI gui) {
+		super();
+		this.gui = gui;
+		initComponents();
+	}
+	
+	public void actionPerformed(ActionEvent ev) {
+		JButton button = (JButton)ev.getSource();
+		String buttonName = button.getName();
+		if (buttonName == null) {
+			// Save all components
+			RBManager bundle = gui.getSelectedProjectBundle();
+			Vector bundles = bundle.getBundles();
+			for (int i=0; i < itemFields.length; i++) {
+				String encoding = commitButtons[i].getName();
+				String translation = itemFields[i].getText();
+				String key = itemFields[i].getName();
+				for (int j=0; j < bundles.size(); j++) {
+					Bundle rbundle = (Bundle)bundles.elementAt(j);
+					if (rbundle.encoding.equals(encoding)) {
+						BundleItem item = rbundle.getBundleItem(key);
+						if (item != null) item.setTranslation(translation);
+						break;
+					}
+				}
+			}
+			gui.saveResources(bundle);
+		} else {
+			// Save a particular encoding
+			String encoding = buttonName;
+			RBManager bundle = gui.getSelectedProjectBundle();
+			int index = -1;
+			for (int i=0; i < commitButtons.length; i++) {
+				if (commitButtons[i] == button) {
+					index = i;
+					break;
+				}
+			}
+			String translation = itemFields[index].getText();
+			String key = itemFields[index].getName();
+			Vector bundles = bundle.getBundles();
+			for (int i=0; i < bundles.size(); i++) {
+				Bundle rbundle = (Bundle)bundles.elementAt(i);
+				if (rbundle.encoding.equals(encoding)) {
+					BundleItem item = rbundle.getBundleItem(key);
+					if (item != null) {
+						item.setTranslation(translation);
+						RBManagerGUI.debugMsg("Set translation to : " + translation);
+					}
+					else
+					    RBManagerGUI.debugMsg("Item was null");
+					break;
+				} 
+				RBManagerGUI.debugMsg("Compared " + rbundle.encoding + " with " + encoding);
+			}
+			gui.saveResources(bundle, encoding);
+		}
+		updateComponents();
+	}
+	
+	private void initComponents() {
+		setLayout(new BorderLayout());
+		JPanel topPanel = new JPanel(new GridLayout(2,1));
+		titleLabel = new JLabel(Resources.getTranslation("project_panel_default_title"), SwingConstants.CENTER);
+		titleLabel.setFont(new Font("serif",Font.BOLD,18));
+		JPanel commentPanel = new JPanel(new GridLayout(2,1));
+		JLabel commentLabel2 = new JLabel(Resources.getTranslation("project_panel_comment"), SwingConstants.LEFT);
+		commentLabel = new JLabel(Resources.getTranslation("project_panel_comment_none"), SwingConstants.LEFT);
+		commentPanel.add(commentLabel2);
+		commentPanel.add(commentLabel);
+		topPanel.add(titleLabel);
+		topPanel.add(commentPanel);
+		JPanel centerPanel = new JPanel(new BorderLayout());
+		mainBox = new Box(BoxLayout.Y_AXIS);
+		JScrollPane scrollPane = new JScrollPane(mainBox,
+												ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+												ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+		centerPanel.add(scrollPane, BorderLayout.NORTH);
+		centerPanel.setBorder(BorderFactory.createEtchedBorder());
+		JPanel botPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+		commitButton = new JButton(Resources.getTranslation("project_panel_commit_button_all"));
+		commitButton.addActionListener(this);
+		botPanel.add(commitButton);
+		add(topPanel, BorderLayout.NORTH);
+		add(centerPanel, BorderLayout.CENTER);
+		add(botPanel, BorderLayout.SOUTH);
+		
+		updateComponents();
+	}
+	
+	public void updateComponents() {
+		BundleItem item = gui.getSelectedProjectBundleItem();
+		
+		if (item == null) {
+			commentLabel.setText(Resources.getTranslation("project_panel_comment_none"));
+			titleLabel.setText(Resources.getTranslation("project_panel_default_title"));
+			itemFields = null;
+			itemLabels = null;
+			commitButtons = null;
+			commitButton.setEnabled(false);
+		} else {
+			String comment = item.getComment();
+			String key = item.getKey();
+			commentLabel.setText(comment);
+			titleLabel.setText(Resources.getTranslation("project_panel_title", key));
+			
+			RBManager manager = gui.getSelectedProjectBundle();
+			Vector bundles = manager.getBundles();
+			itemFields = new JTextField[bundles.size()];
+			itemLabels = new JLabel[bundles.size()];
+			commitButtons = new JButton[bundles.size()];
+			for (int i=0; i < bundles.size(); i++) {
+				Bundle bundle = (Bundle)bundles.elementAt(i);
+				BundleItem bundleItem = bundle.getBundleItem(key);
+				//boolean translated = bundleItem.isTranslated();
+				JLabel encodingLabel = new JLabel(Resources.getTranslation("project_panel_bundle", bundle.toString()),
+												  SwingConstants.LEFT);
+				if (bundleItem == null || !bundleItem.isTranslated()) {
+				    encodingLabel.setText(Resources.getTranslation("project_panel_bundle_untranslated",
+																	bundle.toString()));
+				}
+				String fieldText = (bundleItem == null ? Resources.getTranslation("project_panel_item_inherits") :
+														 bundleItem.getTranslation());
+				JTextField itemField = new JTextField(fieldText);
+				itemField.setMaximumSize(new Dimension(this.getSize().width-150, 200));
+				itemField.setName(key);
+				JButton commitItemButton = new JButton(Resources.getTranslation("project_panel_commit_button"));
+				commitItemButton.addActionListener(this);
+				commitItemButton.setName(bundle.encoding);
+				itemFields[i] = itemField;
+				itemLabels[i] = encodingLabel;
+				commitButtons[i] = commitItemButton;
+			}
+			commitButton.setEnabled(true);
+		}
+		
+		mainBox.removeAll();
+		if (itemFields != null) {
+			for (int i=0; i < itemFields.length; i++) {
+				JPanel bundlePanel = new JPanel(new BorderLayout());
+				bundlePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
+				bundlePanel.add(itemLabels[i], BorderLayout.NORTH);
+				bundlePanel.add(itemFields[i], BorderLayout.CENTER);
+				bundlePanel.add(commitButtons[i], BorderLayout.EAST);
+				mainBox.add(bundlePanel);
+			}
+		}
+		
+		revalidate();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/RBSearchPanel.java b/unicodetools/com/ibm/rbm/gui/RBSearchPanel.java
new file mode 100644
index 0000000..1c7fd50
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBSearchPanel.java
@@ -0,0 +1,339 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2007, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+import javax.swing.*;
+import javax.swing.table.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * The class used to display untranslated items
+ */
+class RBSearchPanel extends JPanel {
+	RBManager rbm;
+	Bundle bundle;
+	RBManagerGUI listener;
+	
+	// Components
+	JLabel titleLabel       = new JLabel();
+	JLabel findLabel        = new JLabel(Resources.getTranslation("search_find"));
+	JLabel replaceLabel     = new JLabel(Resources.getTranslation("search_replace"));
+	
+	JTextField findField    = new JTextField();
+	JTextField replaceField = new JTextField();
+	
+	JCheckBox keysCheck     = new JCheckBox(Resources.getTranslation("search_keys"), false);
+	JCheckBox transCheck    = new JCheckBox(Resources.getTranslation("search_values"), true);
+	JCheckBox commentsCheck = new JCheckBox(Resources.getTranslation("search_comments"), false);
+	JCheckBox caseCheck     = new JCheckBox(Resources.getTranslation("search_case_sensitive"), false);
+	
+	JButton findButton      = new JButton(Resources.getTranslation("button_search_find_all"));
+	JButton replaceButton   = new JButton(Resources.getTranslation("button_search_replace_all"));
+	
+	SearchItemsTableModel     model;
+	JTable                    table;
+	JScrollPane               tableScroll;
+	
+	public RBSearchPanel(RBManagerGUI gui) {
+		super();
+		listener = gui;
+	}
+	
+	public void setBundle(Bundle b) {
+		rbm = null;
+		if (bundle == null) {
+			bundle = b;
+			initComponents();
+		} else if (bundle != b) {
+			bundle = b;
+			updateComponents();
+		}
+	}
+	
+	public void setManager(RBManager m) {
+		bundle = null;
+		if (rbm == null) {
+			rbm = m;
+			initComponents();
+		} else if (rbm != m) {
+			rbm = m;
+			updateComponents();
+		}
+	}
+	
+	public void removeElements() {
+		if (rbm != null || bundle != null) {
+			rbm = null;
+			bundle = null;
+			initComponents();
+		}
+	}
+	
+	protected void performSearch() {
+		String search_term = findField.getText().trim();
+		if (search_term.length() < 1) return;
+		if (bundle != null) {
+			performSearch(search_term, bundle, caseCheck.isSelected());
+		} else if (rbm != null) {
+			performSearch(search_term, (Bundle)rbm.getBundles().elementAt(0), caseCheck.isSelected());
+		}
+	}
+	
+	private void performSearch(String term, Bundle bundle, boolean case_sensitive) {
+		Vector ret_v = new Vector();
+		Enumeration keys = bundle.allItems.keys();
+		while (keys.hasMoreElements()) {
+			String key = (String)keys.nextElement();
+			BundleItem item = (BundleItem)bundle.allItems.get(key);
+			if (case_sensitive) {
+				if (keysCheck.isSelected() && key.indexOf(term) >= 0) {
+					ret_v.addElement(item);
+					continue;
+				} // end if - keys
+				if (transCheck.isSelected() && item.getTranslation().indexOf(term) >= 0) {
+					ret_v.addElement(item);
+					continue;
+				} // end if - translations
+				if (commentsCheck.isSelected()) {
+					if (item.getComment().indexOf(term) >= 0) {
+						ret_v.addElement(item);
+						continue;
+					}
+					Hashtable lookups = item.getLookups();
+					Enumeration enum2 = lookups.keys();
+					while (enum2.hasMoreElements()) {
+						String lookup_key = (String)enum2.nextElement();
+						String lookup_value = (String)lookups.get(lookup_key);
+						if (lookup_value.indexOf(term) >= 0) {
+							ret_v.addElement(item);
+							continue;
+						}
+					} // end while
+				} // end if - comments
+			} else {
+				// Not case sensitive	
+				if (keysCheck.isSelected() && key.toUpperCase().indexOf(term.toUpperCase()) >= 0) {
+					ret_v.addElement(item);
+					continue;
+				} // end if - keys
+				if (transCheck.isSelected() && item.getTranslation().toUpperCase().indexOf(term.toUpperCase()) >= 0) {
+					ret_v.addElement(item);
+					continue;
+				} // end if - translations
+				if (commentsCheck.isSelected()) {
+					if (item.getComment().toUpperCase().indexOf(term.toUpperCase()) >= 0) {
+						ret_v.addElement(item);
+						continue;
+					}
+					Hashtable lookups = item.getLookups();
+					Enumeration enum2 = lookups.keys();
+					while (enum2.hasMoreElements()) {
+						String lookup_key = (String)enum2.nextElement();
+						String lookup_value = (String)lookups.get(lookup_key);
+						if (lookup_value.toUpperCase().indexOf(term.toUpperCase()) >= 0) {
+							ret_v.addElement(item);
+							continue;
+						}
+					} // end while
+				} // end if - comments
+			}
+		} // end while
+		model.setItems(ret_v);
+		model.update();
+	}
+	
+	protected void performReplace() {
+		String search_term = findField.getText().trim();
+		String replace_term = replaceField.getText().trim();
+		performSearch();
+		if (search_term.length() < 1 || replace_term.length() < 1) return;
+		if (keysCheck.isSelected()) {
+			JOptionPane.showMessageDialog(this,
+				Resources.getTranslation("error_no_key_replace"),
+				Resources.getTranslation("warning"), JOptionPane.WARNING_MESSAGE);
+		}
+		Vector items = model.getBundleItems();
+		for (int i=0; i < items.size(); i++) {
+			BundleItem item = (BundleItem)items.elementAt(i);
+			if (transCheck.isSelected()) {
+				item.setTranslation(replace(item.getTranslation(), search_term, replace_term));
+			}
+			if (commentsCheck.isSelected()) {
+				item.setComment(replace(item.getComment(), search_term, replace_term));
+			}
+		}
+		model.update();
+	}
+	
+	// Replaces all instances of match in original with replace
+	
+	private String replace(String original, String match, String replace) {
+		int current_index = -1;
+		while (original.indexOf(match,++current_index) >= 0) {
+			current_index = original.indexOf(match, current_index);
+			original = original.substring(0,current_index) + replace +
+					   original.substring(current_index+match.length(), original.length());
+		}
+		return original;
+	}
+	
+	public void initComponents() {
+		// Initialize components
+		if (bundle != null) {
+			titleLabel.setText(bundle.name);
+		}
+		else if (rbm != null) {
+			titleLabel.setText(rbm.getBaseClass() + " - " + Resources.getTranslation("search"));
+		}
+		model = new SearchItemsTableModel(new Vector());
+		
+		titleLabel.setFont(new Font("SansSerif",Font.PLAIN,18));
+		
+		removeAll();
+		setLayout(new BorderLayout());
+		table = new JTable(model);
+		tableScroll = new JScrollPane(table);
+		
+		table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+		table.addMouseListener(listener);
+		
+		Dimension dim = new Dimension(75,15);
+		
+		findField.setColumns(20);
+		replaceField.setColumns(20);
+		findLabel.setPreferredSize(dim);
+		replaceLabel.setPreferredSize(dim);
+		
+		JPanel innerPanel = new JPanel(new BorderLayout());
+		JPanel southPanel = new JPanel();
+		JPanel westPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		JPanel westPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
+		Box rightBox = new Box(BoxLayout.Y_AXIS);
+		Box leftBox = new Box(BoxLayout.Y_AXIS);
+		
+		// Add action listeners
+		findButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent ev) {
+				performSearch();
+			}
+		});
+		
+		replaceButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent ev) {
+				performReplace();
+			}
+		});
+		
+		findButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_search_find_all_trigger")));
+		replaceButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_search_replace_all_trigger")));
+		
+		// Place components
+		westPanel1.add(findLabel);
+		westPanel1.add(Box.createHorizontalStrut(5));
+		westPanel1.add(findField);
+		
+		westPanel2.add(replaceLabel);
+		westPanel2.add(Box.createHorizontalStrut(5));
+		westPanel2.add(replaceField);
+		
+		leftBox.add(Box.createVerticalGlue());
+		leftBox.add(westPanel1);
+		leftBox.add(westPanel2);
+		//leftBox.add(caseCheck);
+		
+		rightBox.add(keysCheck);
+		rightBox.add(transCheck);
+		rightBox.add(commentsCheck);
+		
+		southPanel.add(findButton);
+		southPanel.add(Box.createHorizontalStrut(5));
+		southPanel.add(replaceButton);
+		southPanel.add(Box.createHorizontalStrut(10));
+		southPanel.add(caseCheck);
+		
+		innerPanel.add(titleLabel, BorderLayout.NORTH);
+		innerPanel.add(leftBox, BorderLayout.CENTER);
+		innerPanel.add(rightBox, BorderLayout.EAST);
+		innerPanel.add(southPanel, BorderLayout.SOUTH);
+		
+		add(innerPanel, BorderLayout.NORTH);
+		add(tableScroll, BorderLayout.CENTER);
+	
+		if (rbm == null && bundle == null) {
+			removeAll();
+		}
+	}
+	
+	public void updateComponents() {
+		
+	}
+}
+
+// The table model for searched Items
+
+class SearchItemsTableModel extends AbstractTableModel {
+	Vector items;
+	
+	public SearchItemsTableModel(Vector items) {
+		this.items = items;
+	}
+	
+	public void setItems(Vector items) {
+		this.items = items;
+	}
+	
+	public int getColumnCount() { return 3; }
+		    
+	public int getRowCount() {
+		return items.size();
+	}
+	
+	public Object getValueAt(int row, int col) {
+		BundleItem item = (BundleItem)items.elementAt(row);
+		String retStr = null;
+				
+		switch(col) {
+		case 0:
+			retStr = item.getKey();
+			break;
+		case 1:
+			retStr = item.getTranslation();
+			break;
+		case 2:
+			retStr = (item.getParentGroup() == null ? "" : item.getParentGroup().getName());
+			break;
+		default:
+			retStr = Resources.getTranslation("table_cell_error");
+		}
+				
+		return retStr;
+	}
+			
+	public String getColumnName(int col) {
+		if (col == 0) return Resources.getTranslation("languageuntrans_column_key");
+		else if (col == 1) return Resources.getTranslation("languageuntrans_column_translation");
+		else if (col == 2) return Resources.getTranslation("languageuntrans_column_group");
+		else return Resources.getTranslation("table_column_error");
+	}
+	
+	public BundleItem getBundleItem(int row) {
+		return (BundleItem)items.elementAt(row);
+	}
+	
+	public Vector getBundleItems() {
+		return items;
+	}
+	
+	public void update() {
+		fireTableDataChanged();
+	}
+}
diff --git a/unicodetools/com/ibm/rbm/gui/RBStatisticsPanel.java b/unicodetools/com/ibm/rbm/gui/RBStatisticsPanel.java
new file mode 100644
index 0000000..0ac8e33
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBStatisticsPanel.java
@@ -0,0 +1,391 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+import javax.swing.text.JTextComponent;
+
+import com.ibm.rbm.*;
+
+/**
+ * The class used to display statistics
+ */
+class RBStatisticsPanel extends JPanel {
+	RBManager rbm;
+	Bundle bundle;
+	
+	// Components - Bundle
+	JLabel     jLabelStatsTitle;
+		
+	JLabel     jLabelStatsName;
+	JLabel     jLabelStatsComment;
+	JLabel     jLabelStatsManager;
+	JLabel     jLabelStatsLanguage;
+	JLabel     jLabelStatsCountry;
+	JLabel     jLabelStatsVariant;
+	JLabel     jLabelStatsNumTrans;
+	JLabel     jLabelStatsNumUntrans;
+		
+	JTextField jTextFieldStatsName;
+	JTextField jTextFieldStatsComment;
+	JTextField jTextFieldStatsManager;
+	JTextField jTextFieldStatsLanguage;
+	JTextField jTextFieldStatsCountry;
+	JTextField jTextFieldStatsVariant;
+	
+	JButton    updateButton;
+	
+	Box        boxStatsLeftRight1;
+	Box        boxStatsLeftRight2;
+	
+	// Components - bundle manager
+	JLabel      titleLabel;
+	JLabel      numFileLabel;
+	JLabel      numDupLabel;
+	JLabel      numGroupLabel;
+	JLabel      numItemLabel;
+	
+	JList       groupList;
+	JList       fileList;
+	JList       dupList;
+	
+	JScrollPane groupScroll;
+	JScrollPane dupScroll;
+	JScrollPane fileScroll;
+	
+	JPanel      filePanel;
+	JPanel      itemPanel;
+	JPanel      groupPanel;
+	
+	JButton     fileButton;
+	JButton     groupButton;
+	JButton     itemButton;
+	
+	Box         mainBox;
+	Box         dupBox;
+	
+	
+	public void setBundle(Bundle b) {
+		rbm = null;
+		if (bundle == null) {
+			bundle = b;
+			initComponents();
+		} else if (bundle != b) {
+			bundle = b;
+			updateComponents();
+		}
+	}
+	
+	public void setManager(RBManager m) {
+		bundle = null;
+		if (rbm == null) {
+			rbm = m;
+			initComponents();
+		} else if (rbm != m) {
+			rbm = m;
+			updateComponents();
+		}
+	}
+	
+	public void removeElements() {
+		if (rbm != null || bundle != null) {
+			rbm = null;
+			bundle = null;
+			initComponents();
+		}
+	}	
+		
+	public void initComponents() {
+		// Initialize components
+		if (bundle != null) {
+			RBManagerGUI.debugMsg("Initializing components for Resource File");
+			int untranslated = bundle.getUntranslatedItemsSize();
+			
+			jLabelStatsTitle          = new JLabel(bundle.name);
+		
+			jLabelStatsName           = new JLabel(Resources.getTranslation("languagestats_title"));
+			jLabelStatsComment        = new JLabel(Resources.getTranslation("languagestats_comment"));
+			jLabelStatsManager        = new JLabel(Resources.getTranslation("languagestats_manager"));
+			jLabelStatsLanguage       = new JLabel(Resources.getTranslation("languagestats_language"));
+			jLabelStatsCountry        = new JLabel(Resources.getTranslation("languagestats_country"));
+			jLabelStatsVariant        = new JLabel(Resources.getTranslation("languagestats_variant"));
+			jLabelStatsNumTrans       = new JLabel(Resources.getTranslation("languagestats_item_count") + " " +
+												   String.valueOf(bundle.allItems.size()));
+			jLabelStatsNumUntrans     = new JLabel(Resources.getTranslation("languagestats_translation_count") + 
+												   String.valueOf(untranslated));
+		
+			jTextFieldStatsName       = new JTextField((bundle.name == null ? Resources.getTranslation("untitled") : bundle.name));
+			jTextFieldStatsComment    = new JTextField((bundle.comment == null ? "" : bundle.comment));
+			jTextFieldStatsManager    = new JTextField((bundle.manager == null ? "" : bundle.manager));
+			jTextFieldStatsLanguage   = new JTextField((bundle.language == null ? "" : bundle.language),25);
+			jTextFieldStatsCountry    = new JTextField((bundle.country == null ? "" : bundle.country),25);
+			jTextFieldStatsVariant    = new JTextField((bundle.variant == null ? "" : bundle.variant),25);
+		
+			boxStatsLeftRight1        = new Box(BoxLayout.X_AXIS);
+			boxStatsLeftRight2        = new Box(BoxLayout.X_AXIS);	
+		
+			updateButton              = new JButton(Resources.getTranslation("button_update"));
+			updateButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_update_trigger")));
+			
+			// Set up the components
+			jLabelStatsTitle.setFont(new Font("SansSerif",Font.PLAIN,18));
+			
+			ButtonEnablerFocusListener befl = new ButtonEnablerFocusListener(updateButton);
+			
+			// Add listeners
+			updateButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					updateBundleInfo();
+				}
+			});
+			
+			jTextFieldStatsName.addFocusListener(befl);
+			jTextFieldStatsComment.addFocusListener(befl);
+			jTextFieldStatsManager.addFocusListener(befl);
+			jTextFieldStatsLanguage.addFocusListener(befl);
+			jTextFieldStatsCountry.addFocusListener(befl);
+			jTextFieldStatsVariant.addFocusListener(befl);
+			
+			jTextFieldStatsName.setColumns(35);
+			jTextFieldStatsComment.setColumns(35);
+			jTextFieldStatsManager.setColumns(35);
+			jTextFieldStatsLanguage.setColumns(25);
+			jTextFieldStatsCountry.setColumns(25);
+			jTextFieldStatsVariant.setColumns(25);
+			
+			//updateButton.setEnabled(false);
+			
+			// Update the display
+			if (mainBox != null){
+				mainBox.removeAll();
+			} else {
+				mainBox = new Box(BoxLayout.Y_AXIS);
+			}
+			if (dupBox != null)
+				dupBox.removeAll();
+			removeAll();
+			mainBox.add(jLabelStatsTitle);
+			mainBox.add(Box.createVerticalStrut(10));
+			mainBox.add(jLabelStatsName);
+			mainBox.add(jTextFieldStatsName);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsComment);
+			mainBox.add(jTextFieldStatsComment);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsManager);
+			mainBox.add(jTextFieldStatsManager);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsLanguage);
+			mainBox.add(jTextFieldStatsLanguage);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsCountry);
+			mainBox.add(jTextFieldStatsCountry);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsVariant);
+			mainBox.add(jTextFieldStatsVariant);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsNumTrans);
+			mainBox.add(Box.createVerticalStrut(5));
+			mainBox.add(jLabelStatsNumUntrans);
+			mainBox.add(Box.createVerticalStrut(10));
+			mainBox.add(updateButton);
+			mainBox.add(Box.createHorizontalGlue());
+			if (!(getLayout() instanceof FlowLayout)) {
+				setLayout(new FlowLayout());
+			}
+			add(mainBox);
+		} else if (rbm != null) {
+			RBManagerGUI.debugMsg("Initializing components for Resource Bundle");
+			titleLabel          = new JLabel(rbm.getBaseClass() + " - " + Resources.getTranslation("baseclass"));
+		
+			numFileLabel        = new JLabel(Resources.getTranslation("basestats_file_count") + " " + rbm.getNumberLanguages());
+			numGroupLabel       = new JLabel(Resources.getTranslation("basestats_group_count") + " " + rbm.getNumberGroups());
+			numItemLabel        = new JLabel(Resources.getTranslation("basestats_item_count") + " " + rbm.getNumberTotalTranslations());
+			numDupLabel         = new JLabel(Resources.getTranslation("basestats_duplicates_count") + " " + rbm.getNumberDuplicates());
+			
+			fileList            = new JList(rbm.getLanguageListingVector());
+			groupList           = new JList(rbm.getGroupListingVector());
+			dupList             = new JList(rbm.getDuplicatesListingVector());
+			
+			fileButton          = new JButton(Resources.getTranslation("button_add_file"));
+			groupButton         = new JButton(Resources.getTranslation("button_add_group"));
+			itemButton          = new JButton(Resources.getTranslation("button_add_resource"));
+			
+			filePanel           = new JPanel();
+			groupPanel          = new JPanel();
+			itemPanel           = new JPanel();
+			
+			fileScroll          = new JScrollPane(fileList);
+			groupScroll         = new JScrollPane(groupList);
+			dupScroll           = new JScrollPane(dupList);
+			
+			if (mainBox == null) {
+				mainBox         = new Box(BoxLayout.Y_AXIS);
+			} else {
+				mainBox.removeAll();
+			}
+			dupBox              = new Box(BoxLayout.Y_AXIS);
+			
+			// Set up the components
+			filePanel.setLayout(new BorderLayout());
+			groupPanel.setLayout(new BorderLayout());
+			itemPanel.setLayout(new BorderLayout());
+			
+			filePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+																 Resources.getTranslation("basestats_file_group")));
+			groupPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+																 Resources.getTranslation("basestats_group_group")));
+			itemPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+																 Resources.getTranslation("basestats_item_group")));
+			
+			titleLabel.setFont(new Font("SansSerif",Font.PLAIN,18));
+			
+			fileButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_add_file_trigger")));
+			groupButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_add_group_trigger")));
+			itemButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_add_resource_trigger")));
+			
+			// Add listeners
+			fileButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					Container c = ((JButton)ev.getSource()).getParent();
+					RBManagerGUI gui = null;
+					while (!(c.getParent() instanceof RBManagerGUI)) c = c.getParent();
+					gui = (RBManagerGUI)c.getParent();
+					gui.createResourceFile();
+				}
+			});
+			
+			groupButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					Container c = ((JButton)ev.getSource()).getParent();
+					RBManagerGUI gui = null;
+					while (!(c.getParent() instanceof RBManagerGUI)) c = c.getParent();
+					gui = (RBManagerGUI)c.getParent();
+					gui.createBundleGroup();
+				}
+			});
+			
+			itemButton.addActionListener(new ActionListener(){
+				public void actionPerformed(ActionEvent ev) {
+					Container c = ((JButton)ev.getSource()).getParent();
+					RBManagerGUI gui = null;
+					while (!(c.getParent() instanceof RBManagerGUI)) c = c.getParent();
+					gui = (RBManagerGUI)c.getParent();
+					gui.createBundleItem();
+				}
+			});
+			
+			// Update the display
+			filePanel.removeAll();
+			filePanel.add(numFileLabel, BorderLayout.NORTH);
+			filePanel.add(fileScroll, BorderLayout.CENTER);
+			filePanel.add(fileButton, BorderLayout.SOUTH);
+			
+			groupPanel.removeAll();
+			groupPanel.add(numGroupLabel, BorderLayout.NORTH);
+			groupPanel.add(groupScroll, BorderLayout.CENTER);
+			groupPanel.add(groupButton, BorderLayout.SOUTH);
+			
+			dupBox.removeAll();
+			dupBox.add(numDupLabel);
+			dupBox.add(dupScroll);
+			
+			itemPanel.removeAll();
+			itemPanel.add(numItemLabel, BorderLayout.NORTH);
+			itemPanel.add(dupBox, BorderLayout.CENTER);
+			itemPanel.add(itemButton, BorderLayout.SOUTH);
+			
+			mainBox.removeAll();
+			mainBox.add(titleLabel);
+			mainBox.add(Box.createVerticalStrut(10));
+			mainBox.add(filePanel);
+			mainBox.add(Box.createVerticalStrut(10));
+			mainBox.add(groupPanel);
+			mainBox.add(Box.createVerticalStrut(10));
+			mainBox.add(itemPanel);
+			
+			removeAll();
+			if (!(getLayout() instanceof BorderLayout))
+				setLayout(new BorderLayout());
+			add(mainBox, BorderLayout.CENTER);
+			updateComponents();
+		} else {
+			removeAll();	
+		}
+		repaint();
+	}
+	
+	public void updateComponents() {
+		if (bundle != null) {
+			int untranslated = bundle.getUntranslatedItemsSize();
+			
+			jLabelStatsTitle.setText(bundle.name);
+		
+			jTextFieldStatsName.setText(bundle.name == null ? Resources.getTranslation("untitled") : bundle.name);
+			jTextFieldStatsComment.setText(bundle.comment == null ? "" : bundle.comment);
+			jTextFieldStatsManager.setText(bundle.manager == null ? "" : bundle.manager);
+			jTextFieldStatsLanguage.setText(bundle.language == null ? "" : bundle.language);
+			jTextFieldStatsCountry.setText(bundle.country == null ? "" : bundle.country);
+			jTextFieldStatsVariant.setText(bundle.variant == null ? "" : bundle.variant);
+			jLabelStatsNumTrans.setText(Resources.getTranslation("languagestats_item_count") + " " +
+					   String.valueOf(bundle.allItems.size()));
+			jLabelStatsNumUntrans.setText(Resources.getTranslation("languagestats_translation_count") + 
+					   String.valueOf(untranslated));
+		} else if (rbm == null) {
+			removeAll();
+		}
+		
+	}
+	
+	void updateBundleInfo() {
+		bundle.name     = jTextFieldStatsName.getText().trim();
+		bundle.comment  = jTextFieldStatsComment.getText().trim();
+		bundle.manager  = jTextFieldStatsManager.getText().trim();
+		bundle.language = jTextFieldStatsLanguage.getText().trim();
+		bundle.country  = jTextFieldStatsCountry.getText().trim();
+		bundle.variant  = jTextFieldStatsVariant.getText().trim();
+		updateButton.setEnabled(false);
+	}
+	
+	public RBStatisticsPanel() {
+		super();
+		bundle = null;
+		rbm = null;
+	}
+	
+}
+
+class ButtonEnablerFocusListener implements FocusListener {
+	JButton button;
+	String beforeText = null;
+	
+	public ButtonEnablerFocusListener(JButton button) {
+		super();
+		this.button = button;
+	}
+	
+	public void focusGained(FocusEvent ev) {
+		Object o = ev.getSource();
+		if (o instanceof JTextComponent) {
+			JTextComponent jtc = (JTextComponent)o;
+			beforeText = jtc.getText();
+		}
+	}
+	
+	public void focusLost(FocusEvent ev) {
+		Object o = ev.getSource();
+		if (o instanceof JTextComponent) {
+			JTextComponent jtc = (JTextComponent)o;
+			String afterText = jtc.getText();
+			if (!afterText.equals(beforeText)) button.setEnabled(true);
+		} else button.setEnabled(true);
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/RBUntranslatedPanel.java b/unicodetools/com/ibm/rbm/gui/RBUntranslatedPanel.java
new file mode 100644
index 0000000..6987da4
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/RBUntranslatedPanel.java
@@ -0,0 +1,311 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+import javax.swing.table.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * The class used to display untranslated items
+ */
+class RBUntranslatedPanel extends JPanel {
+	RBManager rbm;
+	Bundle bundle;
+	RBManagerGUI listener;
+	
+	// Components - Bundle
+	JLabel                      jLabelUntransTitle;
+	UntranslatedItemsTableModel untransTableModel;
+	JTable                      jTableUntrans;
+	JScrollPane                 jScrollPaneUntransTable;
+	
+	// Components - Bundle Manager
+	Box                         mainBox;
+	JPanel                      mainPanels[];
+	JLabel                      numUntransLabels[];
+	JScrollPane                 mainScroll;
+	JScrollPane                 listScrolls[];
+	JList                       untransLists[];
+	
+	public RBUntranslatedPanel(RBManagerGUI gui) {
+		super();
+		listener = gui;
+	}
+	
+	public void setBundle(Bundle b) {
+		rbm = null;
+		if (bundle == null) {
+			bundle = b;
+			initComponents();
+		} else if (bundle != b) {
+			bundle = b;
+			updateComponents();
+		}
+	}
+	
+	public void setManager(RBManager m) {
+		bundle = null;
+		if (rbm == null) {
+			rbm = m;
+			initComponents();
+		} else if (rbm != m) {
+			rbm = m;
+			updateComponents();
+		}
+	}
+	
+	public void removeElements() {
+		if (rbm != null || bundle != null) {
+			rbm = null;
+			bundle = null;
+			initComponents();
+		}
+	}	
+	
+	// Marks the selected resource as translated and removes from this view
+	private void markSelectedResourceAsTranslated() {
+		if (bundle == null) return;
+		if (jTableUntrans.getSelectedRow() < 0) return;
+		if (jTableUntrans.getModel() instanceof UntranslatedItemsTableModel) {
+			int row = jTableUntrans.getSelectedRow();
+			UntranslatedItemsTableModel model = (UntranslatedItemsTableModel)jTableUntrans.getModel();
+			BundleItem item = model.getBundleItem(row);
+			item.setTranslated(true);
+			model.update();
+		}
+	}
+	
+	// Removes the selected resource from the resource file
+	private void deleteSelectedResource() {
+		if (bundle == null) return;
+		if (jTableUntrans.getSelectedRow() < 0) return;
+		if (jTableUntrans.getModel() instanceof UntranslatedItemsTableModel) {
+			int row = jTableUntrans.getSelectedRow();
+			UntranslatedItemsTableModel model = (UntranslatedItemsTableModel)jTableUntrans.getModel();
+			BundleItem item = model.getBundleItem(row);
+			if (item.getParentGroup() != null && item.getParentGroup().getParentBundle() != null) {
+				Bundle bundle = item.getParentGroup().getParentBundle();
+				bundle.removeItem(item.getKey());
+			}
+			model.update();
+		}
+	}
+	
+	private void printTable() {
+		PrintJob pjob = getToolkit().getPrintJob(new Frame(),
+                           "Printing Test", null);
+
+        if (pjob != null) {          
+            Graphics pg = pjob.getGraphics();
+
+            if (pg != null) {
+                //jTableUntrans.print(pg);
+                Dimension page_dim = pjob.getPageDimension();
+				pg.setColor(Color.black);
+				int y_off = 50;
+				int x_off = 30;
+				TableModel model = jTableUntrans.getModel();
+				pg.setFont(new Font("SansSerif", Font.BOLD, 14));
+				pg.drawString("Untranslated Items:       Page 1", x_off, y_off);
+				pg.setFont(new Font("SansSerif", Font.PLAIN, 10));
+				
+				for (int i=0 ; i < model.getRowCount(); i++) {
+					if (y_off < page_dim.height - 50) {
+						y_off += 15;
+						String key = model.getValueAt(i, 0).toString();
+						String translation = model.getValueAt(i,1).toString();
+						pg.drawString(key + " -> " + translation, x_off, y_off);
+					}
+				}
+				pg.dispose(); // flush page
+            }
+            pjob.end();
+
+        }
+	}
+	
+	public void initComponents() {
+		// Initialize components
+		if (bundle != null) {
+			jLabelUntransTitle        = new JLabel(bundle.name);
+			untransTableModel         = new UntranslatedItemsTableModel(bundle);
+			jTableUntrans             = new JTable(untransTableModel);
+			jScrollPaneUntransTable   = new JScrollPane(jTableUntrans);
+	
+			// Lower panel components
+			JPanel  lowerPanel = new JPanel();
+			JButton deleteButton = new JButton(Resources.getTranslation("button_delete_resource"));
+			JButton translateButton = new JButton(Resources.getTranslation("button_mark_translated"));
+			JButton printButton = new JButton(Resources.getTranslation("button_print_table"));
+			
+			deleteButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_delete_resource_trigger")));
+			translateButton.setMnemonic(RBManagerMenuBar.getKeyEventKey(Resources.getTranslation("button_mark_translated_trigger")));
+			lowerPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("languageuntrans_selected_resources_options")));
+			lowerPanel.setLayout(new GridLayout(1,2));
+			
+			jTableUntrans.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+			jTableUntrans.addMouseListener(listener);
+			
+			jLabelUntransTitle.setFont(new Font("SansSerif",Font.PLAIN,18));
+			
+			// Add action listeners
+			deleteButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					deleteSelectedResource();
+				}
+			});
+			translateButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					markSelectedResourceAsTranslated();
+				}
+			});
+			printButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent ev) {
+					printTable();
+				}
+			});	
+			
+			removeAll();
+			setLayout(new BorderLayout());
+			lowerPanel.add(deleteButton);
+			lowerPanel.add(translateButton);
+			//lowerPanel.add(printButton);
+			add(jLabelUntransTitle, BorderLayout.NORTH);
+			add(jScrollPaneUntransTable, BorderLayout.CENTER);
+			add(lowerPanel, BorderLayout.SOUTH);
+		} else if (rbm != null) {
+			
+			int langCount = 0;       // The number of languages with untranslated Items
+			for (int i=0; i < rbm.getBundles().size(); i++) {
+				Bundle bundle = (Bundle)rbm.getBundles().elementAt(i);
+				if (bundle.getUntranslatedItemsSize() > 0) langCount++;
+			}
+			
+			// Initialize the components
+			mainPanels               = new JPanel[langCount];
+			numUntransLabels         = new JLabel[langCount];
+			listScrolls              = new JScrollPane[langCount];
+			untransLists             = new JList[langCount];
+			
+			mainBox                  = new Box(BoxLayout.Y_AXIS);
+			mainScroll               = new JScrollPane(mainBox);
+			jLabelUntransTitle       = new JLabel(rbm.getBaseClass() + " - " + Resources.getTranslation("untranslated_items"));
+			
+			// Set component properties
+			jLabelUntransTitle.setFont(new Font("SansSerif",Font.PLAIN,18));
+			mainBox.add(jLabelUntransTitle);
+			
+			int count = 0;
+			for (int i=0; i < rbm.getBundles().size(); i++) {
+				Bundle bundle = (Bundle)rbm.getBundles().elementAt(i);
+				if (bundle.getUntranslatedItemsSize() > 0) {
+					mainPanels[count] = new JPanel();
+					mainPanels[count].setLayout(new BorderLayout());
+					numUntransLabels[count] = new JLabel(Resources.getTranslation("baseuntrans_untrans_count") +
+														 bundle.getUntranslatedItemsSize());
+					// TODO: Implement a List Model for this list, remove use of vector
+					untransLists[count] = new JList(bundle.getUntranslatedItemsAsVector());
+					listScrolls[count] = new JScrollPane(untransLists[count]);
+					
+					mainPanels[count].setBorder(BorderFactory.createTitledBorder(
+												BorderFactory.createEtchedBorder(),
+												Resources.getTranslation("baseuntrans_file") + " " + bundle.toString()));
+					mainPanels[count].removeAll();
+					mainPanels[count].add(numUntransLabels[count], BorderLayout.NORTH);
+					mainPanels[count].add(listScrolls[count], BorderLayout.CENTER);
+					
+					mainBox.add(Box.createVerticalStrut(5));
+					mainBox.add(mainPanels[count]);
+					
+					count++;
+				}
+			}
+			mainScroll.setPreferredSize(getSize());
+			removeAll();
+			add(mainScroll);
+		} else {
+			removeAll();
+		}
+	}
+	
+	public void updateComponents() {
+		// Update components
+		if (bundle != null) {
+			jLabelUntransTitle.setText(bundle.name);
+			untransTableModel.setBundle(bundle);
+		} else if (rbm != null) {
+			initComponents();
+		} else {
+			removeAll();
+		}
+	}
+}
+
+/**
+ * The table model for untranslated Items
+ */
+
+class UntranslatedItemsTableModel extends AbstractTableModel {
+	Bundle bundle;
+	
+	public UntranslatedItemsTableModel(Bundle bundle) {
+		this.bundle = bundle;
+	}
+	
+	public void setBundle(Bundle bundle) {
+		this.bundle = bundle;
+		update();
+	}
+	
+	public int getColumnCount() { return 3; }
+		    
+	public int getRowCount() {
+		return bundle.getUntranslatedItemsSize();
+	}
+	
+	public Object getValueAt(int row, int col) {
+		BundleItem item = bundle.getUntranslatedItem(row);
+		String retStr = null;
+				
+		switch(col) {
+		case 0:
+			retStr = item.getKey();
+			break;
+		case 1:
+			retStr = item.getTranslation();
+			break;
+		case 2:
+			retStr = (item.getParentGroup() == null ? "" : item.getParentGroup().getName());
+			break;
+		default:
+			retStr = Resources.getTranslation("table_cell_error");
+		}
+				
+		return retStr;
+	}
+			
+	public String getColumnName(int col) {
+		if (col == 0) return Resources.getTranslation("languageuntrans_column_key");
+		else if (col == 1) return Resources.getTranslation("languageuntrans_column_translation");
+		else if (col == 2) return Resources.getTranslation("languageuntrans_column_group");
+		else return Resources.getTranslation("table_column_error");
+	}
+	
+	public BundleItem getBundleItem(int row) {
+		return bundle.getUntranslatedItem(row);
+	}
+	
+	public void update() {
+		fireTableDataChanged();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/ResourceCreationDialog.java b/unicodetools/com/ibm/rbm/gui/ResourceCreationDialog.java
new file mode 100644
index 0000000..15a2b79
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/ResourceCreationDialog.java
@@ -0,0 +1,203 @@
+/*
+ *****************************************************************************
+ * Copyright (C) 2000-2004, International Business Machines Corporation and  *
+ * others. All Rights Reserved.                                              *
+ *****************************************************************************
+ */
+package com.ibm.rbm.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+
+import com.ibm.rbm.*;
+
+/**
+ * A dialog for creating new Resource Files
+ */
+class ResourceCreationDialog extends JDialog {
+	RBManager rbm;
+	RBManagerGUI gui;
+	
+	// Components
+	Box mainBox = new Box(BoxLayout.Y_AXIS);
+	Box infoBox = new Box(BoxLayout.Y_AXIS);
+	JPanel infoPanel = new JPanel();
+	JPanel infoTitlePanel = new JPanel();
+	JPanel infoCommentPanel = new JPanel();
+	JPanel infoManagerPanel = new JPanel();
+	JPanel langPanel = new JPanel();
+	JPanel counPanel = new JPanel();
+	JPanel variPanel = new JPanel();
+	JPanel buttPanel = new JPanel();
+	
+	JLabel instructionsLabel = new JLabel("");
+	JLabel titleLabel = new JLabel(Resources.getTranslation("dialog_file_title"));
+	JLabel commentLabel = new JLabel(Resources.getTranslation("dialog_file_comment"));
+	JLabel managerLabel = new JLabel(Resources.getTranslation("dialog_file_manager"));
+	JLabel enc1Label = new JLabel(Resources.getTranslation("dialog_encoding"));
+	JLabel enc2Label = new JLabel(Resources.getTranslation("dialog_encoding"));
+	JLabel enc3Label = new JLabel(Resources.getTranslation("dialog_encoding"));
+	JLabel nam1Label = new JLabel(Resources.getTranslation("dialog_name"));
+	JLabel nam2Label = new JLabel(Resources.getTranslation("dialog_name"));
+	JLabel nam3Label = new JLabel(Resources.getTranslation("dialog_name"));
+	
+	JTextField titleField = new JTextField("");
+	JTextField commentField = new JTextField("");
+	JTextField managerField = new JTextField("");
+	JTextField enc1Field = new JTextField("");
+	JTextField enc2Field = new JTextField("");
+	JTextField enc3Field = new JTextField("");
+	JTextField nam1Field = new JTextField("");
+	JTextField nam2Field = new JTextField("");
+	JTextField nam3Field = new JTextField("");
+	
+	JCheckBox copyCheckBox = new JCheckBox(Resources.getTranslation("dialog_checkbox_copy_elements"), true);
+	
+	JButton createButton = new JButton(Resources.getTranslation("button_create"));
+	JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
+	
+	public ResourceCreationDialog(RBManager rbm, JFrame frame, String title, boolean modal) {
+		super(frame, title, modal);
+		this.gui = (RBManagerGUI)frame;
+		this.rbm = rbm;
+		initComponents();
+		enableEvents(AWTEvent.KEY_EVENT_MASK);
+	}
+	
+	protected void processKeyEvent(KeyEvent ev) {
+		if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
+			boolean success = createResource();
+			if (!success) {
+				String alert = Resources.getTranslation("error_create_file") + " " +
+							   Resources.getTranslation("error_try_again_file");
+				JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			} else {
+				setVisible(false);
+				dispose();
+			}
+		} else if (ev.getKeyCode() == KeyEvent.VK_CANCEL) {
+			closeWindow();
+		}
+	}
+	
+	boolean createResource() {
+		if (rbm == null) return false;
+		String encoding = enc1Field.getText().trim();
+		String enc2 = enc2Field.getText().trim();
+		if (enc2 != null && !enc2.equals("")) encoding += "_" + enc2;
+		String enc3 = enc3Field.getText().trim();
+		if (enc3 != null && !enc3.equals("")) encoding += "_" + enc3;
+		boolean ret = rbm.createResource(titleField.getText().trim(), commentField.getText().trim(), managerField.getText().trim(),
+							encoding, nam1Field.getText().trim(), nam2Field.getText().trim(),
+							nam3Field.getText().trim(), copyCheckBox.isSelected());
+		if (ret) { 
+			gui.updateDisplayTree();
+			gui.updateProjectTree();
+			gui.updateProjectPanels();
+		}
+		return ret;
+	}
+	
+	public void initComponents(){
+		// Error check
+		if (rbm == null) {
+			String alert = Resources.getTranslation("error_no_bundle_for_file");
+			JOptionPane.showMessageDialog(this, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+			closeWindow();
+			return;
+		}
+		
+		// Initialize values
+		int tempWidth = 175;
+		Dimension labelDim = new Dimension(tempWidth, 30);
+		titleLabel.setPreferredSize(labelDim);
+		commentLabel.setPreferredSize(labelDim);
+		managerLabel.setPreferredSize(labelDim);
+		
+		infoPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															 Resources.getTranslation("dialog_file_info")));
+		langPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															 Resources.getTranslation("dialog_language")));
+		counPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															 Resources.getTranslation("dialog_country")));
+		variPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+															 Resources.getTranslation("dialog_variant")));
+		
+		titleField.setColumns(30);
+		commentField.setColumns(30);
+		managerField.setColumns(30);
+		
+		enc1Field.setColumns(3);
+		enc2Field.setColumns(3);
+		enc3Field.setColumns(3);
+		nam1Field.setColumns(20);
+		nam2Field.setColumns(20);
+		nam3Field.setColumns(20);
+		
+		// Set up the components
+		infoTitlePanel.add(titleLabel); infoTitlePanel.add(titleField);
+		infoCommentPanel.add(commentLabel); infoCommentPanel.add(commentField);
+		infoManagerPanel.add(managerLabel); infoManagerPanel.add(managerField);
+		infoBox.add(infoTitlePanel);
+		infoBox.add(infoCommentPanel);
+		infoBox.add(infoManagerPanel);
+		infoPanel.add(infoBox);
+		
+		langPanel.add(enc1Label); langPanel.add(enc1Field); langPanel.add(nam1Label); langPanel.add(nam1Field);
+		counPanel.add(enc2Label); counPanel.add(enc2Field); counPanel.add(nam2Label); counPanel.add(nam2Field);
+		variPanel.add(enc3Label); variPanel.add(enc3Field); variPanel.add(nam3Label); variPanel.add(nam3Field);
+		
+		buttPanel.add(createButton); buttPanel.add(cancelButton);
+		
+		// Add the appropriate listeners
+		cancelButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				JDialog dialog = (JDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		});
+		
+		createButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ev) {
+				ResourceCreationDialog dialog =
+					(ResourceCreationDialog)((JButton)ev.getSource()).getParent().getParent().getParent().getParent().getParent().getParent();
+				boolean success = dialog.createResource();
+				if (!success) {
+					String alert = Resources.getTranslation("error_create_file") + " " +
+								   Resources.getTranslation("error_try_again_file");
+					JOptionPane.showMessageDialog(dialog, alert, Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
+				} else {
+					dialog.setVisible(false);
+					dialog.dispose();
+				}
+			}
+		});
+		getRootPane().setDefaultButton(createButton);
+		
+		// Complete the component layout
+		mainBox.removeAll();
+		//mainBox.add(instructionsLabel);
+		mainBox.add(infoPanel);
+		mainBox.add(langPanel);
+		mainBox.add(counPanel);
+		mainBox.add(variPanel);
+		mainBox.add(copyCheckBox);
+		mainBox.add(buttPanel);
+		
+		setLocation(new java.awt.Point(50, 50));
+		getContentPane().add(mainBox, BorderLayout.CENTER);
+		validateTree();
+		pack();
+		setVisible(true);
+		//setResizable(false);
+	}
+	
+	void closeWindow() {
+		setVisible(false);
+		dispose();
+	}
+}
+
diff --git a/unicodetools/com/ibm/rbm/gui/images/TitleLogo_transparent.gif b/unicodetools/com/ibm/rbm/gui/images/TitleLogo_transparent.gif
new file mode 100644
index 0000000..00027fd
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/TitleLogo_transparent.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2aa220c2a732230c1ef279299667ce7b69845d8abdcbeeece2f548d54feafb59
+size 1619
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_bundle.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_bundle.gif
new file mode 100644
index 0000000..81fe38a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_bundle.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0d02267543096ba5d2ddc3494d488769cfc13969860049493d3399278cb424ab
+size 1086
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_country.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_country.gif
new file mode 100644
index 0000000..cda7acd
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_country.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2fce8ee796096cbc1a6af6c4c1ce1a35712d3a5aee4ed57b9c4e3d4677dfe9df
+size 576
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_file.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_file.gif
new file mode 100644
index 0000000..90d8fef
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_file.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:912f946e7cb4dc29ec52fe08959511b1bbf582bb43e2527a2439f137b31fb30b
+size 285
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_group.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_group.gif
new file mode 100644
index 0000000..c471dad
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_group.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6f6d212f46da0ea2076cdbcd22376b3e73806ca41fc3cde955560089de2d5004
+size 369
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_item.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_item.gif
new file mode 100644
index 0000000..1afe764
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_item.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:80aaa098b5f76ab22534e3ee14c80cc29ff462f914c1e87fe53680879880fa9b
+size 200
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_language.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_language.gif
new file mode 100644
index 0000000..8ea2ee1
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_language.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdfd58c8af9c0bb83b3fad68e90c8d8f0caba28f571ed2ac62d6a8c3c486019f
+size 1078
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_project.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_project.gif
new file mode 100644
index 0000000..f812229
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_project.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1a91d3ee792b1d19b5e34c0cf3207b5f0b745fb5591c2cb56ca1ead4d905a7c
+size 291
diff --git a/unicodetools/com/ibm/rbm/gui/images/tree_icon_variant.gif b/unicodetools/com/ibm/rbm/gui/images/tree_icon_variant.gif
new file mode 100644
index 0000000..0002b40
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/gui/images/tree_icon_variant.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fed6a4898228fdcf97a982ff43a790149299b7ca93f2f42b43e4e4eb58de679
+size 450
diff --git a/unicodetools/com/ibm/rbm/install.bat b/unicodetools/com/ibm/rbm/install.bat
new file mode 100755
index 0000000..4f37011
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/install.bat
@@ -0,0 +1,64 @@
+@echo off
+
+rem *****************************************************************************
+rem * Copyright (C) 2000-2002, International Business Machines Corporation and  *
+rem * others. All Rights Reserved.                                              *
+rem *****************************************************************************
+
+call compile.bat -O
+
+echo * Making Directories
+
+mkdir zip
+cd zip
+mkdir lib
+mkdir docs
+cd docs
+mkdir Images
+cd Images
+mkdir Screenshots
+cd ..
+mkdir Tutorial
+mkdir Views
+cd ..
+mkdir Reports
+cd ..
+
+echo * Copying Files
+
+echo ** Copying Batch Files and Properties
+
+copy RBManager.jar zip
+copy RBReporter.bat zip
+copy rbmanager_scanner.xml zip
+copy resources\preferences.properties zip
+attrib -r zip/preferences.properties
+
+echo ** Copying Documentation
+
+cd docs
+copy *.html ..\zip\docs\
+cd Images
+copy *.gif ..\..\zip\docs\Images\
+copy *.jpg ..\..\zip\docs\Images\
+cd Screenshots
+copy *.gif ..\..\..\zip\docs\Images\Screenshots\
+copy *.jpg ..\..\..\zip\docs\Images\Screenshots\
+cd ..\..\Tutorial
+copy *.html ..\..\zip\docs\Tutorial\
+cd ..\Views
+copy *.html ..\..\zip\docs\Views\
+cd ..\..
+
+echo ** Copying Jar Files
+
+cd lib
+copy *.jar ..\zip\lib\
+cd ..
+
+echo ** Copying License
+copy ..\..\..\license.html zip
+
+@echo * Directory created: zip
+@echo ** Don't forget to modify preferences.properties
+pause
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/manifest.stub b/unicodetools/com/ibm/rbm/manifest.stub
new file mode 100644
index 0000000..8767429
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/manifest.stub
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Specification-Title: Resource Bundle Manager
+Specification-Version: 0.7.1
+Specification-Vendor: IBM Corporation
+Implementation-Title: Resource Bundle Manager
+Implementation-Version: 0.7.1
+Implementation-Vendor: IBM Corporation
+Implementation-Vendor-Id: com.ibm
+Main-Class: com.ibm.rbm.RBManager
+Class-Path: lib/xerces.jar
+
+Name: com/ibm/rbm
diff --git a/unicodetools/com/ibm/rbm/preferences.properties b/unicodetools/com/ibm/rbm/preferences.properties
new file mode 100644
index 0000000..50cfe80
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/preferences.properties
@@ -0,0 +1,33 @@
+#RBManager Preferences
+#Fri May 10 08:57:19 PDT 2002
+reporter_format_html_file=report.html
+username=Unknown
+reporter_format_text_detail=High
+reporter_format_xml_detail=High
+reporter_format_hmtl_enabled=Yes
+reporter_enabled=Yes
+reporter_format_xml_file=report.xml
+reporter_interval_defined_hour=1
+reporter_interval_sequential_value=1
+reporter_interval_sequential_units=Hours
+reporter_perform_scan=Yes
+reporter_format_text_file=report.txt
+reporter_format_xml_enabled=Yes
+reporter_interval_defined_day=Saturday
+locale=en
+reporter_interval=Sequential
+recentfileloc3=
+recentfileloc2=
+recentfileloc1=
+recentfileloc0=
+reporter_scan_file=./rbmanager_scanner.xml
+reporter_format_html_enabled=Yes
+recentfileid3=
+recentfileid2=
+recentfileid1=
+recentfileid0=
+reporter_interval_defined_minute=00
+reporter_format_text_enabled=Yes
+reporter_base_class_file=
+reporter_output_directory=
+reporter_format_html_detail=High
diff --git a/unicodetools/com/ibm/rbm/rbmanager_scanner.xml b/unicodetools/com/ibm/rbm/rbmanager_scanner.xml
new file mode 100644
index 0000000..73dab29
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/rbmanager_scanner.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?> 
+<RBFileScanner name="RBManager Scanner" filename="rbmanager_scanner.xml">
+	<FileRules>
+		<!--  FileRules can have attributes starts_with, ends_with, and contains --> 
+		<FileRule name="Java File" ends_with=".java" /> 
+		<FileRule name="XSL File" ends_with=".xsl" /> 
+	</FileRules>
+	<ParseRules>
+		<!--  ParseRules can have attributes follows and precedes --> 
+		<ParseRule name="Java static resource" follows="Resources.getTranslation(&quot;" precedes="&quot;" />
+	</ParseRules>
+	<Scan>
+		<Directory location="." recurse_directories="true">
+			<Rules>
+				<ApplyFileRule name="Java File">
+					<ApplyParseRule name="Java static resource" />
+				</ApplyFileRule>
+			</Rules>
+		</Directory>
+	</Scan>
+</RBFileScanner>
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/readme.txt b/unicodetools/com/ibm/rbm/readme.txt
new file mode 100644
index 0000000..e18f1e8
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/readme.txt
@@ -0,0 +1,12 @@
+This directory contains the RBManager (Resource Bundle Manager)
+
+To run the RBManager.jar, double click on RBManager.jar in Windows
+	or run "java -jar RBManager.jar" from the command line.
+To create the RBManager.jar file, use: compile.bat
+To create the installation directory, use: install.bat
+
+Help and documentation are contained in the docs directory.
+
+This version of the RBManager requires version 3.1.0 of the
+xerces.jar file to compile, but does not require it for basic
+functionality.
\ No newline at end of file
diff --git a/unicodetools/com/ibm/rbm/resources/RBManager.properties b/unicodetools/com/ibm/rbm/resources/RBManager.properties
new file mode 100644
index 0000000..4dcb648
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/resources/RBManager.properties
@@ -0,0 +1,1213 @@
+# @file          Resource Bundle Manager Base Class
+# @fileEncoding  
+# @fileLanguage  English
+# @fileCountry   U.S.
+# @fileVariant   
+# @fileManager   Jared Jackson
+# @fileComment   This is the Base Class of the translation resource bundle used by this application
+
+
+#
+# @group Base Class Groups Pane
+#
+# @groupComment Translation Items for the Base Class Group tabbed pane
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basegroup_group_comment=Group\ Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basegroup_group_name=Group\ Name\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basegroup_group_options=Resource\ Group\ Options
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basegroup_item_options=Resource\ Item\ Options
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_file_group=Resource\ Files
+
+#
+# @group Base Class Statistics Pane
+#
+# @groupComment All translations for strings appearing on the statistics pane for the base class
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_duplicates_count=Number\ of\ Duplicate\ Resource\ Keys\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_file_count=Number\ of\ Resource\ Files\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_group_count=Number\ of\ Resource\ Groups\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_group_group=Resource\ Groups
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_item_count=Number\ of\ Resource\ Items\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+basestats_item_group=Resource\ Items
+
+#
+# @group Base Class Untranslated Items Pane
+#
+# @groupComment Translations appearing on the Base Class Untranslated Items pane
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Indication of the file being viewed
+baseuntrans_file=File\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Indication of the number of resource items not translated in the file
+baseuntrans_untrans_count=Number\ of\ Untranslated\ Items\:
+
+#
+# @group Button Names
+#
+# @groupComment The names displayed on the various buttons
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Button for creating a new resource language file
+button_add_file=Add\ a\ New\ Resource\ File
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_file_trigger=n
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Button for creating a new resource group
+button_add_group=Add\ a\ New\ Resource\ Group
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_group_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Button for creating a new resource translation item
+button_add_resource=Add\ a\ New\ Resource\ Item
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_resource_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Generic button for canceling actions
+button_cancel=Cancel
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Generic button for a choice or selection option
+button_choose=Choose
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_choose_trigger=c
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Button for generic creation of groups, items, files, etc.
+button_create=Create
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment For creation of a resource group
+button_create_group=Create\ Group
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_group_trigger=g
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for creating an item then continuing creating more items
+button_create_more=Create\ &\ Continue
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_more_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Button for creating a resource translation item
+button_create_resource=Create\ Resource
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_resource_trigger=c
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_trigger=c
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Button for removing a group and its contents
+button_delete_group=Delete\ Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Button for permanently removing a resource from the bundle
+button_delete_resource=Delete\ Resource
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_delete_resource_trigger=d
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Generic edit button
+button_edit=Edit
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Button for editing group name and comment
+button_edit_group=Edit\ Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator a @modifier a
+# @comment Button for editing resource information, including key and translation
+button_edit_resource=Edit\ Resource
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_edit_resource_trigger=e
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for initiating an import of resources from an alternate source
+button_import=Import
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_import_trigger=i
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button allows a selected resource to be marked as translated without further editing
+button_mark_translated=Mark\ Resource\ as\ Translated
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_mark_translated_trigger=t
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for adding the current resource bundle in the main application to the project
+button_project_add=Add\ Current\ Bundle
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_add_trigger=a
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for closing the project window
+button_project_close=Close\ Project
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_close_trigger=c
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for creating a new resource bundle project
+button_project_new=New\ Project
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_new_trigger=n
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for opening a project file
+button_project_open=Open\ Project
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_open_trigger=o
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for removing the currently selected resource bundle from the project
+button_project_remove=Remove\ Selection
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_remove_trigger=r
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for causing the selected resource bundle to be the one being edited in the main application
+button_project_select=Edit\ Selected
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_select_trigger=e
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing a complete search
+button_search_find_all=Find\ All
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_find_all_trigger=f
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing complete search and replace
+button_search_replace_all=Replace\ All
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_replace_all_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Generic button for updating information
+button_update=Update
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_update_trigger=u
+
+#
+# @group Dialogs
+#
+# @groupComment Translations associated with the applications various dialog boxes
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Indication of wether or not a new file will be populated from the elements in the base class
+dialog_checkbox_copy_elements=Copy\ entries\ from\ the\ base\ class\ to\ the\ new\ file
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Indicator of wether an item is translated or not
+dialog_checkbox_translated=Translated
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_comment=Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_country=Country
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_created=Created\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_creator=Created\ By\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @{1} The date
+# @{0} The name of the person involved
+# @comment The date and person associated with a creation or modification of an item
+dialog_date_person={0}\ by\ {1}
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_default_comment=Default\ Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_default_translation=Default\ Translation\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_delete_file=Delete\ a\ Resource\ File
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_delete_group=Delete\ a\ Resource\ Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_delete_item=Delete\ a\ Resource\ Item
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Warning displayed when a user asks for a deletion of a file. Prompts for 'Yes' or 'No'
+dialog_delete_warning=Warning\!\ The\ deletion\ operation\ can\ no\ be\ undone.\nAre\ you\ sure\ you\ want\ to\ continue?
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_encoding=Encoding\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_file_comment=Resource\ File\ Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_file_filter_description=Base\ Class\ Property\ Files
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Description of File Filter for RBReporter XML scan configuration files
+dialog_file_filter_description_scan=XML\ RBReporter\ Scan\ Files
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_file_info=File\ Information
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_file_manager=Resource\ Manager\ Name\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_file_title=Resource\ File\ Title\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_group=Group\ Name\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_group_comment=Group\ Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_key=Entry\ Key\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_language=Language
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_lookups=Lookups\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_modified=Last\ Modified\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_modifier=Last\ Modified\ By\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The name of a language, country, or variant of a language file
+dialog_name=Name\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Prompts the user to enter a name for the resource bundle, before creating that bundle
+dialog_new_baseclass=Please\ enter\ a\ base\ class\ name\ for\ the\ new\ resource\ bundle.
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Dialog popup window text prompting the user for the name of a resource bundle project
+dialog_new_project=Please\ enter\ a\ title\ for\ your\ new\ Resource\ Bundle\ Project.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment A description of the files making it through the filter upon opening a resource bundle
+dialog_open_file_filter=Base\ Class\ Property\ Files
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment This is a section heading for setting the locale
+dialog_preferences_locale=Locale
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment Locales currently defined in the properties files for the application
+dialog_preferences_locale_defined=Defined\ for\ RBManager\:
+# @translated true @created 2000-11-10 @modified 2000-11-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+dialog_preferences_locale_iso=ISO\ Standards\:
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment Locales that are supported by the host Java Virtual Machine
+dialog_preferences_locale_machine=Machine\ Supported\:
+# @translated true @created 2000-11-10 @modified 2000-11-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+dialog_preferences_locale_warning=NOTE\:\ Locale\ changes\ are\ not\ applied\ until\ application\ is\ restarted
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment 
+dialog_preferences_lookandfeel=Look\ And\ Feel\:
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment 
+dialog_preferences_username=User\ Name\:
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Descriptor that goes into GUI file chooser
+dialog_project_file_filter_description=RBManager\ Project\ Files
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment File Filter description for resource bundle project files
+dialog_project_filter_description=Resource\ Bundle\ Projects
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment An indication that no project is open, placed in the title of the dialog where the project name would normally go
+dialog_project_none_selected=No\ Active\ Project
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @{0} The name of the project
+# @comment Title for the window showing all the resource bundles in a project
+dialog_project_title=Resource\ Bundle\ Project\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Prompts the user if they would like to save changes before exiting
+dialog_quit_save=Would\ you\ like\ to\ save\ your\ changes\ before\ quiting\ RBManager?
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @comment A generic propmpt to ask the user if they wish to save changes
+dialog_save=Would\ you\ like\ to\ save\ your\ changes\ to\ the\ resource\ bundle?
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_search_options=Search\ Options
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_search_param=Search\ For\:
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment The title of the about dialog box
+dialog_title_about_rbmanager=About\ RBManager
+# @translated true @created 2001-01-22 @modified 2001-01-22 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for deletion of an entire resource group
+dialog_title_delete_group=Delete\ Resource\ Group
+# @translated true @created 2001-01-22 @modified 2001-01-22 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title when prompting to delete a resource
+dialog_title_delete_item=Delete\ Resource
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_title_edit_group=Edit\ a\ Resource\ Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_title_edit_item=Edit\ a\ Resource\ Item
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment 
+dialog_title_error=Error
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_title_error_creating_bundle=Error\ Creating\ Resource\ Bundle
+# @translated true @created 2001-01-22 @modified 2001-01-22 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title when opening a resource bundle not created by RBManager
+dialog_title_error_not_rbmanager_format=Error\:\ Unreadable\ Resource\ Bundle
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Title on a warning dialog that I/O malfunctioned opening a file
+dialog_title_error_opening_file=Error\ Opening\ File
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Dialog title for a dialog box for entering special parameters needed to export a resource bundle to java class code
+dialog_title_export_java_options=Export\ Parameters\:\ Java\ class
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for a dialog with a progress bar governing import status
+dialog_title_import_progress=Import\ Progress
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Title for creating new bundle
+dialog_title_new_bundle=Create\ a\ New\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Title for creating a new resource file
+dialog_title_new_file=Create\ a\ New\ Resource\ File
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Title for creating a new resource group
+dialog_title_new_group=Create\ a\ New\ Resource\ Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Title for creating resource
+dialog_title_new_item=Create\ a\ New\ Resource\ Item
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Title of the dialog box showing when creating a new project
+dialog_title_new_project=New\ Resource\ Bundle\ Project
+# @translated true @created 2000-11-10 @modified 2000-11-06 @creator Jared @modifier Jared
+# @comment 
+dialog_title_preferences=Preferences
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Title for confirming exit from application
+dialog_title_quit=Quit\ RBManager
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_title_search=Search
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_title_user_name=Enter\ User\ Name
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_translation=Translation\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_user_name=Please\ enter\ your\ name.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_variant=Variant
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_warning_delete_group=Deleting\ this\ group\ will\ cause\ all\ items\ in\ the\ group\ to\ be\ permanently\ removed.\ Do\ you\ wish\ to\ continue?
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+dialog_warning_delete_item=Deleting\ the\ rsource\ item\ will\ cause\ it\ to\ be\ permanently\ removed.\ Do\ you\ wish\ to\ continue?
+
+#
+# @group Error Messages
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error=Error
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when trying to add a resource bundle to a project.
+error_adding_project_bundle=An\ error\ occurred\ trying\ to\ add\ the\ Resource\ Bundle\ you\ selected.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_baseclass_whitespace=Resource\ names\ can\ not\ have\ any\ white\ space\ characters\ in\ them.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_bundle_not_created=No\ Resource\ Bundle\ was\ created.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_create_file=A\ problem\ was\ encountered\ trying\ to\ create\ the\ resource\ file.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_create_group=A\ problem\ was\ encountered\ trying\ to\ create\ the\ group.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_create_item=A\ problem\ was\ encountered\ trying\ to\ create\ the\ entry.
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when creating a project
+error_creating_project=An\ error\ was\ encountered\ trying\ to\ create\ a\ Resource\ Bundle\ Project.
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @{0} The message from an IOException that is thrown
+# @comment Error message when trying to delete a file
+error_deleting=There\ was\ an\ error\ trying\ to\ delete\ the\ file\:\ {0}
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment An error that occurs when an attempt is made to delete a file, but the virtual machine can not do so
+error_deletion_not_possible=RBManager\ was\ unable\ to\ delete\ the\ file.\ Permission\ denied.
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment General error message for exporting resource bundles
+error_export=There\ has\ been\ an\ error\ exporting\ the\ resource\ bundle
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_internal=Internal\ Error
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_modify_file=An\ error\ was\ encountered\ trying\ to\ modify\ the\ resource\ file.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_modify_group=There\ was\ a\ problem\ trying\ to\ modify\ this\ group.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_modify_item=An\ problem\ was\ encountered\ trying\ to\ modify\ the\ entry
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_no_bundle_for_file=In\ order\ to\ create\ a\ resource\ file,\ you\ must\ first\ open\ or\ create\ a\ Resource\ Bundle.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_no_bundle_for_group=In\ order\ to\ create\ a\ group,\ you\ must\ first\ open\ or\ create\ a\ Resource\ Bundle.
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Error message displayed when the user tries to create a resource, without an open resource bundle
+error_no_bundle_for_item=Please\ create\ or\ open\ a\ resource\ bundle\ before\ attempting\ to\ create\ a\ resource\ item.
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+error_no_key_replace=Replace\ does\ not\ function\ for\ Resource\ Keys.\ All\ other\ replaces\ will\ be\ performed
+# @translated true @created 2001-01-22 @modified 2001-01-22 @creator Jared Jackson @modifier Jared Jackson
+# @comment Indication that RBManager can not read the file as created by RBManager
+error_not_rbmanager_format=The\ selected\ resource\ bundle\ was\ not\ created\ by\ RBManager\ or\ has\ been\ damaged.
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @{0} The name of the file that would not open
+# @comment Error message occuring on an I/O error trying to open a file
+error_opening_file=Could\ not\ open\ the\ file\ {0}
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Error message displayed when RBManager encounters an error writing preferences to the file system
+error_preferences_save=There\ was\ an\ error\ attempting\ to\ save\ your\ preferences.
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The error message generated
+# @comment A message presented to the user when an error occurs in saving the resource bundle
+error_saving=There\ was\ an\ error\ saving\ the\ resource\ bundle\:\ {0}
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when saving a project
+error_saving_project=An\ error\ was\ encountered\ trying\ to\ save\ the\ Resource\ Bundle\ Project.
+# @translated true @created 2001-01-22 @modified 2001-01-22 @creator Jared Jackson @modifier Jared Jackson
+# @comment Suggest trying to import the resource bundle instead of opening it.
+error_suggest_import_properties=Try\ importing\ the\ resource\ bundle\ instead
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+error_try_again_file=Please\ try\ again\ with\ different\ encoding\ values.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Jared Jackson
+# @comment 
+error_try_again_group=Please\ try\ again\ with\ a\ different\ group\ name.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Jared Jackson
+# @comment 
+error_try_again_item=Please\ try\ again\ with\ a\ different\ entry\ key.
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment Value inserted into table cells when an error has occured
+table_cell_error=*Error*
+
+#
+# @group Export
+#
+# @groupComment Resources dealing with export options
+
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Option for the parameter for created a protected class
+export_java_class_protected=Create\ a\ protected\ class
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Option for parameter setting the created class as public
+export_java_class_public=Create\ a\ public\ class
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Option for parameter for creating protected methods in the java class
+export_java_methods_protected=Create\ protected\ methods
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Option for parameter for creating public methods
+export_java_methods_public=Create\ public\ methods
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Title of a check box followed by a text field for specifying whether or not to use a package in the generated java class and what the package should be called
+export_java_package=Specify\ a\ package\:
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Text placed in a label at the top of the dialog box for specifying parameters concerning the export of resource bundles into a java class
+export_java_title=Please\ specify\ the\ following\ parameters\ for\ your\ Java\ class\:
+
+#
+# @group General
+#
+# @groupComment Some items that are common accross groups
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The file or class composed of the default translations for the bundle
+baseclass=Base\ Class
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment This is the legal copyright notice
+copyright=(C)\ Copyright\ IBM\ Corp.\ 2000-2004\ -\ All\ Rights\ Reserved
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Gerneral use for file directories
+directory=Directory
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+groups=Groups
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The name of the image file in the 'Images' directory that represents the logo seen at the top of the application
+logo_filename=TitleLogo_transparent.gif
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title when viewing a resource bundle in the project view when there is no active project
+no_project=Default\ Project
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title defaulted to when no resource bundle or project has been opened by the user
+no_project_bundle=No\ Project\ or\ Resource\ Bundle\ Open
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The top tree node title, when no resource bundle has been opened or created
+no_resource_bundle=No\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+none=None
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Project table column name - Location of a resource bundle
+project_table_file_location=File\ Location
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Table Column Name for resource bundle name
+project_table_resource_bundle=Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment An abbreviated name of this application
+rbmanager=RBManager
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment 
+rbmanager_contact=Authors\:\ Jared\ Jackson\ &\ George\ Rhoten
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The full name of this application
+resource_bundle_manager=Resource\ Bundle\ Manager
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+table_column_error=Table\ Column\ Error
+# @translated true @created 2000-11-10 @modified 2001-01-22 @creator Jared @modifier Jared Jackson
+# @{0} Country ISO code
+# @comment Node title, under which all files of the same country, language reside
+tree_country_node=Country\ Code\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @{0} Language Encoding
+# @comment The node below which languages of one encoding are grouped
+tree_language_node=Language\ Code\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+tree_variant_node=Variants\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The name assigned as a user name when the user name is not specified
+unknown_user=Unknown
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+untitled=Untitled
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+untranslated_items=Untranslated\ Items
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @{0} The version number
+# @comment The version of this application
+version=Version\ {0}
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment general use Warning
+warning=Warning
+
+#
+# @group Import
+#
+# @groupComment Resources dealing with import options
+
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for choosing TMX files
+import_TMX_file_description=TMX\ Files
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from TMX XML files
+import_TMX_title=TMX\ File\ Import
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Title for the file chooser for choosing XLIFF (.xlf) files
+import_XLF_file_description=XLIFF\ Files
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Dialog title for importing from XLIFF (.xlf) files
+import_XLF_title=XLIFF\ Files
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflcits on a case by case basis
+import_conflict_prompt=Prompt\ for\ each\ conflict
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option specifying whether a group found in the target but not found in the active resource bundle should be created in the resource bundle or not
+import_default_group_creation=Create\ groups\ not\ existing\ in\ the\ current\ bundle
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Optoin for marking the incoming values as translated or not
+import_default_translated=Mark\ as\ translated
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for options specifying the meta data to be applied to individual resources if it is not available in the import source
+import_default_values=Default\ Values
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The locale encoding of the file in question
+# @comment Instructions for prompting the user to resolve a conflict when importing resources from a locale that does not exist in the current resource bundle
+import_file_conflict_choose=The\ encoding\ {0}\ does\ not\ exist.\ Select\ an\ option\ to\ resolve\ or\ cancel\ to\ ignore\ this\ conflict.
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which a new file is generated, but not populated
+import_file_conflict_generate_empty=Generate\ a\ new,\ empty\ resource\ file
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving file conflicts in which a new file is generated and populated with all the existing resources
+import_file_conflict_generate_populate=Generate\ a\ new\ resource\ file\ and\ populate\ it\ with\ the\ base\ class\ resources
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which the conflicts are ignored
+import_file_conflict_ignore=Skip\ and\ ignore\ all\ resources\ from\ locales\ not\ existant\ in\ the\ current\ resource\ bundle
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for section listing options for what to do when an imported value exists in a locale not defined in the existing resource bundle
+import_file_conflicts=Missing\ Resource\ Files
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Selection of the default group. A list of groups will appear to the right of this resource in a ComboBox
+import_insert_group=Insert\ into\ group\:
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for the types of files accepted for this import type
+import_java_file_description=Java\ ListResourceBundle\ Base\ Classes
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for import from java classes
+import_java_title=Java\ ListResourceBundle\ Class\ Import
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title indicating section containing user options
+import_options=Import\ Options
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for selection of resource bundles stored in .properties files
+import_properties_file_description=Resource\ Bundle\ Base\ Classes
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from properties files (created or not by RBManager)
+import_properties_title=Resource\ Bundle\ Properties\ Files\ Import
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @{1} Encoding of the resource value with a conflict
+# @{0} The key value of the resource in conflict
+# @comment This is a warning and instruction for when a resource conflict occurs during an import
+import_resource_conflict_choose=The\ key\ {0}\ all\ ready\ exists\ in\ the\ {1}\ resource\ bundle.Choose\ an\ option\ to\ resolve\ this\ conflict\:
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value associated with the resource item
+# @comment An indication of the value of the resource according to the import file
+import_resource_conflict_choose_source=Import\ Translation\:\ {0}
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value of the resource item
+# @comment An indication of the translation value held by the active resource bundle during a translation resource conflict
+import_resource_conflict_choose_target=Resource\ Bundle\ translation\:\ {0}
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving resource conflicts by ignoring import value
+import_resource_conflict_ignore=Ignore\ the\ conflict\ and\ leave\ the\ original\ resource\ unchanged
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflicts by using the import value
+import_resource_conflict_overwrite=Overwrite\ resource\ with\ the\ value\ from\ the\ import\ file
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title listing options for resolving conflicts between resources
+import_resource_conflicts=Resource\ Conflicts
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The path and name of the source file
+# @comment Indication of the source file for the import
+import_source_file=Source\ File\:\ {0}
+
+#
+# @group Menu Items
+#
+# @groupComment These resources represent all of the menu and menu item titles
+
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The menu title covering copying, pasting, deleting of items
+menu_edit=Edit
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy=Copy
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy_trigger=c
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut=Cut
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut_trigger=t
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete=Delete
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete_trigger=d
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste=Paste
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste_trigger=p
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The trigger is a letter from the translation of 'menu_edit' which provides a keyboard shortcut to the menu
+menu_edit_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu title for the opening, saving, etc. documents and exiting the program
+menu_file=File
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export resource bundles in a variety of formats
+menu_file_export=Export\ Resource\ Bundles
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment Ablity to export to ICU Resource Bundle files
+menu_file_export_ICU=ICU\ Files...
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_ICU_trigger=i
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ablity to export to TMX XML files
+menu_file_export_TMX=TMX\ Files...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Ability to export XLIFF XML files
+menu_file_export_XLF=XLIFF\ Files...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_XLF_trigger=x
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export to java files that compile to be ListResourceBundle class extensions
+menu_file_export_java=Compilable\ Java\ Files...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Export ability to properties files minus the metadata
+menu_file_export_properties=Minimal\ Properties\ Files...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_properties_trigger=s
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_trigger=x
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item for import and merging another resource file with the bundle being worked with
+menu_file_import=Merge\ (Import\ into)\ To\ Resource\ Bundle
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import abliity from XML TMX documents
+menu_file_import_TMX=TMX\ Documents...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-06 @creator George Rhoten @modifier Unknown
+# @comment Import ability from XML XLIFF (.xlf) files
+menu_file_import_XLF=XLIFF\ Documents...
+# @translated true @created 2004-07-01 @modified 2004-07-06 @creator George Rhoten @modifier Unknown
+# @comment 
+menu_file_import_XLF_trigger=X
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from java classes (ListResourceBundle)
+menu_file_import_java=ListResourceBundle\ Java\ Classes...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from properties files not generated by RBManager
+menu_file_import_properties=Simple\ Resource\ Bundles...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_properties_trigger=S
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_file_import_trigger=m
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item for creating a new resource bundle
+menu_file_new=New\ Resource\ Bundle...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_file_new_trigger=n
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu Item for opening a resource bundle
+menu_file_open=Open\ Resource\ Bundle...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_file_open_trigger=o
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item for closing the application
+menu_file_quit=Quit
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_file_quit_trigger=q
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item for saving the resource bundle being worked with
+menu_file_save=Save\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Unknown @modifier a
+# @comment 
+menu_file_save_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu Item for saving a resource bundle to a particular location and file name
+menu_file_saveas=Save\ Resource\ Bundle\ As...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_file_saveas_trigger=a
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The trigger is a letter from the translation of 'menu_file' which provides a keyboard shortcut to the menu
+menu_file_trigger=f
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu title for help information and general information about the program
+menu_help=Help
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item which brings up a dialog describing the application
+menu_help_about=About\ Resource\ Bundle\ Manager...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_help_about_trigger=a
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The trigger is a letter from the translation of 'menu_help' which provides a keyboard shortcut to the menu
+menu_help_trigger=h
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu title for options such as creating new resources, groups, and resource files
+menu_options=Options
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu Item for creating a new resource item
+menu_options_addentry=Add\ New\ Entry...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_addentry_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu Item for creating a new resource file for a particular language/country/variant
+menu_options_addfile=Add\ New\ Resource\ File...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_addfile_trigger=f
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item for creating a new resource group
+menu_options_addgroup=Add\ New\ Group...
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_addgroup_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-10-25 @creator Jared @modifier Jared
+# @comment Menu item for editing the user's preferences for the application
+menu_options_preferences=Preferences...
+# @translated true @created 2000-11-10 @modified 2000-10-25 @creator Jared @modifier Jared
+# @comment 
+menu_options_preferences_trigger=p
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Menu item that makes visible the project viewer
+menu_options_project_viewer=Open\ Project\ Viewer
+# @translated true @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_project_viewer_trigger=v
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The trigger is a letter from the translation of 'menu_options' which provides a keyboard shortcut to the menu
+menu_options_trigger=o
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for adding a new resource bundle to the project
+menu_tree_add_project_bundle=Add\ Resource\ Bundle...
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Popup menu item for deleting permanently a resource file
+menu_tree_delete=Delete\ Resource\ File
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Popup menu item for removing a specific resource file from the tree view of the resource bundle
+menu_tree_hide=Hide\ Resource\ File
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Popup menu item for creating a new project
+menu_tree_new_project=New\ Resource\ Bundle\ Project...
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for opening a resource bundle project
+menu_tree_open_project=Open\ Resource\ Bundle\ Project...
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu associated with a resource bundle in the project tree
+menu_tree_remove_project_bundle=Remove\ from\ Project
+# @translated true @created 2001-06-27 @modified 2001-06-27 @creator Unknown @modifier Unknown
+# @comment Popup menu item for saving a specific resource bundle file
+menu_tree_save=Save\ Resource\ File
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for saving changes to the resource project file, not the resource bundles themselves within the project
+menu_tree_save_project=Save\ Resource\ Bundle\ Project\ File...
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu for selecting a resource bundle from the project tree to be edited in the resource bundle tree
+menu_tree_select_project_bundle=Work\ with\ this\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu title for changing the display being seen by the user
+menu_view=View
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment Menu item that takes you directly to the statistics panel for the entire bundle
+menu_view_statistics=View\ Resource\ Bundle\ Statistics
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment 
+menu_view_statistics_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Unknown @modifier Unknown
+# @comment The trigger is a letter from the translation of 'menu_view' which provides a keyboard shortcut to the menu
+menu_view_trigger=v
+
+#
+# @group Project Panel
+#
+# @groupComment Panel associated with Project editing
+
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The name of the resource bundle
+# @comment Label indicator associating a text box containing a translation with the resource bundle the translation comes from
+project_panel_bundle=Resource\ Bundle\:\ {0}
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} Name of the resource bundle
+# @comment Special indicator of the resource item resource bundle when the item is untranslated
+project_panel_bundle_untranslated=Resource\ Bundle\:\ {0}\ (Untranslated)
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text marking the line above or to the left of a resource comment
+project_panel_comment=Base\ Class\ Resource\ Comment\:
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text for a comment when none is found for a resource
+project_panel_comment_none=No\ comment\ supplied
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title shown on the project panel for committing change to one resource only
+project_panel_commit_button=Commit\ Change
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title on the project panel for saving all of the resources displayed. This means multiple resource files get saved.
+project_panel_commit_button_all=Commit\ All\ Resource\ Changes
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Default title shown on the project panel when no particular resource has been selected
+project_panel_default_title=Project\ Resource\ Editing
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Text field marker for the translation of a resource when that resource does not exist for the encoding file it is associated with
+project_panel_item_inherits=<No\ Translation\:\ Resource\ Inherits\ from\ parent>
+# @translated true @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The key of the selected resource
+# @comment Title on the project panel while a resource is selected
+project_panel_title=Project\ Resource\ Editing\:\ {0}
+
+#
+# @group RBReporter
+#
+# @groupComment Translations for the RBReporter application
+
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Button title for selecting file locations for input/output
+reporter_button_choose=Choose...
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Button indicating the report generation should occur immediately
+reporter_button_now=Update\ Now
+# @translated true @created 2000-11-29 @modified 2000-11-29 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for saving the current settings as default
+reporter_button_save_defaults=Save\ the\ Current\ Settings\ as\ Defaults
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Button to activate the reporter
+reporter_button_start=Start
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Button to deactive the reporter
+reporter_button_stop=Stop
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Level of detail: most information available
+reporter_detail_high=High
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Indication of a selection option of the level of detail in reporting
+reporter_detail_level=Detail\ Level\:
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Level of detail: standard
+reporter_detail_normal=Normal
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An output format: HTML
+reporter_format_html=HTML
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An output format type: plain text
+reporter_format_text=Text
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An output format: XML
+reporter_format_xml=XML
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Indication of file location of the resource bundle to report on
+reporter_input_bundle=Resource\ Bundle\:
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Indication that reporting will happen at a speciified time of day. Followed by a time and day option.
+reporter_interval_defined=Report\ at
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Text indication of sequential reporting paused for a defined interval between reporting. Immediately followed by a number and a unit of measure of time
+reporter_interval_sequential=Report\ every
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @{0} Date/Time of last report generation
+# @comment Indication of the time of the last report
+reporter_last_report=Last\ Report\:\ {0}
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @{0} Date/Time of next report
+# @comment Indication of when the next report will be generated
+reporter_next_report=Next\ Report\:\ {0}
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Indication of the output directory into which the reports are placed
+reporter_output_directory=Output\ Directory\:
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An indication of the name of the output file for a particular output format
+reporter_output_file=File\ Name\:
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Panel title for setting interval of reporting
+reporter_panel_interval=Report\ Interval
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Panel title for configurable options of the reporting
+reporter_panel_options=Report\ Options
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Subpanel title for choosing output formats for the reports
+reporter_panel_output_format=Output\ Format
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Panel title for indication of running status of the reporter
+reporter_panel_status=Status
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Short title for selecting a code scan configuration file
+reporter_perform_scan=Code\ Scan\ File
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Quick indication that the reporter is active (perhaps waiting)
+reporter_status_running=Started
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Quick status indication that the reporter is not active
+reporter_status_stopped=Stopped
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment days option
+reporter_time_days=Days
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment every day option
+reporter_time_everyday=Every\ day
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment friday option
+reporter_time_friday=Friday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment hours option
+reporter_time_hours=Hours
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment minutes option
+reporter_time_minutes=Minutes
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment monday option
+reporter_time_monday=Monday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment saturday option
+reporter_time_saturday=Saturday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment sunday option
+reporter_time_sunday=Sunday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment thursday option
+reporter_time_thursday=Thursday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment tuesday option
+reporter_time_tuesday=Tuesday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment wednesday option
+reporter_time_wednesday=Wednesday
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Title of the application
+resource_bundle_reporter=RBReporter
+
+#
+# @group Search and Replace
+#
+# @groupComment Resources found on the search tab pane
+
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment General search title
+search=Search
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for making the search case sensitive or not
+search_case_sensitive=Case\ Sensitive\ Search
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through resource comments
+search_comments=Comments
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text to search on
+search_find=Find\:
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box selection for searching option through resource keys
+search_keys=Resource\ Keys
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text for replacing the found value
+search_replace=Replace\:
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through translation values
+search_values=Translations
+
+#
+# @group Tabs
+#
+# @groupComment GUI Tabs in the main panel
+
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for Tabbed Pane over the tree showing a single resource bundle and its various files
+tab_bundle=Bundle
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Jared @modifier Jared
+# @comment Tab for the display of the various groups in the bundle
+tab_groups=Groups
+# @translated true @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for tab over tree showing a resource bundle project
+tab_project=Project
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for pane allowing for search and replace functions
+tab_search=Search
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Jared @modifier Jared
+# @comment Tab for statistics display for either the Resource Bundle as a whole or particular language files
+tab_statistics=Statistics
+# @translated true @created 2000-11-10 @modified 2000-10-24 @creator Jared @modifier Jared
+# @comment Tab for display of untranslated items in the different language files
+tab_untranslated=Untranslated
+
+#
+# @group Translation File Groups Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Column title for item comments
+languagegroup_column_comment=Comment
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Column title for item's resource key
+languagegroup_column_key=Resource\ Key
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment 
+languagegroup_column_translation=Translation
+
+#
+# @group Translation File Statistics Pane
+#
+# @groupComment Translations for strings in the language file statistics pane
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment A comment given to the file
+languagestats_comment=Comment\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The country being described by the file
+languagestats_country=Country\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The number of resources in the file
+languagestats_item_count=Number\ of\ Resources\ in\ this\ Language\ File\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The language described by the file
+languagestats_language=Language\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The name of a person responsible for the translations in this language file
+languagestats_manager=Resource\ File\ Manager\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The name given to the language file
+languagestats_title=Resource\ Title\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment Number of resources needing translation in the file
+languagestats_translation_count=Number\ of\ Untranslated\ Resource\ Items\ in\ this\ File\:
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The language/region variant described by the file
+languagestats_variant=Variant\:
+
+#
+# @group Translation File Untranslated Items Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The column title for group names of items in the rows
+languageuntrans_column_group=Group
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The key of the item a row
+languageuntrans_column_key=Resource\ Key
+# @translated true @created 2000-11-10 @modified 2000-10-26 @creator Jared @modifier Jared
+# @comment The translated value of an item in a row
+languageuntrans_column_translation=Translation
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment Panel title covering buttons that apply to a selected resource from a table of resources
+languageuntrans_selected_resources_options=Options\ for\ Selected\ Resources
diff --git a/unicodetools/com/ibm/rbm/resources/RBManager_de.properties b/unicodetools/com/ibm/rbm/resources/RBManager_de.properties
new file mode 100644
index 0000000..820b904
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/resources/RBManager_de.properties
@@ -0,0 +1,1213 @@
+# @file          RBM/German
+# @fileEncoding  de
+# @fileLanguage  Deutsch
+# @fileCountry   
+# @fileVariant   
+# @fileManager   Martin Gerlach
+# @fileComment   
+
+
+#
+# @group Base Class Groups Pane
+#
+# @groupComment Translation Items for the Base Class Group tabbed pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basegroup_group_comment=Gruppenkommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basegroup_group_name=Gruppenname\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basegroup_group_options=Resourcengruppen-Optionen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basegroup_item_options=Resourcen-Optionen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_file_group=Resourcendateien
+
+#
+# @group Base Class Statistics Pane
+#
+# @groupComment All translations for strings appearing on the statistics pane for the base class
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_duplicates_count=Anzahl\ mehrfacher\ Resourcenschl\u00FCssel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_file_count=Anzahl\ Resourcendateien\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_group_count=Anzahl\ Resourcengruppen\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_group_group=Resourcengruppen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_item_count=Anzahl\ Resourcen\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+basestats_item_group=Resourcen
+
+#
+# @group Base Class Untranslated Items Pane
+#
+# @groupComment Translations appearing on the Base Class Untranslated Items pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Indication of the file being viewed
+baseuntrans_file=Datei\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Indication of the number of resource items not translated in the file
+baseuntrans_untrans_count=Anzahl\ nicht\ \u00FCbersetzter\ Resourcen\:
+
+#
+# @group Button Names
+#
+# @groupComment The names displayed on the various buttons
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Button for creating a new resource language file
+button_add_file=Resourcendatei\ hinzuf\u00FCgen
+# @translated true @created 2001-01-23 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_file_trigger=h
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Button for creating a new resource group
+button_add_group=Resourcengruppe\ hinzuf\u00FCgen
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_group_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Button for creating a new resource translation item
+button_add_resource=Resource\ hinzuf\u00FCgen
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_resource_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Generic button for canceling actions
+button_cancel=Abbrechen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Generic button for a choice or selection option
+button_choose=Ausw\u00E4hlen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_choose_trigger=A
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Button for generic creation of groups, items, files, etc.
+button_create=Erzeugen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment For creation of a resource group
+button_create_group=Gruppe\ erzeugen
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_group_trigger=g
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for creating an item then continuing creating more items
+button_create_more=Erzeugen\ &\ Weiter
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_more_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Button for creating a resource translation item
+button_create_resource=Resource\ erzeugen
+# @translated true @created 2001-01-23 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_resource_trigger=r
+# @translated true @created 2001-02-02 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Button for removing a group and its contents
+button_delete_group=Gruppe\ l\u00F6schen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Button for permanently removing a resource from the bundle
+button_delete_resource=Resource\ l\u00F6schen
+# @translated true @created 2001-01-23 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_delete_resource_trigger=l
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Generic edit button
+button_edit=Bearbeiten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Button for editing group name and comment
+button_edit_group=Gruppe\ bearbeiten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Martin Gerlach
+# @comment Button for editing resource information, including key and translation
+button_edit_resource=Resource\ bearbeiten
+# @translated true @created 2001-01-23 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_edit_resource_trigger=b
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for initiating an import of resources from an alternate source
+button_import=Importieren
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_import_trigger=i
+# @translated true @created 2001-01-23 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button allows a selected resource to be marked as translated without further editing
+button_mark_translated=Resource\ als\ \u00FCbersetzt\ markieren
+# @translated true @created 2001-01-23 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_mark_translated_trigger=m
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for adding the current resource bundle in the main application to the project
+button_project_add=Add\ Current\ Bundle
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_add_trigger=a
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for closing the project window
+button_project_close=Close\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_close_trigger=c
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for creating a new resource bundle project
+button_project_new=New\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_new_trigger=n
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for opening a project file
+button_project_open=Open\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_open_trigger=o
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for removing the currently selected resource bundle from the project
+button_project_remove=Remove\ Selection
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_remove_trigger=r
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for causing the selected resource bundle to be the one being edited in the main application
+button_project_select=Edit\ Selected
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_select_trigger=e
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing a complete search
+button_search_find_all=Alle\ finden
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_find_all_trigger=a
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing complete search and replace
+button_search_replace_all=Alle\ ersetzen
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_replace_all_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Generic button for updating information
+button_update=\u00C4ndern
+# @translated true @created 2001-01-23 @modified 2001-02-12 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_update_trigger=n
+
+#
+# @group Dialogs
+#
+# @groupComment Translations associated with the applications various dialog boxes
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Indication of wether or not a new file will be populated from the elements in the base class
+dialog_checkbox_copy_elements=Eintr\u00E4ge\ aus\ der\ Basisklasse\ in\ die\ neue\ Datei\ \u00FCbernehmen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Indicator of wether an item is translated or not
+dialog_checkbox_translated=\u00DCbersetzt
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_comment=Kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_country=Land
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_created=Erzeugt\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_creator=Erzeugt\ durch\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @{1} The date
+# @{0} The name of the person involved
+# @comment The date and person associated with a creation or modification of an item
+dialog_date_person={0}\ am\ {1}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_default_comment=Default-Kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_default_translation=Default-\u00DCbersetzung\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_delete_file=Resourcendatei\ l\u00F6schen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_delete_group=Resourcengruppe\ l\u00F6schen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_delete_item=Resource\ l\u00F6schen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Warning displayed when a user asks for a deletion of a file. Prompts for 'Yes' or 'No'
+dialog_delete_warning=Warnung\!\ Diese\ Operation\ kann\ nicht\ rueckgaengig\ gemacht\nwerden.\ Sind\ Sie\ sichre,\ dass\ sie\ fortfahren\ moechten?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_encoding=Encoding\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_file_comment=Resourcendateikommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_file_filter_description=Basisklassen-Resourcendateien\ (.properties)
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Description of File Filter for RBReporter XML scan configuration files
+dialog_file_filter_description_scan=XML\ RBReporter\ Scan\ Dateien
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_file_info=Dateiinformationen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_file_manager=Name\ des\ Resourcenmanagers\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_file_title=Titel\ der\ Resourcendatei\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_group=Gruppenname\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_group_comment=Gruppenkommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_key=Eintragsschl\u00FCssel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_language=Sprache
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_lookups=Parameter\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_modified=Zuletzt\ ge\u00E4ndert\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_modifier=Zuletzt\ ge\u00E4ndert\ durch\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The name of a language, country, or variant of a language file
+dialog_name=Name\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Prompts the user to enter a name for the resource bundle, before creating that bundle
+dialog_new_baseclass=Bitte\ geben\ Sie\ einen\ Namen\ f\u00FCr\ die\ Basisklasse\ des\ neuen\ Resource-Bundles\ ein.
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Dialog popup window text prompting the user for the name of a resource bundle project
+dialog_new_project=Please\ enter\ a\ title\ for\ your\ new\ Resource\ Bundle\ Project.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment A description of the files making it through the filter upon opening a resource bundle
+dialog_open_file_filter=Basisklassen-Resourcendateien
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment This is a section heading for setting the locale
+dialog_preferences_locale=Locale
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Locales currently defined in the properties files for the application
+dialog_preferences_locale_defined=Definiert\ f\u00FCr\ RBManager\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared Jackson @modifier Martin Gerlach
+# @comment 
+dialog_preferences_locale_iso=ISO-Standards\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Locales that are supported by the host Java Virtual Machine
+dialog_preferences_locale_machine=Von\ diesem\ System\ unterst\u00FCtzt\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared Jackson @modifier Martin Gerlach
+# @comment 
+dialog_preferences_locale_warning=ANMERKUNG\:\ \u00C4nderungen\ der\ Locale\ wirken\ sich\ erst\ beim\ n\u00E4chsten\ Start\ der\ Anwendung\ aus.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_preferences_lookandfeel=Look\ And\ Feel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_preferences_username=Benutzername\:
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Descriptor that goes into GUI file chooser
+dialog_project_file_filter_description=RBManager\ Project\ Files
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment File Filter description for resource bundle project files
+dialog_project_filter_description=Resource\ Bundle\ Projects
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment An indication that no project is open, placed in the title of the dialog where the project name would normally go
+dialog_project_none_selected=No\ Active\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @{0} The name of the project
+# @comment Title for the window showing all the resource bundles in a project
+dialog_project_title=Resource\ Bundle\ Project\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Prompts the user if they would like to save changes before exiting
+dialog_quit_save=M\u00F6chten\ Sie\ Ihre\ \u00C4nderungen\ vor\ beenden\ von\ RBManager\ speichern?
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @comment A generic propmpt to ask the user if they wish to save changes
+dialog_save=M\u00F6chten\ Sie\ Ihre\ \u00C4nderungen\ speichern?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_search_options=Suchoptionen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_search_param=Suche\ nach\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The title of the about dialog box
+dialog_title_about_rbmanager=\u00DCber\ RBManager
+# @translated true @created 2001-01-22 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for deletion of an entire resource group
+dialog_title_delete_group=Resourcengruppen\ l\u00F6schen
+# @translated true @created 2001-01-22 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title when prompting to delete a resource
+dialog_title_delete_item=Resource\ l\u00F6schen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_edit_group=Resourcengruppe\ bearbeiten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_edit_item=Resource\ bearbeiten
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment 
+dialog_title_error=Error
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_error_creating_bundle=Fehler\ beim\ erzeugen\ des\ Resource-Bundles
+# @translated true @created 2001-01-22 @modified 2001-06-29 @creator Jared Jackson @modifier Unknown
+# @comment Dialog title when opening a resource bundle not created by RBManager
+dialog_title_error_not_rbmanager_format=Fehler\:\ Resource\ Bundle\ ist\ nicht\ lesbar
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Title on a warning dialog that I/O malfunctioned opening a file
+dialog_title_error_opening_file=Fehler\ beim\ Oeffnen\ der\ Datei
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Dialog title for a dialog box for entering special parameters needed to export a resource bundle to java class code
+dialog_title_export_java_options=Export-Parameter\:\ Java-Klasse
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for a dialog with a progress bar governing import status
+dialog_title_import_progress=Importsfortschritt
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Title for creating new bundle
+dialog_title_new_bundle=Neues\ Resource-Bundle\ erzeugen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Title for creating a new resource file
+dialog_title_new_file=Neue\ Resourcendatei\ erzeugen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Title for creating a new resource group
+dialog_title_new_group=Neue\ Resourcengruppe\ erzeugen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Title for creating resource
+dialog_title_new_item=Neue\ Resource\ erzeugen
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Title of the dialog box showing when creating a new project
+dialog_title_new_project=New\ Resource\ Bundle\ Project
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_preferences=Einstellungen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Title for confirming exit from application
+dialog_title_quit=RBManager\ beenden
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_search=Suche
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_title_user_name=Benutzernamen\ eingeben
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_translation=\u00DCbersetztung\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_user_name=Bitte\ geben\ Sie\ Ihren\ Namen\ ein.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_variant=Variante
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_warning_delete_group=Das\ L\u00F6schen\ dieser\ Gruppe\ bewirkt\ die\ permanente\ L\u00F6schung\ aller\ Resourcen\ dieser\ Gruppe.\ M\u00F6chten\ Sie\ die\ Gruppe\ dennoch\ l\u00F6schen?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+dialog_warning_delete_item=M\u00F6chten\ Sie\ diese\ Resource\ wirklich\ l\u00F6schen?
+
+#
+# @group Error Messages
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error=Fehler
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when trying to add a resource bundle to a project.
+error_adding_project_bundle=An\ error\ occurred\ trying\ to\ add\ the\ Resource\ Bundle\ you\ selected.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_baseclass_whitespace=Resourcennamen\ d\u00FCrfen\ keine\ White-Spaces\ enthalten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_bundle_not_created=Es\ wurde\ kein\ Resource-Bundle\ erzeugt.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_create_file=Beim\ Erzeugen\ der\ Resourcendatei\ ist\ ein\ Problem\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_create_group=Beim\ Erzeugen\ der\ Resourcengruppe\ ist\ ein\ Problem\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_create_item=Beim\ Erzeugen\ des\ Eintrags\ ist\ ein\ Problem\ aufgetreten.
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when creating a project
+error_creating_project=An\ error\ was\ encountered\ trying\ to\ create\ a\ Resource\ Bundle\ Project.
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Unknown
+# @{0} The message from an IOException that is thrown
+# @comment Error message when trying to delete a file
+error_deleting=Beim\ l\u00F6schen\ der\ Datei\ {0}\ ist\ ein\ Fehler\ aufgetreten
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment An error that occurs when an attempt is made to delete a file, but the virtual machine can not do so
+error_deletion_not_possible=RBManager\ konnte\ die\ Datei\ nicht\ loeschen.\ Zugang\ verweigert.
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment General error message for exporting resource bundles
+error_export=Ein\ Fehler\ ist\ beim\ Exportieren\ des\ Resourcenb\u00FCndels\ aufgetreten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_internal=Interner\ Fehler
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_modify_file=Beim\ \u00C4ndern\ der\ Resourcendatei\ ist\ ein\ Problem\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_modify_group=Beim\ \u00C4ndern\ der\ Resourcengruppe\ ist\ ein\ Problem\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_modify_item=Beim\ \u00C4ndern\ des\ Eintrags\ ist\ ein\ Problem\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_no_bundle_for_file=Um\ eine\ Resourcendatei\ zu\ erzeugen,\ m\u00FCssen\ Sie\ zun\u00E4chst\ ein\ Resource-Bundle\ erzeugen\ oder\ \u00F6ffnen.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_no_bundle_for_group=Um\ eine\ Resourcengruppe\ zu\ erzeugen,\ m\u00FCssen\ Sie\ zun\u00E4chst\ ein\ Resource-Bundle\ erzeugen\ oder\ \u00F6ffnen.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Error message displayed when the user tries to create a resource, without an open resource bundle
+error_no_bundle_for_item=Um\ eine\ Resource\ zu\ erzeugen,\ m\u00FCssen\ Sie\ zun\u00E4chst\ ein\ Resource-Bundle\ erzeugen\ oder\ \u00F6ffnen.
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+error_no_key_replace=Ersetzen\ f\u00FCr\ Resourcenschl\u00FCssel\ ist\ nicht\ erlaubt.\ Alle\ anderen\ Ersetzungen\ werden\ durchgef\u00FChrt.
+# @translated true @created 2001-01-22 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Indication that RBManager can not read the file as created by RBManager
+error_not_rbmanager_format=Die\ ausgew\u00E4hlte\ Resource\ wurde\ nicht\ vom\ RBManager\ erzeugt\ oder\ ist\ besch\u00E4digt.
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Unknown
+# @{0} The name of the file that would not open
+# @comment Error message occuring on an I/O error trying to open a file
+error_opening_file=Konnte\ die\ Datei\ {0}\ nicht\ \u00F6ffnen
+# @translated true @created 2001-01-15 @modified 2001-06-29 @creator Jared Jackson @modifier Unknown
+# @comment Error message displayed when RBManager encounters an error writing preferences to the file system
+error_preferences_save=Ein\ Fehler\ ist\ beim\ Speichern\ der\ Einstellungen\ aufgetreten.
+# @translated true @created 2000-11-10 @modified 2001-06-29 @creator Jared Jackson @modifier Unknown
+# @{0} The error message generated
+# @comment A message presented to the user when an error occurs in saving the resource bundle
+error_saving=Beim\ Speichern\ des\ Resource\ Bundles\ ist\ ein\ Fehler\ aufgetreten\:\ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when saving a project
+error_saving_project=An\ error\ was\ encountered\ trying\ to\ save\ the\ Resource\ Bundle\ Project.
+# @translated true @created 2001-01-22 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Suggest trying to import the resource bundle instead of opening it.
+error_suggest_import_properties=Versuchen\ Sie\ alternativ\ das\ Resourcenb\u00FCndel\ zu\ importieren.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_try_again_file=Bitte\ w\u00E4hlen\ Sie\ andere\ Encoding-Werte.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_try_again_group=Bitte\ w\u00E4hlen\ Sie\ einen\ anderen\ Gruppennamen.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+error_try_again_item=Bitte\ w\u00E4hlen\ Sie\ einen\ anderen\ Eintragsschl\u00FCssel.
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Value inserted into table cells when an error has occured
+table_cell_error=*Fehler*
+
+#
+# @group Export
+#
+# @groupComment Resources dealing with export options
+
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Option for the parameter for created a protected class
+export_java_class_protected='protected\ class'\ erstellen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Option for parameter setting the created class as public
+export_java_class_public='public\ class'\ erstellen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Option for parameter for creating protected methods in the java class
+export_java_methods_protected='protected\ methods'\ erstellen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Option for parameter for creating public methods
+export_java_methods_public='public\ methods'\ erstellen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Title of a check box followed by a text field for specifying whether or not to use a package in the generated java class and what the package should be called
+export_java_package=Geben\ sie\ ein\ 'package'\ an\:
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Text placed in a label at the top of the dialog box for specifying parameters concerning the export of resource bundles into a java class
+export_java_title=Bitte\ geben\ Sie\ die\ folgenden\ Parameter\ fuer\ die\ Java-Klasse\ an\:
+
+#
+# @group General
+#
+# @groupComment Some items that are common accross groups
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The file or class composed of the default translations for the bundle
+baseclass=Basisklasse
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment This is the legal copyright notice
+copyright=(C)\ Copyright\ IBM\ Corp.\ 2000-2004\ -\ Alle\ Rechte\ vorbehalten
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Gerneral use for file directories
+directory=Verzeichnis
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+groups=Gruppen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The name of the image file in the 'Images' directory that represents the logo seen at the top of the application
+logo_filename=TitleLogo_transparent.gif
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title when viewing a resource bundle in the project view when there is no active project
+no_project=Default\ Project
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title defaulted to when no resource bundle or project has been opened by the user
+no_project_bundle=No\ Project\ or\ Resource\ Bundle\ Open
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The top tree node title, when no resource bundle has been opened or created
+no_resource_bundle=Kein\ Resource-Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+none=Kein(e)
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Project table column name - Location of a resource bundle
+project_table_file_location=File\ Location
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Table Column Name for resource bundle name
+project_table_resource_bundle=Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment An abbreviated name of this application
+rbmanager=RBManager
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment 
+rbmanager_contact=Autor\:\ Jared\ Jackson\ &\ George\ Rhoten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The full name of this application
+resource_bundle_manager=Resource\ Bundle\ Manager
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+table_column_error=Tabellenspaltenfehler
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @{0} Country ISO code
+# @comment Node title, under which all files of the same country, language reside
+tree_country_node=L\u00E4nder-Code\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @{0} Language Encoding
+# @comment The node below which languages of one encoding are grouped
+tree_language_node=Sprachen-Code\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+tree_variant_node=Varianten\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The name assigned as a user name when the user name is not specified
+unknown_user=Unbekannt
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+untitled=Unbenannt
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+untranslated_items=Nicht\ \u00FCbersetzte\ Resourcen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @{0} The version number
+# @comment The version of this application
+version=Version\ {0}
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment general use Warning
+warning=Warnung
+
+#
+# @group Import
+#
+# @groupComment Resources dealing with import options
+
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for choosing TMX files
+import_TMX_file_description=TMX\ Dateien
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from TMX XML files
+import_TMX_title=TMX\ Datei\ im\ portieren
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Title for the file chooser for choosing XLIFF (.xlf) files
+import_XLF_file_description=XLIFF\ Dateien
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Dialog title for importing from XLIFF (.xlf) files
+import_XLF_title=XLIFF\ Datei\ im\ portieren
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflcits on a case by case basis
+import_conflict_prompt=Bei\ jedem\ Konfilkt\ nachfragen
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option specifying whether a group found in the target but not found in the active resource bundle should be created in the resource bundle or not
+import_default_group_creation=Gruppen\ erzeugen,\ die\ nicht\ im\ aktuellen\ B\u00FCndel\ enthalten\ sind
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Optoin for marking the incoming values as translated or not
+import_default_translated=Als\ \u00FCbersetzt\ markieren
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for options specifying the meta data to be applied to individual resources if it is not available in the import source
+import_default_values=Voreinstellungen
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The locale encoding of the file in question
+# @comment Instructions for prompting the user to resolve a conflict when importing resources from a locale that does not exist in the current resource bundle
+import_file_conflict_choose=Die\ Codierung\ {0}\ existiert\ nicht.\ W\u00E4hlen\ Sie\ eine\ Option,\ um\ das\ Problem\ zu\ l\u00F6sen,\ oder\ Cancel\ um\ den\ Konflikt\ zu\ ignorieren.
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which a new file is generated, but not populated
+import_file_conflict_generate_empty=Eine\ neue,\ leere\ Resourcendatei\ erzeugen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving file conflicts in which a new file is generated and populated with all the existing resources
+import_file_conflict_generate_populate=Eine\ neue\ Resourcendatei\ erzeugen\ und\ mit\ den\ Resourcen\ der\ Basisklasse\ f\u00FCllen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which the conflicts are ignored
+import_file_conflict_ignore=Alle\ Resourcen\ aus\ Lokalgruppen,\ die\ nicht\ in\ im\ aktuellen\ Resourcenb\u00FCndel\ existieren,\ \u00FCberspringen\ und\ ignorieren
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for section listing options for what to do when an imported value exists in a locale not defined in the existing resource bundle
+import_file_conflicts=Resourcendatei\ nicht\ gefunden
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Selection of the default group. A list of groups will appear to the right of this resource in a ComboBox
+import_insert_group=Einf\u00FCgen\ in\ Gruppe\:
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for the types of files accepted for this import type
+import_java_file_description=Java\ ListResourceBundle\ Basisklassen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for import from java classes
+import_java_title=Java\ ListResourceBundle\ Klassenimport
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title indicating section containing user options
+import_options=Importoptionen
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for selection of resource bundles stored in .properties files
+import_properties_file_description=Basisklassen\ des\ Resourcenb\u00FCndels
+# @translated true @created 2001-01-26 @modified 2001-06-29 @creator Jared Jackson @modifier Unknown
+# @comment Dialog title for importing from properties files (created or not by RBManager)
+import_properties_title=Property-Dateien\ importieren
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @{1} Encoding of the resource value with a conflict
+# @{0} The key value of the resource in conflict
+# @comment This is a warning and instruction for when a resource conflict occurs during an import
+import_resource_conflict_choose=Der\ Schl\u00FCssel\ {0}\ existiert\ bereits\ im\ Resourcenb\u00FCndel\ {1}.\ W\u00E4hlen\ Sie\ eine\ Option\ aus,\ um\ diesen\ Konflikt\ zu\ l\u00F6sen\:
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value associated with the resource item
+# @comment An indication of the value of the resource according to the import file
+import_resource_conflict_choose_source=\u00DCbersetzung\ importieren\:\ {0}
+# @translated true @created 2001-02-02 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value of the resource item
+# @comment An indication of the translation value held by the active resource bundle during a translation resource conflict
+import_resource_conflict_choose_target=\u00DCberstzung\ des\ Resourcenb\u00FCndels\:\ {0}
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving resource conflicts by ignoring import value
+import_resource_conflict_ignore=Konflikt\ ignorieren\ und\ Originalresource\ beibehalten
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflicts by using the import value
+import_resource_conflict_overwrite=Resource\ mit\ dem\ Wert\ aus\ der\ Importdatei\ \u00FCberschreiben
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title listing options for resolving conflicts between resources
+import_resource_conflicts=Resourcenkonflikte
+# @translated true @created 2001-01-26 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The path and name of the source file
+# @comment Indication of the source file for the import
+import_source_file=Quelldatei\:\ {0}
+
+#
+# @group Menu Items
+#
+# @groupComment These resources represent all of the menu and menu item titles
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The menu title covering copying, pasting, deleting of items
+menu_edit=Bearbeiten
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy=Kopieren
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy_trigger=k
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut=Ausschneiden
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut_trigger=a
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete=L\u00F6schen
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete_trigger=l
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste=Einf\u00FCgen
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The trigger is a letter from the translation of 'menu_edit' which provides a keyboard shortcut to the menu
+menu_edit_trigger=b
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu title for the opening, saving, etc. documents and exiting the program
+menu_file=Datei
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export resource bundles in a variety of formats
+menu_file_export=Resourcenb\u00FCndel\ exportieren
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment Ablity to export to ICU Resource Bundle files
+menu_file_export_ICU=ICU\ Dokumente...
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_ICU_trigger=i
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ablity to export to TMX XML files
+menu_file_export_TMX=TMX\ Dateien...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment x
+menu_file_export_XLF=XLIFF\ Dateien...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_XLF_trigger=x
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export to java files that compile to be ListResourceBundle class extensions
+menu_file_export_java=Kompilierbare\ Java\ Dateien...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Export ability to properties files minus the metadata
+menu_file_export_properties=Minimale\ Eigenschaftsdateien
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_properties_trigger=e
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_trigger=x
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item for import and merging another resource file with the bundle being worked with
+menu_file_import=Resource-Bundle\ aus\ Datei\ importieren...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import abliity from XML TMX documents
+menu_file_import_TMX=TMX\ Dokumente...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Import ability from XML XLIFF (.xlf) files
+menu_file_import_XLF=XLIFF\ Dokumente...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment X
+menu_file_import_XLF_trigger=x
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from java classes (ListResourceBundle)
+menu_file_import_java=ListResourceBundle\ Java\ Klassen...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from properties files not generated by RBManager
+menu_file_import_properties=Einfache\ Resourcenb\u00FCndel...
+# @translated true @created 2001-01-15 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_properties_trigger=S
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_import_trigger=m
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item for creating a new resource bundle
+menu_file_new=Neu
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_new_trigger=n
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu Item for opening a resource bundle
+menu_file_open=\u00D6ffnen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_open_trigger=f
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item for closing the application
+menu_file_quit=Beenden
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_quit_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item for saving the resource bundle being worked with
+menu_file_save=Speichern
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_save_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu Item for saving a resource bundle to a particular location and file name
+menu_file_saveas=Speichern\ unter...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_file_saveas_trigger=u
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The trigger is a letter from the translation of 'menu_file' which provides a keyboard shortcut to the menu
+menu_file_trigger=d
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu title for help information and general information about the program
+menu_help=Hilfe
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item which brings up a dialog describing the application
+menu_help_about=\u00DCber\ Resource\ Bundle\ Manager
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_help_about_trigger=b
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The trigger is a letter from the translation of 'menu_help' which provides a keyboard shortcut to the menu
+menu_help_trigger=h
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu title for options such as creating new resources, groups, and resource files
+menu_options=Optionen
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu Item for creating a new resource item
+menu_options_addentry=Neuen\ Eintrag\ hinzuf\u00FCgen...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_options_addentry_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu Item for creating a new resource file for a particular language/country/variant
+menu_options_addfile=Neue\ Resourcendatei\ hinzuf\u00FCgen...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_options_addfile_trigger=d
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item for creating a new resource group
+menu_options_addgroup=Neue\ Resourcengruppe\ hinzuf\u00FCgen...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_options_addgroup_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Menu item for editing the user's preferences for the application
+menu_options_preferences=Einstellungen...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+menu_options_preferences_trigger=s
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Menu item that makes visible the project viewer
+menu_options_project_viewer=Open\ Project\ Viewer
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_project_viewer_trigger=v
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The trigger is a letter from the translation of 'menu_options' which provides a keyboard shortcut to the menu
+menu_options_trigger=o
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for adding a new resource bundle to the project
+menu_tree_add_project_bundle=Add\ Resource\ Bundle...
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Unknown
+# @comment Popup menu item for deleting permanently a resource file
+menu_tree_delete=Resourcendatei\ l\u00F6schen
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Popup menu item for removing a specific resource file from the tree view of the resource bundle
+menu_tree_hide=Resourcendatei\ nicht\ mehr\ anzeigen
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Popup menu item for creating a new project
+menu_tree_new_project=New\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for opening a resource bundle project
+menu_tree_open_project=Open\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu associated with a resource bundle in the project tree
+menu_tree_remove_project_bundle=Remove\ from\ Project
+# @translated true @created 2001-06-27 @modified 2001-06-29 @creator Unknown @modifier Martin
+# @comment Popup menu item for saving a specific resource bundle file
+menu_tree_save=Resourcendatei\ speichern
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for saving changes to the resource project file, not the resource bundles themselves within the project
+menu_tree_save_project=Save\ Resource\ Bundle\ Project\ File...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu for selecting a resource bundle from the project tree to be edited in the resource bundle tree
+menu_tree_select_project_bundle=Work\ with\ this\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu title for changing the display being seen by the user
+menu_view=Ansicht
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment Menu item that takes you directly to the statistics panel for the entire bundle
+menu_view_statistics=Resource\ Bundle\ Statistik
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment 
+menu_view_statistics_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Martin Gerlach
+# @comment The trigger is a letter from the translation of 'menu_view' which provides a keyboard shortcut to the menu
+menu_view_trigger=a
+
+#
+# @group Project Panel
+#
+# @groupComment Panel associated with Project editing
+
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The name of the resource bundle
+# @comment Label indicator associating a text box containing a translation with the resource bundle the translation comes from
+project_panel_bundle=Resource\ Bundle\:\ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} Name of the resource bundle
+# @comment Special indicator of the resource item resource bundle when the item is untranslated
+project_panel_bundle_untranslated=Resource\ Bundle\:\ {0}\ (Untranslated)
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text marking the line above or to the left of a resource comment
+project_panel_comment=Base\ Class\ Resource\ Comment\:
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text for a comment when none is found for a resource
+project_panel_comment_none=No\ comment\ supplied
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title shown on the project panel for committing change to one resource only
+project_panel_commit_button=Commit\ Change
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title on the project panel for saving all of the resources displayed. This means multiple resource files get saved.
+project_panel_commit_button_all=Commit\ All\ Resource\ Changes
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Default title shown on the project panel when no particular resource has been selected
+project_panel_default_title=Project\ Resource\ Editing
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Text field marker for the translation of a resource when that resource does not exist for the encoding file it is associated with
+project_panel_item_inherits=<No\ Translation\:\ Resource\ Inherits\ from\ parent>
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The key of the selected resource
+# @comment Title on the project panel while a resource is selected
+project_panel_title=Project\ Resource\ Editing\:\ {0}
+
+#
+# @group RBReporter
+#
+# @groupComment Translations for the RBReporter application
+
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Button title for selecting file locations for input/output
+reporter_button_choose=Ausw\u00E4hlen...
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Button indicating the report generation should occur immediately
+reporter_button_now=Erzeugen
+# @translated true @created 2000-11-29 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for saving the current settings as default
+reporter_button_save_defaults=Momentane\ Einstellungen\ als\ Voreinstellungen\ speichern
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Button to activate the reporter
+reporter_button_start=Start
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Button to deactive the reporter
+reporter_button_stop=Stop
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: most information available
+reporter_detail_high=Hoch
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Indication of a selection option of the level of detail in reporting
+reporter_detail_level=Detailstufe\:
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: standard
+reporter_detail_normal=Normal
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment An output format: HTML
+reporter_format_html=HTML
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment An output format type: plain text
+reporter_format_text=Text
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment An output format: XML
+reporter_format_xml=XML
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Indication of file location of the resource bundle to report on
+reporter_input_bundle=Resourcenb\u00FCndel\:
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Indication that reporting will happen at a speciified time of day. Followed by a time and day option.
+reporter_interval_defined=Berichten\ um
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Text indication of sequential reporting paused for a defined interval between reporting. Immediately followed by a number and a unit of measure of time
+reporter_interval_sequential=Berichten\ alle
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of last report generation
+# @comment Indication of the time of the last report
+reporter_last_report=Letzter\ Bericht\:\ {0}
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of next report
+# @comment Indication of when the next report will be generated
+reporter_next_report=N\u00E4chster\ Bericht\:\ {0}
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Indication of the output directory into which the reports are placed
+reporter_output_directory=Ausgabeverzeichnis\:
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment An indication of the name of the output file for a particular output format
+reporter_output_file=Dateiname\:
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Panel title for setting interval of reporting
+reporter_panel_interval=Berichtsintervall
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Panel title for configurable options of the reporting
+reporter_panel_options=Berichtsoptionen
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Subpanel title for choosing output formats for the reports
+reporter_panel_output_format=Ausgabeformat
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Panel title for indication of running status of the reporter
+reporter_panel_status=Status
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Short title for selecting a code scan configuration file
+reporter_perform_scan=Code\ Scan\ Datei
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment Quick indication that the reporter is active (perhaps waiting)
+reporter_status_running=Gestartet
+# @translated true @created 2000-11-17 @modified 2001-06-29 @creator Jared @modifier Unknown
+# @comment Quick status indication that the reporter is not active
+reporter_status_stopped=Gestoppt
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment days option
+reporter_time_days=Tage
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment every day option
+reporter_time_everyday=Jeden\ Tag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment friday option
+reporter_time_friday=Freitag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment hours option
+reporter_time_hours=Stunden
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment minutes option
+reporter_time_minutes=Minuten
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment monday option
+reporter_time_monday=Montag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment saturday option
+reporter_time_saturday=Sonnabend
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment sunday option
+reporter_time_sunday=Sonntag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment thursday option
+reporter_time_thursday=Donnerstag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment tuesday option
+reporter_time_tuesday=Dienstag
+# @translated true @created 2000-11-17 @modified 2001-02-09 @creator Jared @modifier Jared Jackson
+# @comment wednesday option
+reporter_time_wednesday=Mittwoch
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment Title of the application
+resource_bundle_reporter=RBReporter
+
+#
+# @group Search and Replace
+#
+# @groupComment Resources found on the search tab pane
+
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment General search title
+search=Suche
+# @translated true @created 2001-02-07 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for making the search case sensitive or not
+search_case_sensitive=Gro\u00DF-/Kleinschreibung\ beachten
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through resource comments
+search_comments=Kommentare
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text to search on
+search_find=Suchen\:
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box selection for searching option through resource keys
+search_keys=Schl\u00FCssel
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text for replacing the found value
+search_replace=Ersetzen\:
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through translation values
+search_values=\u00DCbersetzungen
+
+#
+# @group Tabs
+#
+# @groupComment GUI Tabs in the main panel
+
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for Tabbed Pane over the tree showing a single resource bundle and its various files
+tab_bundle=Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Tab for the display of the various groups in the bundle
+tab_groups=Gruppen
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for tab over tree showing a resource bundle project
+tab_project=Project
+# @translated true @created 2001-02-06 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for pane allowing for search and replace functions
+tab_search=Suche
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Tab for statistics display for either the Resource Bundle as a whole or particular language files
+tab_statistics=Statistik
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Tab for display of untranslated items in the different language files
+tab_untranslated=Nicht\ \u00FCbersetzt
+
+#
+# @group Translation File Groups Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Column title for item comments
+languagegroup_column_comment=Kommentar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Column title for item's resource key
+languagegroup_column_key=Resource-Schl\u00FCssel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment 
+languagegroup_column_translation=\u00DCbersetzung
+
+#
+# @group Translation File Statistics Pane
+#
+# @groupComment Translations for strings in the language file statistics pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment A comment given to the file
+languagestats_comment=Kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The country being described by the file
+languagestats_country=Land\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The number of resources in the file
+languagestats_item_count=Anzahl\ Resourcen\ in\ der\ Resourcendatei\ f\u00FCr\ diese\ Sprache\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The language described by the file
+languagestats_language=Sprache\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The name of a person responsible for the translations in this language file
+languagestats_manager=Resourcenmanager\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The name given to the language file
+languagestats_title=Titel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment Number of resources needing translation in the file
+languagestats_translation_count=Anzahl\ nicht\ \u00FCbersetzter\ Resourcen\ in\ dieser\ Datei\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The language/region variant described by the file
+languagestats_variant=Variante\:
+
+#
+# @group Translation File Untranslated Items Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The column title for group names of items in the rows
+languageuntrans_column_group=Gruppe
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The key of the item a row
+languageuntrans_column_key=Resource-Schl\u00FCssel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Martin Gerlach
+# @comment The translated value of an item in a row
+languageuntrans_column_translation=\u00DCbersetzung
+# @translated true @created 2001-01-23 @modified 2001-02-09 @creator Jared Jackson @modifier Jared Jackson
+# @comment Panel title covering buttons that apply to a selected resource from a table of resources
+languageuntrans_selected_resources_options=Optionen\ f\u00FCr\ die\ ausgew\u00E4hlten\ Resourcen
diff --git a/unicodetools/com/ibm/rbm/resources/RBManager_fi.properties b/unicodetools/com/ibm/rbm/resources/RBManager_fi.properties
new file mode 100644
index 0000000..9af3445
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/resources/RBManager_fi.properties
@@ -0,0 +1,1216 @@
+# @file          RBManager
+# @fileEncoding  fi
+# @fileLanguage  Finnish
+# @fileCountry   
+# @fileVariant   
+# @fileManager   Jussi Myllymäki
+# @fileComment   This is the Finnish translation of the RBManager GUI.
+
+
+#
+# @group Base Class Groups Pane
+#
+# @groupComment Translation Items for the Base Class Group tabbed pane
+
+# @translated true @created 2001-12-17 @modified 2001-06-27 @creator Jared @modifier Unknown
+# @comment 
+basegroup_group_comment=Resurssiryhm\u00E4n\ kommentti
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basegroup_group_name=Resurssiryhm\u00E4n\ nimi\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basegroup_group_options=Resurssiryhm\u00E4n\ toiminnot
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basegroup_item_options=Resurssin\ toiminnot
+
+#
+# @group Base Class Statistics Pane
+#
+# @groupComment All translations for strings appearing on the statistics pane for the base class
+
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_duplicates_count=Resurssin\ kopioiden\ m\u00E4\u00E4r\u00E4\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_file_count=Resurssitiedostojen\ m\u00E4\u00E4r\u00E4\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_group_count=Resurssiryhmien\ m\u00E4\u00E4r\u00E4\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_group_group=Resurssiryhm\u00E4t
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_item_count=Resurssien\ m\u00E4\u00E4r\u00E4\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_item_group=Resurssit
+
+#
+# @group Base Class Untranslated Items Pane
+#
+# @groupComment Translations appearing on the Base Class Untranslated Items pane
+
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Indication of the file being viewed
+baseuntrans_file=Tiedosto\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Indication of the number of resource items not translated in the file
+baseuntrans_untrans_count=K\u00E4\u00E4nt\u00E4m\u00E4tt\u00F6mien\ resurssien\ m\u00E4\u00E4r\u00E4\:
+
+#
+# @group Button Names
+#
+# @groupComment The names displayed on the various buttons
+
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+basestats_file_group=Resurssitiedostot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Button for creating a new resource language file
+button_add_file=Lis\u00E4\u00E4\ uusi\ resurssitiedosto
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_file_trigger=t
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Button for creating a new resource group
+button_add_group=Lis\u00E4\u00E4\ uusi\ resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_group_trigger=y
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Button for creating a new resource translation item
+button_add_resource=Lis\u00E4\u00E4\ uusi\ resurssi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_resource_trigger=r
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Generic button for canceling actions
+button_cancel=Peruuta
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Generic button for a choice or selection option
+button_choose=Valitse
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_choose_trigger=v
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Button for generic creation of groups, items, files, etc.
+button_create=Lis\u00E4\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment For creation of a resource group
+button_create_group=Luo\ uusi\ ryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_group_trigger=r
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for creating an item then continuing creating more items
+button_create_more=Luo\ &\ Jatka
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_more_trigger=l
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Button for creating a resource translation item
+button_create_resource=Luo\ uusi\ resurssi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_resource_trigger=r
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_trigger=l
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Button for removing a group and its contents
+button_delete_group=Poista\ resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Button for permanently removing a resource from the bundle
+button_delete_resource=Poista\ resurssi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_delete_resource_trigger=p
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Generic edit button
+button_edit=Muuta
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Button for editing group name and comment
+button_edit_group=Muuta\ resurssiryhm\u00E4\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator a @modifier Jussi Myllymäki
+# @comment Button for editing resource information, including key and translation
+button_edit_resource=Muuta\ resurssia
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_edit_resource_trigger=m
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for initiating an import of resources from an alternate source
+button_import=Hae
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_import_trigger=h
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button allows a selected resource to be marked as translated without further editing
+button_mark_translated=Merkitse\ Resurssi\ K\u00E4\u00E4nnetyksi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_mark_translated_trigger=m
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for adding the current resource bundle in the main application to the project
+button_project_add=Lis\u00E4\u00E4\ T\u00E4m\u00E4\ Resurssikokoelma
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_add_trigger=l
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for closing the project window
+button_project_close=Sulje\ Projekti
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_close_trigger=s
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for creating a new resource bundle project
+button_project_new=Uusi\ Projekti
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_new_trigger=u
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for opening a project file
+button_project_open=Avaa\ Projekti
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_open_trigger=a
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for removing the currently selected resource bundle from the project
+button_project_remove=Poista\ Valittu
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_remove_trigger=p
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Button for causing the selected resource bundle to be the one being edited in the main application
+button_project_select=Muuta\ Valittua
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+button_project_select_trigger=m
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing a complete search
+button_search_find_all=Etsi\ Kaikki
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_find_all_trigger=e
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing complete search and replace
+button_search_replace_all=Muuta\ Kaikki
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_replace_all_trigger=m
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Generic button for updating information
+button_update=P\u00E4ivit\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_update_trigger=p
+
+#
+# @group Dialogs
+#
+# @groupComment Translations associated with the applications various dialog boxes
+
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dailog_title_preferences=Asetukset
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Indication of wether or not a new file will be populated from the elements in the base class
+dialog_checkbox_copy_elements=Kopioi\ resurssit\ perustiedostosta\ t\u00E4h\u00E4n\ tiedostoon
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Indicator of wether an item is translated or not
+dialog_checkbox_translated=K\u00E4\u00E4nnetty
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_comment=Kommentti\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_country=Maa
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_created=Luotu\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_creator=Luonut\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @{1} The date
+# @{0} The name of the person involved
+# @comment The date and person associated with a creation or modification of an item
+dialog_date_person={1}\ ({0})
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_default_comment=Kommentin\ oletusarvo\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_default_translation=K\u00E4\u00E4nn\u00F6ksen\ oletusarvo\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_delete_file=Poista\ resurssitiedosto
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_delete_group=Poista\ resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_delete_item=Poista\ resurssi
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Warning displayed when a user asks for a deletion of a file. Prompts for 'Yes' or 'No'
+dialog_delete_warning=Varoitus\!\ Poisto-operaatiota\ ei\ voi\ peruuttaa.\nHaluatko\ varmasti\ jatkaa?
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_encoding=Encoding\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_file_comment=Resurssitiedoston\ kommentti\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_file_filter_description=Base\ Classin\ resurssitiedostot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Description of File Filter for RBReporter XML scan configuration files
+dialog_file_filter_description_scan=XML\ RBReporter\ Scan\ Files
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_file_info=Tiedoston\ tiedot
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_file_manager=Resurssimanagerin\ nimi\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_file_title=Resurssitiedoston\ otsikko\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_group=Ryhm\u00E4n\ nimi\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_group_comment=Ryhm\u00E4n\ kommentti\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_key=Resurssin\ tunniste\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_language=Kieli
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_lookups=Haku\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_modified=Muutettu\ viimeksi\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_modifier=Viimeisin\ muuttaja\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment The name of a language, country, or variant of a language file
+dialog_name=Nimi\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Prompts the user to enter a name for the resource bundle, before creating that bundle
+dialog_new_baseclass=Ole\ hyv\u00E4\ ja\ sy\u00F6t\u00E4\ Base\ Classin\ nimi\ uudelle\ resurssikokoelmalle.
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Dialog popup window text prompting the user for the name of a resource bundle project
+dialog_new_project=Please\ enter\ a\ title\ for\ your\ new\ Resource\ Bundle\ Project.
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment A description of the files making it through the filter upon opening a resource bundle
+dialog_open_file_filter=Base\ Classin\ resurssitiedostot
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment This is a section heading for setting the Alue
+dialog_preferences_Alue=Alue
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Alues currently defined in the properties files for the application
+dialog_preferences_locale_defined=M\u00E4\u00E4ritelty\ resurssitiedostoissa\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared Jackson @modifier Jussi Myllymäki
+# @comment 
+dialog_preferences_locale_iso=ISO\ standardit\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Locales that are supported by the host Java Virtual Machine
+dialog_preferences_locale_machine=Tuettu\ konetyyppi\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared Jackson @modifier Jussi Myllymäki
+# @comment 
+dialog_preferences_locale_warning=HUOM\:\ Alueen\ vaihto\ astuu\ voimaan\ vasta\ kun\ sovellus\ k\u00E4ynnistet\u00E4\u00E4n\ uudestaan
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_preferences_lookandfeel=Look\ And\ Feel\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_preferences_username=K\u00E4ytt\u00E4j\u00E4tunnus\:
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Descriptor that goes into GUI file chooser
+dialog_project_file_filter_description=RBManager\ Projektitiedostot
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment File Filter description for resource bundle project files
+dialog_project_filter_description=Resource\ Bundle\ Projects
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment An indication that no project is open, placed in the title of the dialog where the project name would normally go
+dialog_project_none_selected=Projektia\ Ei\ Valittu
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @{0} The name of the project
+# @comment Title for the window showing all the resource bundles in a project
+dialog_project_title=Projektin\ Resurssikokoelmat\:\ {0}
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Prompts the user if they would like to save changes before exiting
+dialog_quit_save=Haluatko\ tallentaa\ muutokset\ ennen\ poistumista?
+# @translated true @created 2001-12-17 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @comment A generic propmpt to ask the user if they wish to save changes
+dialog_save=Haluatko\ tallettaa\ muutokset\ resurssikokoelmaan?
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_search_options=Etsint\u00E4parametrit
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_search_param=Etsi\ teksti\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment The title of the about dialog box
+dialog_title_about_rbmanager=Tietoja\ Resurssimanagerista
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for deletion of an entire resource group
+dialog_title_delete_group=Poista\ Resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title when prompting to delete a resource
+dialog_title_delete_item=Poista\ Resurssi
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_edit_group=Muuta\ resurssiryhm\u00E4\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_edit_item=Muuta\ resurssia
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment 
+dialog_title_error=Error
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_error_creating_bundle=Virhe\ uutta\ resurssikokoelmaa\ luotaessa
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title when opening a resource bundle not created by RBManager
+dialog_title_error_not_rbmanager_format=Virhe\:\ Resurssitiedostoa\ ei\ voida\ lukea
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Title on a warning dialog that I/O malfunctioned opening a file
+dialog_title_error_opening_file=Tiedostoa\ Ei\ Voida\ Avata
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Dialog title for a dialog box for entering special parameters needed to export a resource bundle to java class code
+dialog_title_export_java_options=Talletusparametrit\:\ Java\ luokka
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for a dialog with a progress bar governing import status
+dialog_title_import_progress=Haun\ Edistyminen
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Title for creating new bundle
+dialog_title_new_bundle=Luo\ uusi\ resurssikokoelma
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Title for creating a new resource file
+dialog_title_new_file=Luo\ uusi\ resurssitiedosto
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Title for creating a new resource group
+dialog_title_new_group=Luo\ uusi\ resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Title for creating resource
+dialog_title_new_item=Luo\ uusi\ resurssi
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Title of the dialog box showing when creating a new project
+dialog_title_new_project=New\ Resource\ Bundle\ Project
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_preferences=Asetukset
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment Title for confirming exit from application
+dialog_title_quit=Poistu\ Resurssimanagerista
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_search=Etsi
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_title_user_name=Sy\u00F6t\u00E4\ k\u00E4ytt\u00E4j\u00E4tunnus
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_translation=K\u00E4\u00E4nn\u00F6s\:
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_user_name=Sy\u00F6t\u00E4\ nimesi.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_variant=Muunnelma
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_warning_delete_group=Resurssiryhm\u00E4n\ poistaminen\ poistaa\ my\u00F6s\ kaikki\ ryhm\u00E4ss\u00E4\ olevat\ resurssit\ pysyv\u00E4sti.\ Haluatko\ jatkaa?
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+dialog_warning_delete_item=Resurssi\ poistetaan\ pysyv\u00E4sti.\ Haluatko\ jatkaa?
+
+#
+# @group Error Messages
+#
+# @groupComment 
+
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error=Virhe
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when trying to add a resource bundle to a project.
+error_adding_project_bundle=An\ error\ occurred\ trying\ to\ add\ the\ Resource\ Bundle\ you\ selected.
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_baseclass_whitespace=Resurssin\ nimess\u00E4\ ei\ voi\ olla\ v\u00E4lily\u00F6nti\u00E4.
+# @translated true @created 2001-12-17 @modified 2000-11-08 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_bundle_not_created=Resurssikokoelmaa\ ei\ luotu.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_create_file=Resurssitiedoston\ luonti\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_create_group=Resurssiryhm\u00E4n\ luonti\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_create_item=Resurssin\ luonti\ ep\u00E4onnistui.
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when creating a project
+error_creating_project=An\ error\ was\ encountered\ trying\ to\ create\ a\ Resource\ Bundle\ Project.
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @{0} The message from an IOException that is thrown
+# @comment Error message when trying to delete a file
+error_deleting=Tiedostoa\ {0}\ ei\ voitu\ poistaa.
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment An error that occurs when an attempt is made to delete a file, but the virtual machine can not do so
+error_deletion_not_possible=Tiedostoa\ ei\ voitu\ poistaa.\ Tiedosto\ on\ suojattu.
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment General error message for exporting resource bundles
+error_export=Resurssitiedoston\ talletus\ ep\u00E4onnistui
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_internal=Sis\u00E4inen\ virhe
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_modify_file=Resurssitiedoston\ muutos\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_modify_group=Resurssiryhm\u00E4n\ muutos\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_modify_item=Resurssin\ muutos\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_no_bundle_for_file=Avaa\ tai\ luo\ uusi\ resurssikokoelma\ ensin,\ sitten\ voit\ luoda\ uuden\ resurssitiedoston.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_no_bundle_for_group=Avaa\ tai\ luo\ uusi\ resurssikokoelma\ ensin,\ sitten\ voit\ luoda\ uuden\ resurssiryhm\u00E4n.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Error message displayed when the user tries to create a resource, without an open resource bundle
+error_no_bundle_for_item=Avaa\ tai\ luo\ uusi\ resurssikokoelma\ ensin,\ sitten\ voit\ luoda\ uuden\ resurssin.
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+error_no_key_replace=Korvaa-toimito\ ei\ vaikuta\ resurssiavaimiin.\ Muut\ korvaukset\ tehd\u00E4\u00E4n
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Indication that RBManager can not read the file as created by RBManager
+error_not_rbmanager_format=Valittu\ resurssitiedosto\ ei\ ole\ RBManagerin\ luoma\ tai\ tiedosto\ on\ vioittunut.
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @{0} The name of the file that would not open
+# @comment Error message occuring on an I/O error trying to open a file
+error_opening_file=Tiedostoa\ {0}\ ei\ voitu\ avata
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Error message displayed when RBManager encounters an error writing preferences to the file system
+error_preferences_save=Asetusten\ talltus\ ep\u00E4onnistui.
+# @translated true @created 2001-12-17 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The error message generated
+# @comment A message presented to the user when an error occurs in saving the resource bundle
+error_saving=Resurssikokoelman\ talletuksessa\ tapahtui\ virhe\:\ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when saving a project
+error_saving_project=An\ error\ was\ encountered\ trying\ to\ save\ the\ Resource\ Bundle\ Project.
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Suggest trying to import the resource bundle instead of opening it.
+error_suggest_import_properties=Yrit\u00E4\ resurssitiedoston\ hakua\ avauksen\ sijasta
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_try_again_file=Sy\u00F6t\u00E4\ uudet\ encoding-arvot\ ja\ yrit\u00E4\ sitten\ uudestaan.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_try_again_group=Yrit\u00E4\ uudestaan\ toisella\ resurssiryhm\u00E4n\ nimell\u00E4.
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+error_try_again_item=Yrit\u00E4\ uudestaan\ toisella\ resurssin\ nimell\u00E4.
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Value inserted into table cells when an error has occured
+table_cell_error=*Virhe*
+
+#
+# @group Export
+#
+# @groupComment Resources dealing with export options
+
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Option for the parameter for created a protected class
+export_java_class_protected=Luo\ suojattu\ luokka
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Option for parameter setting the created class as public
+export_java_class_public=Luo\ julkinen\ luokka
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Option for parameter for creating protected methods in the java class
+export_java_methods_protected=Luo\ suojattu\ metodi
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Option for parameter for creating public methods
+export_java_methods_public=Luo\ julkinen\ metodi
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Title of a check box followed by a text field for specifying whether or not to use a package in the generated java class and what the package should be called
+export_java_package=Anna\ paketin\ nimi\:
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Text placed in a label at the top of the dialog box for specifying parameters concerning the export of resource bundles into a java class
+export_java_title=Anna\ seuraavat\ parametrit\ Java-luokalle\:
+
+#
+# @group General
+#
+# @groupComment Some items that are common accross groups
+
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The file or class composed of the default translations for the bundle
+baseclass=Base\ Class
+# @translated true @created 2001-12-17 @modified 2004-06-29 @creator Jared @modifier George
+# @comment This is the legal copyright notice
+copyright=(C)\ Copyright\ IBM\ Corp.\ 2000-2004\ -\ Kaikki\ oikeudet\ pid\u00E4tetty
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Gerneral use for file directories
+directory=Hakemisto
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+groups=Ryhm\u00E4t
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The name of the image file in the 'Images' directory that represents the logo seen at the top of the application
+logo_filename=TitleLogo_transparent.gif
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title when viewing a resource bundle in the project view when there is no active project
+no_project=Default\ Project
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title defaulted to when no resource bundle or project has been opened by the user
+no_project_bundle=No\ Project\ or\ Resource\ Bundle\ Open
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The top tree node title, when no resource bundle has been opened or created
+no_resource_bundle=Resurssikokoelmaa\ ei\ ole
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+none=Ei\ ole
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Project table column name - Location of a resource bundle
+project_table_file_location=Tiedoston\ Sijainti
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Table Column Name for resource bundle name
+project_table_resource_bundle=Resurssikokoelma
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment An abbreviated name of this application
+rbmanager=RBManager
+# @translated true @created 2001-12-17 @modified 2004-06-29 @creator Jared @modifier George
+# @comment 
+rbmanager_contact=Tekij\u00E4\:\ Jared\ Jackson\ &\ George\ Rhoten
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The full name of this application
+resource_bundle_manager=Resurssimanageri
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+table_column_error=Virhe\ taulukon\ sarakkeessa
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @{0} 
+# @comment Node title, under which all files of the same country, language reside
+tree_country_node=Maakoodi\:\ {0}
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @{0} Language Encoding
+# @comment The node below which languages of one encoding are grouped
+tree_language_node=Kielikoodi\:\ {0}
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+tree_variant_node=Muunnelmia\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The name assigned as a user name when the user name is not specified
+unknown_user=Tunnistamaton
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+untitled=Ei\ nime\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+untranslated_items=K\u00E4\u00E4nt\u00E4m\u00E4tt\u00F6m\u00E4t\ resurssit
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @{0} The version number
+# @comment The version of this application
+version=Versio\ {0}
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment general use Warning
+warning=Varoitus
+
+#
+# @group Import
+#
+# @groupComment Resources dealing with import options
+
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for choosing TMX files
+import_TMX_file_description=TMX-tiedostot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from TMX XML files
+import_TMX_title=TMX-tiedoston\ haku
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Title for the file chooser for choosing XLIFF (.xlf) files
+import_XLF_file_description=XLIFF-tiedostot
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Dialot title for importing from XLIFF (.xlf) files
+import_XLF_title=XLIFF-tiedoston\ haku
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflcits on a case by case basis
+import_conflict_prompt=Kysy\ jokaisen\ ongelman\ kohdalla
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option specifying whether a group found in the target but not found in the active resource bundle should be created in the resource bundle or not
+import_default_group_creation=Luo\ resurssiryhm\u00E4t\ joita\ ei\ ole\ nykyisess\u00E4\ tiedostossa
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Optoin for marking the incoming values as translated or not
+import_default_translated=Merkitse\ k\u00E4\u00E4nnetyksi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for options specifying the meta data to be applied to individual resources if it is not available in the import source
+import_default_values=Oletusarvot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The locale encoding of the file in question
+# @comment Instructions for prompting the user to resolve a conflict when importing resources from a locale that does not exist in the current resource bundle
+import_file_conflict_choose=Encoding\ {0}\ ei\ ole\ olemassa.\ Valitse\ kuinka\ haluat\ ratkaista\ ongelman.
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which a new file is generated, but not populated
+import_file_conflict_generate_empty=Luo\ uusi\ tyhj\u00E4\ resurssitiedosto
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving file conflicts in which a new file is generated and populated with all the existing resources
+import_file_conflict_generate_populate=Luo\ uusi\ resurssitiedosto\ ja\ kopioi\ Base\ Classin\ resurssit\ siihen
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which the conflicts are ignored
+import_file_conflict_ignore=Hypp\u00E4\u00E4\ niiden\ resurssien\ yli\ joiden\ Alue-asetus\ ei\ ole\ nykyisess\u00E4\ resurssitiedostossa
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for section listing options for what to do when an imported value exists in a locale not defined in the existing resource bundle
+import_file_conflicts=Puuttuvat\ resurssitiedostot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Selection of the default group. A list of groups will appear to the right of this resource in a ComboBox
+import_insert_group=Sijoita\ resurssiryhm\u00E4\u00E4n\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for the types of files accepted for this import type
+import_java_file_description=Java\ ListResourceBundle\ Base\ Classit
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for import from java classes
+import_java_title=Java\ ListResourceBundle\ Classien\ Haku
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title indicating section containing user options
+import_options=Hakuparametrit
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for selection of resource bundles stored in .properties files
+import_properties_file_description=Resurssitiedoston\ Base\ Classit
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from properties files (created or not by RBManager)
+import_properties_title=Resurssitiedostojen\ haku
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @{1} Encoding of the resource value with a conflict
+# @{0} The key value of the resource in conflict
+# @comment This is a warning and instruction for when a resource conflict occurs during an import
+import_resource_conflict_choose=Avainta\ {0}\ ei\ ole\ olemassa\ resurssikokoelmassa\ {1}.Valitse\ kuinka\ haluat\ ratkaista\ ongelman\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value associated with the resource item
+# @comment An indication of the value of the resource according to the import file
+import_resource_conflict_choose_source=Hae\ k\u00E4\u00E4nn\u00F6s\:\ {0}
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value of the resource item
+# @comment An indication of the translation value held by the active resource bundle during a translation resource conflict
+import_resource_conflict_choose_target=Resurssitiedoston\ k\u00E4\u00E4nn\u00F6s\:\ {0}
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving resource conflicts by ignoring import value
+import_resource_conflict_ignore=Ohita\ ongelma\ ja\ \u00E4l\u00E4\ muuta\ resurssia
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflicts by using the import value
+import_resource_conflict_overwrite=Korvaa\ resurssi\ tiedostosta\ haetulla\ arvolla
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title listing options for resolving conflicts between resources
+import_resource_conflicts=Resurssien\ ongelmat
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The path and name of the source file
+# @comment Indication of the source file for the import
+import_source_file=Tiedosto\:\ {0}
+
+#
+# @group Menu Items
+#
+# @groupComment These resources represent all of the menu and menu item titles
+
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The menu title covering copying, pasting, deleting of items
+menu_edit=Muuta
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy=Kopioi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy_trigger=k
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut=Leikkaa
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut_trigger=l
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete=Poista
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete_trigger=p
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste=Sijoita
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste_trigger=s
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The trigger is a letter from the translation of 'menu_edit' which provides a keyboard shortcut to the menu
+menu_edit_trigger=m
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu title for the opening, saving, etc. documents and exiting the program
+menu_file=Tiedosto
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export resource bundles in a variety of formats
+menu_file_export=Resurssikokoelman\ siirto
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment Ablity to export to ICU Resource Bundle files
+menu_file_export_ICU=ICU-tiedostot...
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_ICU_trigger=i
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ablity to export to TMX XML files
+menu_file_export_TMX=TMX-tiedostot...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_TMX_trigger=s
+# @translated false @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment x
+menu_file_export_XLF=XLIFF-tiedostot...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_XLF_trigger=x
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export to java files that compile to be ListResourceBundle class extensions
+menu_file_export_java=Java-tiedostot...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_java_trigger=j
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Export ability to properties files minus the metadata
+menu_file_export_properties=Pelkk\u00E4\ Property-tiedosto...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_properties_trigger=p
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_trigger=s
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item for import and merging another resource file with the bundle being worked with
+menu_file_import=Lue\ resurssikokoelma\ tiedostosta...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import abliity from XML TMX documents
+menu_file_import_TMX=TMX-tiedostot...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_TMX_trigger=t
+# @translated false @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Import ability from XML XLIFF (.xlf) files
+menu_file_import_XLF=XLIFF-tiedostot...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment X
+menu_file_import_XLF_trigger=x
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from java classes (ListResourceBundle)
+menu_file_import_java=Java-tiedostot...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_java_trigger=j
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from properties files not generated by RBManager
+menu_file_import_properties=Yksinkertaiset\ resurssikokoelmat...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_properties_trigger=p
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_import_trigger=l
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item for creating a new resource bundle
+menu_file_new=Uusi\ resurssikokoelma...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_new_trigger=u
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu Item for opening a resource bundle
+menu_file_open=Avaa\ resurssikokoelma...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_open_trigger=a
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item for closing the application
+menu_file_quit=Poistu
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_quit_trigger=p
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item for saving the resource bundle being worked with
+menu_file_save=Talleta\ resurssikokoelma
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_save_trigger=t
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu Item for saving a resource bundle to a particular location and file name
+menu_file_saveas=Talleta\ resurssikokoelma\ nimell\u00E4...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_file_saveas_trigger=n
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The trigger is a letter from the translation of 'menu_file' which provides a keyboard shortcut to the menu
+menu_file_trigger=t
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu title for help information and general information about the program
+menu_help=Apua
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item which brings up a dialog describing the application
+menu_help_about=Lis\u00E4tietoja\ Resurssimanagerista...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_help_about_trigger=l
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The trigger is a letter from the translation of 'menu_help' which provides a keyboard shortcut to the menu
+menu_help_trigger=a
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu title for options such as creating new resources, groups, and resource files
+menu_options=Asetukset
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu Item for creating a new resource item
+menu_options_addentry=Lis\u00E4\u00E4\ resurssi...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_options_addentry_trigger=r
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu Item for creating a new resource file for a particular language/country/variant
+menu_options_addfile=Lis\u00E4\u00E4\ resurssitiedosto...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_options_addfile_trigger=t
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item for creating a new resource group
+menu_options_addgroup=Lis\u00E4\u00E4\ resurssiryhm\u00E4...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_options_addgroup_trigger=r
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Menu item for editing the user's preferences for the application
+menu_options_preferences=Asetukset...
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+menu_options_preferences_trigger=a
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment Menu item that makes visible the project viewer
+menu_options_project_viewer=Avaa\ Projektin\u00E4ytt\u00F6
+# @translated true @created 2001-12-17 @modified 2001-11-20 @creator Unknown @modifier Jussi Myllymaki
+# @comment 
+menu_options_project_viewer_trigger=n
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The trigger is a letter from the translation of 'menu_options' which provides a keyboard shortcut to the menu
+menu_options_trigger=a
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for adding a new resource bundle to the project
+menu_tree_add_project_bundle=Add\ Resource\ Bundle...
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Popup menu item for deleting permanently a resource file
+menu_tree_delete=Poista\ Resurssitiedosto
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Popup menu item for removing a specific resource file from the tree view of the resource bundle
+menu_tree_hide=Piilota\ Resurssitiedosto
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Popup menu item for creating a new project
+menu_tree_new_project=New\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for opening a resource bundle project
+menu_tree_open_project=Open\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu associated with a resource bundle in the project tree
+menu_tree_remove_project_bundle=Remove\ from\ Project
+# @translated true @created 2001-12-17 @modified 2001-07-02 @creator Unknown @modifier Jussi Myllymaki
+# @comment Popup menu item for saving a specific resource bundle file
+menu_tree_save=Talleta\ Resurssitiedosto
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for saving changes to the resource project file, not the resource bundles themselves within the project
+menu_tree_save_project=Save\ Resource\ Bundle\ Project\ File...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu for selecting a resource bundle from the project tree to be edited in the resource bundle tree
+menu_tree_select_project_bundle=Work\ with\ this\ Resource\ Bundle
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu title for changing the display being seen by the user
+menu_view=N\u00E4ytt\u00F6
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment Menu item that takes you directly to the statistics panel for the entire bundle
+menu_view_statistics=N\u00E4yt\u00E4\ resurssikokoelman\ tilastotiedot
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment 
+menu_view_statistics_trigger=t
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Unknown @modifier Jussi Myllymäki
+# @comment The trigger is a letter from the translation of 'menu_view' which provides a keyboard shortcut to the menu
+menu_view_trigger=n
+
+#
+# @group Project Panel
+#
+# @groupComment Panel associated with Project editing
+
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The name of the resource bundle
+# @comment Label indicator associating a text box containing a translation with the resource bundle the translation comes from
+project_panel_bundle=Resource\ Bundle\:\ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} Name of the resource bundle
+# @comment Special indicator of the resource item resource bundle when the item is untranslated
+project_panel_bundle_untranslated=Resource\ Bundle\:\ {0}\ (Untranslated)
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text marking the line above or to the left of a resource comment
+project_panel_comment=Base\ Class\ Resource\ Comment\:
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text for a comment when none is found for a resource
+project_panel_comment_none=No\ comment\ supplied
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title shown on the project panel for committing change to one resource only
+project_panel_commit_button=Commit\ Change
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title on the project panel for saving all of the resources displayed. This means multiple resource files get saved.
+project_panel_commit_button_all=Commit\ All\ Resource\ Changes
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Default title shown on the project panel when no particular resource has been selected
+project_panel_default_title=Project\ Resource\ Editing
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Text field marker for the translation of a resource when that resource does not exist for the encoding file it is associated with
+project_panel_item_inherits=<No\ Translation\:\ Resource\ Inherits\ from\ parent>
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The key of the selected resource
+# @comment Title on the project panel while a resource is selected
+project_panel_title=Project\ Resource\ Editing\:\ {0}
+
+#
+# @group RBReporter
+#
+# @groupComment Translations for the RBReporter application
+
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Button title for selecting file locations for input/output
+reporter_button_choose=Valitse...
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Button indicating the report generation should occur immediately
+reporter_button_now=P\u00E4ivit\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for saving the current settings as default
+reporter_button_save_defaults=Talleta\ nykyiset\ asetukset
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Button to activate the reporter
+reporter_button_start=Aloita
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Button to deactive the reporter
+reporter_button_stop=Pys\u00E4yt\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: most information available
+reporter_detail_high=Paljon
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Indication of a selection option of the level of detail in reporting
+reporter_detail_level=Tiedon\ m\u00E4\u00E4r\u00E4\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: standard
+reporter_detail_normal=Normaali
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment An output format: HTML
+reporter_format_html=HTML
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment An output format type: plain text
+reporter_format_text=Teksti
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment An output format: XML
+reporter_format_xml=XML
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Indication of file location of the resource bundle to report on
+reporter_input_bundle=Resurssikokoelma\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Indication that reporting will happen at a speciified time of day. Followed by a time and day option.
+reporter_interval_defined=Raportointiajankohta
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Text indication of sequential reporting paused for a defined interval between reporting. Immediately followed by a number and a unit of measure of time
+reporter_interval_sequential=Raportointiv\u00E4li
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of last report generation
+# @comment Indication of the time of the last report
+reporter_last_report=Viimeisin\ raportti\:\ {0}
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of next report
+# @comment Indication of when the next report will be generated
+reporter_next_report=Seuraava\ raportti\:\ {0}
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Indication of the output directory into which the reports are placed
+reporter_output_directory=Talletushakemisto\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment An indication of the name of the output file for a particular output format
+reporter_output_file=Tiedoston\ nimi\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Panel title for setting interval of reporting
+reporter_panel_interval=Raportointiv\u00E4li
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Panel title for configurable options of the reporting
+reporter_panel_options=Raportointiparametrit
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Subpanel title for choosing output formats for the reports
+reporter_panel_output_format=Tulostusmuoto
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Panel title for indication of running status of the reporter
+reporter_panel_status=Tilanne
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Short title for selecting a code scan configuration file
+reporter_perform_scan=Code\ Scan\ -tiedosto
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Quick indication that the reporter is active (perhaps waiting)
+reporter_status_running=K\u00E4ynniss\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Quick status indication that the reporter is not active
+reporter_status_stopped=Pys\u00E4ytetty
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment days option
+reporter_time_days=P\u00E4iv\u00E4\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment every day option
+reporter_time_everyday=Joka\ p\u00E4iv\u00E4
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment friday option
+reporter_time_friday=Perjantai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment hours option
+reporter_time_hours=Tuntia
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment minutes option
+reporter_time_minutes=Minuuttia
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment monday option
+reporter_time_monday=Maanantai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment saturday option
+reporter_time_saturday=Lauantai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment sunday option
+reporter_time_sunday=Sunnuntai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment thursday option
+reporter_time_thursday=Torstai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment tuesday option
+reporter_time_tuesday=Tiistai
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment wednesday option
+reporter_time_wednesday=Keskiviikko
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Title of the application
+resource_bundle_reporter=RBReporter
+
+#
+# @group Search and Replace
+#
+# @groupComment Resources found on the search tab pane
+
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment General search title
+search=Etsi
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for making the search case sensitive or not
+search_case_sensitive=Isot\ ja\ pienet\ kirjaimet\ ovat\ samoja
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through resource comments
+search_comments=Kommentit
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text to search on
+search_find=Etsi\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box selection for searching option through resource keys
+search_keys=Resurssiavaimet
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text for replacing the found value
+search_replace=Korvaa\:
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through translation values
+search_values=K\u00E4\u00E4nn\u00F6kset
+
+#
+# @group Tabs
+#
+# @groupComment GUI Tabs in the main panel
+
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for Tabbed Pane over the tree showing a single resource bundle and its various files
+tab_bundle=Bundle
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Tab for the display of the various groups in the bundle
+tab_groups=Ryhm\u00E4t
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for tab over tree showing a resource bundle project
+tab_project=Project
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for pane allowing for search and replace functions
+tab_search=Etsi
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Tab for statistics display for either the Resource Bundle as a whole or particular language files
+tab_statistics=Tilastotiedot
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared @modifier Jared Jackson
+# @comment Tab for display of untranslated items in the different language files
+tab_untranslated=K\u00E4\u00E4nt\u00E4m\u00E4tt\u00F6m\u00E4t
+
+#
+# @group Translation File Groups Pane
+#
+# @groupComment 
+
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Column title for item comments
+languagegroup_column_comment=Kommentti
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Column title for item's resource key
+languagegroup_column_key=Resurssin\ avain
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment 
+languagegroup_column_translation=K\u00E4\u00E4nn\u00F6s
+
+#
+# @group Translation File Statistics Pane
+#
+# @groupComment Translations for strings in the language file statistics pane
+
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment A comment given to the file
+languagestats_comment=Kommentti\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The country being described by the file
+languagestats_country=Maa\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The number of resources in the file
+languagestats_item_count=Resurssien\ m\u00E4\u00E4r\u00E4\ t\u00E4ss\u00E4\ resurssitiedostossa\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The language described by the file
+languagestats_language=Kieli\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The name of a person responsible for the translations in this language file
+languagestats_manager=Resurssitiedoston\ omistaja\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The name given to the language file
+languagestats_title=Resurssitiedoston\ nimi\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment Number of resources needing translation in the file
+languagestats_translation_count=K\u00E4\u00E4nt\u00E4m\u00E4tt\u00F6mien\ resurssien\ m\u00E4\u00E4r\u00E4\ t\u00E4ss\u00E4\ resurssitiedostossa\:
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The language/region variant described by the file
+languagestats_variant=Muunnelma\:
+
+#
+# @group Translation File Untranslated Items Pane
+#
+# @groupComment 
+
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The column title for group names of items in the rows
+languageuntrans_column_group=Resurssiryhm\u00E4
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The key of the item a row
+languageuntrans_column_key=Resurssin\ avain
+# @translated true @created 2001-12-17 @modified 2000-11-09 @creator Jared @modifier Jussi Myllymäki
+# @comment The translated value of an item in a row
+languageuntrans_column_translation=K\u00E4\u00E4nn\u00F6s
+# @translated true @created 2001-12-17 @modified 2001-02-08 @creator Jared Jackson @modifier Jared Jackson
+# @comment Panel title covering buttons that apply to a selected resource from a table of resources
+languageuntrans_selected_resources_options=Valittujen\ resurssien\ parametrit
diff --git a/unicodetools/com/ibm/rbm/resources/RBManager_sv.properties b/unicodetools/com/ibm/rbm/resources/RBManager_sv.properties
new file mode 100644
index 0000000..c176e90
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/resources/RBManager_sv.properties
@@ -0,0 +1,1216 @@
+# @file          RBManager
+# @fileEncoding  sv
+# @fileLanguage  Swedish
+# @fileCountry   
+# @fileVariant   
+# @fileManager   Stefan Edlund
+# @fileComment   
+
+
+#
+# @group Base Class Groups Pane
+#
+# @groupComment Translation Items for the Base Class Group tabbed pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basegroup_group_comment=Grupp\ kommentar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basegroup_group_name=Grupp\ namn
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basegroup_group_options=Resursgrupp\ alternativ
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basegroup_item_options=Resurs\ sak\ alternativ
+
+#
+# @group Base Class Statistics Pane
+#
+# @groupComment All translations for strings appearing on the statistics pane for the base class
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_duplicates_count=Antal\ kopierade\ resursnycklar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_file_count=Antal\ resursfiler
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_group_count=Antal\ resursgrupper
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_group_group=Resurs\ grupper
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_item_count=Antal\ resurs\ saker
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_item_group=Resurssak
+
+#
+# @group Base Class Untranslated Items Pane
+#
+# @groupComment Translations appearing on the Base Class Untranslated Items pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Indication of the file being viewed
+baseuntrans_file=Fil\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Indication of the number of resource items not translated in the file
+baseuntrans_untrans_count=Antal\ ooversatta\ saker
+
+#
+# @group Button Names
+#
+# @groupComment The names displayed on the various buttons
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+basestats_file_group=Resurs\ filer
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Button for creating a new resource language file
+button_add_file=Lagg\ till\ ny\ resursfil
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_file_trigger=n
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Button for creating a new resource group
+button_add_group=Lagg\ till\ resurs\ grupp
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_group_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Button for creating a new resource translation item
+button_add_resource=Lagg\ till\ resurssak
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_add_resource_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Generic button for canceling actions
+button_cancel=Avbryt
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Generic button for a choice or selection option
+button_choose=V\u00E4lj
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_choose_trigger=c
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Button for generic creation of groups, items, files, etc.
+button_create=Skapa
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment For creation of a resource group
+button_create_group=Skapa\ grupp
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_group_trigger=g
+# @translated true @created 2001-02-02 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for creating an item then continuing creating more items
+button_create_more=Skapa\ och\ Forts\u00E4tt
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_more_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Button for creating a resource translation item
+button_create_resource=Skapa\ resurs
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_resource_trigger=c
+# @translated true @created 2001-02-02 @modified 2001-02-02 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_create_trigger=c
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Button for removing a group and its contents
+button_delete_group=Ta\ bort\ grupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Button for permanently removing a resource from the bundle
+button_delete_resource=Ta\ bort\ resurs
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_delete_resource_trigger=d
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Generic edit button
+button_edit=Editera
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Button for editing group name and comment
+button_edit_group=Editera\ grupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator a @modifier Stefan Edlund
+# @comment Button for editing resource information, including key and translation
+button_edit_resource=Editera\ resurs
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_edit_resource_trigger=e
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for initiating an import of resources from an alternate source
+button_import=Importera
+# @translated true @created 2001-01-26 @modified 2001-01-26 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_import_trigger=i
+# @translated true @created 2001-01-23 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button allows a selected resource to be marked as translated without further editing
+button_mark_translated=Markera\ som\ \u00F6versatt
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_mark_translated_trigger=t
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for adding the current resource bundle in the main application to the project
+button_project_add=Add\ Current\ Bundle
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_add_trigger=a
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for closing the project window
+button_project_close=Close\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_close_trigger=c
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for creating a new resource bundle project
+button_project_new=New\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_new_trigger=n
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for opening a project file
+button_project_open=Open\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_open_trigger=o
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for removing the currently selected resource bundle from the project
+button_project_remove=Remove\ Selection
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_remove_trigger=r
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Button for causing the selected resource bundle to be the one being edited in the main application
+button_project_select=Edit\ Selected
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+button_project_select_trigger=e
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing a complete search
+button_search_find_all=Hitta\ alla
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_find_all_trigger=f
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for performing complete search and replace
+button_search_replace_all=Ers\u00E4tt\ alla
+# @translated true @created 2001-02-06 @modified 2001-02-06 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_search_replace_all_trigger=r
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Generic button for updating information
+button_update=Updatera
+# @translated true @created 2001-01-23 @modified 2001-01-23 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+button_update_trigger=u
+
+#
+# @group Dialogs
+#
+# @groupComment Translations associated with the applications various dialog boxes
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dailog_title_preferences=Installningar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Indication of wether or not a new file will be populated from the elements in the base class
+dialog_checkbox_copy_elements=Kopiera\ saker\ fran\ basklass\ till\ ny\ fil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Indicator of wether an item is translated or not
+dialog_checkbox_translated=Oversatt
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_comment=Komentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_country=Land
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_created=Skapad\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_creator=Skapare\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @{1} The date
+# @{0} The name of the person involved
+# @comment The date and person associated with a creation or modification of an item
+dialog_date_person={0}\ av\ {1}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_default_comment=Skonsvarde\ for\ kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_default_translation=Skonsvarde\ for\ oversattning
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_delete_file=Ta\ bort\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_delete_group=Ta\ bort\ resurs\ grupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_delete_item=Ta\ bort\ resurssak
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Warning displayed when a user asks for a deletion of a file. Prompts for 'Yes' or 'No'
+dialog_delete_warning=Varning\!\ Raderingen\ kan\ inte\ \u00E5ngras.\n\u00C4r\ du\ s\u00E4ker\ att\ du\ vill\ forts\u00E4tta?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_encoding=Kodning\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_file_comment=Kommentar\ for\ resursfil\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_file_filter_description=Basklass\ egenskapsfil
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Description of File Filter for RBReporter XML scan configuration files
+dialog_file_filter_description_scan=XML\ RBReporter\ l\u00E4s\ filer
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_file_info=Fil\ information
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_file_manager=Namn\ for\ resursagare\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_file_title=Titel\ for\ resursfil\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_group=Grupp\ namn\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_group_comment=Grupp\ kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_key=Nyckel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_language=Sprak
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_lookups=Uppletningar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_modified=Senast\ modifierad\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_modifier=Senast\ modifierad\ av\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The name of a language, country, or variant of a language file
+dialog_name=Namn\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Prompts the user to enter a name for the resource bundle, before creating that bundle
+dialog_new_baseclass=Mata\ in\ en\ ny\ basklassnamn\ for\ resursfilen.
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Dialog popup window text prompting the user for the name of a resource bundle project
+dialog_new_project=Please\ enter\ a\ title\ for\ your\ new\ Resource\ Bundle\ Project.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment A description of the files making it through the filter upon opening a resource bundle
+dialog_open_file_filter=Basklass\ egenskapsfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment This is a section heading for setting the locale
+dialog_preferences_locale=Lokal
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Locales currently defined in the properties files for the application
+dialog_preferences_locale_defined=Definierad\ for\ RBManager
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared Jackson @modifier Stefan Edlund
+# @comment 
+dialog_preferences_locale_iso=ISO\ Standarder\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Locales that are supported by the host Java Virtual Machine
+dialog_preferences_locale_machine=Kompatibel\ utrustning\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared Jackson @modifier Stefan Edlund
+# @comment 
+dialog_preferences_locale_warning=OBS.\ Andringar\ till\ lokalen\ ar\ inte\ aktiva\ tills\ applikatoinen\ aterstartas
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_preferences_lookandfeel='Look\ and\ Feel'
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_preferences_username=Anvandarnamn\:
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Descriptor that goes into GUI file chooser
+dialog_project_file_filter_description=RBManager\ Project\ Files
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment File Filter description for resource bundle project files
+dialog_project_filter_description=Resource\ Bundle\ Projects
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment An indication that no project is open, placed in the title of the dialog where the project name would normally go
+dialog_project_none_selected=No\ Active\ Project
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @{0} The name of the project
+# @comment Title for the window showing all the resource bundles in a project
+dialog_project_title=Resource\ Bundle\ Project\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Prompts the user if they would like to save changes before exiting
+dialog_quit_save=Vill\ du\ spara\ innan\ du\ avslutar\ RBManager?
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @comment A generic propmpt to ask the user if they wish to save changes
+dialog_save=Vill\ du\ spara\ andringar\ till\ resursgrupen?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_search_options=Sokningsalternativ
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_search_param=Leta\ efter\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The title of the about dialog box
+dialog_title_about_rbmanager=Om\ RBManager
+# @translated true @created 2001-01-22 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for deletion of an entire resource group
+dialog_title_delete_group=Ta\ bort\ resurs\ grupp
+# @translated true @created 2001-01-22 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title when prompting to delete a resource
+dialog_title_delete_item=Ta\ bort\ resurs
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_edit_group=Editera\ Resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_edit_item=Editera\ resurssak
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment 
+dialog_title_error=Error
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_error_creating_bundle=Fel\ vid\ skapande\ av\ resursfil
+# @translated true @created 2001-01-22 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title when opening a resource bundle not created by RBManager
+dialog_title_error_not_rbmanager_format=Fel\:\ Ol\u00E4sbar\ resursgrupp
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Title on a warning dialog that I/O malfunctioned opening a file
+dialog_title_error_opening_file=Fel\ vid\ \u00F6ppnande\ av\ fil
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Dialog title for a dialog box for entering special parameters needed to export a resource bundle to java class code
+dialog_title_export_java_options=Export\ parametrar\:\ Java\ klass
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for a dialog with a progress bar governing import status
+dialog_title_import_progress=Importeringsframg\u00E5ng
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Title for creating new bundle
+dialog_title_new_bundle=Skapa\ ny\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Title for creating a new resource file
+dialog_title_new_file=Skapa\ ny\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Title for creating a new resource group
+dialog_title_new_group=Skapa\ ny\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Title for creating resource
+dialog_title_new_item=Skapa\ ny\ resurssak
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Title of the dialog box showing when creating a new project
+dialog_title_new_project=New\ Resource\ Bundle\ Project
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_preferences=Installningar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Title for confirming exit from application
+dialog_title_quit=Avsluta\ RBManager
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_search=Sok
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_title_user_name=Mata\ in\ anvandarnamn
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_translation=Oversattning\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_user_name=Mata\ in\ namn.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_variant=Variant\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_warning_delete_group=Om\ du\ tar\ bort\ den\ ar\ gruppen\ sa\ forsvinner\ alla\ saker\ i\ gruppen.\ Vill\ du\ forsatta?
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+dialog_warning_delete_item=Resurssaken\ kommer\ att\ forsvinna.\ Vill\ du\ forsatta?
+
+#
+# @group Error Messages
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error=Fel
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when trying to add a resource bundle to a project.
+error_adding_project_bundle=An\ error\ occurred\ trying\ to\ add\ the\ Resource\ Bundle\ you\ selected.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_baseclass_whitespace=Resursnamn\ kan\ inte\ ha\ space\ i\ dem.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_bundle_not_created=Ingen\ resursfil\ var\ skapad
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_create_file=Ett\ fel\ uppstod\ nar\ vi\ forsokte\ skapa\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_create_group=Ett\ problem\ uppstod\ nar\ gruppen\ forsokte\ skapas
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_create_item=Ett\ fel\ uppstod\ vid\ skapande\ av\ ny\ oversattning
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when creating a project
+error_creating_project=An\ error\ was\ encountered\ trying\ to\ create\ a\ Resource\ Bundle\ Project.
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @{0} The message from an IOException that is thrown
+# @comment Error message when trying to delete a file
+error_deleting=Ett\ fel\ uppstod\ n\u00E4r\ jag\ f\u00F6rs\u00F6kte\ ta\ bort\ fil\:\ {0}
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment An error that occurs when an attempt is made to delete a file, but the virtual machine can not do so
+error_deletion_not_possible=RBManager\ kunde\ ej\ ta\ bort\ fil.\ Tillst\u00E5nd\ f\u00F6rbjuden.
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment General error message for exporting resource bundles
+error_export=Ett\ fel\ uppstod\ vid\ exportering\ av\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_internal=Internt\ fel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_modify_file=Ett\ fel\ uppstod\ vid\ modifiering\ av\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_modify_group=Ett\ fel\ uppstod\ nar\ grupp\ modifierades.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_modify_item=Ett\ fel\ uppstod\ nar\ oversattning\ andrades
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_no_bundle_for_file=For\ att\ skapa\ en\ resursfil\ sa\ maste\ du\ forst\ skapa\ en\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_no_bundle_for_group=For\ att\ skapa\ en\ grupp\ sa\ maste\ du\ forst\ skapa\ en\ resursgrupp.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Error message displayed when the user tries to create a resource, without an open resource bundle
+error_no_bundle_for_item=Oppna\ en\ resursgrupp\ innan\ du\ forsoker\ skapa\ en\ ny\ oversattning
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+error_no_key_replace=Ers\u00E4tt\ fungerar\ ej\ f\u00F6r\ resurs\ nycklar.\ Alla\ andra\ ers\u00E4ttningar\ kommer\ att\ utf\u00F6ras.
+# @translated true @created 2001-01-22 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Indication that RBManager can not read the file as created by RBManager
+error_not_rbmanager_format=Den\ valda\ resurs\ gruppen\ var\ ej\ skapad\ av\ RBManager,\ eller\ filen\ \u00E4r\ skadad.
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @{0} The name of the file that would not open
+# @comment Error message occuring on an I/O error trying to open a file
+error_opening_file=Kunde\ ej\ \u00F6ppna\ fil\ {0}
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Error message displayed when RBManager encounters an error writing preferences to the file system
+error_preferences_save=Ett\ fel\ uppstod\ n\u00E4r\ jag\ f\u00F6rs\u00F6kte\ spara\ dina\ inst\u00E4llingar.
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The error message generated
+# @comment A message presented to the user when an error occurs in saving the resource bundle
+error_saving=Problem\ vid\ sparande\ av\ resursgruppen\:\ \ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment General error message when saving a project
+error_saving_project=An\ error\ was\ encountered\ trying\ to\ save\ the\ Resource\ Bundle\ Project.
+# @translated true @created 2001-01-22 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Suggest trying to import the resource bundle instead of opening it.
+error_suggest_import_properties=F\u00F6rs\u00F6k\ importera\ resursgruppen\ ist\u00E4llet.
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_try_again_file=Forsok\ igen\ med\ en\ annan\ kodning
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_try_again_group=Forsok\ igen\ med\ en\ annan\ gruppnamn
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+error_try_again_item=Forsok\ igen\ med\ en\ annan\ nyckel
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Value inserted into table cells when an error has occured
+table_cell_error=*Fel*
+
+#
+# @group Export
+#
+# @groupComment Resources dealing with export options
+
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Option for the parameter for created a protected class
+export_java_class_protected=Skapa\ en\ skyddad\ klass
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Option for parameter setting the created class as public
+export_java_class_public=Skapa\ en\ publik\ klass
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Option for parameter for creating protected methods in the java class
+export_java_methods_protected=Skapa\ en\ skyddad\ metod
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Option for parameter for creating public methods
+export_java_methods_public=Skapa\ publik\ metod
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Title of a check box followed by a text field for specifying whether or not to use a package in the generated java class and what the package should be called
+export_java_package=Specifiera\ Java\ package\:
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Text placed in a label at the top of the dialog box for specifying parameters concerning the export of resource bundles into a java class
+export_java_title=Var\ god\ specificera\ f\u00F6ljande\ parametrar\ f\u00F6r\ din\ Java\ klass\:
+
+#
+# @group General
+#
+# @groupComment Some items that are common accross groups
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The file or class composed of the default translations for the bundle
+baseclass=Basklass
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment This is the legal copyright notice
+copyright=(C)\ Kopieringsskyddad\ IBM\ Corp.\ 2000-2004\ -\ Alla\ rattigheter\ reserverade
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Gerneral use for file directories
+directory=Folder
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+groups=Grupper
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared @modifier Jared Jackson
+# @comment The name of the image file in the 'Images' directory that represents the logo seen at the top of the application
+logo_filename=TitleLogo_transparent.gif
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title when viewing a resource bundle in the project view when there is no active project
+no_project=Default\ Project
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Tree node title defaulted to when no resource bundle or project has been opened by the user
+no_project_bundle=No\ Project\ or\ Resource\ Bundle\ Open
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The top tree node title, when no resource bundle has been opened or created
+no_resource_bundle=Ingen\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+none=Ingen
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Project table column name - Location of a resource bundle
+project_table_file_location=File\ Location
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Table Column Name for resource bundle name
+project_table_resource_bundle=Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared @modifier Jared Jackson
+# @comment An abbreviated name of this application
+rbmanager=RBManager
+# @translated true @created 2000-11-10 @modified 2004-06-29 @creator Jared @modifier George
+# @comment 
+rbmanager_contact=Skapare\:\ Jared\ Jackson\ &\ George\ Rhoten
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The full name of this application
+resource_bundle_manager=Resursgrupp\ Agare
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+table_column_error=Fel\ i\ kolumn
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @{0} 
+# @comment Node title, under which all files of the same country, language reside
+tree_country_node=Landskod\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @{0} Language Encoding
+# @comment The node below which languages of one encoding are grouped
+tree_language_node=Sprakkod\:\ {0}
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+tree_variant_node=Varianter\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The name assigned as a user name when the user name is not specified
+unknown_user=Okand
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+untitled=Ingen\ titel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+untranslated_items=Ooversatta\ saker
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @{0} The version number
+# @comment The version of this application
+version=Version\ {0}
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment general use Warning
+warning=Varning
+
+#
+# @group Import
+#
+# @groupComment Resources dealing with import options
+
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for choosing TMX files
+import_TMX_file_description=TMX\ filer
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from TMX XML files
+import_TMX_title=TMX\ filimport
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Title for the file chooser for choosing XLIFF (.xlf) files
+import_XLF_file_description=XLIFF\ filer
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Dialot title for importing from XLIFF (.xlf) files
+import_XLF_title=XLIFF\ filimport
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflcits on a case by case basis
+import_conflict_prompt=Fr\u00E5ga\ vid\ varje\ konflikt
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option specifying whether a group found in the target but not found in the active resource bundle should be created in the resource bundle or not
+import_default_group_creation=Skapa\ grupper\ som\ inte\ existerar\ i\ nuvarande\ bundle
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Optoin for marking the incoming values as translated or not
+import_default_translated=Markera\ som\ \u00F6versatt
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for options specifying the meta data to be applied to individual resources if it is not available in the import source
+import_default_values=Sk\u00F6nsv\u00E4rden
+# @translated true @created 2001-02-02 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The locale encoding of the file in question
+# @comment Instructions for prompting the user to resolve a conflict when importing resources from a locale that does not exist in the current resource bundle
+import_file_conflict_choose=Kodningen\ {0}\ finns\ ej.\ V\u00E4lj\ ett\ val\ f\u00F6r\ att\ fixa\ konflikten,\ eller\ avbryt\ f\u00F6r\ att\ ignorera.
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which a new file is generated, but not populated
+import_file_conflict_generate_empty=Skapa\ en\ ny,\ tom\ resursfil
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving file conflicts in which a new file is generated and populated with all the existing resources
+import_file_conflict_generate_populate=Skapa\ en\ ny\ resursfil\ och\ fyll\ i\ med\ bas-klassens\ resurer
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for file conflicts in which the conflicts are ignored
+import_file_conflict_ignore=Skippa\ och\ ignorera\ alla\ resurser\ fr\u00E5n\ lokaler\ som\ inte\ existerar\ i\ nuvarande\ bunt.
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for section listing options for what to do when an imported value exists in a locale not defined in the existing resource bundle
+import_file_conflicts=Resursfil\ saknas
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Selection of the default group. A list of groups will appear to the right of this resource in a ComboBox
+import_insert_group=L\u00E4gg\ till\ grupp\:
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for the types of files accepted for this import type
+import_java_file_description=Java\ ListResourceBundle\ Bas\ klasser
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for dialog prompting for import from java classes
+import_java_title=Java\ ListResourceBundle\ Klass\ importering
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title indicating section containing user options
+import_options=Importeringsinst\u00E4llningar
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for file chooser for selection of resource bundles stored in .properties files
+import_properties_file_description=Resursbunt\ basklasser
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Dialog title for importing from properties files (created or not by RBManager)
+import_properties_title=Resursbunt\ inst\u00E4llningsimportering
+# @translated true @created 2001-02-02 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @{1} Encoding of the resource value with a conflict
+# @{0} The key value of the resource in conflict
+# @comment This is a warning and instruction for when a resource conflict occurs during an import
+import_resource_conflict_choose=Nyckeln\ {0}\ finns\ redan\ i\ {1}\ resursbunt.\ V\u00E4lj\ ett\ alternativ\ f\u00F6r\ att\ l\u00F6sa\ problemet.
+# @translated true @created 2001-02-02 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value associated with the resource item
+# @comment An indication of the value of the resource according to the import file
+import_resource_conflict_choose_source=Import\u00F6vers\u00E4ttning\:\ {0}
+# @translated true @created 2001-02-02 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The translation value of the resource item
+# @comment An indication of the translation value held by the active resource bundle during a translation resource conflict
+import_resource_conflict_choose_target=Resursbunt\ \u00F6vers\u00E4ttning\:\ {0}
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving resource conflicts by ignoring import value
+import_resource_conflict_ignore=Ignorera\ konfliten\ och\ l\u00E4mna\ originalresursen\ o\u00E4ndrad
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Option for resolving conflicts by using the import value
+import_resource_conflict_overwrite=Skriv\ \u00F6ver\ resursen\ med\ v\u00E4rden\ fr\u00E5n\ importerad\ fil
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title listing options for resolving conflicts between resources
+import_resource_conflicts=Resurs\ konflikter
+# @translated true @created 2001-01-26 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @{0} The path and name of the source file
+# @comment Indication of the source file for the import
+import_source_file=K\u00E4llfil\:\ {0}
+
+#
+# @group Menu Items
+#
+# @groupComment These resources represent all of the menu and menu item titles
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment The menu title covering copying, pasting, deleting of items
+menu_edit=Editera
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy=Kopiera
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_copy_trigger=c
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut=Ta\ bort
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_cut_trigger=t
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete=Radera
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_delete_trigger=d
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste=Klistra\ in
+# @translated true @created 2001-02-07 @modified 2001-02-07 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_edit_paste_trigger=p
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment The trigger is a letter from the translation of 'menu_edit' which provides a keyboard shortcut to the menu
+menu_edit_trigger=e
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu title for the opening, saving, etc. documents and exiting the program
+menu_file=Fil
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export resource bundles in a variety of formats
+menu_file_export=Exportera\ resursbunt
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment Ablity to export to ICU Resource Bundle files
+menu_file_export_ICU=ICU\ Filer...
+# @translated true @created 2002-05-17 @modified 2002-05-17 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_ICU_trigger=i
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ablity to export to TMX XML files
+menu_file_export_TMX=TMX\ Filer...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment x
+menu_file_export_XLF=XLIFF\ Filer...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment 
+menu_file_export_XLF_trigger=x
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Ability to export to java files that compile to be ListResourceBundle class extensions
+menu_file_export_java=Kompatibla\ Java\ filer...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Export ability to properties files minus the metadata
+menu_file_export_properties=Minimal\ inst\u00E4llningsfil...
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_properties_trigger=s
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_export_trigger=x
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item for import and merging another resource file with the bundle being worked with
+menu_file_import=Importera\ resursgrupp\ fran\ fil...
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import abliity from XML TMX documents
+menu_file_import_TMX=TMX\ document...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_TMX_trigger=t
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment Import ability from XML XLIFF (.xlf) files
+menu_file_import_XLF=XLIFF\ document...
+# @translated true @created 2004-07-01 @modified 2004-07-01 @creator George Rhoten @modifier George Rhoten
+# @comment X
+menu_file_import_XLF_trigger=x
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from java classes (ListResourceBundle)
+menu_file_import_java=ListResourceBundle\ Java\ Klasser...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_java_trigger=j
+# @translated true @created 2001-01-15 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Import ability from properties files not generated by RBManager
+menu_file_import_properties=Enkel\ resursbunt...
+# @translated true @created 2001-01-15 @modified 2001-01-15 @creator Jared Jackson @modifier Jared Jackson
+# @comment 
+menu_file_import_properties_trigger=S
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_file_import_trigger=m
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item for creating a new resource bundle
+menu_file_new=Ny\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_file_new_trigger=n
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu Item for opening a resource bundle
+menu_file_open=Oppna\ resursgrupp...
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_file_open_trigger=o
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item for closing the application
+menu_file_quit=Avsluta
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment 
+menu_file_quit_trigger=a
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item for saving the resource bundle being worked with
+menu_file_save=Spara\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_file_save_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu Item for saving a resource bundle to a particular location and file name
+menu_file_saveas=Spara\ resursgrupp\ som...
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_file_saveas_trigger=a
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment The trigger is a letter from the translation of 'menu_file' which provides a keyboard shortcut to the menu
+menu_file_trigger=f
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu title for help information and general information about the program
+menu_help=Hjalp
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment Menu item which brings up a dialog describing the application
+menu_help_about=Om\ RBManager...
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_help_about_trigger=a
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment The trigger is a letter from the translation of 'menu_help' which provides a keyboard shortcut to the menu
+menu_help_trigger=h
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu title for options such as creating new resources, groups, and resource files
+menu_options=Installningar
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment Menu Item for creating a new resource item
+menu_options_addentry=Skapa\ ny\ oversattning...
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment 
+menu_options_addentry_trigger=i
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu Item for creating a new resource file for a particular language/country/variant
+menu_options_addfile=Skapa\ ny\ resursfil
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_options_addfile_trigger=f
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item for creating a new resource group
+menu_options_addgroup=Skapa\ ny\ grupp
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_options_addgroup_trigger=g
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Menu item for editing the user's preferences for the application
+menu_options_preferences=Personliga\ installningar...
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Jared @modifier Jared Jackson
+# @comment 
+menu_options_preferences_trigger=p
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment Menu item that makes visible the project viewer
+menu_options_project_viewer=Open\ Project\ Viewer
+# @translated false @created 2001-11-20 @modified 2001-11-20 @creator Unknown @modifier Unknown
+# @comment 
+menu_options_project_viewer_trigger=v
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment The trigger is a letter from the translation of 'menu_options' which provides a keyboard shortcut to the menu
+menu_options_trigger=i
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for adding a new resource bundle to the project
+menu_tree_add_project_bundle=Add\ Resource\ Bundle...
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Popup menu item for deleting permanently a resource file
+menu_tree_delete=Ta\ bort\ resurs\ fil
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Popup menu item for removing a specific resource file from the tree view of the resource bundle
+menu_tree_hide=G\u00F6m\ resurs\ fil
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Popup menu item for creating a new project
+menu_tree_new_project=New\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for opening a resource bundle project
+menu_tree_open_project=Open\ Resource\ Bundle\ Project...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu associated with a resource bundle in the project tree
+menu_tree_remove_project_bundle=Remove\ from\ Project
+# @translated true @created 2001-06-27 @modified 2001-07-02 @creator Unknown @modifier Stefan Edlund
+# @comment Popup menu item for saving a specific resource bundle file
+menu_tree_save=Spara\ resurs\ fil
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu item for saving changes to the resource project file, not the resource bundles themselves within the project
+menu_tree_save_project=Save\ Resource\ Bundle\ Project\ File...
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment Popup menu for selecting a resource bundle from the project tree to be edited in the resource bundle tree
+menu_tree_select_project_bundle=Work\ with\ this\ Resource\ Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu title for changing the display being seen by the user
+menu_view=Visa
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Unknown @modifier Stefan Edlund
+# @comment Menu item that takes you directly to the statistics panel for the entire bundle
+menu_view_statistics=Statistik\ for\ resursgrupp
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment 
+menu_view_statistics_trigger=s
+# @translated true @created 2000-11-10 @modified 2000-11-10 @creator Unknown @modifier Jared Jackson
+# @comment The trigger is a letter from the translation of 'menu_view' which provides a keyboard shortcut to the menu
+menu_view_trigger=v
+
+#
+# @group Project Panel
+#
+# @groupComment Panel associated with Project editing
+
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The name of the resource bundle
+# @comment Label indicator associating a text box containing a translation with the resource bundle the translation comes from
+project_panel_bundle=Resource\ Bundle\:\ {0}
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} Name of the resource bundle
+# @comment Special indicator of the resource item resource bundle when the item is untranslated
+project_panel_bundle_untranslated=Resource\ Bundle\:\ {0}\ (Untranslated)
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text marking the line above or to the left of a resource comment
+project_panel_comment=Base\ Class\ Resource\ Comment\:
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Label text for a comment when none is found for a resource
+project_panel_comment_none=No\ comment\ supplied
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title shown on the project panel for committing change to one resource only
+project_panel_commit_button=Commit\ Change
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Button title on the project panel for saving all of the resources displayed. This means multiple resource files get saved.
+project_panel_commit_button_all=Commit\ All\ Resource\ Changes
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Default title shown on the project panel when no particular resource has been selected
+project_panel_default_title=Project\ Resource\ Editing
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @comment Text field marker for the translation of a resource when that resource does not exist for the encoding file it is associated with
+project_panel_item_inherits=<No\ Translation\:\ Resource\ Inherits\ from\ parent>
+# @translated false @created 2001-12-19 @modified 2001-12-19 @creator Unknown @modifier Unknown
+# @{0} The key of the selected resource
+# @comment Title on the project panel while a resource is selected
+project_panel_title=Project\ Resource\ Editing\:\ {0}
+
+#
+# @group RBReporter
+#
+# @groupComment Translations for the RBReporter application
+
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Button title for selecting file locations for input/output
+reporter_button_choose=V\u00E4lj...
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Button indicating the report generation should occur immediately
+reporter_button_now=Updatera\ nu...
+# @translated true @created 2000-11-29 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Button title for saving the current settings as default
+reporter_button_save_defaults=Spara\ inst\u00E4llningar\ som\ sk\u00F6nsv\u00E4rden
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Button to activate the reporter
+reporter_button_start=Starta
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Button to deactive the reporter
+reporter_button_stop=Stoppa
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: most information available
+reporter_detail_high=H\u00F6g
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Indication of a selection option of the level of detail in reporting
+reporter_detail_level=Detaljniv\u00E5\:
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Level of detail: standard
+reporter_detail_normal=Normal
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment An output format: HTML
+reporter_format_html=HTML
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An output format type: plain text
+reporter_format_text=Text
+# @translated true @created 2000-11-17 @modified 2000-11-17 @creator Jared @modifier Jared
+# @comment An output format: XML
+reporter_format_xml=XML
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Indication of file location of the resource bundle to report on
+reporter_input_bundle=Resursbunt\:
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Indication that reporting will happen at a speciified time of day. Followed by a time and day option.
+reporter_interval_defined=Rapportera\ vid
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Text indication of sequential reporting paused for a defined interval between reporting. Immediately followed by a number and a unit of measure of time
+reporter_interval_sequential=Raportera\ varje
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of last report generation
+# @comment Indication of the time of the last report
+reporter_last_report=Senaste\ rapport\:\ {0
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @{0} Date/Time of next report
+# @comment Indication of when the next report will be generated
+reporter_next_report=N\u00E4sta\ rapport\:\ {0}
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Indication of the output directory into which the reports are placed
+reporter_output_directory=Utfolder\:
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment An indication of the name of the output file for a particular output format
+reporter_output_file=Filnamn\:
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Panel title for setting interval of reporting
+reporter_panel_interval=Rapportintervall
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Panel title for configurable options of the reporting
+reporter_panel_options=Rapport\ inst\u00E4llningar
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Subpanel title for choosing output formats for the reports
+reporter_panel_output_format=Utformat
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Panel title for indication of running status of the reporter
+reporter_panel_status=Status
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Short title for selecting a code scan configuration file
+reporter_perform_scan=Koda\ filer
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Quick indication that the reporter is active (perhaps waiting)
+reporter_status_running=Startad
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Quick status indication that the reporter is not active
+reporter_status_stopped=Stoppad
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment days option
+reporter_time_days=Dagar
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment every day option
+reporter_time_everyday=Varje\ dag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment friday option
+reporter_time_friday=Fredag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment hours option
+reporter_time_hours=Timmar
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment minutes option
+reporter_time_minutes=Minuter
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment monday option
+reporter_time_monday=M\u00E5ndag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment saturday option
+reporter_time_saturday=L\u00F6rdag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment sunday option
+reporter_time_sunday=S\u00F6ndag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment thursday option
+reporter_time_thursday=Torsdag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment tuesday option
+reporter_time_tuesday=Tisdag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment wednesday option
+reporter_time_wednesday=Onsdag
+# @translated true @created 2000-11-17 @modified 2001-02-19 @creator Jared @modifier Jared Jackson
+# @comment Title of the application
+resource_bundle_reporter=RBReporter
+
+#
+# @group Search and Replace
+#
+# @groupComment Resources found on the search tab pane
+
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment General search title
+search=Leta
+# @translated true @created 2001-02-07 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for making the search case sensitive or not
+search_case_sensitive=Bokstavsk\u00E4nslig\ s\u00F6kning\:
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through resource comments
+search_comments=Kommentarer
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text to search on
+search_find=Hitta\:
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box selection for searching option through resource keys
+search_keys=Resursnycklar
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Text indication of the field for entering text for replacing the found value
+search_replace=Ers\u00E4tt\:
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Check box option for searching through translation values
+search_values=\u00D6vers\u00E4ttningar
+
+#
+# @group Tabs
+#
+# @groupComment GUI Tabs in the main panel
+
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for Tabbed Pane over the tree showing a single resource bundle and its various files
+tab_bundle=Bundle
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Tab for the display of the various groups in the bundle
+tab_groups=Grupper
+# @translated false @created 2001-12-17 @modified 2001-12-17 @creator Unknown @modifier Unknown
+# @comment GUI Tab for tab over tree showing a resource bundle project
+tab_project=Project
+# @translated true @created 2001-02-06 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Title for pane allowing for search and replace functions
+tab_search=Leta
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Tab for statistics display for either the Resource Bundle as a whole or particular language files
+tab_statistics=Statistik
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Tab for display of untranslated items in the different language files
+tab_untranslated=Ooversatt
+
+#
+# @group Translation File Groups Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Column title for item comments
+languagegroup_column_comment=Kommentar
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Column title for item's resource key
+languagegroup_column_key=Resursnyckel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment 
+languagegroup_column_translation=Oversattning
+
+#
+# @group Translation File Statistics Pane
+#
+# @groupComment Translations for strings in the language file statistics pane
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment A comment given to the file
+languagestats_comment=Kommentar\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The country being described by the file
+languagestats_country=Land\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The number of resources in the file
+languagestats_item_count=Antal\ resurser\ i\ den\ har\ filen\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The language described by the file
+languagestats_language=Sprak\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The name of a person responsible for the translations in this language file
+languagestats_manager=Resursfil\ agare\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The name given to the language file
+languagestats_title=Resurs\ titel\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment Number of resources needing translation in the file
+languagestats_translation_count=Antal\ ooversatta\ resurssaker\ i\ den\ har\ filen\:
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The language/region variant described by the file
+languagestats_variant=Variant\ \:
+
+#
+# @group Translation File Untranslated Items Pane
+#
+# @groupComment 
+
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The column title for group names of items in the rows
+languageuntrans_column_group=Grupp
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The key of the item a row
+languageuntrans_column_key=Resursnyckel
+# @translated true @created 2000-11-10 @modified 2000-11-08 @creator Jared @modifier Stefan Edlund
+# @comment The translated value of an item in a row
+languageuntrans_column_translation=Oversattning
+# @translated true @created 2001-01-23 @modified 2001-02-19 @creator Jared Jackson @modifier Jared Jackson
+# @comment Panel title covering buttons that apply to a selected resource from a table of resources
+languageuntrans_selected_resources_options=Inst\u00E4llningar\ f\u00F6r\ vald\ resurs
diff --git a/unicodetools/com/ibm/rbm/resources/preferences.properties b/unicodetools/com/ibm/rbm/resources/preferences.properties
new file mode 100644
index 0000000..e9d742a
--- /dev/null
+++ b/unicodetools/com/ibm/rbm/resources/preferences.properties
@@ -0,0 +1,33 @@
+#RBManager Preferences
+#Wed Dec 19 14:08:55 PST 2001
+reporter_format_html_file=report.html
+username=Unknown
+reporter_format_text_detail=High
+reporter_format_xml_detail=High
+reporter_format_hmtl_enabled=Yes
+reporter_enabled=Yes
+reporter_format_xml_file=report.xml
+reporter_interval_defined_hour=1
+reporter_interval_sequential_value=1
+reporter_interval_sequential_units=Hours
+reporter_perform_scan=Yes
+reporter_format_text_file=report.txt
+reporter_format_xml_enabled=Yes
+reporter_interval_defined_day=Saturday
+locale=en
+reporter_interval=Sequential
+recentfileloc3=
+recentfileloc2=
+recentfileloc1=
+recentfileloc0=
+reporter_scan_file=./rbmanager_scanner.xml
+reporter_format_html_enabled=Yes
+recentfileid3=
+recentfileid2=
+recentfileid1=
+reporter_interval_defined_minute=00
+recentfileid0=
+reporter_format_text_enabled=Yes
+reporter_base_class_file=
+reporter_output_directory=
+reporter_format_html_detail=High
diff --git a/unicodetools/license.html b/unicodetools/license.html
new file mode 100644
index 0000000..9c96ee0
--- /dev/null
+++ b/unicodetools/license.html
@@ -0,0 +1,34 @@
+<html>
+
+<head>
+<title>ICU4J license - ICU4J 1.3.1 and later</title>
+</head>
+
+<body BGCOLOR="#ffffff">
+<h2>ICU4J license - ICU4J 1.3.1 and later</h2>
+
+<p>COPYRIGHT AND PERMISSION NOTICE</p>
+
+<p>
+Copyright (c) 1995-2002 International Business Machines Corporation and others
+</p>
+<p>
+All rights reserved.
+</p>
+<p>
+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, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation.
+</p>
+<p>
+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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+</p>
+<p>
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.
+</p>
+
+<hr>
+<small>
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+</small>
+</body>
+</html>
diff --git a/unicodetools/readme.html b/unicodetools/readme.html
new file mode 100644
index 0000000..6873413
--- /dev/null
+++ b/unicodetools/readme.html
@@ -0,0 +1,400 @@
+<html>
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>ICU's Unicode Tools Read Me</title>
+    <meta name="COPYRIGHT" content=
+    "Copyright (c) 2004-2006 IBM Corporation and others. All Rights Reserved." />
+<style>
+<!--
+li           { margin-top: 0.5em; margin-bottom: 0.5em }
+-->
+</style>
+</head>
+
+<body>
+
+<h1>UnicodeTools</h1>
+<p>This file provides instructions for building and running the UnicodeTools, which<br>
+can be used to:</p>
+<ul>
+  <li>build the Derived Unicode files in the UCD (Unicode Character Database),</li>
+  <li>build the transformed UCA (Unicode Collation Algorithm) files needed by ICU.</li>
+  <li>run consistency checks on beta releases of the UCD and the UCA.</li>
+  <li>build 4 chart folders on the unicode site</li>
+</ul>
+<p><font color="#FF0000"><b>WARNING!!</b></font></p>
+<ul>
+  <li>This is NOT production level code, and should never be used in programs.</li>
+  <li>The API is subject to change without notice, and will not be maintained.</li>
+  <li>The source is uncommented, and has many warts; since it is not production code, it has not 
+  been worth the time to clean it up.</li>
+  <li>It will probably not work on Unix or Mac without changing the file separator.</li>
+  <li>Currently it uses hard-coded directory names.</li>
+  <li>The contents of multiple versions of the UCD must be copied to a local directory, as described 
+  below.</li>
+</ul>
+<h2>Instructions:</h2>
+<h3>0. You will need to get ICU4J on your system, using CVS.</h3>
+<p>The rest of this will assume that you have set up CVS so that you load the ICU4J project into 
+C:\ICU4J<br>
+<br>
+You need both the main icu4j and a subproject called unicodetools. See:
+<a href="http://www.ibm.com/software/globalization/icu/repository.jsp">
+http://www.ibm.com/software/globalization/icu/repository.jsp</a>. Inside unicodetools, look at com/ibm/text. The 
+main directories of interest are UCD, UCA and utility.</p>
+<h4>0a. If you are using Eclipse for your IDE, look at the instructions on
+<a href="http://icu.sourceforge.net/docs/eclipse_howto/eclipse_howto.html">
+http://icu.sourceforge.net/docs/eclipse_howto/eclipse_howto.html</a> </h4>
+<p>Set up Eclipse to build two projects: ICU4J and UnicodeTools:<br>
+<br>
+<b>Project Name: </b>ICU4J<br>
+<b>Directory: </b>C:\ICU4J\icu4j<br>
+<b>Default output folder = </b>ICU4J/classes<br>
+<br>
+<b>Project Name: </b>unicodetools<br>
+<b>Create project from existing source: </b>C:\ICU4J\unicodetools<br>
+<b>Default Output Folder: </b>unicodetools/classes<br>
+<br>
+After Eclipse is set up with these, exclude certain files from unicodetools:<br>
+<br>
+Right-Click UnicodeTools &gt; Properties &gt; Java Build Path &gt; Exclusions<br>
+com/ibm/rbm/<br>
+com/ibm/text/utility/UnicodeMapInt.java<br>
+com/ibm/text/utility/TestUtility.java<br>
+com/ibm/text/UCD/GenerateThaiBreaks-old.java/<br>
+com/ibm/text/UCD/ProcessUnihan.java/<br>
+com/ibm/text/UCA/WriteHTMLCollation.java/<br>
+<br>
+UnicodeTools must also include the ICU4J project, with<br>
+<br>
+Right-Click UnicodeTools &gt; Properties &gt; Java Build Path &gt; Projects</p>
+<h3>1. In UCD, you must edit UCD_Types.java at the top, to set the directories for the build:</h3>
+<p>public static final String DATA_DIR = &quot;C:\\DATA\\&quot;;<br>
+public static final String UCD_DIR = BASE_DIR + &quot;UCD\\&quot;;<br>
+public static final String BIN_DIR = DATA_DIR + &quot;BIN\\&quot;;<br>
+public static final String GEN_DIR = DATA_DIR + &quot;GEN\\&quot;;<br>
+<br>
+Make sure that each of these directories exist. Also make sure that the following<br>
+exist:<br>
+<br>
+&lt;GEN_DIR&gt;/DerivedData<br>
+&lt;GEN_DIR&gt;/DerivedData/ExtractedProperties<br>
+&lt;UCD_DIR&gt;/EXTRAS-Update</p>
+<h3>2. Download all of the UnicodeData files for each version into UCD_DIR.</h3>
+<p>The folder names must be of the form: &quot;3.2.0-Update&quot;, so rename the folders on the<br>
+Unicode site to this format. I<span style="background-color: #FFFF00">f the 
+folder contains ucd, then make the contents of that directory be the contents of 
+the x.x.x-Update directory. That is, each directory will directly contain files 
+like PropList....txt</span></p>
+<h4>2a Ensure Complete Release</h4>
+<p>If you are downloading any &quot;incomplete&quot; release (one that does not contain a complete set of data 
+files for that release, you need to also download the previous complete release). Most of the N.M-Update 
+directoriess are complete, *except*:</p>
+<p>4.0-Update, which does not contain a copy of Unihan.txt and some other files<br>
+3.1-Update, which does not contain a copy of BidiMirroring.txt</p>
+<p>Also, make the following changes to UnicodeData for 1.1.5:</p>
+<p><b>Delete</b></p>
+<pre>3400;HANGUL SYLLABLE KIYEOK A;Lo;0;L;1100 1161;;;;N;;;;;
+...
+4DFF;HANGUL SYLLABLE MIEUM WEO RIEUL-THIEUTH;Lo;0;L;1106 116F 11B4;;;;N;;;;;
+4E00;<cjk IDEOGRAPH REPRESENTATIVE>;Lo;0;L;;;;;N;;;;;</pre>
+<p><b>Add:</b></p>
+<pre>4E00;<cjk Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FA5;<cjk Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+E000;<private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<private Use, Last>;Co;0;L;;;;;N;;;;;</pre>
+<p><b>And from a late version of Unicode, add:</b></p>
+<pre>F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+...
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;</pre>
+<h4>2b. UCA data</h4>
+<p>If you are building any of the UCA tools, you need to get a copy of the UCA data file<br>
+from http://www.unicode.org/reports/tr10/#AllKeys. The default location for this is:<br>
+<br>
+BASE_DIR + &quot;Collation\allkeys&quot; + VERSION + &quot;.txt&quot;.<br>
+<br>
+If you have it in a different location, change that value for KEYS in UCA.java, and <br>
+the value for BASE_DIR</p>
+<h4>2c. Here is an example of the default directory structure with files. All of 
+the yellow ones should exist</h4>
+<pre>C://DATA/
+
+        BIN/
+    
+<span style="background-color: #FFFF00">        Collation/
+            allkeys-3.1.1.txt
+</span>        
+        GEN/
+            DerivedData/
+<span style="background-color: #FFFF00">        </span><span style="background-color: #FFFF00">UCD/
+            3.0.0-Update/
+                Unihan-3.2.0.txt
+                ...
+            3.0.1-Update/
+                ...
+            3.1.0-Update/
+                ...
+            3.1.1-Update/
+                ...
+            3.2.0-Update/
+                ...
+            4.0.0-Update/
+                ArabicShaping-4.0.0d14b.txt
+                BidiMirroring-4.0.0d1b.txt
+                ...
+            EXTRAS-Update/</span></pre>
+<h3>3. Versions</h3>
+<p>All of the following have &quot;version X&quot; in the options you give to Java (either on the&nbsp; 
+command line, or in the Eclipse 'run' options. If you want a specific version like 3.1.0, then you 
+would write &quot;version 3.1.1&quot;. If you want the latest version (4.1.0), you can omit the &quot;version X&quot;.</p>
+<h3>4. Building Files</h3>
+<ol>
+	<li><b>Setup</b><ol>
+		<li>In Eclipse, open the Package Explorer (Use Window&gt;Show View if you 
+		don't see it)</li>
+		<li>Open UnicodeTools<ul>
+			<li>com.ibm.text.UCD<ul>
+				<li>MakeUnicodeFiles.<span style="background-color: #FFFF00">txt</span><p>This file drives the production of 
+				the derived Unicode files. The first three lines contain 
+				parameters that you may want to modify at some times:</p>
+				<pre>Generate: <b>.*script.*</b> <i>// this is a regular expression. Use .* for all files</i>
+DeltaVersion: <b>10</b> <i>    // This gets appended to the file name. Pick 1+ the highest value in Public</i>
+CopyrightYear: <b>2006</b> <i> // Pick the current year</i></pre>
+				</li>
+			</ul>
+			</li>
+		</ul>
+		</li>
+		<li>Open in Package Explorer 
+		<ul>
+			<li>com.ibm.text.UCD<ul>
+				<li>Main</li>
+			</ul>
+			</li>
+		</ul>
+		</li>
+		<li>Run&gt;Run As...<ol>
+			<li>Choose Java Application<ul>
+				<li>it will fail, don't worry; you need to set some parameters.</li>
+			</ul>
+			</li>
+		</ol>
+		</li>
+		<li>Run&gt;Run...<ul>
+			<li>Select the Arguments tab, and fill in the following<ul>
+				<li>Program arguments:<pre>build 5.0<span style="background-color: #FFFF00">.0</span> MakeUnicodeFiles</pre>
+				</li>
+				<li>VM arguments: 
+				<pre>-Xms512m -Xmx512m</pre>
+				</li>
+			</ul>
+			</li>
+			<li>Close and Save</li>
+		</ul>
+		</li>
+	</ol>
+	</li>
+	<li><b>Run</b><ol>
+		<li>You'll see it build the 5.0 files, with something like the following 
+		results:<pre>Writing UCD_Data5.0.0
+Data Size: 109,802
+Wrote Data 109802</pre>
+		</li>
+		<li>For each version, the tools build a set of binary data in BIN that 
+		contain the information for that release. This is done automatically, or 
+		you can manually do it with the Program Arguments<pre>version X build</pre>
+		<p>This builds an compressed format of all the UCD data (except blocks 
+		and Unihan) into the BIN directory. Don't worry about the voluminous 
+		console messages, unless one says &quot;FAIL&quot;.</p>
+		<p><font color="#FF0000"><i>You have to manually do this if you change 
+		any of the data files in that version!</i></font></p>
+		<p>Note: if for any reason you modify the binary format of the BIN files, you also have to bump the 
+value in that file:</p>
+		<pre>static final byte BINARY_FORMAT = 8; // bumped if binary format of UCD changes</pre>
+		</li>
+	</ol>
+	</li>
+	<li>Results in <a href="file:///C:/DATA/GEN/DerivedData">
+	C:\DATA\GEN\DerivedData</a><ol>
+		<li>The files will be in this directory.</li>
+		<li>There are also DIFF folders, that contain BAT files that you can run 
+		on Windows with CompareIt. (You can modify the code to build BATs with 
+		another Diff program if you want).<ol>
+			<li>For any file with a significant difference, it will build two 
+			BAT files, such as the first two below.<pre>Diff_PropList-5.0.0d10.txt.bat
+OLDER-Diff_PropList-5.0.0d10.txt.bat
+
+UNCHANGED-Diff_PropertyValueAliases-5.0.0d10.txt.bat</pre>
+			</li>
+		</ol>
+		</li>
+		<li>Any files without significant changes will have &quot;UNCHANGED&quot; as a 
+		prefix: ignore them.&nbsp; The OLDER prefix is the comparison to the 
+		last version of Unicode.</li>
+		<li>On Windows you can run these BATs to compare files:</li>
+	</ol>
+	</li>
+	<li><span style="background-color: #FFFF00">NFSkippable</span><ol>
+	<li><span style="background-color: #FFFF00">A file is needed by ICU that is 
+	generated with the same tool. Just use the input parameter &quot;NFSkippable&quot; to 
+	generate the file NFSafeSets.txt, also in </span>
+	<a href="file:///C:/DATA/GEN"><span style="background-color: #FFFF00">
+	file:///C:/DATA/GEN</span></a></li>
+</ol>
+	</li>
+</ol>
+<h3>5. Invariant Checking</h3>
+<ol>
+	<li>Setup<ol>
+		<li>Open in Package Explorer<ul>
+			<li>com.ibm.text.UCD<ul>
+				<li>TestUnicodeInvariants.java</li>
+			</ul>
+			</li>
+		</ul>
+		</li>
+		<li>Run&gt;Run As... Java Application<br>
+		Will create the following file of results:<pre><a href="file:///C:/DATA/GEN/UnicodeInvariantResults.txt/">C:\DATA\GEN\UnicodeInvariantResults.txt\</a></pre>
+		<p>And on the console will list whether any problems are found. Thus in 
+		the following case there was one failure:</p>
+		<pre>ParseErrorCount=0
+TestFailureCount=1</pre>
+		</li>
+		<li>The header of the result file explains the syntax of the tests.</li>
+		<li>Open that file and search for &quot;**** START Error Info ****&quot;. Each such 
+		point provides a dump of comparison information.<ol>
+		<li>Failures print a list of differences between two sets being 
+		compared. So if A and B are being compared, it prints all the items in 
+		A-B, then in B-A, then in A&amp;B.</li>
+		<li>For example, here is a listing of a problem that must be corrected. 
+		Note that usually there is a comment that explains what the following 
+		line or lines are supposed to test. Then will come FALSE (indicating 
+		that the test failed), then the detailed error report.<pre><span style="font-size: 9pt"># Canonical decompositions (minus exclusions) must be identical across releases
+[$Decomposition_Type:Canonical - $Full_Composition_Exclusion] = [$×Decomposition_Type:Canonical - $×Full_Composition_Exclusion]
+
+FALSE
+**** START Error Info ****
+
+In [$×Decomposition_Type:Canonical - $×Full_Composition_Exclusion], but not in [$Decomposition_Type:Canonical - $Full_Composition_Exclusion] :
+
+# Total code points: 0
+
+Not in [$×Decomposition_Type:Canonical - $×Full_Composition_Exclusion], but in [$Decomposition_Type:Canonical - $Full_Composition_Exclusion] :
+1B06           # Lo       BALINESE LETTER AKARA TEDUNG
+1B08           # Lo       BALINESE LETTER IKARA TEDUNG
+1B0A           # Lo       BALINESE LETTER UKARA TEDUNG
+1B0C           # Lo       BALINESE LETTER RA REPA TEDUNG
+1B0E           # Lo       BALINESE LETTER LA LENGA TEDUNG
+1B12           # Lo       BALINESE LETTER OKARA TEDUNG
+1B3B           # Mc       BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3D           # Mc       BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B40..1B41     # Mc   [2] BALINESE VOWEL SIGN TALING TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B43           # Mc       BALINESE VOWEL SIGN PEPET TEDUNG
+
+# Total code points: 11
+
+In both [$×Decomposition_Type:Canonical - $×Full_Composition_Exclusion], and in [$Decomposition_Type:Canonical - $Full_Composition_Exclusion] :
+00C0..00C5     # L&amp;   [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE
+00C7..00CF     # L&amp;   [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS
+00D1..00D6     # L&amp;   [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS
+...
+30F7..30FA     # Lo   [4] KATAKANA LETTER VA..KATAKANA LETTER VO
+30FE           # Lm       KATAKANA VOICED ITERATION MARK
+AC00..D7A3     # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+
+# Total code points: 12089
+**** END Error Info ****</span></pre>
+		</li>
+	</ol>
+		</li>
+		<li>Options:<ol>
+		<li>-r&nbsp;&nbsp;&nbsp; Print the failures as a range list.</li>
+		<li>-fxxx&nbsp;&nbsp;&nbsp; Use a different input file, such as -fInvariantTest.txt</li>
+	</ol>
+		</li>
+	</ol>
+	</li>
+</ol>
+<h3>6. Options</h3>
+<ol>
+	<li>If you want to see files that are opened while processing, do the 
+	following:<ol>
+		<li>Run&gt;Run</li>
+		<li>Select the Arguments tab, and add the following<ol>
+			<li>VM arguments:
+			<pre>-DSHOW_FILES</pre>
+			</li>
+		</ol>
+		</li>
+	</ol>
+	</li>
+</ol>
+<h3>5. UCA</h3>
+<ol>
+	<li>You will use com.ibm.text.UCA.Main as your main class, creating along 
+	the same lines as above.</li>
+	<li>To test whether the UCA files are valid, use the
+	<span style="font-weight: 400">options (<i>note: you must also build the ICU 
+	files below, since they test other aspects</i>).</span><pre>writeCollationValidityLog</pre>
+	<p>It will create a file:</p>
+	<pre><a href="file:///C:/DATA/GEN/collation/5.0.0/CheckCollationValidity.html">C:\DATA\GEN\collation\5.0.0\CheckCollationValidity.html</a></pre>
+	<ol>
+		<li>Review this file. It will list errors. Some of those are actually 
+	warnings, and indicate possible problems (this is indicated in the text, 
+	such as by: &quot;These are not necessarily errors, but should be examined for 
+		<i>possible</i> errors&quot;). In those cases, the items should be reviewed to make 
+	sure that there are no inadvertent problems.</li>
+		<li>If it is not so marked, it is a true error, and must be fixed.</li>
+		<li>At the end, there is section <b>11. Coverage</b>. There are two sections:<ol>
+			<li>In UCDxxx, but not in allkeys. Check this over to make sure that these 
+	are all the characters that should get <b><i>implicit</i></b> weights.</li>
+			<li>In allkeys, but not in UCD. These should be <b><i>only</i></b> 
+	contractions. Check them over to make sure they look right also.</li>
+		</ol></li>
+	</ol></li>
+	<li>
+	<h4><span style="font-weight: 400">To build all the charts (including for 
+	the UCA), use the options: </span></h4>
+	<pre>normalizationChart caseChart scriptChart indexChart</pre>
+	<p>They will be built into</p>
+	<pre><a href="file:///C:/DATA/GEN/charts">C:\DATA\GEN\charts</a></pre>
+	<p><b>Once UCA is released, then copy those files up to the right spots in 
+	the Unicode site:</b><ul>
+		<li>
+		<pre><a href="http://www.unicode.org/charts/normalization/">http://www.unicode.org/charts/normalization/</a></pre>
+		</li>
+		<li>
+		<pre><a href="http://www.unicode.org/charts/collation/">http://www.unicode.org/charts/collation/</a> </pre>
+		</li>
+		<li>
+		<pre><a href="http://www.unicode.org/charts/case/">http://www.unicode.org/charts/case/</a> </pre>
+		</li>
+		<li>
+		<pre><a href="http://www.unicode.org/charts/collation/">http://www.unicode.org/charts/collation/</a> </pre>
+		</li>
+	</ul>
+	</li>
+	<li>
+	<h4><span style="font-weight: 400">To build all the UCA files used by ICU, use the 
+	option:</span></h4>
+	<pre>ICU</pre>
+	<p>They will be built into:</p>
+	<pre><a href="file:///C:/DATA/GEN/collation/5.0.0">C:\DATA\GEN\collation\5.0.0</a></pre>
+	</li>
+	<li>You should then build a set of the ICU files for the previous version, 
+	if you don't have them. Use the options:<pre>version 4.1.0 ICU</pre>
+	<p>Or whatever the last version was.</li>
+	<li>Now, you will want to compare versions. The key file is 
+	UCA_Rules_NoCE.txt. It contains the rules expressed in ICU format, which 
+	allows for comparison across versions of UCA without spurious variations of 
+	the numbers getting in the way.<ol>
+		<li>Do a Diff between the last and current versions of these files, and 
+		verify that all the differences are either new characters, or were 
+		authorized to be changed by the UTC.</li>
+	</ol></li>
+</ol>
+
+</body>
+
+</html>
\ No newline at end of file