Apache NiFi MiNiFi
Copyright 2014-2017 The Apache Software Foundation

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

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

This product includes the following work from the Apache Kafka project:
S3OutputStream.java

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

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

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

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

        BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

        This includes derived works from the Apache Software License V2 library python-evtx (https://github.com/williballenthin/python-evtx)
        Copyright 2012, 2013 Willi Ballenthin william.ballenthin@mandiant.com
        while at Mandiant http://www.mandiant.com
        The derived work is adapted from Evtx/Evtx.py, Evtx/BinaryParser.py, Evtx/Nodes.py, Evtx/Views.py and can be found in the org.apache.nifi.processors.evtx.parser package.



        This includes derived works from the Apache Storm (ASLv2 licensed) project (https://github.com/apache/storm):
        Copyright 2015 The Apache Software Foundation
        The derived work is adapted from
          org/apache/storm/hive/common/HiveWriter.java
          org/apache/storm/hive/common/HiveOptions.java
        and can be found in the org.apache.nifi.util.hive package

        This includes derived works from the Apache Hive (ASLv2 licensed) project (https://github.com/apache/hive):
        Copyright 2008-2017 The Apache Software Foundation
        The derived work is adapted from
          release-1.2.1/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
        and can be found in the org.apache.hadoop.hive.ql.io.orc package

  (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 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 http://stevemorse.org/phoneticinfo.htm
      with permission from the original authors.
      Original source copyright:
      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

  (ASLv2) AWS Java SDK
    The following NOTICE information applies:
      Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.

      This product includes software developed by
      Amazon Technologies, Inc (http://www.amazon.com/).

      **********************
      THIRD PARTY COMPONENTS
      **********************
      This software includes third party software subject to the following copyrights:
      - XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
      - PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

      The licenses for these third party components are included in LICENSE.txt

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

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

  (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 (http://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 Commons Collections
    The following NOTICE information applies:
      Apache Commons Collections
      Copyright 2001-2013 The Apache Software Foundation

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

  (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 http://www.jcip.net

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

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

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

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

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

    (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 http://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
        http://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

  (ASLv2) Jasypt
    The following NOTICE information applies:
	  Copyright (c) 2007-2010, The JASYPT team (http://www.jasypt.org)

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

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

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

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

  (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

************************
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) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.19 - https://jersey.java.net/jersey-json/)
    (CDDL 1.1) (GPL2 w/ CPE) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.2.3-1 - http://jaxb.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) Java Architecture For XML Binding (javax.xml.bind:jaxb-api:jar:2.2.2 - https://jaxb.dev.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.4.0-b25 - https://hk2.java.net/external/aopalliance-repackaged)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.19 - https://jersey.java.net/jersey-core/)


************************
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 - http://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)
    (CDDL 1.0) JSR311 API (javax.ws.rs:jsr311-api:jar:1.1.1 - https://jsr311.dev.java.net)


************************
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 - http://www.eclipse.org/aspectj/)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.1.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.1.3 - http://logback.qos.ch/)
    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html)
