Skip to main content

The Blis BLAS-like linear algebra library, as a self-contained C-extension.

Project description

Cython BLIS: Fast BLAS-like operations from Python and Cython, without the tears

This repository provides the Blis linear algebra routines as a self-contained Python C-extension.

Currently, we only supports single-threaded execution, as this is actually best for our workloads (ML inference).

Azure Pipelines pypi Version conda Python wheels

Installation

You can install the package via pip, first making sure that pip, setuptools, and wheel are up-to-date:

pip install -U pip setuptools wheel
pip install blis

Wheels should be available, so installation should be fast. If you want to install from source and you're on Windows, you'll need to install LLVM.

Building BLIS for alternative architectures

The provided wheels should work on x86_64 and osx/arm64 architectures. Unfortunately we do not currently know a way to provide different wheels for alternative architectures, and we cannot provide a single binary that works everywhere. So if the wheel doesn't work for your CPU, you'll need to specify source distribution, and tell Blis your CPU architecture using the BLIS_ARCH environment variable.

a) Install with auto-detected CPU support

pip install spacy --no-binary blis

b) Install using an existing configuration

Provide an architecture from the supported configurations.

BLIS_ARCH="power9" pip install spacy --no-binary blis

c) Install with generic arch support

⚠️ generic is not optimized for any particular CPU and is extremely slow. Only recommended for testing!

BLIS_ARCH="generic" pip install spacy --no-binary blis

d) Build specific support

In order to compile Blis, cython-blis bundles makefile scripts for specific architectures, that are compiled by running the Blis build system and logging the commands. We do not yet have logs for every architecture, as there are some architectures we have not had access to.

See here for list of architectures. For example, here's how to build support for the Intel architecture knl:

git clone https://github.com/explosion/cython-blis && cd cython-blis
git pull && git submodule init && git submodule update && git submodule status
python3 -m venv venv
source venv/bin/activate
pip install -U pip setuptools wheel
pip install -r requirements.txt
./bin/generate-make-jsonl linux knl
BLIS_ARCH="knl" python setup.py build_ext --inplace
BLIS_ARCH="knl" python setup.py bdist_wheel

Fingers crossed, this will build you a wheel that supports your platform. You could then submit a PR with the blis/_src/make/linux-knl.jsonl and blis/_src/include/linux-knl/blis.h files so that you can run:

BLIS_ARCH="knl" pip install --no-binary=blis

Usage

Two APIs are provided: a high-level Python API, and direct Cython access, which provides fused-type, nogil Cython bindings to the underlying Blis linear algebra library. Fused types are a simple template mechanism, allowing just a touch of compile-time generic programming:

cimport blis.cy
A = <float*>calloc(nN * nI, sizeof(float))
B = <float*>calloc(nO * nI, sizeof(float))
C = <float*>calloc(nr_b0 * nr_b1, sizeof(float))
blis.cy.gemm(blis.cy.NO_TRANSPOSE, blis.cy.NO_TRANSPOSE,
             nO, nI, nN,
             1.0, A, nI, 1, B, nO, 1,
             1.0, C, nO, 1)

Bindings have been added as we've needed them. Please submit pull requests if the library is missing some functions you require.

Development

To build the source package, you should run the following command:

./bin/update-vendored-source

This populates the blis/_src folder for the various architectures, using the flame-blis submodule.

Updating the build files

In order to compile the Blis sources, we use jsonl files that provide the explicit compiler flags. We build these jsonl files by running Blis's build system, and then converting the log. This avoids us having to replicate the build system within Python: we just use the jsonl to make a bunch of subprocess calls. To support a new OS/architecture combination, we have to provide the jsonl file and the header.

Linux

The Linux build files need to be produced from within the manylinux2014 Docker container, so that they will be compatible with the wheel building process.

First, install docker. Then do the following to start the container:

sudo docker run -it quay.io/pypa/manylinux2014_x86_64:latest

Once within the container, the following commands should check out the repo and build the jsonl files for the generic arch:

mkdir /usr/local/repos
cd /usr/local/repos
git clone https://github.com/explosion/cython-blis && cd cython-blis
git pull && git submodule init && git submodule update && git submodule
status
/opt/python/cp36-cp36m/bin/python -m venv env3.6
source env3.6/bin/activate
pip install -r requirements.txt
./bin/generate-make-jsonl linux generic --export
BLIS_ARCH=generic python setup.py build_ext --inplace
# N.B.: don't copy to /tmp, docker cp doesn't work from there.
cp blis/_src/include/linux-generic/blis.h /linux-generic-blis.h
cp blis/_src/make/linux-generic.jsonl /

Then from a new terminal, retrieve the two files we need out of the container:

sudo docker ps -l # Get the container ID
# When I'm in Vagrant, I need to go via cat -- but then I end up with dummy
# lines at the top and bottom. Sigh. If you don't have that problem and
# sudo docker cp just works, just copy the file.
sudo docker cp aa9d42588791:/linux-generic-blis.h - | cat > linux-generic-blis.h
sudo docker cp aa9d42588791:/linux-generic.jsonl - | cat > linux-generic.jsonl

Project details


Download files

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

Source Distribution

blis-0.9.1.dev0.tar.gz (3.6 MB view details)

Uploaded Source

Built Distributions

blis-0.9.1.dev0-cp310-cp310-win_amd64.whl (7.4 MB view details)

Uploaded CPython 3.10 Windows x86-64

blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

blis-0.9.1.dev0-cp310-cp310-macosx_11_0_arm64.whl (893.9 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

blis-0.9.1.dev0-cp310-cp310-macosx_10_9_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

blis-0.9.1.dev0-cp39-cp39-win_amd64.whl (7.4 MB view details)

Uploaded CPython 3.9 Windows x86-64

blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

blis-0.9.1.dev0-cp39-cp39-macosx_11_0_arm64.whl (893.2 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

blis-0.9.1.dev0-cp39-cp39-macosx_10_9_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

blis-0.9.1.dev0-cp38-cp38-win_amd64.whl (7.4 MB view details)

Uploaded CPython 3.8 Windows x86-64

blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

blis-0.9.1.dev0-cp38-cp38-macosx_11_0_arm64.whl (887.9 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

blis-0.9.1.dev0-cp38-cp38-macosx_10_9_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

blis-0.9.1.dev0-cp37-cp37m-win_amd64.whl (7.4 MB view details)

Uploaded CPython 3.7m Windows x86-64

blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

blis-0.9.1.dev0-cp37-cp37m-macosx_10_9_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

blis-0.9.1.dev0-cp36-cp36m-win_amd64.whl (7.4 MB view details)

Uploaded CPython 3.6m Windows x86-64

blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

blis-0.9.1.dev0-cp36-cp36m-macosx_10_9_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file blis-0.9.1.dev0.tar.gz.

File metadata

  • Download URL: blis-0.9.1.dev0.tar.gz
  • Upload date:
  • Size: 3.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for blis-0.9.1.dev0.tar.gz
Algorithm Hash digest
SHA256 07873bf839769f83cdef5379c218ac57b66c0c7106c052a9a4db1295e4c4cec7
MD5 2701677092a7e63bfcc4038da0d1d20c
BLAKE2b-256 4bdad2fd4f397fbd5968b70fb51e857602127dc7dd77ff7c605100f2b34a2959

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c02febe404a513dd039204c54b4908719c37c6f1fca8423796fc8ee28ae7d8be
MD5 1b9184d32327ce85650878d7027f7cc4
BLAKE2b-256 c98c3cf6d1e0cead729e9d163720eb6b8a5e7811cb750de541f2bd3407a8d062

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0aee8aff4e4a45d44bcfb05bf8e4d8a91303362f53fd5f3ec6168bdfbb44c97a
MD5 ab3e94403e2b2922e557152065d4d1af
BLAKE2b-256 00d6ce5ec82c12b9cdc546cdd77be18b94149f75871963e272076a0713cfe4c3

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 39d4832241e1e8fc81f827fcd4f418a361cea1f947b41e5b71ab2006a042cda4
MD5 8b90459df8c0c0487415cc993767631e
BLAKE2b-256 45592bb5fb068e12e190adc933bf6bf0a41f0b9d1a338b87973c9acb51d0df09

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d71aecccfb161fa898382298730f46c82bacf6172e914c03b58a66985eaea527
MD5 b9040156fa660e1529ca974028ba31da
BLAKE2b-256 855b3454c46ec2e973ca86c6821207fc15c629aed944fcea3b1d87de3b634316

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ef952a30f47a5b8f39cae1931838148e08dd91de32a4bb3f8546bd0f37277ad7
MD5 e3afe9c98f87de67d18ea937d7902da5
BLAKE2b-256 f39e55ea5412fda355d6ef929c09bbef552147b275a9504fe4802859838294da

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: blis-0.9.1.dev0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 7.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for blis-0.9.1.dev0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d4fee95186b20ed36f6f5281ba571e8379f85b51bb9cc8837d7805ee4cb7dfc8
MD5 564f04e9464b099a15f7e7626a713b9c
BLAKE2b-256 f61d5ebd5d3655c3cf80b1b3b78eb603eb2c36d6ffb6fac724f7a44e8a376f8f

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 282d77cc32748de688e4209773e1dc608c699fd9aad54ef084bca5c3935d7203
MD5 3666c6ba57d9f860de62bb9289c8a0aa
BLAKE2b-256 410c71e4a06a7ab469b68fd59f0115edf6d0ea5c022ca202c502b8b6202b2bba

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7a4ce2f9d1157a7c497ae984c770fc820f7163245704186e304507f6d63b6de1
MD5 549f5d8568040b512d02e2f1221e76f4
BLAKE2b-256 40d1155aba2900d1d817b1ded9dba245af949feca8010c569b992f2dfe0075ca

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68b8a1ea8889130613026e516623dbc2705a2d6d55609558c98f4b34a4664b21
MD5 436eb9bef4d9252809f3378e53d44252
BLAKE2b-256 46da34d726ea3106403f840a3196aa8c6f8ae4b9a3e36a56b172547ac6c3ab37

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 60cc5dbe47c28909d86c6385b928e3256b658abd94d4bedaec7af17a14bb3ddc
MD5 46c541d4b97a1f5ab003cc804b82d8e6
BLAKE2b-256 9b29dbcf4c0e48dea4c0a8e9f48b2587c1bde751a65e2e2cf830cfe75fc263b9

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: blis-0.9.1.dev0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 7.4 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for blis-0.9.1.dev0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6187f43d0c34d0c8b51b3f651419584cdc6cff473f8badb5816a246cd887f00f
MD5 3e837bbafff59f3d152cbcf5a2c079cd
BLAKE2b-256 6d3b436a4e3292236581c8e9b8312848644119d83773011f66e831b05646a7d1

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 165cb1fbffb63c60ca9badaf23f8bab8f099e97dc80bea5ac701949e3a005c57
MD5 b4c7a9c13de726f0fec08f831e83d349
BLAKE2b-256 acacf23b2768abe448efde26fc724639d38a2fbfa374b8697d4a6e0ec8da3d90

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0f2c00fa8f5cba731e286ee6e8da95c03baaadf8bf91aad2f83e9de13d5a067a
MD5 b2234529c36e312e26a841673f5c155f
BLAKE2b-256 29d1214ce1ef9f7ea45ed28855490a33677842b49ad4e95320553c1732c70f03

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d84b726d2b0618eead9dc3b6d7393cb96bb52510a59b5ab248e24d9b1f300fd8
MD5 52148ceb0ce238b46c1a14ea1aa8bf06
BLAKE2b-256 44f6673c8ec3ad68c7288007c9bd3697ac3ace189c283265921f849fd0a8e068

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4684a90186d334bd00f1689c7d668c6a2c31d44b962456583633ae86d42cd03f
MD5 d02cd3f644bf234482456e2bcabb760a
BLAKE2b-256 4fa6ef9db39a16b8f8c91bef6304ff26767a89ee88a11301808b5b8b38131656

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 4fb397c97861d7dfba06a04286380c8b711ba5df8446b6a2edf7939e6f926ba9
MD5 a0e57a357de0eb17eaba5859f031e674
BLAKE2b-256 62782a93e815d714d90100c099301a93b26a47d5df854771d11f513a4332d5e8

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 96040a289a2d6b768f4d4077c5ae7b449494154fe64077d98f0f13a609dd0715
MD5 084a30ec675920b44f5ce51a20bb6942
BLAKE2b-256 862e153af1956cba74272789edebe7c45f8439904d79319ff93c06b08fdce25f

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f699ed3819cf84eb7ea8d91008dec4816fe8bda1fe12260c35b957e5fd6fb13b
MD5 1b07dcf2ccb166e6b408d8c4e30f0058
BLAKE2b-256 3b35d5fa5831bb15e7ceb5f062809e567443fa83ec8ca8b14fbb680492516b3f

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d1236c81e70deaee9fe38d4f546068ec875d3b27ba78867835cf1e7e937cda52
MD5 9363efae96bc61e19d831741598af41d
BLAKE2b-256 cad805773dd458c5453b7d09bad7194bdff0ec3dec60f4083217a4765403223a

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 3126b85be8051601e475f84def16bb3226a4b2bdd210e99c20f72febe73b879b
MD5 986e6d14a22575822c9d678685f3b95f
BLAKE2b-256 a90db4f28662f5b07b53cdb832b75c1a43da2ab8eb2adea56a0035db1edfd147

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c45ae399b56a919af41d3f82aec29128e615a1bec5ba092a051353b419e7fed1
MD5 274ca7123757ab1ccee600df25426753
BLAKE2b-256 993c3d253b0466741d5c239242dc09ca1eb3f4dc1725a320b36db36457528a7b

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9505c4be2a991442462dc2e58206ffbeb998204095942eec7b26592ec6c891ee
MD5 052b006746822850d7e973e3d8111c83
BLAKE2b-256 a89d9df7a9e74cbc296d3ee9ebfdffa01cadee38e3f0ec31095ee991dee01a8f

See more details on using hashes here.

File details

Details for the file blis-0.9.1.dev0-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for blis-0.9.1.dev0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 33d56702bce08210bcedf8b917aac4ea9a39638113f3fa51d711534404f45284
MD5 2bd4f77954b9697efd1e4682a72390dc
BLAKE2b-256 0edcf5205973f2a88f233cc201de8dba8c4f3646c69820d2a5dcb5b85e50e073

See more details on using hashes here.

Supported by

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