Apache UIMA DictionaryAnnotator software component
Copyright 2007-2009 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This software contains parts of Apache XMLBeans
(http://xmlbeans.apache.org/), which contains the
following software:

    - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
      Consortium (Massachusetts Institute of Technology, European Research
      Consortium for Informatics and Mathematics, Keio University)

    - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
      Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0
      