Apache Edgent
Copyright 2016-2017 The Apache Software Foundation

Apache Edgent is currently undergoing Incubation at the Apache Software Foundation.

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

Portions of this bundle were developed by IBM Corp.
Copyright IBM Corp. 2015, 2016

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

APACHE EDGENT SUBCOMPONENTS:

This Apache Edgent binary release includes a number of subcomponents with
separate copyright notices and license terms.  The following notices apply.

--------------------------------
ext/    # common dependencies for all Edgent components
  metrics-core-3.1.2.jar            io.dropwizard.metrics:metrics-core:3.1.2
                                    See licenses/binary-release/metrics-core-3.1.2.NOTICE

--------------------------------
analytics/math3/ext/
  commons-math3-3.4.1.jar           org.apache.commons:commons-math3:3.4.1
                                    See licenses/binary-release/commons-math3-3.4.1.NOTICE

--------------------------------
connectors/http/ext
  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
                                    See licenses/binary-release/httpclient-4.5.1.NOTICE
                                    
  httpcore-4.4.4.jar                org.apache.httpcomponents:httpcore:4.4.4
                                    See licenses/binary-release/httpcore-4.4.4.NOTICE
                                    
  commons-codec-1.9.jar             org.apache.commons:commons-codec:1.9
                                    See licenses/binary-release/commons-codec-1.9.NOTICE
                                    
  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
                                    See licenses/binary-release/commons-logging-1.2.NOTICE
        
--------------------------------
connectors/iotp/ext
  commons-codec-1.10.jar            org.apache.commons:commons-codec:1.10
                                    See licenses/binary-release/commons-codec-1.10.NOTICE
                                    
  commons-lang3-3.4.jar             org.apache.commons:commons-lang3:3.4
                                    See licenses/binary-release/commons-lang3-3.4.NOTICE
                                    
  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
                                    See licenses/binary-release/commons-logging-1.2.NOTICE
                                    
  commons-net-3.3.jar               org.apache.commons:commons-net:3.3
                                    See licenses/binary-release/commons-net-3.3.NOTICE
                                    
  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
                                    See licenses/binary-release/httpclient-4.5.1.NOTICE
                                    
  httpcore-4.4.3.jar                org.apache.httpcomponents:httpcore:4.4.3
                                    See licenses/binary-release/httpcore-4.4.3.NOTICE
                                    
  joda-time-2.9.2.jar               joda-time:joda-time:2.9.2
                                    See licenses/binary-release/joda-time-2.9.2.NOTICE
                                    
  log4j-1.2.17.jar                  log4j:log4j:1.2.17
                                    See licenses/binary-release/log4j-1.2.17.NOTICE
        
--------------------------------
connectors/kafka/ext
  kafka-clients-0.8.2.2.jar         org.apache.kafka:kafka-clients:0.8.2.2
                                    See licenses/binary-release/kafka-clients-0.8.2.2.NOTICE
                                    
  kafka_2.10-0.8.2.2.jar            org.apache.kafka:kafka_2.10:0.8.2.2
                                    See licenses/binary-release/kafka_2.10-0.8.2.2.NOTICE
                                    
  log4j-1.2.16.jar                  log4j:log4j:1.2.16
                                    See licenses/binary-release/log4j-1.2.16.NOTICE
                                    
  metrics-core-2.2.0.jar            com.yammer.metrics:metrics-core:2.2.0
                                    See licenses/binary-release/metrics-core-2.2.0.NOTICE
    
--------------------------------
    