Skip to main content

Copy-Patch Compiler

Project description

Copapy

Copapy is a Python framework for deterministic, low-latency realtime computation with automatic differentiation support, targeting hardware applications - for example in the fields of robotics, aerospace, SDR, embedded systems and control systems in general.

GPU frameworks like PyTorch, JAX and TensorFlow jump-started the development in the field of AI. With the right balance of flexibility and performance, they allow for fast iteration of new ideas while still being performant enough to test or even use them in production.

This is exactly what Copapy aims for - but in the field of embedded realtime computation. While making use of the ergonomics of Python, the tooling, and the general Python ecosystem, Copapy runs seamlessly optimized machine code. Despite being highly portable, the copy-and-patch compiler allows for effortless and fast deployment without any dependencies beyond Python. It's designed to feel like writing Python scripts with a shallow learning curve, but under the hood it produces high-performance, statically typed and memory-safe code with a minimized set of possible runtime errors[^1]. To maximize productivity, the framework provides detailed type hints to catch most errors even before compilation.

Embedded systems come with a variety of CPU architectures. The copy-and-patch compiler already supports the most common ones[^3], and porting it to new architectures is straightforward if a C compiler for the target architecture is available[^2]. The generated code depends only on the CPU architecture. The generated binaries neither perform system calls nor rely on external libraries like libc. This makes Copapy both highly deterministic and easy to deploy on different realtime operating systems (RTOS) or bare metal.

The main features can be summarized as:

  • Fast to write & easy to read
  • Memory and type safety with a minimal set of runtime errors
  • Deterministic execution
  • Automatic differentiation for efficient realtime optimization (reverse-mode)
  • Optimized machine code for x86_64, 32 Bit ARM (Cortex-A and Cortex-M) and AArch64
  • Highly portable to new architectures
  • Small Python package with minimal dependencies and no cross-compile toolchain required

Execution of the compiled code is managed by a runner application. The runner is implemented in C and handles I/O and communication with the Copapy framework. The overall design emphasizes minimal complexity of the runner to simplify portability, since this part must be adapted for the individual hardware/application. Because patching of memory addresses is done by the runner, the different architecture-specific relocation types are unified to an architecture-independent format by Copapy before sending the patch instructions to the runner. This keeps the runner implementation as minimal as possible.

Copapy architecture

The design targets either an architecture with a realtime-patched Linux kernel - where the runner uses the same CPU and memory as Linux but executes in a realtime thread - or a setup where even higher determinism is required. In such cases, the runner can be executed on a separate crossover MCU running on bare metal or a RTOS.

The Copapy framework also includes a runner as Python module build from the same C code. This allows frictionless testing of code and might be valuable for using Copapy in conventional application development.

Current state

While hardware I/O is obviously a core aspect of the project, it is not yet available. Therefore, this package is currently a proof of concept with limited direct use. However, the computation engine is fully functional and available for testing and experimentation simply by installing the package. The project is now close to being ready for integration into its first demonstration hardware platform.

Currently in development:

  • Array stencils for handling very large arrays and generating SIMD-optimized code - e.g., for machine vision and neural network applications
  • Constant regrouping for further symbolic optimization of the computation graph

Despite missing SIMD-optimization, benchmark performance shows promising numbers. The following chart plots the results in comparison to NumPy 2.3.5:

Copapy architecture

For the benchmark (tests/benchmark.py) the timing of 30000 iterations for calculating the therm sum((v1 + i) @ v2 for i in range(10)) where measured on an Ryzen 5 3400G. Where the vectors v1 and v2 both have a lengths of v_size which was varied according to the chart from 10 to 600. For the NumPy case the "i in range(10)" loop was vectorized like this: np.sum((v1 + i) @ v2) with i being here a NDArray with a dimension of [10, 1]. The number of calculated scalar operations is the same for both contenders. Obviously copapy profits from less overheat by calling a single function from python per iteration, where the NumPy variant requires 3. Interestingly there is no indication visible in the chart that for increasing v_size the calling overhead for NumPy will be compensated by using faster SIMD instructions. It is to note that in this benchmark the copapy case does not move any data between python and the compiled code.

Furthermore for many applications copypy will benefit by reducing the actual number of operations significantly compared to a NumPy implementation, by precompute constant values know at compile time and benefiting from sparcity. Multiplying by zero (e.g. in a diagonal matrix) eliminate a hole branch in the computation graph. Operations without effect, like multiplications by 1 oder additions with zero gets eliminated at compile time.

For Testing and using Copapy to speed up computations in conventional Python programs there is also the @cp.jit decorator available, to compile functions on first use and cache the compiled version for later calls:

import copapy as cp

@cp.jit
def calculation(x: float, y: float) -> float:
    return sum(x ** 2 + y ** 2 + i for i in range(10))

# Compile and run:
result1 = calculation(2.5, 1.2)

# Run cached compiled version:
result2 = calculation(3.1, 4.7)

It is to note that cp.jit is not optimized very much at the moment concerning transfer data between Python and the compiled code back and forth.

Install

To install Copapy, you can use pip. Precompiled wheels are available for Linux (x86_64, AArch64, ARMv7), Windows (x86_64) and macOS (x86_64, AArch64):

pip install copapy

Examples

Basic example

A very simple example program using Copapy can look like this:

import copapy as cp

# Define variables
a = cp.value(0.25)
b = cp.value(0.87)

# Define computations
c = a + b * 2.0
d = c ** 2 + cp.sin(a)
e = cp.sqrt(b)

# Create a target (default is local), compile and run
tg = cp.Target()
tg.compile(c, d, e)
tg.run()

# Read the results
print("Result c:", tg.read_value(c))
print("Result d:", tg.read_value(d))
print("Result e:", tg.read_value(e))

Inverse kinematics

Another example using autograd in Copapy, here implementing gradient descent to solve an inverse kinematics problem for a two-joint 2D arm:

import copapy as cp

# Arm lengths
l1, l2 = 1.8, 2.0

# Target position
target = cp.vector([0.7, 0.7])

# Learning rate for iterative adjustment
alpha = 0.1

def forward_kinematics(theta1, theta2):
    """Return positions of joint and end-effector."""
    joint = cp.vector([l1 * cp.cos(theta1), l1 * cp.sin(theta1)])
    end_effector = joint + cp.vector([l2 * cp.cos(theta1 + theta2),
                                     l2 * cp.sin(theta1 + theta2)])
    return joint, end_effector

# Start values
theta = cp.vector([cp.value(0.0), cp.value(0.0)])

# Iterative inverse kinematics
for _ in range(48):
    joint, effector = forward_kinematics(theta[0], theta[1])
    error = ((target - effector) ** 2).sum()

    theta -= alpha * cp.grad(error, theta)

tg = cp.Target()
tg.compile(error, theta, joint)
tg.run()

print(f"Joint angles: {tg.read_value(theta)}")
print(f"Joint position: {tg.read_value(joint)}")
print(f"End-effector position: {tg.read_value(effector)}")
print(f"quadratic error = {tg.read_value(error)}")
Joint angles: [-0.7221821546554565, 2.6245293617248535]
Joint position: [1.3509329557418823, -1.189529299736023]
End-effector position: [0.6995794177055359, 0.7014330625534058]
quadratic error = 2.2305819129542215e-06

How it works

The compilation step starts with tracing the Python code to generate an acyclic directed graph (DAG) of variables and operations. The code can contain functions, closures, branching, and so on, but conditional branching is only allowed when the condition is known at tracing time (a cp.iif function exists to work around this). In the next step, this DAG is optimized and linearized into a sequence of operations. Each operation is mapped to a precompiled stencil or a combination of several stencils. A stencil is a piece of machine code with placeholders for memory addresses pointing to other code or data. The compiler generates patch instructions that fill these placeholders with the correct memory addresses.

After compilation, the binary code built from the stencils, the constant data, and the patch instructions is handed to the runner for execution. The runner allocates memory for code and data, copies both into place, applies the patch instructions, and finally executes the code.

The C code for a very simple stencil can look like this:

add_float_float(float arg1, float arg2) {
    result_float_float(arg1 + arg2, arg2);
}

The call to the dummy function result_float_float ensures that the compiler keeps the result and the second operand in registers for later use. The dummy function acts as a placeholder for the next stencil. Copapy uses two virtual registers, which map on most relevant architectures to actual hardware registers. Data that cannot be kept in a register is stored in statically allocated heap memory. Stack memory may be used inside some stencils, but its usage is essentially fixed and independent of the Copapy program, so total memory requirements are known at compile time.

The machine code for the function above, compiled for x86_64, looks like this:

0000000000000000 <add_float_float>:
   0:    f3 0f 58 c1              addss  %xmm1,%xmm0
   4:    e9 00 00 00 00           jmp    9 <.LC1+0x1>
            5: R_X86_64_PLT32    result_float_float-0x4

Based on the relocation entry for the jmp to the symbol result_float_float, the jmp instruction is stripped when it is the last instruction in a stencil. Thus, a Copapy addition operation results in a single instruction. For stencils containing multiple branch exits, only the final jmp is removed; the others are patched to jump to the next stencil.

For more complex operations - where inlining is less useful - stencils call a non-stencil function, such as in this example:

0000000000000000 <sin_float>:
   0:    48 83 ec 08              sub    $0x8,%rsp
   4:    e8 00 00 00 00           call   9 <sin_float+0x9>
            5: R_X86_64_PLT32    sinf-0x4
   9:    48 83 c4 08              add    $0x8,%rsp
   d:    e9 00 00 00 00           jmp    12 <.LC0+0x2>
            e: R_X86_64_PLT32    result_float-0x4

Unlike stencils, non-stencil functions like sinf are not stripped and do not need to be tail-call-optimizable. These functions can be provided as C code and compiled together with the stencils or can be object files like in the case of sinf compiled from C and assembly code and merged into the stencil object files. Math functions like sinf are currently provided by the MUSL C library, with architecture-specific optimizations.

Non-stencil functions and constants are stored together with the stencils in an ELF object file for each supported CPU architecture. The required non-stencil functions and constants are bundled during compilation. The compiler includes only the data and code required for a specific Copapy program.

The Copapy compilation process is independent of the actual instruction set. It relies purely on relocation entries and symbol metadata from the ELF file generated by the C compiler.

Developer Guide

Feedback and contributions are welcome - please open an issue or submit a pull request on GitHub.

To get started with development, first clone the repository:

git clone https://github.com/Nonannet/copapy.git
cd copapy

You may set up a virtual environment:

python -m venv .venv
source .venv/bin/activate  # On Windows: `.venv\Scripts\activate`

Build and install the package and dev dependencies:

pip install -e .[dev]

If the build fails because no suitable C compiler is installed, you can either install one or use the binary package from PyPI:

pip install copapy[dev]

When running pytest, it will use the binary components from PyPI, but all Python code is executed from the local repository.

To run all tests, you need the stencil object files and the compiled runner. You can download them from GitHub or build them yourself with gcc.

Download the latest binaries from GitHub:

python tools/get_binaries.py

Build the binaries from source on Linux:

bash tools/build.sh

Run the tests:

pytest

License

This project is licensed under the MIT license - see the LICENSE file for details.

[^1]: Errors like divide-by-zero are currently still possible. The feasibility of tracking value ranges in the type system is under investigation to enable compile-time checks.

[^2]: The compiler must support tail-call optimization (TCO). Currently, GCC is supported. Porting to a new architecture requires implementing a subset of relocation types used by that architecture.

[^3]: Supported architectures: x86_64, AArch64, ARMv6/7 (non-Thumb) and ARMv7 Thumb for Cortex-A and Cortex-M. Code for x86 32-bit exists but has unresolved issues and a low priority.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

copapy-0.0.6.post0-cp314-cp314t-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.14tWindows x86-64

copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_x86_64.whl (203.6 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_armv7l.whl (203.4 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_aarch64.whl (203.7 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (203.8 kB view details)

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

copapy-0.0.6.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (209.3 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (204.5 kB view details)

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

copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_x86_64.whl (190.6 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_universal2.whl (194.9 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ universal2 (ARM64, x86-64)

copapy-0.0.6.post0-cp314-cp314-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.14Windows x86-64

copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_x86_64.whl (203.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_armv7l.whl (203.2 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_aarch64.whl (203.7 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (203.8 kB view details)

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

copapy-0.0.6.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (209.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (204.4 kB view details)

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

copapy-0.0.6.post0-cp314-cp314-macosx_10_15_x86_64.whl (190.6 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

copapy-0.0.6.post0-cp314-cp314-macosx_10_15_universal2.whl (194.8 kB view details)

Uploaded CPython 3.14macOS 10.15+ universal2 (ARM64, x86-64)

copapy-0.0.6.post0-cp313-cp313-win_amd64.whl (192.9 kB view details)

Uploaded CPython 3.13Windows x86-64

copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_x86_64.whl (203.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_armv7l.whl (203.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_aarch64.whl (203.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (203.7 kB view details)

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

copapy-0.0.6.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (209.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (204.3 kB view details)

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

copapy-0.0.6.post0-cp313-cp313-macosx_10_13_x86_64.whl (190.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

copapy-0.0.6.post0-cp313-cp313-macosx_10_13_universal2.whl (194.9 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

copapy-0.0.6.post0-cp312-cp312-win_amd64.whl (192.9 kB view details)

Uploaded CPython 3.12Windows x86-64

copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_x86_64.whl (203.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_armv7l.whl (203.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_aarch64.whl (203.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (203.6 kB view details)

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

copapy-0.0.6.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (209.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (204.2 kB view details)

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

copapy-0.0.6.post0-cp312-cp312-macosx_10_13_x86_64.whl (190.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

copapy-0.0.6.post0-cp312-cp312-macosx_10_13_universal2.whl (194.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

copapy-0.0.6.post0-cp311-cp311-win_amd64.whl (192.9 kB view details)

Uploaded CPython 3.11Windows x86-64

copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_x86_64.whl (204.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_armv7l.whl (203.8 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_aarch64.whl (204.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (204.1 kB view details)

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

copapy-0.0.6.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (209.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (204.8 kB view details)

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

copapy-0.0.6.post0-cp311-cp311-macosx_10_9_x86_64.whl (190.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

copapy-0.0.6.post0-cp311-cp311-macosx_10_9_universal2.whl (194.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

copapy-0.0.6.post0-cp310-cp310-win_amd64.whl (192.9 kB view details)

Uploaded CPython 3.10Windows x86-64

copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_x86_64.whl (203.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_armv7l.whl (202.9 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARMv7l

copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_aarch64.whl (203.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

copapy-0.0.6.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (203.3 kB view details)

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

copapy-0.0.6.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (208.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.6.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (203.9 kB view details)

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

copapy-0.0.6.post0-cp310-cp310-macosx_10_9_x86_64.whl (190.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

copapy-0.0.6.post0-cp310-cp310-macosx_10_9_universal2.whl (194.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 f43b6c1868f81b049ec745e827e2c6200eb75f5fc4b7eec6c7fa7f4ce6ee9951
MD5 c3b1d1b7593f67d2c0a4170cac0f5a8f
BLAKE2b-256 722d589f6f8300d585f217afff4d067e6f7cf61fba6029db81f52a843c42a32f

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2bfb5b2383b276c92d37c46a95a1dd3f0f83e91222ca6718552ac1d7cdf3532f
MD5 df5021a49310b0ceed01a770b14af93e
BLAKE2b-256 81fcc2021562bc7312374938e287fff2a66c9895fef19c1687f94e747bfd6e1a

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 310af74bc3003675163cd2ed290b49c2cec4c7d05a02bfbe26c224ca71c4a75b
MD5 00548ff546c2720f0096286cf2e13514
BLAKE2b-256 55c724f478e58e90c01a3db28a1a5f2a8e16db276521c93baca07c6470d7c3e0

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 50451065febdbd9991b82df61258049155882b0c12b6231eb4b9608d672822e3
MD5 e0fb71c2d7a40468fe3cfe2bc1506199
BLAKE2b-256 9cbeeaa9f4a76318eb933d96522adf12884de81f70aeef80feb637a13188b1cf

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8a16097c8ac4df7693a3627aa1e936bbe52cf5577e3a9151126aad36820a920
MD5 0ce32812f51e1660df8c9f587d40e0cd
BLAKE2b-256 e17832c4a4f71d8fd969b8477389f54558390a18e6c1fc1acd732f51566af497

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 25d46c17ffa60af93329445697ba3ad68354901389cadb4185ccfcfc5ce5417c
MD5 9110d57838e4aadd804b96b3b1aac024
BLAKE2b-256 69f158b968e84db2bf7adf346e60abd02f2a93a060ab30e0abf387e35fb9f487

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6a900fec1be44735f2c72a230bead2ff9756fc92bbb59ec4fa7ce5d1bb576a47
MD5 263ded50652fa62392d16274e0485678
BLAKE2b-256 2303703b070f198f1c425d8ce292df6937ff22b7d6e1b27593bc9a30f2ec92cc

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c8bca3fedce7c5046bb083b8c7fdf33f5ae81e2b003759141115517f6bed6f2b
MD5 d7c9b98b78fe456d1d43e5304a5e9d5c
BLAKE2b-256 4aa0a66f9ad18933104e0dac5b22945a67b94cd5d2430eff00ac0c1451c1d68a

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314t-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 e87162491eb140c2d48ba393409fb7a837726427891a38dee3de84dfb5466a02
MD5 d8f2eded8453711a5638c40f4b03b224
BLAKE2b-256 3f5c3a6fcafb02372a5ccdf585ede3dae438a3b4b0aafe6e3f05c7129b3a933a

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7f93b61a02a419a6fdb4847675316f022d97f6afdfea117dd1ab7a11eaca1c6c
MD5 0ec65e800900f22259e87997b65593e7
BLAKE2b-256 438aed5f3ea220f1ada0102e446be80c54541eb511530aa568c0020e5ebfd42e

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e47f9386e9028ffc59a890dc85412e53615db1f1547b339ebf7281b748311f13
MD5 3292911ea673c71c62c1589be93bf80d
BLAKE2b-256 0ba81d8f2ad197543b5d22d04b89d7457e33c223cf5cde9a8127793e6e4c23c3

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2354faa9e4c4a1f6c39825687f4a4470aeb33ae3a7453e2eca3af834583f3c1d
MD5 c2d9419d827acb5209ebd4f8f1d0adc6
BLAKE2b-256 85aaf6bcf5df027a1c4b290f104fd082448ad80c0f917c72bd6243d225285131

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 44677746e982411c200a4f6764591668aba4669f22c02b13699bd8b318705a07
MD5 cf315a752f52d1a898fbc3422fa1281f
BLAKE2b-256 bbcbe28e1c6dae39aa8a922ee501e9e42600b0a440795f146f0f6e9517fb79fd

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 12a585b8e66507acfe1c00b77b58f86120ba0de63686cc722a3c7e5e3e720587
MD5 3a4458be3b06e829d28c436c0eba822a
BLAKE2b-256 1dc53a5a56e831e554c89313b2b677eeb4dd8f213445ee2f99f6a2dbd775156c

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 e1dbe1b111cd271ce5ad2aa45cc44d2848a5a6b68fa833f0f72772d13b5ea72f
MD5 7f34edc127dc2a9a4166968e5527d317
BLAKE2b-256 e10e22be854e21c4efa23c331f28d373e827000fcc2f44c41405dc48f4bc2f65

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f53d84da49892d0d0cfe2c187ca88a7315aa021e61a3a47cf6e7799a62b08cd5
MD5 4f0f9f831fbf296762e9f1c87456a818
BLAKE2b-256 8afbdd82780fcbffc216498a5fb527b9ae3a1c55c9620841ca9dd55ef4ad0ed8

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 13ee34b9191ee26b07cc381bcada196427347daf28522f9567cd60ad04172e95
MD5 1722cce792f371ee8050a6589c47da90
BLAKE2b-256 61aa06373072db29b523d51faf0f5733c59711f89a7e0d4d7833ead222b6062d

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp314-cp314-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 ce13e5ec5355ee00489be4ffbc11cf2d95bd2213b910517a4d34e6392268e7db
MD5 8312e156a6deddef62b46104a0af5c66
BLAKE2b-256 c47cf16070734de496993fb6d8790a3e64aad19f1cd199c534059fe72b020a45

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c9d31313f4ec60a535b605ee31d222bb7808929d0ae778db36de3e169d6776b4
MD5 f0283d35ef60405859761eca303f90e3
BLAKE2b-256 a7b9088b4eb68454413ab79e63bdafc930d46020333ceb6f4c2882617318bff9

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d316e21be1e03d09c80f987be997878628f3f2c39d90c7b557346b36b1945ee9
MD5 db3e630d828967430f1534a0d27d060f
BLAKE2b-256 cd0988e3303489c973355cfcf9d8bfe3834a0193cfd60c450c90e2ebf7e23833

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 439e564d5a1e276ce277e85b15dcc483e2dfce827d211c03ee8e9a586aa5696f
MD5 831fa113bfb7b5ced327727dc0caf673
BLAKE2b-256 7ddbc983a860d30ffd3ed6b50c79add4484ca245266e86a26055b3d855c063f8

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 103dd74a004c08a569b55897278291aa972227e2354e873cf09bbfe7da7efe94
MD5 98b4f370d8f7e15a8ce5cfac8c51732a
BLAKE2b-256 544fe9ccd711c0bbcbdc848c5272533f2d0ece4a96342f93b94b26611ecf2d10

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1c4b5933fe9143a0e05b02411a90b1abe90105daa9c994001b1a56ddd7ab799a
MD5 f5d30b7c28851e51a03cb9597e211f8b
BLAKE2b-256 23c9f77fc4ebc7bc88f1cf52b084aa892d31378a77c0fff55e095462fc2df8c7

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 13f301ce8e691d20d900b72cce771b69a8f4469f7645f8f7eb881159628df52f
MD5 72582af737a2f9e2f7b61d260b872800
BLAKE2b-256 de7c170d101fda2a35d632189afe5a259a99b22848f7a860d4f6e6b3d4cb8bc6

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 006715ae7625df2398b2054466d2242cd4b9e89915d55359657d1ce99789fd42
MD5 3d5c5b1f26ab73b3fbeca8bc389c352e
BLAKE2b-256 70fc1751ed54841d118733f98d01cd8f09587d868bdeccde5837b3e7808add0e

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a54b66bc3ff55b0ee306b73679cb120e2e3a2fb3c6440d43aee4a06aba7b1f08
MD5 f42c4993b46a5bcb3da850a36014a545
BLAKE2b-256 726c58dc446125935199d17f7e65b2a9c1e4ed1654060dc1b75720d6a90c0559

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c6a6d4bed91c9a6609d6168decc9155e0b26e9d8a8a573dca5eabc2d825dcc68
MD5 7b64d8110b75afc2f9e5c46e25afe35a
BLAKE2b-256 3bf3b9670a0724974cff05efc309f83aa4e2eb707124151e8b967625a5b06439

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 75acaf5847f2ae146e056da65364de3f4aa71dba2fabddccfc327de581d2984f
MD5 c4b17e20d7c1e2e9e474d4fa1a6126fc
BLAKE2b-256 29f3dd38cad9a1ef143697645f0c8ecfb9a3c6a4d14459796dd9885f3e653415

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 569baaeafb31ef93a93788f5ae45ad3024e26ea7348783a6c41abea6c024b784
MD5 cc42b60ec7434aa4a5243dba5fd516b6
BLAKE2b-256 748caf8e7314855ca3d2d85a125f1fa8cd518da1e257a241f7e4444220a1f4cb

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 839bc94f922d2f87b243e3698e6fd629227e1dbf78dd9f9435b1cad8df2c80a4
MD5 76abffc2c6b4837402c47a1010aac627
BLAKE2b-256 be04d93d71b697f8abc9f019fdb285649c6a3532f2d3ce2f8f05217b05a8c4fa

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2647d051161e06f934ba51f2682d2e172aa4f7345bed7f3732389464bbe9f364
MD5 d31d28bc6a5323ed991df425eb2e9a0f
BLAKE2b-256 1001e7a2e5e9f3bb363245b8ca75ef0b69df62aaf654fb3b7787f48e76f1f153

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e0807f99b38b13ab26d13e05faf13f85f047682e8360c3123d1e0deab662ef0
MD5 b71f6a0b164042337d734b753b4c37eb
BLAKE2b-256 98400590f722a6b5a563e33ad191910305dfd89526e2dd3d5731149b5e8ed5e3

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 2ab8fa553210c7e385f8a4bf3e40c272e0137151aa4d1fea782bfa8ef39a6083
MD5 7a51ec7376a480bc550e108f89d0b47e
BLAKE2b-256 72b9a438a1a55716897975f926c1c47562dc14400ea07772260a0349f6764198

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 79c8aa82f7e71596626160c861be3f4d323c463281448fcc4d395d6e99a8cdc4
MD5 f66ad90f9bb74aac90e46a54a4e14c6a
BLAKE2b-256 66ab176a2d7d754b434581807447db61f01f6a5bfb0547321e72bd05b1e93974

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6e6a8c1facf04ed407051083070f72ce6a11d01e929f43f561869a07c57788dd
MD5 ee9b73a59fd6e3d300ad8d4afed34bc8
BLAKE2b-256 b90cd434747f3be801250c9fd09dfa2367d0a501510e4640d3d0b27b324221f3

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 f800fde40af697f94cb4bebe74702f55c16821c2c7c1d6bfe9275b246eabe800
MD5 aebc1d04b83bef40ee5c55d168971738
BLAKE2b-256 891cbea9cd9870abd6fd5bb5f55addc91f10025edc32ada4bbca3b0119b6bf67

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0b9efafa9c15d401716ee1af594315381efd09305f8424b37d90c4fa06bc991a
MD5 594d4aea7a144c0a5ba2fa5b467fbd1f
BLAKE2b-256 6d93aafa297ff9cc6613d1c29e672f800454f7dd2e0b826219c4173ab3c1a4f1

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4f2a0ed4ae55f661e51cf3334de482915c2ec7960c65327db2dbc569992b4dc5
MD5 30e676dd6f969c88d79d7abf715134cb
BLAKE2b-256 5589e5754303890b548d64de466519f88190d73e88ef5718773b861ddbc44e1f

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 d9fb0adcb19f54e7277caa34f3198e7f09a493a9edbcf31d572fb8a7b881690a
MD5 ca218e31dc083ba410d441f21054656f
BLAKE2b-256 866a70fbc493e0fcf439051ef0556cb5bd453f238d89d44d559a1cb6025b0d9a

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 bc560ba3f7dd44906a69d114612c3441568b128255920cb12c780cd94baaf1dd
MD5 b8a72a309231bc0a7c290059ef863775
BLAKE2b-256 322106c83f4491c1e1f82086036881003f2632782839ffa5297d7eaf9fb605ea

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 174170ae2f071e4f44a1cb0020e8fbcf2845b479ec13ce177bd71c432ea22808
MD5 474697ce65daa76a80945b9d6a90bf4b
BLAKE2b-256 8a168003527fc0cde703261cec5f5cf82222239081c4bad898e9dfceb05cf9f5

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 2cb40e742b1e736aaf3179d10c6ff4f37b5e02346c5d5d0296baed39cc4ed3a7
MD5 f4a916702e2ee3857d0631e53cefb237
BLAKE2b-256 a154ce22e2d47f3f0a355c68badda0c635b088652046b8f2f48476f995e888cc

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 47ea39a29cb5b25946ce1f28d70433883b1e6ab191a22e50349b69d1a182157b
MD5 36510f4a80624dea2185b6ff079d2a8e
BLAKE2b-256 072a8630573f1b1d5105cdbc7f1ced93edf4fb635160088b87493f1fcebf1447

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a3b0a2c3694397a9db37bd86af292db86d664e18003ebca717d75d3f79d7547b
MD5 89d8ac1e9702506740d366b6aab46379
BLAKE2b-256 2d12da0d5bb59502d59ff5db2f8d0382ad4ac1fc4ba5525efd890c28406457c5

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3380a0679061a5434774402a1dc7615f50e0f622525fb8889ef5a41686b65849
MD5 058f4db0621ea96b11a2365abfd3872d
BLAKE2b-256 f23aa4d51ab2fa86e116f80311a220b60d791d30227c877e126d481bcefcf61b

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 69d4fff8f9cb4201d8b9c3fd39ee8568a6032bffbc106d6c3d363baa94bbfcf6
MD5 947b88ac705be638df48bc85bf6c8ab8
BLAKE2b-256 1dbebe22dc46f97c9180a6ba3ea3e83304e975dc02804b68b265bbfdd03c0dab

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5ba708348a1c29e2045f4ece3c3e6fb5e6fdec0d878acf969f943097e5c05917
MD5 1ed61d18dc7b091661cab977b9bbf398
BLAKE2b-256 a65859d028803fa0c51332bd3db96dca7e17715d20a9b43f3f21ffa4cb252adf

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 4af3c8dc3412e1d8da9d6a5aa2334b1462a25552441996a33e17d78036597b5a
MD5 51c61b4e1490bcedf8a449b8023ed35e
BLAKE2b-256 ec4e958db9e048c637dc15df6d58f37d579271aeb72b30805d60c08725523fcf

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b5ca6c161bbe6ce65225ee834bb43b42a0550cb5d29b161a5438dabbf0eb076f
MD5 07844f6c7adaf047bfa8eb19d553789c
BLAKE2b-256 ef9cd9fee5985b0a6911d7019beb9a40c80096d4db1af930da3a260e7af25f10

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 422b84431985b646128f36137417dea7f593680eff353c3e11b455b639008b36
MD5 c80de67c0a7c1027ecbe5b61981654dc
BLAKE2b-256 64d807207a866aadcdf34fe899e9e40137309fbfb1129586fcb9f2813f2eef0f

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 3556b5227e9bcc99a012ee93f8936a1a756a67aec445bf8120850111ae9d0711
MD5 5e2ef203baf2e328c5a789bc9c5981ab
BLAKE2b-256 b1cf9d1cff736472d51899ac48d688d616b8d9292df0951f96a33e8bc6616a9d

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 abd906a3fed33f59727f52f798574387660d004a815b3aa570334c4732e89b2c
MD5 b78b79491d8d22ba338e0e7947bb0154
BLAKE2b-256 3381b14e24b6ca33b558ad7afffe198995f045c4493d4ec5470ab14f571870d3

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1edc56665c6af97501a3ec3d7a1774ef15cf29b7677353d879e83765878c41cf
MD5 90814f3d61ac150fdcf01a73fd2ab38c
BLAKE2b-256 5e7675dbec7ed987ec290eb6c5425519008dd4bca325cbddbb1b4abe7bb7fc6b

See more details on using hashes here.

File details

Details for the file copapy-0.0.6.post0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.6.post0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9cbe9a0b90af113544c7fc7fae2762a452a809d5ac372f0bdc7ac8a67d87c1be
MD5 b5a9d84f4f1f73cc3205a2622e2c8867
BLAKE2b-256 47d22aeca4cf7e8bfd99c22e0befdac274714d1b3d9e984394c67df3510f60c9

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