Notice: |

  Apache Brooklyn
  Copyright 2014-2020 The Apache Software Foundation

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

  This software is released under the Apache Software License, verison 2.0.
  This license and the licenses for all dependencies are included below
  following the dependencies and their notices.

Source dependencies:

  # This software includes the following third-party components in its source code.
  # Additional runtime dependencies are required when built and are listed in the subsequent section.

  font-awesome-fonts: 
    Project:      Font Awesome (fonts)
    Version:      4.5.0
    Available at: http://fontawesome.io/
    Inclusive of: font-awesome/fonts/* cluster.svg
    License name: SIL OFL 1.1
    Notice:       Copyright (c) Dave Gandy (2016)
  
  noun-project-icons: 
    Project:      The Noun Project (icons)
    Available at: https://thenounproject.com/
    Inclusive of: service-restarter.png, autoscaler.png, and others
    License name: Creative Commons Public License, Attribution 3.0
    Notice:       Includes icons by Evan Shuster, Sarah Joy, Jack Zwanenburg
  
  tango-project-icons: 
    Project:      Tango Project Icons
    Available at: https://commons.wikimedia.org/wiki/File:Network-server.svg
    License name: Public Domain
    Notice:       Released into the public domain by the people from the Tango! project (The Tango! Desktop Project), via Wikimedia Commons
  
  typeahead.js: 
    Project:      Typeahead JS
    Version:      0.10.5
    Available at: https://github.com/twitter/typeahead.js
    Developed by: Twitter, Inc (http://twitter.com)
    License name: MIT License
    Notice:       Copyright (c) Twitter, Inc. and other contributors (2013-2014)
  
  underscore.js:1.7.0: 
    Project:      Underscore JS
    Version:      1.7.0
    Available at: http://underscorejs.org
    Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
    Inclusive of: underscore*.{js,map}
    License name: MIT License
    Notice:       Copyright (c) Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (2009-2014)
  

Runtime dependencies:

  # This software depends on additional third-party components at runtime.
  # These are not bundled here but may be included as part of a build.

  aopalliance:1.0: 
    Project:      AOP alliance
    Version:      1.0
    Available at: http://aopalliance.sourceforge.net
    License name: Public Domain
  
  ch.qos.logback:1.2.9: 
    Project:      Logback Logging Framework
    Version:      1.2.9
    Available at: http://logback.qos.ch
    Developed by: QOS.ch (http://www.qos.ch)
    License name: Eclipse Public License, version 1.0
  
  com.fasterxml.jackson:2.16.1: 
    Project:      Jackson FasterXML
    Version:      2.16.1
    Available at: https://github.com/FasterXML/jackson
    Developed by: FasterXML (http://fasterxml.com/)
    Licenses: 
      -
        License name: Apache License, version 2.0
      -
        License name: Apache License, version 2.0
  
  com.fasterxml.woodstox.woodstox-core:6.4.0: 
    Project:      Woodstox
    Version:      6.4.0
    Available at: https://github.com/FasterXML/woodstox
    Developed by: FasterXML (http://fasterxml.com)
    License name: Apache License, version 2.0
  
  com.github.mifmif.generex:1.0.2: 
    Project:      Generex
    Version:      1.0.2
    Available at: https://github.com/mifmif/Generex/tree/master
    License name: Apache License, version 2.0
  
  com.google.code.gson:2.8.9: 
    Project:      Gson
    Version:      2.8.9
    Available at: https://github.com/google/gson
    License name: Apache License, version 2.0
  
  com.google.errorprone.error_prone_annotations:2.2.0: 
    Project:      error-prone annotations
    Version:      2.2.0
    Available at: http://nexus.sonatype.org/oss-repository-hosting.html
    License name: Apache License, version 2.0
  
  com.google.guava.failureaccess:1.0.1: 
    Project:      Guava InternalFutureFailureAccess and InternalFutures
    Version:      1.0.1
    Available at: https://github.com/google/guava
    License name: Apache License, version 2.0
  
  com.google.guava.listenablefuture:9999.0-empty-to-avoid-conflict-with-guava: 
    Project:      Guava ListenableFuture only
    Version:      9999.0-empty-to-avoid-conflict-with-guava
    Available at: https://github.com/google/guava
    License name: Apache License, version 2.0
  
  com.google.guava:27.1-jre: 
    Project:      "Guava: Google Core Libraries for Java"
    Version:      27.1-jre
    Available at: https://github.com/google/guava
    License name: Apache License, version 2.0
  
  com.google.inject.guice:4.2.3: 
    Project:      Google Guice
    Version:      4.2.3
    Available at: https://github.com/google/guice
    Developed by: Google, Inc. (http://www.google.com)
    License name: Apache License, version 2.0
  
  com.google.inject:4.2.3: 
    Project:      Google Guice
    Version:      4.2.3
    Available at: https://github.com/google/guice
    Developed by: Google, Inc. (http://www.google.com)
    License name: Apache License, version 2.0
  
  com.google.j2objc.j2objc-annotations:1.1: 
    Project:      J2ObjC Annotations
    Version:      1.1
    Available at: https://github.com/google/j2objc/
    License name: Apache License, version 2.0
  
  com.hierynomus.asn-one:0.6.0: 
    Project:      asn-one
    Version:      0.6.0
    Available at: https://github.com/hierynomus/asn-one
    License name: Apache License, version 2.0
  
  com.hierynomus.sshj:0.34.0: 
    Project:      sshj
    Version:      0.34.0
    Available at: https://github.com/hierynomus/sshj
    License name: Apache License, version 2.0
  
  com.jayway.jsonpath.json-path:2.4.0: 
    Project:      project ':json-path'
    Version:      2.4.0
    Available at: https://github.com/jayway/JsonPath
    License name: Apache License, version 2.0
  
  com.jcraft.jzlib:1.1.3: 
    Project:      JZlib
    Version:      1.1.3
    Available at: http://www.jcraft.com/jzlib/
    Developed by: jcraft (http://www.jcraft.com/)
    License name: BSD 3-Clause (New BSD) License
    Notice:       Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
  
  com.jcraft:0.0.9: 
    Project:      JCraft jsch ssh library
    Version:      0.0.9
    Available at: http://www.jcraft.com/jsch-agent-proxy/
    Developed by: JCraft,Inc. (http://www.jcraft.com/)
    License name: BSD 3-Clause (New BSD) License
    Notice:       Copyright (c) 2011-2012 Atsuhiko Yamanaka, JCraft,Inc.
  
  com.maxmind.db.maxmind-db:1.2.1: 
    Project:      MaxMind DB Reader
    Version:      1.2.1
    Available at: http://dev.maxmind.com/
    Developed by: MaxMind, Inc. (http://www.maxmind.com/)
    License name: Apache License, version 2.0
  
  com.maxmind.geoip2:2.8.0-rc1: 
    Project:      MaxMind GeoIP2 API
    Version:      2.8.0-rc1
    Available at: http://dev.maxmind.com/geoip/geoip2/web-services
    Developed by: MaxMind, Inc. (http://www.maxmind.com/)
    License name: Apache License, version 2.0
  
  com.squareup.okhttp3.logging-interceptor:3.12.12: 
    Project:      OkHttp Logging Interceptor
    Version:      3.12.12
    Available at: https://github.com/square/okhttp
    License name: Apache License, version 2.0
  
  com.squareup.okhttp3.okhttp:3.14.9: 
    Project:      OkHttp
    Version:      3.14.9
    Available at: https://github.com/square/okhttp
    License name: Apache License, version 2.0
  
  com.squareup.okio:1.15.0: 
    Project:      Okio
    Version:      1.15.0
    Available at: https://github.com/square/okio
    License name: Apache License, version 2.0
    Notice:       Copyright (c) Square, Inc.
  
  com.sun.xml.bind.jaxb-impl:2.3.3: 
    Project:      Old JAXB Runtime
    Version:      2.3.3
    Available at: https://eclipse-ee4j.github.io/jaxb-ri
    Developed by: Eclipse Foundation (https://www.eclipse.org)
    License name: Common Development and Distribution License, version 1.1
  
  com.thoughtworks.xstream:1.4.19: 
    Project:      XStream Core
    Version:      1.4.19
    Available at: http://x-stream.github.io/
    Developed by: XStream (http://x-stream.github.io)
    License name: BSD 3-Clause (New BSD) License
  
  commons-beanutils:1.9.4: 
    Project:      Apache Commons BeanUtils
    Version:      1.9.4
    Available at: https://commons.apache.org/proper/commons-beanutils/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  commons-codec:1.15: 
    Project:      Apache Commons Codec
    Version:      1.15
    Available at: https://commons.apache.org/proper/commons-codec/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  commons-collections:3.2.2: 
    Project:      Apache Commons Collections
    Version:      3.2.2
    Available at: http://commons.apache.org/collections/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  commons-io:2.11.0: 
    Project:      Apache Commons IO
    Version:      2.11.0
    Available at: https://commons.apache.org/proper/commons-io/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  commons-lang:2.4: 
    Project:      Commons Lang
    Version:      2.4
    Available at: http://commons.apache.org/lang/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  commons-logging:1.2: 
    Project:      Apache Commons Logging
    Version:      1.2
    Available at: http://commons.apache.org/proper/commons-logging/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  dk.brics.automaton:1.11-8: 
    Project:      Automaton
    Version:      1.11-8
    Available at: http://www.brics.dk/automaton/
    License name: BSD 2-Clause (Simplified or FreeBSD) License
  
  io.airlift.airline:0.7: 
    Project:      airline
    Version:      0.7
    Available at: https://github.com/airlift/airline
    License name: Apache License, version 2.0
  
  io.cloudsoft.windows:0.12.3: 
    Project: 
      - Java WinRM library
      - WinRM Client
    Version:      0.12.3
    Available at: http://github.com/cloudsoft/winrm4j
    License name: Apache License, version 2.0
  
  io.fabric8.zjsonpatch:0.3.0: 
    Project:      zjsonpatch
    Version:      0.3.0
    Available at: https://github.com/fabric8io/zjsonpatch/
    License name: Apache License, version 2.0
  
  io.fabric8:6.8.1: 
    Project: 
      - "Fabric8 :: Kubernetes :: HttpClient :: OkHttp"
      - "Fabric8 :: Kubernetes :: Java Client"
      - "Fabric8 :: Kubernetes :: Java Client API"
      - "Fabric8 :: Kubernetes Model :: API Extensions"
      - "Fabric8 :: Kubernetes Model :: Admission Registration, Authentication and Authorization"
      - "Fabric8 :: Kubernetes Model :: Apps"
      - "Fabric8 :: Kubernetes Model :: Autoscaling"
      - "Fabric8 :: Kubernetes Model :: Batch"
      - "Fabric8 :: Kubernetes Model :: Certificates"
      - "Fabric8 :: Kubernetes Model :: Common"
      - "Fabric8 :: Kubernetes Model :: Coordination"
      - "Fabric8 :: Kubernetes Model :: Core"
      - "Fabric8 :: Kubernetes Model :: Discovery"
      - "Fabric8 :: Kubernetes Model :: Events"
      - "Fabric8 :: Kubernetes Model :: Extensions"
      - "Fabric8 :: Kubernetes Model :: FlowControl"
      - "Fabric8 :: Kubernetes Model :: Metrics"
      - "Fabric8 :: Kubernetes Model :: Networking"
      - "Fabric8 :: Kubernetes Model :: Node"
      - "Fabric8 :: Kubernetes Model :: Policy"
      - "Fabric8 :: Kubernetes Model :: RBAC"
      - "Fabric8 :: Kubernetes Model :: Resource"
      - "Fabric8 :: Kubernetes Model :: Scheduling"
      - "Fabric8 :: Kubernetes Model :: Sigs :: Gateway API"
      - "Fabric8 :: Kubernetes Model :: Storage Class"
      - "Fabric8 :: OpenShift Cluster Autoscaler Operator Model"
      - "Fabric8 :: OpenShift Config Model"
      - "Fabric8 :: OpenShift Console Model"
      - "Fabric8 :: OpenShift Hive Model"
      - "Fabric8 :: OpenShift Installer Model"
      - "Fabric8 :: OpenShift Kube Storage Version Migrator Model"
      - "Fabric8 :: OpenShift Machine API Operator Model"
      - "Fabric8 :: OpenShift Machine Config Operator Model"
      - "Fabric8 :: OpenShift Miscellaneous Operators Model"
      - "Fabric8 :: OpenShift Model"
      - "Fabric8 :: OpenShift Monitoring Model"
      - "Fabric8 :: OpenShift Node Tuning Operator Model"
      - "Fabric8 :: OpenShift Operator Model"
      - "Fabric8 :: OpenShift OperatorHub Model"
      - "Fabric8 :: OpenShift Whereabouts CNI Model"
      - "Fabric8 :: Openshift :: Java Client"
      - "Fabric8 :: Openshift :: Java Client API"
    Version:      6.8.1
    Available at: http://fabric8.io/
    Developed by: Red Hat (http://redhat.com)
    License name: Apache License, version 2.0
  
  io.github.x-stream.mxparser:1.2.2: 
    Project:      MXParser
    Version:      1.2.2
    Available at: http://x-stream.github.io/mxparser
    License name: Indiana University Extreme! Lab Software License, version 1.2
    Notice:       Copyright (c) Extreme! Lab, Indiana University
  
  io.swagger:1.6.2: 
    Project: 
      - swagger-annotations
      - swagger-core
      - swagger-jaxrs
      - swagger-models
    Version:      1.6.2
    Available at: https://github.com/swagger-api/swagger-core
    License name: Apache License, version 2.0
  
  jakarta.activation.jakarta.activation-api:1.2.2: 
    Project:      Jakarta Activation API jar
    Version:      1.2.2
    Available at: https://github.com/eclipse-ee4j/jaf
    Developed by: Eclipse Foundation (https://www.eclipse.org)
    License name: Eclipse Distribution License, version 1.0
  
  jakarta.annotation.jakarta.annotation-api:1.3.5: 
    Project:      Jakarta Annotations API
    Version:      1.3.5
    Available at: https://projects.eclipse.org/projects/ee4j.ca
    Developed by: Eclipse Foundation (https://www.eclipse.org)
    License name: Eclipse Public License, version 2.0
  
  jakarta.ws.rs.jakarta.ws.rs-api:2.1.6: 
    Project:      jakarta.ws.rs-api
    Version:      2.1.6
    Available at: https://github.com/eclipse-ee4j/jaxrs-api
    Developed by: Eclipse Foundation (https://www.eclipse.org/org/foundation/)
    License name: Eclipse Public License, version 2.0
  
  jakarta.xml.bind.jakarta.xml.bind-api:2.3.3: 
    Project:      Jakarta XML Binding API
    Version:      2.3.3
    Available at: https://github.com/eclipse-ee4j/jaxb-api
    Developed by: Eclipse Foundation (https://www.eclipse.org)
    License name: Eclipse Distribution License, version 1.0
  
  javax.annotation.jsr250-api:1.0: 
    Project:      JSR-250 Common Annotations for the JavaTM Platform
    Version:      1.0
    Available at: https://jcp.org/en/jsr/detail?id=250
    License name: Common Development and Distribution License, version 1.0
  
  javax.inject:1: 
    Project:      javax.inject
    Version:      1
    Available at: http://code.google.com/p/atinject/
    License name: Apache License, version 2.0
  
  javax.servlet.javax.servlet-api:3.1.0: 
    Project:      Java Servlet API
    Version:      3.1.0
    Available at: http://servlet-spec.java.net
    Developed by: GlassFish Community (https://glassfish.dev.java.net)
    License name: Common Development and Distribution License, version 1.1
  
  javax.validation.validation-api:1.1.0.Final: 
    Project:      Bean Validation API
    Version:      1.1.0.Final
    Available at: http://beanvalidation.org/
    License name: Apache License, version 2.0
  
  javax.ws.rs.javax.ws.rs-api:2.1.1: 
    Project:      javax.ws.rs-api
    Version:      2.1.1
    Available at: https://github.com/eclipse-ee4j/jaxrs-api
    Developed by: Eclipse Foundation (https://www.eclipse.org/org/foundation/)
    License name: Common Development and Distribution License, version 1.1
  
  joda-time:2.10.14: 
    Project:      Joda-Time
    Version:      2.10.14
    Available at: https://www.joda.org/joda-time/
    Developed by: Joda.org (https://www.joda.org)
    License name: Apache License, version 2.0
  
  net.i2p.crypto.eddsa:0.3.0: 
    Project:      EdDSA-Java
    Version:      0.3.0
    Available at: https://github.com/str4d/ed25519-java
    License name: CC0 1.0 Universal
  
  net.java.dev.jna:5.9.0: 
    Project: 
      - Java Native Access
      - Java Native Access Platform
    Version:      5.9.0
    Available at: https://github.com/java-native-access/jna
    License name: Apache License, version 2.0
  
  net.minidev.accessors-smart:2.4.9: 
    Project:      ASM based accessors helper used by json-smart
    Version:      2.4.9
    Available at: https://urielch.github.io/
    Developed by: Chemouni Uriel (https://urielch.github.io/)
    License name: Apache License, version 2.0
  
  net.minidev.json-smart:2.4.10: 
    Project:      JSON Small and Fast Parser
    Version:      2.4.10
    Available at: https://urielch.github.io/
    Developed by: Chemouni Uriel (https://urielch.github.io/)
    License name: Apache License, version 2.0
  
  org.apache.commons.commons-compress:1.21: 
    Project:      Apache Commons Compress
    Version:      1.21
    Available at: https://commons.apache.org/proper/commons-compress/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.commons.commons-lang3:3.12.0: 
    Project:      Apache Commons Lang
    Version:      3.12.0
    Available at: https://commons.apache.org/proper/commons-lang/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.cxf:3.3.9: 
    Project:      Apache CXF
    Version:      3.3.9
    Available at: https://cxf.apache.org
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.cxf:3.4.10: 
    Project:      Apache CXF
    Version:      3.4.10
    Available at: https://cxf.apache.org
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.felix.org.apache.felix.framework:6.0.5: 
    Project:      Apache Felix Framework
    Version:      6.0.5
    Available at: http://felix.apache.org/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.geronimo.specs.geronimo-activation_1.1_spec:1.1: 
    Project:      Activation 1.1
    Version:      1.1
    Available at: http://geronimo.apache.org/maven/specs/geronimo-activation_1.1_spec/1.1
    Developed by: The Apache Software Foundation (http://www.apache.org)
    License name: Apache License, version 2.0
  
  org.apache.geronimo.specs.geronimo-stax-api_1.0_spec:1.0.1: 
    Project:      Streaming API for XML (STAX API 1.0)
    Version:      1.0.1
    Available at: http://geronimo.apache.org/specs/geronimo-stax-api_1.0_spec
    Developed by: Apache Software Foundation (http://www.apache.org)
    License name: Apache License, version 2.0
  
  org.apache.geronimo.specs.geronimo-ws-metadata_2.0_spec:1.1.3: 
    Project:      Web Services Metadata 2.0
    Version:      1.1.3
    Available at: http://geronimo.apache.org/maven/specs/geronimo-ws-metadata_2.0_spec/1.1.3
    Developed by: The Apache Software Foundation (http://www.apache.org)
    License name: Apache License, version 2.0
  
  org.apache.httpcomponents.httpasyncclient:4.1.4: 
    Project:      Apache HttpAsyncClient
    Version:      4.1.4
    Available at: http://hc.apache.org/httpcomponents-asyncclient
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.httpcomponents.httpclient:4.5.13: 
    Project:      Apache HttpClient
    Version:      4.5.13
    Available at: http://hc.apache.org/httpcomponents-client-ga
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.httpcomponents.httpcore-nio:4.4.12: 
    Project:      Apache HttpCore NIO
    Version:      4.4.12
    Available at: http://hc.apache.org/httpcomponents-core-ga
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.httpcomponents.httpcore:4.4.15: 
    Project:      Apache HttpCore
    Version:      4.4.15
    Available at: http://hc.apache.org/httpcomponents-core-ga
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.jclouds:2.4.0: 
    Project:      Apache jclouds
    Version:      2.4.0
    Available at: https://jclouds.apache.org/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.neethi:3.1.1: 
    Project:      Apache Neethi
    Version:      3.1.1
    Available at: http://ws.apache.org/neethi/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.servicemix.specs:2.9.0: 
    Project: 
      - "Apache ServiceMix :: Specs :: Activation API 1.4"
      - "Apache ServiceMix :: Specs :: Activator"
      - "Apache ServiceMix :: Specs :: JAXB API 2.2"
      - "Apache ServiceMix :: Specs :: Stax API 1.0"
    Version:      2.9.0
    Available at: http://servicemix.apache.org/
    Developed by: The Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.apache.ws.xmlschema.xmlschema-core:2.2.5: 
    Project:      XmlSchema Core
    Version:      2.2.5
    Available at: https://ws.apache.org/commons/xmlschema20/
    Developed by: The Apache Software Foundation (https://www.apache.org/)
    License name: Apache License, version 2.0
  
  org.bouncycastle.bcprov-ext-jdk15on:1.60: 
    Project:      Bouncy Castle Provider
    Version:      1.60
    Available at: https://www.bouncycastle.org/java.html
    License name: MIT License
    Notice:       Copyright (c) The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
  
  org.bouncycastle:1.72: 
    Project: 
      - Bouncy Castle ASN.1 Extension and Utility APIs
      - Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs
      - Bouncy Castle Provider
    Version:      1.72
    Available at: https://www.bouncycastle.org/java.html
    License name: MIT License
    Notice:       Copyright (c) The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
  
  org.codehaus.groovy.groovy-all:2.4.21: 
    Project:      Apache Groovy
    Version:      2.4.21
    Available at: http://groovy-lang.org
    Developed by: Apache Software Foundation (http://groovy-lang.org)
    License name: Apache License, version 2.0
  
  org.codehaus.mojo.animal-sniffer-annotations:1.17: 
    Project:      Animal Sniffer Annotations
    Version:      1.17
    Available at: http://www.mojohaus.org/animal-sniffer
    Developed by: MojoHaus (http://www.mojohaus.org)
    License name: MIT License
  
  org.codehaus.woodstox.stax2-api:4.2.1: 
    Project:      Stax2 API
    Version:      4.2.1
    Available at: http://github.com/FasterXML/stax2-api
    Developed by: fasterxml.com (http://fasterxml.com)
    License name: BSD 2-Clause (Simplified or FreeBSD) License
  
  org.eclipse.jetty:9.4.49.v20220914: 
    Project: 
      - "Jetty :: Http Utility"
      - "Jetty :: IO Utility"
      - "Jetty :: Security"
      - "Jetty :: Server Core"
      - "Jetty :: Servlet Handling"
      - "Jetty :: Utilities"
      - "Jetty :: Utilities :: Ajax(JSON)"
      - "Jetty :: Webapp Application Support"
      - "Jetty :: XML utilities"
    Version:      9.4.49.v20220914
    Available at: https://eclipse.org/jetty
    Developed by: Webtide (https://webtide.com)
    License name: Apache License, version 2.0
  
  org.freemarker:2.3.31: 
    Project:      Apache FreeMarker
    Version:      2.3.31
    Available at: https://freemarker.apache.org/
    Developed by: Apache Software Foundation (http://apache.org)
    License name: Apache License, version 2.0
  
  org.glassfish.external.opendmk_jmxremote_optional_jar:1.0-b01-ea: 
    Project:      opendmk_jmxremote_optional_jar
    Version:      1.0-b01-ea
    Available at: https://opendmk.java.net/
    License name: Common Development and Distribution License, version 1.1
  
  org.hamcrest.hamcrest-core:1.3: 
    Project:      Hamcrest Core
    Version:      1.3
    Available at: https://github.com/hamcrest/JavaHamcrest
    License name: BSD 3-Clause (New BSD) License
  
  org.javassist:3.19.0-GA: 
    Project:      Javassist
    Version:      3.19.0-GA
    Available at: http://www.javassist.org/
    License name: Apache License, version 2.0
    Notice:       Copyright (c) Shigeru Chiba
  
  org.osgi.osgi.core:7.0.0: 
    Project:      org.osgi:osgi.core
    Version:      7.0.0
    Available at: https://www.osgi.org/
    Developed by: OSGi Alliance (https://www.osgi.org/)
    License name: Apache License, version 2.0
  
  org.ow2.asm:5.2: 
    Project:      ASM Core
    Version:      5.2
    Available at: http://asm.objectweb.org/
    Developed by: ObjectWeb (http://www.objectweb.org/)
    License name: BSD 3-Clause (New BSD) License
    Notice:       Copyright (c) 2000-2011 INRIA, France Telecom
  
  org.reflections:0.9.10: 
    Project:      Reflections
    Version:      0.9.10
    Available at: http://github.com/ronmamo/reflections
    License name: BSD 3-Clause (New BSD) License
  
  org.slf4j:1.7.36: 
    Project:      Simple Logging Framework for Java
    Version:      1.7.36
    Available at: http://www.slf4j.org
    Developed by: QOS.ch (http://www.qos.ch)
    Licenses: 
      -
        License name: Apache License, version 2.0
      -
        License name: MIT License
  
  org.snakeyaml.snakeyaml-engine:2.6: 
    Project:      SnakeYAML Engine
    Version:      2.6
    Available at: https://bitbucket.org/snakeyaml/snakeyaml-engine
    License name: Apache License, version 2.0
  
  org.xmlunit:2.3.0: 
    Project: 
      - org.xmlunit:xmlunit-core
      - org.xmlunit:xmlunit-matchers
    Version:      2.3.0
    Available at: http://www.xmlunit.org/
    Developed by: XMLUnit (http://www.xmlunit.org/)
    License name: Apache License, version 2.0
  
  org.yaml.snakeyaml:2.2: 
    Project:      SnakeYAML
    Version:      2.2
    Available at: https://bitbucket.org/snakeyaml/snakeyaml
    License name: Apache License, version 2.0
  
  wsdl4j:1.6.3: 
    Project:      WSDL4J
    Version:      1.6.3
    Available at: http://sf.net/projects/wsdl4j
    License name: Common Public License, version 1.0
  
  xml-resolver:1.2: 
    Project:      XML Commons Resolver Component
    Version:      1.2
    Available at: http://xml.apache.org/commons/components/resolver/
    Developed by: Apache Software Foundation (http://www.apache.org/)
    License name: Apache License, version 2.0
  
  xmlpull:1.1.3.1: 
    Project:      XML Pull Parsing API
    Version:      1.1.3.1
    Available at: http://www.xmlpull.org
    License name: Public Domain
  

Apache License: |

   Apache License
   Version 2.0, January 2004
   http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.


   END OF TERMS AND CONDITIONS

   APPENDIX - HOW TO APPLY THE APACHE LICENSE TO YOUR WORK
   
   To apply the Apache License to your work, attach the following boilerplate 
   notice, with the fields enclosed by brackets "[]" replaced with your own 
   identifying information. (Don't include the brackets!) The text should be 
   enclosed in the appropriate comment syntax for the file format. We also 
   recommend that a file or class name and description of purpose be included 
   on the same "printed page" as the copyright notice for easier 
   identification within third-party archives.
   
   Copyright [yyyy] [name of copyright owner]
   
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
   
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
   
   
Dependency licenses:

   # Licenses of the source and binary dependencies of this software are included below.

  Apache License, version 2.0: |
    # from https://www.apache.org/licenses/LICENSE-2.0
       
                                     Apache License
                               Version 2.0, January 2004
                            http://www.apache.org/licenses/
       
       TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
       
       1. Definitions.
       
          "License" shall mean the terms and conditions for use, reproduction,
          and distribution as defined by Sections 1 through 9 of this document.
       
          "Licensor" shall mean the copyright owner or entity authorized by
          the copyright owner that is granting the License.
       
          "Legal Entity" shall mean the union of the acting entity and all
          other entities that control, are controlled by, or are under common
          control with that entity. For the purposes of this definition,
          "control" means (i) the power, direct or indirect, to cause the
          direction or management of such entity, whether by contract or
          otherwise, or (ii) ownership of fifty percent (50%) or more of the
          outstanding shares, or (iii) beneficial ownership of such entity.
       
          "You" (or "Your") shall mean an individual or Legal Entity
          exercising permissions granted by this License.
       
          "Source" form shall mean the preferred form for making modifications,
          including but not limited to software source code, documentation
          source, and configuration files.
       
          "Object" form shall mean any form resulting from mechanical
          transformation or translation of a Source form, including but
          not limited to compiled object code, generated documentation,
          and conversions to other media types.
       
          "Work" shall mean the work of authorship, whether in Source or
          Object form, made available under the License, as indicated by a
          copyright notice that is included in or attached to the work
          (an example is provided in the Appendix below).
       
          "Derivative Works" shall mean any work, whether in Source or Object
          form, that is based on (or derived from) the Work and for which the
          editorial revisions, annotations, elaborations, or other modifications
          represent, as a whole, an original work of authorship. For the purposes
          of this License, Derivative Works shall not include works that remain
          separable from, or merely link (or bind by name) to the interfaces of,
          the Work and Derivative Works thereof.
       
          "Contribution" shall mean any work of authorship, including
          the original version of the Work and any modifications or additions
          to that Work or Derivative Works thereof, that is intentionally
          submitted to Licensor for inclusion in the Work by the copyright owner
          or by an individual or Legal Entity authorized to submit on behalf of
          the copyright owner. For the purposes of this definition, "submitted"
          means any form of electronic, verbal, or written communication sent
          to the Licensor or its representatives, including but not limited to
          communication on electronic mailing lists, source code control systems,
          and issue tracking systems that are managed by, or on behalf of, the
          Licensor for the purpose of discussing and improving the Work, but
          excluding communication that is conspicuously marked or otherwise
          designated in writing by the copyright owner as "Not a Contribution."
       
          "Contributor" shall mean Licensor and any individual or Legal Entity
          on behalf of whom a Contribution has been received by Licensor and
          subsequently incorporated within the Work.
       
       2. Grant of Copyright License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          copyright license to reproduce, prepare Derivative Works of,
          publicly display, publicly perform, sublicense, and distribute the
          Work and such Derivative Works in Source or Object form.
       
       3. Grant of Patent License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          (except as stated in this section) patent license to make, have made,
          use, offer to sell, sell, import, and otherwise transfer the Work,
          where such license applies only to those patent claims licensable
          by such Contributor that are necessarily infringed by their
          Contribution(s) alone or by combination of their Contribution(s)
          with the Work to which such Contribution(s) was submitted. If You
          institute patent litigation against any entity (including a
          cross-claim or counterclaim in a lawsuit) alleging that the Work
          or a Contribution incorporated within the Work constitutes direct
          or contributory patent infringement, then any patent licenses
          granted to You under this License for that Work shall terminate
          as of the date such litigation is filed.
       
       4. Redistribution. You may reproduce and distribute copies of the
          Work or Derivative Works thereof in any medium, with or without
          modifications, and in Source or Object form, provided that You
          meet the following conditions:
       
          (a) You must give any other recipients of the Work or
              Derivative Works a copy of this License; and
       
          (b) You must cause any modified files to carry prominent notices
              stating that You changed the files; and
       
          (c) You must retain, in the Source form of any Derivative Works
              that You distribute, all copyright, patent, trademark, and
              attribution notices from the Source form of the Work,
              excluding those notices that do not pertain to any part of
              the Derivative Works; and
       
          (d) If the Work includes a "NOTICE" text file as part of its
              distribution, then any Derivative Works that You distribute must
              include a readable copy of the attribution notices contained
              within such NOTICE file, excluding those notices that do not
              pertain to any part of the Derivative Works, in at least one
              of the following places: within a NOTICE text file distributed
              as part of the Derivative Works; within the Source form or
              documentation, if provided along with the Derivative Works; or,
              within a display generated by the Derivative Works, if and
              wherever such third-party notices normally appear. The contents
              of the NOTICE file are for informational purposes only and
              do not modify the License. You may add Your own attribution
              notices within Derivative Works that You distribute, alongside
              or as an addendum to the NOTICE text from the Work, provided
              that such additional attribution notices cannot be construed
              as modifying the License.
       
          You may add Your own copyright statement to Your modifications and
          may provide additional or different license terms and conditions
          for use, reproduction, or distribution of Your modifications, or
          for any such Derivative Works as a whole, provided Your use,
          reproduction, and distribution of the Work otherwise complies with
          the conditions stated in this License.
       
       5. Submission of Contributions. Unless You explicitly state otherwise,
          any Contribution intentionally submitted for inclusion in the Work
          by You to the Licensor shall be under the terms and conditions of
          this License, without any additional terms or conditions.
          Notwithstanding the above, nothing herein shall supersede or modify
          the terms of any separate license agreement you may have executed
          with Licensor regarding such Contributions.
       
       6. Trademarks. This License does not grant permission to use the trade
          names, trademarks, service marks, or product names of the Licensor,
          except as required for reasonable and customary use in describing the
          origin of the Work and reproducing the content of the NOTICE file.
       
       7. Disclaimer of Warranty. Unless required by applicable law or
          agreed to in writing, Licensor provides the Work (and each
          Contributor provides its Contributions) on an "AS IS" BASIS,
          WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
          implied, including, without limitation, any warranties or conditions
          of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
          PARTICULAR PURPOSE. You are solely responsible for determining the
          appropriateness of using or redistributing the Work and assume any
          risks associated with Your exercise of permissions under this License.
       
       8. Limitation of Liability. In no event and under no legal theory,
          whether in tort (including negligence), contract, or otherwise,
          unless required by applicable law (such as deliberate and grossly
          negligent acts) or agreed to in writing, shall any Contributor be
          liable to You for damages, including any direct, indirect, special,
          incidental, or consequential damages of any character arising as a
          result of this License or out of the use or inability to use the
          Work (including but not limited to damages for loss of goodwill,
          work stoppage, computer failure or malfunction, or any and all
          other commercial damages or losses), even if such Contributor
          has been advised of the possibility of such damages.
       
       9. Accepting Warranty or Additional Liability. While redistributing
          the Work or Derivative Works thereof, You may choose to offer,
          and charge a fee for, acceptance of support, warranty, indemnity,
          or other liability obligations and/or rights consistent with this
          License. However, in accepting such obligations, You may act only
          on Your own behalf and on Your sole responsibility, not on behalf
          of any other Contributor, and only if You agree to indemnify,
          defend, and hold each Contributor harmless for any liability
          incurred by, or claims asserted against, such Contributor by reason
          of your accepting any such warranty or additional liability.
     

  BSD 2-Clause (Simplified or FreeBSD) License: |
    Redistribution and use in source and binary forms, with or without modification, 
    are permitted provided that the following conditions are met:
    
    1. Redistributions of source code must retain the above copyright notice, this list 
    of conditions and the following disclaimer.
    
    2. Redistributions in binary form must reproduce the above copyright notice, this 
    list of conditions and the following disclaimer in the documentation and/or other 
    materials provided with the distribution.
    
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
    SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 
    DAMAGE.

  BSD 3-Clause (New BSD) License: |
    Copyright (c) as noted in accompanying NOTICE file. All rights reserved.
    
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:
    
      1. Redistributions of source code must retain the above copyright notice,
         this list of conditions and the following disclaimer.
    
      2. Redistributions in binary form must reproduce the above copyright 
         notice, this list of conditions and the following disclaimer in 
         the documentation and/or other materials provided with the distribution.
    
      3. The names of the authors may not be used to endorse or promote products
         derived from this software without specific prior written permission.
    
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
    FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
    INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  CC0 1.0 Universal: |
    
    CC0 1.0 Universal (CC0 1.0)
    
    Creative Commons - No Copyright
    
    The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law.
    
    You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.
    
    Legal Code
    
    Statement of Purpose
    
    The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
    
    Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
    
    For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
    
    1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
    
    the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
    moral rights retained by the original author(s) and/or performer(s);
    publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
    rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
    rights protecting the extraction, dissemination, use and reuse of data in a Work;
    database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
    other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
    2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
    
    3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
    
    4. Limitations and Disclaimers.
    
    No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
    Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
    Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
    Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
    
    
    

  Common Development and Distribution License, version 1.0: |
    COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) 
    Version 1.0
    
    1. Definitions.
    1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications.
    1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
    1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
    1.4. "Executable" means the Covered Software in any form other than Source Code.
    1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License.
    1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
    1.7. "License" means this document.
    1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
    1.9. "Modifications" means the Source Code and Executable form of any of the following:
    A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
    B. Any new file that contains any part of the Original Software or previous Modification; or
    C. Any new file that is contributed or otherwise made available under the terms of this License.
    1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License.
    1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
    1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
    1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
    2. License Grants.
    2.1. The Initial Developer Grant. 
    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
    (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
    (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
    (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
    (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
    2.2. Contributor Grant. 
    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
    (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
    (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
    (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
    (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
    3. Distribution Obligations.
    3.1. Availability of Source Code. 
    Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
    3.2. Modifications. 
    The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
    3.3. Required Notices. 
    You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
    3.4. Application of Additional Terms. 
    You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
    3.5. Distribution of Executable Versions. 
    You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
    3.6. Larger Works. 
    You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
    4. Versions of the License.
    4.1. New Versions. 
    Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
    4.2. Effect of New Versions. 
    You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
    4.3. Modified Versions. 
    When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
    5. DISCLAIMER OF WARRANTY.
    COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
    
    6. TERMINATION.
    6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
    6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
    6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
    7. LIMITATION OF LIABILITY.
    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
    
    8. U.S. GOVERNMENT END USERS.
    The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
    
    9. MISCELLANEOUS.
    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
    
    10. RESPONSIBILITY FOR CLAIMS.
    As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.

  Common Development and Distribution License, version 1.1: |
    COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) 
    Version 1.1
    
    1. Definitions.
    1.1. "Contributor" means each individual or entity that creates or contributes to the creation of Modifications.
    1.2. "Contributor Version" means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
    1.3. "Covered Software" means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
    1.4. "Executable" means the Covered Software in any form other than Source Code.
    1.5. "Initial Developer" means the individual or entity that first makes Original Software available under this License.
    1.6. "Larger Work" means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
    1.7. "License" means this document.
    1.8. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
    1.9. "Modifications" means the Source Code and Executable form of any of the following:
    A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
    B. Any new file that contains any part of the Original Software or previous Modification; or
    C. Any new file that is contributed or otherwise made available under the terms of this License.
    1.10. "Original Software" means the Source Code and Executable form of computer software code that is originally released under this License.
    1.11. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
    1.12. "Source Code" means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
    1.13. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
    2. License Grants.
    2.1. The Initial Developer Grant. 
    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
    (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
    (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
    (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
    (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
    2.2. Contributor Grant. 
    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
    (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
    (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
    (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
    (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
    3. Distribution Obligations.
    3.1. Availability of Source Code. 
    Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
    3.2. Modifications. 
    The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
    3.3. Required Notices. 
    You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
    3.4. Application of Additional Terms. 
    You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
    3.5. Distribution of Executable Versions. 
    You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
    3.6. Larger Works. 
    You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
    4. Versions of the License.
    4.1. New Versions. 
    Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
    4.2. Effect of New Versions. 
    You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
    4.3. Modified Versions. 
    When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
    5. DISCLAIMER OF WARRANTY.
    COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
    
    6. TERMINATION.
    6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
    6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as "Participant") alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
    6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
    6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
    7. LIMITATION OF LIABILITY.
    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
    
    8. U.S. GOVERNMENT END USERS.
    The Covered Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and "commercial computer software documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
    
    9. MISCELLANEOUS.
    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
    
    10. RESPONSIBILITY FOR CLAIMS.
    As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
    
    NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) 
    The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.

  Common Public License, version 1.0: |
    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
    
    1.
    DEFINITIONS
    
    "Contribution" means:
    
    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
    b) in the case of each subsequent Contributor:
    i) changes to the Program, and
    ii) additions to the Program;
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
    
    "Contributor" means any person or entity that distributes the Program.
    
    "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
    
    "Program" means the Contributions distributed in accordance with this Agreement.
    
    "Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
    
    2.
    GRANT OF RIGHTS
    
    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
    3.
    REQUIREMENTS
    
    A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
    
    a) it complies with the terms and conditions of this Agreement; and
    b) its license agreement:
    i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
    ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
    iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
    iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
    When the Program is made available in source code form:
    
    a) it must be made available under this Agreement; and
    b) a copy of this Agreement must be included with each copy of the Program.
    Contributors may not remove or alter any copyright notices contained within the Program.
    
    Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
    
    4.
    COMMERCIAL DISTRIBUTION
    
    Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
    
    For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
    
    5.
    NO WARRANTY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
    
    6.
    DISCLAIMER OF LIABILITY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    
    7.
    GENERAL
    
    If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
    
    If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
    
    All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
    
    Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
    
    This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
    

  Creative Commons Public License, Attribution 3.0: |
    THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
    COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
    COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
    AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
    
    BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
    BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE
    CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE
    IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
    
    1. Definitions
    
    "Collective Work" means a work, such as a periodical issue, anthology or
    encyclopedia, in which the Work in its entirety in unmodified form, along with
    one or more other contributions, constituting separate and independent works in
    themselves, are assembled into a collective whole. A work that constitutes a
    Collective Work will not be considered a Derivative Work (as defined below) for
    the purposes of this License.  "Derivative Work" means a work based upon the
    Work or upon the Work and other pre-existing works, such as a translation,
    musical arrangement, dramatization, fictionalization, motion picture version,
    sound recording, art reproduction, abridgment, condensation, or any other form
    in which the Work may be recast, transformed, or adapted, except that a work
    that constitutes a Collective Work will not be considered a Derivative Work for
    the purpose of this License. For the avoidance of doubt, where the Work is a
    musical composition or sound recording, the synchronization of the Work in
    timed-relation with a moving image ("synching") will be considered a Derivative
    Work for the purpose of this License.  "Licensor" means the individual,
    individuals, entity or entities that offers the Work under the terms of this
    License.  "Original Author" means the individual, individuals, entity or
    entities who created the Work.  "Work" means the copyrightable work of
    authorship offered under the terms of this License.  "You" means an individual
    or entity exercising rights under this License who has not previously violated
    the terms of this License with respect to the Work, or who has received express
    permission from the Licensor to exercise rights under this License despite a
    previous violation.  2. Fair Use Rights. Nothing in this license is intended to
    reduce, limit, or restrict any rights arising from fair use, first sale or
    other limitations on the exclusive rights of the copyright owner under
    copyright law or other applicable laws.
    
    3. License Grant. Subject to the terms and conditions of this License, Licensor
    hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
    duration of the applicable copyright) license to exercise the rights in the
    Work as stated below:
    
    to reproduce the Work, to incorporate the Work into one or more Collective
    Works, and to reproduce the Work as incorporated in the Collective Works; to
    create and reproduce Derivative Works provided that any such Derivative Work,
    including any translation in any medium, takes reasonable steps to clearly
    label, demarcate or otherwise identify that changes were made to the original
    Work. For example, a translation could be marked "The original work was
    translated from English to Spanish," or a modification could indicate "The
    original work has been modified.";; to distribute copies or phonorecords of,
    display publicly, perform publicly, and perform publicly by means of a digital
    audio transmission the Work including as incorporated in Collective Works; to
    distribute copies or phonorecords of, display publicly, perform publicly, and
    perform publicly by means of a digital audio transmission Derivative Works.
    For the avoidance of doubt, where the Work is a musical composition:
    
    Performance Royalties Under Blanket Licenses. Licensor waives the exclusive
    right to collect, whether individually or, in the event that Licensor is a
    member of a performance rights society (e.g. ASCAP, BMI, SESAC), via that
    society, royalties for the public performance or public digital performance
    (e.g. webcast) of the Work.  Mechanical Rights and Statutory Royalties.
    Licensor waives the exclusive right to collect, whether individually or via a
    music rights agency or designated agent (e.g. Harry Fox Agency), royalties for
    any phonorecord You create from the Work ("cover version") and distribute,
    subject to the compulsory license created by 17 USC Section 115 of the US
    Copyright Act (or the equivalent in other jurisdictions).  Webcasting Rights
    and Statutory Royalties. For the avoidance of doubt, where the Work is a sound
    recording, Licensor waives the exclusive right to collect, whether individually
    or via a performance-rights society (e.g. SoundExchange), royalties for the
    public digital performance (e.g. webcast) of the Work, subject to the
    compulsory license created by 17 USC Section 114 of the US Copyright Act (or
    the equivalent in other jurisdictions).  The above rights may be exercised in
    all media and formats whether now known or hereafter devised. The above rights
    include the right to make such modifications as are technically necessary to
    exercise the rights in other media and formats. All rights not expressly
    granted by Licensor are hereby reserved.
    
    4. Restrictions. The license granted in Section 3 above is expressly made
    subject to and limited by the following restrictions:
    
    You may distribute, publicly display, publicly perform, or publicly digitally
    perform the Work only under the terms of this License, and You must include a
    copy of, or the Uniform Resource Identifier for, this License with every copy
    or phonorecord of the Work You distribute, publicly display, publicly perform,
    or publicly digitally perform. You may not offer or impose any terms on the
    Work that restrict the terms of this License or the ability of a recipient of
    the Work to exercise the rights granted to that recipient under the terms of
    the License. You may not sublicense the Work. You must keep intact all notices
    that refer to this License and to the disclaimer of warranties. When You
    distribute, publicly display, publicly perform, or publicly digitally perform
    the Work, You may not impose any technological measures on the Work that
    restrict the ability of a recipient of the Work from You to exercise the rights
    granted to that recipient under the terms of the License. This Section 4(a)
    applies to the Work as incorporated in a Collective Work, but this does not
    require the Collective Work apart from the Work itself to be made subject to
    the terms of this License. If You create a Collective Work, upon notice from
    any Licensor You must, to the extent practicable, remove from the Collective
    Work any credit as required by Section 4(b), as requested. If You create a
    Derivative Work, upon notice from any Licensor You must, to the extent
    practicable, remove from the Derivative Work any credit as required by Section
    4(b), as requested.  If You distribute, publicly display, publicly perform, or
    publicly digitally perform the Work (as defined in Section 1 above) or any
    Derivative Works (as defined in Section 1 above) or Collective Works (as
    defined in Section 1 above), You must, unless a request has been made pursuant
    to Section 4(a), keep intact all copyright notices for the Work and provide,
    reasonable to the medium or means You are utilizing: (i) the name of the
    Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the
    Original Author and/or Licensor designate another party or parties (e.g. a
    sponsor institute, publishing entity, journal) for attribution ("Attribution
    Parties") in Licensor's copyright notice, terms of service or by other
    reasonable means, the name of such party or parties; the title of the Work if
    supplied; to the extent reasonably practicable, the Uniform Resource
    Identifier, if any, that Licensor specifies to be associated with the Work,
    unless such URI does not refer to the copyright notice or licensing information
    for the Work; and, consistent with Section 3(b) in the case of a Derivative
    Work, a credit identifying the use of the Work in the Derivative Work (e.g.,
    "French translation of the Work by Original Author," or "Screenplay based on
    original Work by Original Author"). The credit required by this Section 4(b)
    may be implemented in any reasonable manner; provided, however, that in the
    case of a Derivative Work or Collective Work, at a minimum such credit will
    appear, if a credit for all contributing authors of the Derivative Work or
    Collective Work appears, then as part of these credits and in a manner at least
    as prominent as the credits for the other contributing authors. For the
    avoidance of doubt, You may only use the credit required by this Section for
    the purpose of attribution in the manner set out above and, by exercising Your
    rights under this License, You may not implicitly or explicitly assert or imply
    any connection with, sponsorship or endorsement by the Original Author,
    Licensor and/or Attribution Parties, as appropriate, of You or Your use of the
    Work, without the separate, express prior written permission of the Original
    Author, Licensor and/or Attribution Parties.  5. Representations, Warranties
    and Disclaimer
    
    UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
    THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS HELD IN THE LICENSED WORK
    BY THE LICENSOR. THE LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
    KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING,
    WITHOUT LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY,
    FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR
    OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
    DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED
    WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
    
    6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN
    NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
    INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS
    LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    7. Termination
    
    This License and the rights granted hereunder will terminate automatically upon
    any breach by You of the terms of this License. Individuals or entities who
    have received Derivative Works (as defined in Section 1 above) or Collective
    Works (as defined in Section 1 above) from You under this License, however,
    will not have their licenses terminated provided such individuals or entities
    remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8
    will survive any termination of this License.  Subject to the above terms and
    conditions, the license granted here is perpetual (for the duration of the
    applicable copyright in the Work). Notwithstanding the above, Licensor reserves
    the right to release the Work under different license terms or to stop
    distributing the Work at any time; provided, however that any such election
    will not serve to withdraw this License (or any other license that has been, or
    is required to be, granted under the terms of this License), and this License
    will continue in full force and effect unless terminated as stated above.  8.
    Miscellaneous
    
    Each time You distribute or publicly digitally perform the Work (as defined in
    Section 1 above) or a Collective Work (as defined in Section 1 above), the
    Licensor offers to the recipient a license to the Work on the same terms and
    conditions as the license granted to You under this License.  Each time You
    distribute or publicly digitally perform a Derivative Work, Licensor offers to
    the recipient a license to the original Work on the same terms and conditions
    as the license granted to You under this License.  If any provision of this
    License is invalid or unenforceable under applicable law, it shall not affect
    the validity or enforceability of the remainder of the terms of this License,
    and without further action by the parties to this agreement, such provision
    shall be reformed to the minimum extent necessary to make such provision valid
    and enforceable.  No term or provision of this License shall be deemed waived
    and no breach consented to unless such waiver or consent shall be in writing
    and signed by the party to be charged with such waiver or consent.  This
    License constitutes the entire agreement between the parties with respect to
    the Work licensed here. There are no understandings, agreements or
    representations with respect to the Work not specified here. Licensor shall not
    be bound by any additional provisions that may appear in any communication from
    You. This License may not be modified without the mutual written agreement of
    the Licensor and You.

  Eclipse Distribution License, version 1.0: |
    Eclipse Distribution License - v 1.0
    Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors.
    
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without modification, 
    are permitted provided that the following conditions are met:
    
    Redistributions of source code must retain the above copyright notice, this list 
    of conditions and the following disclaimer.
    
    Redistributions in binary form must reproduce the above copyright notice, this 
    list of conditions and the following disclaimer in the documentation and/or other 
    materials provided with the distribution.
    
    Neither the name of the Eclipse Foundation, Inc. nor the names of its contributors 
    may be used to endorse or promote products derived from this software without 
    specific prior written permission.
    
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
    IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
    OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 
    IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  Eclipse Public License, version 1.0: |
    Eclipse Public License - v 1.0
    
    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
    
    1. DEFINITIONS
    
    "Contribution" means:
    
    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
    b) in the case of each subsequent Contributor:
      i) changes to the Program, and
      ii) additions to the Program;
    
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
    
    "Contributor" means any person or entity that distributes the Program.
    
    "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
    
    "Program" means the Contributions distributed in accordance with this Agreement.
    
    "Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
    
    2. GRANT OF RIGHTS
    
    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
    
    3. REQUIREMENTS
    
    A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
    
    a) it complies with the terms and conditions of this Agreement; and
    b) its license agreement:
      i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
      ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
      iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
      iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
    
    When the Program is made available in source code form:
    
    a) it must be made available under this Agreement; and
    b) a copy of this Agreement must be included with each copy of the Program.
    
    Contributors may not remove or alter any copyright notices contained within the Program.
    
    Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
    
    4. COMMERCIAL DISTRIBUTION
    
    Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
    
    For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
    
    5. NO WARRANTY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
    
    6. DISCLAIMER OF LIABILITY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    
    7. GENERAL
    
    If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
    
    If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
    
    All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
    
    Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
    
    This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

  Eclipse Public License, version 2.0: |
    Eclipse Public License - v 2.0
    
    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (“AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
    
    1. DEFINITIONS
    
    "Contribution" means:
    
    a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and
    b) in the case of each subsequent Contributor:
      i) changes to the Program, and
      ii) additions to the Program;
      
    where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution "originates" from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works.
    
    "Contributor" means any person or entity that Distributes the Program.
    
    "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
    
    "Program" means the Contributions Distributed in accordance with this Agreement.
    
    "Recipient" means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors.
    
    "Derivative Works" shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.
    
    "Modified Works" shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof.
    
    "Distribute" means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy.
    
    "Source Code" means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files.
    
    "Secondary License" means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor.
    
    2. GRANT OF RIGHTS
    
    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works.
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
    e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3).
    
    3. REQUIREMENTS
    
    3.1 If a Contributor Distributes the Program in any form, then:
    
    a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and
    b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license:
      i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
      ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
      iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and
      iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3.
    
    3.2 When the Program is Distributed as Source Code:
    
    a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and
    b) a copy of this Agreement must be included with each copy of the Program.
    
    3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability (‘notices’) contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices.
    
    4. COMMERCIAL DISTRIBUTION
    
    Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
    
    For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
    
    5. NO WARRANTY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
    
    6. DISCLAIMER OF LIABILITY
    
    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    
    7. GENERAL
    
    If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
    
    If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
    
    All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
    
    Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version.
    
    Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement.
    
    
    Exhibit A – Form of Secondary Licenses Notice
    
    "This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}."
    
    Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses.
    
    If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
    
    You may add additional accurate notices of copyright ownership.
    

  Indiana University Extreme! Lab Software License, version 1.2: |
    Indiana University Extreme! Lab Software License, Version 1.2
    
    Copyright (C) 2003 The Trustees of Indiana University.
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:
    
    1) All redistributions of source code must retain the above
       copyright notice, the list of authors in the original source
       code, this list of conditions and the disclaimer listed in this
       license;
    
    2) All redistributions in binary form must reproduce the above
       copyright notice, this list of conditions and the disclaimer
       listed in this license in the documentation and/or other
       materials provided with the distribution;
    
    3) Any documentation included with all redistributions must include
       the following acknowledgement:
    
         "This product includes software developed by the Indiana
         University Extreme! Lab.  For further information please visit
         http://www.extreme.indiana.edu/"
    
       Alternatively, this acknowledgment may appear in the software
       itself, and wherever such third-party acknowledgments normally
       appear.
    
    4) The name "Indiana University" or "Indiana University
       Extreme! Lab" shall not be used to endorse or promote
       products derived from this software without prior written
       permission from Indiana University.  For written permission,
       please contact http://www.extreme.indiana.edu/.
    
    5) Products derived from this software may not use "Indiana
       University" name nor may "Indiana University" appear in their name,
       without prior written permission of the Indiana University.
    
    Indiana University provides no reassurances that the source code
    provided does not infringe the patent or any other intellectual
    property rights of any other entity.  Indiana University disclaims any
    liability to any recipient for claims brought by any other entity
    based on infringement of intellectual property rights or otherwise.
    
    LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH
    NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA
    UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT
    SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR
    OTHER PROPRIETARY RIGHTS.  INDIANA UNIVERSITY MAKES NO WARRANTIES THAT
    SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP
    DOORS", "WORMS", OR OTHER HARMFUL CODE.  LICENSEE ASSUMES THE ENTIRE
    RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS,
    AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING
    SOFTWARE.

  MIT License: |
    MIT License
    
    Copyright (c) as noted in accompanying NOTICE file. All rights reserved.
    
    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, sublicense, and/or sell copies of the Software, and to permit 
    persons to whom the Software is furnished to do so, subject to the following conditions:
    
    The above copyright notice and this permission notice shall be included in all copies or 
    substantial portions of the Software.
    
    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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
    FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
    DEALINGS IN THE SOFTWARE.

  Public Domain: |
    The project indicates it is in the public domain and does not require any license inclusion.
    

  SIL OFL 1.1: |
    Copyright (c) as noted in accompanying NOTICE file. All rights reserved.
    
    This Font Software is licensed under the SIL Open Font License, Version 1.1.
    This license is copied below, and is also available with a FAQ at:
    http://scripts.sil.org/OFL
    
    
    -----------------------------------------------------------
    SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
    -----------------------------------------------------------
    
    PREAMBLE
    The goals of the Open Font License (OFL) are to stimulate worldwide
    development of collaborative font projects, to support the font creation
    efforts of academic and linguistic communities, and to provide a free and
    open framework in which fonts may be shared and improved in partnership
    with others.
    
    The OFL allows the licensed fonts to be used, studied, modified and
    redistributed freely as long as they are not sold by themselves. The
    fonts, including any derivative works, can be bundled, embedded, 
    redistributed and/or sold with any software provided that any reserved
    names are not used by derivative works. The fonts and derivatives,
    however, cannot be released under any other type of license. The
    requirement for fonts to remain under this license does not apply
    to any document created using the fonts or their derivatives.
    
    DEFINITIONS
    "Font Software" refers to the set of files released by the Copyright
    Holder(s) under this license and clearly marked as such. This may
    include source files, build scripts and documentation.
    
    "Reserved Font Name" refers to any names specified as such after the
    copyright statement(s).
    
    "Original Version" refers to the collection of Font Software components as
    distributed by the Copyright Holder(s).
    
    "Modified Version" refers to any derivative made by adding to, deleting,
    or substituting -- in part or in whole -- any of the components of the
    Original Version, by changing formats or by porting the Font Software to a
    new environment.
    
    "Author" refers to any designer, engineer, programmer, technical
    writer or other person who contributed to the Font Software.
    
    PERMISSION & CONDITIONS
    Permission is hereby granted, free of charge, to any person obtaining
    a copy of the Font Software, to use, study, copy, merge, embed, modify,
    redistribute, and sell modified and unmodified copies of the Font
    Software, subject to the following conditions:
    
    1) Neither the Font Software nor any of its individual components,
    in Original or Modified Versions, may be sold by itself.
    
    2) Original or Modified Versions of the Font Software may be bundled,
    redistributed and/or sold with any software, provided that each copy
    contains the above copyright notice and this license. These can be
    included either as stand-alone text files, human-readable headers or
    in the appropriate machine-readable metadata fields within text or
    binary files as long as those fields can be easily viewed by the user.
    
    3) No Modified Version of the Font Software may use the Reserved Font
    Name(s) unless explicit written permission is granted by the corresponding
    Copyright Holder. This restriction only applies to the primary font name as
    presented to the users.
    
    4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
    Software shall not be used to promote, endorse or advertise any
    Modified Version, except to acknowledge the contribution(s) of the
    Copyright Holder(s) and the Author(s) or with their explicit written
    permission.
    
    5) The Font Software, modified or unmodified, in part or in whole,
    must be distributed entirely under this license, and must not be
    distributed under any other license. The requirement for fonts to
    remain under this license does not apply to any document created
    using the Font Software.
    
    TERMINATION
    This license becomes null and void if any of the above conditions are
    not met.
    
    DISCLAIMER
    THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
    OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
    COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
    DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
    OTHER DEALINGS IN THE FONT SOFTWARE.

