From ea7922ceee18ee34c46d6f097511e1218f92c582 Mon Sep 17 00:00:00 2001 From: Morcules Date: Sat, 21 Feb 2026 13:37:28 +0100 Subject: [PATCH 01/12] Basic hashmap implementation. No testing yet --- src/; | 48 +++++++++ src/cleanup_swiftnet.c | 1 + src/initialize_swiftnet.c | 4 + src/internal/datatype_hashmap.c | 184 ++++++++++++++++++++++++++++++++ src/internal/internal.h | 3 + src/swift_net.h | 13 +++ 6 files changed, 253 insertions(+) create mode 100644 src/; create mode 100644 src/internal/datatype_hashmap.c diff --git a/src/; b/src/; new file mode 100644 index 0000000..b0f9cae --- /dev/null +++ b/src/; @@ -0,0 +1,48 @@ +#include +#include +#include "internal.h" +#include +#include + +uint64_t seed; + +uint64_t hash64(const uint8_t* const data, const uint32_t data_size) { + uint64_t res = 0; + + for (uint32_t i = 0; i < data_size; i++) { + res = (res ^ *(data + i)) * res; + } + + return res; +} + +struct SwiftNetHashMap hashmap_create() { + return (struct SwiftNetHashMap){ + .items_allocated = 0xFF, + .items = calloc(sizeof(struct SwiftNetHashMapItem), 0xFF) + }; +} + +void hashmap_insert(void* const data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* const hashmap) { + // Mapping to max value of items allocated + // Must rehash when scalling hashmap + const uint64_t key = ((__uint128_t)hash64(data, data_size) * hashmap->items_allocated) >> 64; + + struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; + + while (current_target_item->value != NULL) { + if (current_target_item->next == NULL) { + struct SwiftNetHashMapItem* const new_item = allocator_allocate(&hashmap_item_memory_allocator); + current_target_item->next = new_item; + } else { + current_target_item = current_target_item->next; + } + } + + *current_target_item = (struct SwiftNetHashMapItem){ + .key_original_data = data, + .key_original_data_size = data_size, + .value = value, + .next = NULL + }; +} diff --git a/src/cleanup_swiftnet.c b/src/cleanup_swiftnet.c index 7774eac..cd2e031 100644 --- a/src/cleanup_swiftnet.c +++ b/src/cleanup_swiftnet.c @@ -35,6 +35,7 @@ void swiftnet_cleanup() { allocator_destroy(&server_packet_data_memory_allocator); allocator_destroy(&client_packet_data_memory_allocator); allocator_destroy(&packet_buffer_memory_allocator); + allocator_destroy(&hashmap_item_memory_allocator); #ifdef SWIFT_NET_REQUESTS allocator_destroy(&requests_sent_memory_allocator); diff --git a/src/initialize_swiftnet.c b/src/initialize_swiftnet.c index b10e7b5..10bddde 100644 --- a/src/initialize_swiftnet.c +++ b/src/initialize_swiftnet.c @@ -33,6 +33,7 @@ struct SwiftNetMemoryAllocator packet_buffer_memory_allocator; struct SwiftNetMemoryAllocator server_memory_allocator; struct SwiftNetMemoryAllocator client_connection_memory_allocator; struct SwiftNetMemoryAllocator listener_memory_allocator; +struct SwiftNetMemoryAllocator hashmap_item_memory_allocator; #ifdef SWIFT_NET_REQUESTS struct SwiftNetMemoryAllocator requests_sent_memory_allocator; @@ -54,6 +55,7 @@ static inline void initialize_allocators() { server_memory_allocator = allocator_create(sizeof(struct SwiftNetServer), 10); client_connection_memory_allocator = allocator_create(sizeof(struct SwiftNetClientConnection), 10); listener_memory_allocator = allocator_create(sizeof(struct Listener), 100); + hashmap_item_memory_allocator = allocator_create(sizeof(struct SwiftNetHashMapItem), 0xFF); #ifdef SWIFT_NET_REQUESTS requests_sent_memory_allocator = allocator_create(sizeof(struct RequestSent), 100); @@ -74,6 +76,8 @@ static inline void initialize_memory_cleanup_thread() { } void swiftnet_initialize() { + seed = rand(); + atomic_store_explicit(&swiftnet_closing, false, memory_order_release); const int temp_socket = socket(AF_INET, SOCK_DGRAM, 0); diff --git a/src/internal/datatype_hashmap.c b/src/internal/datatype_hashmap.c new file mode 100644 index 0000000..6e544d8 --- /dev/null +++ b/src/internal/datatype_hashmap.c @@ -0,0 +1,184 @@ +#include +#include +#include "internal.h" +#include +#include + +// Initialized in swiftnet_initialize function with rand +uint64_t seed; + +// This hashing function is not really as random as I would want it to be, but it's performant. +// Can cause some collisions. +static inline uint64_t hash64(const uint8_t* const data, const uint32_t data_size) { + // Manual SIMD optimization would be preffered in the future. + uint64_t res = 0; + + for (uint32_t i = 0; i < data_size; i++) { + res = (res ^ *(data + i)) * seed; + } + + return res; +} + +static inline uint32_t get_key(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* const hashmap) { + // Mapping to max value of items allocated + // Must rehash when scalling hashmap + return ((__uint128_t)hash64(key_data, data_size) * hashmap->capacity) >> 64; +} + +// Must rehash every key. Takes many cpu cycles. +static inline void hashmap_resize(struct SwiftNetHashMap* const hashmap) { + // Multiply value should be changed by -D flag in the future. + // For now just literal + const uint32_t old_capacity = hashmap->capacity; + const uint32_t new_capacity = hashmap->capacity * 4; + struct SwiftNetHashMapItem* const old_data_location = hashmap->items; + + hashmap->capacity = new_capacity; + + // Realloc doesn't make sense here bcs we have to rehash and copy rehashed keys. + hashmap->items = calloc(sizeof(struct SwiftNetHashMapItem), new_capacity); + + for (uint32_t i = 0; i < old_capacity; i++) { + struct SwiftNetHashMapItem* const current_hashmap_item = old_data_location + i; + if (current_hashmap_item->value == NULL) { + continue; + } + + for (struct SwiftNetHashMapItem* current_linked_item = current_hashmap_item; current_linked_item != NULL; current_linked_item = current_linked_item->next) { + void* const key_original_data = current_linked_item->key_original_data; + const uint32_t key_original_data_size = current_linked_item->key_original_data_size; + + const uint64_t new_key = get_key(key_original_data, key_original_data_size, hashmap); + + struct SwiftNetHashMapItem* new_mem_hashmap_item = hashmap->items + new_key; + if (new_mem_hashmap_item->value != NULL) { + // Get last item + while (new_mem_hashmap_item->next != NULL) { + new_mem_hashmap_item = new_mem_hashmap_item->next; + } + + struct SwiftNetHashMapItem* const hashmap_item_new_allocation = allocator_allocate(&hashmap_item_memory_allocator); + *hashmap_item_new_allocation = (struct SwiftNetHashMapItem){ + .key_original_data = key_original_data, + .key_original_data_size = key_original_data_size, + .next = NULL, + .value = current_linked_item->value + }; + + new_mem_hashmap_item->next = hashmap_item_new_allocation; + + } else { + *new_mem_hashmap_item = (struct SwiftNetHashMapItem){ + .key_original_data = key_original_data, + .key_original_data_size = key_original_data_size, + .next = NULL, + .value = current_linked_item->value + }; + } + } + } + + free(old_data_location); +} + +struct SwiftNetHashMap hashmap_create() { + return (struct SwiftNetHashMap){ + .capacity = 0xFF, + .items = calloc(sizeof(struct SwiftNetHashMapItem), 0xFF) + }; +} + +void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* restrict const hashmap) { + const uint64_t key = get_key(key_data, data_size, hashmap); + + struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; + + while (current_target_item->value != NULL) { + if (current_target_item->next == NULL) { + struct SwiftNetHashMapItem* const new_item = allocator_allocate(&hashmap_item_memory_allocator); + + current_target_item->next = new_item; + + current_target_item = new_item; + } else { + current_target_item = current_target_item->next; + } + } + + *current_target_item = (struct SwiftNetHashMapItem){ + .key_original_data = key_data, + .key_original_data_size = data_size, + .value = value, + .next = NULL + }; + + hashmap->size++; + + if (hashmap->size >= hashmap->capacity) { + hashmap_resize(hashmap); + } +} + +void hashmap_remove(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* const hashmap) { + const uint64_t key = get_key(key_data, data_size, hashmap); + + struct SwiftNetHashMapItem* previous_target_item = hashmap->items + key; + struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; + + while (current_target_item != NULL) { + if (data_size == current_target_item->key_original_data_size && memcmp(current_target_item->key_original_data, key_data, data_size) == 0) { + break; + } + + previous_target_item = current_target_item; + current_target_item = current_target_item->next; + + continue; + } + + if (current_target_item == previous_target_item) { + current_target_item->value = NULL; + + struct SwiftNetHashMapItem* const next = current_target_item->next; + + if (next != NULL) { + memcpy(current_target_item, next, sizeof(struct SwiftNetHashMapItem)); + + next->value = NULL; + + allocator_free(&hashmap_item_memory_allocator, next); + } + } else { + previous_target_item->next = current_target_item->next; + + current_target_item->value = NULL; + current_target_item->next = NULL; + + allocator_free(&hashmap_item_memory_allocator, current_target_item); + } + + hashmap->size--; +} + +void hashmap_destroy(struct SwiftNetHashMap* const hashmap) { + for (uint32_t i = 0; i < hashmap->capacity; i++) { + struct SwiftNetHashMapItem* const current_item = hashmap->items + i; + if (current_item->value == NULL) { + continue; + } + + // Dealloc all ->next + for (struct SwiftNetHashMapItem* current_linked_item = current_item->next; current_linked_item != NULL;) { + struct SwiftNetHashMapItem* const next_item = current_linked_item->next; + + allocator_free(&hashmap_item_memory_allocator, current_linked_item); + + current_linked_item = next_item; + + continue; + } + } + + free(hashmap->items); +} diff --git a/src/internal/internal.h b/src/internal/internal.h index 85dec02..89352ab 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -125,6 +125,8 @@ enum ConnectionType { CONNECTION_TYPE_CLIENT }; +extern uint64_t seed; + extern struct SwiftNetVector listeners; extern pthread_t memory_cleanup_thread; @@ -206,6 +208,7 @@ extern struct SwiftNetMemoryAllocator packet_buffer_memory_allocator; extern struct SwiftNetMemoryAllocator server_memory_allocator; extern struct SwiftNetMemoryAllocator client_connection_memory_allocator; extern struct SwiftNetMemoryAllocator listener_memory_allocator; +extern struct SwiftNetMemoryAllocator hashmap_item_memory_allocator; extern void* interface_start_listening(void* listener_void); diff --git a/src/swift_net.h b/src/swift_net.h index 44f7456..a8c4000 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -223,6 +223,19 @@ struct SwiftNetVector { _Atomic uint8_t locked; }; +struct SwiftNetHashMapItem { + struct SwiftNetHashMapItem* next; + void* key_original_data; + uint32_t key_original_data_size; + void* value; +}; + +struct SwiftNetHashMap { + struct SwiftNetHashMapItem* items; + uint32_t capacity; + uint32_t size; +}; + // Connection data struct SwiftNetClientConnection { pcap_t* pcap; From f044f1368ab94f903969276a66a4da68884ad866 Mon Sep 17 00:00:00 2001 From: Morcules Date: Sat, 21 Feb 2026 22:16:57 +0100 Subject: [PATCH 02/12] Commit --- src/; | 48 ----------------------- src/CMakeLists.txt | 1 + src/cleanup_connection.c | 6 ++- src/cleanup_swiftnet.c | 1 + src/initialize_client_connection.c | 2 +- src/initialize_server.c | 2 +- src/initialize_swiftnet.c | 2 + src/internal/datatype_hashmap.c | 22 +++++++++++ src/internal/internal.h | 12 +++++- src/memory_cleanup_background_service.c | 4 +- src/process_packets.c | 29 ++++---------- src/send_packet.c | 4 +- src/swift_net.h | 4 +- tests/integration_tests/output/run_tests | Bin 164760 -> 166072 bytes tests/performance_tests/output/run_tests | Bin 59592 -> 59528 bytes 15 files changed, 56 insertions(+), 81 deletions(-) delete mode 100644 src/; diff --git a/src/; b/src/; deleted file mode 100644 index b0f9cae..0000000 --- a/src/; +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include "internal.h" -#include -#include - -uint64_t seed; - -uint64_t hash64(const uint8_t* const data, const uint32_t data_size) { - uint64_t res = 0; - - for (uint32_t i = 0; i < data_size; i++) { - res = (res ^ *(data + i)) * res; - } - - return res; -} - -struct SwiftNetHashMap hashmap_create() { - return (struct SwiftNetHashMap){ - .items_allocated = 0xFF, - .items = calloc(sizeof(struct SwiftNetHashMapItem), 0xFF) - }; -} - -void hashmap_insert(void* const data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* const hashmap) { - // Mapping to max value of items allocated - // Must rehash when scalling hashmap - const uint64_t key = ((__uint128_t)hash64(data, data_size) * hashmap->items_allocated) >> 64; - - struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; - - while (current_target_item->value != NULL) { - if (current_target_item->next == NULL) { - struct SwiftNetHashMapItem* const new_item = allocator_allocate(&hashmap_item_memory_allocator); - current_target_item->next = new_item; - } else { - current_target_item = current_target_item->next; - } - } - - *current_target_item = (struct SwiftNetHashMapItem){ - .key_original_data = data, - .key_original_data_size = data_size, - .value = value, - .next = NULL - }; -} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9f8aa5d..1ab3a31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,6 +27,7 @@ set(SOURCE_FILES internal/get_default_interface_and_mac.c internal/datatype_allocator.c internal/datatype_vector.c + internal/datatype_hashmap.c internal/pcap_open.c internal/pcap_send.c internal/check_existing_listener.c diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index ea1eff8..9a0e44e 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -15,7 +15,8 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec vector_destroy(&client->packets_sending); vector_destroy(&client->pending_messages); - vector_destroy(&client->packets_completed); + + hashmap_destroy(&client->packets_completed); } else { struct SwiftNetServer* const server = (struct SwiftNetServer*)connection; @@ -25,7 +26,8 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec vector_destroy(&server->packets_sending); vector_destroy(&server->pending_messages); - vector_destroy(&server->packets_completed); + + hashmap_destroy(&server->packets_completed); } } diff --git a/src/cleanup_swiftnet.c b/src/cleanup_swiftnet.c index cd2e031..d875ded 100644 --- a/src/cleanup_swiftnet.c +++ b/src/cleanup_swiftnet.c @@ -49,6 +49,7 @@ void swiftnet_cleanup() { allocator_destroy(&client_connection_memory_allocator); allocator_destroy(&listener_memory_allocator); + allocator_destroy(&uint16_memory_allocator); #ifdef SWIFT_NET_INTERNAL_TESTING printf("Bytes leaked: %d\nItems leaked: %d\n", bytes_leaked, items_leaked); diff --git a/src/initialize_client_connection.c b/src/initialize_client_connection.c index 64ab933..413187e 100644 --- a/src/initialize_client_connection.c +++ b/src/initialize_client_connection.c @@ -88,7 +88,7 @@ static inline struct SwiftNetClientConnection* const construct_client_connection new_connection->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); new_connection->packets_sending = vector_create(100); new_connection->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); - new_connection->packets_completed = vector_create(100); + new_connection->packets_completed = hashmap_create(); new_connection->packet_queue = (struct PacketQueue){ .first_node = NULL, diff --git a/src/initialize_server.c b/src/initialize_server.c index 8540ef6..3b12171 100644 --- a/src/initialize_server.c +++ b/src/initialize_server.c @@ -47,7 +47,7 @@ static inline struct SwiftNetServer* const construct_server(const bool loopback, new_server->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); new_server->packets_sending = vector_create(100); new_server->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); - new_server->packets_completed = vector_create(100); + new_server->packets_completed = hashmap_create(); return new_server; } diff --git a/src/initialize_swiftnet.c b/src/initialize_swiftnet.c index 10bddde..dd6731f 100644 --- a/src/initialize_swiftnet.c +++ b/src/initialize_swiftnet.c @@ -34,6 +34,7 @@ struct SwiftNetMemoryAllocator server_memory_allocator; struct SwiftNetMemoryAllocator client_connection_memory_allocator; struct SwiftNetMemoryAllocator listener_memory_allocator; struct SwiftNetMemoryAllocator hashmap_item_memory_allocator; +struct SwiftNetMemoryAllocator uint16_memory_allocator; #ifdef SWIFT_NET_REQUESTS struct SwiftNetMemoryAllocator requests_sent_memory_allocator; @@ -56,6 +57,7 @@ static inline void initialize_allocators() { client_connection_memory_allocator = allocator_create(sizeof(struct SwiftNetClientConnection), 10); listener_memory_allocator = allocator_create(sizeof(struct Listener), 100); hashmap_item_memory_allocator = allocator_create(sizeof(struct SwiftNetHashMapItem), 0xFF); + uint16_memory_allocator = allocator_create(sizeof(uint16_t), 0xFF); #ifdef SWIFT_NET_REQUESTS requests_sent_memory_allocator = allocator_create(sizeof(struct RequestSent), 100); diff --git a/src/internal/datatype_hashmap.c b/src/internal/datatype_hashmap.c index 6e544d8..bcbc9d8 100644 --- a/src/internal/datatype_hashmap.c +++ b/src/internal/datatype_hashmap.c @@ -89,6 +89,28 @@ struct SwiftNetHashMap hashmap_create() { }; } +void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* restrict const hashmap) { + const uint64_t key = get_key(key_data, data_size, hashmap); + + struct SwiftNetHashMapItem* current_item = hashmap->items + key; + + if (current_item->next == NULL) { + return current_item->value; + } + + while (current_item != NULL) { + if (data_size == current_item->key_original_data_size && memcmp(current_item->key_original_data, key_data, data_size) == 0) { + return current_item->value; + } + + current_item = current_item->next; + + continue; + } + + return NULL; +} + void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* restrict const hashmap) { const uint64_t key = get_key(key_data, data_size, hashmap); diff --git a/src/internal/internal.h b/src/internal/internal.h index 89352ab..cb85962 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -19,10 +19,10 @@ #define LOOPBACK_INTERFACE_NAME "lo0\0" #endif -typedef enum { +enum RequestLostPacketsReturnType { REQUEST_LOST_PACKETS_RETURN_UPDATED_BIT_ARRAY = 0x00, REQUEST_LOST_PACKETS_RETURN_COMPLETED_PACKET = 0x01 -} RequestLostPacketsReturnType; +}; #define PACKET_PREPEND_SIZE(addr_type) ((addr_type == DLT_NULL) ? sizeof(uint32_t) : addr_type == DLT_EN10MB ? sizeof(struct ether_header) : 0) #define PACKET_HEADER_SIZE (sizeof(struct ip) + sizeof(struct SwiftNetPacketInfo)) @@ -195,6 +195,8 @@ static inline void send_debug_message(const char* message, ...) { extern uint32_t semaphore_counter; +extern struct SwiftNetMemoryAllocator uint16_memory_allocator; + extern struct SwiftNetMemoryAllocator allocator_create(const uint32_t item_size, const uint32_t chunk_item_amount); extern void* allocator_allocate(struct SwiftNetMemoryAllocator* const memory_allocator); extern void allocator_free(struct SwiftNetMemoryAllocator* const memory_allocator, void* const memory_location); @@ -220,6 +222,12 @@ extern struct SwiftNetVector vector_create(const uint32_t starting_amount); extern void vector_lock(struct SwiftNetVector* const vector); extern void vector_unlock(struct SwiftNetVector* const vector); +extern struct SwiftNetHashMap hashmap_create(); +extern void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* restrict const hashmap); +extern void hashmap_remove(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* const hashmap); +extern void hashmap_destroy(struct SwiftNetHashMap* const hashmap); +extern void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* restrict const hashmap); + extern void* server_start_pcap(void* server_void); extern void* client_start_pcap(void* client_void); diff --git a/src/memory_cleanup_background_service.c b/src/memory_cleanup_background_service.c index b8068af..0a9cd47 100644 --- a/src/memory_cleanup_background_service.c +++ b/src/memory_cleanup_background_service.c @@ -41,13 +41,13 @@ void* memory_cleanup_background_service() { for (uint32_t client_connection_index = 0; client_connection_index < client_connections->size; client_connection_index++) { struct SwiftNetClientConnection* const current_con = vector_get(client_connections, client_connection_index); - cleanup_packets_completed(¤t_con->packets_completed, ¤t_con->packets_completed_memory_allocator); + //cleanup_packets_completed(¤t_con->packets_completed, ¤t_con->packets_completed_memory_allocator); } for (uint32_t server_index = 0; server_index < servers->size; server_index++) { struct SwiftNetServer* const current_server = vector_get(servers, server_index); - cleanup_packets_completed(¤t_server->packets_completed, ¤t_server->packets_completed_memory_allocator); + //cleanup_packets_completed(¤t_server->packets_completed, ¤t_server->packets_completed_memory_allocator); } vector_unlock(client_connections); diff --git a/src/process_packets.c b/src/process_packets.c index e41145e..d80bd72 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -82,36 +82,23 @@ static inline const uint32_t return_lost_chunk_indexes(const uint8_t* const chun return offset; } -static inline void packet_completed(const uint16_t packet_id, struct SwiftNetVector* const packets_completed_history, struct SwiftNetMemoryAllocator* const packets_completed_history_memory_allocator) { +static inline void packet_completed(uint16_t packet_id, struct SwiftNetHashMap* const packets_completed_history, struct SwiftNetMemoryAllocator* const packets_completed_history_memory_allocator) { struct SwiftNetPacketCompleted* const new_packet_completed = allocator_allocate(packets_completed_history_memory_allocator); new_packet_completed->packet_id = packet_id; new_packet_completed->marked_cleanup = false; - vector_lock(packets_completed_history); + uint16_t* heap_key_data_location = allocator_allocate(&uint16_memory_allocator); + *heap_key_data_location = packet_id; - vector_push(packets_completed_history, new_packet_completed); - - vector_unlock(packets_completed_history); + hashmap_insert(heap_key_data_location, sizeof(uint16_t), new_packet_completed, packets_completed_history); return; } -static inline bool check_packet_already_completed(const uint16_t packet_id, struct SwiftNetVector* const packets_completed_history) { - vector_lock(packets_completed_history); - - for(uint32_t i = 0; i < packets_completed_history->size; i++) { - const struct SwiftNetPacketCompleted* const current = vector_get((struct SwiftNetVector*)packets_completed_history, i); - - if(current->packet_id == packet_id) { - vector_unlock(packets_completed_history); - - return true; - } - } - - vector_unlock(packets_completed_history); +static inline bool check_packet_already_completed(uint16_t packet_id, struct SwiftNetHashMap* const packets_completed_history) { + const struct SwiftNetPacketCompleted* const item = hashmap_get(&packet_id, sizeof(packet_id), packets_completed_history); - return false; + return item != NULL; } static inline struct SwiftNetPendingMessage* const get_pending_message(struct SwiftNetVector* const pending_messages_vector, const enum ConnectionType connection_type, const uint16_t packet_id) { @@ -325,7 +312,7 @@ static inline void swiftnet_process_packets( struct SwiftNetMemoryAllocator* const packets_sending_messages_memory_allocator, struct SwiftNetVector* const pending_messages, struct SwiftNetMemoryAllocator* const pending_messages_memory_allocator, - struct SwiftNetVector* const packets_completed_history, + struct SwiftNetHashMap* const packets_completed_history, struct SwiftNetMemoryAllocator* const packets_completed_history_memory_allocator, enum ConnectionType connection_type, struct PacketQueue* const packet_queue, diff --git a/src/send_packet.c b/src/send_packet.c index 10b9ca7..506219a 100644 --- a/src/send_packet.c +++ b/src/send_packet.c @@ -26,7 +26,7 @@ static inline void unlock_packet_sending(struct SwiftNetPacketSending* const pac atomic_store_explicit(&packet_sending->locked, false, memory_order_release); } -static inline uint8_t request_lost_packets_bitarray(const uint8_t* const raw_data, const uint32_t data_size, const struct sockaddr* const destination, pcap_t* const pcap, struct SwiftNetPacketSending* const packet_sending) { +static inline enum RequestLostPacketsReturnType request_lost_packets_bitarray(const uint8_t* const raw_data, const uint32_t data_size, const struct sockaddr* const destination, pcap_t* const pcap, struct SwiftNetPacketSending* const packet_sending) { while(1) { if(check_debug_flag(LOST_PACKETS)) { send_debug_message("Requested list of lost packets: {\"packet_id\": %d}\n", packet_sending->packet_id); @@ -112,7 +112,7 @@ static inline void handle_lost_packets( HANDLE_PACKET_CONSTRUCTION(&resend_chunk_ip_header, &resend_chunk_packet_info, addr_type, ð_hdr, mtu + prepend_size, resend_chunk_buffer) while(1) { - const uint8_t request_lost_packets_bitarray_response = request_lost_packets_bitarray(request_lost_packets_buffer, PACKET_HEADER_SIZE + prepend_size, (const struct sockaddr*)destination_address, pcap, packet_sending); + const enum RequestLostPacketsReturnType request_lost_packets_bitarray_response = request_lost_packets_bitarray(request_lost_packets_buffer, PACKET_HEADER_SIZE + prepend_size, (const struct sockaddr*)destination_address, pcap, packet_sending); lock_packet_sending(packet_sending); diff --git a/src/swift_net.h b/src/swift_net.h index a8c4000..41bdab1 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -241,7 +241,7 @@ struct SwiftNetClientConnection { pcap_t* pcap; _Atomic(void (*)(struct SwiftNetClientPacketData* const, void* const user)) packet_handler; _Atomic(void*) packet_handler_user_arg; - struct SwiftNetVector packets_completed; + struct SwiftNetHashMap packets_completed; struct SwiftNetMemoryAllocator packets_completed_memory_allocator; struct PacketQueue packet_queue; pthread_mutex_t process_packets_mtx; @@ -279,7 +279,7 @@ struct SwiftNetServer { struct SwiftNetMemoryAllocator pending_messages_memory_allocator; struct SwiftNetVector packets_sending; struct SwiftNetMemoryAllocator packets_sending_memory_allocator; - struct SwiftNetVector packets_completed; + struct SwiftNetHashMap packets_completed; struct SwiftNetMemoryAllocator packets_completed_memory_allocator; struct PacketCallbackQueue packet_callback_queue; pthread_mutex_t execute_callback_mtx; diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 3f114af9a0de4d9246a2f8b98ea9871033c94202..648dc613c7e11fc4fbcbf2e683228505735243d2 100755 GIT binary patch literal 166072 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 z%0D|G82PaUmWDBP;!lb-6wObSr?ozv51XO-kz3Z9kN0DJ9HQehwtn`&H1O>lyxU7T8n5xs{*3OT5tu{JB%THLout6;wWXx) zU+~F;e)&0YZxK7`wikx6^2nwrYvW;ipMljm&9md)9^t*f2m6D2>ReUs%$54t*Ev6y zo!UUWa>KGR#ZG<#4y#|AL(WwA<2{G-p7YZSozrtLee#~W(rpZ^JmUNayjI6*WAa-L z=*+`pzpVTKQ(okJUoif-Z#wxlY7TeEnVx$tbf)E=!+FnroR5&MJ1}GewExe_4!(zt zMf=~YQ5(N%+lY*`^S!p*b13gQFCD-9w*d@3c-M1Ry7k$Z4`|~muXzVoHP*)fFkavDRPBVRJ6@gjc=d5LtTX^dFH-nw86SwML!FN`7I z<~cWpFh@9Lq}h57Y58MFFc!vbdN9ZAvX#5o6Q{Az8+S)%i-EIeMX`gsTT1-3g}lAV z#M`xBR(tTY7d%cob>8}Ol+zsstOK*Q;_XdtZW)!%-iQHeObZoxTpZC83V9TH%rzsEJu>0q!$NJ3UIXkIz{A6NI_@RFNapvOjrMCY6 zqJHUt{4{&!iD%6nI!X8aLHnIyTMzOo+B%U<>8j?{Ih+x2MwZ%n!ZUd|t^IF+9(;h^ zq|0yVX0tfEoUI(z{Qjch+{4;+hFRaew|-6>U6{rEy_-)tI(xrx&BAx^*Wv9QDh-?; zVm(`XG}s)EG)asR!P z^Jw+P`TPjuel1q$d~OW$o$p+p?oX-8g<)N9s$A*33qukem&EgIQ_nX);?gw;N zVYlv^$#-dx*VC~pMfh9;@jYkI7QO{4-+6y9pU5BozvkXb&ZAam^*1(}*YVYj+(*sbaxw*G1& zT;V1sge7~q`ZYHGejMLc?o$CQ`6Dab$Pwmd?(ug^b^uq^zrwxtj0>sb!pw@P7iI*1 zT}g$Tm{5UzXO7;b^FARM}$_N7WUzYu=76n8tleM?-ECHUfWbYw{@HLg4&* zq}a5L-|bI zk5$S(lj2qnPHDRPD%hXVI3wJ;4V<}s}oatll z9OKOb@kQlAl*13QXAU=?%6V#^hUPYBF?trLB!S9lG38ZM!2+NV+dZpg+&BD%-y z{g6A>Z*TRx+)w#_Ic?u)T! z5gzEnx!GdhH%7m7KH*_2p0R1G$6d!o2sPW?kc4v*0UyL+6vwO#STRQs4V~ zwBGafXbp#-Y7c9hbt&XJwS7>XWGQ)bBqRB>cXif8T3;guB-u#Z9M2T|8$Q7NNVmOY z%fVyipY^oFu8_<5m#xWN^b=+94KgYA*`*}^d%gW$iGBM1jd3phBI7#sbh`ugIpsxn z5I4!4pdD`CMLmb}^YZswQO_arB&SwZDW9_+*fQHk3%x#SdeHxF&0`_= zRmxQD^V+=%S-OmVNt_??zTvSg!47LhfAP^ldcBPjagNjWOZl+45v6b$(EoX*`8-1YP5N%afK;Tfc$g8}|4>a3v$sFkG$;vOYQ{XyIrWS|XM*>`nd&m^^Jd~f8FH_XBg}gwfZ2w~$5_3ZC z0@7>ecrsDS9JY30$l8tMypX+{W2*A!kqPb5|eT*>|JrP24$qV+Zn(_)^%~uEYmJoW$9DUsCwLgbbhU)lqwU z-!2)(-@C-u-Rg>vch~L3A$KWd)E7x`=J&n)qu&*ntuL#do6(bZspI^RJ4f(0Q^)z` zZgmBHbg|!_Tl4BFHI8h1mGJtuKESVgOkW_j*Hiv~IJAeZe8SU}%Oakxn0D=7SycC3 z_+xQ0=Zc;l%lZF3@jVT`PX=XydplQ-zM764OJAqk@c?`4+4bCbaYo2(QT`d;cwsm{ z^^C9I`YxaWUt&tgJ*KoN^yO6K2fxscBeb^}->vjW#VfT_3o{nBf5`n2u(ka?epuNU zgrC}qj10qX1>SzcXrzaGAFzo**q34Ocx1WltM~l+E$-XG^J^~-XVm^=31#rxg@0uU zx_Ggt_uQ9d^O;-O_+N5LVWw)zMVV@3;4UARKhLmdy{_~5FM59ruin=864iG;-&XxNukyez z2A^P3tm%i?iyFY539RU`_4WzN7ul(An{sIB48aqWvKKihXNhZnDqE6(wKatx$gt5+B~+owAx!*B)jJk*xpD@EyI2 zGFH~#Rehd(^Z`C`IObOUjys^=)uCw(45@m(KrD7D|bQDK99~z;e~~J(T95uxN_r&ww2ET_o5F6 z&(-$C%f>y19b5Ubm#)1H@X6K@t>SFit33PPOiN53?C9HyRmjv=W%~{=e^+0NgrDEaW zcRT*gPPEPA>$Bp?Hu&|J&oB6D;hyl}c6fZ<30y6AbSIy{uZE`y za3r2G?hd6t6?3E1ulTEQTYf%^KLO8@&lF^m2L?IGXTXE5_vBri@>S2kyJvmg-P(h9 z9}Jp#w?D5c12*8@W?xUmw`%G<5#O$bZ^iIK^fvXvvp2~X&-C}NoUgL{MMw30w@*`_ zzA+K#&Sdy|BKsCW*8f@GD@4bnm(3A=(d&smo#Mqxbg8)b#gV0)`&6F3lObD@Bwf$e zme9Yod=I1csRHKx@cT>f?MdVG6D?nY&mTp1^6?;?B-O@kZ{z~ng+>wp_4faEL7r!`=WX`7Db5t+UvgZovkV_8b^b&-U~NoB zIFa*t$%hNPzIyn=Os(pqFDLkW1d{jCCeouDYtyW!+d70V20rtXDbBsZ7x!aOf|Csg z-`m7Kg+Jd`-T^OVD?5B!DZbi1zS!9Qc~ot>7@3eQpB;7sTbdjQKQ1OtJR3cqgHB$| z?`*HkF3Qx-27V5DOj|9?LLX)xFxb%V0JCx)?N|sLbzbU^Tghd{O@K?^y8MRlEGB;$ zc%=8FTfJX_`~-INsew+S+OwmViq>l1j^5t89gP7~1x#XvZwvbNumvNr1->2q1h9cE zXbOA)XchlL$YwS4^kx$h@HDWaYKv?_82Ef!dJq`(#nt@fcs{}7-z>Fbg3t5mKF_hU z{lxRB@O(PFo&rCn@_U9?riwDPXTYl|KFMTv(y?Lx=l_y85Ay$J5_HUu_?c zS0}V@eSQ1ZA3GA*w?SR@?I+;Sw>I^ihw4F|eJfP|LX)*`!;Jf1z$Ayoa$~^yoG*tA z$PXI{KI!oJCi64VG!mN5XD=r{Sb}!+@$u!iv5q$8+D=U0)7w7IdeR?rj}89{c(iYW zHI1G5>rCbBGYP|sX7YDqTe^KK@^4?a%;D5sF3|s1*Ddb_=0n#lYq@7ZFmvIFy(8IM zf3$l_+3QuQy!qtWZ#wvSi|EI7Mb1;oTST7DK(%;z|JUo5?L|%ncysHPoHhQN*DW1y z-Es`&|DUc~Zu8eIt0UgJyATtkY?Q&em`8;a|Ut{laZte1L z-r6PmUF_QB=CHSR$=+AHcDcF7+9i9?4rY%%R6u+DwaZ-pGj6@b7`Z^QID~wI4|k%q zOYS!7+VeMWl@Kd$^_+$2v>fDLawC_v!8e1yUh3GkJ0d}m^zABw%WdBAwdfTb< zqkO|pcg1_}1HAW|;63WSvmc-QGR{br>70$m-qKKH9ezNjJvcj1LwZx#o~>89>SljI z2LFDZ?sH4|_fO=?>m2@IlL`FC6y+@}X&wIFXzjg^hWtA|Nw+w;3r>3l?eqV~-n++V zUDkj6*S&kd#&PNtpEvCVBLc*x<%D5=;tQ%b9G zs0N`?Qf*~Af(ng_l!}rH5d9A2+ZWSn6zcE!x(@gKxo-|)_51zvyFYteyFc&G^?qN6 z_w~Ns*ZVrNPEc#JzCpfOf6{?Xczkr7NXpq%anGwb{XWjm*Ew{%`*3Hj*4=VmKI>|L zSvT+!`w!p`cY1POh}HvfW*uWX3k-VrrIPtt`_ZL)Tv^xAB7SeYiE|^4e1^U)AH_+0 zwGRSe&VK|)scSQ=6uCL8jkg@Saj9WpsTcY<7!Kvy2f^l)=Wg!*gmfK zt;}$i0(o8?;O1fPb&YM}On~=tHpM52?`UgmRYpf!V>=Q5u*UXY-oqN(Gep;H*Vra_ zqPkY(_4md2N7vYVbEx89c5N8am}CH@z)1`M5)8)Mdu`#_ayB3UbSH_Qyy4P)4qOXtr{^6UT|5x{BE+dS+=c4E1hwja6k>3&aW_}XC z=-y21p{3#e;SY*#1nmrAYK$)I&AgZIN7|ct4t~Oy&JXtwTYSDz#&&OJAvh^}GqI;= zs}>N~k?+5a$~0}DJqM9C@TGyQ4LhInMT>{E_a$7r7lgd(%;a#M-inpO=S#=!rl0Uk zv0t}`jM{a`e5Y-&eY)eIPpm`s>!9Bs?lS~$IW%KWkZyMCMZ0=Ix52c`hR)XQQto|S z$r@eyq`Q0@sd!%}-mtDt{U5bsIuBR2tL{MlyYb=%I7 zrr#(G(wNe=ZcMJXeETf!8j>Ay7Gq}3L%Ns8hqkXM9@@ULd1&_<(Xw_-ckrwz)_FNI zyAx&6JiL8nd^l?|hqXV`Jj|`j+&HT}=k{S!b4D_Dv(cVkc-x8`XB%lvVYo{iU2)*+ zgzeW-UaWhCHUwKlVThlEyAOUo!x~=8#|G{#9%*i8U68f4D2H}CS9Bb4HM_W0hcJL; zL(Nh7MB^RBo+8CN%IWVlgn5SSp^^6Nu-=Qa+!`OHvrX~!)ZWgL(GBI#Hlki zb;siqg!3x%;d{}$TDL!D!I|hvpLWlWM7ot9^6?Au^B+nRyipv4e_LDGunEsh^?95+ zYr^U>;zjP>OFqY@=aYIhRr#b|VV7LIhH#IVPyB2?wU(c{tvY1$sX9SE8?hXy`q9A^e} z*1qFzgw-z{suT7RukdBBC3FH|+5D28pc8i6^hI<6{N2y|H~CN1330XghrfI3$HJ%X zYhTcNxqC`{-ivL)8sLA+-BUj#9Y?d9?HXTn-7fO@d7nq68GHPYyQjX5{}VR6t zoYeP~PSg79o9x+k4?wRq*0SHVzGMNg?tzpYW7k_V26V4*kU7Q(JLq#Am&;gsPVTex zBZjKZv+kBXRLF|5y$ ztVg(Me%r<&Hl4bUMD5%cz*!yFnME_&$CR1{TFc)L`P8qyKgqveAlW8d-L-NBG_uoE z&hm@4UzClltH`tZW;#E6u+l=g==@|`9>w%si#adb^6$C9>@TozbUa_@gKMAf81!=P zNO(+|*2GKN4P)&(M>NM2UW|S`lRk6%M+jg0ovb~AjXD%KrJak~Z-;4LB}cC_r%Ii& z?W*L*_95eL&y{54l|IThI)VP9_FQT2u+njrkGl(7jd7|4p^Y%uzUSj7c^Q#wF1B`< z$!*!DaF9EN(^gDh4ZdP49k@v0$TlmU)vj>#eFbr>jJtMyGq%Jlq%qabiqsFZ!D=9j)Z1{XD6Y*i)mTx|Ar8OmycWkMSAZ)DOD~T&u@kBbpx|xbI^Vu{Nj@KBb|fxf({zR9xZF@ zd3pK<>6JXuUZ>peVPz6IP}?lI+X7xfCVQ~IOFD;q*)s}+=k?g53Xl4r@a*13XvJr{ z*A~6&+H>%!KQUwa{O(8hAc8fP=U zaWZ#@d?cxteSfb}d_{lW2d>&|jV(p)topX&JLgG*v(n<+*nJnjuSkFL?M~hciL07l z?U}N67d##YY~?5y-uQM&cRdAt_Z#%xudELKh}|D}obXR~Wx6=#+6jA?8uF&Qu+-k? z2nTuCIf{KKl>I8w>e7c@p*{}j_+R?+*4}*UkDFWLgW$__bRECV(-U>BE$-@^&QXxQ zC=F{Qlz#P5NxuyT`P4idefaK=b-nY5`Y1M!=zZbrQC#TxfO8KxN>4POUnHN8l2662 z{-LEuK1IJx^vGzActm}%_p2epD!cFFr@o`)oOJ^B{?@BEJVRLzq%3a0KE3?c(RiAP zXCd*df$os|x{IZw{61*-Y5N%PQ1>J?fgkpWs_r~*%fF;scKllWG^VV2HYwDzP>0Yf z+B>Q`^il9MW^=J*34fKv7x`w(0a|2@T>4eSEeVg$0JMx34%)2^$ zpz?rboxW2ZDf>3559-S*4YTkMeMxus0`b91(cUFmcxiQz<+IZxkMeyl{FQ!^j*$Mb z`k|R{n_ak9M#5FuS{+CEP2sy6lZxyqZdU)(-%~<7)}|+H*$F!5>QvE?w_W5Tv<2!n zyhXn%q5I*f=6P&9KK&YR+bdaM-scco2zr&nmHkz3ha>MgFEq^-@;I;eOWHabM?v-( zD;n->A#if=A52`)bFEV5l8|33JMc{Q&+GL0L!Vmd)t=|aiF+;X>p1!z-Ct?8Z8v@; z-Rp2q;QlXeTJrAi(Xt<&|D5^4KlMQNNA_r0NLigiS(a^xw@hTO{b{A#7hc32i|pZh zlepacU}VlIe&qiCbN@=(R`|5B57VZt$fYeyX&Xt}eo5Lm`$B2Eo3#DxaA}L$Lh#D+ z4O!6HS1Xk^#w4Qk0-2VMwc%KqHXS7j2iZ>8UG(djHL+_4EgtnnvLzYH z*~=O}+CytAz}Gd<+I|u^xyX~&E$o$kMwZ0qU}xkaWAf8E!K&kr$u$b6_TL zirjBJdfwj$etO=2%-;U1Z8(vmqx-nm-kcB!VBeoj{Sawa##D~%lu9H)XKNYN^`cZ-YI0Dr^U-YNOWb^>bIJ?Ctk7@iQ~n0jpK~on#&)W7RPJQ9d5q(Z}z*-TSRB< zj1OPaiJ#5G?4B);_xA7f$JT^*)&_qqytB?~Rd}D>qh)z`?~J#6DZJ0_)$(X~r|;Yw z-F_N%!r49C`yBjcXSKA1_rmO!PltELJ01-0dGHk(UrQRT4b3>4#!78i1)MWPo%jlV zstaq7pB((L6xi{+FMxBd_o-I*s*xgS6Ur>i1gSLz-0((cT$cZPi!KMNQ30GBm} zz#%V6?+<{l#A%I`)^B!lu2HCKQ|&>`4s_TJ058w=8zY|?X=f@k{xx#;YR40@Dtq4V(@XmteXH zj$c}8F8<5~X2GX#Hy3~TIQ*8Iiy!=uS#ZTdYz)>;^;(|Y^4DLz^T>MAp!O>&2P!XQ zaGKkMcmquzJ`tkd8&R?k22bk*!tW9Z9ynh~Hsls~P!|Om&!+ z7ep_annihxiv4o0kiq0c>PB@Ymokz0L`B~XiIFgrA(^4)R$qQ#vIoZ_s z7U!D;nFRNUGKpN(i(WFNy2ZI7HvSSXlaejYKDkynk}aKm5@b@cwV_wba`_=!_Uw}& zlhh5JUs5PPWG;uZOA<1PylXDuv+_gcb|G6i%$qYlU}aMBI81&eY4V6n{E#~*Pr~mj zoMH0+sXX3pT25PzJs!($xgL4UBMnEB#{&G{y88z1Waj*lc+V95cY^f`?QwF9RXTTv zACC>XR{ehUhvU%LKBFDW7{ORZ$%M)Q?yRBKGU_TkyAd2qM_bdDtMO$&w_ZG}UE}+S zb_@Gc`tR4oB^wa^m*`hz<+}Q$^MFEF`)Q9k=N}oG*`2c-`%^kr??tjjHQqX-dkOJr zj^~p$-pIJNol8YlX~z|3hvKBIWUM0*=gpC^c#UgsBR-Aa+V%_BwqJ}{Yfk^28~hr; z8{B$8J4VvWg}p*y_af{_KQR$DY1{?P4;1$4E^K74Lt%5qdWXVR`aiCGfcr6iUHr3r z{KMLxh_s*g3Qsx`z8@rB&2>p0q?2+dEq;D)to6@1_vSvzdFSn#gJQqOZ8;mxc(ChA z(?MP9$gTXu^`FRXtq1?MDzC$u34bqsIruHckMZ8y8VLJdzBlsg`hUss=FpzrhhO4s z$apVw-e7dz5OiM87TpbPb>8W;r?jKH;Op*NOh;6Ysy+Qr!q7U7UFXuC-l93Tp^Uk4 zk2K@1wjH7E)OovCfv5H|$KE-Vv*sx~UNQuo;q@9aag%VQ*VN{sqpY9w8RdTietXep z(pSkgcd(7ajt@2y4mwF~?l}radP!|=G55#F&$gN9vv@xG?Z);t&O_37tGD#ac}NcC z934cQ_bvJ%5mvP_AFF3R0 zg~E>i{Y_!VzFNkoil;K>J(W4MY2B+hw`mPJZ#CyOwQ+7!D`TT-U)RyTzJ|^Fb=vF- z+Sl8Au*Zk?_5YZEs-3T@+geTAdLM1;eQ9m$h;5w5wvluq$5)dVjnDN?+>Q5< z$US$1>|9mAz5Hmn&4VZx&XS`2LB9LwOex9v551ggobNj1<{4}@?LW8Uexsb8`+@j0 z3SKkT7sfAhvckOC3_A|G9DVqt@J4{AaZcJg-IHVW75xv+#GyXk0H20+Yk!xy{r>Bh zga1qFk!{AIP{3&H*uzgLitDrmI+z}oH954C+a@y+%H2ABhPC`|O_k@_v^_ihx96YAjLx81@BW~_ua(xiO7)yF|=3n5?@s!&o#Gle9DV9D%m)$*-b1ZvV zeP-8mpwC{$j^Bk|QvZN?$OC)sJXEjc5T5RFY;Df(zKeJD6_}Sipn2+D=&?O_vQ7{^ zr!{N3_f7XkuG)w`Dt7B67U{e~+ZUM8t+Sier#OvptW75UhOW~5qP4{+zY+NDMYlJ+IW1s!f!)ov~Bzd>5{$! zmYt?w^qtzPozi0pM>ztUycaXT2}w7LvCt_xjdaiq&O^lCX*^yo6# zaa}KZKlH8axSxv-9mhQ~)|Tt~BmUUI1BfdmXpX*=(!v(;0OC zhi?1Ri|DvNqT?FSaT~9v4}p$D&#fv($2Cub79EG4Yemnc=(y&Sj$Owcm$cVjd0u6h zWp&(fcS9p`a-9u2p7AZ2p{I_^fV<8DaPaW{6KgzQMi4YoS&#_pZy zIO(oM;*)e7x{Lcc*Q<`Gza(2v{`bf~=r;7a&P}I|a9#lIFMB#PCl=Lhw}SsdM7LD| zd);=}y(SCrce-sRx@`t$f;!z6?1|g(PuLU1k-3wB)HRJ$4a7!3hwi%E*0)3)(lKLw z*t;&rh9K|DHx6x=ous^@^RCb09;2IuL;g7*vU@l7e4KO4xARRr(H)K&!(q(qKn?OUFWKj+1FM9)tRyehyi!7KKF9juLtoB%Gt|fB)ZG>6p_RoawnyWVuKojKLp!M-%c%n^r~@mDKh&-@S<8zD1D_0ha=YqT zEA@Riaju|#XrCv0wdgZ_qRAMb9^e$8tz47TNd*z$21+^hW*@2`=e#EQa3bb zx#A`BOL%{Mo~3hVB3QchV_WWu&>fI`z7+fAe0|F{=f%9eZgF>vZK;jm{t4V?Xpe=z zgFI>8uPr{PTYOi&o7BtCZSpP~O#RpA!IN#2(~tRVKUaE&$JhNw!g*FW(oNvlvoYCI zuv*{HNz7|qoRiBuX1JG8VN2gZ_kH0^b#$6{R^3VDe-w8#lK-vXP}X*?w~x&$_YvYJ zKDUNFNrb6Bby%mV{Iv2-dUu85@OoEyWgMLO&KtTH$6c7hEetY?&VN|=*rP#ab)To? zeT-zc-#IOk**4uzf*m(fvYT^u%ahR9IN|F9ytg(_?;aT8JDZB~?YW`F()%~Kwu<)X zZpC#u?OieBh&>7!qeNe6jYvG_%y3ub0dVXZBK*$4Z*M&JOuN>Ew(T>bztYY}Ui{2P z`sc(y$Kt1!>zLk=a=p~?ex_(IO)XdWVC6t#aq16D6%OsN#yK^|z5$rB7_You5OB|R z;Y|`QZMT(y^ZAAhjL|pRaw`K@aaOz^ca^MZ&4y&)65*U4WI*lehuu6q=adYRA2tDF zCl}|OY;NBW&YEv#E*zaD+#J&B)@MM6-ZLk17C3Z!u@9xErOVDZvGC#;{ktF14(dD( z<;#wp!m~qU20ePB;zf_Dt(MGu1DO$T2k>2G+sZFzpS9=sv-MJB2))-s^j`0&?1IjW z%1~wBhzu<{r{xrA6i(0wao$tbprH$Y$GGs(+KyN8ce?N+v>nqK+f5zY*nxjSA4b~_ z+BQ4)1HX2`*A)r}z6E>O_BYWOUyZKz{N2Ocq^f)VXz22XBW7q`2rUe;* zuI;5^j8V^;K>xO5#Y?j$6!T4IIUDl4_gt+@G^y*CF9MF8aU1n}n!-bdI@$=+zF)-q z3xxl|tO@9&i}Y=Xk6&Y{nv+mFtu+UBUgE7kE@pjZJ7WOttpC6+Vl573q_axy1;@_8 zoyB;^iS+I12d(gNx^;&my7LHIHu{P5i4>RKHO^l|919djALPXLhlU}$8ebmX{R8AB zWuHhd&dmi^{f}rnl|Ij8%OFk}fM4YCHUB1CUhBe_vu8&y9(5v=X|QJ|@jYqJ99pJhe4B8@GDR+y{zKMhImCeq^!-|sIkEQ%n5RrJ$(|5t#x5<-WQ&?V|e0yNw?MuY9CjZ@j4rM%Za)5 zcv@eqd}&Q_o8P-DIJ93nU;7opviH8CyAn3ntZ~-nT6|o@=30DiOAqoXdf8mNpff$2 zp8tkTo0Ee?yoZYm`{$>M3;h<_N~_;|T$7GZjq6o#LtH-=9eGt7VAs{6bJQ06f$w|K zJ8BQc^uv$5Yp%%RoCQviY5A3KXcN@ds12r%+Ae>|$qMqZyO#aS;OwrIjqC69qCL8U zZ@XxV^xfi*WbLZQvoQ542K~qRraqgEleV%0crWdw`eL~;(g2@LNq=Wc_-$ z^r^g=189Fte(@XIt>1CXD4=gN-`rL_xczhTqdm8NC*oJioIl?Lk6>I#d#`LcZ=B_1 z2fdV)u%B47!uK`AqqA~k51_Xmv~8gHMO~NwUh2Q;m;2x+2=`TVKxhxy=i~G>IJVzU zTv{)uxRnm8ub)I;KRIiH^vv#orsMsDv3sEB+vixLxDx-BvnE_-(_GS?>-SA4JjuBB zW+PM2Z^B>t*z!_3cRA}O>^I6!?c<58I|6>|?rYg6DV&`hFX=wdj(e7Lb8ZZMODD_H52GVG#kRA}ZY`DM<_Xf#T1-1p zOx=PfR`$?4lDXsXvwA0&{Yd6!^TE5&x2F*Hz?fv} zrtU?gSL@D{7F)i})B*I<9_7on4OcRj74CpYUC;S6_N{oq87|$+u}M0hk&UbT+cIPQ ztP7L6Ksj=!jJ*eBIX2FUvYQfZ?kLi^8r!8cKCnHipVt%vN7`I$al0nhhFQ$})Zr7_ zrrtCGy=2?m5NA{0rt7~+S~PZKd3FsvL)O2_H#=@ZyUH3n$It5=Kff%$>)_RK_yt~1 zb$-j_H`V!Rd_Jl-7vraXEAnLZ<|4t24XNF=db9bYh~C6b33`+7jyE4p*PHG>!Yj=I z8}F5c3A>;6Wq-~u&$D{7ZIIJtgt31ldh@%)tMH^ZKg+xHW~oh^(h`X`Rd2euip>Gd zPiTxi=*?(cl_#gh^;jgX`Mle)Z>tj-ANM+ODc_?y(T<~Dqx(QC}n@O=&SD@CuVjc6txv=Q>(OP!Nmn@V`E zQuh+=MbK;DSiMGER<9{7(phf|#s*c294&@se+AA44kvk4H&TxC=kbBm!T}-~t)I8-2*-JZ~67GNy?iszY$2#s(xU^%~U^ZN(S9#b?9`qjIopGlh zCMaBNWoK6pq3op_hIP-QJvaxyx9+~4zUY6^zGu5Rnr5}{xvSqQX5SKJVaF^f2aWS< zjZhpK>5}EhU349?_W5vj<3qZ$w2gf===S5O=ZX90lrHRGr(@9-qm?dfN$FVGnxPMF zb?xWS>pfVvRDiCGfes2krBP2a`4gak@PRd>>?O57svm_D``h zMnNYTmp--iwmE5AJfg6QBen%JZp;FCmu^AEx;Z~lHj$l|O|#(!L7#5J**%?vlSNwJ zQCf(*nzSnYTM6r}yRV}EANF2H`!0jsKA`xG-77SPNuS}X;A_8x=ILZxEyt#i{h~P+ z>4azSmwo7T0_|_}EXvsT`-ykVfMj3A-j%~QTaQak%MYP-_VY&)I-$6)ub0i>*>;Lw z%1rh0JK(F_!Z=dsCx}Na@}qZ|4rD6BwhICLUQ^ z1=+WHsgH~M5v8>cvXA^Hb%HB5`XMepUtTrBrM&2eM05hU@mUd_ARRF)O(zURC*0J% z3t6^tQ`V}V^OZMjL)FdI8)v%xWYqZ^^qqQ+U3u}ECugSYC!^kvS6&p}-w7{=vaMsv$yeX*V2BMqbZZe`8R9b>yABU)c=;|t}DoQzeR zl((VnC=iYOyuLnFe&}nHTX^7P-X+W0ORYA#ul$e?+delZWm#p>=Es?Z-v_)#%fFKD zJ5*N9gs-*(S^GccLaiLq=BQ7uK0~w*g#K%f?x9^Br_X?`LqE#N9^tG0tK9#tuvEU$ za;Gl*R^L?*bO-vALnpLR_LY9T`!dq?%*vq?EKgR>oIqdXcFqpAVM}(}^o=tvLVKpO zU=)9uAKN+$dWE+JJlW0uoQzw$bcWXX#C87632lBK663u~4eNO|=4IDVtB=Q+&mPie z>k4B%$RX_|dGdARYf3wHBbT<)(rc~oKu^z_1GRbEL{B?M`)}!$mqdOvA5H$AMegi3 z@`SEuKgiJbwR}_ga1XdEbKkzTDNbb9z{kgU7tR;>wdIQZ+z#C*fm8R;M%D|EKik)& z{%ik8DY%;3mwcw2$$%|s^?TU}J08baUB`;Dl0^UNr_k-CF2JwU@vi~Ek^U9^$qt?I zru?CAIM0}MV^d3#chupxhcxS~@|5)j8&lV&+ceYuYRquF(hLs{88al!>dQ~T|0)|^ zat}b5EBlcB9@f1bnJ+^W$Km*be(oBU?Pv-D^A?#0^4n#{`_K~`hqwQhFm=vc*cYOEd2*O9HLNT9gZz*==_GWn z-AkJ`Ugzu->dW83Rb5Hx3;yVRDRZRA$o`S}?`t`kG)i7%pZrC6qW)ODhwKi(&(=r2 z<;Ku0BTdUc6gDvD6?B;M7=PNxx)SQHXf;MFzubQK!H0tZx5!-F$@|gvn?z;q5paXd zg?%DFQdra@<*9@BwKlv6Z=>x3ZGmh+wFN7%H?*$pe(*I0r@f8A29$o$nVibkXYjZ4 z5S#&}vao*GoXX>3`C+eOKcJKFql}m{vHGtl+?y(R!HB8aFQ9z^8k4j7OYH|?JWd$0 z_cb3k2L32t>L0my-FT`}K4^K#BgR9x67%vp9|H+NhJoT^Wg zV|Pze9s z*KR+581i)%c#<>P$OEehN8@sde3QRX@+WUmf7;3xjnCOUs=WgK2W!8)?adi#ghO08 zejYZ5@p-k?igN(rsm^I!Z#QkW<`TckH_LPU(GO9c-QI=HAB_KA^s{ulc(#|gQsxz! zrEC4ZOmw*I523@uSu4+gpMEZZ%|B^>Eu=e=f6YJHIV#HkCHa$H^uKO)*e}p=|g7m9R*M3r+qoTeb zadKYFFupT>5g*$9HE3nCD!-g{)tz%=~v$$rdX$Esx-D zZLxmvi+2B_w*KHt2#aW5)-OpTt}>wAL;{&hAtA()B&aA9;~( z(mem)_+A+E_YewSb(8co2w(E+)1$d+yH^GNSIf`KzVi4RY=!hW$7{iHD3uGsxL~jC66eLRcL@0fc6|b5Z;anJUMQW<{=1(Z&^*OZ z^r{=jv}K6QiO+TnhdO`_jm*tN=M7`srY~po)Str2~p7zbnmwMd0te zQZh4~JQ3eDPM$uiv|Iz<)!rj7*6%v!w?ux|IX|5nsJRBK|E3}z@|%jEc-K4(o=|tc zOFk9$4US&?v1`P?>-4j5G=C+1mrwcZERpV)emSvQJlR>Ia`+H)p4^dKoScu32y7g|fe#IFX}!m9EQ47xkJxogGtJK)Jf|AL{$MoSD==jI|;+)B)A4 z8qrb@a(XCF8gIjoIw2eGD)~_tax||}JOn;qLs>m~Q+HNE?irINKRYin2WANWBF7)y zQ|$C5@BN?=7BB>Ww%U^Xua_`T^uzu8uV)>!VE&t<#yWc== zL!Ibp>%_^Fvpd(KZB*7TrAM?rP5pm6woKaXUCzp*WDnk*qcD-Z&<WS5fu1+8W z18tnYBTn(d@q|4Man}C`KOXWuwEI)!TmBj+P~Fp*L4)cry76`B_u$g^BQYOJTj|#u zpy#Bgb?5U+__%x{>khG-+o4lFmv6ig*o~zGy_e8=ly$S_9o1G^U5G3rH#?xU<1CaL zb1|;$sUuF-hjwq1KRi&`CH%eqk$t_`>p!b=icf}L=t*Qsa`-i9_aawq#q3egcsccA zSK=HK@FcGz8UF`Q^6J)?(H^3|)E=G>|7QEK4tK7}EXv2V|NSk!x4tS~f zZJW=ye^Fwc8F3+pD#M?M23Z`@PqKl|Ms^?7H!r)Pj!sIf`9;4r&$MMMJMYKf2K}w@ zo)qmU7oPBfTu=JD8-pEY>j?26UkimRxgovIKIJ>|yn^ouyBmFCc}N{l_%>~{pNaG$ z%MU9Y>`t9OqV>5U&a-@+RrcB2I#e@9PCU;2BlgBi@oV44u$Jgp);$clo z_Xu#E{S-M5f^xDp5bbJc^UqWqwD}s(Im5RJyL&iYXzf+_a5*@E57y4My3y-;U%xLD z4)r^#8+Cq@)mhZpbL8JAlznmxx+|f3&~5NwwD8EYl@Vlz`OXBt{)p}gW7w}J>Lzx- zt(zm-H`}_&m|@%;I9}mUm(`c;$vYh^co&(c-zfXNCv$JHmbWQ8Yrj)&w$DRb^b0%p zk1WNLeICv;fmxeNQW}O5UZI~a zOo^ZJo~!t&Yc_slPBi^O{K%f-Pv=pa;tf2SeL>3uK3;{bwFt7c?E5vmBS)9xuRb_s zx;2z3^7h(nZ|7a7v{Fysy8H0^6pHXq$W1&|zt}zp{L^`1I){$FU3(AkrDt>&9d>$q zn1@KiKACr|<6&<8?i1MancedCb-pii z9cP4LLoCPMSrH%9zOr~w`y}z&o^dg#dxIU{W~~qN=_}&X@t=-8Hyyi(^VY;OY>1WT z51a5gbU*u8=G(NzXU*?=#P72r9Oj8_JG+sv>^%7+N!|Q@KVLvQG9Ue6&%pToKU_aW zHoV%pSS;2uk-QXU`@X5OUlMoo2}g4njie#GtNd~ZC%|98udnzf+#=Ib6>xbM?pqP~ zGrTJwAw3UzKk2VJzK1+o9Y&rvp{Fe_XOz_cRdb;9vEtY)gl+9R`bW~Eg{)7b{&y(6 zV8dlmA9hohZ}sJ9>Bx)pX&X9Sw&;Drr=ErJo)U1yo2Rj-c2e&(Pc6N&PGO9q-k?v^ zFRuu8Os2K8JeRTWcmhj{n}vq5C-P{#CJyz5RLn zuCT@#I+dTw;ZgFc^HY@um6N_b%s25|HF(?wA`+=@h#EzP=87P0rrmgwY5`O7jQl6-Fl?#zds-UPMdM&7wgE)mYnk@q=~_gf?HHIeuF$on0U z_q!tRAC0^}5PAP(|C*F16b4UYs zNGIO8cU$k>r=kF;wB6&4nR%%(lS+*lRBue{-Nsz@87k|;ynoS{zP~c&;ETq*`Fkqu zAB>rel9~Mq23eOe=5=Gn{uz84&FTGOX8H*+Q%5JJZDh=>IwfXyo*FanfVQD?;fBIk zY-4AiFd0~Ikd&6@Je_Gfl z_H1WvQ%=$5*!IprO(z%q)(qM3;=_@)zzUNFaP_~pW_g?X|4o#UF$D|+3Wzu}FAe=dBVxp2c@7yhmA zqS#+LFK8NH^rpFN!@-4b75+!;ozBaf{2Nrf0PB3FObS>Ol zct-5C&a;}%EP6Her_OVl&Mo>sbM}V+UAV7sY-~^G=%!PPUN)z1_@9NZ6rN^I*|2-z zONFCiyE;cU6%_4^wRX;KDlJ-W$~LTAxT5f8GiSqB7k;hqme^N1E1JrSR+;JzYZpFV zI5+l<&f2D$q9dt?28fYQySG-|xJ;>8_&h#h&i`Xw!W~ z&zO5R{9xfzh4;kPcQ!W7EBdy%bHjHRey8vbQ@`O`3!f}(h<&s3_NKa`b!N(jr3+gM z|10*{&Z$k;7yWna;m!{?-B9$1`Ot>XEqthOTI{jTnN72bzGzA|e0kxQ3U4wuZur8& zM+;}fKHvF~rs+k?Vv9Q`HC!pLGjYSB zg&!-tBKGmlE1N!0^g!(X&i6MJ7d4xr4GR}G6&6<4qT|gw_Thym2bYnFj7+4;gp-qu zWc>eITMU_T{&{mhP+C=8QC`qkTToVCQQBBh&`?o-M@9XR8RO>mHiyS3tFEf3X)GwK zt*NOfYpklRIV^H%b#-l-0-Rehx3+#k1ZQGZc|lEWV?ljISw+PpLQt7vR+UcLkZMs;cZEfpRk z(5esgol^>fE~Oibe@~I_6=jKx4(+x`KvUG28_>;T-#SNPTcMfH2eW zQ<7F&a7#sFL0x^-9i`NUs=9*G@^VDpr*%r=yVBp=98w=6fg|K|=GE9LCuG3tsv0Z) zy-mZNRdX6^DjG|wYN{Hms33P$M8i5XrAG@anTW$D{n%+6D=P}hE9R8Wt8S#?HdfTn zDJ`pbZ{%}J=U2_0H@Bd%zO<%cZdF4A8mC|$xjb4hQ+?%e)#j3dyH6>n;Hzp%rLRh= z>PmbeoN`IQDW^7^GPWSazpl2v5ua1b`R+m}sjjHGrLod}yf<1(s)GfkzVcmCP%*!( zqM{r*3#l%hTRRVBSvx0D8GTJIC~YhdcN$9PRunW=@$XnlSJ9QY5Da-l3s=soxlQ@A zFO+_H#r%-U856H~|A(%eRbZxA)Xu9ft0+0lr$c1o&>S@`sH3(e_$M&1 z`ilDc+WJchrqx$T$JCPfQe>dE9_d#z)mT|tqtXU0Eo+>ILSIl&r3(D+_1URWSW=oO z_(WZIJWTQP2?=FE%P?;)a?((63r%g!(PFf%Dk`d^w60E4)>!KWt%N`tk_sk)S5t9k z3Hd6ouBbOjaXEas`jj4y$tj9DslCbzT+XAFt(Jrp+*~*3XxT_G$JsL_E@pGYSe$=v za$v0yqOGm3pI0Xlb%LxC_hNHM@{!HMNR*>1N!G6*&n0D*6=ew&;C&67qUjt;WZ66{1fGBd;VuuBzu0%G}cW+u&1aL$ZM#TX6HdMj2!_u!e$C zMBXZGESX~w_qzI8HQQeF8cakrg>a;pdz<%5QxsHJl#&Ab|9W)Lb-}YirT#Xc*Z{$<}NR8os;$HCAxd z6xS>tu~sW4-yEWrvIQWXu22u;K$ky%??cC@hWpruGA z%R_bZ8Y)d)S!rE~v_VO=dJwLNk%D7WsR?R>HHN^UuitmU`KGvbUUhlR>1yQa)f=g* zrho|Z-NOA)P3g_mwBfb1X^o!j-Ds+6ZY6UC6|UKMFX@&AV3;B?hO;H@6aCHN%Y=Mm z3i*|LlW{>kh4z2)AM9rL8wp7o^txFy@fru8*htpiMa_Hib=^ElIE+i|AnDRC$Rx`LavR;7wPUA^Wd1Lo2T~!}?A(!#gLN5qTdp1*1P` zMlSuJIc4d!X4E~`o6%D~Y)*Y>x;d?Tx;cHyjb=>ajpmHSGt8MgXPUE?&N5?n&N64e zIm?_=ev>(OOot3d$xJso3qXNOG?f7f}70+OUlfJ-R0(@adXUs%3I9E_uOJG zsjM=WZmBYtjlRwN$Ew@Sf4+IUxqSW|rm*c!Q#59QdH>`ErnulPGco&abH$*$%?I|} zW3Fs%GLy0wnyY5sZ?3Mp-&`}g*-S22WIi}$k-2u+1LnH*i_MhEPniF@=M(1o$q$;T zZJ#pJvfIpu%Ga0=Fa5f?A$zTvUb)tMr1Noe<3mrF8TsqX%!%JLvns!7Zfg9NDcSce zGkfv3P3hwAn42&At|?pcT~j{3!&GeRFmu*^&)l;8DN~vAw5eMAw7K=*)8@8qou<00 z)68w%XlinPWNLT($kfgMvAI3}C#HVWPfWx1pP0si&1T-V&E}4w&zd`{pEdKJde$u1 z`mDKY{B!2+WzU&=);?$MZU3qH=;kfvzA-;DO_%-5EL`>rbN`s`tnU5{m zW**r08}sqH?Pl@J-74hZ2POsPyNY!Zt3gh;p{ieBlrBpEF0QwKEJiwe4*fgd35{%^H|pb^Ti2&H(#3g z5A)@R{$X0H-!jWv-!>}>-Z3l3zhhP{dB=PuFBbc1do1>~CGl8Wd(YVF(YdiTvwO$B zKA}%+?c_eO$LspVo>t`fHlw;9KM=W*^*kJsT^aa(cbWXcOS zAJ>N4hbtINShyzKCY%{USh#y|>u_)4#to%ha7%HUaeapoHf|BF6PG<48eAo=6}KIi zGXfmkeB3%5>)hi71;mAG!fnEJcLbmMn?L;i#T^!hX(%%d_vSW7ySSGlH52<6Op21$_3AsK zU{ZoobW3m(cR0GqA%%y;IW``RQ*@hf)Bot`I$e`QK>b@|Awp_r-w}X{4O~5AaR+fb zcRIS+yxS*|&a6oxi4K1(Vdw2~`1wivyoo+v6Z?+Ho9N>>8ec=4S`?BVr)BGGk{jWT zaFky0b?9yvKWn$#GqL~dL^kI`H{0b>_=|A&y!5Z9cd`%Tp=6n?OO=C0%7jme(&P|A z;#PWBz2f5El%#Enr^wJMX!+!6MJG8J_o}07mC>OGIY^f0;w)q!r94F^Ias#O(V>go zGqL}=BwZ&A0z8ZyO!(73&nL}`slMd+FqS6s+L?@dKKTUnaVx!(apkYOcn2l(nOaW_ zS&hg-DA$Q^IJ!E*uunt|vZg1*z{<^f5EglS)ouGs?4OX^%81-5{5`lO9zWk#1ZpD&5!_rf*Ld9&NaL(sXzcWJ((Q{47R zsfSArTMs8gcko0V%d#Pt2RDD9%h$f7E@@5G zn_JK)e2SEpcs6#3quZ9G+n-v_>!IUQgl->nn}<8PiSWoiw4bSTqbX-Tc{=55G)gQ^$c<-;phxUoK`&kDQ&A#}$4V*!v4vD`t zS?>#xOF-q(2d8}Yg(nk6JGyoLJN0x*LN1r}9Wf;$mzROx?(vUBE~~-c?(zQ>xoq=c z)EzF3vaek z!ry_L;_)Bi-9Ax$cu!Iv3coMqx!&V1^XQ~MSr?m3O&CB`?yqO&(wG z_DRuW(+<&NqLW;%ALHVAFLctkU1vDD3CZ}9{EZh7A7Dg26`%BN*O~8)PW+I*?K;cR z<=f2h?>)5h<3N|))9%CAmrV24WS!bZngM;9ZM@Lbo$ca17QG?4TjlZJO>c-FYjIo7 zap5Na5i7+@JIXPseFU|A$_>T`)^D7&kpI2+8^Ri zHu6$;nF~+6vQM;rZb_}5q<7j-)#<)Zv8!sWf+(UtRVpQG5F>p__4@!w4@gM3vN|Lgp?%!i@)?Gx46*hq)d z^G|u2gNLKplcX7nzv|oKi7uV0@dg$6+g^_OnE{4cGPo z7cS#ufo^G1S7bv67}0OyTVKk3$s|YjZh02I^nBh`|2m&{`Z%{H<&I4Cb>koL_7vSe zk$5NL?z!50YRBJ)_+2{L zhcnoImR?TCukAZc9314=_MH^}7To$dj&An5#;-CuG=A|Xq!gX*G^+v`dw3Z-YKwg8y{yFPXQ`#Qq8Wp7mx@)rs#< zfj_?1g*V@$BPWS+%9@=hCR=a!fq#$3e~fqgq}1C*htyleGa4PblLNZ+MEWnubkThY zDp>f_z+YGI@YlOol+VIYb<+EBi@+bxhHE{?((bMYf11Z<+}%AB`)^Iw&7~wB%6l?yx~EyM zk9wkf!zP*SnJxT#a667M4&krGz3K7aO>Tw11DC(h@!?qTrEAA~{C|aS**=VN;2u{KP*WZ{Sy+4`Vj% zqJ1Xz?@Y~eq2??Sc@~c1pN1R1#KpfzAN54_UUgE2gfE=M9)F*3^+emLZAtkVkJoy6 zb0~|R>SWrsrlxH&Y2#C*JQVi)rH<}jDUV4$j6q3RkF*^orR`AuCgaAo{PXdK@;K<@ zJ(x{^dKk-0&GQZh6ZquwEEL7B@_6cV|9t#G?=SITXq>@56Z=Q85B*JB3bs*@v6*sH4j{Tzpyk z6VWLiwYOs)bNFMDWq^UvH!|m)Lm4D(4$)16ZcwYETbHcE>r&~KQjhuM%T9Dlpj*1a z(Wy^lpXm5?d?x&8P05$&Hi5fkrK5|?%S8AwTYBygx`WX5{i>sj%&Trq@=^1ufD!(S zkLvFE|sbEo%TJn8Nx3IzuV)#n_LM0A@B#ScH!qI!++1?L|w<2Mn$1`C*vx8 zyvLGG$?sy1A89+2{Yu)-sGYMG{PHy}U+)&a%5?{Bk;jkN+mZ6=L>^MhM|Am=>*%#E zp7BXJiqxy2htw;Ze{c&PcXUmJW1pzq#>8+mKlgxN=kfoQaw_y;Oi#v{urIR;Qw>bz zPvunZX(GC5T~cnPn*h_~R_)F@E}qxZmW(UeZ(W+~w<@0XxG`KNsApS}kNcDHJViW! zk$6P654UNZqZ^ylPfe-1yDvJ5Pm%gRnmF2@baWaUuusZ5hiQkc$I_kqzU}BPOQthY z-lGp&-VcGh|2vLuyN`}GCdm)Fv(bLM^vtsFI{f@3{xR3f(5_YbFh(cynAVnS+%MUd zD=Nw7G~ASqe?I=uB-B za%5j6+Jq3l^1bw_W6QT_GEasB84hGPkl{dv0~rovIFR8$h65Q6WH^xFK!yVu4rDlx z;XsB184hGPkl{dv1OM-GAg{?yN8~lRq5ixkH}sv?enphgfljoP^=QX+Q!Ff$N z{(G+fb=%wWn)-OSumA1mf8CbCyruyj&hx+Ao6D2ebiDsP!T-AXi#)c7>&a{4o*DZ) z(EnTi}03`rlLh?L_@4+k6P`)}!EscopV@ zN5NBg3QKs8d%VEEx=w}Sr0i&Xj^Zgig{3E*&rv+#9Es0SJcSeZm(J%XUdXR-)A^i^ zr?`ce&gUqe;thD|e2(IUc!itJ=O~`SOXah^WS$HMG91WoAj5$S2QnPUa3I5h3m4)k(_$v;LfnnG2XNow+g5&e;Cg16ctMuQ`T)N-;~v0047`HhPTa3?UBG|kH$QIT z=inyBP1Y1#4ev{ED{$*^+xYe>zd6|^ekSe%xDRKWtV-M>Tzj^OW%V#wgL;_w6x@8= z3gDmfJGiHbUx=IB)5I$IZNjzj{&Rl!;c|MJ_#oT|aP_!lxVBy<*3R#C++T6oIiwLc zHi!K1dk^l@IVQFiw*}XQ%gQyeQ*wg&xBoXG6R#lslhT5{*Do9;LG>tH?K_9DXDjG}b8f$AzNm*@8 zO+^{s%BpJ{l8L#qzN)ceyeYY*qER8$l+MM^lGQZU!iM_Nnq(p@GCcAbv7k>>c}0Ca z=yO7G)iqWs^Ce~cZ;S+4no9jXf#kNK@wSrk()v5ANNGulD|>w>e~tCk6@0xTgzO_% z=$6_F(7c+`>Z)66D#}Y-8sT{wx65kh)|J**z^Agx(wbW;O719ydv#@{brghhnu1^A zlRu}Tri|2w+{~TVSTP^`G7=WP!PxSW1|qlNc{+zUug0OK1dS9PJ}neMW7XV>+BxN= z$h|ECq>8MEm~O2Vdu)<@AqF28os*&P&8EwLQZCC&8{tt6DYpzpJ`xNrn@j!!oeQhH z0>;;>{)K{6HV^;x&Qi&)3QggZ`5I}{c{9ayTi`Dt)=;Niv{kibjVb`-rncV7U)7w_ z^78ryS6dQ5I`8IGG?rDCfQf8YBq~3V&#k?q!Ub((uC1%6DXFfyL#3zei|19<0fN^= z?7d*coT_R*c(|(OR@D@qSc!RcfD}9~+jRXS&i|&r=>Pi9X7hjZgV}i4R7lGEd1*f( z@abe*@keBvMGJd@-u@#IEpzYuH(9<`R@K&sf3@`sN_=4OWLh1nfKpPy9qM}{8odHl zLA`Hitg5+%yf!pe)R2j5tE*6@C1y5hwNdS~QQbW6mRsa*(&Je-h@ZKMPa2EU7~} z3Cbxb^Mx$xS5vPOAKESQ@(P!vL{dsnI%xJX^V_Vsjq}VOY54$e ztDwYhpNC*lnB^7bg)Eq3UM9$WUsaGhzNi12zNY{Czi$8AjMtF5B3SH#_PkT3>l=L$P#EU3*~HdR zQjPRil$+0IXPc$>O9IyMUztfS>*ul?%vP{A;~zImCWE?EF~rLx>h%>34Q78fwg0c# z^Q-30n_JR|UT&CM)zBcxnWwhnA5g!!MNHjlpfJ{6-^0+GOwbfhC(?M z?QcDf=KB^=?r*Ynqq$eCq>;iE`}XuCfmZlUbIye7QTp2+&*J}*@2MKN zVlX>%Y?E2yqjT&xuVBut`o0L){TY)p%YXh zZ@!85Q{9Sb`#!~b@Jan&wpRfmA1)^I>)b||*w9c)<46-(UQOzETAmg$@?{!=W^9t2l}nKq-i&4Y8R{HR{G4g9H+Gw z^{#D@2>hWpRqbu1bL*F6UVClyc5knZ7WIK+W>0U&Ec3}eRGVADUi6G={!<&N(phQ) z%(wbb*yX0Z4|)Rr$IbpbKxpey(EB>Xl%?$v_W!ZZ;n@E&)Y~W}8i6+>>|fH?vj4yP zqRL*B@7A9r*}tZ*Xa7397d@kxHvOMsZEM&6O|PZ0|5tqvW&ewP55xZ7_9-*3^+{*{ zvc7@+-|3sq{%89}+5d~auzy$IXwh%$xjJ~AY# z(CBwnn8*9r2Gu+br);B}f(^IL@B5i7@N({~n$su?)V$FzZraDd`?l*T780rk%PVv9 z)BY+Teer_0wLewb*312msW1gF|6nnwnBJ^sZ3-ZWb|08R3JC6x#(!k?RHi%ZO@ zH!nar1%*DT%zQCM6ZF$qAn~;|s6?|gYfcrF#(XvF7W0XCWobhtilM~3Mr-or>_k)j z>+HGacRlLNKY9jcboOd6-|H_uSYm$Fe;!TZc^4k4+79%;0}G`VwX%AEtgjNZ8!h^L zjD4#%%^q1TuzXAI;sINFcE)GtcV{h)=ReeIQ?J$@+vE95do9bZn~>i+tbBXcx~!)7 z=xwpZC$7!z&R!K?ADfb2-ITSj*S21pvhg1MP!>3RtlJdZ9IJaMwk-BgY+u&CtakqL z_r*bJ>NjOkt`BBUEPqSclKNq+ZWr{Gk;lD{=wY*Me!*+vbuUM&T7k9*W=Bs?(Ehc$_s8u7GbW> zYKrAgUlebPZHuq%xi9;vtnIP@AL5JOC3DT!!tcR$HRG7JOB9}ZuIaH4{y1~`LFcw!O0G8_wYT} zI{3#PZuRibJluGl^WPo(Z*p)9DHXpb&UWxg9`5$=*&d!$>ijSF@MaHB4e-s*zuLp= z=Qy~@!;5cq@aH|erP{$?_wcy64t^%!*EslR9$xF=-+Q>T*7@)E@Sxir9M5z4+3ev# z9v)Qh{Ll38V;;WR!?PQl{|z1 zg;C7r)`0&x2Y=MV4?XPQr5>L7h=ZT-@bqO4{-K8#d-w$pZ~cPv-|gYnFFN>55AR&= z;Qq(^`tr1chk1DOGY&r2!mMAv#KZgl=-@AU*z9ufcRf7Y!_Nlz z73cq=hu3vE_x`!_z(dvjCsq{Qv0TNhdnE%fp)nI=I`z z%Z5AHoaFLbH^RZkd$?_+gGYOK)hQ0X(8D`Vb?_v?SZBM>aPWsb{MWM_e6xr1&T(+9 z;NB>TP6vO~!`UAGl;A$bo`(xPJlMmNJbbo?CwsWi!&5wborkA;_$Cj}_Hez2OFbNe73KQpp9kLo%S^%s4x&t$KOKEQ!~ zwxv$SAN3b~u;*moi9W!A9`@Qt@U;>DCf*C2m;EpKJ}n~OlIPRXL;g)L-iVT zZv_{2y7oZ&R&Z3`3XbYq!BKrHII3?2&-UR--wHmGzO5UaDi05*!E1pf4>zUh+rAe# zULEY=_z~d1kELnl8TA)GLw`>FJMlBXfqqb0c}D$3ANqgl4~jm(fxb?K$s<_h8TA)^ z=r5}ODEa^kU*$Ogr$?~pqyC}~{Y&*XMIT_{A5I>E|1a<_z=fxTmx2KBdj17%}CI0Kv;4h`YkEg+} zq`~i`!QVsvqWL#DsW911(SNZasq%h$8hiop;pDyUQYQ-^?&-=qzzSdG-HIIO5iEI$ z`b%EI_=CnHBrgFLzUa$wdIXC;>M!~*UZL>|(Fa)gqMxo89{q?u>M!~*zM=6B(Fa)g zq93Oh9{q?u>M!~*9-{FP(Fa)gqHod*kA6fS^%s2@Khb!K=mRW#(aY%(Ec&Rw=)-u6 z#$QAqVBw2)8%~d4(MSD7AI4`iUL*Pd3t#k$WwY=I7JbxT^anrU{8&oj^6%k5KbCr+ zC(s9c!J;2C)A>CV+D{J$`uS<}0YA{U-sI?ahx~gu(67=9kA9T?fG=3_Pn_-iG#;h= zCt&=Q|MfUM!WVtiU-aFxou9_9L?2+`i+&1Dk6_V9{Y4+fw=~`*`Tz@G^y&6Y@K^up zwCrU6O8Dja=b!tBB?LVEKzSUoSlR5q;EO^kIBdr{LA&vKeM#1ryPV&f zzWf3#e8rzmAN3b~n6J?Mh4>%fK%Y+-dIT%}sDHUW`sd-a`tnp7{NfSn&-%Mv*!QF7 z6@P#gw9?Na2>a+q@kjk_`u+Th=38v~JsjxE9eFbS5r5H#`54X5h(5r9K3#uD{Y5{M zo5_T`#mi5C13k-f?IT#}kNS%~%>QUUNbv_)_{#qjOP%C@)L-;rzDV;&q7QJOUzF_v z5Ulv4{-O`_OPX&IeSn3p_|xs_sK4mLe3a&=L?7Tl-=r5F{V4vZzv#pKmFBZVA7J4t zemOmYMIZGSeVFgk{FmqhEPT;!!|4$$`l!F?!~B@$%S0bw;fsC`PLE*GNBu<~=F>F4 zCi(yiU-aqqC-`f8UG`uYUl)G4{`u$PVX5s=NgCV$e7N>#%4b|!_jq{>a7fPGwLt;%RcA)H2-M% z>ES@1ULOO#{6!z;CpBLw`Tz&|^zw-MmkY^1KThNKzBD*C{P6s5d)TGFp0ZW^0S@u6 z_u&f`|Dyg%f0$3z{Ho{!EPV0rU>beYU-V)ARr9f;4{)F#mqs7;7k!wo)%>mK103il zrQ6dq(DIWLeVE_XeDD9$+?B^yQDo~IHpM{}MN||BE)ZD~_lJ)>2OS_F5{Q6AVdfHY zLkNTW$>gvv^bHHZ|IrP6#@J%`R-_1~EmFnjiW9G~DGv(m(|C90m zWz^4@`SSXk@&GdFtp{CS?yER7OyEgju7BA~r9UmDub^?#!4z)v#$G3C&|_EBR|@&w`f084nF_?9RE+p`7^fp^c@r%FzPqu;3uw9vj5iO2V>^<5%rsL@Mo-6 zeEk0&^)qIE3+&K_AJlKk!RP<)j_=#(j4E6!wGe&;!`I-WQ zZ_2@+rTMTY0G~1PgD=M)Qw~1c8^Hbme8$Y*L1kbAM*XH7e6~-3y#n}*kstMszz%Kr z0pFB^&-M(kZvdY$@`Ep*=cXKdwts*<1o(`Zk20_UqkdBkKHE#cegb^P$PaD}?9hfE z@J%`RY+nI;3-B2uKlno^VFL!=l!MRq7_iR(pE2@-KST6iQw~1cZ@``de8$YTDmLmj z7GGoL%kgWCAqSuBLtrlgK4a#0rMj^JCkr|FY)=CF67U%#KhA$Xc4)&7 z_@*3uwm*SA3iynXAN*OAumOW_%E4!Q71*zU&lvf^-%SY{F!-h%{KMOn4E8SIGe&;! z<@ZTb4nEt%z&-|i#>|)f-;{&T_A{`j0iQAR=a3HAfT6!BxAgy1$zXqD>8~;K<@Gyk z$iZj(9N6oC&zSkUu|pevP`@b$pY3^I-vd5lq-+}ok+jk&;0DtthUp)V+ zG;+pLWNAp)Yd#vgQ|Wq&@<1QPtj}_BKbmr!58ETbJ_&rr% zu)hMIG4tP1)!X`;a`4$ctBvL}W+hh;=lV@K^k;iA*q7n_88g33@J%`RHNI5!WAzvKjF~U%H|5}W*Zi$of5yz0_p>Pn ze~#ua*7Y+E$2aBRv;7?G>7YMj=F976%FXL{PF$~>VngrW)`Y$8-^=%__Pa&v&zS2E zi1s(-&_7%A@6+waI2_-UgU|MYuph+vGiJU#e^YLr|73B#D+DeNbN+|5{`c$iXUz4> z`HU%t{%qd}dq?QcnEAD_LmPgQg&cgghlG73_>8f83#C4kumOW_%E9k*NXcMN2|i6ZHp;^3nc@LVr^Z{n@@1 z_O9SFrd`kLXUa|eyWSM4f04jr2z%+j?ucr?^Sb{t=KA}H??I*<`m;SQ>~o<%W9FC8 zd0+!h7IN^}ei!z<;4?;kv>%!GS{pFmulo;U=4T82O*!~%FAV!()X$jt zvj3QJv;994?Oo~S(Cblyuvh!n{XywpMirud#$5k(*r5$SIDbWQL<))!DkFP>hE8f{?G;tz9|R)$ay8B*8_{snE97u zhc^6xZ_2@EdwJN;qkhK7kNV@P&>z}>!8hgLvwc16?ZIb^{NTS+iT=gU=ZG!I$WZI;{03(JETKQ=ha7xf zKY;ZF;4@}^8Rf$U4E;?x_`Kc#>kq(ZjQr4F&RlMIf%zQb1nDPKJ>Frgj zEWm(%Hw*j)VXylyTd$93tG}l*=KAINn{wzMTT`|FAkAmYe0lz+9Q-`Zzh3hhGhfdC zOgZ?&YpMFlPqL9882sH= zDSj)>XAC)AGT#VF*nq(|<>064^(OMkt72>DTe3o-t4e#ou*>#OTu zpT;SxevO%*Eyk}Ch8+Cf4HSPX?Ss#l`H9$}4L{J|l!MRfo3P#qe8$KR{pI&WQw~0_ zhr;?O@EJ2-_CJ@_9r40RHH0t>}Lz1U?t0KbAC7?NO(i(uXnYbBkzCQ;zfD z^;}rrh4W#|e0e^m+|)m*N$CAlB=9K0UiZ@~y`Jn=tv_R~|A=lMU|dgA4*hxk8P=mg zf5ym<>nZg&<);2yg}&zmuGiFC|K)o9+aT0Ol``h~Tk+T z{c)LV#nh(1s_#>Agq`^l=4-$_AH)0snCAzW&j9m$#SdJA{(rbe^)H+swb!cl#rgu^+cn1e0^klBW4#s1k)v5XpHp;z|%CwdIaF*8e{zwaGtIY_Eo5l?WeF_0rE9EKh`S%@75UO zA8;RXp+qzv)^7k$)a7A41MnH0AL|)_uhaSQy%6>B_dt9<1Lp5zu$Kg8dq~(z0JA*= zzSjct_gH*C1?KOgu$Kd7dpLZb0Os!x_}&B@JfyBC{+|uZ|F4FL|6Qo|Ow%GzN7I=-o+XOx+@Q(uj zN8l@~TlLdjueQ4cP8K*I@Gya25O}`8TLu0~;4=c(y&_b{u=L$g0r7r3^-*9+W8;5dQf1#T^HlEB>s?kn&hfrkh@ zTHsQFrwBY#;JFG@lc;T}z-tBmSm6Bv9~1bDz?Eripvvs}t`_)ah3)&bxxjY`+)?1( z0uL6rMBtYMeqG=d0&f+VoOp%wr_%zT7r5G$q4{eHTuB6r2UOiBStIh61$ zpGc`Mr3^{~D2=5wm{K~W_LQEd^dhCdP)eiJjnb2p$o;YJSxT^5#vGtCrCdsRl%An9 zgwl9QqbWT>sRO0wD2<~uiqaTLMU?tcDyH->r68pdlm=1Crj$%+5~U{D-H}WCt?N^mNCtEHGFXXe8^JsT)-mY7fdp$T~rM+<8SZ!x?(z9GRfvy^!pp_Rp zLDa4=$-OQd(|NdTRRS-!t^Q08_p5LjZR_uL-D-*9y_I}PD(826K^WVYgAc%ApPf5P zxovf@r~6i0tR4F~?rdEyS^ebb+HuKhyUTSu*Rw_BikO_x+FnNqWRd^nL22P!uyRrC zP}Rc)tIVPuvTC<|{&2olS)Lw=$5qaJA-}6|t1i8&dK|MIva+*AFMp~m(_U3WA)l~) zUy?`fj0|$#T#z9>rE=LW*Q+eJ@J&^~-X^63OTR7A7ltb5y!w`Qxj1#@2uoGHn%i8v zWp&Yox6TN&S`^a0Y9QICR5@IE3|w z^MmTwZczErqM`j{(b#&h=zZmpUjxf4EEmF$5G`Zp{ht0+$%p<0qZU{$_8pJ(p&s|$ zK^)8@cHD=8pbn}4so^?%27Y;s2gfJi@$dK1nT?dz7ynw1m58$ zIQj>L>fl`p>tOAwP$D{X1BYHgds+b`(#gZI5%58UT~N_R)P6_^1`J>-9)%?&b)1L{ zIs$_kp2Nx{gF2Xz8+0HE4igeV+zK5W!whgC<9Jv>G*o;GyFj|oh-kuCN9E9^go&Qv z6`(^MQ{xdArjGH@qk^wced^+Ks23UytOloFD>Mp+tg%C+P)q@CKONCi9W{wU z@C=N})(}j=3vfc#Ku1pNv$7$yJjY`ordtC&I(|@YpfH>K+LPO9D_n;;UF?^iJIIbi z!)bNGr z>}#8<@0V*Hra%SSfw(f9=KEBn}AbmNqg?ZH9H;ckb zdlwDtG=%8W)lKSrKQM**^8D7$r02C%CcVr)CV;dRiqH~ARfN zup7-*OyAl(5b+}bSt*i-{pCS@T|yictv;WlQ?}De=>PimwhM4ROL$#%ui3U;IfhAV zQY}tTb$vDVdk!A%-sSz;?#|~vqB<^jWV&qXfY-+!H#w3cPT%8ep`OBl40IuC0%}3( zJnCR11-kQCU;k7jIW_+V$&=|-e z<Yi@5xR*)CO(L(YtxY{Y@J$QmZ&Fx<{=}Oqq41*CScU@ z2Xb?$aqJ46V+lPdTR}n~qbT8#j6C|9Lo>mwjDm!2_?VWQ5lp~jvLFE?e`dZFYRPK1 zf`o$n^aNk%dwzVnufoOkEzHUeB>br}h1P0M5#0(B@(XiRP4R)O{0bKfEv1t2G_i9{ zUZbkP=P3L8Yyv|+I{WC(6@ABv>+?Ik=2FQ>&f4nH#%l-9RU$b>)qQgdgL#F)gzT)o zHa9KKv&8t^+b(_?EQPFFRXy0FR3xON$Q1~EJBU&TSy<$1WFib=R=O2c77^bHqSVBr zyvUU?uBkDE(<>J#7NuSnF1kW0st3WP(~HZCTp4~%cU~=`)W)m8$kh=qA5rS!DlKwF z!u(e^N`=Cf8o6TnO+x)kD@t`lS&=I-C@m)|uP_@g{?6NMwD*0uLL*m;`<^|bqW)mr0cM86C9dHp8@gdoc@25AEk<31xBNn z`dD$Pl;YB&(MZ30Un-UC;wqq%{lA_ll`+bxs1}$BUkWW$ITg@Ceam!3`HoVju%$vn z-!J=Xtf7e5Q_1v>ZDs4yF|s4CI?6}!wtW=_}qgeA%+HEmJ#f>aeBXLr0e8{_&oa%QiiJ`%^tZBXHR)j(@FyyJ}@;l zX5zMAP8Z*{Ds}DBe_iXJ`tj2&?w&!Pz zJ6JX4)X*W#)1Ik!yvYX%FWueb-DMp|O|Sj$2Z#JH`ray^|Dnm*)~Cw;`S!?v6utIF zabA}hd!LwceD@n;Hx5|1GRuE+>w_=He7^TY-0X8be{FSRTwJvsKVH@=@#Kd3Cr2FZ zIJxrm{dRSZ8QE@f(`i$(+OPgLe&f7))u&I-%jn-}?%8oAxt~vOw64pOlkd%)aD2?V zn3oPbo-+LJyL$K9pOafB{k!Z}-tN`E*|X>Ce7Z8L_{ZAgnml*3Y2Kv&^mw!0#+pM$ z9~+%H^pOAQWyS4#rPfJFT`)Xz?U^x;zFxQ1wCq~>Q`$7#Qmg)~N|`%+Nd<8mi(B3D za?6L?y*jOK%b)-F-o7_i9f{kJUhCfzpZ>Y+hV0tLvXiS*-fj8K;zsK}%P$?j|B=%-{1g*^ zW!<}aP1qSYv@qt=YBN8af3V$m?_Y7QVP50lqlv+?w);wB7oENTr_DuKFTT-i#Y2bk zXT0)#e1i{?n%;AJO!pf7H$IlU=ghd#YyNfj=bKur?vs7{z1^Bmd+n<7SGIid@&0Ev zeAY90>fg#cewBHA{E!-7?;CgY?Ny^wKFb-laQmZgeH^oP`{sT%yKhX(e7o7$y*J(W zzva7juA4Ep?STm^Dh*h?a_>KK<5`)Z7i<_FGeB*Y@oLD|Jb&`s?tr;ZKa&`~HLu<6F#2`mX2Rtg`LZ zyVm(Qvu*1CRk`y(%_TE)N(Y`=eCN)T>XW~@7(ZJ1{C4Ym+}&;Ffc&fGeAGJeXzoo( zrBn7CS@!JOcYCHE>(%w5`bS&;?2J**Z*K5ajq=027qx3WWaS%c691Ibsp(g5jy(Kf zPLr3P?b&>1kH($PzS?lhHKmWGwY%xMxy4JjpQ*oY`jVy9a^7iDIJe)Nx&QNG|KTlP zcxg`a3F({OoizV}^;=v1FtX{U*YfU}lHK&t)*Bbhn$loE%<`*~9&B}er4|!joD}2x zdvb%oyjdk(IuGmAzQretcco0I*?f9#tA~G_x%i{^C*Hlf?%)T<>^i=-LyHB&%Bwfr z{c@k`YfIbh8nva_j+{C-Paky6(q`qI-g;otw8}}3B&OXk`LsXln*K3!?#nM~II~f; zFXx?{HMb!C-{(7bySZR_;S)#xmi*3tUvi_n$kkp!uxSw9H2dN}0XX>nXRa z47A6hWoBkz<%^#F{F&JMWq@X2Woj?hQvTm_cNaH*{r!B_J9o~RGiT1soO9;P%%w^V ze&T`PO_B0qplUb}9u_HtB81oz!2b&orq&OPIBZn3%=>g&o;YlzbR|1tkjb5Wi#t~g zGSONkJId+F?jGRI*WM{dA4?aNgorOXxeL7+;)Z_FiOe!P>alcpw$tC8&F@kxv`HpJ z*!#MnqLUkH@B7+OX^=`Ked#w*K2b*L{^^+sdLbm>9q^miPKshbA?hYd(bpnG8{~~~ zmla3R3jU47dwbxF;%fYtkC);}b!>Y&>7Sgx?AtHQr}__h`~JVSe%`1pM4G zX(xn#J1wor!+)cn6|gY;y#JDgC}lRzcBb5ba%Cu;33xS?>u-x++Q|7cmlQ8qkv3@d zve~yST0DD6THd1DZ!cbW%gFf)XWzVN(QQlVe4wcZP{FxIcUY(t38*~9^UlrVe{r7o zgw;|k_kUx}d_}gUzL5zj&*g~6>W11~$am_d_Z64R3KT^| zY^F7lhQK|dsJ;4R4sDB!zIkzyDn;q3#17)I^0H~o3J~SJr3Gb1evfT-mQ8KeE8=x9 z6IqI3A{yJP>p)a5N+X;#rmDY@Uk)6=_atsoG+H$j6csO5$cIu}5ljzft>g*g^7-cZcW|XoR)I0fqP$uQj_9&|ylS3z>jB8xTupX*A==cV9(avOc9&kU zXIAzc-&d~$-CC-Mn_GqbmO*{bhn9_gk4{s})VV`aN-FrTPqSAy#M)ixm`$QQOC85; zz&p2LP#CI0dMMq|AzJRV(?cC>@?|Eb0BSwHCw{FV}#7*5i%KbYD!ge6r_8|?ryjp zOwAIm?+4OXvBsz$(HV6>9fKlXl6O;3$5_Lss3a0C(Ih#}Ey*JTDXXJdRt==Wj&UV> z#0MSJaxb4c14i(KfAG28htJVy>aW^JE^JOj8@8jz>qZC{-t;S=? zKzbq0YttobkvFvZK>kcugN)Te0J3N#c$TbpbhJd8KaRjTXf=D0h-(~(9W z?%zkbTeXoprnwO_jYn>Wfppqrk)Z=AAU+Xu7h~@CY_i20WB$zM{u-l=x#v*Q+jkXI z9G@gFWYfBMbICb0uda=7oda@R8@G%b7x`y8b>o_wX5>^0CFtS0cEWWU@Wyt4V>UM} z8l1_qxyV=kn9Vi7Vb$3<5zUzR&t|;q!_1QF%*f_Nl#-BUe$5A5bRFD09ciAc2eN5p zLbiM)n+_yc<@Rhkmtf(y&_t75gXSitTkmEL`+&n3OyPmr+&n4DF_O_?JcVy#IP~55 zffQ_v3*5w#8lO$O6OGo13>s&53B~T>8TvYevJ$mohMp8fAkouJVn#MyPRx*lv&m|< z1lLDGWJ$u+KbxkQO|lnQG&5aDA|{)*nT=7gH_%-Hy4e(-)}HFj9b{-WT`^l^`)o2N znJu^3Fz({7PsqpHyH%jZLjrh+6)q*479^Qs7Ga3i0ks50eA&*Uilo@!Uk12E_QL>r zFUeeT7_S-)J7@&D+fm;|RDX^9#z2Vc$f4%)vUvPvG`BaQ&Mw+mKPk9Q42)XF=a@jr(w04 z_Ya^0olGT<0^AU2uRf&f2$eLg*(?1Ay!kb;RTVW;S$&*j1L)0f86m3cM|ij{7wQ@h zehd1h9tOxO!MnWqm^t+jpI0i2-1+URTfP&S_21buHNat^-Zy|2bT$Ue1AN&4dZ@E$ z$`~Y>YcEEf&MnZpk>9A(gw(hE*LY~C8GX^hK8!1%4W$(9*=iL8_cmdddpeD?0S0uC(ABO}6xt z!v@e6OL}5I02+h$HPseypGsL2wW-<7d={@#f7j!A9q?`~D&1NIeq ze-YmJfLL)H+^y<3tbXRHYMs4)IWh&4^Hbq z1F(WWxSZlcD>*^ki#_Ru`b?~o}E*o#Ov@PI|x#w1bAc=bDk`ZMzNexgU>bsuDt z_#i=jmdgU?yZ(i42DwpK3)eZ)aq8D-xE2<6zzXJ>n(mY0P%zJoep??4z{SoE5 z@b64i9|Wu%ze>z342F}Nr$y@b;2rLC0d?OPDR=ZIQ%ZWt9OTud!Ql5~4FsV;3wd4K znSlAaxZ`3#6Z6A~`QhWaZepKz3UIxi>p`Acz(Ln-N*t4}d9Do+Yy+-)!GoZU;00&g z=mu|MH+ZNIv0Y5e>joFO-QfGk-x^<%1*`^4J!Z#QW`wDk;-0obQF{VbkvH8vT@w^_ zJDS}vT2ym>!)SXo`=#1E>aM6Z%{}v>#qNW{PMC6V0+R(C5dV-^rQS#tFZ@D z?gPp|smz^eO zv<}9p4sHVrU~V`DJMvk)liHvLszrh+K&RdSu>tu`V%$UP(B@@e5UVt^qGVkv6`G^RqzRW9Z;crE+6v*dDcTCb$EVxGK5n3wkLy0} zNvt9@A2-N{kNp&qmMX7hQC6BwUe2NgX>fJ3Xmc7|-Bb)X*a6Me#Q;-S^bVW8Hb zOTW*euhPu2A&ai18G_CRgH4neMseL^oBf z-rX#BX3=}ytr@$3tT`h`4xvxt&?nRX(I+b4?mn5(+z7#lVxg|fB1;dGT$M#bdf4QW zELw)QxmmQOhdIB97kyZKjX^ngx5S}av=Aaf5#9rj z#i>~&)6->c7GZ^Esnj9l~8%s$H&^@Bg?W?q)yw;v0 zhuEQUJ2fvLNYIMNBExk4J(ITfv;_Rf__4IQley$PlFTC12rKn{oMs>9tSA2vCSV07 zpjO>|iZ)Ig+KKAV0B>jq=jIIHXFTvyMLp@wzwY#C9rlVhA7Kh!X>0U~lv!$}7vL-B z1f?~t)H)sD>@fdj)*(#&o-8`*i71p3F#nvqQoEgQOWc>J?gBCs zV59sH6NiVvAsz+q>|v~DVvyr-yjPN`Z&3NVg32AH<FnHFimH}65AqX!-ni(y^v;1SYLg<^@kZwT#u-oFS z=~%@KRO}G7^Gg8G!*8kgthO{F9x?IqV+i0JXZbfNt#9kY#0N?0OyGK%xCv=yVj!MQ zRK)I%dz1yJYY{XP$ln1b3|eNXPF27ee4#zL<$h|rG|KLiGzmS$5g!v!8{tv^8w<`5 z9~P=Qsae4Fvd|f6W+58SR&9owo~Pqbg{Xu03|I&hI7!RJrbv&sq0p17bJvj01O6*cCL0%)I%M9sN{4${*;et7# zZyRGvgzI4@1kqn7 z+6Q=J@w>WeO6A{+CZh`jR4VNfSztw`bC$cmO3_y%dZVznpGpH%jw?f7yOMy{SSD2N zBRg7{!+6|B5Wm((c0bh!oL+s&w$YHqR;e9cHPB%{Rfh>wuhZ?!g?h?e+(DfUSZDma zdepn{OYci_`mL4qedv6@boqH7GWDM+Pxhg;{VnpnKD4ucZp7<-#AEYT=CGGk&7Jdi zAG+4x5?I6@!AT3H4(Keu?n4CwtUbO1=KO^@u6gHjtCM5I3XK`Gsc4zvnv8f<(Xt#@ z1$y&>C%uMV9^jBS^`Rlz*>ZFrT9<8+J-gHH?AQ`au%ZcyYYNvrAxE2FEqS6=Tk6D@ z7O>{kv~h@4)5gWDg-0f1QM=^1-;VKgYsE68!pGJ`dY_w^V-4G?QZPhD-8 zFYG~~>M@};80JF|VB9QCch%@>f5^~0u>z+qyvm#RQU*ojSYs;ya_Yubc_qdSqq`7F zveLwy9-$3@mw&CREix*uFEeOMj#Yk=K}U0z$X7EcBiAPH%Ah&98SGWWu+=Oz2jS~)eFg0kQaNUph`Gs~DmrjAzPJw{u&%`uE>D7Q0&9u8_ zZMD0+LNAU8Rd@T+m?KPAuV3Be#ulnnrbZn?uw(m_B zh8prifK?Q1cYOerqK&Lnr53tk^Q<9=BYG%njD!l8#QXfv8-y9*uJNy4G-{Y(LaJ{O zgK%BKT$*q2DS|;f-{>xKo@c!g4H*IkJp-EsYV@UH!qT)C9T;YopJRXwGh0q@DGNkk zg+OiY(k;l-W-pJ4bm4lp7g>f|{c#-2nR2$<{%BHwK-l9Y6J?5FiCSSIyfR*e$$h# zjmR|_fY5~X24bJhL5irZ)Xk`B>M5!P+^crIsBolF>U+`3kw)Wx(7GlVOvc1ysjke6 zt73ijS5MkK(r9@JU-$pNR+9JPA zr+_gF3_VbC-gyj@3mC`D!}tAM=p>ES+-4nzMdP2cm?YKZtrE zd#}o=_*JPr>kGrm+dCa9#>raLvu&(R)~3^mu||0;ozCM?gUSmm^0job6<7_sx%eNb zALD=C1`J^|YiT+yEWn6Krws*#GAW%d6l5FLGNM-}FtekS>IASiZnexvr=#P{StA%@ zFJ{Qv8@T*fS3AfT=F8j4K@g7ofT znRNW-?ol80z{?WU0i|4nbUD1kRTMrxN$%)D8RN~N?_f`%2pU}2h5B0$nls)cf9gT& z#+&7=G}<}dq^zV5$H#_FM|{g!HeMV4_x7NLg$BB3i(Wq3gCZtm$ig0!Kfz*K!j)kv z!((yHH|JK1prD6~Fx5wKKBhN&GV@*#)kRD6YDo{;HoGAOeLot}{B zw@2txNjI@~@G{^OW!PN_Jt%jgS{WlS!Up+b8}-JU}~UxKg03>`!H{Xv&I7(3Yel-I|0@-6m&|>3i?XF5Jdn?PLo6C1#G5BhrdQ`z8usf}sdTV$^plT`hQv;9qsdaz0 zIQ~vU&zof1?qrxYD)cCZ4#%s@b+rHq$v|X^}k^0#-e|^48pS2;sXlIyfyY z=gUBq_n@^_{|v5^VwZCixqOvUTL%d!sFE3Im?&INfSOY`vAJ#>OaoNTQ8?F>Mz-l$ zCHuG{777b)DhmwKW}*BXsBUH$3+3mbnT>BEjLR?G z)%zF*Vbwz>`lg|oPF+-0`3|L)7sc}cLv+Q}Fwu@iO>Tp(kJ1D-GmS1!UnvXSl3AEW z8w#^!avGf|%+Gj$31Y$pLj^SHu%^%j@AUYDd&DQH>PJ^v9GVMRHXR#ZGn%*86joj7 zMx$m}CDz$1XB6sx!%p8J>?={-j1GpM@RAH`>O@8mtfIgM)2}uPEs71owiDKh)j!)P zy~rkOY;^iqhU}I`TZ=~d9YQhcez>Efd#KV@Zm~JCLzQUiRvf6`3&<`F`go*#!$t+g z7J09YRu&u0mB{w4uy>TraEDW%;d2-JspkQE#76szGh~sCF5vNwjVv>*vKl02&XFT* zbYNz-jI+^|nYqeE8Zawf#@MKEmc^C{HR3&h1MxPC2Lsi)Am`MLZ`QwyF3B@g@m57S zq+4vGy|c`QKdr2JrZ$TZy;@!t*<1k$gxcu*th5po9>RR0&$w{oE9h%r>Wi^Rn`tT*pOrA`s6$s1WnNmRqZW$8(5?U}9{l!L|O$PMu z?0ETHH%gyvvAu&JbvbrWoN!ur#t6)h%ghWb3Cxei5>d?(;rRMb-DurxvvI8^5umqs zqkqTf7-ssP>FDg#9?&wZcQk@n^Ye^Y${1MhYcpalO9`c80mF=VuN#@>#4DF5d(M>L zAt22oa%?x+J||0d>PDyMbP0jHcw;69k{{HKBIc&c_--_0ZhQo^Obkd@Vvah?Cc>E+ zMt9HcTY_UdUDX+io78S@IfTO#MpIqr8CFl%Fcg{~O|~kmp7cjj9(E%7$2fd6i6uW8 z#GN>D#Oh7&FYd_kY~eAEfTm))3Vaw=4D3y30bda%?h08QXce*^MTHGqAyfvd25*IW z_*PEsKp1o?)PRQX(Vw3&zK{N72KBE3U*|qR#(J8&)55~#p@Uhj4MBQ&o_;*WW;_5q zZW=LeQZPRG=tQw6n5T`eo**z>s8LLyCkS)~fxB5>ff*hOYXa3!rh%c*csFPqq2T$} ze8K2Rp8BS`hrAYJ0Vx-FM(E5<3ehM{y`_Rw51~HJFg8#j?s&pCU1|0F&hgknw5bgU zesRC!xE?wSLq8s6Ae*wTbaZ}t$ucgA07CFs90K{LBEzO(n)<${xBbyJ%;MmLAc zv_o|;`WTPyR`H0%_+(a^Fk)dUs*|rO8jR<+Te}$%NT1SoCPv#Wzyn*l$Z1_^*@A`A z+?CEPnCoBXrv`VXf?KUJ9BsJO+<6-CoHdiG^oqEnG5T3!qi~<}s=y(qa$bO=#P{^> zt*M5wZi<+TlbRa?-GUj}l>%oAfkFgLg7O|SX@A}BAL+}zs(&+t_ApHw<dD~H*7mu_FZ8EtTMGP~s6aBF;LoNf|MP^x$ zN(GC|#^ET~gfRgtT%8=nN@{vDhouWsX~QCu3{9ooi!x+`mCh~7mj0<^S!|KER2sF| z5^)Jyh833Zhf;-#N=T)3i_J1Rm3A&R%5Sao9^L{|>HK1oe8Wn?cUa{HD=qjsLk6eP z!aMTi!&W+g%$Xp5heS!vrABlTYrDTi8V)SYI!b4dp|!AcvJ*ko5L z9b7Vc@I9y&vLDWDv;iB6dz)bxf?4`!dTN2K^>9Iw{dw<D7*Yyw$AM0VYGy-|f8Z6A~6md~fqwL6Ug+fu}1 zdsE1CmsLKPLiu-f@iuG^0RPjlm|pIN`Tw(F$ARl@*e;|WNum9BrORTj$wc~P337_N zws8Q?MK#N8azF~LTxOEp~AauvM_}<+-;U2DYW^RE!<*U22=l{T5_Zr5zBU8X{=!>3(S_}$a4QOR_Ar6G4LXZbWE>V{?v zXSk;s1CYM489B*xZAI*4IMpUVTe*i*{cqein|-+tRDZ)eb03AWS62blVOdxlKd&)_6Y=31crD!;?Z@tGVuN82~`QnNi4PP5IhZoH~{kMY>Tp)Yw1 zXfU>L#fYkOq3nANSx+&FM~=KlB4G@dT5uF7VrxN>C|~j<;4k2a#-Xx!KC%Pbi=hD3 zw51DexYs6c>p}jV9Ss6E#=A5<<`eJQ%S`yhyLNZcEXLET z`^t@=42$tV7tLY}XJQ_Uu@-5s#jpWfVv^ZiXjI7%`GV3AUwMsE`yrb99PF?YD=8Mb89yjR>LCTnB=WC)?uZ*cmY05!I1?`jrM1-@wtX+exuXntp zcDPBg$M+_e#XHJCuMVSMN*9L1tNfj_lRViU(!woXSumzuk-^hk9Uo%$1|#?uGLm1H5qUtG8m3`O#qzn84sS4n7KNvfMc9N{sfo6GGL~}z+ z%f;M;uJm15OjZ`xtJC;u4&n3}gbp;k@y+x3{Wa|!M$Nr8#6ogw5;e%NAJ&&(>v3Z`{8?aCgZyJlCq#$9-fUa3fHx{!o_ox&)YYCj*}c;i|U5& zMD>}a!j%U~b)RGH`86&^d}l`Q__WiW<}M?FbU<;H!A$m4(y13}^jS{xwb+ z+^zXBI8iFyp_Ns_)dMt3u&8ix2)Kenx8;7?GAb2-dgM2(a#x~9hwxIXGxC{e5R_e0 znQ$A$65(2l{PQK8=f)q7O1TWqlDgpYEU)|#yN3@WJ*(sL*-YaB_(l(d`Ld2B%Xx*f z79AMsAr5&}HQ^S9MqncLNWU2>|Kf#FSVIBQ_;{OuTJe%|uG7WUQ3Is}$@ zBBH5}Qq8OTe5T<5jXoY4{s@)&gX>2;1?z@-Dt#7}Vv2Ktre|Tshq?-~afl%lDuWr-@MpO32Q&T*ETDiN1iTO6UgnozMXOgH+{%Sm z`E#MBS@;EdLAj<4OnLOconkyLy{5;^Jj%C2-r?+eLIVA`Q zjldMq`PJeasdgs0{#h(knVF&PLVWvVo~I&iy;!5DEsJo=VNp)?Ofc1ekkf5U7)yLF zVFA_G@``_E{VRhrSKbJN_tCNouw8>QmzLZJ%n@qKYr<9kn%y-Pu=-~)-+ee1IsSaU zVDp(9%dPQOTV{YMT-z89n3oZbf!&Pvx~Xa zp6~9J%aa%H*}c+KpwI4=>VY?4-f@se+r4@OnJ*-1yH`t-wB4%}N!Y#WB3)A3xSF3t zLpG$#>?B&b!6;)BXv+qZ9F#=+H(2B?iF6u|kVFdDXbwn%NlQ!O6C|=93T?DXkwi;2 zCWX6#*`12;x>OSr>4lB%We(i}}B17$yMAtT2 z+f_ofr(l|EsIFk@vnj3wcdWE75*1S2fv#dLS`YmJle#C@-cRj_YFKY*@k(fD#?j2^ z;S`k@0Ce#BoL?)zS^sKb2Uj|8ZLl7vw+n=NptVK%j!0x+9a<)NB zkjciZ@fWBE}Jh`;V6 zl4S#_#Z1bC>urXY0sa6^yD6-a3QL+VA+s(X!7;AzVN_TjsO~`?UstS)#|^DZx)mCX z+^{N!5zGQ_ZTQ+Gr~zD4#@YgOCc1H7X55LeN5E~hM_zLTd_{DEJ%ZkV_%$hLu`(>@ z?&E?wwo%};iH>bf>NZ-qW*}EPBsChWwX?h8`8^4pgLkf06uUJSy4FZWqY2;!9PraX z75?g>GTdVh8D z$g@t|kF$m5T=7@%SK1($K=07=+MmcQqS^}+hq~*X7`2m?)0YqWWdecXQTJKH6@fZV% zYBH+j>=Ld`eP1&3kCDWGb>k3^mNkvEM_Jnl_b=+u5Frr}`t^!29EalMgd$E_)W z@}KA;hqs}nPhpeIv>>y-pL@Px_oa2$j&%e0*FoU@=p5DH%peWPbIC|!1AUrV5C zPb9_I{nU>^QPWzw8Cpb8Q53aTB4s^kRu<6oC*vid?N3^i*Xa2tQwyd78($g#-RaA* zJreGm6}P-zyYRtkOQ=gwx3+-gDVQVF9F3Qb9$uy`=Pg5RaAA^j&|*OXnYUV$hiLfL zRGDs~Wm`>hcpPonniK@y2BP$c1UkCaCKD6r^47Ex&l=CU6zh92fZT9EyTNG}d7;Pv$Nd`-K;8vh2ujnJ%Oyr-4zgln{?EQf`7z4RmFv_T`= z*@1Wocj3Ln!OUcD8kJ7)romWi8Vrm>K99zC;_39$R{2ys1wWG%0xMO?lzBS-Oj*xl znD=R|bk9b_y?th5pn4Y+ts|Z;d~J|B;%VnImbUYOt?k?*7)PZa$C2xqcJh1B-c}%2 z#8crmOa2I;aG$?r55^YkD6Sv+m$zV@c^#^>9aHFFw&p*x3V>hEyQ#cUq`@Wv1_N#9axkp= zOLXn65#g|yCxOlToV@%?X`(4_rv_EHk2vfy(T2B2Q|F3=xeb0Qg(G^LBC3BV#SPaO z;d;IZvmg!@BoV9i%YiE539d~!O6D)<=8fHi>jb)WLl5D48D0HoZ{fNXUHfn*B9@6l z?F<((5Q-~YU{?h7SC&oFPQl?OqTFGk)dx*fS20PBHc{4giyUU6ncIiRA`|W0ZkFKc z#CA*i2^1^u13irA56~%`-j1{#vLIBZ=%nh z%aE_cQRwqG`E3$U^r0Eg8=2S&y7&1c`Dq+&e||CmZ)H-;^W){yaWvtDT$zQ^FW96# zj*h*sT26?g{1?sg);L=DqEX%wM-SmK9c=B4rng^=&Ke7CHt!gYiS54OIPkBsHs2Ta zpiuSRPRPc8s#G$={z3yccg$_7Ougz z%bKzn#b>SqlOXS9@;6NI8<}jTHM^3z8-AvjcMX+iV(E`v+oY}|ZFvb(rz0JB$!H2^ zRu+QInPAhGmAz4FFtZX(K`%#}uCWXlZOT8TUmRgj|BR*VmyKB$fxbnP}8QvRih-3+vQw?%27Pj`3fjF!e2#AE$+9tJwwU6JT!jTxkia6El@ESX+0 zS(3Op7WYwo@v69F;CFN}A8qI3WJOlRb!#lme8noe#nOgXtOheMiXtF$Lyl{vF-O}b z92ZL`UNJGog;%V-&;1K~|Bbp{{T~>0Kl4$09#-|d5j}DFeRR_vbAYzp{U+VDCn@T^ zeXp%$VLE9diz<5gKBNkyh@t zO_&4JA{^u_#zD@Rm)#qrj(@VLZE1BvTZf{3an3jOrg7+{oj-hfeF+2zifU%+z(2_=)`C7XCD~7hbW|o&@=)h}M z`9loZs*RiXbyPm0xP3{=SjySgUilA=-xn_}Mq0MdB0Cys+dhLd7-|2$Y`G(b{@7=g zPsEV<^>k$ojekA9n;(XTcf3B0Z=-1a5`y13<4&&Sn z*mT_Nf#@bw%?ub^ZT6$AH)4aZHCwbmxH4m?@C}1`!MM@_D;Rf(56yHh zO{v~NZ&%04|8}6Ss?GA94s;EVH#?B|K(-v#fo2}S+0PEN;XsDcnch8+WO~v6dN;7d zJX%&8Qqk=x;7yAhjLP54E$M{{`AB|oDC8XBmh)_8!YgN-t54;3!*w}7>31EjKb~7v zgfsT+dC$uh)qR0GALs1nWn+<#1K>q4ZgV{Je7QIsp>Y_ijSvMU)Ga-K^$P%AaJ59c zqAB<-lML!W*0=KI;b_e@IUlXLCOB4<0GgU>qMeuXaZRwIIuz}3O|-M3KCTI3+7VoC zA_V*)yC!^gYdf%8T@&n&O?}%M^s3u8xi^}9lPO32RGd(BeYRGoZo&9?y+NlwjxqDt zOrbs&B3w(43e9iniKY_!F1SAX0Q)X>AKxWdf8BS%szCEyDkQC{Fa;I+sSV97j$5Ls z@SsWF84b@QD<%zG@hx-rGBm!5CsldP48#s<4}K@xMbq9xS+c=E7x1`bAnRe9k-v}Q zvj)a}R`=tJDTyJ~CM9!M9k^*4e7ze$HS%A>Ir}zhW-hJbseLZ=; zanOO@a-KNo8r}->iGzL)EzETP5eGem%%7qt`<-lgFiHy_^H-$)zwq&;C@p+^K8miq zV>G_Zm~i+x1P1fndimkoC@p-vf$IavH+=jp@_fU`v?s)(%d@AZStU7p9aBRt$ha32)!HP2FdAO^K^#)FLEw8}BhgT?ire9;yhAkiZ z!Nx~5FDSLUoQa}D?SX<#SZ3iwLUl?IZ^Z=NI@7a#%mgY>sDPW{xvs*CnKdZGi$1+# zUr|{zV>y>e^c;rdG96GUuTu4J{Q1X6ggNHNbBCGGq61*+o0ed>@+i<21stV8N=y`D z0O3p>AtZs4ZV`~_eVaTJNu%DMBF{$B&i9we_ae#s!4UaFBrW)0n|vgafAg4^47#BpHvHGv=UbZkrYaMcX(s z@fb>K?ZX+$$}@#p`|5>zOPwjChSQQ`7DHnA4Sk0mPC?zru+iOKJM#=q_{{TPkl*z) z&!^hAo_P+q0LTyR9S7SfMmqVQ1bLu6UH*?PpUlkGULno_l8V0AK7 zrL$(5_SKU_1T$jSghbPMkB+RPYe=NRPRaO ziKn&#)^%)N-JYiWH(icvPaFPQSi-Y`&sl=&Dww3q@p!+wYEWfM-oK1-$Wj~QfnYKk z!FI$R8rs7@KpBjCydxqBTIFZlV;#HBSgjW}cV@|Pcb=KCoaYALuwn_8v=<{;O<}@J z=gL=bfAbPw1PS#v5M`F*gG46x@9*uH2$}_)hqzft$KjcxF|18W`tC$_(3$}4_V1q& zWceu9atx&o)pYbswQ1T^Lu_r6p3%TQd!3gfXv0TI{8p=y;qPM< zR@6+Zg7MuX0DXyKP9_C;-wxB@lUGqTHaxW;HG%Fv|t0$A-v3zp)9p_FHE)YIdYtDWF zD12JnnK!K}xrbQ6e#2WlMN>JK~J0t zleP%jdCH>a53itis_3mdVyNkUd}%X6J9%J;AoIuR^2czR@bLsWBZ7A0aXFj;aC11V{>&^#gwu9Bx`)$ypA9MLj^f(h7(8VDh}eS07Dq5^ zKPJhofR^dPI2gk0MKew@aF}yGr?h^Yf%mxPU&1Kj z3ya|hP}nAAf*BtA{MDAaFdFrRQGOXl3%)QK{XMMX054dAHNgzyj%f*_ZC{vVc^Dl8 z*4v=N@k92@-3)>j8gV|1E`MP*^2~D2LZ8!SXd8u*?aOrIJb>#Uo_b7L{xY0q(aJFJ zLTKfeCb=k#wti_=HqqN(CRwsVug?Hq19L{})fvrWL&Rg#!*Dh=mi~LJo$M7xC%!5$ zn$gd*>UHWMM2;$`b_PSuF~|uJpY#`*IPKq#Hh*KzcLA&!ZOA4F%<;*dCeP%! z%rMA}hhGpFW>_UOA`h7#8OBObSJ<2!ga{uP`UV%h+mY>CgM73d6`nR}7jrDPFazj2 z?>G6l-!>zU`Q>%vI;2-z$4?&fFZio{@RuMx8$az-^c^e*i|o^m9y*=SA;^kgY1MK7 zn?M|A4p~1}4`t$3X<{5pd&odTp(&q2dF=I)6l^aFwv9HCGNQxsMdL5MN<9No5sf=z6uuY+(=>Y^Dz;B52dZ& z8M|M=pybK16N8owcM~?Dtmv#{bV>p*Q72`qp8;n$>i7vyvVYwnyAEG)n1{*F8!~)b zxCQ{WYtLgAAA+sZTqw=9nX0^aUgPrLP|B)HDzPIZrddI^2Uv$G^)0Bds^Fe0gs8MR z3su2$mRaCg%4dLiFC!grZPug5KVq1t$J0FJcq```xM3PRrv5_O%N09z^i5p|^YAO< zp!`29e3^h3t5jai<1c)ecCH0n+s=T4Sb7%rWgk{qxMtVW-TZq)Y1CPS0UN^jLgdYi z*$_&zS1&ohh={(mSM*xOJ zt&L$L0K-vfzD}my!yFCR8f^53(&>ii&e%m+i}nOF=0x0ogpY;Gk1u>bHN!^Q!|HyXY2m5J_v_s`w$kX7Kql}1iq%6FCA(YiPL|H*=8rw(j z1!qfv`5K-Az^ki9;4Hn4-u%#90!Ms3vbE(}8CI}9_I?iN{m%*(D%Gp?Hgbb+5aU`u z&teUDynx*Ub^VV;9-RLBP>yvQ+^5VEJ+D-8;v~_#iuDv6uN8E!1g0XS8l?GfSah-S z1QBi%OPiG#3~DAzMw1RI)%pdi+>bp@NHH36JMev%^`1KfI(0=`I?$La`?jTPjY%OG z*LlodAD$>=Yck47Z7Cm*v2AHilXi7Gnc+hLze-!1vSqKf^i@-Q2{ct014aV?P1X1j zZ>dAs@$7@9n#C}leb7{mAA4Xt`=F^LU`?2Pe9neXbT{GLFVD87MR0m>rqg>-`wRw; zdnV#Tmu2n$p{L|GZD{5BMKR#tdr|w%k6Rpk@ScamptfZD5&qAQ?PMk=C&)M2(7GQj z^5r(P`^V^%x&XD5W9qoP$(NJxcLXBE9cv4oLXEW$qNbnVi*9YB>Ajt8DD6)&v;~q!R5pCdi8Y$uDAXyqfsXv?eG2&-)3_OOediTDxr)o6< zjp>CJ{yZvFqK0yvf{(#PHs9HX8h#!k6WWmVf>Fk_p&=L2LZEX;0LQIUY3+sVk}DW{ zT1UcYw_XsQ#j4tK85nB#GsfW#<;&&hFb&2X3N@U<vl{+@%b}z3 zwJS{(H{x(Nf4P*8l5uarAjO~B$w;$U=T3%2^7OPv)+q9u` zzu@R#8;ZC%L9Py_1s6@Z%a{hM*sI@tz&G>pk#}C)AOIeq4o7gDFVy??^)0~X3FGbS zS;2JdB95pB(|J5*2UGB+ENKa*A(zaCX~3;Z;>FYS<^~*L#+PwVoeHMamyB~y095Yt zxjZ{pi5&;NI5mJ-f`iP?5c_0$cDL>y=svdy63PAoju5sT&StBVfy?tb0rR^r(j2-# zM5Q_!X?#$ZKDrnqy9AT*vQZj?DdX}G`9%<|zHGI10K#_MCD!wI^mH+>W0R}+J9<&b z7oN`u3tr?sH&9(0OrKpgPYKpQ?!yHd=#zo!oygPkpMijWcY%-cGfM3e&cm1Z6pyab zaQ_~t&iBE+0Ng`ma3X;JSr8TcYLUl-XyvbFLk+Z$HY!4Rs$(?Zvn)G;Xz#CP`Faq2 z_N&>*8otQ$abf(857a4YE0UDj4#5=hn?*hyL|MOe;q4p#DE_7(TJT$Jw{H06FvRBM zW1m67mB?}1WPGUwq*#2+Mk&(e_=IhEFzx-#Ebl^Pc>EefSAH`Z9%Qbd&9I=%JX8a- zj{-$OWc}SDCxHFm&AB%*2J|7jsr-H4H}MWGdolUm_-R*YVJUf=H`6dvt@XyG4*;2@M{Mz;phhCiaUhGNvT z=xO&Ku`!;8&f_l{dK>zjqQ(SK!yjh(iC!D6XZ2+H(DRpHt+$dP;9L%e(b7p*dSF)zg+{YrEM%W~Fv@)i8v|BrW<+qU@*F z;)Wrr`?IqXfigx<2A9>?g|TC?Skrl2e)u;P7_qr}n&KKI@7L2#*A%JOQ@|CRXV6pb z6|1}wNDHrI$PE4fz2h!;)dBf4k

4vb=JSAK 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�t+YD(4JebG^Tiq!uR#4-6v zN7t0p8xE{HEgexBu($2feVxhtZ{g^iE~=4f&qz!x)*AiO$qEAxHLAqD=_#E8iDxIK22plX)^6$Z#OTfeZ&S9LR7W z!+{J3G91WoAj5$S2QnPUa3I5h3|9htYJf?FK1};+p6`D-=9ee0=|cbeZ~m8iReAE7F7m&H z{|4#J3m-*jM_}|O@ujVuq-zWX=NXw`^)At-EdCX|L ztW$Y*`8MV_`#q2SC?ZJ3vtJzJ&Dn>*%L6BDQ@qOK>HLs`g;&m3xrRgFDWw5#*$3b$ zZsC6C5O{c-fcNV|;DvaF`}afODLlm~yc5QVD#^dPPRD2A9E#6TJmD%VJ?VUo;tA*d z_#DMkIDvoZe2(IU{0cXn&*^xI`(S*I;wj#Mm(J%XUWiw?>3ojjDZErZ>r3Xza3I5h z3MvzZdp2rYVW7x2!DO zNMqt$6rXi9zl-=?hWiojkGS436F)g-vd+a_hr0*&1mCvu`!cR)mWdZ+nXHfVI~#Wo z?tb8v{C47gjq3vb8^8H+6F(C-A#SoJ<7#+cf?J7OkK4w#H~G!UHu2MNAIDvtZL%tH zi*W7PCYII1WcBZ1;*)XnaVvp;!S8^cCVnn%Qcn}B zmgCxbnOHl&+i`!xW#^Da+^8J#!|xrqFXouoTHF>~7cMK;#7@jLrlh2#v7xl4WX`;r zvXY9L#`*<`Pjf5gmem2))mPOt&PjYOZLFPJRd(*!l7`0G`U+Drx3s#twk*wi%sIi^ zhwrHPTwPmQoKbcnOi5X7O-)4^-^!|M8I%Nz5<>QoD|Ab31!!JPX?4{NH5KJ0E{*U!joW3lbL&d$E8tUEWogX~ z6(zTn!o9k((mD!4IZeSY@yVZ4QBy|hLvH5IYpj?Lei;c1-(YNcNduAF@I0MEoLA#e zQ-Vec51tl^ps{LhMeUsOQsmy20a8WQLrgc;iaj>Tz7T_ti_XbV_-51PKPi{xrH$~Y zhLl?dBOeI{m(3;rfzE|hUIF84RsTXkDw_xYdTXg6}e5-4yssh&9w{ z7j0E-S)&R7xv8zU@>eydw7k5&!PS-okj}d~6^&(;C14_(6^Y7EiCmu>d$kMn==-}HaO zvTXiuU6PH5O@*ZV2ruo&1U{W$EB?@IvuI&2&{zLNM9b}aJO53Vua#A`HR4}w{elu7 z7(AI;hbo|yRB#9SUWZ1nKvhuh8yc%>ZXmA>jTJRy;)?1jRB4Hsm2H}AR6A@`v*+D# z1HMnk=9JE>ZY)7F+*(_I6LLnz=aeGlKaORahrXlCwSPCRwApaX-dICL{Vh=b4ga=B zmq;XHIbKBxFjW# zQi9S!vzM9QX3cG!XI`P@1H7q%62EyKf=OYPSC|*FV2*j6Am8~f8{`l4e@mNvU#tIn zZN_Uzf1_!SH&)C&kd05pNy~RB#U8%wz8MdNw>FNHm?z>@W^=rr!aP_W>fqBmOZ~}?!37rjp*fuxm67flAL*JJN_5y{m+T1TWuV(5uO|B zYv)NhQGQhv@Z&vPT{i1!?n}+W9xfGSq_SpSU5WXA4~o?$v)le(-mDbNo;PO>#d<)J z|J*}0UD1?KDDx^xYABQg(f;1!P`>XH<=!T7roFjWtfY~`75jGeB!O1=O>@uss#~aB zB~^6^R=n9W+pPb)ieWoR%r>2(Js^Rtz2LNyU8H}Ftd4I}Zj|)SUUN(9DzQuu(Rr#4=6`yr@|2i;M7H#Y zDxW=1*_yLU>2G^1i~q}hplaZX!R*MfO=gLY&avOTfjPH!g9z9C1(P$&fBr(Qw1fF_ zE`tBOeD`lsP_~wsM{^tMYLR~PZM>i9R!rOXDAxT?>i_cH3JCddF_~ZIHp0Y)hEf_w zn#l5MQvY(U=~Y^XDlIQ*tPP0&ol|D^#L~wUT$4|Z5bhXzXtQOTs7B$ zerqmidX+S_i`8)}eP&yZ(^`vq*EUE5e&3s__D`jA>(^vndu{a3-d-Cm>I28juHKGW z=JS21HaCL3_i5Gqw#`)OEVTjVi9Qr|xoPi%o`C;xv-cJubSdaP9b(GzjtKi->2oml zzYg`wlv1|odMCpEC4DXX|FbWu>}C0GeHpA>6byZ&!}E0z5( z_C1jOFZDeL`+wV~%)Heno&C%E2KIlqZ#w&*?HgtPFZ;s&oqeN4zpalG(&i&fPxKA# zJgr5^oa)jW8q6;!?XUHbAyI`!zpcVN*2gxe<|#O38{HIaxNUxSgvkOg=hmt@jj}+^ z+egGr`$%}-b``}!Le*e-Wo~}nPX(keUJ$qTqe|O)+5NBzb5X1Q@A#(vzw@B}Z?j+4 zuGV`SIHs4^-tYAb+WRv{N_*dXq_x0Wj;x#4P-z}G((CbukMyS5sw2@PKR~{YDVbYI zTUt?ug;!FEup<1qiMF`JoHTm@$|)%HiDl;D7){X6V}Zoi)}Rv2(yTdER2uWmtQ*Yd z;+3Thl_-W1^A@ei*RvB%^{=z%n*Z)mXa2WmU`A)J2J`)X(t{=D#eVZ>63;&OK-IRd z-z``uwWyUfN6PvtLA%kS&&SxeYSZkJ)dI`6ijUY9TYT)=?C$K<@%6FE`PEHXdwOl_wK*H_5zDf`;bYzA z*fX)ZWwGV4WwAY3d$QX3%ij|RrRj*ti*kK1yJGoU;v0JLHGh3q@v=HdKP9sIP1H;i)duRPo| z+QF}RxL}Nf|LWoHu@3Il&!zXFaSk5h;q~V`_#6+9xWK_vJv_t1b3B~)3FklG!;KzZ z;^8fqJO5Q4-apB~?H<143J3qh!>t~E&clsYI{#OL|Md=zA*JH?gjo(g&codvKEuNk zOP&8k9)8BdQvy8O`B!^*{Tv53d3f=S4*rUVw^Td$Q4f!v>)@vYevN~l^YB^^|IWjm zwa$O9hx^~`;CP4%zSF^9 z^>Fs59sIb5U;d1PH+Xo|Jr4e@hu3}H!FxTt<6Z~%ILf7e))yRnjE5I_cz}neebM=k z_3(vXa`4AJJgCLN(>%PLu`r6++!*lhbMU7!f@Q*ya*uyV) zc{;`Aa_wZT|KkDK3pE&=YdwA(j9sGueNBzvf{|NBU9em_5E+wR;@g<5-ve(SLC801q$zvx7%@c>P}- z{O=y#{C5XW_VA2-4lecZ{P!H(;NjMI%+{BC0(~zBKj7h)`#QMI!%L5F@DDt^!^6)7 z_!#H^iicZ|b#Rx52laPww}-QbI@lcN^82!fkM?l>iOzq7hx3Lz_*@T9Vys*BeWGBj zvnx(>@TWXHdz6D`d-#qs9b7B8H-w!I{QR@IxNX^YAx4+~33B^>BfQ zf9m0p9)8KgqddIV!=pVMJKn`N&ck^gF7)sK4^Q;)86KYG;X)5j_VAS+p621}Jv__9 z^&T$uuy|OmfBv}#|MCFvyEzSh5qOS?nUl7EwMu9rg|%iJa;*1X)7=^of%Rj69eSib~V#3uE=%fCkUsB-wWKSvn00;U>bei-8`l!F?gS{pDOY{K_ z^qqQ%&`146AM7*PYoZTupr2)_lkrFWMIY=r*>|E3aG;01_7QwV#J`F60_SD_OTJHz z$hYMAOY7+z=6J%a?&GM{EYgGKJ+it-w=I(g)e??*9(t+L?87Redv#RZ84eJePsZv{v7t>9TcJn37(@279; z2BgZv{b}%8V9CRYY5KPB#~iQr_i+3OaNx(%wDOGli=UxCr~aMz8Q?(QKdn5Y{-O{4 zKlKMiAK*Y=r^4hBtn!Tdi$3%h)qfOyfQ7H}9EZ~*SoBeU(TDz}`kSH;u<#Ei55XTZ z)D+;tQ^HF@0QkLxd`ICI((3b)G=I81Dfo}1!M{y||2LM3KP4@^nlyMp8vL^~cxM_M zOG_`)_$leTDh>Wx8vIxq{6-r5UK;#;JoI`ink{w`lxD^Z^#WXt&|?2o`zgRX4k6_V9 z{YAh3TIa`75|@7u2l`Re13iI0;0qT0$QjOWS!h2!9O&n#(FgoM-|EMcUJd#8aG+nU z7asj6{Q+OF;-4_f`Dr{#`A@+3EC1_pdW0|fsK4mDXE{HOUx_}z!WaEyoF2iVkNS%~ zjBjbYOY{L2zUb5Knc%Pf)ydg}>HAm0FV{c++&wT^cl4<(4ekIwSbd&R>e6}|d{=q` zte}-1hR^IHSow+iD?ed;PUCf=53uk>ZyDi#L?89H^s^m`#`i3}hXef{^qd~SmOkPy z`Y`^d@j%fBIMB01%07WU>M!~*Ua0Xy(FZutPk=9a0)5n9^kIBaGyD;w`CAbf5cz(VZ2l0pP~tod4#$WIF zr}0}GzlQ^TdVLJzyYesBKmX(oO09oqrNPC(2djUhe0-C$UHkzK@z?qA1z*9xsK3%5 z#+NnTtn>$1_$vF&Y4lNl(TDM9jZcd{z=8gmH2SE&=tnj>{#AQ>Ai#k>J^fLC(J%M( z_xbiDz=3{QTKrLe(TDMKji)R90S@%b)99oAqTf8vrT^Q$JqmE3Pme$9FZyY>IQr>6 z{Q(a2)q3I4&lM4T!8ZO|o!_k?ehAN3b~ zykm4)iR`wU1z>Kk6^~F#n_ZAjKbG;Vb`>Ep?LrQGd~g`6A69i9W!A zeo?jyK(OME`inlyFKNC>^Z^#W;!n4yqyC}~^HG|g5`BOJeUn~z^rQHr{-O`_SDMcf zeSn3p_~rBn7JbxT^kKeB^IxJ5u<%8@4W~!2=%fCk5A$Q1FB5%$g)jPDI6ZC(H+Geo*-du<(^1)-~Bju;`=yq7UES@1ULOO#{6!z;CpBLw`Tz&|^zw-MmkY^1KS|^Fp8u!0E03?D$kqu&28BVM zf~af}5F<;1$gl{HVGvAM5)hIn0%MkYLkMIuo9skE1(97G7z65nf)e;CGEQI~4mgTL z1Z5kL&A=$DJV8-$0D0%@s?)db>ArByFs`2|hyMI~Dt=!DpE2^|`dt!yQw~1={)*pY!Dr0;c7kup!ROy= z@%t_KjF}%N$J6wJh71XO{(Tp}_kzzDa_HYk@J%`RUze(~X6g4CW9G~2XUf6n-;?qC zGU{i{e0l#(xfhxAmPGfL+bRx?7kFlX`@eRv(w~-6SoJgJ`ajck;9mm$G3C&I>dT7% zKYBdD82NGihKuWG%E9N~&+&UY&Yv;!N76hfHel3m%E6EOUnP4$_aBUzpCalv<>2%0 z_4xfB^)qIE8|=`Af2iM-gU`S386!W=zmO6(VDL>j_;DMR4E6!wGe&;!`JMuU zZ_2?h(|p(yfX^8D!I%AyDF>hJ4Pbu&K4a$ZrZTVrqkdBkKHDe2UIBc@$dCFhJH(<{JK4a!v6&v-N za*MxJ=?41`i?1>BW&hR2kb_^TG3-UaXUzP8R5v!@1R)2X?MYx?0zPBp$N8_o4sG}c zz9|Qv?N4Bj0zPBp2mcjH*nq(|<=~Imu4J%Z0iQAQgMXe9Hem2gIrwbf0(%$m86!XV za(>d3gU|Lbu#W+sG4o~nH|5~7{S54Bz-P?-WuyZ(VCZkkE&X>X8SHN?{WWI3ynk7S z9DKIVfxQm+jG4a=JG9{+>Nn-!vpo;&d%$Om{J4JgC}9HzpXIRcz<8AHJ0SPskKPW8 z_g_R)UtfwWO$fVY54AI2ye`jm_3(UjwS*d7V?N#HYP{z&Z5hJQF8Qx5(X z`r!yN*fW987{^fmZc5mI!8hgLm+n_GGSjj6jFBIF8m?FyF!-h%{LTjyzb);fe#W%x z$~WcUv%MAUufS)_{I^u~w*ICZe74W(q4|uNPlv4y82X!XFAnPM330y{3%n}8{a<)c zo&Rz@o@31Q$LaF9ep3$p*`5scWjKGv%wH?`rX2hi4ypQQP}>HdG4o~prX2i(n!io! z&zSl0c{b(Xw>hlpe_PkjI1t~IgU|MJu&0CmjF~U*pD8!*-z9Osnnn6Qzg-EtJ->6b z{w=irjJbZVxc;Ub`k&YQF8ca04#YR*;Iq9T><4lFjF~Ub-;|r@KVO{hI)Oh4aQ<0e zsQcGlpFd-+Uyf%?IrJY>srayWg#L_~Ul%*H;a`G~gU|Mmu#W_vG4i*dltKv`F!-h% ze72v2Jtg>zkso|{{Y<%e{hHk6-(GqNoJiQM{aiYtbZe-;Cm4t8`sMeGDTn?;zEu29 z`g@2m^XG{7hbgzt|Cr*#e$+aDjhXK_e?xAb|I)ks&%Z+8GlX5wUzfL>^hEuajPh~) zy9xbGIrL}yR@l3O&zN>y@1H3*^&i;GU;ko(pC;_4e}8RXdpSbY&zS2^5%WQ&9Qw08 zF6?umKV#-krSrfBoFL@jv;8jYdBJCl{J4H(?rUwp;G1&r8~vXu`wrcH7&AXh=x@rw zXM17T52Jp@%$M!Ql$+Oom$=^5n)~06+JxP%f9W};|5~aL^)u%BZ^sU8_=od1<z|4p+VBthn{w#S_T#W82cI$W zQ{{wB$5Bq-b86!XV(%!|CgWrw($slhx zU9KV`!@Oga#)+>O| znEA5*Fy&rk(%VZ^nU?|m|5)IIgx#LM^Ll+mFFl{inCqA4Z_1(niaP50XKOxV=F9Up z<=|h?{5v$CG4tj4&y<57K?6MGjnaI^%$N0>a_|#1|6$E%%zQZ?V9LR7bBn6~G0kVp z{0`Wm4gV61{J`L+==CU_HJ>r$bj!j@C}9Hz-;{%2srgvnVznQQneS*nhTLpFZSVGP zKf?viCG6UMba@-7LeziWC?EO{f%3FLALwt&p?`lepn>c#{Q;jbj)9+u9op~@d{YiS zuiwFX9`G3>Klm#sVFL!=l!G64o2vgb?Ss#lb}jyH?9hgP;G1&rdA$(U4}s4Z`B8rx z(f^xrtNwslC^Li+(j{=`D^JV*EIl1Qui=^^-Lw+y*=xvi|e`f{06reqxZK|%vf7MX> zFlK#Pi0f&}aX!4B3+uaZK8%?!&&QOT`p35Pf1Zj3eu}W$^Ax4mlijWLXUz4V(ANhT z_tTU^e_nrv^=QzaG4kVnO8rf_ssA>i?H|3`OxXm|**QLLz?Nf1ted8yL*MNCEhVcV1j}I`O0p{^aGH`90zuTzV z7tRlI*8dqTU#R78YFw`Iry7@NOw*=Td6gQU2d46PewJR#7UucRwi@&NWxU2b9>(|; zd>)^c07uaE)Aq3VK7gFZ|7$ho?-}&pkaPcx{=~|!`xo@jz})|$zXay~@FFl>pR@XW z(4Sdy-Cx0e7MSg0v3>#hr|JAyUjSTple)fGUjW=rW2`R#j?)G0^|cVAL|i-hiHuT2*6`B#(D(cg&Jc$0&uy;SU&}vr|W}#73yRADXdq3 ze51~f^$NiIG)DgioI);?h!%$R8^F)&^01x(_=3)l^$ftb>-?B6M14FTi1{;Mo*#p~ zBygL2)&5~G0nGLgn6Cxq`B==KTKV;SBJAaW*&Yt_6Tm$GfcYliOGi}s_&pn#f3JqU zA28ed!5-eq|ES6jdq!ZkSH$`ZoL^^sez5m~ob9<_Zv)KsG+0jr%S{U`+nG8TJj>L-@i2G^{iNLXXV%H@36iF*RzMdo)}+4 z&f{l{mw|aajPWNhk1z2(0LgS1->9~y_@{?yGP(I z0zV{hlE7Yp^96oV;MoE%7I>w=9}2u%;C~DJt-#^6{M*Bg0@oGz4uP8r93^nHz+DB7 z6*y7gG=Z}P9wYD+foBQ4K;Xp!zosxfB5M1qz?%gARN%t`pBDInz}2a5pvvs}ZWXw> z!uIppTHyNy?j!JUfgcxms=zM@{1<`O3A{~Ua^mIJzx*ihWr1tZ`dqU=sw41i0yh!3 zrNEES`*A3xCn*i0R745y-~p79DGjGIm(mbQ4^v8_^hZjgDJ4>Rlu`<%K9pur%A_=m zQUN7$R~(i>$xA7R65i#{Q%a+hPH7aSXDB^R$wTQON^>a9qx2Z1R7!&>O{7HbkHem$ z1iNL70pcm;Qp%(BETu7&rc;_iX&j|EO0y|Vqx2M|rzsUv8bRp^O8qGnQYxX8O(}~~ z0;QRhVku3cG?vnMN|Px~pmaU1RbMKns@JO@apg7ZO~-!i*9|>GB>Aj$x@YsbO65KB z?&@>drai(LN7yx-aY#94_VevVK4jhfs*>kq%SGYUe715P?GDb}b*pl(2WPCb7swl{ z?Tk)(mJ1}%Rl^gs@?s~5+7%|b*M(y`7niL{;O4e9Im5;MDqKd}`a4~>T4H!_C0~-t z`5oU7#`f*t18~@9=gw4aTYcEoeXA|jj{SV@Y#lCHlgZJw&n2tvF4yT?&lZs@Vsb)j zdmSYJ|I68_fn2b1QS4CF#RaR(q8+kow|&Whe66zF6O6}I&U`h$t8l9>y{ft#vmLUs zvqm?6sw~r9RsA8Ku>D+;NAL7>a^75!Ec|n0s#-N)bM2PZK^NXSgUn_*7j=|ndO~)dik52EqYkok4eH2XdJ1(2;iyxe zs{Lkq8Z5nbDc z<>gd3gSC1bdf@#W!X^jugPN?}pz^ClL;KC5vGron`^qD~29{S?E`(npTE@=%UHz+) z5B;k~EwEhd`#jS7d)#*haWIeAaUTi_bx;LJ4bS<~Bffhy0h!D2n=eH!fh+<<(4e>* zE}4DNIQ&ZP93akt$mCL>45OifYlxT(x)_(xAxmXyd*R z7Z&mblK^b*mz6?i=yD*lf?-@EAcb2H4PTj-)K@5n*uaZFm%^OrxDR>=%27Y;s2gfH zi@$dK1Zw-{zAwlJ3Eaa?aP$uf)xouCj$@Q{aNBjAGyyP%?t zsC~Z>4CugAJPJ!l>i8lu=m-pEcn&L*4C-J;ZqR`wI7~;maVBccgo9hF0u5+HhpTYwIAO!Y@xm^#K?j|#p*^{JcBpgdR6eP$MfmgjhM#Pn#OMMr1ndW*8i zuRXb)w!(Fo!^IK#x!HCk8fWgR>EkTNHv;f|!qFhzIIQ|^|6_VQ$)j=}ayyGxAAUY> z<}{?hct;)3BO5D_4qf;n5Bu7t>PO_7hbd5jb|9XdJYewPCsOnJz>7C!$@k!&@~uxD zDf#$TcZ2lh$QI_&g@!?xtq{0zFz`mh*1*{q!OC-eoNE8#5tm!9tZ)Ui_+qEA;}Qs4Z6Db%;; zmo_FnuB9^Rlb#+z+qJx#_O>RfccAL6sg7&4c$e#-Lx%WH1zkpNQ9ea|P@RKsLO_L- z(t7&Tv)*L-l};RI9d?^@3`;X9u!Q~jN*%F^6oQsqlvjvv%ivB+KaRfpV?4ONgMRnL zzai5ri{cllk*cqIur8@)rDkDNKoO7V&6hMiU|M-!q;Kv$3&k2)AkfzCYE?4ODxr^X*f)3FZY)rYTnDOBl{=5%K^mP-uQ{Fxq{fFxBNpyRqhTkdYDcU`KDjV8 z4S~P{gA6q;A}uIV7WHQm8XY;L+?(1VO{|bzknlrf98fn8?;i>#LJyJ1#0PPAZ8~xV ztWyij67}HEJY?kZscfsI3Fvi_y}3DbaqJ3x$6}HwTS1IBy*Or2dLGT@&`2;dy&z^V zCesqq3u7>tEQmqRpOJ5cTC%QNK}C9DcYNvU*%$Y~C*XLJy&!v*VoVC@W zjn57qs|0h3s`=&?73LKc#$;ut+1%79*Ak<1@4fbIuoSW$RrO*IQ4znAf>*%*>mWoO zWMRRpk%2IXnI0>uEF!)Ygs6#2dBH1V+*6|qr%x_YEJVGoUUZdIR4;<-rx%wOyfXZm z?)$U|Q5&}cgI7mUb*jI0($7N#JXAKd^{(f;-mz%j%F~A*fA)q3 z9g3uEP?J{|p6U1d z<7@U`=y9^)(VqKzYMqXqR`eR{54d+38EIopa?)}Fop-Lmf4o$~(t!iJdo8{)FO z58hh8Y{qZyTXppPY2BA(wyNCOb61xRA2uGjId0;@olPsEZ!d4R`Q0UVd{nX|uGad@ zq#n!m59_dU&h9tc6&x7cBxzcWoR%52)(jas{pPGv&nwR@sH}H(bdAZc{yB2f8`Eoj z_RZMuw>D_hyH)tbXJ;KQc(6zD)16DBhK6^Tw77%!O0S_gFaGy^<;M=xZ{KY6_IGCY z>zGivr&+zNo>@D8_rUF*2@e;&{9dDoKm9KH{E;{I{$*qOo_+0C)$2Snd`{Y^T^m!< zzTa7=^Mpo2ULU_N;mXA|6IKi4@svvI?@FW0K``h)}7 z2aiO$Muzu!8x z)y;?R%-K+~;P`j{IJQ3f=(@Pbl$KK>oA*7s{QYx#FOKQf=k2qeyC;4=ukHDo?NY{X ze)ZtY=!uQD{7^Tu$%1KrZ+>RdJA)2HoqDbL=H@LbioA(4VyhiIS>Ev8?KA#!=H^2~ z=6>?&j0>w1+JvRVKhQV&`@M;0j+GBzHMwlfklf8DM{JDPyJN@bY6FJcaAm^U3FDsL zzhOq)^ft@mJC8eG(eUlY3wL~fIl9XWKfl@a)PYr-n?E?}4-I<%^O>J+yB0rG`HJ2j zCUqFRcvSu^%RcJb?Nn~F*jWocKk>KcHog0Z=k&0FwL>lcTKsu0_kQH`fSg_lWFp)Ws+^?Y0W*RZhv E2NUF`y(WqH#+A6@}mmXhIV0Rx&I&TJ-ym3oxCLr%u_uh7pnfZU;-|wTV&Z$$U zPMve=)Tyd#WY*B5irGft zk&y5;8hW}(LvvVSai%DCQ-}>Id_ik1_{#oq|t*(jeUDpF;hMStQ@9)vC#~K=lmiu1 z$pR@BvS*t+x621jY=UpU2?-ulZTF)3yAnAuqpG;PQOaf1A2U(4){zNPxy61PFk;Y2k_Rg909|?W;_0^3w%a5u-A3Vsy;~&ejKu_K>p*2U z+WAlwObF~f6sSSUhd?!gb1bCFKwTw`9i;F{v_ML4nW_)y?N&A;Fvw>cpDL*TtE=nv z-?7z!DSq2PE5B%EnJ}#-U1skE#+lyWyu#SIz!>k0!HOuXf8UBeLzxg16z`2Td#G#V z-7sowy+X?6nVJT|fsZlJki0N9A}BfSRX?x@q~TVuC99~kLh|{*MWm2q&)(o|&mP9!3`!7^*(dmoW3BiNXU5<}!IupTj%Le)Jp?105gcuvV9!n$ zU`0Q+HaK3q3)>olKa7`w@#MoEN=wDzv8@$H#*&ftspE;-co$e} zaEy4zpNS#p@6Y;$BzjLDtOzi_gul~lZb*vF5~QhqG|D8-aEP^?1Z#Vnr#&0~wcpa7 zqFhZNM;z*L;VDWUCdF+sA7yv?BuwyM=nDrcIiTap$kh8i{&2sP_6(nY(=ls^GFk69 zM(;QtWl9L!(mRID3bk3v{5juHXR8$Ad|9urMcEA5LWzQFrP(gbqp=U`42|~BNmcd< zRNYlU%Cj9FBTJbjY^h*pN?8Ap(Q4-~FbZ~N>-Dj9r@~}Gd}RXrHhhTiKJ$r)6?X)) zl!)g!Zg0eJVI6CYh~~Jii2LGB6p?YlXciYWSp3UKHZv+s3=C$kMy(faGoR>{!WFhI z`krAAxHJD=!R+N;eS}BZfnHHUCOgqy^puNxcq1$5JxmM@ zs@u{#N)VL^?1PvQe5k+2*oB*HRqS>AE{KZ=Pfb%o;qqM*xwA$(cT~)B?Ud%YwzF5_ z5-{?CxM}e-0=cq6oWJv->RL~0V}>uKMnF*<*D6IgZ}_nI_}Ri@Rvte}EF8t^;?ppj zAL2`eUMxSMwD&XU$7$10HcufX263vUBFEJV1N`94ZYNBcurC1Wm4s8BFG!BgqoiDs z1gCt`L$UZ<8cmfk4C*Su*`xladM-zO%Z$wM*O z4N6-bIj&07?$N^D?K84p2k381EcbRzEcbDxH@>sM+gY4`le+4Cd8$ zpW3xc1oJkn|YIc(HDQ9q&9qBjPyc!I6=R%e9K8xRcrXD86CYZ0cN|aM1dT#doW@34+k<@MB znT6Jd;!tb3*Da~s^GBg^Sf;hy^XrM_Hqo63Z?m*=T zv{lqJMw#E)^*ZZF3}^Nvxt}j)1YMOkZ6xK7m!Xl%f?@Mgv= zP9#MJR#C<{<0dI=WNRtKg7s3HLg}8l^Vhu_k(5m$&L5<<=KE2t%{t0tC5n)xX@sbkQ zgX>RzI#wOl6Ztp$^;o)Q&h(S$M?A<4I*!xve8($sU=4EX!Tu<$4 z8}!a+y!=5QPqoiUPOtJX@6%#okW&Qh6=-b@=8hzB|Ad=HC2yyws+?=D4ATOB!pRBt zL^OCjXjsALi?zYk%!%?Y8`b)1wJxaj1!~=-*5@)y$}pjVJ(ZFrt}(E^DG@>e`!prx z$)i{vcc=Zq(fNYl=!CJkuTYCY34*jxs1m?S4CKeljRs{LFLz4H7+x+!NP!0y_RB~^ z+H=y9E-J~G#gz2EZ0g`hTe7SKBY5W>5tL{y%MnqL)lyKR)Y7Pgs-;O0bvT5VCDwL6 zFB7ld*6Nblj0J}9fdBn-^3JDum zxbrVCj_hS^td%J>1V+#{sBm?MPr}rA+!jaxZ5X1-j3Ft)3ASNKkPyUvGo-&Dv%^Ee zLO%eH=14?vk*8q6YTr&X``;nS;%zgF92#jp$6Wv|d)T<4F~V=zQ$xdS<-p}(nLo=* z(WtE9B^0`gm(b7-UP96T11So9RmJYt6rF$AxfTcS_HV zwUKKBQFDb_lCnW9jmnF@^aL7AN}-N;ftRy26))rUpR{_B+D^(dI-N!@C^;%@QnGmo zbq{6f!@`6xHg{NF8um>C_C_;yR8KN0UUpKv?MB7NUsinOj5NO%Qv6#4C7{Kq7+c_# zE^E7pJ=Wx6w}&kqA{kEACeSGl!QZu83U1hSG^}CA<{^%niXc~AjI})pZY2-2wqrAC zuazQPh4A0HOggGyv zEWH1{Tcs`T|mgz$L+9ZVD`c>8*CxCiD$hgBkt<{t@EUyFP#Ly|WKnXTnv*pEFAOt3`n zn`jB?Yi*2Ty+%ZY4KL1*qnvjp1~)j?LnDd99WfzP{u!GwBFNSz_>bUR+a)jO6X49# zuv%%Rt7Df4UC(m;yi0K0@uK!xWQI7fIX;%C`Z}^c&_UlhuDKZ5=0~ehiHS8G{6y_AI^`w!H}sVC zWpuU&(!tt0bSebxwG}g5a_6cu4qae}l3-EYA`|YQM9P%DF(_VL)E;3H+$nzem|N$l53y zDWGi-NsVnHdo`_huNJHlegfgbix9RNyoNyM7g64U3q*59wRp1?+SDNZnXnKv|D6qv~=d3v4m6k=Qz!08sMPa z1ZR0;dI=NR`Y};)-w75AnKvg1)Hyy*u=Ee0#*`V9=G--BRPs|OE7*r)l12G>_SZ3e zQf9g?OTNy5*pb|#amoB41#W?qkCEoJLG?ev-rPJh*toHYwoQ`RD|s9#kFS35*HGMk z|9&{*i{sDXgr%ejK3|MS>4eYnvxhZ`a;}2Iy9f-<-ZXp)WKNc-aWhI!EV6H*U^RJ# zf`;(9$CJVrBCf6~t1!B|Eg5Y*-Rn*Kdi8HaqHFEy?K3ds*#>e~#@PQ4-OtZpKf_g2hu6{klf`_vxFemtKVauHv%bkkV6nWh$#O@eu9VV)$Ir?!Iq z{*f%(OqT=eu)BmWL&8I_$tXznBX{vd+Ikd#=j$7Q{I$8kIoUdGbd zg=m<`?HWa^+rzd;@{pbsLa7?Pp!^;5oKMJEa>Ur+a%vF3+C>m(Fvm)kAS;zeR8pEP z2C*=ba%REw2a#>_wYdjE@RA3UqzEl^<5o17hiPp9qax$j&ck(lIOXs)dIf!`tE*lP z*W%?4gz-A`shudCvJp0M&hRx5aRiSD=aHF$*;5VZ z-*x3U773@45gUJrfgK0}!_klX-(Ey1ezvW^6)6u=ndYw}Esl^VPaJKhAc*WO6;3_F zW2zBJ#QJDk)Md$>OoHcTF6n4EPyK`7pd zUBe9K7BDvtq(**lJ?37}I7wN&^aUM7e$0I$va;8e@uP|M*^IB1mb zgG23uL;1m>R>GldaHwT)sAP$)u!g0oH3W@1Z=_-Kp4&N#V92)s_wNBr30!gi~gyizgN4 z8iR%Jd)(RN0n`|j2WM;6oNb5y!_IaaOx@1LGjpCN{3mBSB52MwSa&vCcW(>p*xo!7 zURflhbg6%Pt3xlk5zx#$2myxGxXV|mbkeUHsC7+O$cI~FMDz4H)nF0a3Dr}^* zOA*O!ldTPHelhA2`xS4%xe#mhRytBrcVIb-i~1gc1vfb!%9p_R3@p*zmT5GW5Dzl< z+(E`e4KnB}D2Ht5%q5S$Ne=gtlK(@n33CSb(pzO@KP#WK{&yICY-? z$uuS1Ok?|Zw#k6R+|#j{)JGVpeJ=hopnAXu=L)F9mi$hkc9&-BEY483`_riZp;Ptv zDvI?`{u{#Zhn1cafACqZ7rq%X??>Zo`rHlO<{pYV--vHxowOi+aR289;)dec7r)=& zdNObv`WsPV?^BZ=_qa&j!!{xP=sLX z9?txEM#VQtR{U_|>kpR-Xc84;lTk4>nUpvf&5RSO*pc2i!ESc`&szq^%|A(wzaOQv zAI69dzVjP#dNtKZ$_+o^#WKldWRAflZxUAe>mR4v{XIQ(C1 z`PA`3Iomfi3YY4iP3<4I8)vQ?hfh#{mNa(`Z(^c z!*rjy>#+vqn7eKlm80%@tVwBd*J0uxP)EG3D&5Ghc!HcK0T&|U;G2K|)ADN`jt`M& zkoq*q#d#CklpV(c5S%{7>msrUUhX928!)g>Amu#EeBxi!Yx7-yh>JN%{- zG~-Dw7G=uGgMwOPsPR4U;-Nbn3y4S2Xj_{cBiQi10H#Ta>5b-f6fk}Rt=`qyl@kSR z^F5j4U+^G>w^`O1XWAt5^_?AEIhO6#c1!sS4VJF1)TFl%YCWmG^!(a0KT4KlhuAc4 zWI)qAxNp5I1Z@rt3ERwtY{u<%o1|Sr^RvPNFG@RSgK5v<;^ZQ(w==w~X)!o-97ZPD z3F|pY*6K3UmD_22t70C<)I2pIVOYukF7Tnhb zqx8jmc{Jvko80Zmxezz>JQ)J+qzoQ+-2E?jD`a9{&Kxt~f~PVHy>7zJ&>Fri@KRC% z-*Cf&y_CU#+W?FgmcM zY+=Lad^GSw)bilg4Jga*f8U$~x929U2Yd%X-;O140ChWP-ebMyh6xTfeC|Zy_pE$w zjQJ_F@Obzt+c9^f@OSpj++o5r7B@SH#m-9-HnYrmiR^BczYRB&Xvk@Kep!O16!aB(^xp$SfQ z6JJg!7VOj4q@d*Mka}5&b(Ac4e=e^xzlD>S?H0cl&6N2{r1~ia#Hw}8Z;c3%H~)wZ z5^T*^FJJM^Sl#?OkkdC|%KXKhC(DmPu$KE>!<(Rv&KD*?pmZ#jqqW-F;0x$s9M3#D zRti{0A{G?eHZRb2N0K17===%tbEEuw`9mRpNKg4y@r&?emISejAXXAYzlYpH_ThKi zRNn^iE4#W5#zGf_&F+`?u^HnEjAw2?iPYG2jv^d)q1d%MtrmX2Rp?2WXJ~Oejxub2 zYPbyos|)?>wY_H|`n0!sP&-y+BexV!IF2LSaZBYv0pFrtyPg6B#9nT>Pk9@dpF>jK zhE$-^gX(cZczP7taJsm8aHFWCp-h`7D+VYVn}^aRhF-UtD2LNWhJ@KRXJF-FDhJ!K zE;3P%#xXVK2XdHwsC^!Yp2w=5k6mPeWNmyAX6Nd&NZjO6IA=yXv$~nQ*hs3%@CFvl z>A31FP+ehixm~Q#RtacATdI4aXS2ucxD9wF5?Ps6I5IS|7!)U3w_5^ z*mXF6&OJC&7gXO02RIBzh&5RE!SMU=`B^YeP6myq@au5goFoI(3!9FI^y3Zc6T0dt z&tP_Zw}Dg4DD-4+Kh<9_u+vW^42KU`LP9ntLn~8op%Mp;2q;H@4^IZCq94Cod<|ME z#3XM)3;3QZ`RV!M>HzlNPcQWC8=&x;d^Nhh6v*y99nVpB-KgpQEHQUpAW&Bm1P2y` zM!7qHvD{~TjluuyoD;;n^0MM@x*y?Oc=eZYU)lyQz#Jbu!i{6)d4tB>#0PguEJ%2a z2uD8CmVgZdvE>?YZLniYMblWj$v&wkkySl+_$UX_?Ww%q-e&Idc*{X zal_cWjT^_>?i;oD{Z~vb^*tX?%_!wUd<3JG$jA6}Z1+PPw%=2G;ZE({|M_dI-;x;f z?es<;tk1%D_QaC@!bSG{l9hZzy}o3qcq^L4EFB@lv)N0>i`IVZ^`*VDz?A3avVlex zVxUm|rj2vLZQ^+j_ClNjxZ`~DGn@#17zTkWky6Vzc<@69K7q{Ucpd`gGodiZmJW(@ zNW8y(gaSEbOx%d#N~~>8<%PB&EO<+ssj(p3Cz~ii=h(ja{^I z`Ko0FWd*Ut1?91&Mb8)1g_XS_*6m-LVUn#_uKXW!y*MBeS%U$0cKEV@4BXkF4{H@U;1ME!S4Vfj}C#vB!C7J8Mpe70j~x|?_d(AhmiDfI0?=8%r`HB#L7sb zRZ%277X^GY374Wt>Vr}C$C4>J9$y0|kgzy`L_|?}YbuGU*j_t^lh84eq@*-5wWN{p zr7krEe{!`dgM>Fwo<(^n zgA5s&L|ZdSs6}}p1`ceMI{CKWd+nJ zE-ol7D_L1i71GjzGTI~+(OXgp`mHUXk0psdp3M1!GelJR=duq!4M_gGR7yXBnF}~< z)v;)9uw!^>QEvX?#U%x$rSuy^(F%IYzz$ptpHyQ&KKTY0(!P-kxiEiG@zRo&YgR1I zg}7^r78TGLLs=nYT1?*uAo1eN`YQcMyE{%s(Oh%{-*)rHV>Bm$6mJGxbP}i zOs{w>&tFxzvZNq)5$01?P(sWD(^{5ava}#~l{$JUz3EZ17M#iHVW6$Q;d(fZUx`{C z$ItQkfGB)sKBSIKW47w+m!6iyd^C4Mb{))xRz_ddqQ~s(|1)wTh=_cGJFQRv4-80-$ z&_#Jw$;w6OuVQQkWuQ#VUFMag+$ML>Ui~ST z^X@E2w`dt}Cg#cg0P?))2`x~&SyKRQ^Td3(cfHiewRYnpuBDX_mu$z-WyNAT?umJ; zTG^Tertds~pZYw|?(VM9+n)bUqxaDFWwmcL{)d5Eq1(Jvh3@u}sAD0x?VpaH-3T7E z6_LQLPt2b__4-$Ze(v>e6#9ebBI@+)sZfVkcZG6&e&p3%pG{uS=T}}2hQx?%o|+@w z^0Hx=#fx(n7c5+}GrOwWhR?PWb3y<&4jo6>7sbK2YvLq5yXO^ZDWtiOs(lx%8T} ztf;iCU&RtRPT$$Uiw;(FN5k26fG~g23{zc5hW0r{I-G-z8)!PG!)N2Y_bN2=x~co zMhNS8Zqwmh9qt1s;R06nfDdS}jTYzx-{}Ny z7>8+fz_Cj;21z>nq7J9)aJ>%C)8QLBT&lx;3bp<(>+k{{-l@W4;8i-}_Z(p$N?N0J zII6>ApVi=#I-FOo!QZjWFB2z}&D0>+jr=gtK8QwqzDR0Rc))B8M)*cHo~y&F zo@VcV`Gn2&n1=4s(MV`iGTcU~-CA^bybf1l8{ur`=

SF45sR7>~CjVOIOsU_0UP z79DPSQiJ(_hJx5OG9W4B1UyRfd3ev!;AS0e(%}mnmWgVbwDx;?`^|Y8?19XQ_aCdT z6kG?Z^i4YbI2~@$;S3eVGIZ&PSvmv$|G>b9=Ib3s>FsOX?O9qoUMJK6=&%Ow*I`+Q z@kpWy#1mi6uT^hP(%XHp-}&KLlrnV0P>ujxsKb+W*s2S#ki+0qrLXPvdiyG!{uLdr z)Zu+P?0-ZPpiYNVb$-VH+c?8Xx`Y>Xf?AycUOQBQnsqoFPRi-GPSF_RIZlO->+mEU zZt17BFLAdI)L^_ptMqep`aK5NpEIo15yy3cnk22mEgi0(puxD*Rq2}&H8@3w`^0N- zmJUCsx3A_fG}@+5ph9o2UZ~N(WrY2?0C$r$M4e7x)qS8@hhNg2^pXzWcuJ$csl)a9 z1bj>yzi2!zfh{HI@Bm$)M|C)Lu-5*xO-J<68N8&!FYEAL9S+uQeo}{D9HKF}rNe`D zjp4;XozQMwBmH%Ft1iHF4nre1b&c4Hbb|eQxOh&7Z|E@YDOHB``ns*w;Yz)IhYsJ> z;dga7PpAJxhj;7k$8~tHHi1C83Voz{h&P`0oE9e)!)8-C-O3{4j#>zbm>EP(lwltp_~52mELc_=z6y z?1$iqMEEe}p#hilfLHc_pX~{=!{?3~ov`Iz7H~e1?LR+Z?6A1CWOzINg3pG?yHAlT^VsWhcIf(+&-_k=m4niDu_q<#OU-gm3x4h*{XS<&Nt7M>pbqOC4#&GFwqx$yJk_+ueY cT;7sC;QWBrK0jBCy7I`=9wT3^eVXY100Kx}O8@`> delta 16338 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 Date: Sat, 7 Mar 2026 20:52:34 +0100 Subject: [PATCH 05/12] Using hashmap for packets_sending --- src/cleanup_connection.c | 4 +-- src/initialize_client_connection.c | 2 +- src/initialize_server.c | 3 ++- src/internal/internal.h | 2 +- src/process_packets.c | 20 +++++---------- src/send_packet.c | 30 +++++++++++------------ src/swift_net.h | 4 +-- tests/integration_tests/output/run_tests | Bin 165112 -> 165112 bytes 8 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index 7fa1a6e..eb7921d 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -13,9 +13,9 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec allocator_destroy(&client->pending_messages_memory_allocator); allocator_destroy(&client->packets_completed_memory_allocator); - vector_destroy(&client->packets_sending); vector_destroy(&client->pending_messages); + hashmap_destroy(&client->packets_sending); hashmap_destroy(&client->packets_completed); } else { struct SwiftNetServer* const server = (struct SwiftNetServer*)connection; @@ -24,9 +24,9 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec allocator_destroy(&server->pending_messages_memory_allocator); allocator_destroy(&server->packets_completed_memory_allocator); - vector_destroy(&server->packets_sending); vector_destroy(&server->pending_messages); + hashmap_destroy(&server->packets_sending); hashmap_destroy(&server->packets_completed); } } diff --git a/src/initialize_client_connection.c b/src/initialize_client_connection.c index 90b4281..0fa037d 100644 --- a/src/initialize_client_connection.c +++ b/src/initialize_client_connection.c @@ -86,9 +86,9 @@ static inline struct SwiftNetClientConnection* const construct_client_connection new_connection->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); new_connection->pending_messages = vector_create(100); new_connection->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); - new_connection->packets_sending = vector_create(100); new_connection->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); new_connection->packets_completed = hashmap_create(); + new_connection->packets_sending = hashmap_create(); new_connection->packet_queue = (struct PacketQueue){ .first_node = NULL, diff --git a/src/initialize_server.c b/src/initialize_server.c index 4801d80..0018af7 100644 --- a/src/initialize_server.c +++ b/src/initialize_server.c @@ -46,9 +46,10 @@ static inline struct SwiftNetServer* const construct_server(const bool loopback, new_server->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); new_server->pending_messages = vector_create(100); new_server->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); - new_server->packets_sending = vector_create(100); new_server->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); + new_server->packets_completed = hashmap_create(); + new_server->packets_sending = hashmap_create(); return new_server; } diff --git a/src/internal/internal.h b/src/internal/internal.h index 7c40e29..696476c 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -284,7 +284,7 @@ extern void swiftnet_send_packet( const struct SwiftNetPacketBuffer* const packet, const uint32_t packet_length, const struct in_addr* const target_addr, - struct SwiftNetVector* const packets_sending, + struct SwiftNetHashMap* const packets_sending, struct SwiftNetMemoryAllocator* const packets_sending_memory_allocator, pcap_t* const pcap, const struct ether_header eth_hdr, diff --git a/src/process_packets.c b/src/process_packets.c index 5d32f55..f4817a7 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -240,22 +240,14 @@ static inline struct SwiftNetPendingMessage* const create_new_pending_message(st return new_pending_message; } -static inline struct SwiftNetPacketSending* const get_packet_sending(struct SwiftNetVector* const packet_sending_array, const uint16_t target_id) { - LOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); +static inline struct SwiftNetPacketSending* const get_packet_sending(struct SwiftNetHashMap* const packet_sending_array, uint16_t target_id) { + LOCK_ATOMIC_DATA_TYPE(&packet_sending_array->atomic_lock); - for(uint32_t i = 0; i < packet_sending_array->size; i++) { - struct SwiftNetPacketSending* const current_packet_sending = vector_get((struct SwiftNetVector*)packet_sending_array, i); + struct SwiftNetPacketSending* const result = hashmap_get(&target_id, sizeof(target_id), packet_sending_array); - if(current_packet_sending->packet_id == target_id) { - UNLOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); + UNLOCK_ATOMIC_DATA_TYPE(&packet_sending_array->atomic_lock); - return current_packet_sending; - } - } - - UNLOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); - - return NULL; + return result; } struct PacketQueueNode* const wait_for_next_packet(struct PacketQueue* const packet_queue) { @@ -295,7 +287,7 @@ static inline void swiftnet_process_packets( const uint16_t source_port, const bool loopback, const uint16_t addr_type, - struct SwiftNetVector* const packets_sending, + struct SwiftNetHashMap* const packets_sending, struct SwiftNetMemoryAllocator* const packets_sending_messages_memory_allocator, struct SwiftNetVector* const pending_messages, struct SwiftNetMemoryAllocator* const pending_messages_memory_allocator, diff --git a/src/send_packet.c b/src/send_packet.c index 0d9fdeb..29ad4fd 100644 --- a/src/send_packet.c +++ b/src/send_packet.c @@ -53,7 +53,7 @@ static inline void handle_lost_packets( const uint16_t source_port, const uint16_t destination_port, struct SwiftNetMemoryAllocator* const packets_sending_memory_allocator, - struct SwiftNetVector* const packets_sending, + struct SwiftNetHashMap* const packets_sending, const bool loopback, const uint16_t addr_type, const uint8_t prepend_size @@ -103,7 +103,7 @@ static inline void handle_lost_packets( while(1) { const enum RequestLostPacketsReturnType request_lost_packets_bitarray_response = request_lost_packets_bitarray(request_lost_packets_buffer, PACKET_HEADER_SIZE + prepend_size, (const struct sockaddr*)destination_address, pcap, packet_sending); - LOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); + LOCK_ATOMIC_DATA_TYPE(&packets_sending->atomic_lock); switch (request_lost_packets_bitarray_response) { case REQUEST_LOST_PACKETS_RETURN_UPDATED_BIT_ARRAY: @@ -111,15 +111,9 @@ static inline void handle_lost_packets( case REQUEST_LOST_PACKETS_RETURN_COMPLETED_PACKET: free((void*)packet_sending->lost_chunks); - for (uint32_t i = 0; i < packets_sending->size; i++) { - if (((struct SwiftNetPacketSending*)vector_get(packets_sending, i))->packet_id == packet_sending->packet_id) { - vector_remove(packets_sending, i); + hashmap_remove(&packet_sending->packet_id, sizeof(packet_sending->packet_id), packets_sending); - break; - } - } - - UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->atomic_lock); allocator_free(packets_sending_memory_allocator, packet_sending); @@ -160,7 +154,7 @@ static inline void handle_lost_packets( } } - UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->atomic_lock); } } @@ -171,7 +165,7 @@ inline void swiftnet_send_packet( const struct SwiftNetPacketBuffer* const packet, const uint32_t packet_length, const struct in_addr* const target_addr, - struct SwiftNetVector* const packets_sending, + struct SwiftNetHashMap* const packets_sending, struct SwiftNetMemoryAllocator* const packets_sending_memory_allocator, pcap_t* const pcap, const struct ether_header eth_hdr, @@ -240,17 +234,21 @@ inline void swiftnet_send_packet( return; } - LOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); - - vector_push((struct SwiftNetVector*)packets_sending, (struct SwiftNetPacketSending*)new_packet_sending); + LOCK_ATOMIC_DATA_TYPE(&packets_sending->atomic_lock); - UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); + uint16_t* const key_data_mem = allocator_allocate(&uint16_memory_allocator); + *key_data_mem = packet_id; new_packet_sending->lost_chunks = NULL; new_packet_sending->locked = false; new_packet_sending->lost_chunks = NULL; new_packet_sending->lost_chunks_size = 0; new_packet_sending->packet_id = packet_id; + atomic_store_explicit(&new_packet_sending->updated, NO_UPDATE, memory_order_release); + + hashmap_insert(key_data_mem, sizeof(uint16_t), new_packet_sending, packets_sending); + + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->atomic_lock); HANDLE_PACKET_CONSTRUCTION(&ip_header, &packet_info, addr_type, ð_hdr, mtu + prepend_size, buffer) diff --git a/src/swift_net.h b/src/swift_net.h index fea6067..bfb59cd 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -251,7 +251,7 @@ struct SwiftNetClientConnection { pthread_t process_packets_thread; struct SwiftNetVector pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; - struct SwiftNetVector packets_sending; + struct SwiftNetHashMap packets_sending; struct SwiftNetMemoryAllocator packets_sending_memory_allocator; struct PacketCallbackQueue packet_callback_queue; pthread_mutex_t execute_callback_mtx; @@ -279,7 +279,7 @@ struct SwiftNetServer { pthread_t process_packets_thread; struct SwiftNetVector pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; - struct SwiftNetVector packets_sending; + struct SwiftNetHashMap packets_sending; struct SwiftNetMemoryAllocator packets_sending_memory_allocator; struct SwiftNetHashMap packets_completed; struct SwiftNetMemoryAllocator packets_completed_memory_allocator; diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 395f784f8c920df381de2ad07894b12edb90dedb..6849025a087e69d579cb4acf04211eefddffba75 100755 GIT binary patch delta 35931 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 Jl9oKi>o4E4oJ9Zt delta 36029 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 Date: Sat, 7 Mar 2026 21:05:46 +0100 Subject: [PATCH 06/12] Pending messages using hashmap --- src/cleanup_connection.c | 6 ++-- src/execute_packet_callback.c | 15 +++----- src/initialize_client_connection.c | 2 +- src/initialize_server.c | 2 +- src/process_packets.c | 43 +++++++++-------------- src/send_packet.c | 2 +- src/swift_net.h | 4 +-- tests/integration_tests/output/run_tests | Bin 165112 -> 165112 bytes 8 files changed, 29 insertions(+), 45 deletions(-) diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index eb7921d..3d01682 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -13,8 +13,7 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec allocator_destroy(&client->pending_messages_memory_allocator); allocator_destroy(&client->packets_completed_memory_allocator); - vector_destroy(&client->pending_messages); - + hashmap_destroy(&client->pending_messages); hashmap_destroy(&client->packets_sending); hashmap_destroy(&client->packets_completed); } else { @@ -24,8 +23,7 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec allocator_destroy(&server->pending_messages_memory_allocator); allocator_destroy(&server->packets_completed_memory_allocator); - vector_destroy(&server->pending_messages); - + hashmap_destroy(&server->pending_messages); hashmap_destroy(&server->packets_sending); hashmap_destroy(&server->packets_completed); } diff --git a/src/execute_packet_callback.c b/src/execute_packet_callback.c index 17a2f13..15ddc36 100644 --- a/src/execute_packet_callback.c +++ b/src/execute_packet_callback.c @@ -33,17 +33,12 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc return node_to_process; } -static inline void remove_pending_message_from_vector(struct SwiftNetVector* const pending_messages, struct SwiftNetPendingMessage* const pending_message) { - LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); +static inline void remove_pending_message_from_vector(struct SwiftNetHashMap* const pending_messages, struct SwiftNetPendingMessage* const pending_message) { + LOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); - for (uint32_t i = 0; i < pending_messages->size; i++) { - const struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages, i); - if (current_pending_message == pending_message) { - vector_remove(pending_messages, i); - } - } + hashmap_remove(&pending_message->packet_id, sizeof(uint16_t), pending_messages); - UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); } void execute_packet_callback( @@ -54,7 +49,7 @@ void execute_packet_callback( struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, _Atomic bool* closing, void* const connection, - struct SwiftNetVector* const pending_messages, + struct SwiftNetHashMap* const pending_messages, _Atomic(void*)* user_data, pthread_mutex_t* const execute_callback_mtx, pthread_cond_t* const execute_callback_cond diff --git a/src/initialize_client_connection.c b/src/initialize_client_connection.c index 0fa037d..bc1c5c8 100644 --- a/src/initialize_client_connection.c +++ b/src/initialize_client_connection.c @@ -84,11 +84,11 @@ static inline struct SwiftNetClientConnection* const construct_client_connection new_connection->prepend_size = PACKET_PREPEND_SIZE(new_connection->addr_type); new_connection->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); - new_connection->pending_messages = vector_create(100); new_connection->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); new_connection->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); new_connection->packets_completed = hashmap_create(); new_connection->packets_sending = hashmap_create(); + new_connection->pending_messages = hashmap_create(); new_connection->packet_queue = (struct PacketQueue){ .first_node = NULL, diff --git a/src/initialize_server.c b/src/initialize_server.c index 0018af7..869f452 100644 --- a/src/initialize_server.c +++ b/src/initialize_server.c @@ -44,12 +44,12 @@ static inline struct SwiftNetServer* const construct_server(const bool loopback, atomic_store_explicit(&new_server->closing, false, memory_order_release); new_server->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100); - new_server->pending_messages = vector_create(100); new_server->packets_sending_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketSending), 100); new_server->packets_completed_memory_allocator = allocator_create(sizeof(struct SwiftNetPacketCompleted), 100); new_server->packets_completed = hashmap_create(); new_server->packets_sending = hashmap_create(); + new_server->pending_messages = hashmap_create(); return new_server; } diff --git a/src/process_packets.c b/src/process_packets.c index f4817a7..a47b835 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -94,21 +94,14 @@ static inline bool check_packet_already_completed(uint16_t packet_id, struct Swi return item != NULL; } -static inline struct SwiftNetPendingMessage* const get_pending_message(struct SwiftNetVector* const pending_messages_vector, const enum ConnectionType connection_type, const uint16_t packet_id) { - LOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); +static inline struct SwiftNetPendingMessage* const get_pending_message(struct SwiftNetHashMap* const pending_messages, const enum ConnectionType connection_type, uint16_t packet_id) { + LOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); - for(uint32_t i = 0; i < pending_messages_vector->size; i++) { - struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages_vector, i); + struct SwiftNetPendingMessage* const pending_message = hashmap_get(&packet_id, sizeof(uint16_t), pending_messages); - if(current_pending_message->packet_id == packet_id) { - UNLOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); - return current_pending_message; - } - } + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); - UNLOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); - - return NULL; + return pending_message; } static inline void insert_callback_queue_node(struct PacketCallbackQueueNode* const new_node, struct PacketCallbackQueue* const packet_queue) { @@ -137,7 +130,7 @@ static inline void insert_callback_queue_node(struct PacketCallbackQueueNode* co #ifdef SWIFT_NET_REQUESTS -static inline void handle_request_response(const uint16_t packet_id, struct SwiftNetPendingMessage* const pending_message, void* const packet_data, struct SwiftNetVector* const pending_messages, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, const enum ConnectionType connection_type, const bool loopback) { +static inline void handle_request_response(uint16_t packet_id, struct SwiftNetPendingMessage* const pending_message, void* const packet_data, struct SwiftNetHashMap* const pending_messages, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, const enum ConnectionType connection_type, const bool loopback) { bool is_valid_response = false; LOCK_ATOMIC_DATA_TYPE(&requests_sent.locked); @@ -164,16 +157,11 @@ static inline void handle_request_response(const uint16_t packet_id, struct Swif if (is_valid_response == true) { if (pending_message != NULL) { - LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); + LOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); - for (uint32_t i = 0; i < pending_messages->size; i++) { - const struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages, i); - if (current_pending_message == pending_message) { - vector_remove(pending_messages, i); - } - } + hashmap_remove(&packet_id, sizeof(uint16_t), pending_messages); - UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); } return; @@ -214,7 +202,7 @@ static inline void chunk_received(uint8_t* const chunks_received, const uint32_t chunks_received[byte] |= 1 << bit; } -static inline struct SwiftNetPendingMessage* const create_new_pending_message(struct SwiftNetVector* const pending_messages, struct SwiftNetMemoryAllocator* const pending_messages_memory_allocator, const struct SwiftNetPacketInfo* const packet_info, const enum ConnectionType connection_type, const uint16_t packet_id) { +static inline struct SwiftNetPendingMessage* const create_new_pending_message(struct SwiftNetHashMap* const pending_messages, struct SwiftNetMemoryAllocator* const pending_messages_memory_allocator, const struct SwiftNetPacketInfo* const packet_info, const enum ConnectionType connection_type, const uint16_t packet_id) { struct SwiftNetPendingMessage* const new_pending_message = allocator_allocate(pending_messages_memory_allocator); uint8_t* const allocated_memory = malloc(packet_info->packet_length); @@ -231,11 +219,14 @@ static inline struct SwiftNetPendingMessage* const create_new_pending_message(st new_pending_message->packet_id = packet_id; - LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); + LOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); + + uint16_t* const packet_id_mem = allocator_allocate(&uint16_memory_allocator); + *packet_id_mem = packet_id; - vector_push((struct SwiftNetVector*)pending_messages, new_pending_message); + hashmap_insert(packet_id_mem, sizeof(uint16_t), new_pending_message, pending_messages); - UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->atomic_lock); return new_pending_message; } @@ -289,7 +280,7 @@ static inline void swiftnet_process_packets( const uint16_t addr_type, struct SwiftNetHashMap* const packets_sending, struct SwiftNetMemoryAllocator* const packets_sending_messages_memory_allocator, - struct SwiftNetVector* const pending_messages, + struct SwiftNetHashMap* const pending_messages, struct SwiftNetMemoryAllocator* const pending_messages_memory_allocator, struct SwiftNetHashMap* const packets_completed_history, struct SwiftNetMemoryAllocator* const packets_completed_history_memory_allocator, diff --git a/src/send_packet.c b/src/send_packet.c index 29ad4fd..35ea992 100644 --- a/src/send_packet.c +++ b/src/send_packet.c @@ -47,7 +47,7 @@ static inline void handle_lost_packets( struct SwiftNetPacketSending* const packet_sending, const uint32_t mtu, const struct SwiftNetPacketBuffer* const packet, - pcap_t* pcap, + pcap_t* const pcap, const struct ether_header eth_hdr, const struct in_addr* const destination_address, const uint16_t source_port, diff --git a/src/swift_net.h b/src/swift_net.h index bfb59cd..306d01f 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -249,7 +249,7 @@ struct SwiftNetClientConnection { pthread_mutex_t process_packets_mtx; pthread_cond_t process_packets_cond; pthread_t process_packets_thread; - struct SwiftNetVector pending_messages; + struct SwiftNetHashMap pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; struct SwiftNetHashMap packets_sending; struct SwiftNetMemoryAllocator packets_sending_memory_allocator; @@ -277,7 +277,7 @@ struct SwiftNetServer { pthread_mutex_t process_packets_mtx; pthread_cond_t process_packets_cond; pthread_t process_packets_thread; - struct SwiftNetVector pending_messages; + struct SwiftNetHashMap pending_messages; struct SwiftNetMemoryAllocator pending_messages_memory_allocator; struct SwiftNetHashMap packets_sending; struct SwiftNetMemoryAllocator packets_sending_memory_allocator; diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 6849025a087e69d579cb4acf04211eefddffba75..a23516e1340fa57db197dd60bbe110f6008726a1 100755 GIT binary patch delta 31414 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 Im$rlgLQeMOcK`qY delta 31733 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 z Date: Wed, 11 Mar 2026 00:32:40 +0100 Subject: [PATCH 07/12] Removed vector usage from listener and instead using hashmap for faster access --- src/cleanup_connection.c | 30 ++++------------ src/cleanup_swiftnet.c | 4 +-- src/handle_packets.c | 42 +++++++++-------------- src/initialize_client_connection.c | 13 +++---- src/internal/check_existing_listener.c | 33 ++++++++++++------ src/internal/internal.h | 4 +-- src/memory_cleanup_background_service.c | 30 ++++++++-------- tests/integration_tests/output/run_tests | Bin 165112 -> 165112 bytes 8 files changed, 68 insertions(+), 88 deletions(-) diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index 3d01682..1e74fbf 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -36,35 +36,17 @@ static inline void remove_listener(const enum ConnectionType connection_type, co struct Listener* const current_listener = vector_get(&listeners, i); if (strcmp(interface_name, current_listener->interface_name) == 0) { if (connection_type == CONNECTION_TYPE_CLIENT) { - LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.atomic_lock); - for (uint16_t inx = 0; inx < current_listener->client_connections.size; inx++) { - struct SwiftNetClientConnection* const current_connection = vector_get(¤t_listener->client_connections, i); - if (current_connection != connection) { - continue; - } + hashmap_remove(&((struct SwiftNetClientConnection*)connection)->port_info.source_port, sizeof(uint16_t), ¤t_listener->client_connections); - vector_remove(¤t_listener->client_connections, inx); - - break; - } - - UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.atomic_lock); } else { - LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); - - for (uint16_t inx = 0; inx < current_listener->servers.size; inx++) { - struct SwiftNetClientConnection* const current_connection = vector_get(¤t_listener->servers, i); - if (current_connection != connection) { - continue; - } - - vector_remove(¤t_listener->servers, inx); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.atomic_lock); - break; - } + hashmap_remove(&((struct SwiftNetServer*)connection)->server_port, sizeof(uint16_t), ¤t_listener->servers); - UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.atomic_lock); } break; diff --git a/src/cleanup_swiftnet.c b/src/cleanup_swiftnet.c index d828ca6..ad560f2 100644 --- a/src/cleanup_swiftnet.c +++ b/src/cleanup_swiftnet.c @@ -16,8 +16,8 @@ static inline void close_listeners() { pcap_close(current_listener->pcap); - vector_destroy(¤t_listener->client_connections); - vector_destroy(¤t_listener->servers); + hashmap_destroy(¤t_listener->client_connections); + hashmap_destroy(¤t_listener->servers); } vector_destroy(&listeners); diff --git a/src/handle_packets.c b/src/handle_packets.c index 60601ef..c78a9b5 100644 --- a/src/handle_packets.c +++ b/src/handle_packets.c @@ -163,41 +163,33 @@ static void handle_client_init(struct SwiftNetClientConnection* user, const stru atomic_store_explicit(&client_connection->initialized, true, memory_order_release); } -static inline void handle_correct_receiver(const enum ConnectionType connection_type, struct Listener* const listener, const struct pcap_pkthdr* const hdr, const uint8_t* const packet, const struct SwiftNetPortInfo* const port_info) { +static inline void handle_correct_receiver(const enum ConnectionType connection_type, struct Listener* const listener, const struct pcap_pkthdr* const hdr, const uint8_t* const packet, struct SwiftNetPortInfo* const port_info) { if (connection_type == CONNECTION_TYPE_CLIENT) { - LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); + LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.atomic_lock); - for (uint16_t i = 0; i < listener->client_connections.size; i++) { - struct SwiftNetClientConnection* const client_connection = vector_get(&listener->client_connections, i); - if (client_connection->port_info.source_port == port_info->destination_port) { - UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); + struct SwiftNetClientConnection* const client_connection = hashmap_get(&port_info->destination_port, sizeof(uint16_t), &listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.atomic_lock); - if (client_connection->initialized == false) { - handle_client_init(client_connection, hdr, packet); - } else { - swiftnet_handle_packets(client_connection->port_info.source_port, &client_connection->process_packets_thread, client_connection, CONNECTION_TYPE_CLIENT, &client_connection->packet_queue, &client_connection->closing, client_connection->loopback, client_connection->addr_type, hdr, packet, &client_connection->process_packets_mtx, &client_connection->process_packets_cond); - } - - return; - } + if (client_connection == NULL) { + return; } - UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); + if (client_connection->initialized == false) { + handle_client_init(client_connection, hdr, packet); + } else { + swiftnet_handle_packets(client_connection->port_info.source_port, &client_connection->process_packets_thread, client_connection, CONNECTION_TYPE_CLIENT, &client_connection->packet_queue, &client_connection->closing, client_connection->loopback, client_connection->addr_type, hdr, packet, &client_connection->process_packets_mtx, &client_connection->process_packets_cond); + } } else { - LOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); - - for (uint16_t i = 0; i < listener->servers.size; i++) { - struct SwiftNetServer* const server = vector_get(&listener->servers, i); - if (server->server_port == port_info->destination_port) { - UNLOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); + LOCK_ATOMIC_DATA_TYPE(&listener->servers.atomic_lock); - swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet, &server->process_packets_mtx, &server->process_packets_cond); + struct SwiftNetServer* const server = hashmap_get(&port_info->destination_port, sizeof(uint16_t), &listener->servers); + UNLOCK_ATOMIC_DATA_TYPE(&listener->servers.atomic_lock); - return; - } + if (server == NULL) { + return; } - UNLOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); + swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet, &server->process_packets_mtx, &server->process_packets_cond); } } diff --git a/src/initialize_client_connection.c b/src/initialize_client_connection.c index bc1c5c8..13997e0 100644 --- a/src/initialize_client_connection.c +++ b/src/initialize_client_connection.c @@ -107,17 +107,12 @@ static inline struct SwiftNetClientConnection* const construct_client_connection return new_connection; } -static inline void remove_con_from_listener(const struct SwiftNetClientConnection* const con, struct Listener* const listener) { - LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); +static inline void remove_con_from_listener(struct SwiftNetClientConnection* const con, struct Listener* const listener) { + LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.atomic_lock); - for (uint16_t i = 0; i < listener->client_connections.size; i++) { - struct SwiftNetClientConnection* const client_connection = vector_get(&listener->client_connections, i); - if (client_connection == con) { - vector_remove(&listener->client_connections, i); - } - } + hashmap_remove(&con->port_info.source_port, sizeof(uint16_t), &listener->client_connections); - UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); + UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.atomic_lock); } struct SwiftNetClientConnection* swiftnet_create_client(const char* const ip_address, const uint16_t port, const uint32_t timeout_ms) { diff --git a/src/internal/check_existing_listener.c b/src/internal/check_existing_listener.c index d2687ac..c1f5e0f 100644 --- a/src/internal/check_existing_listener.c +++ b/src/internal/check_existing_listener.c @@ -1,4 +1,5 @@ #include "internal.h" +#include void* check_existing_listener(const char* interface_name, void* const connection, const enum ConnectionType connection_type, const bool loopback) { LOCK_ATOMIC_DATA_TYPE(&listeners.locked); @@ -7,17 +8,23 @@ void* check_existing_listener(const char* interface_name, void* const connection struct Listener* const current_listener = vector_get(&listeners, i); if (strcmp(interface_name, current_listener->interface_name) == 0) { if (connection_type == CONNECTION_TYPE_CLIENT) { - LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.atomic_lock); - vector_push(¤t_listener->client_connections, connection); + uint16_t* const restrict key_allocated_mem = allocator_allocate(&uint16_memory_allocator); + *key_allocated_mem = ((struct SwiftNetClientConnection*)connection)->port_info.source_port; - UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); + hashmap_insert(key_allocated_mem, sizeof(uint16_t), connection, ¤t_listener->client_connections); + + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.atomic_lock); } else { - LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.atomic_lock); + + uint16_t* const restrict key_allocated_mem = allocator_allocate(&uint16_memory_allocator); + *key_allocated_mem = ((struct SwiftNetServer*)connection)->server_port; - vector_push(¤t_listener->servers, connection); + hashmap_insert(key_allocated_mem, sizeof(uint16_t), connection, ¤t_listener->servers); - UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.atomic_lock); } UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); @@ -27,17 +34,23 @@ void* check_existing_listener(const char* interface_name, void* const connection } struct Listener* const new_listener = allocator_allocate(&listener_memory_allocator); - new_listener->servers = vector_create(10); - new_listener->client_connections = vector_create(10); + new_listener->servers = hashmap_create(); + new_listener->client_connections = hashmap_create(); new_listener->pcap = swiftnet_pcap_open(interface_name); new_listener->addr_type = pcap_datalink(new_listener->pcap); memcpy(new_listener->interface_name, interface_name, strlen(interface_name) + 1); new_listener->loopback = loopback; if (connection_type == CONNECTION_TYPE_CLIENT) { - vector_push(&new_listener->client_connections, connection); + uint16_t* const restrict key_allocated_mem = allocator_allocate(&uint16_memory_allocator); + *key_allocated_mem = ((struct SwiftNetClientConnection*)connection)->port_info.source_port; + + hashmap_insert(key_allocated_mem, sizeof(uint16_t), connection, &new_listener->client_connections); } else { - vector_push(&new_listener->servers, connection); + uint16_t* const restrict key_allocated_mem = allocator_allocate(&uint16_memory_allocator); + *key_allocated_mem = ((struct SwiftNetServer*)connection)->server_port; + + hashmap_insert(key_allocated_mem, sizeof(uint16_t), connection, &new_listener->servers); } vector_push(&listeners, new_listener); diff --git a/src/internal/internal.h b/src/internal/internal.h index 696476c..7eeedd1 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -150,8 +150,8 @@ enum AllocatorStackState { struct Listener { pcap_t* pcap; pthread_t listener_thread; - struct SwiftNetVector servers; - struct SwiftNetVector client_connections; + struct SwiftNetHashMap servers; + struct SwiftNetHashMap client_connections; char interface_name[IFNAMSIZ]; uint16_t addr_type; bool loopback; diff --git a/src/memory_cleanup_background_service.c b/src/memory_cleanup_background_service.c index 73c10bc..6486c5f 100644 --- a/src/memory_cleanup_background_service.c +++ b/src/memory_cleanup_background_service.c @@ -31,26 +31,24 @@ void* memory_cleanup_background_service() { for (uint32_t i = 0; i < listeners.size; i++) { struct Listener* const current_listener = vector_get(&listeners, i); - struct SwiftNetVector* const client_connections = ¤t_listener->client_connections; - struct SwiftNetVector* const servers = ¤t_listener->servers; + struct SwiftNetHashMap* const client_connections = ¤t_listener->client_connections; + struct SwiftNetHashMap* const servers = ¤t_listener->servers; - LOCK_ATOMIC_DATA_TYPE(&servers->locked); - LOCK_ATOMIC_DATA_TYPE(&client_connections->locked); + LOCK_ATOMIC_DATA_TYPE(&servers->atomic_lock); + LOCK_ATOMIC_DATA_TYPE(&client_connections->atomic_lock); - for (uint32_t client_connection_index = 0; client_connection_index < client_connections->size; client_connection_index++) { - struct SwiftNetClientConnection* const current_con = vector_get(client_connections, client_connection_index); + LOOP_HASHMAP(client_connections, + struct SwiftNetClientConnection* const client_connection = hashmap_data; + cleanup_packets_completed(&client_connection->packets_completed, &client_connection->packets_completed_memory_allocator); + ) - cleanup_packets_completed(¤t_con->packets_completed, ¤t_con->packets_completed_memory_allocator); - } + LOOP_HASHMAP(servers, + struct SwiftNetServer* const server = hashmap_data; + cleanup_packets_completed(&server->packets_completed, &server->packets_completed_memory_allocator); + ) - for (uint32_t server_index = 0; server_index < servers->size; server_index++) { - struct SwiftNetServer* const current_server = vector_get(servers, server_index); - - cleanup_packets_completed(¤t_server->packets_completed, ¤t_server->packets_completed_memory_allocator); - } - - UNLOCK_ATOMIC_DATA_TYPE(&servers->locked); - UNLOCK_ATOMIC_DATA_TYPE(&client_connections->locked); + UNLOCK_ATOMIC_DATA_TYPE(&servers->atomic_lock); + UNLOCK_ATOMIC_DATA_TYPE(&client_connections->atomic_lock); } UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index a23516e1340fa57db197dd60bbe110f6008726a1..4b54693fc56212faf9e16a9bed80e73ba1904e9e 100755 GIT binary patch delta 39904 zcmaI930&1h_dh-}7vzF~vR=4X?uCo&0t$+NiXiUhhC2#^mbs+nRxTMTE!tvUkM$`_ z1KYr-MXRTv#f|dG78A=B%L27RzgaHT!?o1k`+V-bdh7N4|Gr+A&wOUioH=vm%$ak} z%zSL$5YWCMVAEHsXRPD+;LzK8N+E?1%MJL0f4B9dELjkGy01Jt6&WpbUdD#rRp2UpJIGafR{_~oK}7CNuIxHrS2n*Zz0xKX8`?6~RXVw= ztF&e8YX?-0q4T2R_MvY*TO8ByaR}WyWBtvq89R ^^YzY-t%%=&UhV+iMNw?KP)F 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

eg0qVZcX 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%0D9zT7(Rm$xTe zeS6fL*wMpN4-8Gp{v>Sf0Q=e-#@thnt&&^7DUpyx(hX?QC8ouv1Fc=P0ipz|x= zc&qODnJ=w+x+8ky_viEJ8EM_01KUD&KUKZ`k>{!|fA`pLmn+YX@_1(1?$W(EuSVJP zVpsQne6yIhba>k9zk6;BT=)H!?R%1LxD>QBMi*aQJ@g^{;u-NT{krC|_uwIw!~fOw zCYbyk-s~jKUFt0IywU6f3&3&!VhO zDVlYL>4vE#Wrb#CS|03}ddxbYokFt?DHU{7e$U!_jgE6V-@kwJ`7GA^yz716^{#iV zy>5F`cS1UHLJI!d??2w~Aw(efiAW(xb3EkW1>$;9E*~R!$W4O-D}z*tf(1;BkjfzW z{CMl(QkA=(>EXvPCl##M5E~<4Uiq0!rRAkHriv9Ssx39ugqTbPlNJ^5LS*-rsrEFS z#jvZr;9H`MqO*nA02|kN*HbOD(M>{jfN`yADNmS$D5G?^CtZ5D~(#q>3tky$LCy>EgXYC*3VZ2xI8y;xVC~J}WI0j?kZ_ z_^Bmm&qzXS{tz!YOo-k?ZB{67=P^QFMP7FXbU#91jLbn|zeJv3_6I*|)P~bIZSuH00LF6-zp<*)TvL)-R=T{X%v`?GR8^BwQ*ACcRaCDx6>lgv zuP!Z0Dc*o$IzbyIOrdvbAGZ!b1u?MWgJiUGkw}Wbo&cSP{>9-sjrG@s?=^ML7MiZ#BQ{;HCGu5CaCA$= z(Jnd$zb^dH-YS_+^?fLuxEL=At7-F)Fe@rs2O)B$HlHcI z0;R@ivX?o6-mH&p?I)iH{Wl$HK<9Mn1wlsJnv;Yy*(#E|V*=`)6QC>JXUqRAh&0%u z$lj}v?~Erh$*aq67aFUc^Mid(Z$n+ob_noqD6{?o@GY3XB4;fu1pQVp$^1=6exA_R zS8yJNSc?QGbU@*LID%)lt09iat!Qxv%9cW>Ly-$|Owrz=b6w~OF7)_YwAFFPE#Sy> zp+~vUX)biC3q90@PI93WTv>LRA?(}U63Q(r69zGHn`9MF0`);?d?MAU1+Tf zExOQsnp+XNW_1C*F7&T1^i>zS%Z2{Yg}&rMfA2zn>q2+9(BE*{%3A-GOTifz`b!u3 z3m5utF7#(E^rtTL$1e1TE_AC4{ho$cZw{PyTngTHq4$DT9z~ILRe#3>47!&Mq~U`@ zA7tA4JTlrb@UHlhhD|x@fP4pK=@Uz$Iwf*F29F_0 zOp~t|=-Ge>>wz@+5;R#nEAbF-0)73S$$0W7;mOZ!>M>1hx)`6c8c)B>W&uU}z)1N9 zIdBA1f83QmMP0c*eLm8JZXx>n2pU$ms_z^#Gp&xMeZtJr~d=_x>538$g#*balO}W z*GuiSd;Wo9S%&;FSNscC+>U%*5PdExn$8a%D9ofAgXfKiLpY>h$BzgP%RBItYteQ_ z{~Np`a1?t$gI!wCgGRM%38FWGBLZr&r4L}k{rB8F&hH22FEc@@AIQygiH}8)9}zDL7?}C-YLY=v!Q9CUl8>Tixww@(bTYw z;5ouFqR$4ZGsgS~l76vod;TR!@Av^e4ke`RF-Z1>UDGr-@etUhC9KC8Yjb2u)Z?h<7R%V1gx<~;^gkGH^cBbf^mt@s zYMcJ%BOcjfpNO4|6xox2#$e5tgJVd5ejo|Bh{g2OA^xv4h1M~pFUXeGv$nXvX6x?u;pK|jGGc^2^T z4kG^z*ijqOGi5iCFODSv@%``p^F_(SS$jtGeNwY=5Pd6plp4){M{gD;@2QFrgot`l zFkTMs>)YCgR3j72bIXK(*3rH!(q4zg$`lrDkW!00IY#IA(gX;)P z6hbr7XBs!e^fR`kVkC9fk|t~$dzICvoyd1y@7qeR4GyKYM7{WsH+>{AM?B?2k0(Y1 zl!)>-eSIMx+#!9*W&})azbB@MdOw<+6t3|==dcnlWooHU`sk)yeJtc2@}=97$LDWkYaP~e z+j&X0dto)g(tZ7&30Qa!*{gktp#=D0F)vFmcpejWlM`57nu$%4Ux2Jaw+b>_X`DJ+ zy=cmixFvTv&BjUcqi$vwIL%&~@?U0cPO~=MZDu!m5d)iXC-_p|Vd1`PkKT@%3myH% zRA2hVkTh|uFVzj5nce)`AtJAT=i&TCK0B+@F+(&2;#iLUV+}K7kFp%+k)ap`B=EWX zLTqv#g{SR!E|{q>OnF16i9Wvco1x*s<*1Xbk5fH~ft9jFHiy+eXnM1Lg2)aM^+|G) zoK48xqi~R51D}PZ(4Xx64Gt>dAv*a1Ptw2~)(h=lbQXy{oqc_O?hGQm7*Wl7GrfOU zhS=SYzBTMmm`Y<)LWC%ql@i_msvdrM7+)*Y>0j%_jKfyA0J=IQBGQOBFu(rAC0cb@ ztGR?kUrLEDX@M6wgVyI%4w4IZib~s<_n%{Yf!~%>=_wa(_PELa1pLDDY7Cf6;UTS3 zc2waD3cXL^>lFG;(9C-}Jawq}i4R?t8Y?yHF|(!)($ptC3rqW&cG0uJZ((>jvq^x=c7YnYE{uUW|jxkkyga)pxX<(In`H4y;MIRWO{) zVY9cvF%9P^;dMh6T2bj|2^?T27?(HBOCgzp2zl=Z>4 zEC236kB?3Z--%*2beQd1!zRq}y$21?OctN1p)7tnA#WisO zT0bUkjwfuO6YJT+!L|bL!;N=;SlguXG|Eih!meo035lmYGB(`k3t_?g4|u$mdOh|; zKG*}H#(LT|CPJ#mp6f z7#(p(yax_^UH^uYciyqjI@!&wC8(|sGuHE1pjq_|$Qx@72+07)b0}kztX=Bg!(4E6 zN003pHl{62*iucEJiU|05qaj__x>3hLpX_}gqVHmB6LR!{f;sFj*0pEO~6>A+~fp%w7_==h`d%SY3S6HVgIGFOU-iUTwzh z3!AGV2-(2GG7)ktXFYkRLMMhgCV}V+CwKRTY!A1iIRl_*m*(~)Mv`=;66_Nywe+2F zNxt=2@mhIPEWyAGa}1_Gj~gPc)X}K%V?22GQPcRBk{^LVSMRpL3l_Y8Vrj(tS zMn@H(4wbKy>oj!9goQrLWk1#Bbo$e;#U z$A0qfIEUhDvn$r_BX7XO%?@zCOX10hQ;hpNaVjDxBXfM^cUaj(A}{eEKgZ%GGR4`Q z5x5azbAYou&jG958RqEb^fwxsF)=~V)4L|l@keX0NV5mg5q*XpciC6eyUy}EaH)L#o|)La&S>hZm6WTZ zSsr`NPaYzA@?)||qQO&>$8AT8V*2{_>O>pdowNrhO8x~fGwetK~D8_J^;?)U)t5!}w%aVlqrwf#C; zK7G9SijKZMJzRWKq(`SG$6XOwpgJ;AIS^yTamDlT$@fwP3 z-p1Yz4`c5Ozx8cZeIDSLN$;BRhUlxKzBAKAfo0(aymsjQN=uadAILE%yJ+Q1gGM3h zW)8H*uwiD?$T6rvq0!DrCymW}xRb_nAL67j{Tpu5S~jb}$!@-A=v6+ud9sJne?r>@x%C0tpqo8;I<{r_fw8)czoMp_xj39p~((4Yz|4)QeFNK zRFjq;moOKM!hSuY590mF`3pp5JAMg9m>^E)d)teMJV{G8=H~=X1j}}#Z*M!qI$p%u zrKQL7!^OW~cFIo?AJ)?Fd1I{Xj-9|p6jl~x9&w%_alggqmNxx$fB7PeTvX?mw%8s& z`8PHl_!)cugB)|SfjtO4pj~a0;3VQ|8RH`&|bUL8JBP74H;JBCl7#2 zT^NxBu^_wra3ApQK_b!h1`|tZZyXyWxBtL6HjlUP_ zNda4%h}M?BS3{%bFBAsRwew%rb>QjzLZWdCJ{GrW=%ocw30Y8M?{1ih4A9%T2^&l> z)6B$h4NX}%8z$~w_@-_>Oq5DAW6?V)J3toV2As_rH8=iwq(D$-g1-P?#YWqPgXJ@z zZIF3dqEU;3#d>Hi&Jkab=*GoSUPDpHM(i4i?p&N9{#~MH7pI9)67^j&My!zNv?U32 z?6NTQ|AJ*vK^2Nw;)ub7gIKre`vud7mJPDzgU_yo3$>(xbv7G@Ch&|{JDh!j>pNw5 z&II3%ZO_fVIoMyuWj|Xx+G1lul#>MBo8C4aI&lT-D&Ostzif~tiFh}#dn`V_Gfb&t zF^qn}ka1R-fGYKRiXJR=t>c zbZ0kQJKxt=pEG=@%wDIc7Y_!uhrbD+UK` zPB+k2b1Vxj+hiQUB@lY0K8assV-VEGE*&k;gj1~69NsIFX~6OU#m?Em`wx^BWy)i? zQYu#(iJa|JoF{r^#5yaE<~DYZb2Bq}e@9f0-VV_cOH53-j%#J>d^TiB-c zJi;}K{=9r>7#5hl5U^><-W~{q6pKmGi%662Rhm(hBN|1vlzPt++1(HVV3X+fqA*Pm zwqfkFOWTSx*6*(LZT%ke$p3P%4qcDPG$%#soDMd}rfcP+SP-^c#g*y*XjmO)3q|kQ z+w~4WZ!Pq$RlL*m`$~b%D^5tbxtR&?*|A4B@g79>Ph6at2%p(Kl452;EZtr_Oq_b1 z9xsj%%=A)mvd~TYTcU+Mbd+UeF!QCc_SD!NwWr4xZhmrX2ZrdqSLywh@Zj~XMGtzu zwhp%@l~?KOmf&C`9;LF|iiOuKSLs>H65m(h1v^_QUI;X2MLbS$D^}EE^1HNRq$tPI z=#@25%{ex$-1wq!;>9BI1RINYK&`QMagRdN-76!k9^fe9$1=*sr5EckJUDsC>u@29 z6S;Ez5e#1#pY4+#Lm9i;*o6I>lUD`aDO~-3Ii3VEz3AACRdv{vvGTDf3qtMq@WFtm zqb;X(s9d;Ql8;~Mv$DqpFT(U-c*sZ5-Gw{V8!KGe;aWqz$qGRHIR_TK}5Jbh=}(l5bxH}L|l|fNK6(H zV(uW)47`NZj3YX`bvzM=<1YJ|Y$BY=CYo=JggifiNS{q4LP;)>_D>>Y#$@0r@IH@_ z&+>@SjePi2B4kb_nq5-~=>e^oMl@y9aXgq#wDowKl{kxtC9~kjY$6)w5Z!?Smz+#){x8KVf4&5!Ocu{yxzJjw)YNl|9v`{16%Sm+L!xhEJsbHsJ-4N)4K) zv`_2AMLyBPXZVtDzW)2kFHgZ)NERU3xo)BJ3%Ok1%0+IvTRon!>a}^E+NoY%QkUct zUAf3<==2#~o^EO`_DXnTNp>Oae^zydIj8(`ef@K}!4jWn|6Hbu0w#YFsg=v4)#}eh zKKG{lo;Y2Mut#UJ3uF9kY!bpJSGLhSSF7^3WpO-)=XdZNj~4sc_Uzs?V0^zAkO(iy z#X3KZ2DFw~69pn-(<*L6+J>|r=_Jw>fk^%$ky0a6uG9nv+gA-aX{XU2CEyC;u?0Yln5R59aS*j*=66!^{M2-xH=zbeSr6QBLxVXwvT}|u~zWaM!qPx$A8umc6 zT`_3e%oMs31QUJZ;{mCcQP2n$k(RGnvBFaI-!*+F6`|VY=Au>Pio|p#KdpgZs0@EM zOMNMmC4fv%0?B}&; zT(zZYEov?;Ur|xD+FVmwQBJmMtHCa>Av?7=9HB0WbPk4=t(NIF;x7^ZD<+*C|DIphc>>NsSiyQHMTM)Vc~G%eYol*WgiXt}&D6JT#>F zX=b$Egg@Q$@aM=f$iW%a4msdagOFEOo8egrzUC~0_CXJ#GgnqxAXQW06uh7-B3E_A zh;>!P2B#NfyGLbJMG^Elr<&}xdawcQRD0W_+Co0|AfnoeuXUw}s)=;Mvn`)6&kkGQ zPf;0TlcRdIE3jcjyUBjN+GO&j9w(gwMmWcQUwVYgsMtL!*^+ZFJFkBvO zh0$v)h7Faht6XE)zVlit@K+9zz7-OHU<)UwKO8TotU@3h}4A0Dmsu9>Hs# zw@1**Lb%E64??)hvxw~VbPr*>r+WymFgI^T@HbCH@If!vPTTIO4jsHn*Wqb16q=MD zl(XmO32zPg7LzyP*TVjGDsexcaO?`FLE)SMhj$~Dy`tb1Hb&aJQ5qtvA5NVMr zNsp$=a`zgHJ90o&*CI9nY+(+_JvLIpB`5nGxH9g!S$EOv4!+ zZ9F!_dN}SG;fP?bKf-bS3>ClR#IscVKF0^FvsK1vCu6aSFLF%G zD%PU!n8!0Xj^+3nj>mI+hU0}C8;VqYn;UN8*gAs?;I*+@0mlNq>Sq-WEl~~N)>FY{ z9A|O7i{pHb&vCqpV?(K`zlGx&96zVxY*NP=uQLX=+H=;b3h#1Uj2$QZAV)Z^+o<9% z8TO>Jj>lOOdC-y}<_Fm`3sn)eCu6w%P8B283LeX`iQ_^LtP0db{4iAJw5s@djw?An z$nkKFkEz&7>N(>(#(QofYqY>vlrhZk{N&v6yUKJ!(5Tt+GS z1=v-CB+n@rW7ubi%Gk#kXhCDEirYAD<@hU(&v1+@JH;UTM+%VSCtjY(%RRA?V)oiO zPGT4`&VQ`IO%(C7LVz4p4Xoq}F&sb2v5{lk`6>pD+~B(m!(btQa!>Q}JTCto$Auj0 zBvn71>xThbnE`yyqqJZc7qD@K$s9LwyozDSht5;wAK*BT!=`pUrVivRXkI$7MVMGRMU@sxt>0 zId0_G+RPaxyu}AN9?Jzj<=DhuaS^X8d;k9n~VK@92H*CKRqyOK!jX}sqZWtfK+}46~Zukc`e8mm_#|;a5 z7kj9mc)2ow{oQb+8%}b=8E!b&4bOJNOI$FkpIBTN3|G40b#B<|h97dn^(toLP5Cvt z;a6{ArGA3f{Vc>c6+U&tr`+%bH;iw>ZqvWvhJ8I!=k$851LzeRaC)%7c+veTfSJVINLBRU=_!!XQ~xtFRLMPy z&+HViHLswWuln|Qp8HtX)A99v;{QMQB1_wM@9E$1vXIH{X;M~K6tBTQFtP&zVdr<} z(TJaL|A@lJ;~>!1Jomwo3heczms+VpjprY`Vyf<+ zZ0$c{*xYmD90%?woAALCe{Fj*Ftz39U+sTgxv+QJ=fmfI@{y?BG3(CaK_{=wZP>i@ ztF0MFPrd!?lk4{WCCuIzIRC;wI-_=stk~xN-Lv-o$pS6eGDRGfu|50ZsK=kA;@1&@ z<_DV}kQa}7{-wippA{TE^yD#oxLWM>)qPugKN}SFOSebuKL(wD_T=tkjZx-r2fe$h zIdaA32Oqz>JT~dd_J?}{azFgE;@CU7eb2qqT7BcQ=a(I-`QZ_9N#|?tiLZR-_wu3b I!2yK)KT=wZr~m)} From 03afd7f9a039353e76d7ce8b7eb62c4bb00c0762 Mon Sep 17 00:00:00 2001 From: Morcules Date: Sun, 22 Feb 2026 11:21:45 +0100 Subject: [PATCH 03/12] Fixed bug. Another bug occured --- src/internal/datatype_hashmap.c | 13 +++++++++---- src/process_packets.c | 8 +++++++- tests/integration_tests/output/run_tests | Bin 166072 -> 166072 bytes 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/internal/datatype_hashmap.c b/src/internal/datatype_hashmap.c index bcbc9d8..11cbac5 100644 --- a/src/internal/datatype_hashmap.c +++ b/src/internal/datatype_hashmap.c @@ -89,14 +89,17 @@ struct SwiftNetHashMap hashmap_create() { }; } -void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* restrict const hashmap) { +void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNetHashMap* const hashmap) { const uint64_t key = get_key(key_data, data_size, hashmap); struct SwiftNetHashMapItem* current_item = hashmap->items + key; - if (current_item->next == NULL) { + /*if (current_item->next == NULL) { + printf("%p\n", key_data); + printf("no next\n"); + printf("%p\n", current_item->value); return current_item->value; - } + }*/ while (current_item != NULL) { if (data_size == current_item->key_original_data_size && memcmp(current_item->key_original_data, key_data, data_size) == 0) { @@ -105,13 +108,14 @@ void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNe current_item = current_item->next; + printf("collision\n"); continue; } return NULL; } -void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* restrict const hashmap) { +void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* const hashmap) { const uint64_t key = get_key(key_data, data_size, hashmap); struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; @@ -168,6 +172,7 @@ void hashmap_remove(void* const key_data, const uint32_t data_size, struct Swift memcpy(current_target_item, next, sizeof(struct SwiftNetHashMapItem)); next->value = NULL; + next->next = NULL; allocator_free(&hashmap_item_memory_allocator, next); } diff --git a/src/process_packets.c b/src/process_packets.c index d80bd72..2a9a48b 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -90,13 +90,19 @@ static inline void packet_completed(uint16_t packet_id, struct SwiftNetHashMap* uint16_t* heap_key_data_location = allocator_allocate(&uint16_memory_allocator); *heap_key_data_location = packet_id; + printf("completing packet: %d\n", packet_id); + hashmap_insert(heap_key_data_location, sizeof(uint16_t), new_packet_completed, packets_completed_history); return; } static inline bool check_packet_already_completed(uint16_t packet_id, struct SwiftNetHashMap* const packets_completed_history) { + printf("packet completed id: %d\n", packet_id); const struct SwiftNetPacketCompleted* const item = hashmap_get(&packet_id, sizeof(packet_id), packets_completed_history); + if(item != NULL) { + printf("id: %d\n", item->packet_id); + } return item != NULL; } @@ -543,12 +549,12 @@ static inline void swiftnet_process_packets( } if (check_packet_already_completed(ip_header.ip_id, packets_completed_history)) { + printf("PACKET COMPLETED\n"); allocator_free(&packet_buffer_memory_allocator, packet_buffer); goto next_packet; } struct SwiftNetClientAddrData sender = { - .maximum_transmission_unit = packet_info.maximum_transmission_unit, .port = packet_info.port_info.source_port, }; diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index 648dc613c7e11fc4fbcbf2e683228505735243d2..bedfdf9076b83f661f0650f8e35f3ef91be66c3f 100755 GIT binary patch delta 31039 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 c*MiF`)NT Date: Sat, 28 Feb 2026 12:22:36 +0100 Subject: [PATCH 04/12] Added atomic lock macro --- src/cleanup_connection.c | 12 ++-- src/cleanup_swiftnet.c | 2 +- src/execute_packet_callback.c | 19 ++----- src/handle_packets.c | 27 +++------ src/initialize_client_connection.c | 9 +-- src/initialize_server.c | 5 +- src/internal/check_existing_listener.c | 14 ++--- src/internal/datatype_hashmap.c | 40 +++++++++---- src/internal/datatype_vector.c | 11 ---- src/internal/internal.h | 39 ++++++++++++- src/make_request.c | 4 +- src/memory_cleanup_background_service.c | 37 ++++++------ src/process_packets.c | 68 ++++++++--------------- src/send_packet.c | 29 +++------- src/swift_net.h | 24 ++++---- tests/integration_tests/output/run_tests | Bin 166072 -> 165112 bytes tests/performance_tests/output/run_tests | Bin 59528 -> 59640 bytes 17 files changed, 166 insertions(+), 174 deletions(-) diff --git a/src/cleanup_connection.c b/src/cleanup_connection.c index 9a0e44e..7fa1a6e 100644 --- a/src/cleanup_connection.c +++ b/src/cleanup_connection.c @@ -32,13 +32,13 @@ static inline void cleanup_connection_resources(const enum ConnectionType connec } static inline void remove_listener(const enum ConnectionType connection_type, const char* interface_name, void* const connection) { - vector_lock(&listeners); + LOCK_ATOMIC_DATA_TYPE(&listeners.locked); for (uint16_t i = 0; i < listeners.size; i++) { struct Listener* const current_listener = vector_get(&listeners, i); if (strcmp(interface_name, current_listener->interface_name) == 0) { if (connection_type == CONNECTION_TYPE_CLIENT) { - vector_lock(¤t_listener->client_connections); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); for (uint16_t inx = 0; inx < current_listener->client_connections.size; inx++) { struct SwiftNetClientConnection* const current_connection = vector_get(¤t_listener->client_connections, i); @@ -51,9 +51,9 @@ static inline void remove_listener(const enum ConnectionType connection_type, co break; } - vector_unlock(¤t_listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); } else { - vector_lock(¤t_listener->servers); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); for (uint16_t inx = 0; inx < current_listener->servers.size; inx++) { struct SwiftNetClientConnection* const current_connection = vector_get(¤t_listener->servers, i); @@ -66,14 +66,14 @@ static inline void remove_listener(const enum ConnectionType connection_type, co break; } - vector_unlock(¤t_listener->servers); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); } break; } } - vector_unlock(&listeners); + UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); } static inline const char* get_interface_name(const bool loopback) { diff --git a/src/cleanup_swiftnet.c b/src/cleanup_swiftnet.c index d875ded..d828ca6 100644 --- a/src/cleanup_swiftnet.c +++ b/src/cleanup_swiftnet.c @@ -5,7 +5,7 @@ #include static inline void close_listeners() { - vector_lock(&listeners); + LOCK_ATOMIC_DATA_TYPE(&listeners.locked); for (uint16_t i = 0; i < listeners.size; i++) { struct Listener* const current_listener = vector_get(&listeners, i); diff --git a/src/execute_packet_callback.c b/src/execute_packet_callback.c index 28e2a16..17a2f13 100644 --- a/src/execute_packet_callback.c +++ b/src/execute_packet_callback.c @@ -7,18 +7,11 @@ #include #include -static inline void lock_packet_queue(struct PacketCallbackQueue* const packet_queue) { - enum PacketQueueOwner owner_none = NONE; - while(!atomic_compare_exchange_strong_explicit(&packet_queue->owner, &owner_none, SOME, memory_order_acquire, memory_order_relaxed)) { - owner_none = NONE; - } -} - static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struct PacketCallbackQueue* const packet_queue) { - lock_packet_queue(packet_queue); + LOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); if(packet_queue->first_node == NULL) { - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return NULL; } @@ -28,20 +21,20 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc packet_queue->first_node = NULL; packet_queue->last_node = NULL; - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return node_to_process; } packet_queue->first_node = node_to_process->next; - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return node_to_process; } static inline void remove_pending_message_from_vector(struct SwiftNetVector* const pending_messages, struct SwiftNetPendingMessage* const pending_message) { - vector_lock(pending_messages); + LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); for (uint32_t i = 0; i < pending_messages->size; i++) { const struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages, i); @@ -50,7 +43,7 @@ static inline void remove_pending_message_from_vector(struct SwiftNetVector* con } } - vector_unlock(pending_messages); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); } void execute_packet_callback( diff --git a/src/handle_packets.c b/src/handle_packets.c index 440b94d..60601ef 100644 --- a/src/handle_packets.c +++ b/src/handle_packets.c @@ -10,17 +10,6 @@ #include "internal/internal.h" #include -static inline void lock_packet_queue(struct PacketQueue* const packet_queue) { - enum PacketQueueOwner owner_none = NONE; - while(!atomic_compare_exchange_strong_explicit(&packet_queue->owner, &owner_none, SOME, memory_order_acquire, memory_order_relaxed)) { - owner_none = NONE; - } -} - -static inline void unlock_packet_queue(struct PacketQueue* const packet_queue) { - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); -} - static inline void insert_queue_node( struct PacketQueueNode* const new_node, struct PacketQueue* const packet_queue, @@ -31,7 +20,7 @@ static inline void insert_queue_node( return; } - lock_packet_queue(packet_queue); + LOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); if(packet_queue->last_node == NULL) { packet_queue->last_node = new_node; @@ -45,7 +34,7 @@ static inline void insert_queue_node( packet_queue->first_node = new_node; } - unlock_packet_queue(packet_queue); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return; } @@ -176,12 +165,12 @@ static void handle_client_init(struct SwiftNetClientConnection* user, const stru static inline void handle_correct_receiver(const enum ConnectionType connection_type, struct Listener* const listener, const struct pcap_pkthdr* const hdr, const uint8_t* const packet, const struct SwiftNetPortInfo* const port_info) { if (connection_type == CONNECTION_TYPE_CLIENT) { - vector_lock(&listener->client_connections); + LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); for (uint16_t i = 0; i < listener->client_connections.size; i++) { struct SwiftNetClientConnection* const client_connection = vector_get(&listener->client_connections, i); if (client_connection->port_info.source_port == port_info->destination_port) { - vector_unlock(&listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); if (client_connection->initialized == false) { handle_client_init(client_connection, hdr, packet); @@ -193,14 +182,14 @@ static inline void handle_correct_receiver(const enum ConnectionType connection_ } } - vector_unlock(&listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); } else { - vector_lock(&listener->servers); + LOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); for (uint16_t i = 0; i < listener->servers.size; i++) { struct SwiftNetServer* const server = vector_get(&listener->servers, i); if (server->server_port == port_info->destination_port) { - vector_unlock(&listener->servers); + UNLOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet, &server->process_packets_mtx, &server->process_packets_cond); @@ -208,7 +197,7 @@ static inline void handle_correct_receiver(const enum ConnectionType connection_ } } - vector_unlock(&listener->servers); + UNLOCK_ATOMIC_DATA_TYPE(&listener->servers.locked); } } diff --git a/src/initialize_client_connection.c b/src/initialize_client_connection.c index 413187e..90b4281 100644 --- a/src/initialize_client_connection.c +++ b/src/initialize_client_connection.c @@ -95,19 +95,20 @@ static inline struct SwiftNetClientConnection* const construct_client_connection .last_node = NULL }; - atomic_store_explicit(&new_connection->packet_queue.owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&new_connection->packet_queue.locked); + UNLOCK_ATOMIC_DATA_TYPE(&new_connection->packet_callback_queue.locked); + atomic_store_explicit(&new_connection->closing, false, memory_order_release); atomic_store_explicit(&new_connection->initialized, false, memory_order_release); atomic_store_explicit(&new_connection->packet_handler_user_arg, NULL, memory_order_release); memset(&new_connection->packet_callback_queue, 0x00, sizeof(struct PacketCallbackQueue)); - atomic_store_explicit(&new_connection->packet_callback_queue.owner, NONE, memory_order_release); return new_connection; } static inline void remove_con_from_listener(const struct SwiftNetClientConnection* const con, struct Listener* const listener) { - vector_lock(&listener->client_connections); + LOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); for (uint16_t i = 0; i < listener->client_connections.size; i++) { struct SwiftNetClientConnection* const client_connection = vector_get(&listener->client_connections, i); @@ -116,7 +117,7 @@ static inline void remove_con_from_listener(const struct SwiftNetClientConnectio } } - vector_unlock(&listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(&listener->client_connections.locked); } struct SwiftNetClientConnection* swiftnet_create_client(const char* const ip_address, const uint16_t port, const uint32_t timeout_ms) { diff --git a/src/initialize_server.c b/src/initialize_server.c index 3b12171..4801d80 100644 --- a/src/initialize_server.c +++ b/src/initialize_server.c @@ -36,8 +36,9 @@ static inline struct SwiftNetServer* const construct_server(const bool loopback, memset(&new_server->packet_callback_queue, 0x00, sizeof(struct PacketCallbackQueue)); - atomic_store_explicit(&new_server->packet_queue.owner, NONE, memory_order_release); - atomic_store_explicit(&new_server->packet_callback_queue.owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&new_server->packet_queue.locked); + UNLOCK_ATOMIC_DATA_TYPE(&new_server->packet_callback_queue.locked); + atomic_store_explicit(&new_server->packet_handler, NULL, memory_order_release); atomic_store_explicit(&new_server->packet_handler_user_arg, NULL, memory_order_release); atomic_store_explicit(&new_server->closing, false, memory_order_release); diff --git a/src/internal/check_existing_listener.c b/src/internal/check_existing_listener.c index 9da0f79..d2687ac 100644 --- a/src/internal/check_existing_listener.c +++ b/src/internal/check_existing_listener.c @@ -1,26 +1,26 @@ #include "internal.h" void* check_existing_listener(const char* interface_name, void* const connection, const enum ConnectionType connection_type, const bool loopback) { - vector_lock(&listeners); + LOCK_ATOMIC_DATA_TYPE(&listeners.locked); for (uint16_t i = 0; i < listeners.size; i++) { struct Listener* const current_listener = vector_get(&listeners, i); if (strcmp(interface_name, current_listener->interface_name) == 0) { if (connection_type == CONNECTION_TYPE_CLIENT) { - vector_lock(¤t_listener->client_connections); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); vector_push(¤t_listener->client_connections, connection); - vector_unlock(¤t_listener->client_connections); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->client_connections.locked); } else { - vector_lock(¤t_listener->servers); + LOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); vector_push(¤t_listener->servers, connection); - vector_unlock(¤t_listener->servers); + UNLOCK_ATOMIC_DATA_TYPE(¤t_listener->servers.locked); } - vector_unlock(&listeners); + UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); return current_listener; } @@ -42,7 +42,7 @@ void* check_existing_listener(const char* interface_name, void* const connection vector_push(&listeners, new_listener); - vector_unlock(&listeners); + UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); pthread_create(&new_listener->listener_thread, NULL, interface_start_listening, new_listener); diff --git a/src/internal/datatype_hashmap.c b/src/internal/datatype_hashmap.c index 11cbac5..cb52e48 100644 --- a/src/internal/datatype_hashmap.c +++ b/src/internal/datatype_hashmap.c @@ -3,6 +3,7 @@ #include "internal.h" #include #include +#include // Initialized in swiftnet_initialize function with rand uint64_t seed; @@ -39,6 +40,10 @@ static inline void hashmap_resize(struct SwiftNetHashMap* const hashmap) { // Realloc doesn't make sense here bcs we have to rehash and copy rehashed keys. hashmap->items = calloc(sizeof(struct SwiftNetHashMapItem), new_capacity); + free(hashmap->item_occupation); + + hashmap->item_occupation = calloc(sizeof(uint32_t), (new_capacity + 31) / 32); + for (uint32_t i = 0; i < old_capacity; i++) { struct SwiftNetHashMapItem* const current_hashmap_item = old_data_location + i; if (current_hashmap_item->value == NULL) { @@ -52,6 +57,12 @@ static inline void hashmap_resize(struct SwiftNetHashMap* const hashmap) { const uint64_t new_key = get_key(key_original_data, key_original_data_size, hashmap); struct SwiftNetHashMapItem* new_mem_hashmap_item = hashmap->items + new_key; + + const uint32_t byte = new_key / 32; + const uint8_t bit = new_key % 32; + + *(hashmap->item_occupation + byte) |= 1 << bit; + if (new_mem_hashmap_item->value != NULL) { // Get last item while (new_mem_hashmap_item->next != NULL) { @@ -67,7 +78,6 @@ static inline void hashmap_resize(struct SwiftNetHashMap* const hashmap) { }; new_mem_hashmap_item->next = hashmap_item_new_allocation; - } else { *new_mem_hashmap_item = (struct SwiftNetHashMapItem){ .key_original_data = key_original_data, @@ -84,8 +94,10 @@ static inline void hashmap_resize(struct SwiftNetHashMap* const hashmap) { struct SwiftNetHashMap hashmap_create() { return (struct SwiftNetHashMap){ - .capacity = 0xFF, - .items = calloc(sizeof(struct SwiftNetHashMapItem), 0xFF) + .capacity = 0x40 * SWIFT_NET_MEMORY_USAGE, + .items = calloc(sizeof(struct SwiftNetHashMapItem), 0x40 * SWIFT_NET_MEMORY_USAGE), + .size = 0, + .item_occupation = calloc(sizeof(uint32_t), ((0x40 * SWIFT_NET_MEMORY_USAGE) + 31) / 32) }; } @@ -94,13 +106,6 @@ void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNe struct SwiftNetHashMapItem* current_item = hashmap->items + key; - /*if (current_item->next == NULL) { - printf("%p\n", key_data); - printf("no next\n"); - printf("%p\n", current_item->value); - return current_item->value; - }*/ - while (current_item != NULL) { if (data_size == current_item->key_original_data_size && memcmp(current_item->key_original_data, key_data, data_size) == 0) { return current_item->value; @@ -108,7 +113,6 @@ void* hashmap_get(void* const key_data, const uint32_t data_size, struct SwiftNe current_item = current_item->next; - printf("collision\n"); continue; } @@ -127,6 +131,8 @@ void hashmap_insert(void* const key_data, const uint32_t data_size, void* const current_target_item->next = new_item; current_target_item = new_item; + + break; } else { current_target_item = current_target_item->next; } @@ -141,6 +147,11 @@ void hashmap_insert(void* const key_data, const uint32_t data_size, void* const hashmap->size++; + const uint32_t byte = key / 32; + const uint8_t bit = key % 32; + + *(hashmap->item_occupation + byte) |= 0 << bit; + if (hashmap->size >= hashmap->capacity) { hashmap_resize(hashmap); } @@ -152,6 +163,13 @@ void hashmap_remove(void* const key_data, const uint32_t data_size, struct Swift struct SwiftNetHashMapItem* previous_target_item = hashmap->items + key; struct SwiftNetHashMapItem* current_target_item = hashmap->items + key; + if (current_target_item->next == NULL) { + const uint32_t byte = key / 32; + const uint8_t bit = key % 32; + + *(hashmap->item_occupation + byte) &= ~(0 << bit); + } + while (current_target_item != NULL) { if (data_size == current_target_item->key_original_data_size && memcmp(current_target_item->key_original_data, key_data, data_size) == 0) { break; diff --git a/src/internal/datatype_vector.c b/src/internal/datatype_vector.c index 38afc04..445f2fe 100644 --- a/src/internal/datatype_vector.c +++ b/src/internal/datatype_vector.c @@ -2,17 +2,6 @@ #include #include -void vector_lock(struct SwiftNetVector* const vector) { - uint8_t owner_none = 0; - while(!atomic_compare_exchange_strong_explicit(&vector->locked, &owner_none, UINT8_MAX, memory_order_acquire, memory_order_relaxed)) { - owner_none = 0; - } -} - -void vector_unlock(struct SwiftNetVector* const vector) { - atomic_store_explicit(&vector->locked, 0, memory_order_release); -} - struct SwiftNetVector vector_create(const uint32_t starting_amount) { void* const data_ptr = malloc(sizeof(void*) * starting_amount); if (unlikely(data_ptr == NULL)) { diff --git a/src/internal/internal.h b/src/internal/internal.h index cb85962..7c40e29 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -24,6 +24,39 @@ enum RequestLostPacketsReturnType { REQUEST_LOST_PACKETS_RETURN_COMPLETED_PACKET = 0x01 }; +// in body use variables "hashmap_item" and "hashmap_data" +// "hashmap_item" contains pointer to current struct SwiftNetHashMapItem +// "hashmap_data" contains data stored inside struct SwiftNetHashMapItem +#define LOOP_HASHMAP(hashmap, loop_body) \ + for(uint32_t i = 0; i < (hashmap->capacity + 31) / 32; i++) { \ + uint32_t current_index = *(hashmap->item_occupation + i); \ + if(current_index == 0x00) { \ + continue; \ + } \ + uint32_t inverted = ~(current_index); \ + while(inverted != UINT32_MAX) { \ + uint32_t bit_index = __builtin_ctz(inverted); \ + inverted |= 1 << bit_index; \ + for(struct SwiftNetHashMapItem* hashmap_item = hashmap->items + ((i * 32) + bit_index); hashmap_item != NULL; hashmap_item = hashmap_item->next) { \ + void* const hashmap_data = hashmap_item->value; \ + loop_body \ + } \ + } \ + } + +#define LOCK_ATOMIC_DATA_TYPE(atomic_field) \ + do { \ + bool locked = false; \ + while(!atomic_compare_exchange_strong_explicit(atomic_field, &locked, true, memory_order_acquire, memory_order_relaxed)) { \ + locked = false; \ + } \ + } while(0); + +#define UNLOCK_ATOMIC_DATA_TYPE(atomic_field) \ + atomic_store_explicit(atomic_field, false, memory_order_release); + +// Size of memory allocated before ip header. +// Memory should contain either an eth hdr or any specific data depending on addr type (loopback or real interface) #define PACKET_PREPEND_SIZE(addr_type) ((addr_type == DLT_NULL) ? sizeof(uint32_t) : addr_type == DLT_EN10MB ? sizeof(struct ether_header) : 0) #define PACKET_HEADER_SIZE (sizeof(struct ip) + sizeof(struct SwiftNetPacketInfo)) #define HANDLE_PACKET_CONSTRUCTION(ip_header, packet_info, addr_type, eth_hdr, buffer_size, buffer_name) \ @@ -39,14 +72,18 @@ enum RequestLostPacketsReturnType { memcpy(buffer_name + sizeof(*eth_hdr) + sizeof(*ip_header), packet_info, sizeof(*packet_info)); \ } \ +// Simple crc16 call with proper memory order #define HANDLE_CHECKSUM(buffer, size, prepend_size) \ uint16_t checksum = htons(crc16(buffer, size)); \ memcpy(buffer + prepend_size + offsetof(struct ip, ip_sum), &checksum, sizeof(checksum)); +// Number used in ip.proto #define PROT_NUMBER 253 +// Size of struct field #define SIZEOF_FIELD(type, field) sizeof(((type *)0)->field) +// How many seconds between each memory cleanup. #define PACKET_HISTORY_STORE_TIME 5 #define PRINT_ERROR(fmt, ...) \ @@ -219,8 +256,6 @@ extern void vector_remove(struct SwiftNetVector* const vector, const uint32_t in extern void vector_push(struct SwiftNetVector* const vector, void* const data); extern void vector_destroy(struct SwiftNetVector* const vector); extern struct SwiftNetVector vector_create(const uint32_t starting_amount); -extern void vector_lock(struct SwiftNetVector* const vector); -extern void vector_unlock(struct SwiftNetVector* const vector); extern struct SwiftNetHashMap hashmap_create(); extern void hashmap_insert(void* const key_data, const uint32_t data_size, void* const value, struct SwiftNetHashMap* restrict const hashmap); diff --git a/src/make_request.c b/src/make_request.c index b56223a..9f0fd7d 100644 --- a/src/make_request.c +++ b/src/make_request.c @@ -8,7 +8,7 @@ #ifdef SWIFT_NET_REQUESTS static inline void delete_request_sent(struct RequestSent* request_sent) { - vector_lock(&requests_sent); + LOCK_ATOMIC_DATA_TYPE(&requests_sent.locked) for (uint32_t i = 0; i < requests_sent.size; i++) { if (vector_get(&requests_sent, i) == request_sent) { @@ -16,7 +16,7 @@ static inline void delete_request_sent(struct RequestSent* request_sent) { } } - vector_unlock(&requests_sent); + UNLOCK_ATOMIC_DATA_TYPE(&requests_sent.locked) allocator_free(&requests_sent_memory_allocator, request_sent); } diff --git a/src/memory_cleanup_background_service.c b/src/memory_cleanup_background_service.c index 0a9cd47..73c10bc 100644 --- a/src/memory_cleanup_background_service.c +++ b/src/memory_cleanup_background_service.c @@ -1,25 +1,24 @@ #include "swift_net.h" #include "internal/internal.h" #include +#include #include #include -static inline void cleanup_packets_completed(struct SwiftNetVector* packets_completed, struct SwiftNetMemoryAllocator* const packets_completed_allocator) { - vector_lock(packets_completed); +static inline void cleanup_packets_completed(struct SwiftNetHashMap* packets_completed, struct SwiftNetMemoryAllocator* const packets_completed_allocator) { + LOCK_ATOMIC_DATA_TYPE(&packets_completed->atomic_lock); - for (uint32_t i = 0; i < packets_completed->size; i++) { - struct SwiftNetPacketCompleted* const current_packet_completed = vector_get(packets_completed, i); + LOOP_HASHMAP(packets_completed, + if (((struct SwiftNetPacketCompleted*)hashmap_data)->marked_cleanup == true) { + hashmap_remove(hashmap_item->key_original_data, hashmap_item->key_original_data_size, packets_completed); - if (current_packet_completed->marked_cleanup == true) { - vector_remove(packets_completed, i); - - allocator_free(packets_completed_allocator, current_packet_completed); + allocator_free(packets_completed_allocator, hashmap_data); } else { - current_packet_completed->marked_cleanup = true; + ((struct SwiftNetPacketCompleted*)hashmap_data)->marked_cleanup = true; } - } + ) - vector_unlock(packets_completed); + UNLOCK_ATOMIC_DATA_TYPE(&packets_completed->atomic_lock); } void* memory_cleanup_background_service() { @@ -27,7 +26,7 @@ void* memory_cleanup_background_service() { struct timeval start, end; gettimeofday(&start, NULL); - vector_lock(&listeners); + LOCK_ATOMIC_DATA_TYPE(&listeners.locked); for (uint32_t i = 0; i < listeners.size; i++) { struct Listener* const current_listener = vector_get(&listeners, i); @@ -35,26 +34,26 @@ void* memory_cleanup_background_service() { struct SwiftNetVector* const client_connections = ¤t_listener->client_connections; struct SwiftNetVector* const servers = ¤t_listener->servers; - vector_lock(servers); - vector_lock(client_connections); + LOCK_ATOMIC_DATA_TYPE(&servers->locked); + LOCK_ATOMIC_DATA_TYPE(&client_connections->locked); for (uint32_t client_connection_index = 0; client_connection_index < client_connections->size; client_connection_index++) { struct SwiftNetClientConnection* const current_con = vector_get(client_connections, client_connection_index); - //cleanup_packets_completed(¤t_con->packets_completed, ¤t_con->packets_completed_memory_allocator); + cleanup_packets_completed(¤t_con->packets_completed, ¤t_con->packets_completed_memory_allocator); } for (uint32_t server_index = 0; server_index < servers->size; server_index++) { struct SwiftNetServer* const current_server = vector_get(servers, server_index); - //cleanup_packets_completed(¤t_server->packets_completed, ¤t_server->packets_completed_memory_allocator); + cleanup_packets_completed(¤t_server->packets_completed, ¤t_server->packets_completed_memory_allocator); } - vector_unlock(client_connections); - vector_unlock(servers); + UNLOCK_ATOMIC_DATA_TYPE(&servers->locked); + UNLOCK_ATOMIC_DATA_TYPE(&client_connections->locked); } - vector_unlock(&listeners); + UNLOCK_ATOMIC_DATA_TYPE(&listeners.locked); gettimeofday(&end, NULL); diff --git a/src/process_packets.c b/src/process_packets.c index 2a9a48b..5d32f55 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -25,17 +25,6 @@ static inline bool is_private_ip(struct in_addr ip) { return !(octet1 == 192 && octet2 == 168) == false && (octet1 == 127 && octet2 == 0 && octet3 == 0); } -static inline void lock_packet_sending(struct SwiftNetPacketSending* const packet_sending) { - bool locked = false; - while(!atomic_compare_exchange_strong_explicit(&packet_sending->locked, &locked, true, memory_order_acquire, memory_order_relaxed)) { - locked = false; - } -} - -static inline void unlock_packet_sending(struct SwiftNetPacketSending* const packet_sending) { - atomic_store_explicit(&packet_sending->locked, false, memory_order_release); -} - // Returns an array of 4 byte uint32_t, that contain indexes of lost chunks static inline const uint32_t return_lost_chunk_indexes(const uint8_t* const chunks_received, const uint32_t chunk_amount, const uint32_t buffer_size, uint32_t* const buffer) { uint32_t byte = 0; @@ -90,36 +79,34 @@ static inline void packet_completed(uint16_t packet_id, struct SwiftNetHashMap* uint16_t* heap_key_data_location = allocator_allocate(&uint16_memory_allocator); *heap_key_data_location = packet_id; - printf("completing packet: %d\n", packet_id); + LOCK_ATOMIC_DATA_TYPE(&packets_completed_history->atomic_lock); hashmap_insert(heap_key_data_location, sizeof(uint16_t), new_packet_completed, packets_completed_history); + + UNLOCK_ATOMIC_DATA_TYPE(&packets_completed_history->atomic_lock); return; } static inline bool check_packet_already_completed(uint16_t packet_id, struct SwiftNetHashMap* const packets_completed_history) { - printf("packet completed id: %d\n", packet_id); const struct SwiftNetPacketCompleted* const item = hashmap_get(&packet_id, sizeof(packet_id), packets_completed_history); - if(item != NULL) { - printf("id: %d\n", item->packet_id); - } return item != NULL; } static inline struct SwiftNetPendingMessage* const get_pending_message(struct SwiftNetVector* const pending_messages_vector, const enum ConnectionType connection_type, const uint16_t packet_id) { - vector_lock(pending_messages_vector); + LOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); for(uint32_t i = 0; i < pending_messages_vector->size; i++) { - struct SwiftNetPendingMessage* const current_pending_message = vector_get((struct SwiftNetVector*)pending_messages_vector, i); + struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages_vector, i); if(current_pending_message->packet_id == packet_id) { - vector_unlock((struct SwiftNetVector*)pending_messages_vector); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); return current_pending_message; } } - vector_unlock((struct SwiftNetVector*)pending_messages_vector); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages_vector->locked); return NULL; } @@ -129,10 +116,7 @@ static inline void insert_callback_queue_node(struct PacketCallbackQueueNode* co return; } - enum PacketQueueOwner owner_none = NONE; - while(!atomic_compare_exchange_strong_explicit(&packet_queue->owner, &owner_none, SOME, memory_order_acquire, memory_order_relaxed)) { - owner_none = NONE; - } + LOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); if(packet_queue->last_node == NULL) { packet_queue->last_node = new_node; @@ -146,7 +130,7 @@ static inline void insert_callback_queue_node(struct PacketCallbackQueueNode* co packet_queue->first_node = new_node; } - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return; } @@ -156,7 +140,7 @@ static inline void insert_callback_queue_node(struct PacketCallbackQueueNode* co static inline void handle_request_response(const uint16_t packet_id, struct SwiftNetPendingMessage* const pending_message, void* const packet_data, struct SwiftNetVector* const pending_messages, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, const enum ConnectionType connection_type, const bool loopback) { bool is_valid_response = false; - vector_lock(&requests_sent); + LOCK_ATOMIC_DATA_TYPE(&requests_sent.locked); for (uint32_t i = 0; i < requests_sent.size; i++) { struct RequestSent* const current_request_sent = vector_get(&requests_sent, i); @@ -176,11 +160,11 @@ static inline void handle_request_response(const uint16_t packet_id, struct Swif } } - vector_unlock(&requests_sent); + UNLOCK_ATOMIC_DATA_TYPE(&requests_sent.locked); if (is_valid_response == true) { if (pending_message != NULL) { - vector_lock(pending_messages); + LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); for (uint32_t i = 0; i < pending_messages->size; i++) { const struct SwiftNetPendingMessage* const current_pending_message = vector_get(pending_messages, i); @@ -189,7 +173,7 @@ static inline void handle_request_response(const uint16_t packet_id, struct Swif } } - vector_unlock(pending_messages); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); } return; @@ -247,41 +231,38 @@ static inline struct SwiftNetPendingMessage* const create_new_pending_message(st new_pending_message->packet_id = packet_id; - vector_lock(pending_messages); + LOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); vector_push((struct SwiftNetVector*)pending_messages, new_pending_message); - vector_unlock(pending_messages); + UNLOCK_ATOMIC_DATA_TYPE(&pending_messages->locked); return new_pending_message; } static inline struct SwiftNetPacketSending* const get_packet_sending(struct SwiftNetVector* const packet_sending_array, const uint16_t target_id) { - vector_lock(packet_sending_array); + LOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); for(uint32_t i = 0; i < packet_sending_array->size; i++) { struct SwiftNetPacketSending* const current_packet_sending = vector_get((struct SwiftNetVector*)packet_sending_array, i); if(current_packet_sending->packet_id == target_id) { - vector_unlock(packet_sending_array); + UNLOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); return current_packet_sending; } } - vector_unlock(packet_sending_array); + UNLOCK_ATOMIC_DATA_TYPE(&packet_sending_array->locked); return NULL; } struct PacketQueueNode* const wait_for_next_packet(struct PacketQueue* const packet_queue) { - enum PacketQueueOwner owner_none = NONE; - while(!atomic_compare_exchange_strong_explicit(&packet_queue->owner, &owner_none, SOME, memory_order_acquire, memory_order_relaxed)) { - owner_none = NONE; - } + LOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); if(packet_queue->first_node == NULL) { - atomic_store(&packet_queue->owner, NONE); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return NULL; } @@ -291,14 +272,14 @@ struct PacketQueueNode* const wait_for_next_packet(struct PacketQueue* const pac packet_queue->first_node = NULL; packet_queue->last_node = NULL; - atomic_store(&packet_queue->owner, NONE); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return node_to_process; } packet_queue->first_node = node_to_process->next; - atomic_store_explicit(&packet_queue->owner, NONE, memory_order_release); + UNLOCK_ATOMIC_DATA_TYPE(&packet_queue->locked); return node_to_process; } @@ -508,7 +489,7 @@ static inline void swiftnet_process_packets( goto next_packet; } - lock_packet_sending(target_packet_sending); + LOCK_ATOMIC_DATA_TYPE(&target_packet_sending->locked); if(target_packet_sending->lost_chunks == NULL) { target_packet_sending->lost_chunks = malloc(maximum_transmission_unit - PACKET_HEADER_SIZE); @@ -524,7 +505,7 @@ static inline void swiftnet_process_packets( allocator_free(&packet_buffer_memory_allocator, packet_buffer); - unlock_packet_sending(target_packet_sending); + UNLOCK_ATOMIC_DATA_TYPE(&target_packet_sending->locked); goto next_packet; } @@ -549,7 +530,6 @@ static inline void swiftnet_process_packets( } if (check_packet_already_completed(ip_header.ip_id, packets_completed_history)) { - printf("PACKET COMPLETED\n"); allocator_free(&packet_buffer_memory_allocator, packet_buffer); goto next_packet; } diff --git a/src/send_packet.c b/src/send_packet.c index 506219a..0d9fdeb 100644 --- a/src/send_packet.c +++ b/src/send_packet.c @@ -15,17 +15,6 @@ #include "internal/internal.h" #include -static inline void lock_packet_sending(struct SwiftNetPacketSending* const packet_sending) { - bool locked = false; - while(!atomic_compare_exchange_strong_explicit(&packet_sending->locked, &locked, true, memory_order_acquire, memory_order_relaxed)) { - locked = false; - } -} - -static inline void unlock_packet_sending(struct SwiftNetPacketSending* const packet_sending) { - atomic_store_explicit(&packet_sending->locked, false, memory_order_release); -} - static inline enum RequestLostPacketsReturnType request_lost_packets_bitarray(const uint8_t* const raw_data, const uint32_t data_size, const struct sockaddr* const destination, pcap_t* const pcap, struct SwiftNetPacketSending* const packet_sending) { while(1) { if(check_debug_flag(LOST_PACKETS)) { @@ -114,7 +103,7 @@ static inline void handle_lost_packets( while(1) { const enum RequestLostPacketsReturnType request_lost_packets_bitarray_response = request_lost_packets_bitarray(request_lost_packets_buffer, PACKET_HEADER_SIZE + prepend_size, (const struct sockaddr*)destination_address, pcap, packet_sending); - lock_packet_sending(packet_sending); + LOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); switch (request_lost_packets_bitarray_response) { case REQUEST_LOST_PACKETS_RETURN_UPDATED_BIT_ARRAY: @@ -122,8 +111,6 @@ static inline void handle_lost_packets( case REQUEST_LOST_PACKETS_RETURN_COMPLETED_PACKET: free((void*)packet_sending->lost_chunks); - vector_lock(packets_sending); - for (uint32_t i = 0; i < packets_sending->size; i++) { if (((struct SwiftNetPacketSending*)vector_get(packets_sending, i))->packet_id == packet_sending->packet_id) { vector_remove(packets_sending, i); @@ -132,9 +119,7 @@ static inline void handle_lost_packets( } } - vector_unlock(packets_sending); - - unlock_packet_sending(packet_sending); + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); allocator_free(packets_sending_memory_allocator, packet_sending); @@ -175,7 +160,7 @@ static inline void handle_lost_packets( } } - unlock_packet_sending(packet_sending); + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); } } @@ -218,11 +203,11 @@ inline void swiftnet_send_packet( if (request_sent != NULL) { request_sent->packet_id = packet_id; - vector_lock(&requests_sent); + LOCK_ATOMIC_DATA_TYPE(&requests_sent.locked); vector_push(&requests_sent, request_sent); - vector_unlock(&requests_sent); + UNLOCK_ATOMIC_DATA_TYPE(&requests_sent.locked); } #else const uint16_t packet_id = rand(); @@ -255,11 +240,11 @@ inline void swiftnet_send_packet( return; } - vector_lock(packets_sending); + LOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); vector_push((struct SwiftNetVector*)packets_sending, (struct SwiftNetPacketSending*)new_packet_sending); - vector_unlock(packets_sending); + UNLOCK_ATOMIC_DATA_TYPE(&packets_sending->locked); new_packet_sending->lost_chunks = NULL; new_packet_sending->locked = false; diff --git a/src/swift_net.h b/src/swift_net.h index 41bdab1..fea6067 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -29,10 +29,9 @@ extern "C" { #define SWIFT_NET_DEBUG #endif -enum PacketQueueOwner { - NONE = 0x00, - SOME = 0xFF -}; +// Multiplication of memory pre allocated. +// More memory = better performance +#define SWIFT_NET_MEMORY_USAGE 5 enum PacketType { MESSAGE = 0x01, @@ -156,7 +155,7 @@ struct PacketQueueNode { struct PacketQueue { struct PacketQueueNode* first_node; struct PacketQueueNode* last_node; - _Atomic enum PacketQueueOwner owner; + _Atomic bool locked; }; struct PacketCallbackQueueNode { @@ -183,7 +182,7 @@ struct SwiftNetClientPacketData { struct PacketCallbackQueue { struct PacketCallbackQueueNode* first_node; struct PacketCallbackQueueNode* last_node; - _Atomic enum PacketQueueOwner owner; + _Atomic bool locked; }; struct SwiftNetSentSuccessfullyCompletedPacketSignal { @@ -220,20 +219,23 @@ struct SwiftNetVector { void* data; uint32_t size; uint32_t capacity; - _Atomic uint8_t locked; + _Atomic bool locked; }; struct SwiftNetHashMapItem { - struct SwiftNetHashMapItem* next; - void* key_original_data; uint32_t key_original_data_size; - void* value; + struct SwiftNetHashMapItem* next; // Contains next element with same key. + void* key_original_data; // Dynamically allocated original key data + void* value; // Data stored in item }; +// Custom implementation of a hashmap struct SwiftNetHashMap { - struct SwiftNetHashMapItem* items; + _Atomic bool atomic_lock; uint32_t capacity; uint32_t size; + struct SwiftNetHashMapItem* items; + uint32_t* item_occupation; // Bitset tracking which indexes of items array are occupied for looping through items without many cycles. }; // Connection data diff --git a/tests/integration_tests/output/run_tests b/tests/integration_tests/output/run_tests index bedfdf9076b83f661f0650f8e35f3ef91be66c3f..395f784f8c920df381de2ad07894b12edb90dedb 100755 GIT binary patch literal 165112 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 literal 166072 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