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.2.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.2-cp314-cp314t-win_amd64.whl (220.6 kB view details)

Uploaded CPython 3.14tWindows x86-64

edt-3.1.2-cp314-cp314t-win32.whl (190.4 kB view details)

Uploaded CPython 3.14tWindows x86

edt-3.1.2-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.2-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.2-cp314-cp314t-macosx_11_0_arm64.whl (277.8 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

edt-3.1.2-cp314-cp314t-macosx_10_13_x86_64.whl (278.2 kB view details)

Uploaded CPython 3.14tmacOS 10.13+ x86-64

edt-3.1.2-cp314-cp314-win_amd64.whl (213.3 kB view details)

Uploaded CPython 3.14Windows x86-64

edt-3.1.2-cp314-cp314-win32.whl (179.1 kB view details)

Uploaded CPython 3.14Windows x86

edt-3.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

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

edt-3.1.2-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.2-cp314-cp314-macosx_11_0_arm64.whl (265.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

edt-3.1.2-cp314-cp314-macosx_10_13_x86_64.whl (267.3 kB view details)

Uploaded CPython 3.14macOS 10.13+ x86-64

edt-3.1.2-cp313-cp313-win_amd64.whl (207.6 kB view details)

Uploaded CPython 3.13Windows x86-64

edt-3.1.2-cp313-cp313-win32.whl (174.1 kB view details)

Uploaded CPython 3.13Windows x86

edt-3.1.2-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.2-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.2-cp313-cp313-macosx_11_0_arm64.whl (263.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

edt-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl (267.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

edt-3.1.2-cp312-cp312-win_amd64.whl (207.0 kB view details)

Uploaded CPython 3.12Windows x86-64

edt-3.1.2-cp312-cp312-win32.whl (174.3 kB view details)

Uploaded CPython 3.12Windows x86

edt-3.1.2-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.2-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.2-cp312-cp312-macosx_11_0_arm64.whl (264.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

edt-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl (268.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

edt-3.1.2-cp311-cp311-win_amd64.whl (206.5 kB view details)

Uploaded CPython 3.11Windows x86-64

edt-3.1.2-cp311-cp311-win32.whl (176.2 kB view details)

Uploaded CPython 3.11Windows x86

edt-3.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

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

edt-3.1.2-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.2-cp311-cp311-macosx_11_0_arm64.whl (263.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

edt-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl (270.9 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

edt-3.1.2-cp310-cp310-win_amd64.whl (206.0 kB view details)

Uploaded CPython 3.10Windows x86-64

edt-3.1.2-cp310-cp310-win32.whl (177.0 kB view details)

Uploaded CPython 3.10Windows x86

edt-3.1.2-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.2-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.2-cp310-cp310-macosx_11_0_arm64.whl (264.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

edt-3.1.2-cp310-cp310-macosx_10_9_x86_64.whl (272.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

edt-3.1.2-cp39-cp39-win_amd64.whl (206.6 kB view details)

Uploaded CPython 3.9Windows x86-64

edt-3.1.2-cp39-cp39-win32.whl (177.4 kB view details)

Uploaded CPython 3.9Windows x86

edt-3.1.2-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.2-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.2-cp39-cp39-macosx_11_0_arm64.whl (265.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

edt-3.1.2-cp39-cp39-macosx_10_9_x86_64.whl (273.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

edt-3.1.2-cp38-cp38-win_amd64.whl (209.7 kB view details)

Uploaded CPython 3.8Windows x86-64

edt-3.1.2-cp38-cp38-win32.whl (179.2 kB view details)

Uploaded CPython 3.8Windows x86

edt-3.1.2-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

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

edt-3.1.2-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.2-cp38-cp38-macosx_11_0_arm64.whl (268.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

edt-3.1.2-cp38-cp38-macosx_10_9_x86_64.whl (276.4 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2.tar.gz
Algorithm Hash digest
SHA256 6b059b4b61586703fd3fe4b9e90e5386ad82b868502ff6a82c0f9b9bf60eb3e9
MD5 1e3b8ab9948859fcdb24cff8f29cf537
BLAKE2b-256 48ed8d54f343dd194459f3acbe156e3462cfd16eb3adbf4bf14ac89f4dfc8aa8

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 220.6 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 65b8618675e20a715b276a72a13e8210295e783591118cc9f087c7c05a4dd851
MD5 0bcb806bdf2be3e846c82faf2ebd8087
BLAKE2b-256 6d8843021f1ca8bbb5922c1013db1d401d3844c6eabb849f50a00ede6232f35c

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp314-cp314t-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp314-cp314t-win32.whl
  • Upload date:
  • Size: 190.4 kB
  • Tags: CPython 3.14t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 a73c0f1001334baa4e122ecf6b8cf8b53065092383f8d31e3f49fac03da3e358
MD5 418e31ddbbf4fe68d4f271ac2fce9226
BLAKE2b-256 8fe07da9b481e8e74f9b3ffee7813965fc717a3107687787ab3d36a0a246a5df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2dd905e4fca5a80be119c431ab007e6d416411a73eba3a227f86b8682af9b8c8
MD5 bc7fe152c4a681aaffa4ad41147e914f
BLAKE2b-256 80932554e509746fa4fa4250b8dd7e0312ef49e9cd57782072db49382d5d994d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 be466df06c23c21997967cab753adda19d7e2a582e47d019e73e5291c8df20fe
MD5 8f00269acdf17428171af75ad853c2d4
BLAKE2b-256 8b4221a8b04c9f00e76430485071497a2c5cc14ad344847f83d6167036f399f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d1185849163dc01ff5823215560873d89385c2326a9af8064270be6caaef9e9d
MD5 b0be452d4697a6daab97b0ae681d9d50
BLAKE2b-256 9da031c98649ee816fda7287509ac550753043020fa716f818f10dfca9cab8c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314t-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 aea684730196f387e2bf9ba79eb959bd92bb78ae10c6fe7a8c1076b11847e34b
MD5 c7660a60bb6f17eb8df73b32935e77c4
BLAKE2b-256 d1edb3a9f7b44b640315bead1c8a4753637395fee727b942b4ed12570c1110d2

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 213.3 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9723f7e8e7a7dbd3985d9d0c81f7e73c260e45f27c83656c324e1559c4028120
MD5 e6c0ac20f1d15d554f599f957b06b9cf
BLAKE2b-256 db29e46228eb1aea1558e2cd9a68431840a25259851b97efba8e7531aab1960e

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp314-cp314-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp314-cp314-win32.whl
  • Upload date:
  • Size: 179.1 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 e0b5592fc035eb51dc22721e1ac2e59ddcd4b1284aa5daa37a9e95ed52f4d326
MD5 905809b62b7acadb2e9522a63c75caf4
BLAKE2b-256 3b7127d75d22d0d16bdb1081c557f17f67451b524a8ae74c436a1c53a9ff4284

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c0a03a07f19afdd022a3ebef6cf2dc221fe0b9a1203a0dc301ab9dcffd7991c0
MD5 f171edb967f16a2dd5b5dc86663a3ab2
BLAKE2b-256 dc667a39b4a77b399270d8836eb8844e70603281f0ee1bf7ab0a931213320758

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2a97c83100db2d63e190cc2f2e09af0fa1ce88032de1dbf59c8eeb46dcd4f167
MD5 87a2d13099da5bc19c30cf9849ec7d2d
BLAKE2b-256 b3fe56a39d456596ab37dd41c1ecf82bcb1017af978b72c2bc519379ec8c7c81

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8659eade7878cd4dc43d78135d56d6c5d92b7ec4649469e304be08c15e8ec4b0
MD5 991673bee7311694441a052c2f130ef2
BLAKE2b-256 0cbff7035c369c81b174bdae827eee8e83b900372e1937380723f5a51809180b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp314-cp314-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4ff35331237a31da485ca87589bc7f3f2edde1729e2ae14cd3d557235d98c63a
MD5 1a9a784ffc7f5c4a4c497655bfb1cc1a
BLAKE2b-256 b7f62979e2dda7af858e2467093ba925c5c43f60dc91113d057425f033753ce2

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 207.6 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2a178eeb730cdc61e40f8c264ee26f8542202af05518ea1d2fd070dde756e782
MD5 579a52a903cf24ce654bd0d83c2823d9
BLAKE2b-256 fc2a80187c879bc9b44cf0eac63d91268930c1721667b929973771a94c832ef7

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp313-cp313-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp313-cp313-win32.whl
  • Upload date:
  • Size: 174.1 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 2f54c01e6e61fd5814caae5ddaa0ed3a8e01f80aa050092374f22ec29fc2ee5d
MD5 13cf68670c39f08422fa81640d3fbee3
BLAKE2b-256 b91a960d363f96938557d4609a6af6e42fb5598e29c4d48c6abe7e512936d471

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f43cfd3421b960ceed2fccc6dbbe03e13ede4cebbf0463701da800e8460f80d6
MD5 a3cf9cb0864d94b78a8506c9eb04828d
BLAKE2b-256 34ae9366619c9c8f6459cb4de77b0661cca113a0a78e4069f47002473e594da6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f216db0b5657018c28ab430039f5106022bc835cf5b7ab2ed445048c1a61f320
MD5 59b7fd5ba2a77df1322566e3fd74a8e0
BLAKE2b-256 43333e4c9fdc6ed5bab02fe5679e47f6670e3fecc63939f912dc6bf21ce91644

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 58f107d9ebab21d1044234c02107f5638f984b7c0b9f9777af9b27bf6d276cfa
MD5 e7d152f0d5902e939e40cf75d8b97b21
BLAKE2b-256 65b324e4504937cab42c4dbda6083ec7d7b9244015fcd554904f771f0d15194c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3d50946e7e41b2396ecde9ba9ba1e5bff927a48865d3d9390e4bec26f9b70456
MD5 6b161e015ab04cdbe7adea56151f0a5c
BLAKE2b-256 aabf35266f756ccc7ac7853471fb09ac9bcfdb1339f96b8d5fff10c540135d6c

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 207.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cf2e52a77227c8c1190bff6073b2a7fc0440574addf12037927ef73315d9d2b7
MD5 73f4f935a3d00a4ab6b3f1609fe38acc
BLAKE2b-256 b3a912f4211c9b97f3c5369b3a7436fd0d28f631bda7922d9d7d6ab3991ec44a

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp312-cp312-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp312-cp312-win32.whl
  • Upload date:
  • Size: 174.3 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 9fdfe69a7354bb66acd3d36a81df279b91b4ed3f0da1373a2b54317587a970e9
MD5 d99e4e4fafb70e9013377bc9f86b80dd
BLAKE2b-256 c1dab8e841e8c6695d504e13cb8dac04f814006e4d720173ab70c49478ef48d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 24de82036a0c0ace3572eb03852510e2b9993e7701402f885591562844067527
MD5 0bff29e225813e7f61b83b8e54197a13
BLAKE2b-256 6d971e95963224c3fae99cc541b2fa1e88249c435c84f3e92ce45ef174bb4ad8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 062a7deeaa394dbec8a88ca3c7e1fdc1038f24fee4cf05167d2296a4b01b1519
MD5 fc4a02b5e549401ce1d7cd8967abce96
BLAKE2b-256 8f75b7861d6ce19f554a97c0eef1fe293c0a9d931c4bfceb5ea69f851917ffe8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3024c250352c2025ed72bac711b77c070c892474539b872fb8212a1e94c2ea69
MD5 35b02066ff6155e9dc4f2390e0a4d758
BLAKE2b-256 1b7bd6c67b87a49f240ff93037d868e2ccf56950f3e7f98acc0fd8662e06d786

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 99bf5a13ed01b1b0fc6fdae33e5fb4bdb480d1291e77c63d39bc1560a338ea98
MD5 96684bab9d60c91ab8449101d66e3d24
BLAKE2b-256 1b2627f6dc79a9da08e38f8a4e3b402bae9ee57f681d0a22ea00f0f1798807a4

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 206.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 318798f43a5edd1fa8d631a43e836e8e009c7b6c146bca442685b2cc1ebfa6a6
MD5 ee67332b4e3f8aa5a7104bda91ea3571
BLAKE2b-256 bfefb41fb356bd0d69c76dde6e7b4404e0fde4adf0ade234b8aa0213c006945f

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp311-cp311-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp311-cp311-win32.whl
  • Upload date:
  • Size: 176.2 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 a1006e66edd312f9de6b2c0dcafdc38cc8b773fc0d96fe1b66f301ecd9656f22
MD5 db34f980278c758d81f6f73836ecf962
BLAKE2b-256 b786b6c8c5c3d81ed75473f91591ed2f538f7d81f5e9df4e859263b4d82f8b56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 57a0afb91f5d6a22ba96e3cb2fabe796556351ffad65d7fb16e4d16f709ffff2
MD5 3b7d7a7bfcc061e1f92ec10820023488
BLAKE2b-256 1c0a28759072a9a8039a6f9a891f599019cab64724f218b39ede3184cab76d89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 52e1adcfe53c48f13f2ef84cf67fb53260fe19cae5026ef20437ed42f19ee7b3
MD5 22c6090bd15914389477d311bd2933ba
BLAKE2b-256 c30cfabe8e6e8dd2b16ad814154b5e3c9a6cc75b92e0f184351415d95dc3f974

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e07062376407c3124e82890c6dfbf9996668c948fc33330e15133b184490c279
MD5 607d2ad4275681ec3510c6e728707b5e
BLAKE2b-256 c1a47ad40de428ad77e48662da5d2647bd6c74ba5fd0253641e031eb25accee0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5a22d9b0a9be7c5f15b9f414758cc9c7ea37506d53900f41301887ab3504c275
MD5 99c00c4ca3e789ee328ad96e74fcc833
BLAKE2b-256 5b3cc04c0a1a7b52c5365bfaaf92efe289f445e89efc5958c4171e3205cb943c

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 206.0 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 be2a110d4ebad42c68e18e01f6396fd514ee8c36f0c3f38651e448d62a7121b7
MD5 75c36bf1db99510457a40eeac14d1269
BLAKE2b-256 750bb4e913c1c5073c2e3bcb25b18c9f9718c8a13d8b5deb398ce30d22a83b23

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp310-cp310-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp310-cp310-win32.whl
  • Upload date:
  • Size: 177.0 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 6fe83aff4455aee0f7f31825d255c5244789d6a686a334ebc0b94f503b284b3a
MD5 1b3c305d0293d9e70f2454d2336662fc
BLAKE2b-256 867976d2d6a7892f0b861b9ee2b41dee0536aa9d4026174f9a02fee8c692a922

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 177b531bd1688488937acc40cc672aaa80671fe5d18eec2de7bd26870d16d522
MD5 eeab092f8b0c6abbb81d4bcd791664b1
BLAKE2b-256 9b3c709e16a15442edfb37711f51e2b16f5a9897555da4ca519485ea921331c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6f754821486935bbb1be76dec96d2d1252397253d999ebf38df0504bec60bc34
MD5 78ee551a95c6f22ed8f5e13a92e14140
BLAKE2b-256 72e0e1fd878b55673a12698287cce50c20503734ebfffd6827ecfb28f73e58ae

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4f155784aa4bbc4904db3e9999a0b8f2c48b505150c1503ca90f9424e7b433b3
MD5 720bd271c765072154c6cce8231ce51f
BLAKE2b-256 6293d226df2e118b72099992e99febe0a2e7787b2b84b79302a228500f97f46e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 92eff81d2021a8522ed4e86becd441dc079140814d8fa44cde73401ab2a91508
MD5 7d2958bd61f308a752d0e415ca99f70c
BLAKE2b-256 068cdc46bf56b582b6f7c46e713f92c0b9113a0ae0d12463f7c3c956c9fc881e

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 206.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 672cac419644250f276bf84d2d33d283f4f208c22e0f88ec3e5e57e15f1ced94
MD5 dc9918e1c187c86a01393b2f4a3a9145
BLAKE2b-256 3d89b5f000c1724f457557fc52df7b4884525efbe6ab1ea81ca79c7f2e8c3829

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp39-cp39-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp39-cp39-win32.whl
  • Upload date:
  • Size: 177.4 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 67da890ee555a3c1eca1b400d9395046971cc9d10573e9528b91fc9999af32ce
MD5 45ec25fefe6244f22b3209f163a64f2a
BLAKE2b-256 a70ced74ce02e4f4a953fa43874f678399f9bad2d464538b6b921100fa0fec68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a84c2062f20a2d1b179c04ec410757dc72122db2620b02d468837b3d11cd7d64
MD5 9da900dc1d5a0da3976a7baece806bf6
BLAKE2b-256 3e3a715675275d342b6cfc878dce22b450010103b3fca818c171f2bc5b7939f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2d8a3daef7dffef41336221a68bea9d64d2f09cc24f2d81851fb1991e2858d6c
MD5 7e169fa2a83b14336ed6b17e1df723ac
BLAKE2b-256 b0e8cb08bb33a4efbb02eed57530343c88c47131073f9e6fbef87c4ebf8d6e31

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c0d706c2ae7d734ad73f3b542068be83a77b38ee7f263d7eb85a24a4c682adb
MD5 3d4016fdfc82575025e4ea75e71e24f6
BLAKE2b-256 a148554cdf927cabf3b1db584eaca2f152da348037ad9c6bf5302648574c4d3d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a348edcc28a04da0550e7872ada1c50ce6a29ffc281e30aa72414760eae5279a
MD5 406a758cee88d0b1be365ad904beaebd
BLAKE2b-256 2e61aa386661df97fbfd56a55beb76487f85af3c01d045f3e6938629fd70f031

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 209.7 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 acc9a90098ddf84777b5d43632993bb7f5cce6ab617eef104d14bc43a5f5c3e6
MD5 f97991a6ee7ef482f8ad828122539241
BLAKE2b-256 73a63539dd6ebc16e488a8b628cd238cc5941f16ac10bc3ec6d0ceb4c19d6ca4

See more details on using hashes here.

File details

Details for the file edt-3.1.2-cp38-cp38-win32.whl.

File metadata

  • Download URL: edt-3.1.2-cp38-cp38-win32.whl
  • Upload date:
  • Size: 179.2 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.2-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 281c05a9fdbab940b58ba855c08874c0404e968e011931fc0eaf73716ad74476
MD5 8acf880a2755698c6a2ae6568296de40
BLAKE2b-256 490f8dca1b0303299441db7a2ba7d44965ec3b5ea045a6b233b14c930bf3469c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4eb2d109b211d43d0c6d83b46bf0267eb71c5e70632d68fcf93ee77cfd0eef81
MD5 10c229920fc15cb7486d571a09c39052
BLAKE2b-256 ce895375f0add3f102aa8c8d705d67b638c457c34d843d7f40046c4ec779de16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edt-3.1.2-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e61bc6225bbc88e3f663de703e0e1d42051f02ca0c42756699067c855eb3008
MD5 e27c997b86a42dde1c6ba4f511ed06ac
BLAKE2b-256 951e4b8aaff1571759c6490160b10b7022aea22f0cb685fa93659aac4b169b26

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ff32fc4f1245e62506e1449c7601ba2cf0851f33ed7611c20c79f031ec00ac5
MD5 b4bba73a6264df6f3f680fa8240107e0
BLAKE2b-256 e667d3b9d0475b6b16537890ef68809a07445ed7ce75030d8cd001514e1b68e9

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for edt-3.1.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2e7cb95d92439a80879b74a70bb6fe1a22eee8569965f7c0eebd418274794925
MD5 8612a6512718b12b5e701c064c5fc23d
BLAKE2b-256 5b9e8fd2bbe192a40eb5ff272bb9a51f2841ca0aadef7ec59fdbcdc458891cd0

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