Skip to main content

Multi-Label Anisotropic Euclidean Distance Transform 3D

Project description

PyPI version DOI

Multi-Label Anisotropic 3D Euclidean Distance Transform (MLAEDT-3D)

Compute the Euclidean Distance Transform of a 1d, 2d, or 3d labeled image containing multiple labels in a single pass with support for anisotropic dimensions. Curious what the output looks like? Download the movie!

import edt
import numpy as np

# e.g. 6nm x 6nm x 30nm for the S1 dataset by Kasthuri et al., 2014
labels = np.ones(shape=(512, 512, 512), dtype=np.uint32, order='F')
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=4 # number of threads, <= 0 sets to num cpu
)
# see more features below

Use Cases

  1. Compute the distance transform of a volume containing multiple labels simultaneously and then query it using a fast masking operator.
  2. Convert the multi-label volume into a binary image (i.e. a single label) using a masking operator and compute the ordinary distance transform.

Python Installation

pip Binary Installation

pip install edt

Binaries are available for some platforms. If your platform is not supported, pip will attempt to install from source, in which case follow the instructions below.

pip Source Installation

Requires a C++ compiler.

sudo apt-get install g++ python3-dev
pip install numpy
pip install edt --no-binary :all:

Python Usage

Consult help(edt) after importing. The edt module contains: edt and edtsq which compute the euclidean and squared euclidean distance respectively. Both functions select dimension based on the shape of the numpy array fed to them. 1D, 2D, and 3D volumes are supported. 1D processing is extremely fast. Numpy boolean arrays are handled specially for faster processing.

If for some reason you'd like to use a specific 'D' function, edt1d, edt1dsq, edt2d, edt2dsq, edt3d, and edt3dsq are available.

The two optional parameters are anisotropy and black_border. Anisotropy is used to correct for distortions in voxel space, e.g. if X and Y were acquired with a microscope, but the Z axis was cut more corsely.

black_border allows you to specify that the edges of the image should be considered in computing pixel distances (it's also slightly faster).

import edt
import numpy as np

# e.g. 6nm x 6nm x 30nm for the S1 dataset by Kasthuri et al., 2014
labels = np.ones(shape=(512, 512, 512), dtype=np.uint32, order='F')
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=1 # number of threads, <= 0 sets to num cpu
)
# signed distance function (0 is considered background)
sdf = edt.sdf(...) # same arguments as edt

# You can extract individual components of the distance transform
# in sequence rapidly using this technique. A random image may be slow
# as this uses "runs" of voxels to address only parts of the image at a time.
# in_place=True may be faster and more memory efficient, but is read-only.
for label, image in edt.each(labels, dt, in_place=True):
  process(image) # stand in for whatever you'd like to do

# There is also a voxel_graph argument that can be used for dealing
# with shapes that loop around to touch themselves. This works by
# using a voxel connectivity graph represented as a image of bitfields
# that describe the permissible directions of travel at each voxel.
# Voxels with an impermissible direction are treated as eroded
# by 0.5 in that direction instead of being 1 unit from black.
# WARNING: This is an experimental feature and uses 8x+ memory.
graph = np.zeros(labels.shape, dtype=np.uint8)
graph |= 0b00111111 # all 6 directions permissible (-z +z -y +y -x +x)
graph[122,334,312] &= 0b11111110 # +x isn't allowed at this location
graph[123,334,312] &= 0b11111101 # -x isn't allowed at this location
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=1, # number of threads, <= 0 sets to num cpu
  voxel_graph=graph,
) 

Note on Memory Usage: Make sure the input array to edt is contiguous memory or it will make a copy. You can determine if this is the case with print(data.flags).

C++ Instructions for MLAEDT-3D

Compute the Euclidean Distance Transform of a 1d, 2d, or 3d labeled image containing multiple labels in a single pass with support for anisotropic dimensions. C++ function expect the input array to be in Fortran (column-major) order. If your array is in C (row-major) order, it will also work but you must reverse the order of the dimension and anisotropy arguments (sx,sy,sz -> sz,sy,sx and wx,wy,wz -> wz,wy,wx).

Compiling

You only need src/edt.hpp and src/threadpool.h for most purposes.

C++ Examples

#include "edt.hpp"

int* labels1d = new int[512]();
int* labels2d = new int[512*512]();
int* labels3d = new int[512*512*512]();

// ... populate labels ...

// 1d, 2d, and 3d anisotropic transforms, wx = anisotropy on x-axis 
float* dt = edt::edt<int>(labels1d, /*sx=*/512, /*wx=*/1.0, /*black_border=*/true); 
float* dt = edt::edt<int>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true, /*parallel=*/1); 
float* dt = edt::edt<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/2); 

// get the squared distance instead (avoids computing sqrt)
float* dt = edt::edtsq<int>(labels1d, /*sx=*/512, /*wx=*/1.0, /*black_border=*/true); 
float* dt = edt::edtsq<int>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true, /*parallel=*/4); 
float* dt = edt::edtsq<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/8); 

// signed distance field edt::sdf and edt::sdfsq
float* dt = edt::sdf<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/8);

High Performance Binary Images

Binary images are treated specially in 2D and 3D to avoid executing the extra multi-label logic (1D is very fast even with it). This results in a substantial savings of perhaps 20-50% depending on the compiler. For a 512x512x512 cube filled with ones, on a 4.0 GHz linux machine with g++, I witnessed reductions from 9 sec. to 7 sec. (1.29x). On 2.8 GHz Mac OS with clang-902.0.39.2 I saw a reduction from 12.4 sec to 7.9 sec (1.56x).

The code will easily handle all integer types, and the image only needs to be binary in the sense that there is a single non-zero label, it doesn't have to be ones.

Boolean typed images are handled specially by a specialization of the edt function, so nothing different from above needs to be done. If you have an integer typed image, you'll need to use binary_edt or binary_edtsq instead to take advantage of this.

You'll get slightly higher performance setting black_border=true.

#include "edt.hpp"

using namespace edt;

bool* labels2d = new bool[512*512]();
bool* labels3d = new bool[512*512*512]();

float* dt = edt<bool>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true); 
float* dt = edt<bool>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true); 


int* labels2d = new int[512*512]();
int* labels3d = new int[512*512*512]();

float* dt = binary_edt<int>(labels2d, /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0); 
float* dt = binary_edt<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true); 

Motivation

A Labeled 3D Image. Credit: Kisuk Lee
Fig. 1. A labeled 3D connectomics volume. Credit: Kisuk Lee

The connectomics field commonly generates very large densely labeled volumes of neural tissue. Some algorithms, such as the TEASAR skeletonization algorithm [1] and its descendant [2] require the computation of a 3D Euclidean Distance Transform (EDT). We found that the scipy implementation of the distance transform (based on the Voronoi method of Maurer et al. [3]) was too slow for our needs despite being relatively speedy.

The scipy EDT took about 20 seconds to compute the transform of a 512x512x512 voxel binary image. Unfortunately, there are typically more than 300 distinct labels within a volume, requiring the serial application of the EDT. While cropping to the ROI does help, many ROIs are diagonally oriented and span the volume, requiring a full EDT. I found that in our numpy/scipy based implementation of TEASAR, EDT was taking approximately a quarter of the time on its own. The amount of time the algorithm spent per a block was estimated to be multiple hours per a core.

It's possible to compute the EDT much more quickly by computing the distance transform for all labels in one pass by making it boundary aware. Since the distance transform does not result in overlapping boundaries, it is trivial to then extract individual ROIs by to querying the block with the shapes of individual labels.

Fig. 2. Extracting the distance transform of a single label from dense segmentation. (a) a 2d slice of dense segmentation (b) extraction of a single label into a binary image (c) simultaneous distance transform of all labels in (a) (d) distance transform of (b) which can be achieved by direct distance transform of (b) or by the multiplication of (b) with (c).
Fig. 2. Extracting the distance transform of a single label from dense segmentation. (a) a 2d slice of dense segmentation (b) extraction of a single label into a binary image (c) simultaneous distance transform of all labels in (a) (d) distance transform of (b) which can be achieved by direct distance transform of (b) or by the multiplication of (b) with (c).

The implementation presented here uses concepts from the 1994 paper by T. Saito and J. Toriwaki [4] and uses a linear sweeping method inspired by the 1966 method of Rosenfeld and Pfaltz [4] and of Mejister et al [7] with that of Mejister et al's and Felzenszwald and Huttenlocher's 2012 [6] two pass linear time parabolic minmal envelope method. I later learned that this method was discovered as early as 1992 by Rein van den Boomgaard in his thesis. [10] I incorporate a few minor modifications to the algorithms to remove the necessity of a black border. My own contribution here is the modification of both the linear sweep and linear parabolic methods to account for multiple label boundaries.

This implementation was able to compute the distance transform of a binary image in 7-8 seconds. When adding in the multiple boundary modification, this rose to 9 seconds. Incorporating the cost of querying the distance transformed block with masking operators, the time for all operators rose to about 90 seconds, well short of the over an hour required to compute 300 passes.

Basic EDT Algorithm Description

A naive implementation of the distance transform is very expensive as it would require a search that is O(N2) in the number of voxels. In 1994, Saito and Toriwaki (ST) showed how to decompose this search into passes along x, y, and z linear in the number of voxels. After the X-axis EDT is computed, the Y-axis EDT can be computed on top of it by finding the minimum x2 + y2 for each voxel within each column. You can extend this argument to N dimensions. The pertient issue is then finding the minima efficiently without having to scan each column a quadratic number of times.

Felzenszwalb and Huttenlocher (FH) [6] and others have described taking advantage of the geometric interpretation of the distance function, as a parabola. Using ST's decomposition of the EDT into three passes, each broken up by row, the problem becomes one dimensional. FH described computing each pass on each row by finding the minimal envelope of the space created by the parabolas that project from the vertices located at (i, f(i)) for a one dimensional image f.

This method works by first scanning the row and finding a set of parabolas that constitue the lower envelope. Simultaneously during this linear scan, it computes the abscissa of the nearest parabola to the left and thereby defines the effective domain of each vertex. This linear reading scan is followed by a linear writing scan that records the height of the envelope at each voxel.

This method is linear and relatively fast, but there's another trick we can do to speed things up. The first transformation is special as we have to change the binary image f into a floating point representation. FH recommended using an indicator function that records zeros for out of set and infinities for within set voxels on the first pass. However, this is somewhat cumbersome to reason about and requires an additional remapping of the image.

The original Rosenfeld and Pfaltz (RP) paper [5] demonstrated a remarkably simple two pass sweeping algorithm for computing the manhattan distance (L1 norm, visualized here). On the first pass, the L1 and the L2 norm agree as only a single dimension is involved. Using very simple operators and sweeping forward we can compute the increasing distance of a voxel from its leftmost bound. We can then reconcile the errors in a backward pass that computes the minimum of the results of the first pass and the distance from the right boundary. Mejister, Roerdink, and Hesselink (MRH) [7] described a similar technique for use with binary images within the framework set by ST.

In all, we manage to achieve an EDT in six scans of an image in three directions. The use of the RP and MRH inspired method for the first transformation saves about 30% of the time as it appears to use a single digit percentage of the CPU time. In the second and third passes, due to the read and write sequence of FH's method, we can read and write to the same block of memory, increasing cache coherence and reducing memory usage.

Multi-Label 1D RP and MRH Inspired Algorithm

The forward sweep looks like:

f(a_i) = 0               ; a_i = 0  
       = a_i + 1         ; a_i = 1, i > 0
       = inf             ; a_i = 1, i = 0

I modify this to include consideration of multi-labels as follows:

let a_i be the EDT value at i
let l_i be the label at i (seperate 1:1 corresponding image)
let w be the anisotropy value

f(a_i, l_i) = 0          ; l_i = 0
f(a_i, l_i) = a_i + w    ; l_i = l_i-1, l_i != 0

f(a_i, l_i) = w          ; l_i != l_i-1, l_i != 0 
  f(a_i-1, l_i-1) = w    ; l_i-1 != 0
  f(a_i-1, l_i-1) = 0    ; l_i-1 = 0

The backwards pass is unchanged:

from n-2 to 1:
    f(a_i) = min(a_i, a_i+1 + 1)
from 0 to n-1:
    f(a_i) = f(a_i)^2

Anisotropy Support in FH Algorithm

A small update to the parabolic intercept equation is necessary to properly support anisotropic dimensions. The original equation appears on page 419 of their paper (reproduced here):

s = ((f(r) + r^2) - (f(q) + q^2)) / 2(r - q)

Where given parabola on an XY plane:
s:    x-coord of the intercept between two parabolas
r:    x-coord of the first parabola's vertex
f(r): y-coord of the first parabola's vertex
q:    x-coord of the second parabola's vertex
f(q): y-coord of the second parabola's vertex

However, this equation doesn't work with non-unitary anisotropy. The derivation of the proper equation follows.

1. Let w = the anisotropic weight
2. (ws - wq)^2 + f(q) = (ws - wr)^2 + f(r)
3. w^2(s - q)^2 + f(q) = w^2(s - r)^2 # w^2 can be pulled out after expansion
4. w^2( (s-q)^2 - (s-r)^2 ) = f(r) - f(q)
5. w^2( s^2 - 2sq + q^2 - s^2 + 2sr - r^2 ) = f(r) - f(q)
6. w^2( 2sr - 2sq + q^2 - r^2 ) = f(r) - f(q)
7. 2sw^2(r-q) + w^2(q^2 - r^2) = f(r) - f(q)
8. 2sw^2(r-q) = f(r) - f(q) - w^2(q^2 - r^2)

=> s = (w^2(r^2 - q^2) + f(r) - f(q)) / 2w^2(r-q)

As the computation of s is one of the most expensive lines in the algorithm, two multiplications can be saved by factoring w2 (r2 - q2) into w2 (r - q) (r + q). Here we save one multiplication in computing r*r + q*q and replace it with a subtraction. In the denominator of s, we avoid having to multiply by w2 or compute r-q again. This trick prevents anisotropy support from adding substantial costs.

Let w2 = w * w
Let factor1 = (r - q) * w2
Let factor2 = r + q

Let s = (f(r) - f(q) + factor1 * factor2) / (2 * factor1);

Multi-Label Felzenszwalb and Huttenlocher Variation

The parabola method attempts to find the lower envelope of the parabolas described by vertices (i, f(i)).

We handle multiple labels by running the FH method on contiguous blocks of labels independently. For example, in the following column:

Y LABELS:  0 1 1 1 1 1 2 0 3 3 3 3 2 2 1 2 3 0
X AXIS:    0 9 9 1 2 9 7 0 2 3 9 1 1 1 4 4 2 0
FH Domain: 1 1 1 1 1 1 2 2 3 3 3 3 4 4 5 6 7 7

Each domain is processed within the envelope described below. This ensures that edges are labeled 1. Alternatively, one can preprocess the image and set differing label pixels to zero and run the FH method without changes, however, this causes edge pixels to be labeled 0 instead of 1. I felt it was nicer to let the background value be zero rather than something like -1 or infinity since 0 is more commonly used in our processes as background.

Additional Parabolic Envelope

Applies to parameter black_border=True.

The methods of RP, ST, and FH all appear to depend on the existence of a black border ringing the ROI. Without it, the Y pass can't propogate a min signal near the border. However, this approach seems wasteful as it requires about 6s2 additional memory (for a cube) and potentially a copy into bordered memory. Instead, I opted to impose an envelope around all passes. For an image I with n voxels, I implicitly place a vertex at (-1, 0) and at (n, 0). This envelope propogates the edge effect through the volume.

To modify the first X-axis pass, I simply mark I[0] = 1 and I[n-1] = 1. The parabolic method is a little trickier to modify because it uses the vertex location to reference I[i]. -1 and n are both off the ends of the array and therefore would crash the program. Instead, I add the following lines right after the second pass write:

// let w be anisotropy
// let i be the index
// let v be the abcissa of the parabola's vertex
// let n be the number of voxels in this row
// let d be the transformed (destination) image

d[i] = square(w * (i - v)) + I[v] // line 18, pp. 420 of FH [6]
envelope = min(square(w * (i+1)), square(w * (n - i))) // envelope computation
d[i] = min(envelope, d[i]) // application of envelope

These additional lines add about 3% to the running time compared to a program without them. I have not yet made a comparison to a bordered variant.

Performance vs. SciPy

Fig. 3: Extraction of Individual EDT from 334 Labeled Segments in SNEMI3D MIP 1 (512x512x100 voxels)
Fig. 3. Extraction of Individual EDT from 334 Labeled Segments in SNEMI3D MIP 1 (512x512x100 voxels)

The above experiment was gathered using memory_profiler while running the below code once for each function.

import edt
from tqdm import tqdm
from scipy import ndimage

import numpy as np

labels = load_snemi3d_image()
uniques = np.unique(labels)[1:]

def edt_test():
  res = edt.edt(labels, order='F')
  for segid in tqdm(uniques):
    extracted = res * (labels == segid)

def ndimage_test():
  for segid in tqdm(uniques):
    extracted = (labels == segid)
    extracted = ndimage.distance_transform_edt(extracted)

References

  1. M. Sato, I. Bitter, M.A. Bender, A.E. Kaufman, and M. Nakajima. "TEASAR: Tree-structure Extraction Algorithm for Accurate and Robust Skeletons". Proc. 8th Pacific Conf. on Computer Graphics and Applications. Oct. 2000. doi: 10.1109/PCCGA.2000.883951 (link)
  2. I. Bitter, A.E. Kaufman, and M. Sato. "Penalized-distance volumetric skeleton algorithm". IEEE Transactions on Visualization and Computer Graphics Vol. 7, Iss. 3, Jul-Sep 2001. doi: 10.1109/2945.942688 (link)
  3. C. Maurer, R. Qi, and V. Raghavan. "A Linear Time Algorithm for Computing Exact Euclidean Distance Transforms of Binary Images in Arbitrary Dimensions". IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 25, No. 2. February 2003. doi: 10.1109/TPAMI.2003.1177156 (link)
  4. T. Saito and J. Toriwaki. "New Algorithms for Euclidean Distance Transformation of an n-Dimensional Digitized Picture with Applications". Pattern Recognition, Vol. 27, Iss. 11, Nov. 1994, Pg. 1551-1565. doi: 10.1016/0031-3203(94)90133-3 (link)
  5. A. Rosenfeld and J. Pfaltz. "Sequential Operations in Digital Picture Processing". Journal of the ACM. Vol. 13, Issue 4, Oct. 1966, Pg. 471-494. doi: 10.1145/321356.321357 (link)
  6. P. Felzenszwald and D. Huttenlocher. "Distance Transforms of Sampled Functions". Theory of Computing, Vol. 8, 2012, Pg. 415-428. doi: 10.4086/toc.2012.v008a019 (link)
  7. A. Meijster, J.B.T.M. Roerdink, and W.H. Hesselink. (2002) "A General Algorithm for Computing Distance Transforms in Linear Time". In: Goutsias J., Vincent L., Bloomberg D.S. (eds) Mathematical Morphology and its Applications to Image and Signal Processing. Computational Imaging and Vision, vol 18. Springer, Boston, MA. doi: 10.1007/0-306-47025-X_36 (link)
  8. H. Zhao. "A Fast Sweeping Method for Eikonal Equations". Mathematics of Computation. Vol. 74, Num. 250, Pg. 603-627. May 2004. doi: 10.1090/S0025-5718-04-01678-3 (link)
  9. H. Zhao. "Parallel Implementations of the Fast Sweeping Method". Journal of Computational Mathematics. Vol. 25, No.4, Pg. 421-429. July 2007. Institute of Computational Mathematics and Scientific/Engineering Computing. (link)
  10. "The distance transform, erosion and separability". https://www.crisluengo.net/archives/7 Accessed October 22, 2019. (This site claims Rein van den Boomgaard discovered a parabolic method at the latest in 1992. Boomgaard even shows up in the comments! If I find his thesis, I'll update this reference.)

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

edt-3.1.0.tar.gz (3.2 MB view details)

Uploaded Source

Built Distributions

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

edt-3.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

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

edt-3.1.0-cp314-cp314t-macosx_11_0_arm64.whl (271.1 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

edt-3.1.0-cp314-cp314t-macosx_10_13_x86_64.whl (283.8 kB view details)

Uploaded CPython 3.14tmacOS 10.13+ x86-64

edt-3.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

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

edt-3.1.0-cp314-cp314-macosx_11_0_arm64.whl (255.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

edt-3.1.0-cp314-cp314-macosx_10_13_x86_64.whl (271.6 kB view details)

Uploaded CPython 3.14macOS 10.13+ x86-64

edt-3.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

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

edt-3.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

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

edt-3.1.0-cp313-cp313-macosx_11_0_arm64.whl (253.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

edt-3.1.0-cp313-cp313-macosx_10_13_x86_64.whl (271.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

edt-3.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

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

edt-3.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

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

edt-3.1.0-cp312-cp312-macosx_11_0_arm64.whl (253.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

edt-3.1.0-cp312-cp312-macosx_10_13_x86_64.whl (272.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

edt-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

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

edt-3.1.0-cp311-cp311-macosx_11_0_arm64.whl (253.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

edt-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl (273.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

edt-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

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

edt-3.1.0-cp310-cp310-macosx_11_0_arm64.whl (254.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

edt-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl (274.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

edt-3.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

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

edt-3.1.0-cp39-cp39-macosx_11_0_arm64.whl (255.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

edt-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl (275.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

edt-3.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

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

edt-3.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

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

edt-3.1.0-cp38-cp38-macosx_11_0_arm64.whl (258.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

edt-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl (278.2 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file edt-3.1.0.tar.gz.

File metadata

  • Download URL: edt-3.1.0.tar.gz
  • Upload date:
  • Size: 3.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0.tar.gz
Algorithm Hash digest
SHA256 c977d78e3bb623e0c88af9df8558f24db871e149c6664d066a07bfe5a7fa20c1
MD5 b082c6e513783a701cd1f262b1053065
BLAKE2b-256 4cc419001c856916762e3043bea3c5053ce9fc49ad1cda47a0ac62b6e5b59545

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 03c6d96c00ae61970d985a133809ebd2e9a490f1a85521240807664ea9326343
MD5 84bc9e7286cf296e9b98c9c4224fce0a
BLAKE2b-256 fa835de9d0506dd6be643c73c591aeb085796326892ca431eea4d35b94a140bb

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bb43377d367a3fcdef8bf9a4a69b48885116d4872f85cd41148a18eb2325b125
MD5 7e2c16780e321233347b250277a8d098
BLAKE2b-256 e9f15eb272c5b8caa782273396157d9af0293e894da0662c0c4c99690bbf658b

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a435837ab1df0186520287ef7235b041c16e8693d3d7d8ffd83e25b47b18a4c1
MD5 af4631815bf1ddad736a0113adf9d029
BLAKE2b-256 9f8d56f1cdf007712483516cf16ece83aa8710055b148016b08318354acb2510

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314t-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314t-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 52c279a540e6b107a533b6577aa1bac9d9b34c080a4cec02485981bbcd7b1ecc
MD5 f034c160f13fe3b936ed3d1037c42f01
BLAKE2b-256 edd4d84830035c4f133e6f1f60cf8763acd3c36ad2a3e8855381e2ad104bf69f

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 731bcadee34bd6b7cdd17f5239fe974722218f0f118ed32eb5721f716e2d1450
MD5 f0f2e153b5b7638d7efc4ccbf15977fd
BLAKE2b-256 ad8c664b043d634fdae0d5f3ca633de1ab962312a74e24ce33f95aacb5b8212f

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c5b2f89c6f8491aa5c233b48762e77108fce410baae8a6ed43463bcf091e9313
MD5 ff4047ce8537c7ac2963c8dba6fe02d4
BLAKE2b-256 adf26bb1918ebbeeb11a635658e4f5af61a591e9edc67bcc3632633ee7ec3683

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp314-cp314-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 255.2 kB
  • Tags: CPython 3.14, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a18aa19927c499fa2a2cd24f4fff571fd8c561511f250cf830828b0ce9781b15
MD5 ed748c64642b815dcc562beb75edb074
BLAKE2b-256 68018a412ddf75c9f29987bcc9606a78b65b62abf5f5441ef216c502f0d09084

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp314-cp314-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp314-cp314-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b11aced84b86f498fd5c45a570d2029e0bf44b48cb718b819e0bc1dc1261d583
MD5 acde69057bcfd664ad421a8fda344be1
BLAKE2b-256 784ba5128ba4a4b5c1dd4054573add76661dbe38d4cfd5c58bb45629b84d2d75

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a78548e42765fe5b32f193e6fba9c26a9c7ed6b39a097f370bb700950995463a
MD5 cb3072c472decc66653f81da88ee427d
BLAKE2b-256 7e154cb517982a8f19d484188ed7424bc3d090274def700e11d1f0c0d06200e3

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bf45b1d5500fed7ffcb89ee16cac0a8354a00769277e995b94431555125cbf9f
MD5 01653ea177d074444844f2207fede7c9
BLAKE2b-256 40a70e3bd51c48e068e6d8b8b64dd89bc19edd790f02f93744c7e8d4bf333ac7

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.1 kB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8628d9c9072ab075c9bbc9792b07e8d256137e9df6c9bbba096638da3adc446d
MD5 f80d99ad5309a27f0bf4ef3ee0fca8a8
BLAKE2b-256 48f43dc191d19ad7d1e5bdda78b09d2f2357ee48e83ade99896fb3c9915c5492

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 04453646d4a9791193bb5ed1f34a21c8d2a5842571702093453c01c30ffbc105
MD5 19738aa835804e5f4ddf427cc1d96a8e
BLAKE2b-256 96bb8b08e1750d7065d384ffc58b7834c52e0771996a58ae69575c99b80b32f5

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d2e554d324fc29164516eda0402e83725c8ffd9d691c8b7147508f29e0b3308e
MD5 e1fb11b9be94ec3559e96db5bae9736d
BLAKE2b-256 b3b1be134c5461f1971bdd684fed464c4f853c9c53bc805e20ffecae669ff78b

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cf5dfde240484eab2cafe39f3a2a7b2ed6c3aa35ba7427c268f4947a74177d18
MD5 1f14d404a40a1d81866090d09a5ade48
BLAKE2b-256 057e646c2e802a905c2522832e7699e58266c6c2ce015ab65adf2056e8396d1e

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.8 kB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f1f7ec606134ffa77a3f41998ca62fc3a0893b3b15e417fbf568f3b1b511634
MD5 3c5d83a3727ab728b56f8cbfc76cca6e
BLAKE2b-256 3f7090b38173eb71b06e69aac688b3e7f9a00bd4c588b7761aae6373eaa28178

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5cbaf2076de1a320d3304cbbdc85324108659ec0addfc372e3d68cdd59409aae
MD5 674e821bf0b6fe787d955241167e1c08
BLAKE2b-256 99ac7f61e2de087ac5a6b1479f14bce0c38c513e548cfbb988c34f58c8c34aca

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ee6036598c74b7cfd5ed5585a3bc9398310a6ce0b0f2c8c7292901b2d6640c13
MD5 d746689d7c2c22a4b3c55e7f1d216362
BLAKE2b-256 059ad96e07055452a59fb81de61da7309e05f318c044914899f44c65627a523c

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e15c67e5860ec717c9d7f3fad3302aa077fef15340dda8b86f2193b79e3385f5
MD5 946875264309766146be8aba1d9dffde
BLAKE2b-256 9b80a0cd87d8eeebc70902733da29d2f4e76ef0ae6839f691db3d1473445a742

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.3 kB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1db3d9c675d5d60315b2256dfc746335d522eb3bad280f543668de9462171700
MD5 fefa18c372d1f17209dcced868482d6e
BLAKE2b-256 c30bcafe92160e1e63a856654524ffed1f741956d2cdfdcb758fa2a7cb96ce30

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 035ad22490fec4d98e605f4c2278048fd0dc00cf3065147fce99ddd3b0939a6a
MD5 996b55ccfba04113f5478ce2e050316e
BLAKE2b-256 89515f750b842c2a14f6414e84061b75815e514faea1597d35e240be19011e3b

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 42059f4538339d899ae06c6a51351c7b088bc6183ea491555387dfdf7f5bdd25
MD5 62394312f37afe50df943b69a216d9a1
BLAKE2b-256 27c193d48e969df94e043b4334de8661890df3b0655d60834671bf5ad904fbad

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6acdf435d0cf3ca25719c830b27653fe2d767524d38d771e7e20ac770f8dda1f
MD5 b3e6627a1889b552550c6da81ee27c72
BLAKE2b-256 64b7d3ceb67fea1a46489b4150f5fdc267879f0a7b9e5ea40cb030954b948a02

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 254.4 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 818a8305bff64cf137423c695ef3dab5e99312b4bdaeaf07489a1a4a2131c034
MD5 f3cb120caaafb0d70b4125c41b07b860
BLAKE2b-256 58a940ee5db7eb9b4cf6866b5ac6a6c247b3e0951f3374f4584f62b0e970da8f

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4add7abd67a16eb8047001058fa834a40985505e63d97b718b1a1f6ae7ae967c
MD5 03908a7bc898f382fb19c34a9945b672
BLAKE2b-256 4a78c915b0c16f601112e8f13a06bf153fc9d67aacc1866eae4e504547caac72

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 78e7f10e9a9d3cdbffe7853a4d1598a1f64e062b250e48238a60ad637125d0b7
MD5 64b0ef97c412cfe0f73b3060bba72ca3
BLAKE2b-256 e4f4814eb5de758203cd628f9065859b500cff1f632240645121b3b510aded12

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1c9e87e72528ba4a6dc5965ca37a86fbace97806823e376b984343fb0af87fa4
MD5 33b485a4bb66a6fd5c4f1ae8f940b96b
BLAKE2b-256 c3d704e277ae8bb981d8db8028218a5c409e2d8d72e135463a0f55eb516ab67e

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 255.3 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d6d93cd1f738370a67f1d0b287fbc7bf8d7025e1d1d0e95493b12a08aabed591
MD5 001cf6ceabefa36eb62b6381f834ed95
BLAKE2b-256 37a768b98e2962d8bb6334b569e2d5ab5f2971b3a2b5b081f5a63d950161a669

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: edt-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 275.5 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 803b95fcd9d9b82896e2d906ed589bdf27dff08e3f54b9e0f36b7cb14f1be1fb
MD5 9b1d400222055db6681c119ab4c8a641
BLAKE2b-256 9a5ee844ed3e950e104db1eb810c7dff0a44a5fbb134f2dc28ab206dfe696f20

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 785dba202a3325424cf35a6bd0ec50e751b4ee8fd9af94209592abff55905dba
MD5 314676c7013e1619d1f121c923a4879b
BLAKE2b-256 858e02a0041e4e1939b8271574b41c22cddf193c14d3f11596f3d789519ad1cf

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 611224a8623f6131538ae74fe81634ac1ce0719a5a5b1ad9082e4c557ed66f92
MD5 355c2594f59d67807fca40b6ab0e0b54
BLAKE2b-256 61941d8369e0a002b128d8b430398b3054a80eb97ec5120249c590f3a0f99ddc

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.0-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 258.5 kB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 934f6d7f1f5b79d343fd57c87d3030933704800c1b64042ff0a5160ab17696f6
MD5 8ae2259199f28faa864e737792f9c5a5
BLAKE2b-256 904b385ae8e3ff0d94d648162d46068cc0825646b9abda408b5a0ee78668224a

See more details on using hashes here.

File details

Details for the file edt-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: edt-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 278.2 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 29049aa297b5efca407b0a49267a5be8e78f7c95e3822af23b935996390e760b
MD5 83f412561d2223d8380df7f6f3b29e36
BLAKE2b-256 698f9f2c708cc7bd9c583fa9651e35d22552a5b6d633796a58de28d16413a166

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