This file lists all licenses for code distributed.
All non-library code has the following 3-Clause BSD license.


Copyright (c) 2016, the R8 project authors.
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 Google 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 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.

Summary of distributed libraries:

- artifact: com.google.guava:guava:+
  name: Guava Google Core Libraries for Java
  copyrightHolder: The Guava Authors
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/guava
- artifact: com.google.guava:failureaccess:+
  name: Guava InternalFutureFailureAccess and InternalFutures
  copyrightHolder: The Guava Authors
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/guava
- artifact: com.google.guava:listenablefuture
  name: Guava ListenableFuture only
  copyrightHolder: The Guava Authors
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/guava
- artifact: com.google.code.gson:gson:+
  name: Gson
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/gson
- artifact: it.unimi.dsi:fastutil:+
  name: fastutil
  license: Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.html
  url: http://fasutil.di.unimi.it/
- artifact: org.ow2.asm:asm-commons:+
  name: ASM Commons
  copyrightHolder: INRIA, France Telecom
  license: BSD
  licenseUrl: http://asm.ow2.org/license.html
  url: http://asm.ow2.org/index.html
- artifact: org.ow2.asm:asm-tree:+
  name: ASM Tree
  copyrightHolder: INRIA, France Telecom
  license: BSD
  licenseUrl: http://asm.ow2.org/license.html
  url: http://asm.ow2.org/index.html
- artifact: org.ow2.asm:asm-util:+
  name: ASM Util
  copyrightHolder: INRIA, France Telecom
  license: BSD
  licenseUrl: http://asm.ow2.org/license.html
  url: http://asm.ow2.org/index.html
- artifact: org.ow2.asm:asm-analysis:+
  name: ASM Util
  copyrightHolder: INRIA, France Telecom
  license: BSD
  licenseUrl: http://asm.ow2.org/license.html
  url: http://asm.ow2.org/index.html
- artifact: org.ow2.asm:asm:+
  name: ASM Core
  copyrightHolder: INRIA, France Telecom
  license: BSD
  licenseUrl: http://asm.ow2.org/license.html
  url: http://asm.ow2.org/index.html
- artifact: org.jetbrains.kotlin:kotlin-stdlib:+
  name: org.jetbrains.kotlin:kotlin-stdlib
  copyrightHolder: JetBrains s.r.o.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://kotlinlang.org/
- artifact: org.jetbrains.kotlin:kotlin-stdlib-common:+
  name: org.jetbrains.kotlin:kotlin-stdlib
  copyrightHolder: JetBrains s.r.o.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://kotlinlang.org/
- artifact: org.jetbrains.kotlinx:kotlinx-metadata-jvm:+
  name: org.jetbrains.kotlinx:kotlinx-metadata-jvm
  copyrightHolder: JetBrains s.r.o.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://kotlinlang.org/
- artifact: org.jetbrains:annotations:+
  name: IntelliJ IDEA Annotations
  copyrightHolder: JetBrains s.r.o.
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://www.jetbrains.org
- artifact: org.checkerframework:checker-qual
  name: Checker Qual
  copyrightHolder: Checker Framework developers
  license: The MIT License
  licenseUrl: http://opensource.org/licenses/MIT
  url: https://github.com/typetools/checker-framework.git
- artifact: com.android.tools:sdk-common
  name: com.android.tools.sdk-common
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools.build:aapt2-proto
  name: com.android.tools.build.aapt2-proto
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://android.googlesource.com/platform/tools/base
- artifact: com.android.tools.ddms:ddmlib
  name: Android Tools ddmlib
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools:sdklib
  name: com.android.tools.sdklib
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools:repository
  name: com.android.tools.repository
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools.analytics-library:shared
  name: Android Tools Analytics Shared Library
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools.analytics-library:protos
  name: Android Tools Analytics Protobufs
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.google.protobuf:protobuf-java
  name: Protocol Buffers [Core]
  copyrightHolder: Google Inc.
  license: BSD 3-clause
  licenseUrl: https://github.com/protocolbuffers/protobuf/blob/main/LICENSE
  url: https://github.com/protocolbuffers/protobuf/
- artifact: com.android.tools.layoutlib:layoutlib-api
  name: Android Tools layoutlib-api
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools:dvlib
  name: com.android.tools.dvlib
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools:common
  name: com.android.tools.common
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: com.android.tools:annotations
  name: com.android.tools.annotations
  copyrightHolder: The Android Open Source Project
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://tools.android.com/
- artifact: net.sf.kxml:kxml2
  name: kXML 2 is a small XML pull parser based on the common XML pull API
  copyrightHolder: Stefan Haustein, Oberhausen, Rhld., Germany
  license: BSD
  licenseUrl: http://kxml.cvs.sourceforge.net/viewvc/kxml/kxml2/license.txt?view=markup
  url: http://kxml.cvs.sourceforge.net/viewvc/kxml/kxml2/
- artifact: org.jetbrains.kotlin:kotlin-stdlib-jdk8
  name: Kotlin Standard Library for JVM
  copyrightHolder: JetBrains s.r.o. and Kotlin Programming Language contributors.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/JetBrains/kotlin
- artifact: org.jetbrains.kotlin:kotlin-reflect
  name: Kotlin Full Reflection Library
  copyrightHolder: JetBrains s.r.o. and Kotlin Programming Language contributors.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/JetBrains/kotlin
- artifact: org.jetbrains.kotlin:kotlin-stdlib-jdk7
  name: Kotlin Standard Library for JVM
  copyrightHolder: JetBrains s.r.o. and Kotlin Programming Language contributors.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/JetBrains/kotlin
- artifact: com.google.jimfs:jimfs
  name: Jimfs
  copyrightHolder: Google Inc.
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/jimfs
- artifact: net.java.dev.jna:jna-platform
  name: Java Native Access
  copyrightHolder: JNA Development Team
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/java-native-access/jna
- artifact: javax.inject:javax.inject
  name: javax.inject
  copyrightHolder: The JSR-330 Expert Group
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://code.google.com/p/atinject/source/checkout
- artifact: org.bouncycastle:bcpkix-jdk15on
  name: Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs
  copyrightHolder: The Legion of the Bouncy Castle Inc.
  license: The MIT License
  licenseUrl: http://opensource.org/licenses/MIT
  url: http://www.bouncycastle.org/java.html
- artifact: org.bouncycastle:bcprov-jdk15on
  name: Bouncy Castle Provider
  copyrightHolder: The Legion of the Bouncy Castle Inc.
  license: The MIT License
  licenseUrl: http://opensource.org/licenses/MIT
  url: http://www.bouncycastle.org/java.html
- artifact: org.glassfish.jaxb:jaxb-runtime
  name: JAXB Runtime
  copyrightHolder: Oracle and/or its affiliates
  license: CDDL 1.1 and GPL 2.0 with Class-path Exception
  licenseUrl: https://oss.oracle.com/licenses/CDDL+GPL-1.1
  url: https://github.com/javaee/jaxb-v2
- artifact: org.jetbrains.intellij.deps:trove4j
  name: Trove4J
  copyrightHolder: JetBrains s.r.o. and Kotlin Programming Language contributors.
  license: GNU LESSER GENERAL PUBLIC LICENSE 2.1
  licenseUrl: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
  url: https://github.com/JetBrains/intellij-deps-trove4j
- artifact: xerces:xercesImpl
  name: Xerces2-j
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://svn.apache.org/repos/asf/xerces/java
- artifact: com.google.code.findbugs:jsr305
  name: FindBugs-jsr305
  copyrightHolder: University of Maryland
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://findbugs.sourceforge.net
- artifact: com.google.errorprone:error_prone_annotations
  name: error-prone annotations
  copyrightHolder: The Error Prone Authors
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/error-prone
- artifact: com.google.j2objc:j2objc-annotations
  name: Google Inc.
  copyrightHolder: The Error Prone Authors
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/google/j2objc
- artifact: org.apache.commons:commons-compress
  name: Apache Commons Compress
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://commons.apache.org/proper/commons-compress
- artifact: org.apache.httpcomponents:httpmime
  name: Apache HttpClient Mime
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://hc.apache.org/httpcomponents-client
- artifact: org.apache.httpcomponents:httpclient
  name: Apache HttpClient
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://hc.apache.org/httpcomponents-client
- artifact: org.apache.httpcomponents:httpcore
  name: Apache HttpCore
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://hc.apache.org/httpcomponents-core-ga
- artifact: org.jvnet.staxex:stax-ex
  name: Extended StAX API
  copyrightHolder: Oracle and/or its affiliates
  license: Eclipse Distribution License - v 1.0
  licenseUrl: http://www.eclipse.org/org/documents/edl-v10.php
  url: https://github.com/eclipse-ee4j/jaxb-stax-ex
- artifact: jakarta.xml.bind:jakarta.xml.bind-api
  name: jakarta.jakarta.xml.bind-api
  copyrightHolder: Oracle and/or its affiliates
  license: Eclipse Distribution License - v 1.0
  licenseUrl: http://www.eclipse.org/org/documents/edl-v10.php
  url: https://eclipse-ee4j.github.io/jaxb-ri/
- artifact: org.glassfish.jaxb:txw2
  name: TXW2 Runtime
  copyrightHolder: Oracle and/or its affiliates
  license: CDDL 1.1 and GPL 2.0 with Class-path Exception
  licenseUrl: https://oss.oracle.com/licenses/CDDL+GPL-1.1
  url: https://github.com/javaee/jaxb-v2
- artifact: com.sun.istack:istack-commons-runtime
  name: istack common utility code runtime
  copyrightHolder: Oracle and/or its affiliates
  license: Eclipse Distribution License - v 1.0
  licenseUrl: http://www.eclipse.org/org/documents/edl-v10.php
  url: https://github.com/eclipse-ee4j/jaxb-istack-commons
- artifact: com.sun.xml.fastinfoset:FastInfoset
  name: fastinfoset
  copyrightHolder: Oracle and/or its affiliates
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://github.com/eclipse-ee4j/jaxb-fi
- artifact: jakarta.activation:jakarta.activation-api
  name: JavaBeans Activation Framework API jar
  copyrightHolder: Oracle and/or its affiliates
  license: Eclipse Distribution License - v 1.0
  licenseUrl: http://www.eclipse.org/org/documents/edl-v10.php
  url: https://github.com/jakartaee/jaf-api
- artifact: xml-apis:xml-apis
  name: XML Commons External Components XML APIs
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://xml.apache.org/commons/components/external
- artifact: com.sun.activation:javax.activation
  name: JavaBeans Activation Framework
  copyrightHolder: Oracle and/or its affiliates
  license: CDDL 1.1 and GPL 2.0 with Class-path Exception
  licenseUrl: https://oss.oracle.com/licenses/CDDL+GPL-1.1
  url: https://github.com/eclipse-ee4j/jaxb-fi
- artifact: commons-logging:commons-logging
  name: Apache Commons Logging
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://commons.apache.org/proper/commons-logging
- artifact: commons-codec:commons-codec
  name: Apache Commons Codec
  copyrightHolder: Apache Software Foundation
  license: The Apache License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: http://commons.apache.org/proper/commons-codec


Licenses details:



                                 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.


Copyright (c) 2000-2011 INRIA, France Telecom
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. Neither the name of the copyright holders 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.

Apache Commons Compress
Copyright 2002-2016 The Apache Software Foundation

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

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

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


Checker Framework qualifiers
Copyright 2004-present by the Checker Framework developers

MIT License:

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.
