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, ARMv6, ARMv7 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
  • Support for Thumb instructions required by ARM*-M targets (for MCUs)
  • 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 and 7 (non-Thumb). ARMv6/7-M (Thumb) support is in development. 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.5.post3-cp314-cp314t-win_amd64.whl (172.3 kB view details)

Uploaded CPython 3.14tWindows x86-64

copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_x86_64.whl (179.6 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_armv7l.whl (179.7 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_aarch64.whl (180.1 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (179.8 kB view details)

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

copapy-0.0.5.post3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.5 kB view details)

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

copapy-0.0.5.post3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (180.7 kB view details)

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

copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_x86_64.whl (167.7 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_universal2.whl (171.5 kB view details)

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

copapy-0.0.5.post3-cp314-cp314-win_amd64.whl (172.3 kB view details)

Uploaded CPython 3.14Windows x86-64

copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_x86_64.whl (179.5 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_armv7l.whl (179.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_aarch64.whl (180.0 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (179.8 kB view details)

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

copapy-0.0.5.post3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.4 kB view details)

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

copapy-0.0.5.post3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (180.7 kB view details)

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

copapy-0.0.5.post3-cp314-cp314-macosx_10_15_x86_64.whl (167.6 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

copapy-0.0.5.post3-cp314-cp314-macosx_10_15_universal2.whl (171.5 kB view details)

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

copapy-0.0.5.post3-cp313-cp313-win_amd64.whl (170.2 kB view details)

Uploaded CPython 3.13Windows x86-64

copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_x86_64.whl (179.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_armv7l.whl (179.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_aarch64.whl (179.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (179.6 kB view details)

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

copapy-0.0.5.post3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.2 kB view details)

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

copapy-0.0.5.post3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (180.6 kB view details)

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

copapy-0.0.5.post3-cp313-cp313-macosx_10_13_x86_64.whl (167.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

copapy-0.0.5.post3-cp313-cp313-macosx_10_13_universal2.whl (171.5 kB view details)

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

copapy-0.0.5.post3-cp312-cp312-win_amd64.whl (170.2 kB view details)

Uploaded CPython 3.12Windows x86-64

copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_x86_64.whl (179.3 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_armv7l.whl (179.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_aarch64.whl (179.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (179.5 kB view details)

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

copapy-0.0.5.post3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.4 kB view details)

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

copapy-0.0.5.post3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (180.5 kB view details)

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

copapy-0.0.5.post3-cp312-cp312-macosx_10_13_x86_64.whl (167.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

copapy-0.0.5.post3-cp312-cp312-macosx_10_13_universal2.whl (171.5 kB view details)

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

copapy-0.0.5.post3-cp311-cp311-win_amd64.whl (170.2 kB view details)

Uploaded CPython 3.11Windows x86-64

copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_x86_64.whl (179.9 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_armv7l.whl (180.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_aarch64.whl (180.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (180.0 kB view details)

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

copapy-0.0.5.post3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.9 kB view details)

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

copapy-0.0.5.post3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (181.0 kB view details)

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

copapy-0.0.5.post3-cp311-cp311-macosx_10_9_x86_64.whl (167.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

copapy-0.0.5.post3-cp311-cp311-macosx_10_9_universal2.whl (171.5 kB view details)

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

copapy-0.0.5.post3-cp310-cp310-win_amd64.whl (170.2 kB view details)

Uploaded CPython 3.10Windows x86-64

copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_x86_64.whl (179.0 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_armv7l.whl (179.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARMv7l

copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_aarch64.whl (179.6 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

copapy-0.0.5.post3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (179.2 kB view details)

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

copapy-0.0.5.post3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (185.0 kB view details)

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

copapy-0.0.5.post3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (180.2 kB view details)

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

copapy-0.0.5.post3-cp310-cp310-macosx_10_9_x86_64.whl (167.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

copapy-0.0.5.post3-cp310-cp310-macosx_10_9_universal2.whl (171.6 kB view details)

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

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 534d5eb8ddfadc072a8d7f10ca92c749d2095cd978a85b345dec634f7b0e4eee
MD5 c729fe9ac7364d887eeb66dc1d0f7aaf
BLAKE2b-256 ae1b747709bffa8a43b1ab8c98732690591e13a100a981a54e742debdd774e7a

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f212740a7d89b52c547d3b7058f48c680eb1b682d9a2eb259b8e1fc206025eaa
MD5 25a9b8e007448b8fee23a6355b2720cc
BLAKE2b-256 c8a84e98f9c673ae0fad4de05dfb2fc04dd5e2dc9a2cc509b47d0dfbc3ef0ce0

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 a022c08e9d5203245921dca0978327568a4f19911f08d1d9ca42f5c332b6f8b9
MD5 bf6741f84d5bb07e048e8166d9df1838
BLAKE2b-256 07bf9393be0069943f59845db1cf0132b8bc334b7d95295460f5d233598eb864

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 fe927d6588e88444cfbf5f6b95e8511464fff34150e088a6daefee7c4d41ab40
MD5 94e31a3d1c4bab144dce93df7cc3fd6b
BLAKE2b-256 d36b428a2a1af0ac80d69fa84c61fa5c1ed0f3e8884efcc21ce3ac419825c5d0

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2ec17b90b5a2fb57de810e005d3c08956f72228d79851944d590917df84d4c71
MD5 c466bb79ab7c08fdc90a4f97a4f1a360
BLAKE2b-256 84c3abd88f1dc582e03b9a3cd28620b167e5050b5a312e5291d5ed31ce9649a6

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 313368e328e921551bbb292e4414d721c5270099cddc966c6106c9e1c0fd2d3d
MD5 692e5b45e8e88ea9c7de3d903a5862b2
BLAKE2b-256 99a133ffa0ae9844052e090250c2222cb821851e92c8a9cd8e786044dc86a042

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7a577128fbf2f60980da5308a2e7798f24be51f9bb964a4c7b7eb16a11096b21
MD5 7f125cb4f67a91fbd1db504db27f6ffe
BLAKE2b-256 f923e19c9849a94e050c6fdab25b6ed178488e6dc10b003518527df41bd62d60

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 44e93b6d6b04951f657b9ed442a09b2c449d2a4e6ba1d3734a0b19db049e3ad3
MD5 80267874699d3dab753850b8ec7d30fc
BLAKE2b-256 afbf82059c4334cae358157e8800f8a02f8e078d46cdfba0c10419c4b22ecc57

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314t-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 7fd2a2c87727fb0c2a63e48fe948546caef34fcb6567a2180d2b22b893f49032
MD5 2e95a50089662bfa534fdb33a004a05e
BLAKE2b-256 daa5a19a777cce38ace04b31ff403217106a02fa2dbf77e43d65adc3a784c2ad

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2bc9e4afc7cbae90c71ad37821162ab5e09c1c784798f681897f99c8c0195eef
MD5 67832287c3e08af15a7a67c779503adf
BLAKE2b-256 3084f5c53964f9428801ea17271b42524282a895ed3f0cc3c0eecb08104af5ad

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 408e2079e565700534bf8da01bf1869d5bb885503e02a525970fa48bf7dcb135
MD5 b3c0f4efa9be13210724653a5ab91654
BLAKE2b-256 41b693becfc59fbe6f2fb4f8d15dcef1c1fbf990e3388556131a801909d4525e

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 89650c281783d9661ee21a93341a6874428e1f79d3c0cae94330f490d58911cb
MD5 1c8e906ddf2c14817264d9d2d1ad8fb9
BLAKE2b-256 83640ebcceb70caef50d42657189314fed83861d74390a72a42c98c8150d9039

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4e5bc9d2ca16293935bf0e09f69381873d4ee8eb977f1f1d7aae4ac2834160b0
MD5 2a72a56bf2c1438a08b63973c71e04ed
BLAKE2b-256 0c2e67c3f7b6674e67d9342e6c96fa5900bbd0a77c09d9eefbe39d00bed32ede

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0d9dee6158f45fdb3fe26acd014524e154da2fcca7b479626e74972d0a50bee3
MD5 f031d401039e8299f72c2fd5e04dc4f4
BLAKE2b-256 c63c82945645c561aade929dd494382c06745a5d41ee76327dd5cf318004eab0

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 aa6132863aa9aaefb55ecfd2b67dc671dad6b726fa2deacae7dbba8e17e161e2
MD5 7b38294a4be57e7ad69782597c023b54
BLAKE2b-256 6ddc2bee4287c200abaaee2a85b5b2ba8a2d96933576766b5987239db5319280

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5fcfd5fe679feced1f2510f8db5a6ee70b3a5c357e0f4d7f7fc849fc7ac4f196
MD5 4e797adc29e5a6693e2eedeff450878d
BLAKE2b-256 d32b379444fdfc060741a3715f4f14979f4b94e0d27e263d09b9dba0a10b98d2

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 17c2c60841d2c47497aaa4e3420181b265c2b9e945e2c114bb1e433f4de33766
MD5 2b7942a7c950b9f4706f52dc70c9b4f4
BLAKE2b-256 683723f4f4386572f420dbd76dd6a7c1ccf7133a35495fbf3c6ffade9002e461

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp314-cp314-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 1e6d1d2d8ac8ee2e6fe5d2b440da5c7dd73f511fa6b8826be3b8908f85732276
MD5 a7f46a619d1340f223b35acc1c00cb20
BLAKE2b-256 ccfe565789f3899303390baec2c4f65f88c19efaef3f76939e819b75f3d59a3d

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9973d6fe4d1d6d22b62d2ac345aa303dc2cbbf5984a0d3f325d56b25ae98534d
MD5 781be299628e5af6f147db812a954c63
BLAKE2b-256 2034d196e425efb26f74e7d040787fca150e45833ce870db2a8145913532db74

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a2ba05399709d0383fde9fd553a8c65d912ac3c0e2894d9819418b6513311800
MD5 8926d9d7fa063ec215b31826387a348f
BLAKE2b-256 f58a8f7eb768e8f2b0bfac28ffd096f7fd070984a562b4b779293c5b3473e5d3

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 83709065bcb9e0c2eed227682fa3a1d99ac37c41963da56dba3bbf8bb8e916b6
MD5 c8892a9a29f5e552b3a2876cd1f13a3b
BLAKE2b-256 a7bdc5c6d1b6dcd0587784a048b4c6cbdb6940e4c3549478c346e6ac1aef3dd4

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4a148bdfea8434cff9f064ce9a6080a00faf2df43f509026c466410cbb80ae6a
MD5 67e2d794728328c586daf83eb4a2231b
BLAKE2b-256 68d19058b916c09040206ae36a480997d13db4856283b2416344ee202e8e7783

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 03d82ea8dab71f2c5a345b67049f7860ee17fa1d3d1598b4018c82afe7eeb949
MD5 a5e19613f1f29def96c12eea956922ac
BLAKE2b-256 2447cf5f176d86a41db151f7c880a37a79d08222cc8e5f77e40376a82bfd3c86

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 06ba039a9ccda801bc74869a9fe8e1601cc6ac9b9c6886d9a127f445b791db9f
MD5 7ae37c3bcd82d13ef2b460e745b68445
BLAKE2b-256 fc6e5ebcaae9c68d6de51bfcc7672e48725cfbf43fe2fc8b35c9f09eb9044f22

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 aa3b8f6f6048c27891609ae2f952e4d0447fc6171e7ff2428b02351453a2ddef
MD5 1d4a8af7b43651f10a294bfd72534f68
BLAKE2b-256 3f56963be8992ac534f963de019145ea780e078d7e03566f79eb55b5c912dadd

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 deb259ad4df1d2c9d6146fe70994662407df3490c02e25dc2238ec3913c5e573
MD5 723ac5e387a296f0e80c619abba53b58
BLAKE2b-256 c301a078136b802b2eadb4a6546744c4585cab1fe311e99f8658cf792b6e6a43

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 1d31f9c46e8ce155a2e5cbc0601e913e1aec1f57dccfd9b32510c773fd8ebcd0
MD5 0399074f90c458f6c5c08a4696f70739
BLAKE2b-256 43ee48c75769533aa7cdfa5920066847b0235430b5834bb516286be1868b988c

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b66502fa5ad2d52ade9d1a73ccf4c77c6db9562d1536fe8d3984d6698eb09b65
MD5 0e3040fb859b0e48b5f657370cfd92a0
BLAKE2b-256 57fba95810f7bae3281ca9d937ad9116c94b449c53ee3ef6d78eb68671bde924

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 dfa9fe0c3bda296f9de11c64c4ddee1ffb82c7344ffd4866eb56b159282a76cc
MD5 556a3d2b3bbaea8f2f22b44fc56b1fe6
BLAKE2b-256 0dc8fa919b600bc9fe2737f2e2f6e6a8f25fd74cf707705edb470cfd3f5b3f11

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 39b0f442843f44153d6ac7e512a59e362d4fb28b46571781d729e7f8d81ebdaf
MD5 a7f10323f1227aef5b226860c72ad311
BLAKE2b-256 92888506d7b6b0ef272626ad6af27c0a0c329f56ed0bd3acb0aba4be28a250f8

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 474a1e87987e405992d5b05d00a3e4ee30e4fb8e4ab47988d794ae3d4e21d823
MD5 c332fa2b1f7da7ec999d9fea218bb9ba
BLAKE2b-256 38a1a459e9388fb9f832b82c3cbc3ff0e61e7cc50d72400ff50716eab4453a9d

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 edc5761b2cdaa717a37c76e296bad3589b7431c7e0f4052579fda2acfae7feea
MD5 7599471298600de83a51a0314e225e6d
BLAKE2b-256 3b2c2ca9b1ea04efb935234b152d2710dc8873c7d55787505e82d0774c60b17f

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 c0c8e54d8d64275add2766f50d64d31d0fbf25211687ed5768ce51a9bac83b73
MD5 ef6ca195ad8fbd65216ded7c746e0d2a
BLAKE2b-256 a8af2aa6ca73162df266db0db1307ae699ad1d8fa6b7588804ccc9f689cc85ca

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 30bfb553c4892bf81a7894614f399c3c23f4a9b3358a24b4b37d451ef0572d0d
MD5 e100fab0c03e8b2dcfb6f44c4b613269
BLAKE2b-256 8304aa8132fdb46886e61caa10dd2a7c7ee2621f7c211e655ef4e46598d463cf

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3c0c6a75b3529b238b723ddfc2ee1e317fd4fef886f2ff59bfc06d23e1169dc2
MD5 9f41bcf1d5d13971fcc92ab8c4797ae0
BLAKE2b-256 64dbc849da20fa13c54ea669c13ff5ef85bbb77a43251ddd687da8a1a7a0c645

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 59aa4de9bfa0a44a64b5c44af267807feb05d65c43c6318c7dfe00e0b9205d87
MD5 d4f536f528e9d2d116241768519712c0
BLAKE2b-256 f6fdba70eebced37b6511afd3a0ceaf575c4ff2544af9b03365b7fa984467883

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 24ef1a998c8f608359851b9a5c06978d037c71e04739a074079cb09f9eaf01a3
MD5 cedd0ed2c45a0dff19270e7696779b93
BLAKE2b-256 380c1cf0a1507fdf2460e0d935bcfa1663a15294f565f6c36c0d6285fc40bc10

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 73b904cd7b214b0cc6885bb8775c36d6ebf153ad34e3497f2a8ae1e4dc6d9d38
MD5 246b0e6a16f130536538705ba4cfeace
BLAKE2b-256 d010b2ee4471053ec65795881f89929743d1c5666ac58507f34e9d7b76b4a43b

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2ccbe0196bfc27ffb26e17aae90255551c8bd880b5a6e9076f814a0c31c5f079
MD5 1b69074eeb14b6c81efced26196bf2ff
BLAKE2b-256 49efc7a80140a8c33151b9666b176049ed45e5f0d29d00b13ce99c7a4fafcf44

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d60a75254e5e47245099184b1b611772ed7a9e6b8f73830e6b77960ac66b5e90
MD5 489bdd6291b139ab6ef03863cae3f21f
BLAKE2b-256 f17dbd19d1c55a1be55f5bfe3ef02bb7ed3bffc5969eab3f01a1731ec0888ecc

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 016cd3f0d8a31667185b4ac6c617f68a35d9f2f6d37decd89f58c2f5bce1d752
MD5 5ebdb500035481011bb3017691f1c891
BLAKE2b-256 c0ad25a45f7dd9ca9ae48e062ccbf52979687d2629324ab903b59399e7d41541

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 3ca46558f2a659ebb0a3c6ea1691585b0192db45edd1e55bd0d847536b64c347
MD5 9a9f36a99063c8bf1a9b2a7d6658e356
BLAKE2b-256 f9711f8514ba2cbce5fd134c297f8ff75c535652c15dc0d385e33183031a6ae7

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 44128af6605ea04ffb59abdb3968c3419f0f6d558b0f330ca2ae0c157358415f
MD5 8c29b4f970ddbb1cc6a4e6eb97c88bc2
BLAKE2b-256 8add29f95b6f71b1cac3e5c969c412ced4811ef9dcccb1f6f04b94fd2c845a51

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a0bf1ba1570b1519d3a3aa2b57004ef6cd0259925054eb271aa5f847e7e00acb
MD5 637fc5f4a91e622ab1ab6b955b29c675
BLAKE2b-256 50e25484c8c7abd362b8de172e4597854703f74bf2b85d1866cbcd481840a7c1

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 11937f471a7681a9a033c1200e7e1014ef5071759bfa0fffce9477f0dac9c5c0
MD5 35c1307fa4524d995834a2d0aa5d72cf
BLAKE2b-256 df5ebdfe2a04e10ce828836263e70813123b1027caa7ecca3f927b795b6c223f

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2afda393ce473bde7f69945941999276172ffeaa45b6f17abdace940a1eddabf
MD5 474b0a8bf95fc7b66d53a174bec1b088
BLAKE2b-256 1cd4372725ebc51cc8e82b27cd463ea4845ae2592ed76699226f31c9aa80c840

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1f647bcfba0309a428ee87953441c275978da633458af0b0378a31fa439461ca
MD5 acd6327380d6bb3807169d9334ff3242
BLAKE2b-256 1c6d8f69bf8e2bf6dd3eb151e74acfe6362ca89454c55e5aeee44ce8d396ef80

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 6759801120de7a6610da650470e5cff428ce8e28e14444458510ee76352e0017
MD5 77d9fa0224b9564d28d5470583a5ca5f
BLAKE2b-256 7bb9eef3c19dad6cb1d203e8a5bf11572d7f8227f5700ff5a5549bfa005dd996

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ba430b30c85561511591fbafcbc9aded53c132d2096b75a2841673943ccb1cbc
MD5 c519fcb7d802dca6aa8089e615237506
BLAKE2b-256 1f9b3f3c42d54e7396fe67ab00c08638ee58a690f9155b4765caf7d7366f6578

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-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.5.post3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e31915a8a06da5ff3d9138249ad11e322df55fc608f8dfb42d06eb0d753516df
MD5 b139923a27fe96e82115eec70fd8d366
BLAKE2b-256 e68cee760c0443d4ac5cd5c64dce7edb8e7bf2438a78b1c370e2fff9d19b9b40

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 df1e807d35b6d167154d258a62ccea1e284505a2c3d6fa88cdc9902ee43c4292
MD5 a0ceb45b188cdc981f6c8e754a878191
BLAKE2b-256 d7e6abbc10c3624c139b9406d7d73d09e3490a3ca2b2e9746ba1c35a8d04d4e6

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 84ddba2b88c42473a28fded272ba9ac2d998b5d04948e081cac26bd5d25f6113
MD5 181aae545adc82b7f4095126a053f237
BLAKE2b-256 d79ae382490d17e03e6564ff89372b511ab1409a0fc6da231b0d6923ef2086cc

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9377645b3a026417aa34d05f01594a39b34c8cc1f9eccbb9e245ad9d520dd89b
MD5 9745e2820e88b05cb212afe487cd3df4
BLAKE2b-256 d4333bbeb7361d65a49a4852fc0c70a8664bf6c2cfa8b99e06162b1876c4550b

See more details on using hashes here.

File details

Details for the file copapy-0.0.5.post3-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.5.post3-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 bebee689952a8acb412c473948980d977e8cdda41f8ea8dde08fd7348682db27
MD5 75a5d296d310cdffded7612151aeaa12
BLAKE2b-256 9e514121930c1080394d22a44ddc234298506d684f5e4690de9b9fc1116db414

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