Apache Paimon Python
Copyright 2024 The Apache Software Foundation

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


This project bundles the following dependencies under the under the MIT license
- org.slf4j:slf4j-api:1.7.32

This project bundles the following dependencies under the Apache Software License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
- org.apache.logging.log4j:log4j-1.2-api:2.17.1
- org.apache.arrow:arrow-vector:14.0.0
- org.apache.arrow:arrow-format:14.0.0
- org.apache.arrow:arrow-memory-core:14.0.0
- org.apache.arrow:arrow-memory-unsafe:14.0.0
- org.apache.arrow:arrow-c-data:14.0.0
- com.google.flatbuffers:flatbuffers-java:1.12.0

This project bundles the following dependencies under the 2-Clause BSD License
- net.sf.py4j:py4j:0.10.9.7


Apache Paimon-shade (incubating)
Copyright 2023-2024 The Apache Software Foundation

Paimon : Bundle
Copyright 2023-2024 The Apache Software Foundation

paimon-common
Copyright 2023-2024 The Apache Software Foundation

This project bundles the following dependencies under the Apache Software License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
- org.roaringbitmap:RoaringBitmap:1.0.5
- org.apache.datasketches:datasketches-java:4.2.0
- org.apache.datasketches:datasketches-memory:2.2.0

This project bundles the following dependencies under the BSD 3-clause license.
You find them under licenses/LICENSE.antlr-runtime and licenses/LICENSE.janino.

- org.antlr:antlr4-runtime:4.9.3
- org.codehaus.janino:janino:3.0.11
- org.codehaus.janino:commons-compiler:3.0.11
- it.unimi.dsi:fastutil:8.5.12
- net.openhft:zero-allocation-hashing:0.16
- com.github.davidmoten:hilbert-curve:0.2.2
- com.github.davidmoten:guava-mini:0.1.3

datasketches-java
Copyright 2015-2022 The Apache Software Foundation

Apache DataSketches Memory
Copyright 2022 - The Apache Software Foundation

Copyright 2015-2018 Yahoo Inc.
Copyright 2019-2020 Verizon Media
Copyright 2021 Yahoo Inc.

Prior to moving to ASF, the software for this project was developed at
Yahoo Inc. (https://developer.yahoo.com).

Paimon : Core
Copyright 2023-2024 The Apache Software Foundation

Paimon : Code Gen Loader
Copyright 2023-2024 The Apache Software Foundation

paimon-format
Copyright 2023-2024 The Apache Software Foundation

This project bundles the following dependencies under the Apache Software License 2.0. (http://www.apache.org/licenses/LICENSE-2.0.txt)

- org.apache.orc:orc-core:1.9.2
- org.apache.orc:orc-shims:1.9.2
- org.apache.hive:hive-storage-api:2.8.1
- io.airlift:aircompressor:0.27
- commons-lang:commons-lang:2.6
- org.apache.commons:commons-lang3:3.12.0

- org.apache.avro:avro:1.11.3
- com.fasterxml.jackson.core:jackson-core:2.14.2
- com.fasterxml.jackson.core:jackson-databind:2.14.2
- com.fasterxml.jackson.core:jackson-annotations:2.14.2
- org.apache.commons:commons-compress:1.22

- org.apache.parquet:parquet-hadoop:1.13.1
- org.apache.parquet:parquet-column:1.13.1
- org.apache.parquet:parquet-common:1.13.1
- org.apache.parquet:parquet-encoding:1.13.1
- org.apache.parquet:parquet-format-structures:1.13.1
- org.apache.parquet:parquet-jackson:1.13.1
- commons-pool:commons-pool:1.6

This project bundles the following dependencies under the BSD license.
You find it under licenses/LICENSE.protobuf, licenses/LICENSE.zstd-jni
and licenses/LICENSE.threeten-extra

- com.google.protobuf:protobuf-java:3.19.6
- com.github.luben:zstd-jni:1.5.5-11
- org.threeten:threeten-extra:1.7.1

# Jackson JSON processor

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

## Licensing

Jackson 2.x core and extension components are licensed under Apache License 2.0
To find the details that apply to this artifact see the accompanying LICENSE file.

## Credits

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

Apache Commons Lang
Copyright 2001-2011 The Apache Software Foundation

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

ORC Core
Copyright 2013-2023 The Apache Software Foundation

ORC Shims
Copyright 2013-2023 The Apache Software Foundation

Apache Commons Lang
Copyright 2001-2021 The Apache Software Foundation

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

Hive Storage API
Copyright 2020 The Apache Software Foundation

Apache Avro
Copyright 2009-2023 The Apache Software Foundation

Apache Commons Compress
Copyright 2002-2022 The Apache Software Foundation

---

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

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

The test file lbzip2_32767.bz2 has been copied from libbzip2's source
repository:

This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2019 Julian R Seward.  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. The origin of this software must not be misrepresented; you must
   not claim that you wrote the original software.  If you use this
   software in a product, an acknowledgment in the product
   documentation would be appreciated but is not required.

3. Altered source versions must be plainly marked as such, and must
   not be misrepresented as being the original software.

4. The name of the author may not be used to endorse or promote
   products derived from this software without specific prior written
   permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.

Julian Seward, jseward@acm.org

Apache Commons Pool
Copyright 2001-2012 The Apache Software Foundation

Paimon : Hive Catalog
Copyright 2023-2024 The Apache Software Foundation

Paimon : Hive Common
Copyright 2023-2024 The Apache Software Foundation

paimon-shade-jackson-2
Copyright 2023-2024 The Apache Software Foundation

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

This project bundles the following dependencies under the Apache Software License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

- com.fasterxml.jackson.core:jackson-annotations:2.14.2
- com.fasterxml.jackson.core:jackson-core:2.14.2
- com.fasterxml.jackson.core:jackson-databind:2.14.2
- com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.14.2
- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.14.2
- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.14.2
- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2
- org.yaml:snakeyaml:1.33

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

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

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

paimon-shade-guava-30
Copyright 2023-2024 The Apache Software Foundation

- com.google.guava:guava:30.1.1-jre
- com.google.guava:failureaccess:1.0.1

paimon-shade-caffeine-2
Copyright 2023-2024 The Apache Software Foundation

- com.github.ben-manes.caffeine:caffeine:2.9.3

Paimon : Arrow
Copyright 2023-2024 The Apache Software Foundation

Apache Log4j 1.x Compatibility API
Copyright 1999-1969 The Apache Software Foundation

Arrow Vectors
Copyright 2023 The Apache Software Foundation

Arrow Format
Copyright 2023 The Apache Software Foundation

Arrow Memory - Core
Copyright 2023 The Apache Software Foundation

Arrow Memory - Unsafe
Copyright 2023 The Apache Software Foundation

Arrow Java C Data Interface
Copyright 2023 The Apache Software Foundation

Apache Flink
Copyright 2014-2024 The Apache Software Foundation

