burst-link-protocol 1.0.3__tar.gz → 1.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.vscode/launch.json +1 -1
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.vscode/settings.json +2 -1
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/PKG-INFO +7 -4
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/README.md +4 -3
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/pyproject.toml +4 -2
- burst_link_protocol-1.0.4/src/burst_interface.h +56 -0
- burst_link_protocol-1.0.4/src/decoder.c +136 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/encoder.c +1 -0
- burst_link_protocol-1.0.4/test/test_burst.py +54 -0
- burst_link_protocol-1.0.4/uv.lock +366 -0
- burst_link_protocol-1.0.3/src/burst_interface.h +0 -67
- burst_link_protocol-1.0.3/src/decoder.c +0 -150
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.github/dependabot.yml +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.github/workflows/pip.yml +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.github/workflows/wheel.yml +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.gitignore +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.vscode/c_cpp_properties.json +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/.vscode/tasks.json +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/CMakeLists.txt +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/LICENSE +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/ROADMAP.md +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/docs/design.drawio +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/docs/design.svg +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/platform/zephyr/CMakeLists.txt +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/burst_link_protocol/__init__.py +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/burst_link_protocol/main.py +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/crc.c +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/crc.h +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/src/python_bindings.cpp +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/test/test_c.py +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/test/test_c_validation.py +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/test/test_python_validation.py +0 -0
- {burst_link_protocol-1.0.3 → burst_link_protocol-1.0.4}/test/test_speed.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: burst-link-protocol
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.4
|
4
4
|
Summary: Binary Utility for Reliable Stream Transfer (BURST) is a library for encoding and decoding binary data streams into and from a byte stream.
|
5
5
|
Author-Email: Floris vernieuwe <floris@vernieuwe.eu>
|
6
6
|
License-File: LICENSE
|
@@ -12,6 +12,8 @@ Requires-Dist: crc<8.0.0,>=7.1.0
|
|
12
12
|
Requires-Dist: pytest<9.0.0,>=8.3.4
|
13
13
|
Requires-Dist: pytest-cov<7.0.0,>=6.0.0
|
14
14
|
Requires-Dist: pytest-benchmark<6.0.0,>=5.1.0
|
15
|
+
Requires-Dist: scikit-build-core>=0.10.7
|
16
|
+
Requires-Dist: nanobind>=2.5.0
|
15
17
|
Provides-Extra: dev
|
16
18
|
Requires-Dist: scikit-build-core[pyproject]<0.11.0,>=0.10.7; extra == "dev"
|
17
19
|
Requires-Dist: nanobind<3.0.0,>=2.5.0; extra == "dev"
|
@@ -48,18 +50,19 @@ Note: You need a valid C++ compiler and Python 3.7+ installed on your system.
|
|
48
50
|
|
49
51
|
Basic installation
|
50
52
|
```sh
|
51
|
-
pip install -e .
|
53
|
+
uv pip install --reinstall -e .
|
52
54
|
```
|
53
55
|
|
54
56
|
Fast build
|
55
57
|
```sh
|
56
|
-
pip install --no-build-isolation -ve .
|
58
|
+
uv pip install --reinstall --no-build-isolation -ve .
|
57
59
|
```
|
58
60
|
|
59
61
|
Auto rebuild on run
|
60
62
|
```sh
|
63
|
+
uv pip install --reinstall --no-build-isolation -Ceditable.rebuild=true -ve .
|
61
64
|
pip install --no-build-isolation -Ceditable.rebuild=true -ve .
|
62
|
-
```
|
65
|
+
```
|
63
66
|
|
64
67
|
|
65
68
|
### Python Stub files generation
|
@@ -26,18 +26,19 @@ Note: You need a valid C++ compiler and Python 3.7+ installed on your system.
|
|
26
26
|
|
27
27
|
Basic installation
|
28
28
|
```sh
|
29
|
-
pip install -e .
|
29
|
+
uv pip install --reinstall -e .
|
30
30
|
```
|
31
31
|
|
32
32
|
Fast build
|
33
33
|
```sh
|
34
|
-
pip install --no-build-isolation -ve .
|
34
|
+
uv pip install --reinstall --no-build-isolation -ve .
|
35
35
|
```
|
36
36
|
|
37
37
|
Auto rebuild on run
|
38
38
|
```sh
|
39
|
+
uv pip install --reinstall --no-build-isolation -Ceditable.rebuild=true -ve .
|
39
40
|
pip install --no-build-isolation -Ceditable.rebuild=true -ve .
|
40
|
-
```
|
41
|
+
```
|
41
42
|
|
42
43
|
|
43
44
|
### Python Stub files generation
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "burst-link-protocol"
|
3
|
-
version = "1.0.
|
3
|
+
version = "1.0.4" # Choose one version reference here
|
4
4
|
description = "Binary Utility for Reliable Stream Transfer (BURST) is a library for encoding and decoding binary data streams into and from a byte stream."
|
5
5
|
requires-python = ">=3.10,<4.0"
|
6
6
|
authors = [
|
@@ -13,7 +13,9 @@ dependencies = [
|
|
13
13
|
"crc>=7.1.0,<8.0.0",
|
14
14
|
"pytest>=8.3.4,<9.0.0",
|
15
15
|
"pytest-cov>=6.0.0,<7.0.0",
|
16
|
-
"pytest-benchmark>=5.1.0,<6.0.0"
|
16
|
+
"pytest-benchmark>=5.1.0,<6.0.0",
|
17
|
+
"scikit-build-core>=0.10.7",
|
18
|
+
"nanobind>=2.5.0",
|
17
19
|
]
|
18
20
|
license-files = ["LICENSE"]
|
19
21
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#ifndef BURST_INTERFACE_H
|
2
|
+
#define BURST_INTERFACE_H
|
3
|
+
|
4
|
+
#include <stdbool.h>
|
5
|
+
#include <stddef.h>
|
6
|
+
#include <stdint.h>
|
7
|
+
|
8
|
+
#define COBS_DELIMITER 0x00
|
9
|
+
#define COBS_MAX_CODE 0xFF
|
10
|
+
|
11
|
+
// Status codes returned by the encoder.
|
12
|
+
typedef enum { BURST_DATA_CONSUMED, BURST_PACKET_READY, BURST_OVERFLOW_ERROR, BURST_ENCODE_ERROR, BURST_CRC_ERROR, BURST_DECODE_ERROR } burst_status_t;
|
13
|
+
|
14
|
+
typedef struct {
|
15
|
+
uint8_t *data;
|
16
|
+
size_t size;
|
17
|
+
} burst_packet_t;
|
18
|
+
|
19
|
+
typedef struct {
|
20
|
+
uint8_t *buffer; // Output buffer for encoded packets.
|
21
|
+
size_t buffer_size; // Total size of the output buffer.
|
22
|
+
size_t out_head; // Current offset (number of bytes written).
|
23
|
+
} burst_encoder_t;
|
24
|
+
|
25
|
+
typedef struct {
|
26
|
+
uint8_t *buffer; // Output buffer for decoded data.
|
27
|
+
size_t buffer_size; // Size of the output buffer.
|
28
|
+
size_t out_head; // Current count of decoded bytes stored.
|
29
|
+
|
30
|
+
// uint8_t remaining_bytes; // Current block’s code byte; 0 indicates a new block is
|
31
|
+
// expected.
|
32
|
+
// uint8_t bytes_remaining; // Number of data bytes left to copy for the current
|
33
|
+
// block.
|
34
|
+
// bool pending_zero; // true if a zero should be inserted before starting the
|
35
|
+
// next block.
|
36
|
+
|
37
|
+
enum cobs_decode_inc_state { COBS_DECODE_READ_CODE, COBS_DECODE_RUN, COBS_DECODE_FINISH_RUN } state;
|
38
|
+
uint8_t block, code;
|
39
|
+
|
40
|
+
bool finished; // true if the packet is complete and available in the buffer
|
41
|
+
} burst_decoder_t;
|
42
|
+
|
43
|
+
// Encoder
|
44
|
+
void burst_encoder_init(burst_encoder_t *ctx, uint8_t *buffer, size_t size);
|
45
|
+
burst_status_t burst_encoder_add_packet(burst_encoder_t *ctx, const uint8_t *data, size_t size);
|
46
|
+
burst_packet_t burst_encoder_flush(burst_encoder_t *ctx);
|
47
|
+
|
48
|
+
// Decoder
|
49
|
+
void burst_decoder_init(burst_decoder_t *ctx, uint8_t *buffer, size_t size);
|
50
|
+
burst_status_t bust_decoder_add_data(burst_decoder_t *ctx, const uint8_t *data, size_t size, size_t *consumed_bytes);
|
51
|
+
void burst_decoder_reset(burst_decoder_t *ctx);
|
52
|
+
burst_status_t burst_decoder_add_byte(burst_decoder_t *ctx, uint8_t byte);
|
53
|
+
|
54
|
+
burst_packet_t burst_decoder_get_packet(burst_decoder_t *ctx);
|
55
|
+
|
56
|
+
#endif // ENCODER_H
|
@@ -0,0 +1,136 @@
|
|
1
|
+
#include <stdbool.h>
|
2
|
+
#include <stddef.h>
|
3
|
+
#include <stdint.h>
|
4
|
+
#include <stdio.h>
|
5
|
+
|
6
|
+
#include "burst_interface.h"
|
7
|
+
#include "crc.h"
|
8
|
+
|
9
|
+
void burst_decoder_init(burst_decoder_t *ctx, uint8_t *buffer, size_t size) {
|
10
|
+
ctx->buffer = buffer;
|
11
|
+
ctx->buffer_size = size;
|
12
|
+
burst_decoder_reset(ctx);
|
13
|
+
}
|
14
|
+
|
15
|
+
burst_status_t bust_decoder_add_data(burst_decoder_t *ctx, const uint8_t *data, size_t size, size_t *consumed_bytes) {
|
16
|
+
// If the decoder was finished, reset it.
|
17
|
+
if (ctx->finished) {
|
18
|
+
burst_decoder_reset(ctx);
|
19
|
+
}
|
20
|
+
|
21
|
+
for (size_t i = 0; i < size; i++) {
|
22
|
+
uint8_t byte = data[i];
|
23
|
+
(*consumed_bytes)++;
|
24
|
+
|
25
|
+
burst_status_t result = burst_decoder_add_byte(ctx, byte);
|
26
|
+
|
27
|
+
if (result != BURST_DATA_CONSUMED) {
|
28
|
+
ctx->finished = true;
|
29
|
+
return result;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
return BURST_DATA_CONSUMED;
|
33
|
+
}
|
34
|
+
|
35
|
+
void burst_decoder_reset(burst_decoder_t *ctx) {
|
36
|
+
ctx->out_head = 0;
|
37
|
+
ctx->state = COBS_DECODE_READ_CODE;
|
38
|
+
ctx->block = 0;
|
39
|
+
ctx->code = 0xFF;
|
40
|
+
ctx->finished = false;
|
41
|
+
}
|
42
|
+
|
43
|
+
burst_status_t burst_decoder_complete_packet(burst_decoder_t *ctx) {
|
44
|
+
#if 0
|
45
|
+
printf("Completed packet: ");
|
46
|
+
for (size_t i = 0; i < ctx->out_head; i++) {
|
47
|
+
printf("%02X ", ctx->buffer[i]);
|
48
|
+
}
|
49
|
+
printf("\n");
|
50
|
+
#endif
|
51
|
+
// Ensure we have at least two bytes for the CRC.
|
52
|
+
if (ctx->out_head < CRC_SIZE) {
|
53
|
+
return BURST_CRC_ERROR;
|
54
|
+
}
|
55
|
+
|
56
|
+
// Calculate the CRC over the packet data excluding the last two CRC bytes.
|
57
|
+
uint16_t computed_crc = crc16_ccitt(ctx->buffer, ctx->out_head - CRC_SIZE);
|
58
|
+
|
59
|
+
// Extract the received CRC from the last two bytes (big-endian).
|
60
|
+
uint16_t received_crc = ((uint16_t)ctx->buffer[ctx->out_head - CRC_SIZE] << 8) | ctx->buffer[ctx->out_head - 1];
|
61
|
+
|
62
|
+
// Check if the CRCs match.
|
63
|
+
if (computed_crc != received_crc) {
|
64
|
+
return BURST_CRC_ERROR;
|
65
|
+
}
|
66
|
+
|
67
|
+
// CRC check passed, we can remove it from the packet.
|
68
|
+
ctx->out_head -= CRC_SIZE;
|
69
|
+
return BURST_PACKET_READY;
|
70
|
+
}
|
71
|
+
|
72
|
+
burst_status_t burst_decoder_add_byte(burst_decoder_t *ctx, uint8_t byte) {
|
73
|
+
// Check for space in the buffer
|
74
|
+
if (ctx->out_head >= ctx->buffer_size) {
|
75
|
+
return BURST_OVERFLOW_ERROR;
|
76
|
+
}
|
77
|
+
|
78
|
+
switch (ctx->state) {
|
79
|
+
case COBS_DECODE_FINISH_RUN:
|
80
|
+
// If the byte is zero, the block is complete
|
81
|
+
if (byte == 0) {
|
82
|
+
return burst_decoder_complete_packet(ctx);
|
83
|
+
}
|
84
|
+
|
85
|
+
case COBS_DECODE_READ_CODE:
|
86
|
+
|
87
|
+
// If last code was 0xF, its a overhead byte
|
88
|
+
if (ctx->code != 0xFF) {
|
89
|
+
ctx->buffer[ctx->out_head++] = 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
// The data is a new block code
|
93
|
+
ctx->block = ctx->code = byte;
|
94
|
+
|
95
|
+
// If the code is 1, the block is already complete
|
96
|
+
if (byte != 1) {
|
97
|
+
ctx->state = COBS_DECODE_RUN;
|
98
|
+
} else {
|
99
|
+
ctx->state = COBS_DECODE_FINISH_RUN;
|
100
|
+
}
|
101
|
+
|
102
|
+
return BURST_DATA_CONSUMED;
|
103
|
+
|
104
|
+
case COBS_DECODE_RUN:
|
105
|
+
|
106
|
+
// Decrement the block counter
|
107
|
+
ctx->block--;
|
108
|
+
|
109
|
+
// If we het a unexpected delimiter, return an error
|
110
|
+
if (!byte) {
|
111
|
+
return BURST_DECODE_ERROR;
|
112
|
+
}
|
113
|
+
|
114
|
+
ctx->buffer[ctx->out_head++] = byte;
|
115
|
+
|
116
|
+
if (ctx->block == 1) {
|
117
|
+
ctx->state = COBS_DECODE_FINISH_RUN;
|
118
|
+
}
|
119
|
+
|
120
|
+
return BURST_DATA_CONSUMED;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
burst_packet_t burst_decoder_get_packet(burst_decoder_t *ctx) {
|
125
|
+
if (!ctx->finished) {
|
126
|
+
burst_packet_t packet;
|
127
|
+
packet.data = NULL;
|
128
|
+
packet.size = 0;
|
129
|
+
return packet;
|
130
|
+
}
|
131
|
+
|
132
|
+
burst_packet_t packet;
|
133
|
+
packet.data = ctx->buffer;
|
134
|
+
packet.size = ctx->out_head;
|
135
|
+
return packet;
|
136
|
+
}
|
@@ -12,6 +12,7 @@ burst_status_t burst_encoder_add_packet(burst_encoder_t *ctx, const uint8_t *dat
|
|
12
12
|
{
|
13
13
|
// Compute the CRC over the raw packet data.
|
14
14
|
uint16_t crc = crc16_ccitt(data, size);
|
15
|
+
|
15
16
|
uint8_t crc_high = (crc >> 8) & 0xFF;
|
16
17
|
uint8_t crc_low = crc & 0xFF;
|
17
18
|
// The total number of bytes to encode: raw data + 2 bytes of CRC.
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from burst_link_protocol import BurstInterfaceC, BurstInterfacePy
|
2
|
+
|
3
|
+
payloads = [
|
4
|
+
("00"),
|
5
|
+
("01 01 01 00 00 00 00 00 00 00 00"),
|
6
|
+
("00 00 00 00 00 00 00 00 00 00 00"),
|
7
|
+
("00 00 00 00 00 00 00 00 00 00 00"),
|
8
|
+
("00 00 00 00 00 00 00 00 00 00 00"),
|
9
|
+
("00 00 00 00 00 00 00 00 00 00 00"),
|
10
|
+
("0A 0F 0A 0B 08 80 80 88 50 12 04 26 00 00 00 10 00"),
|
11
|
+
("01"),
|
12
|
+
("FF"),
|
13
|
+
("00" * 200),
|
14
|
+
("00" * 300),
|
15
|
+
("AA" * 200),
|
16
|
+
("AA" * 500),
|
17
|
+
("AA" * 600),
|
18
|
+
]
|
19
|
+
|
20
|
+
|
21
|
+
def test_multi_payload():
|
22
|
+
c_interface = BurstInterfaceC()
|
23
|
+
py_interface = BurstInterfacePy()
|
24
|
+
# payload = bytes.fromhex("0A 0F 0A 0B 08 80 80 88 50 12 04 26 00 00 00 10 00")
|
25
|
+
for payload in payloads:
|
26
|
+
payload = bytes.fromhex(payload.replace(" ", ""))
|
27
|
+
|
28
|
+
if len(payload) < 20:
|
29
|
+
print(f"Testing payload: {payload.hex()}")
|
30
|
+
else:
|
31
|
+
print(f"Testing payload: {payload[:20].hex()}... {len(payload)} bytes")
|
32
|
+
|
33
|
+
c_payload = c_interface.encode([payload])
|
34
|
+
py_payload = py_interface.encode([payload])
|
35
|
+
|
36
|
+
assert c_payload == py_payload, f"Expected {py_payload}, got {c_payload}"
|
37
|
+
|
38
|
+
py_decoded_packet = py_interface.decode(c_payload)
|
39
|
+
c_decoded_packet = c_interface.decode(py_payload, fail_on_crc_error=True)
|
40
|
+
|
41
|
+
assert len(c_decoded_packet) == 1, (
|
42
|
+
f"Expected 1 packet, got {len(c_decoded_packet)}"
|
43
|
+
)
|
44
|
+
assert len(py_decoded_packet) == 1, (
|
45
|
+
f"Expected 1 packet, got {len(py_decoded_packet)}"
|
46
|
+
)
|
47
|
+
|
48
|
+
assert py_decoded_packet[0] == c_decoded_packet[0], (
|
49
|
+
f"Expected {py_decoded_packet}, got {c_decoded_packet}"
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
if __name__ == "__main__":
|
54
|
+
test_multi_payload()
|
@@ -0,0 +1,366 @@
|
|
1
|
+
version = 1
|
2
|
+
revision = 1
|
3
|
+
requires-python = ">=3.10, <4.0"
|
4
|
+
|
5
|
+
[[package]]
|
6
|
+
name = "burst-link-protocol"
|
7
|
+
version = "1.0.3"
|
8
|
+
source = { editable = "." }
|
9
|
+
dependencies = [
|
10
|
+
{ name = "cobs" },
|
11
|
+
{ name = "crc" },
|
12
|
+
{ name = "nanobind" },
|
13
|
+
{ name = "numpy" },
|
14
|
+
{ name = "pytest" },
|
15
|
+
{ name = "pytest-benchmark" },
|
16
|
+
{ name = "pytest-cov" },
|
17
|
+
{ name = "scikit-build-core" },
|
18
|
+
]
|
19
|
+
|
20
|
+
[package.optional-dependencies]
|
21
|
+
dev = [
|
22
|
+
{ name = "nanobind" },
|
23
|
+
{ name = "pytest" },
|
24
|
+
{ name = "pytest-benchmark" },
|
25
|
+
{ name = "pytest-cov" },
|
26
|
+
{ name = "scikit-build-core" },
|
27
|
+
]
|
28
|
+
|
29
|
+
[package.metadata]
|
30
|
+
requires-dist = [
|
31
|
+
{ name = "cobs", specifier = ">=1.2.1,<2.0.0" },
|
32
|
+
{ name = "crc", specifier = ">=7.1.0,<8.0.0" },
|
33
|
+
{ name = "nanobind", specifier = ">=2.5.0" },
|
34
|
+
{ name = "nanobind", marker = "extra == 'dev'", specifier = ">=2.5.0,<3.0.0" },
|
35
|
+
{ name = "numpy", specifier = ">=2.2.3,<3.0.0" },
|
36
|
+
{ name = "pytest", specifier = ">=8.3.4,<9.0.0" },
|
37
|
+
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.4,<9.0.0" },
|
38
|
+
{ name = "pytest-benchmark", specifier = ">=5.1.0,<6.0.0" },
|
39
|
+
{ name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=5.1.0,<6.0.0" },
|
40
|
+
{ name = "pytest-cov", specifier = ">=6.0.0,<7.0.0" },
|
41
|
+
{ name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0,<7.0.0" },
|
42
|
+
{ name = "scikit-build-core", specifier = ">=0.10.7" },
|
43
|
+
{ name = "scikit-build-core", extras = ["pyproject"], marker = "extra == 'dev'", specifier = ">=0.10.7,<0.11.0" },
|
44
|
+
]
|
45
|
+
provides-extras = ["dev"]
|
46
|
+
|
47
|
+
[[package]]
|
48
|
+
name = "cobs"
|
49
|
+
version = "1.2.1"
|
50
|
+
source = { registry = "https://pypi.org/simple" }
|
51
|
+
sdist = { url = "https://files.pythonhosted.org/packages/87/dd/cb6aa7465da843cc1633e2ee05ef86a8df63fd95e741dfcb98ed8f477cb8/cobs-1.2.1.tar.gz", hash = "sha256:2af7f8791cde1ae7c6b936f5d0c35fe29feb10de25f79c15b0af0d6729783cc0", size = 14585 }
|
52
|
+
wheels = [
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/8c/65/8093d2e94329ac5188fb8ec8b1f542845aa45f6790af6ffb03fcceab8122/cobs-1.2.1-cp310-cp310-win32.whl", hash = "sha256:54f8ea75af41ef17a6aa74089f15060c3413409322fbdd1263e028a91a87bdf0", size = 25844 },
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/c8/1d/63dcb8d84710bdea06ff95784fc953ee77150500f516f65faaca83845d98/cobs-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:e4107c15eefa5f3ce15e5fa3f7fd6d3aa81be839140f35943fb42b8d86e5125e", size = 27314 },
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/5f/05/f16754772d8694b1eb6b8259ae2cf2aa948dab138412f95940d631a19ef1/cobs-1.2.1-cp311-cp311-win32.whl", hash = "sha256:f6ab84b1c975e144a83e11c454066e282374e776a1a79eedd06d0151297ae2f3", size = 25847 },
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/61/67/86c4da6307db186d1658434e69c4d28f210a6f95386e92a94e03b46d52f2/cobs-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:046933f36200f4163abd938adcb1500c1a7a394955ce20c9e3ebb79e78eabfdf", size = 27316 },
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/fc/f5/933e2ba7a7a72981ed49f1c64150e98ac428d9447686e1c77a912c74cf8b/cobs-1.2.1-cp312-cp312-win32.whl", hash = "sha256:141107fb3b764772f6db6a52af8158457e00e499f75e3794cb67ea11444839c5", size = 25898 },
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/70/f3/fec37bcd8f4e5318efc7dd3174ac48609343ce99deaad0b463ca7d02ffec/cobs-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb02967314f0db41bf04bc475e4963c079912884586003c8290d82cd0f07d621", size = 27328 },
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/88/a9/1dfcca55fb46105cdd6b234cb82bef778fe47614343fdf21c3f26cccd926/cobs-1.2.1-cp313-cp313-win32.whl", hash = "sha256:5857c85de70f244648d2a5ee1f28e2aa9313752ebd44c8089343c086dd184a77", size = 26357 },
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/a6/b5/c8103c7bd95e911c8b94609a065e47a1e64bd0cf13d3908409acd199489b/cobs-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:3431da8248d91c241ad98ceb08df00824574421132e42359cd31080a1e13bf24", size = 27736 },
|
61
|
+
]
|
62
|
+
|
63
|
+
[[package]]
|
64
|
+
name = "colorama"
|
65
|
+
version = "0.4.6"
|
66
|
+
source = { registry = "https://pypi.org/simple" }
|
67
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
|
68
|
+
wheels = [
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
70
|
+
]
|
71
|
+
|
72
|
+
[[package]]
|
73
|
+
name = "coverage"
|
74
|
+
version = "7.7.1"
|
75
|
+
source = { registry = "https://pypi.org/simple" }
|
76
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6b/bf/3effb7453498de9c14a81ca21e1f92e6723ce7ebdc5402ae30e4dcc490ac/coverage-7.7.1.tar.gz", hash = "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393", size = 810332 }
|
77
|
+
wheels = [
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/66/b3/b3d86d8e534747e817f63bbb0ebf696fd44f37ae07e52dd0cc74c95a0542/coverage-7.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe", size = 210948 },
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/12/1d/844f3bf5b7bced37acbae50f463788f4d7c5977a27563214d89ebfe90941/coverage-7.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0", size = 211385 },
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/d4/b5/0866a89d0818d471437d73b66a3aff73890a09246a97b7dc273189fffa75/coverage-7.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb", size = 240510 },
|
81
|
+
{ url = "https://files.pythonhosted.org/packages/14/d0/7a1f41d04081a8e0b95e6db2f9a598c94b3dfe60c5e8b2ffb3ac74347420/coverage-7.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6", size = 238420 },
|
82
|
+
{ url = "https://files.pythonhosted.org/packages/72/4e/aa470597ceaee2ab0ec973ee2760f177a728144d1dca3c866a35a04b3798/coverage-7.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602", size = 239557 },
|
83
|
+
{ url = "https://files.pythonhosted.org/packages/49/7b/0267bd6465dbfe97f55de1f57f1bd54c7b2ed796a0db68ac6ea6f39c51b4/coverage-7.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542", size = 239466 },
|
84
|
+
{ url = "https://files.pythonhosted.org/packages/65/e3/898fe437b7bc37f70b3742010cc0faf2f00c5abbe79961c54c6c5cda903c/coverage-7.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3", size = 238184 },
|
85
|
+
{ url = "https://files.pythonhosted.org/packages/cf/92/84ea2e213b7ac09ea4f04038863775a080aec06812d39da8c21ce612af2b/coverage-7.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab", size = 238479 },
|
86
|
+
{ url = "https://files.pythonhosted.org/packages/70/d4/1acf676058541b00cf7b64a8422cf871cebd4c718e067db18d84018a4e0b/coverage-7.7.1-cp310-cp310-win32.whl", hash = "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917", size = 213521 },
|
87
|
+
{ url = "https://files.pythonhosted.org/packages/ba/36/9a490e442961d3af01c420498c078fa2ac1abf4a248c80b0ac7199f31f98/coverage-7.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81", size = 214418 },
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/c2/4c/5118ca60ed4141ec940c8cbaf1b2ebe8911be0f03bfc028c99f63de82c44/coverage-7.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd", size = 211064 },
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/e8/6c/0e9aac4cf5dba49feede79109fdfd2fafca3bdbc02992bcf9b25d58351dd/coverage-7.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48", size = 211501 },
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/23/1a/570666f276815722f0a94f92b61e7123d66b166238e0f9f224f1a38f17cf/coverage-7.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9", size = 244128 },
|
91
|
+
{ url = "https://files.pythonhosted.org/packages/e8/0d/cb23f89eb8c7018429c6cf8cc436b4eb917f43e81354d99c86c435ab1813/coverage-7.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae", size = 241818 },
|
92
|
+
{ url = "https://files.pythonhosted.org/packages/54/fd/584a5d099bba4e79ac3893d57e0bd53034f7187c30f940e6a581bfd38c8f/coverage-7.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133", size = 243602 },
|
93
|
+
{ url = "https://files.pythonhosted.org/packages/78/d7/a28b6a5ee64ff1e4a66fbd8cd7b9372471c951c3a0c4ec9d1d0f47819f53/coverage-7.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a", size = 243247 },
|
94
|
+
{ url = "https://files.pythonhosted.org/packages/b2/9e/210814fae81ea7796f166529a32b443dead622a8c1ad315d0779520635c6/coverage-7.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b", size = 241422 },
|
95
|
+
{ url = "https://files.pythonhosted.org/packages/99/5e/80ed1955fa8529bdb72dc11c0a3f02a838285250c0e14952e39844993102/coverage-7.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2", size = 241958 },
|
96
|
+
{ url = "https://files.pythonhosted.org/packages/7e/26/f0bafc8103284febc4e3a3cd947b49ff36c50711daf3d03b3e11b23bc73a/coverage-7.7.1-cp311-cp311-win32.whl", hash = "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282", size = 213571 },
|
97
|
+
{ url = "https://files.pythonhosted.org/packages/c1/fe/fef0a0201af72422fb9634b5c6079786bb405ac09cce5661fdd54a66e773/coverage-7.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e", size = 214488 },
|
98
|
+
{ url = "https://files.pythonhosted.org/packages/cf/b0/4eaba302a86ec3528231d7cfc954ae1929ec5d42b032eb6f5b5f5a9155d2/coverage-7.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d", size = 211253 },
|
99
|
+
{ url = "https://files.pythonhosted.org/packages/fd/68/21b973e6780a3f2457e31ede1aca6c2f84bda4359457b40da3ae805dcf30/coverage-7.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f", size = 211504 },
|
100
|
+
{ url = "https://files.pythonhosted.org/packages/d1/b4/c19e9c565407664390254252496292f1e3076c31c5c01701ffacc060e745/coverage-7.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1", size = 245566 },
|
101
|
+
{ url = "https://files.pythonhosted.org/packages/7b/0e/f9829cdd25e5083638559c8c267ff0577c6bab19dacb1a4fcfc1e70e41c0/coverage-7.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0", size = 242455 },
|
102
|
+
{ url = "https://files.pythonhosted.org/packages/29/57/a3ada2e50a665bf6d9851b5eb3a9a07d7e38f970bdd4d39895f311331d56/coverage-7.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2", size = 244713 },
|
103
|
+
{ url = "https://files.pythonhosted.org/packages/0f/d3/f15c7d45682a73eca0611427896016bad4c8f635b0fc13aae13a01f8ed9d/coverage-7.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af", size = 244476 },
|
104
|
+
{ url = "https://files.pythonhosted.org/packages/19/3b/64540074e256082b220e8810fd72543eff03286c59dc91976281dc0a559c/coverage-7.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59", size = 242695 },
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/8a/c1/9cad25372ead7f9395a91bb42d8ae63e6cefe7408eb79fd38797e2b763eb/coverage-7.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2", size = 243888 },
|
106
|
+
{ url = "https://files.pythonhosted.org/packages/66/c6/c3e6c895bc5b95ccfe4cb5838669dbe5226ee4ad10604c46b778c304d6f9/coverage-7.7.1-cp312-cp312-win32.whl", hash = "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8", size = 213744 },
|
107
|
+
{ url = "https://files.pythonhosted.org/packages/cc/8a/6df2fcb4c3e38ec6cd7e211ca8391405ada4e3b1295695d00aa07c6ee736/coverage-7.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04", size = 214546 },
|
108
|
+
{ url = "https://files.pythonhosted.org/packages/ec/2a/1a254eaadb01c163b29d6ce742aa380fc5cfe74a82138ce6eb944c42effa/coverage-7.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585", size = 211277 },
|
109
|
+
{ url = "https://files.pythonhosted.org/packages/cf/00/9636028365efd4eb6db71cdd01d99e59f25cf0d47a59943dbee32dd1573b/coverage-7.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c", size = 211551 },
|
110
|
+
{ url = "https://files.pythonhosted.org/packages/6f/c8/14aed97f80363f055b6cd91e62986492d9fe3b55e06b4b5c82627ae18744/coverage-7.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019", size = 245068 },
|
111
|
+
{ url = "https://files.pythonhosted.org/packages/d6/76/9c5fe3f900e01d7995b0cda08fc8bf9773b4b1be58bdd626f319c7d4ec11/coverage-7.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf", size = 242109 },
|
112
|
+
{ url = "https://files.pythonhosted.org/packages/c0/81/760993bb536fb674d3a059f718145dcd409ed6d00ae4e3cbf380019fdfd0/coverage-7.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b", size = 244129 },
|
113
|
+
{ url = "https://files.pythonhosted.org/packages/00/be/1114a19f93eae0b6cd955dabb5bee80397bd420d846e63cd0ebffc134e3d/coverage-7.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f", size = 244201 },
|
114
|
+
{ url = "https://files.pythonhosted.org/packages/06/8d/9128fd283c660474c7dc2b1ea5c66761bc776b970c1724989ed70e9d6eee/coverage-7.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777", size = 242282 },
|
115
|
+
{ url = "https://files.pythonhosted.org/packages/d4/2a/6d7dbfe9c1f82e2cdc28d48f4a0c93190cf58f057fa91ba2391b92437fe6/coverage-7.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a", size = 243570 },
|
116
|
+
{ url = "https://files.pythonhosted.org/packages/cf/3e/29f1e4ce3bb951bcf74b2037a82d94c5064b3334304a3809a95805628838/coverage-7.7.1-cp313-cp313-win32.whl", hash = "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a", size = 213772 },
|
117
|
+
{ url = "https://files.pythonhosted.org/packages/bc/3a/cf029bf34aefd22ad34f0e808eba8d5830f297a1acb483a2124f097ff769/coverage-7.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1", size = 214575 },
|
118
|
+
{ url = "https://files.pythonhosted.org/packages/92/4c/fb8b35f186a2519126209dce91ab8644c9a901cf04f8dfa65576ca2dd9e8/coverage-7.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511", size = 212113 },
|
119
|
+
{ url = "https://files.pythonhosted.org/packages/59/90/e834ffc86fd811c5b570a64ee1895b20404a247ec18a896b9ba543b12097/coverage-7.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24", size = 212333 },
|
120
|
+
{ url = "https://files.pythonhosted.org/packages/a5/a1/27f0ad39569b3b02410b881c42e58ab403df13fcd465b475db514b83d3d3/coverage-7.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950", size = 256566 },
|
121
|
+
{ url = "https://files.pythonhosted.org/packages/9f/3b/21fa66a1db1b90a0633e771a32754f7c02d60236a251afb1b86d7e15d83a/coverage-7.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d", size = 252276 },
|
122
|
+
{ url = "https://files.pythonhosted.org/packages/d6/e5/4ab83a59b0f8ac4f0029018559fc4c7d042e1b4552a722e2bfb04f652296/coverage-7.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e", size = 254616 },
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/db/7a/4224417c0ccdb16a5ba4d8d1fcfaa18439be1624c29435bb9bc88ccabdfb/coverage-7.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862", size = 255707 },
|
124
|
+
{ url = "https://files.pythonhosted.org/packages/51/20/ff18a329ccaa3d035e2134ecf3a2e92a52d3be6704c76e74ca5589ece260/coverage-7.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271", size = 253876 },
|
125
|
+
{ url = "https://files.pythonhosted.org/packages/e4/e8/1d6f1a6651672c64f45ffad05306dad9c4c189bec694270822508049b2cb/coverage-7.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de", size = 254687 },
|
126
|
+
{ url = "https://files.pythonhosted.org/packages/6b/ea/1b9a14cf3e2bc3fd9de23a336a8082091711c5f480b500782d59e84a8fe5/coverage-7.7.1-cp313-cp313t-win32.whl", hash = "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c", size = 214486 },
|
127
|
+
{ url = "https://files.pythonhosted.org/packages/cc/bb/faa6bcf769cb7b3b660532a30d77c440289b40636c7f80e498b961295d07/coverage-7.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c", size = 215647 },
|
128
|
+
{ url = "https://files.pythonhosted.org/packages/f9/4e/a501ec475ed455c1ee1570063527afe2c06ab1039f8ff18eefecfbdac8fd/coverage-7.7.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1", size = 203014 },
|
129
|
+
{ url = "https://files.pythonhosted.org/packages/52/26/9f53293ff4cc1d47d98367ce045ca2e62746d6be74a5c6851a474eabf59b/coverage-7.7.1-py3-none-any.whl", hash = "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31", size = 203006 },
|
130
|
+
]
|
131
|
+
|
132
|
+
[package.optional-dependencies]
|
133
|
+
toml = [
|
134
|
+
{ name = "tomli", marker = "python_full_version <= '3.11'" },
|
135
|
+
]
|
136
|
+
|
137
|
+
[[package]]
|
138
|
+
name = "crc"
|
139
|
+
version = "7.1.0"
|
140
|
+
source = { registry = "https://pypi.org/simple" }
|
141
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7e/e6/c3488c35ecae290751466252e5ea01ef50fc67bfc1a9aba43983329b7025/crc-7.1.0.tar.gz", hash = "sha256:99dd540909a37ae4f62c65441df8ecb4e7f9af014fecaf4f331052a41d66c07d", size = 9888 }
|
142
|
+
wheels = [
|
143
|
+
{ url = "https://files.pythonhosted.org/packages/df/ff/5ebeae9b53e8cddd9e6f3b6b0c98da3f112d9a7e1ea638a00876aa8fb5b4/crc-7.1.0-py3-none-any.whl", hash = "sha256:b9845c81d0b900d8fda1aae7af977035bee0359c279713814e9fd23a2d59db6a", size = 8790 },
|
144
|
+
]
|
145
|
+
|
146
|
+
[[package]]
|
147
|
+
name = "exceptiongroup"
|
148
|
+
version = "1.2.2"
|
149
|
+
source = { registry = "https://pypi.org/simple" }
|
150
|
+
sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
|
151
|
+
wheels = [
|
152
|
+
{ url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
|
153
|
+
]
|
154
|
+
|
155
|
+
[[package]]
|
156
|
+
name = "iniconfig"
|
157
|
+
version = "2.1.0"
|
158
|
+
source = { registry = "https://pypi.org/simple" }
|
159
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 }
|
160
|
+
wheels = [
|
161
|
+
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 },
|
162
|
+
]
|
163
|
+
|
164
|
+
[[package]]
|
165
|
+
name = "nanobind"
|
166
|
+
version = "2.5.0"
|
167
|
+
source = { registry = "https://pypi.org/simple" }
|
168
|
+
sdist = { url = "https://files.pythonhosted.org/packages/20/fa/8e5930837f9b08202c4e566cf529480b0c3266e88f39723388baf8c69700/nanobind-2.5.0.tar.gz", hash = "sha256:cc8412e94acffa20a369191382bcdbb6fbfb302e475e87cacff9516d51023a15", size = 962802 }
|
169
|
+
wheels = [
|
170
|
+
{ url = "https://files.pythonhosted.org/packages/8e/9e/dadc3831f40e22c1b3925f07894646ada7906ef5b48db5c5eb2b03ca9faa/nanobind-2.5.0-py3-none-any.whl", hash = "sha256:e1e5c816e5d10f0b252d82ba7f769f0f6679f5e043cf406aec3d9e184bf2a60d", size = 236912 },
|
171
|
+
]
|
172
|
+
|
173
|
+
[[package]]
|
174
|
+
name = "numpy"
|
175
|
+
version = "2.2.4"
|
176
|
+
source = { registry = "https://pypi.org/simple" }
|
177
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 }
|
178
|
+
wheels = [
|
179
|
+
{ url = "https://files.pythonhosted.org/packages/04/89/a79e86e5c1433926ed7d60cb267fb64aa578b6101ab645800fd43b4801de/numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", size = 21250661 },
|
180
|
+
{ url = "https://files.pythonhosted.org/packages/79/c2/f50921beb8afd60ed9589ad880332cfefdb805422210d327fb48f12b7a81/numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", size = 14389926 },
|
181
|
+
{ url = "https://files.pythonhosted.org/packages/c7/b9/2c4e96130b0b0f97b0ef4a06d6dae3b39d058b21a5e2fa2decd7fd6b1c8f/numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", size = 5428329 },
|
182
|
+
{ url = "https://files.pythonhosted.org/packages/7f/a5/3d7094aa898f4fc5c84cdfb26beeae780352d43f5d8bdec966c4393d644c/numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", size = 6963559 },
|
183
|
+
{ url = "https://files.pythonhosted.org/packages/4c/22/fb1be710a14434c09080dd4a0acc08939f612ec02efcb04b9e210474782d/numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", size = 14368066 },
|
184
|
+
{ url = "https://files.pythonhosted.org/packages/c2/07/2e5cc71193e3ef3a219ffcf6ca4858e46ea2be09c026ddd480d596b32867/numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", size = 16417040 },
|
185
|
+
{ url = "https://files.pythonhosted.org/packages/1a/97/3b1537776ad9a6d1a41813818343745e8dd928a2916d4c9edcd9a8af1dac/numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", size = 15879862 },
|
186
|
+
{ url = "https://files.pythonhosted.org/packages/b0/b7/4472f603dd45ef36ff3d8e84e84fe02d9467c78f92cc121633dce6da307b/numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", size = 18206032 },
|
187
|
+
{ url = "https://files.pythonhosted.org/packages/0d/bd/6a092963fb82e6c5aa0d0440635827bbb2910da229545473bbb58c537ed3/numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", size = 6608517 },
|
188
|
+
{ url = "https://files.pythonhosted.org/packages/01/e3/cb04627bc2a1638948bc13e818df26495aa18e20d5be1ed95ab2b10b6847/numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", size = 12943498 },
|
189
|
+
{ url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 },
|
190
|
+
{ url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 },
|
191
|
+
{ url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 },
|
192
|
+
{ url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 },
|
193
|
+
{ url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 },
|
194
|
+
{ url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 },
|
195
|
+
{ url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 },
|
196
|
+
{ url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 },
|
197
|
+
{ url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 },
|
198
|
+
{ url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 },
|
199
|
+
{ url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 },
|
200
|
+
{ url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 },
|
201
|
+
{ url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 },
|
202
|
+
{ url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 },
|
203
|
+
{ url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 },
|
204
|
+
{ url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 },
|
205
|
+
{ url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 },
|
206
|
+
{ url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 },
|
207
|
+
{ url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 },
|
208
|
+
{ url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 },
|
209
|
+
{ url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 },
|
210
|
+
{ url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 },
|
211
|
+
{ url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 },
|
212
|
+
{ url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 },
|
213
|
+
{ url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 },
|
214
|
+
{ url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 },
|
215
|
+
{ url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 },
|
216
|
+
{ url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 },
|
217
|
+
{ url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 },
|
218
|
+
{ url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 },
|
219
|
+
{ url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 },
|
220
|
+
{ url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 },
|
221
|
+
{ url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 },
|
222
|
+
{ url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 },
|
223
|
+
{ url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 },
|
224
|
+
{ url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 },
|
225
|
+
{ url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 },
|
226
|
+
{ url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 },
|
227
|
+
{ url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 },
|
228
|
+
{ url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 },
|
229
|
+
{ url = "https://files.pythonhosted.org/packages/b2/5c/f09c33a511aff41a098e6ef3498465d95f6360621034a3d95f47edbc9119/numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", size = 21081956 },
|
230
|
+
{ url = "https://files.pythonhosted.org/packages/ba/30/74c48b3b6494c4b820b7fa1781d441e94d87a08daa5b35d222f06ba41a6f/numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", size = 6827143 },
|
231
|
+
{ url = "https://files.pythonhosted.org/packages/54/f5/ab0d2f48b490535c7a80e05da4a98902b632369efc04f0e47bb31ca97d8f/numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", size = 16233350 },
|
232
|
+
{ url = "https://files.pythonhosted.org/packages/3b/3a/2f6d8c1f8e45d496bca6baaec93208035faeb40d5735c25afac092ec9a12/numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", size = 12857565 },
|
233
|
+
]
|
234
|
+
|
235
|
+
[[package]]
|
236
|
+
name = "packaging"
|
237
|
+
version = "24.2"
|
238
|
+
source = { registry = "https://pypi.org/simple" }
|
239
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
|
240
|
+
wheels = [
|
241
|
+
{ url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
|
242
|
+
]
|
243
|
+
|
244
|
+
[[package]]
|
245
|
+
name = "pathspec"
|
246
|
+
version = "0.12.1"
|
247
|
+
source = { registry = "https://pypi.org/simple" }
|
248
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
|
249
|
+
wheels = [
|
250
|
+
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
|
251
|
+
]
|
252
|
+
|
253
|
+
[[package]]
|
254
|
+
name = "pluggy"
|
255
|
+
version = "1.5.0"
|
256
|
+
source = { registry = "https://pypi.org/simple" }
|
257
|
+
sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
|
258
|
+
wheels = [
|
259
|
+
{ url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
|
260
|
+
]
|
261
|
+
|
262
|
+
[[package]]
|
263
|
+
name = "py-cpuinfo"
|
264
|
+
version = "9.0.0"
|
265
|
+
source = { registry = "https://pypi.org/simple" }
|
266
|
+
sdist = { url = "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", size = 104716 }
|
267
|
+
wheels = [
|
268
|
+
{ url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335 },
|
269
|
+
]
|
270
|
+
|
271
|
+
[[package]]
|
272
|
+
name = "pytest"
|
273
|
+
version = "8.3.5"
|
274
|
+
source = { registry = "https://pypi.org/simple" }
|
275
|
+
dependencies = [
|
276
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
277
|
+
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
278
|
+
{ name = "iniconfig" },
|
279
|
+
{ name = "packaging" },
|
280
|
+
{ name = "pluggy" },
|
281
|
+
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
282
|
+
]
|
283
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
|
284
|
+
wheels = [
|
285
|
+
{ url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
|
286
|
+
]
|
287
|
+
|
288
|
+
[[package]]
|
289
|
+
name = "pytest-benchmark"
|
290
|
+
version = "5.1.0"
|
291
|
+
source = { registry = "https://pypi.org/simple" }
|
292
|
+
dependencies = [
|
293
|
+
{ name = "py-cpuinfo" },
|
294
|
+
{ name = "pytest" },
|
295
|
+
]
|
296
|
+
sdist = { url = "https://files.pythonhosted.org/packages/39/d0/a8bd08d641b393db3be3819b03e2d9bb8760ca8479080a26a5f6e540e99c/pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105", size = 337810 }
|
297
|
+
wheels = [
|
298
|
+
{ url = "https://files.pythonhosted.org/packages/9e/d6/b41653199ea09d5969d4e385df9bbfd9a100f28ca7e824ce7c0a016e3053/pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89", size = 44259 },
|
299
|
+
]
|
300
|
+
|
301
|
+
[[package]]
|
302
|
+
name = "pytest-cov"
|
303
|
+
version = "6.0.0"
|
304
|
+
source = { registry = "https://pypi.org/simple" }
|
305
|
+
dependencies = [
|
306
|
+
{ name = "coverage", extra = ["toml"] },
|
307
|
+
{ name = "pytest" },
|
308
|
+
]
|
309
|
+
sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 }
|
310
|
+
wheels = [
|
311
|
+
{ url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 },
|
312
|
+
]
|
313
|
+
|
314
|
+
[[package]]
|
315
|
+
name = "scikit-build-core"
|
316
|
+
version = "0.10.7"
|
317
|
+
source = { registry = "https://pypi.org/simple" }
|
318
|
+
dependencies = [
|
319
|
+
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
320
|
+
{ name = "packaging" },
|
321
|
+
{ name = "pathspec" },
|
322
|
+
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
323
|
+
]
|
324
|
+
sdist = { url = "https://files.pythonhosted.org/packages/34/75/ad5664c8050bbbea46a5f2b6a3dfbc6e6cf284826c0eee0a12f861364b3f/scikit_build_core-0.10.7.tar.gz", hash = "sha256:04cbb59fe795202a7eeede1849112ee9dcbf3469feebd9b8b36aa541336ac4f8", size = 255019 }
|
325
|
+
wheels = [
|
326
|
+
{ url = "https://files.pythonhosted.org/packages/88/fe/90476c4f6a1b2f922efa00d26e876dd40c7279e28ec18f08f0851ad21ba6/scikit_build_core-0.10.7-py3-none-any.whl", hash = "sha256:5e13ab7ca7c3c6dd019607c3a6f53cba67dade8757c4c4f75b459e2f90e4dbc3", size = 165511 },
|
327
|
+
]
|
328
|
+
|
329
|
+
[[package]]
|
330
|
+
name = "tomli"
|
331
|
+
version = "2.2.1"
|
332
|
+
source = { registry = "https://pypi.org/simple" }
|
333
|
+
sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
|
334
|
+
wheels = [
|
335
|
+
{ url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
|
336
|
+
{ url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
|
337
|
+
{ url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
|
338
|
+
{ url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
|
339
|
+
{ url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
|
340
|
+
{ url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
|
341
|
+
{ url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
|
342
|
+
{ url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
|
343
|
+
{ url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
|
344
|
+
{ url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
|
345
|
+
{ url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
|
346
|
+
{ url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
|
347
|
+
{ url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
|
348
|
+
{ url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
|
349
|
+
{ url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
|
350
|
+
{ url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
|
351
|
+
{ url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
|
352
|
+
{ url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
|
353
|
+
{ url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
|
354
|
+
{ url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
|
355
|
+
{ url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
|
356
|
+
{ url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
|
357
|
+
{ url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
|
358
|
+
{ url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
|
359
|
+
{ url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
|
360
|
+
{ url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
|
361
|
+
{ url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
|
362
|
+
{ url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
|
363
|
+
{ url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
|
364
|
+
{ url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
|
365
|
+
{ url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
|
366
|
+
]
|
@@ -1,67 +0,0 @@
|
|
1
|
-
#ifndef BURST_INTERFACE_H
|
2
|
-
#define BURST_INTERFACE_H
|
3
|
-
|
4
|
-
#include <stddef.h>
|
5
|
-
#include <stdint.h>
|
6
|
-
#include <stdbool.h>
|
7
|
-
|
8
|
-
#define COBS_DELIMITER 0x00
|
9
|
-
#define COBS_MAX_CODE 0xFF
|
10
|
-
|
11
|
-
// Status codes returned by the encoder.
|
12
|
-
typedef enum
|
13
|
-
{
|
14
|
-
BURST_DATA_CONSUMED,
|
15
|
-
BURST_PACKET_READY,
|
16
|
-
BURST_OVERFLOW_ERROR,
|
17
|
-
BURST_ENCODE_ERROR,
|
18
|
-
BURST_CRC_ERROR,
|
19
|
-
BURST_DECODE_ERROR
|
20
|
-
} burst_status_t;
|
21
|
-
|
22
|
-
typedef struct
|
23
|
-
{
|
24
|
-
uint8_t *data;
|
25
|
-
size_t size;
|
26
|
-
} burst_packet_t;
|
27
|
-
|
28
|
-
typedef struct
|
29
|
-
{
|
30
|
-
uint8_t *buffer; // Output buffer for encoded packets.
|
31
|
-
size_t buffer_size; // Total size of the output buffer.
|
32
|
-
size_t out_head; // Current offset (number of bytes written).
|
33
|
-
} burst_encoder_t;
|
34
|
-
|
35
|
-
typedef struct
|
36
|
-
{
|
37
|
-
uint8_t *buffer; // Output buffer for decoded data.
|
38
|
-
size_t buffer_size; // Size of the output buffer.
|
39
|
-
size_t out_head; // Current count of decoded bytes stored.
|
40
|
-
|
41
|
-
uint8_t current_code; // Current block’s code byte; 0 indicates a new block is
|
42
|
-
// expected.
|
43
|
-
uint8_t bytes_remaining; // Number of data bytes left to copy for the current
|
44
|
-
// block.
|
45
|
-
bool pending_zero; // true if a zero should be inserted before starting the
|
46
|
-
// next block.
|
47
|
-
|
48
|
-
bool finished; // true if the packet is complete and available in the buffer
|
49
|
-
} burst_decoder_t;
|
50
|
-
|
51
|
-
|
52
|
-
// Encoder
|
53
|
-
void burst_encoder_init(burst_encoder_t *ctx, uint8_t *buffer, size_t size);
|
54
|
-
burst_status_t burst_encoder_add_packet(burst_encoder_t *ctx, const uint8_t *data, size_t size);
|
55
|
-
burst_packet_t burst_encoder_flush(burst_encoder_t *ctx);
|
56
|
-
|
57
|
-
|
58
|
-
// Decoder
|
59
|
-
void burst_decoder_init(burst_decoder_t *ctx, uint8_t *buffer, size_t size);
|
60
|
-
burst_status_t bust_decoder_add_data(burst_decoder_t *ctx, const uint8_t *data, size_t size,
|
61
|
-
size_t *consumed_bytes);
|
62
|
-
void burst_decoder_reset(burst_decoder_t *ctx);
|
63
|
-
burst_status_t burst_decoder_add_byte(burst_decoder_t *ctx, uint8_t byte);
|
64
|
-
|
65
|
-
burst_packet_t burst_decoder_get_packet(burst_decoder_t *ctx);
|
66
|
-
|
67
|
-
#endif // ENCODER_H
|
@@ -1,150 +0,0 @@
|
|
1
|
-
#include "burst_interface.h"
|
2
|
-
#include "crc.h"
|
3
|
-
#include <stdbool.h>
|
4
|
-
#include <stddef.h>
|
5
|
-
#include <stdint.h>
|
6
|
-
#include <stdio.h>
|
7
|
-
|
8
|
-
void burst_decoder_init(burst_decoder_t *ctx, uint8_t *buffer, size_t size)
|
9
|
-
{
|
10
|
-
ctx->buffer = buffer;
|
11
|
-
ctx->buffer_size = size;
|
12
|
-
burst_decoder_reset(ctx);
|
13
|
-
}
|
14
|
-
|
15
|
-
burst_status_t bust_decoder_add_data(burst_decoder_t *ctx, const uint8_t *data, size_t size,
|
16
|
-
size_t *consumed_bytes)
|
17
|
-
{
|
18
|
-
// If the decoder was finished, reset it.
|
19
|
-
if (ctx->finished)
|
20
|
-
{
|
21
|
-
burst_decoder_reset(ctx);
|
22
|
-
}
|
23
|
-
|
24
|
-
for (size_t i = 0; i < size; i++)
|
25
|
-
{
|
26
|
-
uint8_t byte = data[i];
|
27
|
-
(*consumed_bytes)++;
|
28
|
-
|
29
|
-
burst_status_t result = burst_decoder_add_byte(ctx, byte);
|
30
|
-
|
31
|
-
if (result != BURST_DATA_CONSUMED)
|
32
|
-
{
|
33
|
-
ctx->finished = true;
|
34
|
-
return result;
|
35
|
-
}
|
36
|
-
}
|
37
|
-
return BURST_DATA_CONSUMED;
|
38
|
-
}
|
39
|
-
void burst_decoder_reset(burst_decoder_t *ctx)
|
40
|
-
{
|
41
|
-
ctx->out_head = 0;
|
42
|
-
ctx->current_code = 0;
|
43
|
-
ctx->bytes_remaining = 0;
|
44
|
-
ctx->pending_zero = false;
|
45
|
-
ctx->finished = false;
|
46
|
-
}
|
47
|
-
|
48
|
-
burst_status_t burst_decoder_complete_packet(burst_decoder_t *ctx)
|
49
|
-
{
|
50
|
-
// Ensure we have at least two bytes for the CRC.
|
51
|
-
if (ctx->out_head < CRC_SIZE)
|
52
|
-
{
|
53
|
-
return BURST_CRC_ERROR;
|
54
|
-
}
|
55
|
-
|
56
|
-
// Calculate the CRC over the packet data excluding the last two CRC bytes.
|
57
|
-
uint16_t computed_crc = crc16_ccitt(ctx->buffer, ctx->out_head - CRC_SIZE);
|
58
|
-
|
59
|
-
// Extract the received CRC from the last two bytes (big-endian).
|
60
|
-
uint16_t received_crc =
|
61
|
-
((uint16_t)ctx->buffer[ctx->out_head - CRC_SIZE] << 8) |
|
62
|
-
ctx->buffer[ctx->out_head - 1];
|
63
|
-
|
64
|
-
// Check if the CRCs match.
|
65
|
-
if (computed_crc != received_crc)
|
66
|
-
{
|
67
|
-
return BURST_CRC_ERROR;
|
68
|
-
}
|
69
|
-
|
70
|
-
// CRC check passed, we can remove it from the packet.
|
71
|
-
ctx->out_head -= CRC_SIZE;
|
72
|
-
return BURST_PACKET_READY;
|
73
|
-
}
|
74
|
-
|
75
|
-
// If byte is a delimiter but a block is not complete, return COBS_DECODE_ERROR
|
76
|
-
// If the buffer is full, return COBS_OVERFLOW_ERROR
|
77
|
-
// If the byte is consumed, but the packet is not complete, return COBS_DATA_CONSUMED
|
78
|
-
// If the packet is complete, return COBS_PACKET_READY
|
79
|
-
burst_status_t burst_decoder_add_byte(burst_decoder_t *ctx, uint8_t byte)
|
80
|
-
{
|
81
|
-
// Check if there is space for more data.
|
82
|
-
if (ctx->out_head >= ctx->buffer_size) {
|
83
|
-
return BURST_OVERFLOW_ERROR;
|
84
|
-
}
|
85
|
-
|
86
|
-
// If the byte is a delimiter, decide if it terminates the packet.
|
87
|
-
if (byte == COBS_DELIMITER) {
|
88
|
-
// If in the middle of a block, a delimiter is not allowed.
|
89
|
-
if (ctx->current_code != 0) {
|
90
|
-
return BURST_DECODE_ERROR;
|
91
|
-
}
|
92
|
-
// Otherwise, the packet is complete.
|
93
|
-
return burst_decoder_complete_packet(ctx);
|
94
|
-
}
|
95
|
-
|
96
|
-
// If a zero is pending from a previous block, insert it now.
|
97
|
-
if (ctx->pending_zero) {
|
98
|
-
if (ctx->out_head >= ctx->buffer_size) {
|
99
|
-
return BURST_OVERFLOW_ERROR;
|
100
|
-
}
|
101
|
-
ctx->buffer[ctx->out_head++] = COBS_DELIMITER;
|
102
|
-
ctx->pending_zero = false;
|
103
|
-
// Now, treat the current byte as a new block code.
|
104
|
-
ctx->current_code = byte;
|
105
|
-
ctx->bytes_remaining = (byte > 0 ? byte - 1 : 0);
|
106
|
-
return BURST_DATA_CONSUMED;
|
107
|
-
}
|
108
|
-
|
109
|
-
// If not currently in a block, this byte is the new block code.
|
110
|
-
if (ctx->current_code == 0) {
|
111
|
-
ctx->current_code = byte;
|
112
|
-
ctx->bytes_remaining = (byte > 0 ? byte - 1 : 0);
|
113
|
-
return BURST_DATA_CONSUMED;
|
114
|
-
}
|
115
|
-
|
116
|
-
// Otherwise, we are in the middle of a block so treat the byte as data.
|
117
|
-
ctx->buffer[ctx->out_head++] = byte;
|
118
|
-
if (ctx->bytes_remaining > 0) {
|
119
|
-
ctx->bytes_remaining--;
|
120
|
-
}
|
121
|
-
|
122
|
-
// When the block is complete...
|
123
|
-
if (ctx->bytes_remaining == 0) {
|
124
|
-
// If the block's code is less than COBS_MAX_CODE, a zero is pending.
|
125
|
-
if (ctx->current_code < COBS_MAX_CODE) {
|
126
|
-
ctx->pending_zero = true;
|
127
|
-
}
|
128
|
-
ctx->current_code = 0;
|
129
|
-
}
|
130
|
-
|
131
|
-
return BURST_DATA_CONSUMED;
|
132
|
-
}
|
133
|
-
|
134
|
-
|
135
|
-
burst_packet_t burst_decoder_get_packet(burst_decoder_t *ctx)
|
136
|
-
{
|
137
|
-
|
138
|
-
if (!ctx->finished)
|
139
|
-
{
|
140
|
-
burst_packet_t packet;
|
141
|
-
packet.data = NULL;
|
142
|
-
packet.size = 0;
|
143
|
-
return packet;
|
144
|
-
}
|
145
|
-
|
146
|
-
burst_packet_t packet;
|
147
|
-
packet.data = ctx->buffer;
|
148
|
-
packet.size = ctx->out_head;
|
149
|
-
return packet;
|
150
|
-
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|