Skip to main content

A differentiable 3D mesh renderer

Project description

DEODR

DEODR (for Discontinuity-Edge-Overdraw based Differentiable Renderer) is a differentiable 3D mesh renderer written in C with Python and Matlab bindings. The python code provides interfaces with Pytorch and Tensorflow. It provides a differentiable rendering function and its associated reverse mode differentiation function (a.k.a adjoint function) that provides derivatives of a loss defined on the rendered image with respect to the lightning, the 3D vertices positions and the vertices colors. The core triangle rasterization procedures and their adjoint are written in C for speed, while the vertices normals computation and camera projections are computed in either Python (numpy, pytorch or tensorflow) or Matlab in order to gain flexibility and improve the integration with automatic differentiation libraries. The core C++ differentiable renderer has been implemented in 2008 and described in [1,2]. Unlike most other differentiable renderers (except the recent SoftRas [8] and to some extend the differentiable ray/path tracing methods in [10] and [13]), the rendering is differentiable along the occlusion boundaries and no had-hoc approximation is needed in the backpropagation pass to deal with discontinuities along occlusion boundaries. This is achieved by using a differentiable antialiasing method called Discontinuity-Edge-Overdraw [3] that progressively blends the colour of the front triangle with the back triangle along occlusion boundaries.

PyPI version [Build status Python package

Table of content

  1. Features
  2. Installation
  3. Examples
  4. Equations
  5. License
  6. Alternatives
  7. References

Features

  • linearly interpolated color triangles with arbitrary number of color channels.
  • textured triangles with Gouraud shading. The gradient backward pass is supported only for linear texture mapping (it is not implemented for perspective-correct texture mapping yet).
  • derivatives with respect to triangles vertices positions, triangles colors and lights.
  • derivatives with respect to the texture pixel intensities
  • derivatives with respect to the texture UV coordinates
  • derivatives along occlusion boundaries
  • differentiability of the rendering function
  • exact gradient of the rendering function
  • classical camera projection representation used in computer vision
  • camera distortion with OpenCV's 5 distortion parameters described here. It requires small triangles surface tesselations as the distortion is applied only at the vertices projection stage.
  • possibility to render images corresponding to depth, normals, albedo, shading, xyz coordinates, object/background mask and faces ids. Example here

Some unsupported features:

  • SIMD instructions acceleration
  • multithreading
  • GPU acceleration
  • differentiable handling of seams at visible self intersections
  • self-collision detection to prevent interpenetrations (that lead to aliasing and non differentiability along the visible self-intersections)
  • phong shading
  • gradients backward pass for perspective-correct texture mapping
  • gradients backward pass for perspective-correct vertex attributes/color interpolation
  • texture mip-mapping (would require trilinear filtering to make it smoother and differentiable)
  • shadow casting (making it differentiable would be challenging)

Using texture triangles

Keeping the rendering differentiable everywhere when using texture is challenging: if you use textured triangles you will need to make sure there are no adjacent triangles in the 3D mesh that are simultaneously visible while being disconnected in the UV map, i.e. that there is no visible seam. Otherwise the rendering will not in general be continuous with respect to the 3D vertices positions due to the texture discontinuity along the seam. Depending on the shape of your object, you might not be able to define a continuous UV mapping over the entire mesh and you will need to define the UV texture coordinates in a very specific manner described in Figure 3 in [1], with some constraints on the texture intensities so that the continuity of the rendering is still guaranteed along edges between disconnected triangles in the UV map after texture bilinear interpolation. Note that an improved version of that approach is also described in [8].

Installation

Python

For python 3.6,3.7 and python 3.8 under Windows and Linux you can use

pip install deodr

Otherwise or if that does not work you can try

pip install git+https://github.com/martinResearch/DEODR.git

Matlab

Simply download the zip file, decompress it, run compile.m.

For the hand fitting example you will also need to download my Matlab automatic differentiation toolbox from here add the decompressed folder in your matlab path

Examples

Iterative Mesh fitting in Python

Example of fitting a hand mesh to a depth sensor image deodr/examples/depth_image_hand_fitting.py

animation

Example of fitting a hand mesh to a RGB sensor image deodr/examples/rgb_image_hand_fitting.py

animation

Example of fitting a hand mesh to several RGB sensor images deodr/examples/rgb_multiview_hand.py

animation

iterative mesh fitting in Matlab

Example of a simple triangle soup fitting Matlab/examples/triangle_soup_fitting.m

animation

Example of fitting a hand mesh to a RGB sensor image Matlab/examples/hand_fitting.m. For this example you will also need to download the automatic differentiation toolbox from https://github.com/martinResearch/MatlabAutoDiff

animation

Equations

This code implements the core of the differentiable renderer described in [1,2] and has been mostly written in 2008-2009. It is anterior to OpenDR and is to my knowledge the first differentiable renderer that deals with vertices displacements to appear in the literature. It renders a set of triangles with either a texture that is bilinearly interpolated and shaded or with interpolated RGB colours. In contrast with most renderers, the intensity of each pixel in the rendered image is continuous and differentiable with respect to the vertices positions even along occlusion boundaries. This is achieved by using a differentiable antialiasing method called Discontinuity-Edge-Overdraw [3] that progressively blends the colour of the front triangle with the back triangle along occlusion boundaries, using a linear combination of the front and back triangles with a mixing coefficient that varies continuously as the reprojected vertices move in the image (see [1,2] for more details). This allows us to capture the effect of change of visibility along occlusion boundaries in the gradient of the loss in a principled manner by simply applying the chain rule of derivatives to our differentiable rendering function. Note that this code does not provide explicitly the sparse Jacobian of the rendering function (where each row would correspond to the color intensity of a pixel of the rendered image, like done in [4]) but it provides the vector-Jacobian product operator, which corresponds to the backward function in PyTorch.

This can be used to do efficient analysis-by-synthesis computer vision by minimizing the function E that corresponds to the sum or the squared pixel intensities differences between a rendered image and a reference observed image Io with respect to the scene parameters we aim to estimate.

$$E(V)=\sum_{ij} (I(i,j,V)-I_o(i,j))^2$$

Using D(i,j) as the adjoint i.e. derivative of the error (for example the squared residual) between observed pixel intensity and synthetized pixel intensity at location (i,j)

$$ D(i,j)=\partial E/\partial I(i,j))$$

We can use DEODR to obtain the gradient with respect to the 2D vertices locations and their colors i.e :

$$\partial E/\partial V_k =\sum_{ij} D(i,j)(\partial I(i,j)/\partial V_k)$$

and

$$\partial E/\partial C_k = \sum_{ij} D(i,j)(\partial I(i,j)/\partial C_k)$$

In combination with an automatic differentiation tool, this core function allows one to obtain the gradient of the error function with respect to the parameters of a complex 3D scene one aims to estimate.

The rendering function implemented in C++ can draw an image given a list of 2D projected triangles with the associated vertices depths (i.e 2.5D scene), where each triangle can have

  • a linearly interpolated color between its three extremities
  • a texture with linear texture mapping (no perspective-correct texture mapping yet but it will lead to noticeable bias only for large triangle that are no fronto-parallel)
  • a texture combined with shading interpolated linearly (gouraud shading)

We provide a functions in Matlab and Python to obtain the 2.5D representation of the scene from a textured 3D mesh, a camera and a simple lighting model. This function is used in the example in which we fit a 3D hand model to an image. We kept this function as minimalist as possible as we did not intend to rewrite an entire rendering pipeline but to focus on the part that is difficult to differentiate and that cannot be differentiated easily using automatic differentiation.

Our code provides two methods to handle discontinuities at the occlusion boundaries

  • the first method consists in antialiasing the synthetic image before comparing it to the observed image.
  • the second method consists in antialising the squared residual between the observed image and the synthesized one, and corresponds to the method described in [1]. Note that antialiasing the residual (instead of the squared residual) is equivalent to do antialiasing on the synthetized image and then subtract the observed image.

The choice of the method is done through the Boolean parameter antialiaseError. Both approaches lead to a differentiable error function after summation of the residuals over the pixels and both lead to similar gradients. The difference is subtle and is only noticeable at the borders after convergence on synthetic antialiased data. The first methods can potentially provide more flexibility for the design of the error function as one can for example use a non-local image loss by comparing image moments instead of comparing pixel per pixel.

Note: In order to keep the code minimal and well documented, I decided not to provide here the Matlab code to model the articulated hand and the code to update the texture image from observation used in [1]. The hand fitting example provided here does not relies on a underlying skeleton but on a regularization term that penalizes non-rigid deformations. Some Matlab code for Linear Blend Skinning can be found here. Using a Matlab implementation of the skinning equations would allow the use of the Matlab automatic differentiation toolbox provided here to compute the Jacobian of the vertices positions with respect to the hand pose parameters.

Conventions

Pixel coordinates:

If integer_pixel_centers is True (default) then pixel centers are at integer coordinates with

  • upper left at (0, 0)
  • upper right at (width - 1, 0)
  • lower left at (0, height - 1)
  • lower right at (width - 1, height - 1)

If integer_pixel_centers is False, then pixel centers are at half-integer coordinates with

  • upper left at (0.5, 0.5)
  • upper right at (width - 0.5, 0.5)
  • lower left at (0.5, height - 0.5)
  • lower right at (width -0.5, height - 0.5)

According to this page, OpengGL has always used upper left pixel center at (0.5, 0.5) while Direct3D was using pixel center at (0,0) before version 10 and switched to (0.5,0.5) at version 10.

Texel coordinates:

Unlike in OpenGL Texel (texture pixel) center are at integer coordinates and origin in in the upper left corner of the texture image. The coordinate of the upper left texture pixel center (texel) is (0, 0). The color of the texture bilinearly sampled at float position (0.0,0.0) is texture[0, 0]. The value of the texture bilinearly sampled at float position (0.5,0.5) is equal to the average (texture[0, 0] + texture[0, 1] + texture[1, 0] + texture[1, 1])/4

TO DO

  • add support for multiple meshes in the scene
  • add support for multiple lights in the scene
  • write more unit tests
  • add possibility to provide the camera parameters using OpenGL parameterization
  • write pure C++ only rendering example
  • write pure C++ only mesh fitting example
  • accelerate C++ code using SIMD instruction and multithreading
  • add automatic texture reparameterization and resampling to avoid texture discontinuities (see section on texture)
  • add phong shading

License

BSD 2-clause "Simplified" license.

If you use any part of this work please cite the following:

Model-based 3D Hand Pose Estimation from Monocular Video. M. de la Gorce, N. Paragios and David Fleet. PAMI 2011 pdf

@article{deLaGorce:2011:MHP:2006854.2007005,
 author = {de La Gorce, Martin and Fleet, David J. and Paragios, Nikos},
 title = {Model-Based 3D Hand Pose Estimation from Monocular Video},
 journal = {IEEE Trans. Pattern Anal. Mach. Intell.},
 issue_date = {September 2011},
 volume = {33},
 number = {9},
 month = sep,
 year = {2011},
 issn = {0162-8828},
 pages = {1793--1805},
 numpages = {13},
 url = {http://dx.doi.org/10.1109/TPAMI.2011.33},
 doi = {10.1109/TPAMI.2011.33},
 acmid = {2007005},
 publisher = {IEEE Computer Society},
 address = {Washington, DC, USA},
} 

Projects that use DEODR

  • TraceArmature. Set of python scripts that allow for high fidelity motion capture through the use of AI pose estimation (using METRABS), fiducial markers, VR body trackers, and optional hand annotations.

Please let me know if you found DEODR useful by adding a comment in here.

Alternatives

  • SoftRas (MIT Licence). Method published in [9]. This method consists in a differentiable render with a differentiable forward pass. To my knowledge, this is at the moment the only method besides ours that has a differentiable forward pass and that computes the exact gradient of the forward pass in the backward pass.

  • OpenDR [4] (MIT Licence) is an open source differentiable renderer written in python and make publicly available in 2014. OpenDR calls OpenGL and relies an a python automatic differentiation toolbox by the same author called chumpy. Like in our code OpenDR uses a intermediate 2.5D representation of the scene using a set of 2D projected triangles. In contrast to our code OpenDR does not provide a continuous loss function as there is not continuous antialiasing formulation at the occlusion boundaries and the minimised function will have jumps when a pixel at the boundary switch between the front of back object. By providing a continuous differentiable error function using edge-overdraw antialiasing and its exact gradient, our method can lead to better a convergence of continuous optimisation methods..

  • DIRT (MIT licence) is an open source differentiable renderer that uses approximations in the gradient computation similar OpenDR but that is interfaced with tensorflow. It makes considerable effort to return correctly-behaving derivatives even in cases of self-occlusion, where most other differentiable renderers can fail.

  • Neural 3D Mesh Renderer (MIT Licence). Method published in [6]. This method consists in a differentiable render whose gradients are designed to be used in neural networks.

  • tf_mesh_renderer (Apache License 2.0). A differentiable, 3D mesh renderer using TensorFlow. Unlike other differentiable renderer it does not provides suppport for occlusion boundaries in the gradient computation and thus is inadequate for many applications.

  • Code accompanying the paper [7] github. It renders only silhouettes.

  • redner Method published in [10]. It is a differentiable path-tracer that can propagate gradients through indirect illumination.

  • Differentiable Surface Splatting Method publihed in [11]. It is a differentiable implementation of the surface splatting method that allows to render point clouds. The advantage of this approach over mesh based methods is that there is no predefined connectivity associated to the set of points, which allows topological changes during minimization.

  • DIB-Render Method published in [12]. This method removes discontinuies along the projected mesh and background boundary (external silhouette) by rendering background pixels colors using a weighted sum of the background colour and nearby projected faces. However, unlike our method, it does not remove discontinuities along self-occlusions.

  • Differentiable path tracing Method published in [13]

  • PyTorch3D's renderer. The method implemented keeps a list of the K nearest faces intersecting the ray corresponding to each pixel in the image (as opposed to traditional rasterization which returns only the index of the closest face in the mesh per pixel). The top K face properties can then be aggregated using different methods (such as the sigmoid/softmax approach proposed by Li et at in SoftRasterizer). Note however that the K face selection is not a continuous operation and thus may potentially lead to discontinuities in the rendered pixel intensities with respect to the shape parameters.

  • Tensorflow graphics. Library from google that allows differentiable rendering. At the date of march 2020 discontinuities along occlusion boundaries are not handled yet in a differentiable manner. As a result fitting using a loss defined with the rendered image may not converge well in some scenario.

  • SDFDiff.[15] Differentiable Implicit surface rendering using signed distance functions. This approach seems not to deal with depth discontinuity along the silhouette and self occlusions in a differentiable way, and thus the change in visibility in these locations is not captured in the back-propagated gradients which will hamper convergence, especially in scenarios where the silhouette is an important signal for the fitting..

  • DIST[16] Differentiable Implicit surface rendering using signed distance functions. The depth discontinuity along the object/background boundary is taken into account in the computation of the silhouette mask only, and is not taken into account in the rendered color, depth or normal images. This could hamper convergence of the surface fitting methods that uses these images in the loss for concave objects that exhibit self occlusion in the chosen camera view point(s). 

  • Nvdiffrast[17] Fast and modular differentiable renderer implemented using OpenGL and cuda with Pytorch and tensoflow interfaces. The method uses deferred rendering which yields great flexibility for the user by allowing the user to write a custom pixel shader using pytorch . An antialiasing step is applied after deferred rendering in order to blend the colors along self-occlusion edges using weights that depend on the distance of the adjacent pixel centers to the line segment. The colors used for blending of along the self occlusion edges  are extracted from the nearest points with integer coordinates in the adjacent triangles. This is not a continuous operation and thus may result in small temporal color jumps along the self-occlusion when the edges line segment crosses a pixel center. This may degrade the quality of the gradients as a first order approximations of the change in the loss function w.r.t scene parameters. Moreover the method used to detect self occlusion edges is done in the image space using faces indices which is not very reliable when triangles are small, which introduces noise in the gradient that might be biased. In contrast, our anti-aliasing method uses the color of the nearest point on the occlusing triangle edge (euclidean projection), which does not lead to discontinuity when edges cross pixel centers, and our silhouette edges detection is done in the object space and thus is reliable regardless of the triangles size during rasterization.

References

[1] Model-based 3D Hand Pose Estimation from Monocular Video. M. de la Gorce, N. Paragios and David Fleet. PAMI 2011 paper

[2] Model-based 3D Hand Pose Estimation from Monocular Video. M. de la Gorce. PhD thesis. Ecole centralde de Paris 2009. paper

[3] Discontinuity edge overdraw P.V. Sander and H. Hoppe, J.Snyder and S.J. Gortler. SI3D 2001 paper

[4] OpenDR: An Approximate Differentiable Renderer Loper, Matthew M. and Black, Michael J. ECCV 2014 paper code online documentation

[5] A Morphable Model For The Synthesis Of 3D Faces. Volker Blanz and Thomas Vetter. SIGGRAPH 99. paper

[6] Neural 3D Mesh Renderer. Hiroharu Kato and Yoshitaka Ushiku and Tatsuya Harada.CoRR 2017 paper

[7] End-to-end 6-DoF Object Pose Estimation through Differentiable Rasterization Andrea Palazzi, Luca Bergamini, Simone Calderara, Rita Cucchiara. Second Workshop on 3D Reconstruction Meets Semantics (3DRMS) at ECCVW 2018. paper

[8] Mesh Color textures Cem Yuksel. Proceedings of High Performance Graphics 2017. paper

[9] Soft Rasterizer: A Differentiable Renderer for Image-based 3D Reasoning. Shichen Liu, Tianye Li, Weikai Chen and Hao Li. ICCV 2019. paper

[10] Differentiable Monte Carlo Ray Tracing through Edge Sampling. zu-Mao Li, Miika Aittala, Frédo Durand, Jaakko Lehtinen. SIGGRAPH Asia 2018. project page

[11] Differentiable Surface Splatting for Point-based Geometry Processing. Felice Yifan, Serena Wang, Shihao Wu, Cengiz Oztireli and Olga Sorkine-Hornung. SIGGRAPH Asia 2019. paper and video

[12] Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer Wenzheng Chen, Jun Gao, Huan Ling, Edward J. Smith, Jaakko Lehtinen, Alec Jacobson, Sanja Fidler. NeurIPS 2019. paper

[13] Reparameterizing discontinuous integrands for differentiable rendering. Guillaume Loubet, Nicolas Holzschuch and Wenzel Jakob. SIGGRAPH Asia 2019. project page

[14] TensorFlow Graphics: Computer Graphics Meets Deep Learning. Valentin, Julien and Keskin, Cem and Pidlypenskyi, Pavel and Makadia, Ameesh and Sud, Avneesh and Bouaziz, Sofien. 2019

[15] SDFDiff: Differentiable Rendering of Signed Distance Fields for 3D Shape Optimization. Yue Jiang, Dantong Ji, Zhizhong Han, Matthias Zwicker. CVPR 2020. code

[16] DIST: Rendering Deep Implicit Signed Distance Function with Differentiable Sphere Tracing. Shaohui Liu1, Yinda Zhang, Songyou Peng, Boxin Shi, Marc Pollefeys, Zhaopeng Cui. CVPR 2020. code

[17] Modular Primitives for High-Performance Differentiable Rendering. Samuli Laine, Janne Hellsten, Tero Karras, Yeongho Seol, Jaakko Lehtinen, Timo Aila. paper.

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

deodr-0.2.3.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

DEODR-0.2.3-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13 Windows x86-64

DEODR-0.2.3-cp313-cp313-win32.whl (1.4 MB view details)

Uploaded CPython 3.13 Windows x86

DEODR-0.2.3-cp313-cp313-musllinux_1_2_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

DEODR-0.2.3-cp313-cp313-musllinux_1_2_i686.whl (3.1 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ i686

DEODR-0.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

DEODR-0.2.3-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (2.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

DEODR-0.2.3-cp313-cp313-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

DEODR-0.2.3-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12 Windows x86-64

DEODR-0.2.3-cp312-cp312-win32.whl (1.4 MB view details)

Uploaded CPython 3.12 Windows x86

DEODR-0.2.3-cp312-cp312-musllinux_1_2_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

DEODR-0.2.3-cp312-cp312-musllinux_1_2_i686.whl (3.1 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

DEODR-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

DEODR-0.2.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (2.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

DEODR-0.2.3-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

DEODR-0.2.3-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11 Windows x86-64

DEODR-0.2.3-cp311-cp311-win32.whl (1.4 MB view details)

Uploaded CPython 3.11 Windows x86

DEODR-0.2.3-cp311-cp311-musllinux_1_2_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

DEODR-0.2.3-cp311-cp311-musllinux_1_2_i686.whl (3.1 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

DEODR-0.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

DEODR-0.2.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (2.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

DEODR-0.2.3-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

DEODR-0.2.3-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10 Windows x86-64

DEODR-0.2.3-cp310-cp310-win32.whl (1.4 MB view details)

Uploaded CPython 3.10 Windows x86

DEODR-0.2.3-cp310-cp310-musllinux_1_2_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

DEODR-0.2.3-cp310-cp310-musllinux_1_2_i686.whl (3.0 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

DEODR-0.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

DEODR-0.2.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

DEODR-0.2.3-cp310-cp310-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

DEODR-0.2.3-cp39-cp39-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.9 Windows x86-64

DEODR-0.2.3-cp39-cp39-win32.whl (1.4 MB view details)

Uploaded CPython 3.9 Windows x86

DEODR-0.2.3-cp39-cp39-musllinux_1_2_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

DEODR-0.2.3-cp39-cp39-musllinux_1_2_i686.whl (3.0 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

DEODR-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

DEODR-0.2.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

DEODR-0.2.3-cp39-cp39-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

File details

Details for the file deodr-0.2.3.tar.gz.

File metadata

  • Download URL: deodr-0.2.3.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for deodr-0.2.3.tar.gz
Algorithm Hash digest
SHA256 bff2d5036a74900c7dbc9a5284e99935fcf995f9798cee5e3e583b598501d58f
MD5 c23b9dffdf517a41b79ba0fc94aebdc6
BLAKE2b-256 1f3a1ff59bf81fb955afabe35fd2dfecf964b357f138b9bd2780eff9a070185b

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 66962fa8987dd8580e3d653e7064f7cf0d94cdefdc6bb6f442bdbc4385754739
MD5 36bb52d2c64315be4377d5342b3d66b7
BLAKE2b-256 0fd1dc79f215fa406c93046a551cce04498cef50acb2c05e6ce591476defc3f2

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-win32.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp313-cp313-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 ba054b1047531489c7aa9132fb5328491f931f0ab705d3a462a2295b5bdb47ee
MD5 4dc60467e7fd5b3f4b51971224f1ae43
BLAKE2b-256 36eac588253c9d8b3573d5651d3fa5adb466ae2aadc2c67a16436644bc1a1e36

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 323163e0a6d7a0588af7d2d57e9e6752e474d92d0c34420df392be99e69d0da9
MD5 221df547ea8f9df1a393115990e69b51
BLAKE2b-256 3d91e61e4f8ad94bb7dfe9d65c47c600704470ae3f06d8685a34b2a6fb21d396

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 1781c9d5858114a1e5ae07c37b73028fea9408c934edacdd7d9ad1a6732fc70d
MD5 c7521695fec75e9a378323338b018bb9
BLAKE2b-256 21b0b4150bd9353bcd0f7305c36aa56f3d7b05703b74036ca36f31363a7090fa

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f7d1f8d619015db53d5b2ece5b81160c97d7a24ca9122b70bcc1b52e2c7f5c6
MD5 0375f97a8989883a360a8057d68c24bd
BLAKE2b-256 076a74a2dcb79c412e0510211280b04844ffc9f65a1b02b2b92fab90bc91adfd

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 dbaf6daa99896859aaa10f101554cb569e928102842b632d16de3cf0d2003adc
MD5 d23956a6636826edf0b2a5ec40b269ea
BLAKE2b-256 24888a434476beed80c2ce01932ca166aa040ab728c72d93d40f2e7ccc1d6190

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4772be69e276a914e16257333da19c7f31aae058bb75d5f2991046647606c288
MD5 2ec3a7148253af780b99c6fdeed1d8af
BLAKE2b-256 ad5886b170ccbe4e0594ea544bae64e31a305ba21ab5ac4665fed28df62bc9ef

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6daed6c8959d98a9959889e24a78a67fe9af64eb7fb491be359e7a5df69d1abb
MD5 65aa46fa7cae04632bda3a2e449ddcb6
BLAKE2b-256 bd99ec3f5345e5e18aeae7a4edb07191217109236dac1a6f8922cd605f43341b

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-win32.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp312-cp312-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 2b49d3ea12f9f30a2fdd5a63dae29ca566a8b95232b51c16e0d43b5a8d2f5e0d
MD5 4bdf2876d63ef386e0e0181e9b02efbe
BLAKE2b-256 3e888605c70d271d609c2ee488fa3f9ef0539ea78c76d98c2a08bba19fc793e6

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7941a6c60c6b06f92b7a5a76b714c9a1ec6563a535d7168aa773a434f5d9a636
MD5 c1fc2c22dec7558b8fbefbd230825113
BLAKE2b-256 87b199da4416dcaa38a0762db770b5186719265a18a4b493030879767021a22d

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 25e0b3b45a58cc240ea0de104c757e5f60e96cf1a7b0f0e9188aa7ef37aa2962
MD5 fff346bd6c2762bc563798e180c8158c
BLAKE2b-256 43f68581bd7d220d5dc96d809caa9d6142582ed9a8cce845dd2abf4b9f084b7b

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5aaf2ea681f85eaae933589e8520d6ac236fd9a1d81ee54441a29e4600bc329f
MD5 7e725fae442558d49ee606fdb36260bc
BLAKE2b-256 58b406d6a0f6eb8ad1ec62403284cc8b292b837105ad7e28d9c5fc5f0d474d1c

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 480e87db6d768bd20243ccfe7d808fb35241e08145a0504d6a2c67550b7a056e
MD5 9358b1e1b0b2daa9a8b3f1e1e91a3105
BLAKE2b-256 bc15f6e04e89ded15d724ea0bf99d1deb1b8f00ffbb1fa067c95a0918df0573b

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9d1f44de5f0bd42dfdbec3d6559829ff223ead3e821a3b8abae2b94ff646e45d
MD5 170598fcd94292d7e48e52fa4cf37901
BLAKE2b-256 39049c8f0cf9d6539b8498edc7f2920a9e4ba1202295c4152835354d897f52ae

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 537b574f76a36cc9d3c02764a75e38cd2cc6626285f4806595f8cd28e7285828
MD5 ecae7a261d85953ad8d5557722589e5b
BLAKE2b-256 cee618bdfb577ce6e77d450c4f71c56ffead1b423ef1117a279f71c952c4f32c

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-win32.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp311-cp311-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 358aba4a8e42abe1ae5a51fdb88c5ec8ecd8a5d7fb5c446b15b1832c053435e4
MD5 919a47ec075dfacee607cacddb7d8122
BLAKE2b-256 c15938fe8b803222382577aad3333814628eef81f4b6ba028de95ac6c9e23e9c

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 672f53cacb416411292576c682a2f8e9cd3d77a2d0d82989f35c13773c7e5591
MD5 524edbb880f7be41f601ed05a0a8e349
BLAKE2b-256 06ce225fa452ce954f2d822c7c126cc60868cc61683742c2259adc9b51647b14

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 58fd2a414862bf4a41ea225312f5df17e66ebf626dced5110027e37dbf94e060
MD5 87b676425392832240fd28bae490aad8
BLAKE2b-256 aef05bc3a84260e048f72f366c43d9dadd01e26da630cf686a5fd334e7775c32

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8993959cac407bf47e0599ad87e2038651a64d4ac5475c97289a0fe419a15cb9
MD5 eaa10c41e0bc9fed28e8e8363ed05c6f
BLAKE2b-256 6418637524b83e1e08106cf66b6b331af2030b76c85d493d65223a4b6407cce5

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9815443ae3137be0d5c291a884a8083ae8fe3754d57cb72a72a1222604374598
MD5 7b0b3ce44e7bb69572476e3ff15f74e3
BLAKE2b-256 bf540f3db7d54df49cbbfaeddac811fd486b18a91248d7f28e6059c1b25f4856

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ea03ccd7d634358a1f7fb68ef09422db04e64294438f9358a711a7a755e9d701
MD5 c872ca1a89c03464dbd9a5446e2bee3d
BLAKE2b-256 af9c49156d695c1bc16c3746ef859eab4348267fe42a54eea6f00e03e9c66da7

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9a04af2ad07310a4f84c255f7c7e2a885a20c88c909b7fc7a1e877e12573f72a
MD5 35f7b7bb6d1ed32d34a1c59db1599479
BLAKE2b-256 757337ba079c5dd50070a5b6127d85d9d76f299eec04bb13963d2e95268ac030

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-win32.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp310-cp310-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 9903b5015f478d72a82f2f0920986675e0931ba0115ded705dd083ffe0239cb7
MD5 cd38d152305329492cef1f36b264a719
BLAKE2b-256 1803d5498114180d84eca50dfaf675c60a112d7cf9f6501705bc29625157e86a

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 43ad667e1cbe9983b65bfb8fe9984773c2a3da9de38f960dab8a490820d4da57
MD5 6eb890e7b54a0c8959a18f09c88d65ae
BLAKE2b-256 047ee2cbb975abd86f55d25a4f49b24afbd55e57dd63bec73a6304cd14305900

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d614e8809dc0e5535f26744f31a05f9c5ad88ca2409d95bf6d4e05fa0769e45b
MD5 2a274352eb9a0b033fa1401c71c5765f
BLAKE2b-256 0e033ab0bbcaa7685678dd09bd3efd144a81b7e486337b716bee3d1c8ac641b6

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 981377674466650452f43625c9f7be6b420326775649f4d5f10b5abcac6cbbda
MD5 7bc513c81213793d232e5e1fbd9ef3be
BLAKE2b-256 7bb7c7312a90d3399b29adef5b906abb08a9678a8dd49cc55f143db7ba3a991b

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 561075ff0a65b940425f3bc1184bf830c35f8d200a54682a0a7894b47b3c9856
MD5 7afeded3923898428db7a154eb7dec33
BLAKE2b-256 c4c0784f3de300ae0550ad07c4740032fa572fbfb17880e8ebeef25eccda6bb3

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b93adce68f92b267f01cf8dce2f97a267493e01efd72f345c8919a105ff0b6c4
MD5 90e30df7762d9527f27d4b91fbc2f21c
BLAKE2b-256 5fdb5df8a91acdb66eb3fe6b948b4aef9088fd30af37f3a741dfbaa98bc36a95

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 16d582a31a654411d52e7d703d58f19d51b49c55cd31b5374aacfe9513f7ffa5
MD5 aef2923b3b7e384ee3aeebba10d4c3c4
BLAKE2b-256 5267d2d7d3f022343f0a6585e7d07b0e91824859b93e6d10154e5bd7fce9319c

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-win32.whl.

File metadata

  • Download URL: DEODR-0.2.3-cp39-cp39-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 7ba948b5f5451bb65a347873da49fb45eaba0f111a38372334844862ab4dbf13
MD5 76d9d8248df6f2c62ba272d923309d60
BLAKE2b-256 7b3f54aa791402865bb73df67c474c42b40a4b88bbe07d01fc1096d5012bbbc8

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2bac1f8e75b0d32b2da8c20741b29c8477b5178f9519d79ede24e5a20f0f89c6
MD5 80f0afb2629060cc94bdcf19549b4653
BLAKE2b-256 bf7fab1a89a6e7ae180bf774ebadd459fd7d6ae97092ab35c0a3afdc2c14bacf

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fcf8a6de527c9c004f8b2871b39437bfea16001ed97e2e950f9830eac4b9acfc
MD5 730662b9cf0d9e4212a9a237ca6e981b
BLAKE2b-256 4f27b1fad3492aa8d0516bf522dd5db46addbf753573306110d1cc17ee14cb2d

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f32865ecfa9e3ae41ad599907dc7db091f05f30bd03361571489fdd2a69c8f8d
MD5 6f277d8873183d61c8cfd99a80e95e10
BLAKE2b-256 0fc4e9aaac8c2d253d8f06e54c92d2ffd328b04829664f6d603c694b384ec881

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b5eba3acc5083544a714460aff446520edbd2eba8b6050786105b4149aa7912a
MD5 06c33321530ab1bbe736642fad9b4960
BLAKE2b-256 6ee37f6890c8db178733574969421c8828c913dec1409af2588ad60366a9d508

See more details on using hashes here.

File details

Details for the file DEODR-0.2.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for DEODR-0.2.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3e1fa605715b4df81ad6a26b516606942c8fdb0726aa2c079e4b245a3c5cabd
MD5 9458162b00ddb1b474a6f315bebfc6df
BLAKE2b-256 9707da50b4525ee741f09c506f00e49cb7bcda8f1d0853e2e47d00c0ba0072a8

See more details on using hashes here.

Supported by

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