Skip to main content

Simple package to extract text with coordinates from programmatic PDFs

Project description

Docling Parse

PyPI version PyPI - Python Version uv Pybind11 Platforms License MIT

Simple package to extract text, paths and bitmap images with coordinates from programmatic PDFs. This package is used in the Docling PDF conversion. Below, we show a few output of the latest parser with char, word and line level output for text, in addition to the extracted paths and bitmap resources.

To do the visualizations yourself, simply run (change word into char or line),

uv run python ./docling_parse/visualize.py -i <path-to-pdf-file> -c word --interactive
original char word line
screenshot screenshot screenshot screenshot
screenshot screenshot screenshot screenshot
screenshot screenshot screenshot screenshot
screenshot screenshot screenshot screenshot
screenshot screenshot screenshot screenshot

Quick start

Install the package from PyPI:

pip install docling-parse

Sequential parsing

docling-parse v7 split page parsing into two public configs:

  • DecodeConfig: how to compute pages. This is fixed when a document is opened.
  • ContentConfig: what to keep or materialize per page. This can be overridden per page.
from docling_core.types.doc.page import TextCellUnit
from docling_parse.pdf_parser import (
    ContentConfig,
    ContentLevel,
    DecodeConfig,
    DoclingPdfParser,
)

parser = DoclingPdfParser(loglevel="fatal")

pdf_doc = parser.load(
    path_or_stream="<path-to-pdf>",
    decode_config=DecodeConfig(
        do_sanitization=True,
        keep_glyphs=False,
    ),
    content_config=ContentConfig(
        char_cells_content_level=ContentLevel.SKIP,
        word_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
        line_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
        shapes_content_level=ContentLevel.SKIP,
        bitmaps_content_level=ContentLevel.SKIP,
    ),
)

for page_no, page in pdf_doc.iterate_pages():
    print(page_no, len(page.word_cells), len(page.textline_cells))

    for word in page.iterate_cells(unit_type=TextCellUnit.WORD):
        print(word.rect, word.text)

    image = page.render_as_image(cell_unit=TextCellUnit.WORD)
    image.show()

If you open cheaply and later need richer output, request it per page. When the new content_config needs entities that were previously skipped, that page is re-decoded automatically:

from docling_parse.pdf_parser import ContentConfig, ContentLevel

page = pdf_doc.get_page(
    1,
    content_config=ContentConfig(
        word_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
        line_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
    ),
)

v6 -> v7 migration

The main API break in v7 is that the old public DecodePageConfig selection flags were split into two concerns:

  • DecodeConfig: compute-time tuning only
  • ContentConfig: what to skip, compute, or materialize per page

In practice:

  • open-time decode_config replaces the old per-page decode tuning
  • per-page content selection now lives in content_config
  • materialize_bitmap_bytes became include_bitmap_bytes
  • threaded page_materialization_config became page_content_config

Typical migration examples:

  • old DecodePageConfig.keep_char_cells=True -> ContentConfig(char_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE)
  • old DecodePageConfig.create_word_cells=True without surfacing them everywhere -> ContentConfig(word_cells_content_level=ContentLevel.COMPUTE)
  • old materialize_bitmap_bytes=False -> ContentConfig(include_bitmap_bytes=False)

One semantic change matters: decode_config is now fixed when the document or threaded batch is opened. If you want richer page output later, override content_config on get_page(...) instead. On the sequential path this may re-decode that page; on the threaded path you can only materialize entities the batch already computed.

Parallel parsing (multi-threaded)

Parse one or more PDFs in parallel with backpressure:

from docling_parse.pdf_parser import (
    ContentConfig,
    ContentLevel,
    DecodeConfig,
    DoclingThreadedPdfParser,
    ThreadedPdfParserConfig,
)

parser = DoclingThreadedPdfParser(
    parser_config=ThreadedPdfParserConfig(
        loglevel="fatal",
        threads=4,
        max_concurrent_results=32,
        page_content_config=ContentConfig(
            word_cells_content_level=ContentLevel.COMPUTE,
            line_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
        ),
    ),
    decode_config=DecodeConfig(),
)

doc_key = parser.load("doc_a.pdf", page_numbers=[1, 3, 5])
print(doc_key, parser.page_count(doc_key), parser.scheduled_page_count(doc_key))

for result in parser.iterate_results():
    if not result.success:
        print(result.doc_key, result.page_number, result.error_message)
        continue

    # Batch decode kept word cells in C++, but did not materialize them by default.
    page = result.get_page(
        ContentConfig(
            word_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
            line_cells_content_level=ContentLevel.COMPUTE_AND_MATERIALIZE,
        )
    )
    print(
        result.doc_key,
        result.page_number,
        len(page.word_cells),
        result.timings.total_s,
    )

For threaded parse-and-render workloads, set ThreadedPdfParserConfig.render_config and use result.get_image(), result.get_image(scale=...), or result.get_image(canvas_size=...).

Use the CLI

$ docling-parse -h
usage: docling-parse [-h] -p PDF

Process a PDF file.

options:
  -h, --help         show this help message and exit
  -p PDF, --pdf PDF  Path to the PDF file

Performance Benchmarks

Current perf tooling lives under perf/:

For historical V1 vs V2 benchmarks, see legacy_performance_benchmarks.md.

Development

CXX

To build the parser, simply run the following command in the root folder,

rm -rf build; cmake -B ./build; cd build; make

You can run the parser from your build folder:

% ./parse.exe -h
program to process PDF files or configuration files
Usage:
  PDFProcessor [OPTION...]

  -i, --input arg          Input PDF file
  -c, --config arg         Config file
      --create-config arg  Create config file
  -p, --page arg           Pages to process (default: -1 for all) (default:
                           -1)
      --password arg       Password for accessing encrypted, password-protected files
  -o, --output arg         Output file
  -l, --loglevel arg       loglevel [error;warning;success;info]
  -h, --help               Print usage

If you don't have an input file, a template input file will be printed on the terminal.

Python

To build the package, simply run (make sure uv is installed),

uv sync

The latter will only work after a clean git clone. If you are developing and updating C++ code, please use,

# uv pip install --force-reinstall --no-deps -e .
rm -rf .venv; uv venv; uv pip install --force-reinstall --no-deps -e ".[perf-tools]"

or

BUILD_THREADS=12 uv pip install --force-reinstall --no-deps -e ".[perf]"

To test the package, run:

uv run pytest ./tests -v -s

Contributing

Please read Contributing to Docling Parse for details.

References

If you use Docling in your projects, please consider citing the following:

@techreport{Docling,
  author = {Docling Team},
  month = {8},
  title = {Docling Technical Report},
  url = {https://arxiv.org/abs/2408.09869},
  eprint = {2408.09869},
  doi = {10.48550/arXiv.2408.09869},
  version = {1.0.0},
  year = {2024}
}

License

The Docling Parse codebase is under MIT license. For individual model usage, please refer to the model licenses found in the original packages.

LF AI & Data

Docling (and also docling-parse) is hosted as a project in the LF AI & Data Foundation.

IBM ❤️ Open Source AI

The project was started by the AI for knowledge team at IBM Research Zurich.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docling_parse-7.4.0.tar.gz (6.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

docling_parse-7.4.0-cp314-cp314-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.14Windows x86-64

docling_parse-7.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

docling_parse-7.4.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

docling_parse-7.4.0-cp314-cp314-macosx_14_0_arm64.whl (9.2 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

docling_parse-7.4.0-cp313-cp313-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.13Windows x86-64

docling_parse-7.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

docling_parse-7.4.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

docling_parse-7.4.0-cp313-cp313-macosx_14_0_arm64.whl (9.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

docling_parse-7.4.0-cp312-cp312-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.12Windows x86-64

docling_parse-7.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

docling_parse-7.4.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

docling_parse-7.4.0-cp312-cp312-macosx_14_0_arm64.whl (9.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

docling_parse-7.4.0-cp311-cp311-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.11Windows x86-64

docling_parse-7.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

docling_parse-7.4.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

docling_parse-7.4.0-cp311-cp311-macosx_14_0_arm64.whl (9.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

docling_parse-7.4.0-cp310-cp310-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.10Windows x86-64

docling_parse-7.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

docling_parse-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (9.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

docling_parse-7.4.0-cp310-cp310-macosx_14_0_arm64.whl (9.2 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file docling_parse-7.4.0.tar.gz.

File metadata

  • Download URL: docling_parse-7.4.0.tar.gz
  • Upload date:
  • Size: 6.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for docling_parse-7.4.0.tar.gz
Algorithm Hash digest
SHA256 30297a61a8d09dc528adde853090fabe9d6b3f83de7e0a0ea6e9aafe01ec9b4a
MD5 e7feffd643346e820dc811cff316dd12
BLAKE2b-256 e57aaa975c0bd35dee784e5be00f9c402bf5290112df2657b1521e72ac3ab11d

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 948c67dacf245ae94266a355c9d08e2f533c85b271adac79293035c615841e69
MD5 e7ced46b52faea3c5b92ee2a90e0c2fe
BLAKE2b-256 2378370b53db9d537761044b80022c02521d3a6c538301b95896238699a9cf34

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 354ec50e73753d556abf1b3d065aa1fa5dcf8347f4f5f04ede1869099a3c8855
MD5 e0159df31336b1c17c11c31132d4624a
BLAKE2b-256 717e63db21fdd4d37c97d00b26201ec4ab7698c2e92b64a3c214bbfd69cb4523

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 345ed93482d257e1d135f129431819b52a194cdcc240424fcc756e311ea3b8d5
MD5 724db4b7a86192dd904460e2ba6bd4a7
BLAKE2b-256 bc8a15dd27e4011de79fd5c9f3517a93f8aae43f840a62949d3141117c19c9f0

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 bf3c2ac06f7e3e268af4255fda36493bf5e11961cccb6733dbc4abbc50da0435
MD5 c96078653b38ae85a4d01f6ec20ed99c
BLAKE2b-256 e5f87eec0096110e0e1692e8f0614a2681efbbc326ea8a91588d28f0bec95c45

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0a3f2f894606fef50af755b30f5b2ca2e3d0af9c3e874ad91bf98b17f6ced923
MD5 199586b6e277daa9a7a3ceaf6347b6c8
BLAKE2b-256 2b544a96cb1fddb9def633d3687554d3d915fe0256fcc4c8f0603ecd4398823f

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7fa6feeb0b17a6b8aa5f8ea686d657c4fa1f3a69aed86a68ce6b6e6d5b7fef36
MD5 88e19bf7e17ead43b4df0eba06277fd0
BLAKE2b-256 46b2dc3351da6239c31e8a2326f20edc7b5fa3ee1f49216b5a06917c23a62b20

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 66f9db331088cf17511adb27a9aa9089ce3cb4f55e83f1730d10fdba6a055059
MD5 7ed67b27608ff18d3f10f624895378e7
BLAKE2b-256 686e85d2730510f6621647e5789a2a876c955fe5e3bb713ce1568ccd72c9cf68

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 59e68161258504e743c65e8b71809dfde0916bb0df3acab6623c7ba5fdf6d36d
MD5 d55f96256a719b583efeeedbf00f76d9
BLAKE2b-256 7acc6bd474ae276855b8a8e9fd92d87c794d315beafabec72a6d406f763dc26a

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8d343f0416db7339e150797e0512a97d2003543a05c4cf4043f598dd6e1d394b
MD5 fd20212e0917a1da03199d9bdcfe3d5f
BLAKE2b-256 89235ed39e95e99d24fc806cfc0b1f15d9a9fb34ae7627211769bd892ded9e54

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3134fe552b0f20d9674217ee31c308aac2affe31266a2cdf89307a44b119cd00
MD5 07a744d0d55287b59c7680b41d89098d
BLAKE2b-256 9dd99dd6baa6ddfed91d81742c087e7b9cc0cfaa6e2cd422debfd9d575821482

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4926d277e0e66aeeaf7c6946459fda0e31e2d5faef5a0566787cdff03c60c0c1
MD5 c7d95c9b210b1c147b7f33d0a80af095
BLAKE2b-256 4c2abe8f91e859efad964ca86ae7b6babedec054ca5a175ddb650e2dc3b87b7d

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7e3bd1cc431330e7f4c9fc114d8ef2daf5c0b580fdc553eccdd847fcf3219752
MD5 1773dff9c0f78d0100a3f81effebde45
BLAKE2b-256 5498208fffeb9feef3b118b99b4cdbf00fdd265cb670172c147a57011379534c

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 cad3c4f6b5a9ed54f99c517320ded70cfb1e845c004a2a5a8b2d69637f0e883d
MD5 13899d2eb92ce5577d9ac855bda5aaa2
BLAKE2b-256 aa17d76b9716b5d027f0a338f15977e5092870f9c30b67104a3e86e7f8fb17b3

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 40c16c0afcf191221aac5bdf4b6935dd4d64883e21528f22d360daac16bcb4f3
MD5 745665e8b5048f20334b7424d9013c0d
BLAKE2b-256 667106ab145af372baa51ebead7d1d1ed1b01f4cd6e7eb83e8105a9f06b7d7ee

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f8a1e716aba22e780c9e20dc891356ca7efbf276451aef848937617745bf7b57
MD5 95030c8c44c689dd04b14eb504bba3fa
BLAKE2b-256 7d240b91d9b9306229e0683b07c1dc7e63b6c9143dc3507bda92ba68a8635bfc

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 41a4fd41db383e53091f648be7a802e7791ab4b2530f355905eb8b6a3ed5d135
MD5 328696a3acb6080255051276130e4dc2
BLAKE2b-256 e6f32ebd46cf52fa6f405a46c39c81ee49b8ca3309cfb17a4a79fd16b83cec00

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 95337710ba328cb4687222a0f6fa0d1f8cdfd9246b2f61d323a090b7ae052044
MD5 02d18bcd04c2ee024377ae4210ddfb03
BLAKE2b-256 b4fd5bc9fb8b372659eeae36c60df7f8573f5e72c5f2c46e0fbc41afe1100212

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 109adf8c12b4c47c21e27a6989c0f542cb2d5f1ea2bd02f6e05ca71e252c99dd
MD5 8616d0b09d3c98f8aea5dabe3190f744
BLAKE2b-256 69875fa8c4d96f5acbfef92c21604d628562aefc0a5dc4bb165ad82f86cc3396

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0274e16de8288835fb2c8a95a1d18fb55093c44014acd09e61a357f9b4022231
MD5 bfe949a5fa3102ce9fef7b7802837ece
BLAKE2b-256 368d3fde405321b25b6027581d4259f0e72b89475294562cea808dab608feb6e

See more details on using hashes here.

File details

Details for the file docling_parse-7.4.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for docling_parse-7.4.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1d8175cb711c4c373b96e126f36dfa1d776009881383369c4b2a85fcff98b469
MD5 ff854a4182e0c7b2fa4f7cb7fd9b2a71
BLAKE2b-256 cb5a01932f162e445d3f63ba92d2b97a097efd29e0a71aa54c1d78124a1c4291

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page