Apache NiFi MiNiFi
Copyright 2014-2018 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).

===========================================
Apache Software License v2
===========================================

The following binary components are provided under the Apache Software License v2

  (ASLv2) Apache NiFi
    The following NOTICE information applies:
        Apache NiFi
        Copyright 2014-2018 The Apache Software Foundation

        This product includes software developed at
        The Apache Software Foundation (https://www.apache.org/).

        This product includes the following work from the Apache Hadoop project:

        BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

  (ASLv2) Jetty
    The following NOTICE information applies:
       Jetty Web Container
       Copyright 1995-2015 Mort Bay Consulting Pty Ltd.

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2012 The Apache Software Foundation

  (ASLv2) Apache Commons Net
    The following NOTICE information applies:
      Apache Commons Net
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Collections
    The following NOTICE information applies:
      Apache Commons Collections
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2014 The Apache Software Foundation

      The files in the package org.apache.commons.compress.archivers.sevenz
      were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
      which has been placed in the public domain:

      "LZMA SDK is placed in the public domain." (https://www.7-zip.org/sdk.html)

  (ASLv2) Apache Commons Codec
    The following NOTICE information applies:
      Apache Commons Codec
      Copyright 2002-2014 The Apache Software Foundation

      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
      contains test data from http://aspell.net/test/orig/batch0.tab.
      Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

      ===============================================================================

      The content of package org.apache.commons.codec.language.bm has been translated
      from the original php source code available at https://stevemorse.org/phoneticinfo.htm
      with permission from the original authors.
      Original source copyright:
      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

  (ASLv2) Apache Commons Daemon
    The following NOTICE information applies:
      Apache Commons Daemon
      Copyright 2002-2013 The Apache Software Foundation  

  (ASLv2) Apache HttpComponents
    The following NOTICE information applies:
      Apache HttpClient
      Copyright 1999-2015 The Apache Software Foundation

      Apache HttpCore
      Copyright 2005-2015 The Apache Software Foundation

      Apache HttpMime
      Copyright 1999-2013 The Apache Software Foundation

      This project contains annotations derived from JCIP-ANNOTATIONS
      Copyright (c) 2005 Brian Goetz and Tim Peierls. See https://www.jcip.net

  (ASLv2) Apache Jakarta HttpClient
    The following NOTICE information applies:
      Apache Jakarta HttpClient
      Copyright 1999-2007 The Apache Software Foundation

  (ASLv2) Apache Commons Logging
    The following NOTICE information applies:
      Apache Commons Logging
      Copyright 2003-2014 The Apache Software Foundation

  (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2015 The Apache Software Foundation

      This product includes software from the Spring Framework,
      under the Apache License 2.0 (see: StringUtils.containsWhitespace())

  (ASLv2) Apache Commons Configuration
    The following NOTICE information applies:
      Apache Commons Configuration
      Copyright 2001-2008 The Apache Software Foundation

  (ASLv2) Apache Commons JEXL
    The following NOTICE information applies:
      Apache Commons JEXL
      Copyright 2001-2011 The Apache Software Foundation

  (ASLv2) Spring Framework
    The following NOTICE information applies:
      Spring Framework 4.1.4.RELEASE
      Copyright (c) 2002-2015 Pivotal, Inc.

  (ASLv2) Xalan
     This product includes software developed by
      The Apache Software Foundation (https://www.apache.org/).

      Portions of this software was originally based on the following:

        - software copyright (c) 1999-2002, Lotus Development Corporation., https://www.lotus.com.
        - software copyright (c) 2001-2002, Sun Microsystems., https://www.sun.com.
        - software copyright (c) 2003, IBM Corporation., https://www.ibm.com.
        - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the
          Apache Software Foundation and was originally developed at Hewlett Packard Company.

  (ASLv2) Apache XML Commons XML APIs
    Copyright 2006 The Apache Software Foundation.

    This product includes software developed at
    The Apache Software Foundation (https://www.apache.org/).

    Portions of this software were originally based on the following:
      - software copyright (c) 1999, IBM Corporation., https://www.ibm.com.
      - software copyright (c) 1999, Sun Microsystems., https://www.sun.com.
      - software copyright (c) 2000 World Wide Web Consortium, https://www.w3.org

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # Jackson JSON processor

      Jackson is a high-performance, Free/Open Source JSON processing library.
      It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
      been in development since 2007.
      It is currently developed by a community of developers, as well as supported
      commercially by FasterXML.com.

      ## Licensing

      Jackson core and extension components may licensed under different licenses.
      To find the details that apply to this artifact see the accompanying LICENSE file.
      For more information, including possible other licensing options, contact
      FasterXML.com (https://fasterxml.com).

      ## Credits

      A list of contributors may be found from CREDITS file, which is included
      in some artifacts (usually source distributions); but is always available
      from the source code management (SCM) system project uses.

  (ASLv2) Apache Thrift
    The following NOTICE information applies:
      Apache Thrift
      Copyright 2006-2010 The Apache Software Foundation.

  (ASLv2) Apache MINA
    The following NOTICE information applies:
      Apache MINA Core
      Copyright 2004-2011 Apache MINA Project

  (ASLv2) Apache Velocity
    The following NOTICE information applies:
      Apache Velocity
      Copyright (C) 2000-2007 The Apache Software Foundation

  (ASLv2) Apache Commons CLI
    The following NOTICE information applies:
      Apache Commons CLI
      Copyright 2001-2009 The Apache Software Foundation

  (ASLv2) Apache Commons Math
    The following NOTICE information applies:
      Apache Commons Math
      Copyright 2001-2012 The Apache Software Foundation

      This product includes software developed by
      The Apache Software Foundation (https://www.apache.org/).

      ===============================================================================

      The BracketFinder (package org.apache.commons.math3.optimization.univariate)
      and PowellOptimizer (package org.apache.commons.math3.optimization.general)
      classes are based on the Python code in module "optimize.py" (version 0.5)
      developed by Travis E. Oliphant for the SciPy library (https://www.scipy.org/)
      Copyright © 2003-2009 SciPy Developers.
      ===============================================================================

      The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
      RelationShip, SimplexSolver and SimplexTableau classes in package
      org.apache.commons.math3.optimization.linear include software developed by
      Benjamin McCann (https://www.benmccann.com) and distributed with
      the following copyright: Copyright 2009 Google Inc.
      ===============================================================================

      This product includes software developed by the
      University of Chicago, as Operator of Argonne National
      Laboratory.
      The LevenbergMarquardtOptimizer class in package
      org.apache.commons.math3.optimization.general includes software
      translated from the lmder, lmpar and qrsolv Fortran routines
      from the Minpack package
      Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
      ===============================================================================

      The GraggBulirschStoerIntegrator class in package
      org.apache.commons.math3.ode.nonstiff includes software translated
      from the odex Fortran routine developed by E. Hairer and G. Wanner.
      Original source copyright:
      Copyright (c) 2004, Ernst Hairer
      ===============================================================================

      The EigenDecompositionImpl class in package
      org.apache.commons.math3.linear includes software translated
      from some LAPACK Fortran routines.  Original source copyright:
      Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
      ===============================================================================

      The MersenneTwister class in package org.apache.commons.math3.random
      includes software translated from the 2002-01-26 version of
      the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
      Nishimura. Original source copyright:
      Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
      All rights reserved
      ===============================================================================

      The LocalizedFormatsTest class in the unit tests is an adapted version of
      the OrekitMessagesTest class from the orekit library distributed under the
      terms of the Apache 2 licence. Original source copyright:
      Copyright 2010 CS Systèmes d'Information
      ===============================================================================

      The HermiteInterpolator class and its corresponding test have been imported from
      the orekit library distributed under the terms of the Apache 2 licence. Original
      source copyright:
      Copyright 2010-2012 CS Systèmes d'Information
      ===============================================================================

      The creation of the package "o.a.c.m.analysis.integration.gauss" was inspired
      by an original code donated by Sébastien Brisard.
      ===============================================================================

  (ASLv2) Apache log4j
    The following NOTICE information applies:
      Apache log4j
      Copyright 2007 The Apache Software Foundation

  (ASLv2) Apache Tika
    The following NOTICE information applies:
      Apache Tika
      Copyright 2015 The Apache Software Foundation

      This product includes software developed at
      The Apache Software Foundation (https://www.apache.org/).

      Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
      This software contains code derived from UCAR/Unidata's NetCDF library.

      Tika-server component uses CDDL-licensed dependencies: jersey (https://jersey.java.net/) and
      Grizzly (https://grizzly.java.net/)

      Tika-parsers component uses CDDL/LGPL dual-licensed dependency: jhighlight (https://github.com/codelibs/jhighlight)

      OpenCSV: Copyright 2005 Bytecode Pty Ltd. Licensed under the Apache License, Version 2.0

      IPTC Photo Metadata descriptions Copyright 2010 International Press Telecommunications Council.

  (ASLv2) Apache Jakarta Commons Digester
    The following NOTICE information applies:
      Apache Jakarta Commons Digester
      Copyright 2001-2006 The Apache Software Foundation

  (ASLv2) Apache Commons BeanUtils
    The following NOTICE information applies:
      Apache Commons BeanUtils
      Copyright 2000-2008 The Apache Software Foundation

  (ASLv2) Apache Avro
    The following NOTICE information applies:
      Apache Avro
      Copyright 2009-2013 The Apache Software Foundation

  (ASLv2) Snappy Java
    The following NOTICE information applies:
      This product includes software developed by Google
       Snappy: https://code.google.com/p/snappy/ (New BSD License)

      This product includes software developed by Apache
       PureJavaCrc32C from apache-hadoop-common https://hadoop.apache.org/
       (Apache 2.0 license)

      This library containd statically linked libstdc++. This inclusion is allowed by
      "GCC RUntime Library Exception"
      https://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

  (ASLv2) Apache Lucene
    The following NOTICE information applies:
      Apache Lucene
      Copyright 2014 The Apache Software Foundation

      Includes software from other Apache Software Foundation projects,
      including, but not limited to:
       - Apache Ant
       - Apache Jakarta Regexp
       - Apache Commons
       - Apache Xerces

      ICU4J, (under analysis/icu) is licensed under an MIT styles license
      and Copyright (c) 1995-2008 International Business Machines Corporation and others

      Some data files (under analysis/icu/src/data) are derived from Unicode data such
      as the Unicode Character Database. See https://unicode.org/copyright.html for more
      details.

      Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is
      BSD-licensed, created by Anders Møller. See https://www.brics.dk/automaton/

      The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
      automatically generated with the moman/finenight FSA library, created by
      Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
      see https://sites.google.com/site/rrettesite/moman and
      https://bitbucket.org/jpbarrette/moman/overview/

      The class org.apache.lucene.util.WeakIdentityMap was derived from
      the Apache CXF project and is Apache License 2.0.

      The Google Code Prettify is Apache License 2.0.
      See https://code.google.com/p/google-code-prettify/

      JUnit (junit-4.10) is licensed under the Common Public License v. 1.0
      See https://junit.sourceforge.net/cpl-v10.html

      This product includes code (JaspellTernarySearchTrie) from Java Spelling Checkin
      g Package (jaspell): https://jaspell.sourceforge.net/
      License: The BSD License (https://www.opensource.org/licenses/bsd-license.php)

      The snowball stemmers in
        analysis/common/src/java/net/sf/snowball
      were developed by Martin Porter and Richard Boulton.
      The snowball stopword lists in
        analysis/common/src/resources/org/apache/lucene/analysis/snowball
      were developed by Martin Porter and Richard Boulton.
      The full snowball package is available from
        https://snowball.tartarus.org/

      The KStem stemmer in
        analysis/common/src/org/apache/lucene/analysis/en
      was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
      under the BSD-license.

      The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
      stopword list that is BSD-licensed created by Jacques Savoy.  These files reside in:
      analysis/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/fa/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/ro/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/bg/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/hi/stopwords.txt
      See https://members.unine.ch/jacques.savoy/clef/index.html.

      The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
      (common) are based on BSD-licensed reference implementations created by Jacques Savoy and
      Ljiljana Dolamic. These files reside in:
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemmer.java

      The Stempel analyzer (stempel) includes BSD-licensed software developed
      by the Egothor project https://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
      and Edmond Nolan.

      The Polish analyzer (stempel) comes with a default
      stopword list that is BSD-licensed created by the Carrot2 project. The file resides
      in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
      See https://project.carrot2.org/license.html.

      The SmartChineseAnalyzer source code (smartcn) was
      provided by Xiaoping Gao and copyright 2009 by www.imdict.net.

      WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/)
      is derived from Unicode data such as the Unicode Character Database.
      See https://www.unicode.org/copyright.html for more details.

      The Morfologik analyzer (morfologik) includes BSD-licensed software
      developed by Dawid Weiss and Marcin Miłkowski (https://morfologik.blogspot.com/).

      Morfologik uses data from Polish ispell/myspell dictionary
      (https://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
      LGPL and Creative Commons ShareAlike.

      Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
      (https://sgjp.pl/morfeusz/)

      Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
      source code for this can be found at https://www.eclipse.org/jetty/downloads.php

      ===========================================================================
      Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
      ===========================================================================

      This software includes a binary and/or source version of data from

        mecab-ipadic-2.7.0-20070801

      which can be obtained from

        https://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz

      or

        https://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz

      ===========================================================================
      mecab-ipadic-2.7.0-20070801 Notice
      ===========================================================================

      Nara Institute of Science and Technology (NAIST),
      the copyright holders, disclaims all warranties with regard to this
      software, including all implied warranties of merchantability and
      fitness, in no event shall NAIST be liable for
      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 tortuous action, arising out
      of or in connection with the use or performance of this software.

      A large portion of the dictionary entries
      originate from ICOT Free Software.  The following conditions for ICOT
      Free Software applies to the current dictionary as well.

      Each User may also freely distribute the Program, whether in its
      original form or modified, to any third party or parties, PROVIDED
      that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
      on, or be attached to, the Program, which is distributed substantially
      in the same form as set out herein and that such intended
      distribution, if actually made, will neither violate or otherwise
      contravene any of the laws and regulations of the countries having
      jurisdiction over the User or the intended distribution itself.

      NO WARRANTY

      The program was produced on an experimental basis in the course of the
      research and development conducted during the project and is provided
      to users as so produced on an experimental basis.  Accordingly, the
      program is provided without any warranty whatsoever, whether express,
      implied, statutory or otherwise.  The term "warranty" used herein
      includes, but is not limited to, any warranty of the quality,
      performance, merchantability and fitness for a particular purpose of
      the program and the nonexistence of any infringement or violation of
      any right of any third party.

      Each user of the program will agree and understand, and be deemed to
      have agreed and understood, that there is no warranty whatsoever for
      the program and, accordingly, the entire risk arising from or
      otherwise connected with the program is assumed by the user.

      Therefore, neither ICOT, the copyright holder, or any other
      organization that participated in or was otherwise related to the
      development of the program and their respective officials, directors,
      officers and other employees shall be held liable for any and all
      damages, including, without limitation, general, special, incidental
      and consequential damages, arising out of or otherwise in connection
      with the use or inability to use the program or any product, material
      or result produced or otherwise obtained by using the program,
      regardless of whether they have been advised of, or otherwise had
      knowledge of, the possibility of such damages at any time during the
      project or thereafter.  Each user will be deemed to have agreed to the
      foregoing by his or her commencement of use of the program.  The term
      "use" as used herein includes, but is not limited to, the use,
      modification, copying and distribution of the program and the
      production of secondary products from the program.

      In the case where the program, whether in its original form or
      modified, was distributed or delivered to or received by a user from
      any person, organization or entity other than ICOT, unless it makes or
      grants independently of ICOT any specific warranty to the user in
      writing, such person, organization or entity, will also be exempted
      from and not be held liable to the user for any such damages as noted
      above as far as the program is concerned.

  (ASLv2) Joda Time
    The following NOTICE information applies:
      This product includes software developed by
      Joda.org (https://www.joda.org/).

  (ASLv2) Apache ActiveMQ
    The following NOTICE information applies:
      ActiveMQ :: Client
      Copyright 2005-2015 The Apache Software Foundation

  (ASLv2) Apache Geronimo
    The following NOTICE information applies:
      Apache Geronimo
      Copyright 2003-2008 The Apache Software Foundation

  (ASLv2) Google GSON
    The following NOTICE information applies:
      Copyright 2008 Google Inc.

  (ASLv2) JSON-SMART
    The following NOTICE information applies:
      Copyright 2011 JSON-SMART authors

   (ASLv2) JsonPath
     The following NOTICE information applies:
       Copyright 2011 JsonPath authors

   (ASLv2) Apache Commons DBCP
      The following NOTICE information applies:
        Apache Commons DBCP
        Copyright 2001-2015 The Apache Software Foundation.

   (ASLv2) Apache Commons Pool
      The following NOTICE information applies:
        Apache Commons Pool
        Copyright 1999-2009 The Apache Software Foundation.

    (ASLv2) Apache Derby
      The following NOTICE information applies:
        Apache Derby
        Copyright 2004-2014 Apache, Apache DB, Apache Derby, Apache Torque, Apache JDO, Apache DDLUtils,
        the Derby hat logo, the Apache JDO logo, and the Apache feather logo are trademarks of The Apache Software Foundation.

    (ASLv2) The Netty Project
      The following NOTICE information applies:
        The Netty Project
        Copyright 2011 The Netty Project

    (ASLv2) Apache Xerces Java
      The following NOTICE information applies:
        Apache Xerces Java
        Copyright 1999-2007 The Apache Software Foundation

        This product includes software developed at
        The Apache Software Foundation (https://www.apache.org/).

        Portions of this software were originally based on the following:
          - software copyright (c) 1999, IBM Corporation., https://www.ibm.com.
          - software copyright (c) 1999, Sun Microsystems., https://www.sun.com.
          - voluntary contributions made by Paul Eng on behalf of the
            Apache Software Foundation that were originally developed at iClick, Inc.,
            software copyright (c) 1999.

  (ASLv2) Apache ZooKeeper
    The following NOTICE information applies:
      Apache ZooKeeper
      Copyright 2009-2012 The Apache Software Foundation

  (ASLv2) Swagger Core
    The following NOTICE information applies:
      Swagger Core 1.5.3-M1
      Copyright 2015 Reverb Technologies, Inc.


  (ASLv2) HBase Common
    The following NOTICE information applies:
      This product includes portions of the Guava project v14, specifically
      'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'

      Copyright (C) 2007 The Guava Authors

      Licensed under the Apache License, Version 2.0

  (ASLv2) HTrace Core
    The following NOTICE information applies:
      In addition, this product includes software dependencies. See
      the accompanying LICENSE.txt for a listing of dependencies
      that are NOT Apache licensed (with pointers to their licensing)

      Apache HTrace includes an Apache Thrift connector to Zipkin. Zipkin
      is a distributed tracing system that is Apache 2.0 Licensed.
      Copyright 2012 Twitter, Inc.

  (ASLv2) Jettison
    The following NOTICE information applies:
         Copyright 2006 Envoi Solutions LLC

    (ASLv2) Apache Curator
      The following NOTICE information applies:
        Curator Framework
        Copyright 2011-2014 The Apache Software Foundation

        Curator Client
        Copyright 2011-2014 The Apache Software Foundation

        Curator Recipes
        Copyright 2011-2014 The Apache Software Foundation


    (ASLv2) Quartz
      The following NOTICE information applies:
        Copyright Declaration:
        Copyright © 2003-2016 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.

        Trademark and Patent declaration
        The name Software AG and all Software AG product names are either trademarks or registered trademarks of Software AG and/or Software AG USA Inc. and/or its subsidiaries and/or its affiliates
        and/or their licensors. Other company and product names mentioned herein may be trademarks of their respective owners.

        Detailed information on trademarks and patents owned by Software AG and/or its subsidiaries is located at https://softwareag.com/licenses.

        Third Party declaration
        This software may include portions of third-party products. For third-party copyright notices, license terms, additional rights or restrictions, please refer to "License Texts, Copyright
        Notices and Disclaimers of Third Party Products". For certain specific third-party license restrictions, please refer to section E of the Legal Notices available under "License Terms and
        Conditions for Use of Software AG Products / Copyright and Trademark Notices of Software AG Products". These documents are part of the product documentation, located at
        https://softwareag.com/licenses and/or in the root installation directory of the licensed product(s).

        Confidentiality Disclaimer:
        Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG.
        Contact GitHub API Training Shop Blog About

************************
Common Development and Distribution License 1.1
************************

The following binary components are provided under the Common Development and Distribution License 1.1. See project link for details.

    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-entity-filtering (org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-hk2 (org.glassfish.jersey.inject:jersey-hk2:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-json-jackson (org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-api (org.glassfish.hk2:hk2-api:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-utils (org.glassfish.hk2:hk2-utils:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-locator (org.glassfish.hk2:hk2-locator:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance-repackaged (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.5.0-b42 - https://hk2.java.net/external/javax.inject)

    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - https://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) JSP Implementation (org.glassfish.web:javax.servlet.jsp:jar:2.3.2 - https://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages (TM) TagLib Implementation (org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.2 - https://jstl.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 (org.glassfish:javax.el:jar:3.0.0 - https://el-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) API (javax.servlet.jsp:javax.servlet.jsp-api:jar:2.3.1 - https://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 API  (javax.el:javax.el-api:jar:3.0.0 - https://uel-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) Standard Tag Library API  (javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:jar:1.2.1 - https://jcp.org/en/jsr/detail?id=52)
    (CDDL 1.1) (GPL2 w/ CPE) Java Servlet API  (javax.servlet:javax.servlet-api:jar:3.1.0 - https://servlet-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Javax JMS Api (javax.jms:javax.jms-api:jar:2.0.1 - https://java.net/projects/jms-spec/pages/Home)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing API (javax.json:javax.json-api:jar:1.0 - https://json-processing-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing Default Provider (org.glassfish:javax.json:jar:1.0.4 - https://jsonp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) OSGi resource locator bundle (org.glassfish.hk2:osgi-resource-locator:jar:1.0.1 - https://glassfish.org/osgi-resource-locator)
    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API (javax.annotation:javax.annotation-api:jar:1.2 - https://jcp.org/en/jsr/detail?id=250)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - https://jax-rs-spec.java.net)

************************
Common Development and Distribution License 1.0
************************

The following binary components are provided under the Common Development and Distribution License 1.0. See project link for details.

    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - https://java.sun.com/products/javabeans/jaf/index.jsp)
    (CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-2 - no url provided)

************************
Eclipse Public License 1.0
************************

The following binary components are provided under the Eclipse Public License 1.0.  See project link for details.

    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.8.5 - https://www.aspectj.org)
    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - https://www.h2database.com/html/license.html)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.1.8 - https://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.1.8 - https://logback.qos.ch/)

*****************
Mozilla Public License v2.0
*****************

The following binary components are provided under the Mozilla Public License v2.0.  See project link for details.

    (MPL 2.0) Saxon HE (net.sf.saxon:Saxon-HE:jar:9.6.0-5 - https://www.saxonica.com/)

*****************
Mozilla Public License v1.1
*****************

The following binary components are provided under the Mozilla Public License v1.1.  See project link for details.

    (MPL 1.1) HAPI Base (ca.uhn.hapi:hapi-base:2.2 - https://hl7api.sourceforge.net/)
    (MPL 1.1) HAPI Structures (ca.uhn.hapi:hapi-structures-v*:2.2 - https://hl7api.sourceforge.net/)

*****************
Public Domain
*****************

The following binary components are provided to the 'Public Domain'.  See project link for details.

    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.5 - https://tukaani.org/xz/java.html
    (Public Domain) AOP Alliance 1.0 (https://aopalliance.sourceforge.net/)

The following binary components are provided under the Creative Commons Zero license version 1.0.  See project link for details.

    (CC0v1.0) JSR166e for Twitter (com.twitter:jsr166e:jar:1.1.0 - https://github.com/twitter/jsr166e)
