From ad63216ec3be08518bb4137a6db7c7516024ffd2 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Mon, 1 Jun 2026 09:34:44 -0700 Subject: [PATCH 01/10] #15 - Add Spark socket wire benchmark notes Signed-off-by: Cliff Burdick --- SPARK_SOCKET_WIRE_README.md | 414 ++++++++++++++++++++++ src/managers/socket/daqiri_socket_mgr.cpp | 23 +- 2 files changed, 434 insertions(+), 3 deletions(-) create mode 100644 SPARK_SOCKET_WIRE_README.md diff --git a/SPARK_SOCKET_WIRE_README.md b/SPARK_SOCKET_WIRE_README.md new file mode 100644 index 0000000..f1d2ce3 --- /dev/null +++ b/SPARK_SOCKET_WIRE_README.md @@ -0,0 +1,414 @@ +# Spark Socket Wire Benchmark Notes + +This note documents the setup needed to make DAQIRI socket benchmark traffic +leave the NIC and return through a physical receive path on a NVIDIA DGX Spark +style machine. + +Linux network namespaces are not enough by themselves. On Spark, some pairs of +mlx5 netdevs can exchange traffic through an internal NIC or e-switch path. In +that case DAQIRI and vport counters move, but physical counters such as +`rx_packets_phy` do not. Treat benchmark results as "on wire" only after the +directional PHY counters move. + +## Summary + +The pair below was verified to send packets out through the physical path: + +```text +client TX: enp1s0f0np0 +server RX: enp1s0f1np1 +``` + +The pair below did not hit the physical receive path on the tested Spark +machine: + +```text +client TX: enp1s0f0np0 +server RX: enP2p1s0f0np0 +``` + +For one-way client to server traffic, the counters that must increase are: + +```text +client interface: tx_packets_phy, tx_bytes_phy +server interface: rx_packets_phy, rx_bytes_phy +``` + +The client `tx_packets_phy` delta should match the server `rx_packets_phy` +delta, apart from a few control packets. The byte counters should also match. + +## Required DAQIRI Socket Changes + +Use a DAQIRI build that includes the socket backend and the socket changes from +this branch: + +- UDP payloads above `65507` bytes are rejected, matching iperf's UDP payload + limit. +- TCP client setup reuses the configured primary connection when the requested + peer matches. +- The TCP RX loop no longer erases its own connection state while running in its + RX thread. + +Build inside the DAQIRI container, as usual: + +```bash +docker run --rm --privileged --network=host --gpus all --ipc=host \ + --user "$(id -u):$(id -g)" \ + -v /dev/hugepages:/dev/hugepages \ + -v "$PWD:/work" \ + -w /work daqiri:local \ + cmake --build build-spark-rdma --target daqiri_bench_socket -j"$(nproc)" +``` + +If the build directory is not configured yet: + +```bash +docker run --rm --privileged --network=host --gpus all --ipc=host \ + --user "$(id -u):$(id -g)" \ + -v /dev/hugepages:/dev/hugepages \ + -v "$PWD:/work" \ + -w /work daqiri:local \ + bash -lc 'cmake -S . -B build-spark-rdma \ + -DBUILD_SHARED_LIBS=ON \ + -DDAQIRI_BUILD_PYTHON=OFF \ + -DDAQIRI_MGR="dpdk socket rdma" && + cmake --build build-spark-rdma --target daqiri_bench_socket -j"$(nproc)"' +``` + +## Identify Candidate Ports + +List the mlx5 netdevs, PCI functions, and physical port names: + +```bash +for ifc in enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1; do + [ -e "/sys/class/net/$ifc" ] || continue + echo "=== $ifc ===" + ip -br link show dev "$ifc" + readlink -f "/sys/class/net/$ifc/device" + cat "/sys/class/net/$ifc/phys_port_name" 2>/dev/null || true + cat "/sys/class/net/$ifc/dev_port" 2>/dev/null || true + ethtool "$ifc" | grep -E 'Speed:|Link detected:' +done +``` + +On the tested Spark, all four links were up at 100 Gb/s. The verified wire path +used two ports on the same card: + +```text +enp1s0f0np0 -> enp1s0f1np1 +``` + +Do not assume the same names on another host. First find the interfaces, then +prove the selected pair with PHY counters. + +## Namespace Setup + +Run networking setup as root. The easiest way on this repo is to use the +`daqiri:local` container in privileged host-network mode because it can move +host interfaces into namespaces without requiring host sudo prompts: + +```bash +docker run --rm -it --privileged --network=host --pid=host --ipc=host \ + --gpus all \ + -v "$PWD:/work" \ + -v /tmp:/tmp \ + -w /work daqiri:local bash +``` + +Install tools inside the container if needed: + +```bash +apt-get update +apt-get install -y iproute2 iputils-ping ethtool iperf3 +``` + +Set variables for the verified wire-facing pair: + +```bash +CLIENT_NS=dq_wire_client +SERVER_NS=dq_wire_server + +CLIENT_IF=enp1s0f0np0 +SERVER_IF=enp1s0f1np1 + +CLIENT_IP=10.250.0.1 +SERVER_IP=10.250.0.2 + +CLIENT_MAC=4c:bb:47:2a:ea:ed +SERVER_MAC=4c:bb:47:2a:ea:ee + +MTU=9082 +``` + +Create the namespaces: + +```bash +ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true +ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true + +ip addr flush dev "$CLIENT_IF" || true +ip addr flush dev "$SERVER_IF" || true + +ip netns add "$CLIENT_NS" +ip netns add "$SERVER_NS" + +ip link set "$CLIENT_IF" netns "$CLIENT_NS" +ip link set "$SERVER_IF" netns "$SERVER_NS" + +ip -n "$CLIENT_NS" addr add "$CLIENT_IP/24" dev "$CLIENT_IF" +ip -n "$SERVER_NS" addr add "$SERVER_IP/24" dev "$SERVER_IF" + +ip -n "$CLIENT_NS" link set lo up +ip -n "$SERVER_NS" link set lo up +ip -n "$CLIENT_NS" link set "$CLIENT_IF" mtu "$MTU" up +ip -n "$SERVER_NS" link set "$SERVER_IF" mtu "$MTU" up + +ip -n "$CLIENT_NS" route add "$SERVER_IP/32" dev "$CLIENT_IF" +ip -n "$SERVER_NS" route add "$CLIENT_IP/32" dev "$SERVER_IF" + +ip -n "$CLIENT_NS" neigh replace "$SERVER_IP" \ + lladdr "$SERVER_MAC" dev "$CLIENT_IF" nud permanent +ip -n "$SERVER_NS" neigh replace "$CLIENT_IP" \ + lladdr "$CLIENT_MAC" dev "$SERVER_IF" nud permanent +``` + +Verify that routing is pinned to the namespace interfaces: + +```bash +ip -n "$CLIENT_NS" route get "$SERVER_IP" from "$CLIENT_IP" +ip -n "$SERVER_NS" route get "$CLIENT_IP" from "$SERVER_IP" +ip netns exec "$CLIENT_NS" ping -c 1 -W 1 "$SERVER_IP" +``` + +The route output should name the physical netdevs, not `lo`. + +## Prove the Pair Hits the Wire + +Capture the counters before and after a short transfer. For a client to server +test, use the client TX PHY counter and the server RX PHY counter: + +```bash +ip netns exec "$CLIENT_NS" ethtool -S "$CLIENT_IF" | \ + grep -E 'tx_packets_phy|tx_bytes_phy|tx_vport_unicast' +ip netns exec "$SERVER_NS" ethtool -S "$SERVER_IF" | \ + grep -E 'rx_packets_phy|rx_bytes_phy|rx_vport_unicast' +``` + +Use iperf3 as a quick proof before running DAQIRI: + +```bash +ip netns exec "$SERVER_NS" iperf3 -s -B "$SERVER_IP" -1 & +sleep 1 +ip netns exec "$CLIENT_NS" iperf3 -c "$SERVER_IP" -B "$CLIENT_IP" -t 2 -P 1 +``` + +Then check the counters again. On the verified Spark pair, +`client tx_packets_phy` and `server rx_packets_phy` increased by the same packet +count. That proves traffic is entering the server NIC from the physical path. + +If only `tx_vport_unicast_*` and `rx_vport_unicast_*` move, but `rx_packets_phy` +does not, the traffic is not on the wire. Pick another port pair. + +## DAQIRI Socket Configs + +The socket benchmark config must use the namespace IPs. Use a large iteration +count because current `daqiri_bench_socket` treats `iterations: 0` as zero work, +not as "run until --seconds expires". + +Server template: + +```yaml +%YAML 1.2 +--- +daqiri: + cfg: + version: 1 + stream_type: "socket" + protocol: "udp" + master_core: 3 + debug: false + log_level: "info" + memory_regions: + - name: "DATA_SOCKET_SERVER" + kind: "host" + affinity: 0 + num_bufs: 1024 + buf_size: 65507 + interfaces: + - name: udp_server + address: 10.250.0.2 + socket_config: + mode: server + local_ip: 10.250.0.2 + local_port: 5021 + remote_ip: "" + remote_port: 0 + max_payload_size: 65535 + rx: + queues: + - name: "RX_Queue" + id: 0 + cpu_core: 8 + batch_size: 1 + memory_regions: ["DATA_SOCKET_SERVER"] + tx: + queues: + - name: "TX_Queue" + id: 0 + cpu_core: 7 + batch_size: 1 + memory_regions: ["DATA_SOCKET_SERVER"] + +socket_bench_server: + server: true + send: false + receive: true + iterations: 1000000000 + message_size: 65507 + server_address: 10.250.0.2 + client_address: 10.250.0.1 + server_port: 5021 +``` + +Client template: + +```yaml +%YAML 1.2 +--- +daqiri: + cfg: + version: 1 + stream_type: "socket" + protocol: "udp" + master_core: 3 + debug: false + log_level: "info" + memory_regions: + - name: "DATA_SOCKET_CLIENT" + kind: "host" + affinity: 0 + num_bufs: 1024 + buf_size: 65507 + interfaces: + - name: udp_client + address: 10.250.0.1 + socket_config: + mode: client + local_ip: 10.250.0.1 + local_port: 5121 + remote_ip: 10.250.0.2 + remote_port: 5021 + max_payload_size: 65535 + rx: + queues: + - name: "RX_Queue" + id: 0 + cpu_core: 8 + batch_size: 1 + memory_regions: ["DATA_SOCKET_CLIENT"] + tx: + queues: + - name: "TX_Queue" + id: 0 + cpu_core: 7 + batch_size: 1 + memory_regions: ["DATA_SOCKET_CLIENT"] + +socket_bench_client: + server: false + send: true + receive: false + iterations: 1000000000 + message_size: 65507 + server_address: 10.250.0.2 + client_address: 10.250.0.1 + server_port: 5021 +``` + +For TCP tests, set `protocol: "tcp"` in both files and use distinct ports for +parallel processes. For UDP tests, keep message sizes at or below `65507`. + +Run server and client: + +```bash +export LD_LIBRARY_PATH=/work/build-spark-rdma/src:${LD_LIBRARY_PATH:-} +BIN=/work/build-spark-rdma/examples/daqiri_bench_socket + +ip netns exec "$SERVER_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/server.yaml --seconds 11 --mode server & + +sleep 1 + +ip netns exec "$CLIENT_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/client.yaml --seconds 10 --mode client + +wait +``` + +For a four-process run, generate four server/client config pairs with ports such +as `5021`, `5022`, `5023`, and `5024`, then launch all four servers followed by +all four clients. Use different client local ports, for example server port plus +100. + +## Known Verified Results + +The following DAQIRI matrix was run on the verified physical path +`enp1s0f0np0 -> enp1s0f1np1` with four client/server process pairs: + +| Protocol | Message size | App TX | App RX | Loss | Client `tx_packets_phy` | Server `rx_packets_phy` | +|---|---:|---:|---:|---:|---:|---:| +| TCP | 1000 | 10.93 Gb/s | 10.93 Gb/s | 0.00% | 1,513,047 | 1,513,047 | +| TCP | 8000 | 11.20 Gb/s | 11.20 Gb/s | 0.00% | 1,550,052 | 1,550,052 | +| TCP | 1 MiB | 11.67 Gb/s | 11.67 Gb/s | 0.00% | 1,615,399 | 1,615,399 | +| UDP | 1000 | 12.28 Gb/s | 11.68 Gb/s | 4.88% | 15,350,463 | 15,350,463 | +| UDP | 8000 | 12.93 Gb/s | 10.10 Gb/s | 21.91% | 2,020,461 | 2,020,461 | +| UDP | 65507 | 12.84 Gb/s | 12.41 Gb/s | 3.34% | 1,960,392 | 1,960,392 | + +UDP 1 MiB was intentionally skipped because the socket backend rejects UDP +payloads above `65507`. + +## Restore Host Networking + +After tests, move interfaces back to the host and restore the usual Spark IPs. +Adjust interface names and addresses for the target machine: + +```bash +for ns in "$CLIENT_NS" "$SERVER_NS"; do + ip netns exec "$ns" ip link set "$CLIENT_IF" netns 1 >/dev/null 2>&1 || true + ip netns exec "$ns" ip link set "$SERVER_IF" netns 1 >/dev/null 2>&1 || true +done + +ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true +ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true + +for ifc in enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1; do + ip addr flush dev "$ifc" >/dev/null 2>&1 || true + ip link set dev "$ifc" mtu 9082 up >/dev/null 2>&1 || true +done + +ip addr add 1.1.1.1/24 dev enp1s0f0np0 +ip addr add 2.2.2.2/24 dev enP2p1s0f0np0 + +ip neigh replace 2.2.2.2 lladdr 4c:bb:47:2a:ea:f1 \ + dev enp1s0f0np0 nud permanent +ip neigh replace 1.1.1.1 lladdr 4c:bb:47:2a:ea:ed \ + dev enP2p1s0f0np0 nud permanent +``` + +## Loopback Disable Knobs + +Two mlx5 loopback knobs were considered: + +```bash +ethtool --set-priv-flags local_lb off +mlxconfig -d set FORCE_LOOPBACK_DISABLE=1 +``` + +On the tested Spark, the `local_lb` private flag was not exposed by +`ethtool --show-priv-flags`, so the runtime flag could not be used. + +`mlxconfig` was present in the container, but direct PCI config queries hung in +this session. No firmware settings were changed. Treat +`FORCE_LOOPBACK_DISABLE=1` as a maintenance-window experiment: query and set it +only with the proper Mellanox firmware tooling available, then reset or reboot +as required and rerun the same `rx_packets_phy` proof. diff --git a/src/managers/socket/daqiri_socket_mgr.cpp b/src/managers/socket/daqiri_socket_mgr.cpp index 4361544..314846b 100644 --- a/src/managers/socket/daqiri_socket_mgr.cpp +++ b/src/managers/socket/daqiri_socket_mgr.cpp @@ -47,6 +47,8 @@ namespace daqiri { namespace { +constexpr size_t kMaxUdpPayloadBytes = 65507; + bool parse_ipv4_addr(const std::string& ip, uint16_t port, sockaddr_in* addr) { if (addr == nullptr) { return false; } @@ -769,6 +771,14 @@ bool SocketMgr::send_udp_burst(EndpointState& ep, BurstParams* burst, size_t* se use_sendto = true; } + for (size_t i = 0; i < num_pkts; ++i) { + const auto len = static_cast(burst->pkt_lens[0][i]); + if (len > kMaxUdpPayloadBytes) { + DAQIRI_LOG_ERROR("UDP payload length {} exceeds maximum {} bytes", len, kMaxUdpPayloadBytes); + return false; + } + } + std::vector msgs(num_pkts); std::vector iovs(num_pkts); std::vector peers; @@ -1276,9 +1286,6 @@ void SocketMgr::tcp_rx_loop(std::shared_ptr conn) { conn->running.store(false); close_fd(conn->fd); - - std::lock_guard lock(state_mutex_); - connections_.erase(conn->conn_id); } void SocketMgr::udp_rx_loop(int if_index) { @@ -1365,6 +1372,16 @@ Status SocketMgr::socket_connect_to_server(const std::string& dst_addr, uint16_t if (ep == nullptr || ep->socket_cfg.mode_ != SocketMode::CLIENT) { continue; } if (cfg_.common_.protocol == SocketProtocol::TCP) { + if (ep->primary_conn_id != 0 && ep->socket_cfg.remote_ip_ == dst_addr && + ep->socket_cfg.remote_port_ == dst_port && + (src_addr.empty() || src_addr == ep->socket_cfg.local_ip_)) { + std::lock_guard lock(state_mutex_); + if (connections_.find(ep->primary_conn_id) != connections_.end()) { + *conn_id = ep->primary_conn_id; + return Status::SUCCESS; + } + } + auto conn = create_tcp_client_connection(*ep, dst_addr, dst_port, src_addr, 0, true); if (conn == nullptr) { return Status::CONNECT_FAILURE; } *conn_id = conn->conn_id; From 33e52a9c5eeeb9fb5d968c705f1e7b42b0432a42 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Mon, 1 Jun 2026 10:17:27 -0700 Subject: [PATCH 02/10] #15 - Guard TCP socket connection reuse Signed-off-by: Cliff Burdick --- src/managers/socket/daqiri_socket_mgr.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/managers/socket/daqiri_socket_mgr.cpp b/src/managers/socket/daqiri_socket_mgr.cpp index 314846b..da0e412 100644 --- a/src/managers/socket/daqiri_socket_mgr.cpp +++ b/src/managers/socket/daqiri_socket_mgr.cpp @@ -873,7 +873,7 @@ Status SocketMgr::send_tx_burst(BurstParams* burst) { status = Status::CONNECT_FAILURE; } } else if (cfg_.common_.protocol == SocketProtocol::TCP) { - if (conn == nullptr) { + if (conn == nullptr || !conn->running.load()) { DAQIRI_LOG_ERROR("No active TCP connection for port {}", ep->port); status = Status::CONNECT_FAILURE; } else { @@ -1376,7 +1376,8 @@ Status SocketMgr::socket_connect_to_server(const std::string& dst_addr, uint16_t ep->socket_cfg.remote_port_ == dst_port && (src_addr.empty() || src_addr == ep->socket_cfg.local_ip_)) { std::lock_guard lock(state_mutex_); - if (connections_.find(ep->primary_conn_id) != connections_.end()) { + const auto it = connections_.find(ep->primary_conn_id); + if (it != connections_.end() && it->second != nullptr && it->second->running.load()) { *conn_id = ep->primary_conn_id; return Status::SUCCESS; } From beb699dbf4e19b48fa77df82190f1985e2b5eca9 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Wed, 3 Jun 2026 12:38:32 -0700 Subject: [PATCH 03/10] #15 - Update documentation graphics and benchmarking Signed-off-by: Cliff Burdick --- README.md | 30 +- SPARK_SOCKET_WIRE_README.md | 414 -------------------- docs/concepts.md | 13 +- docs/getting-started.md | 2 +- docs/images/backend-decision-tree.svg | 80 ++++ docs/images/daqiri-landing-graphic.svg | 222 +++++++++++ docs/index.html | 202 +++++++--- docs/tutorials/benchmarking.md | 49 +++ docs/tutorials/benchmarking_examples.md | 10 +- docs/tutorials/configuration-walkthrough.md | 8 +- docs/tutorials/socket_benchmarking.md | 369 +++++++++++++++++ docs/tutorials/system_configuration.md | 6 +- mkdocs.yml | 4 + pcie_schematic.png | Bin 0 -> 156204 bytes 14 files changed, 928 insertions(+), 481 deletions(-) delete mode 100644 SPARK_SOCKET_WIRE_README.md create mode 100644 docs/images/backend-decision-tree.svg create mode 100644 docs/images/daqiri-landing-graphic.svg create mode 100644 docs/tutorials/benchmarking.md create mode 100644 docs/tutorials/socket_benchmarking.md create mode 100644 pcie_schematic.png diff --git a/README.md b/README.md index 44867bd..04b19de 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ target storage stack to be reported as supported by `gdscheck.py -p`. Container build: ```bash -BASE_TARGET=dpdk DAQIRI_MGR="dpdk rdma" scripts/build-container.sh +BASE_TARGET=dpdk DAQIRI_MGR="dpdk socket rdma" scripts/build-container.sh ``` OpenTelemetry metrics are opt-in. Build with `-DDAQIRI_ENABLE_OTEL_METRICS=ON` @@ -81,6 +81,30 @@ exporters. See [Getting Started](https://nvidia.github.io/daqiri/getting-started/) for requirements, CMake options, and running the benchmarks. +## Benchmarking + +Start with the [Benchmarking overview](https://nvidia.github.io/daqiri/tutorials/benchmarking/) to choose between Linux sockets, RoCE/RDMA, and raw Ethernet. + +For Spark-style on-wire tests, use the same client/server namespace shape for Linux sockets and RDMA/RoCE: put the client-facing NIC in one namespace, the server-facing NIC in another, pin routes and neighbors to those interfaces, then verify `tx_packets_phy` on the client and `rx_packets_phy` on the server before trusting bandwidth numbers. + +```bash +# Linux TCP/UDP sockets, split by namespace +ip netns exec dq_wire_server ./build/examples/daqiri_bench_socket \ + /tmp/socket-server.yaml --seconds 10 --mode server & +ip netns exec dq_wire_client ./build/examples/daqiri_bench_socket \ + /tmp/socket-client.yaml --seconds 10 --mode client +wait + +# RoCE/RDMA, using the same namespace pair +ip netns exec dq_wire_server ./build/examples/daqiri_bench_rdma \ + /tmp/rdma-server.yaml --seconds 10 --mode server & +ip netns exec dq_wire_client ./build/examples/daqiri_bench_rdma \ + /tmp/rdma-client.yaml --seconds 10 --mode client +wait +``` + +See [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/tutorials/socket_benchmarking/) for the full namespace setup and YAML templates. See [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/tutorials/benchmarking_examples/) for DPDK/raw Ethernet loopback tests. + ## Documentation Reference material for the DAQIRI codebase: @@ -98,7 +122,9 @@ Reference material for the DAQIRI codebase: Step-by-step walkthroughs to get hands-on: - [System Configuration](https://nvidia.github.io/daqiri/tutorials/system_configuration/) — NIC drivers, link layers, GPUDirect, hugepages, CPU isolation, GPU clocks -- [Benchmarking Examples](https://nvidia.github.io/daqiri/tutorials/benchmarking_examples/) — run `daqiri_bench_raw_gpudirect` with a loopback test +- [Benchmarking Overview](https://nvidia.github.io/daqiri/tutorials/benchmarking/) — choose between Linux sockets, RoCE/RDMA, and raw Ethernet benchmarks +- [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/tutorials/socket_benchmarking/) — run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation +- [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/tutorials/benchmarking_examples/) — run `daqiri_bench_raw_gpudirect` with a physical loopback test - [Understanding the Configuration File](https://nvidia.github.io/daqiri/tutorials/configuration-walkthrough/) — annotated YAML walkthrough ## License diff --git a/SPARK_SOCKET_WIRE_README.md b/SPARK_SOCKET_WIRE_README.md deleted file mode 100644 index f1d2ce3..0000000 --- a/SPARK_SOCKET_WIRE_README.md +++ /dev/null @@ -1,414 +0,0 @@ -# Spark Socket Wire Benchmark Notes - -This note documents the setup needed to make DAQIRI socket benchmark traffic -leave the NIC and return through a physical receive path on a NVIDIA DGX Spark -style machine. - -Linux network namespaces are not enough by themselves. On Spark, some pairs of -mlx5 netdevs can exchange traffic through an internal NIC or e-switch path. In -that case DAQIRI and vport counters move, but physical counters such as -`rx_packets_phy` do not. Treat benchmark results as "on wire" only after the -directional PHY counters move. - -## Summary - -The pair below was verified to send packets out through the physical path: - -```text -client TX: enp1s0f0np0 -server RX: enp1s0f1np1 -``` - -The pair below did not hit the physical receive path on the tested Spark -machine: - -```text -client TX: enp1s0f0np0 -server RX: enP2p1s0f0np0 -``` - -For one-way client to server traffic, the counters that must increase are: - -```text -client interface: tx_packets_phy, tx_bytes_phy -server interface: rx_packets_phy, rx_bytes_phy -``` - -The client `tx_packets_phy` delta should match the server `rx_packets_phy` -delta, apart from a few control packets. The byte counters should also match. - -## Required DAQIRI Socket Changes - -Use a DAQIRI build that includes the socket backend and the socket changes from -this branch: - -- UDP payloads above `65507` bytes are rejected, matching iperf's UDP payload - limit. -- TCP client setup reuses the configured primary connection when the requested - peer matches. -- The TCP RX loop no longer erases its own connection state while running in its - RX thread. - -Build inside the DAQIRI container, as usual: - -```bash -docker run --rm --privileged --network=host --gpus all --ipc=host \ - --user "$(id -u):$(id -g)" \ - -v /dev/hugepages:/dev/hugepages \ - -v "$PWD:/work" \ - -w /work daqiri:local \ - cmake --build build-spark-rdma --target daqiri_bench_socket -j"$(nproc)" -``` - -If the build directory is not configured yet: - -```bash -docker run --rm --privileged --network=host --gpus all --ipc=host \ - --user "$(id -u):$(id -g)" \ - -v /dev/hugepages:/dev/hugepages \ - -v "$PWD:/work" \ - -w /work daqiri:local \ - bash -lc 'cmake -S . -B build-spark-rdma \ - -DBUILD_SHARED_LIBS=ON \ - -DDAQIRI_BUILD_PYTHON=OFF \ - -DDAQIRI_MGR="dpdk socket rdma" && - cmake --build build-spark-rdma --target daqiri_bench_socket -j"$(nproc)"' -``` - -## Identify Candidate Ports - -List the mlx5 netdevs, PCI functions, and physical port names: - -```bash -for ifc in enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1; do - [ -e "/sys/class/net/$ifc" ] || continue - echo "=== $ifc ===" - ip -br link show dev "$ifc" - readlink -f "/sys/class/net/$ifc/device" - cat "/sys/class/net/$ifc/phys_port_name" 2>/dev/null || true - cat "/sys/class/net/$ifc/dev_port" 2>/dev/null || true - ethtool "$ifc" | grep -E 'Speed:|Link detected:' -done -``` - -On the tested Spark, all four links were up at 100 Gb/s. The verified wire path -used two ports on the same card: - -```text -enp1s0f0np0 -> enp1s0f1np1 -``` - -Do not assume the same names on another host. First find the interfaces, then -prove the selected pair with PHY counters. - -## Namespace Setup - -Run networking setup as root. The easiest way on this repo is to use the -`daqiri:local` container in privileged host-network mode because it can move -host interfaces into namespaces without requiring host sudo prompts: - -```bash -docker run --rm -it --privileged --network=host --pid=host --ipc=host \ - --gpus all \ - -v "$PWD:/work" \ - -v /tmp:/tmp \ - -w /work daqiri:local bash -``` - -Install tools inside the container if needed: - -```bash -apt-get update -apt-get install -y iproute2 iputils-ping ethtool iperf3 -``` - -Set variables for the verified wire-facing pair: - -```bash -CLIENT_NS=dq_wire_client -SERVER_NS=dq_wire_server - -CLIENT_IF=enp1s0f0np0 -SERVER_IF=enp1s0f1np1 - -CLIENT_IP=10.250.0.1 -SERVER_IP=10.250.0.2 - -CLIENT_MAC=4c:bb:47:2a:ea:ed -SERVER_MAC=4c:bb:47:2a:ea:ee - -MTU=9082 -``` - -Create the namespaces: - -```bash -ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true -ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true - -ip addr flush dev "$CLIENT_IF" || true -ip addr flush dev "$SERVER_IF" || true - -ip netns add "$CLIENT_NS" -ip netns add "$SERVER_NS" - -ip link set "$CLIENT_IF" netns "$CLIENT_NS" -ip link set "$SERVER_IF" netns "$SERVER_NS" - -ip -n "$CLIENT_NS" addr add "$CLIENT_IP/24" dev "$CLIENT_IF" -ip -n "$SERVER_NS" addr add "$SERVER_IP/24" dev "$SERVER_IF" - -ip -n "$CLIENT_NS" link set lo up -ip -n "$SERVER_NS" link set lo up -ip -n "$CLIENT_NS" link set "$CLIENT_IF" mtu "$MTU" up -ip -n "$SERVER_NS" link set "$SERVER_IF" mtu "$MTU" up - -ip -n "$CLIENT_NS" route add "$SERVER_IP/32" dev "$CLIENT_IF" -ip -n "$SERVER_NS" route add "$CLIENT_IP/32" dev "$SERVER_IF" - -ip -n "$CLIENT_NS" neigh replace "$SERVER_IP" \ - lladdr "$SERVER_MAC" dev "$CLIENT_IF" nud permanent -ip -n "$SERVER_NS" neigh replace "$CLIENT_IP" \ - lladdr "$CLIENT_MAC" dev "$SERVER_IF" nud permanent -``` - -Verify that routing is pinned to the namespace interfaces: - -```bash -ip -n "$CLIENT_NS" route get "$SERVER_IP" from "$CLIENT_IP" -ip -n "$SERVER_NS" route get "$CLIENT_IP" from "$SERVER_IP" -ip netns exec "$CLIENT_NS" ping -c 1 -W 1 "$SERVER_IP" -``` - -The route output should name the physical netdevs, not `lo`. - -## Prove the Pair Hits the Wire - -Capture the counters before and after a short transfer. For a client to server -test, use the client TX PHY counter and the server RX PHY counter: - -```bash -ip netns exec "$CLIENT_NS" ethtool -S "$CLIENT_IF" | \ - grep -E 'tx_packets_phy|tx_bytes_phy|tx_vport_unicast' -ip netns exec "$SERVER_NS" ethtool -S "$SERVER_IF" | \ - grep -E 'rx_packets_phy|rx_bytes_phy|rx_vport_unicast' -``` - -Use iperf3 as a quick proof before running DAQIRI: - -```bash -ip netns exec "$SERVER_NS" iperf3 -s -B "$SERVER_IP" -1 & -sleep 1 -ip netns exec "$CLIENT_NS" iperf3 -c "$SERVER_IP" -B "$CLIENT_IP" -t 2 -P 1 -``` - -Then check the counters again. On the verified Spark pair, -`client tx_packets_phy` and `server rx_packets_phy` increased by the same packet -count. That proves traffic is entering the server NIC from the physical path. - -If only `tx_vport_unicast_*` and `rx_vport_unicast_*` move, but `rx_packets_phy` -does not, the traffic is not on the wire. Pick another port pair. - -## DAQIRI Socket Configs - -The socket benchmark config must use the namespace IPs. Use a large iteration -count because current `daqiri_bench_socket` treats `iterations: 0` as zero work, -not as "run until --seconds expires". - -Server template: - -```yaml -%YAML 1.2 ---- -daqiri: - cfg: - version: 1 - stream_type: "socket" - protocol: "udp" - master_core: 3 - debug: false - log_level: "info" - memory_regions: - - name: "DATA_SOCKET_SERVER" - kind: "host" - affinity: 0 - num_bufs: 1024 - buf_size: 65507 - interfaces: - - name: udp_server - address: 10.250.0.2 - socket_config: - mode: server - local_ip: 10.250.0.2 - local_port: 5021 - remote_ip: "" - remote_port: 0 - max_payload_size: 65535 - rx: - queues: - - name: "RX_Queue" - id: 0 - cpu_core: 8 - batch_size: 1 - memory_regions: ["DATA_SOCKET_SERVER"] - tx: - queues: - - name: "TX_Queue" - id: 0 - cpu_core: 7 - batch_size: 1 - memory_regions: ["DATA_SOCKET_SERVER"] - -socket_bench_server: - server: true - send: false - receive: true - iterations: 1000000000 - message_size: 65507 - server_address: 10.250.0.2 - client_address: 10.250.0.1 - server_port: 5021 -``` - -Client template: - -```yaml -%YAML 1.2 ---- -daqiri: - cfg: - version: 1 - stream_type: "socket" - protocol: "udp" - master_core: 3 - debug: false - log_level: "info" - memory_regions: - - name: "DATA_SOCKET_CLIENT" - kind: "host" - affinity: 0 - num_bufs: 1024 - buf_size: 65507 - interfaces: - - name: udp_client - address: 10.250.0.1 - socket_config: - mode: client - local_ip: 10.250.0.1 - local_port: 5121 - remote_ip: 10.250.0.2 - remote_port: 5021 - max_payload_size: 65535 - rx: - queues: - - name: "RX_Queue" - id: 0 - cpu_core: 8 - batch_size: 1 - memory_regions: ["DATA_SOCKET_CLIENT"] - tx: - queues: - - name: "TX_Queue" - id: 0 - cpu_core: 7 - batch_size: 1 - memory_regions: ["DATA_SOCKET_CLIENT"] - -socket_bench_client: - server: false - send: true - receive: false - iterations: 1000000000 - message_size: 65507 - server_address: 10.250.0.2 - client_address: 10.250.0.1 - server_port: 5021 -``` - -For TCP tests, set `protocol: "tcp"` in both files and use distinct ports for -parallel processes. For UDP tests, keep message sizes at or below `65507`. - -Run server and client: - -```bash -export LD_LIBRARY_PATH=/work/build-spark-rdma/src:${LD_LIBRARY_PATH:-} -BIN=/work/build-spark-rdma/examples/daqiri_bench_socket - -ip netns exec "$SERVER_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ - "$BIN" /tmp/server.yaml --seconds 11 --mode server & - -sleep 1 - -ip netns exec "$CLIENT_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ - "$BIN" /tmp/client.yaml --seconds 10 --mode client - -wait -``` - -For a four-process run, generate four server/client config pairs with ports such -as `5021`, `5022`, `5023`, and `5024`, then launch all four servers followed by -all four clients. Use different client local ports, for example server port plus -100. - -## Known Verified Results - -The following DAQIRI matrix was run on the verified physical path -`enp1s0f0np0 -> enp1s0f1np1` with four client/server process pairs: - -| Protocol | Message size | App TX | App RX | Loss | Client `tx_packets_phy` | Server `rx_packets_phy` | -|---|---:|---:|---:|---:|---:|---:| -| TCP | 1000 | 10.93 Gb/s | 10.93 Gb/s | 0.00% | 1,513,047 | 1,513,047 | -| TCP | 8000 | 11.20 Gb/s | 11.20 Gb/s | 0.00% | 1,550,052 | 1,550,052 | -| TCP | 1 MiB | 11.67 Gb/s | 11.67 Gb/s | 0.00% | 1,615,399 | 1,615,399 | -| UDP | 1000 | 12.28 Gb/s | 11.68 Gb/s | 4.88% | 15,350,463 | 15,350,463 | -| UDP | 8000 | 12.93 Gb/s | 10.10 Gb/s | 21.91% | 2,020,461 | 2,020,461 | -| UDP | 65507 | 12.84 Gb/s | 12.41 Gb/s | 3.34% | 1,960,392 | 1,960,392 | - -UDP 1 MiB was intentionally skipped because the socket backend rejects UDP -payloads above `65507`. - -## Restore Host Networking - -After tests, move interfaces back to the host and restore the usual Spark IPs. -Adjust interface names and addresses for the target machine: - -```bash -for ns in "$CLIENT_NS" "$SERVER_NS"; do - ip netns exec "$ns" ip link set "$CLIENT_IF" netns 1 >/dev/null 2>&1 || true - ip netns exec "$ns" ip link set "$SERVER_IF" netns 1 >/dev/null 2>&1 || true -done - -ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true -ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true - -for ifc in enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1; do - ip addr flush dev "$ifc" >/dev/null 2>&1 || true - ip link set dev "$ifc" mtu 9082 up >/dev/null 2>&1 || true -done - -ip addr add 1.1.1.1/24 dev enp1s0f0np0 -ip addr add 2.2.2.2/24 dev enP2p1s0f0np0 - -ip neigh replace 2.2.2.2 lladdr 4c:bb:47:2a:ea:f1 \ - dev enp1s0f0np0 nud permanent -ip neigh replace 1.1.1.1 lladdr 4c:bb:47:2a:ea:ed \ - dev enP2p1s0f0np0 nud permanent -``` - -## Loopback Disable Knobs - -Two mlx5 loopback knobs were considered: - -```bash -ethtool --set-priv-flags local_lb off -mlxconfig -d set FORCE_LOOPBACK_DISABLE=1 -``` - -On the tested Spark, the `local_lb` private flag was not exposed by -`ethtool --show-priv-flags`, so the runtime flag could not be used. - -`mlxconfig` was present in the container, but direct PCI config queries hung in -this session. No firmware settings were changed. Treat -`FORCE_LOOPBACK_DISABLE=1` as a maintenance-window experiment: query and set it -only with the proper Mellanox firmware tooling available, then reset or reboot -as required and rerun the same `rx_packets_phy` proof. diff --git a/docs/concepts.md b/docs/concepts.md index ba1b46d..c9ca280 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -22,6 +22,11 @@ choice is configured per-application in YAML by two keys: - `protocol` — required when `stream_type: "socket"`; selects the socket-level protocol. +The shipped Ethernet stream types use NICs as their hardware endpoint. +The planned PCIe programmable-sensor path uses the same DAQIRI model for +devices that sit directly on the PCIe bus, such as FPGAs, frame grabbers, +or custom acquisition cards. + ### Raw Ethernet *YAML:* `stream_type: "raw"`. @@ -57,8 +62,11 @@ Requires an NVIDIA SmartNIC (ConnectX-6 Dx or later). *YAML:* `stream_type: "pcie"`. -Placeholder for an upcoming direct-PCIe stream type. Not implemented -yet. +Coming-soon path for sensors that appear directly on the PCIe bus, such +as FPGAs, frame grabbers, or custom acquisition cards. The goal is to +move data into or out of CPU or NVIDIA GPU memory through the same +DAQIRI C++/Python API while avoiding unnecessary copies. This stream +type does not currently ship with a runnable benchmark or example YAML. ### Choosing a stream type @@ -87,6 +95,7 @@ in the configuration walkthrough. - **Socket — RoCE** (`stream_type: "socket"`, `protocol: "roce"`) is supported and distributed; integration testing is under development. + - The **PCIe programmable-sensor** path is under development. ## GPUDirect diff --git a/docs/getting-started.md b/docs/getting-started.md index a752f18..a5af874 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -201,5 +201,5 @@ Once DAQIRI is built, follow the tutorials to configure your system and run your 1. [**Concepts**](concepts.md) — terminology (stream types and protocols, packet, burst, segment, flow, queue, memory region), GPUDirect, and zero-copy ownership. Keep this open in a second tab. 2. [**API Guide**](api-reference/index.md) — the six-step DAQIRI application lifecycle and configuration-first model 3. [**System Configuration**](tutorials/system_configuration.md) — NIC drivers, link layers, GPUDirect, hugepages, CPU isolation, GPU clocks, and more -4. [**Benchmarking Examples**](tutorials/benchmarking_examples.md) — run `daqiri_bench_raw_gpudirect` with a loopback test +4. [**Benchmarking**](tutorials/benchmarking.md) — choose a backend, then run socket/RDMA or raw Ethernet benchmarks 5. [**Understanding the Configuration File**](tutorials/configuration-walkthrough.md) — annotated YAML walkthrough diff --git a/docs/images/backend-decision-tree.svg b/docs/images/backend-decision-tree.svg new file mode 100644 index 0000000..25c1db3 --- /dev/null +++ b/docs/images/backend-decision-tree.svg @@ -0,0 +1,80 @@ + + DAQIRI networking backend decision tree + Choose the coming-soon PCIe path for programmable PCIe sensors, socket TCP or UDP for non-NVIDIA NICs, socket RoCE for NVIDIA NICs talking to an RDMA endpoint, or raw Ethernet for NVIDIA NICs without an existing RoCE endpoint. + + + + + + + + + + + + + + DAQIRI Networking Backend Decision Tree + Choose the backend that matches the local sensor, NIC, and peer protocol. + + + + + + + + + + + + + + + + + + + + PCIe Programmable + Sensor (FPGA, etc)? + + NVIDIA NIC? + + Existing endpoint + implementing RoCE? + + + + + Yes + No + No + Yes + Yes + No + + + + + + stream_type = pcie + coming soon + + + + + stream_type = socket, + protocol = tcp/udp + + + + + stream_type = socket, + protocol = roce + + + + + stream_type = raw + + diff --git a/docs/images/daqiri-landing-graphic.svg b/docs/images/daqiri-landing-graphic.svg new file mode 100644 index 0000000..e0dd666 --- /dev/null +++ b/docs/images/daqiri-landing-graphic.svg @@ -0,0 +1,222 @@ + + DAQIRI sensor data paths to CPU or NVIDIA GPU memory + A diagram showing sensor data entering or leaving CPU memory or NVIDIA GPU memory through DAQIRI from a PCIe FPGA path or a network-capable sensor path through a NIC. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sensor streams meet CPU or GPU memory + PCIe devices and network-capable sensors share one DAQIRI application path + + + + + + + + + FPGA + + + + + + + + PCIe device + FPGA / frame grabber + sensor front-end + + PCIe BAR + + + + + + + + + + + + + + + Network-capable + sensor + + Raw Ethernet + UDP/TCP + + RoCE + + + + + + NIC + + + + + + + + + + RX/TX + + + + + + + DAQIRI + C++/Python Library + + + + RX/TX bursts + + flow steering + + zero-copy API + + + + + + Zero-copy to GPU or CPU + + + + + GPU + NVIDIA + + GPU + memory + + + + + + + CPU + + CPU + memory + + + + + + + + PCIe + + zero-copy + + + + + + + + + + + + + + + + + GPU + CPU + + + + + + + + + + + one application, bidirectional data paths + PCIe or network sensors into CPU/GPU memory + + diff --git a/docs/index.html b/docs/index.html index f5b49e8..e4805be 100644 --- a/docs/index.html +++ b/docs/index.html @@ -31,6 +31,7 @@ pre .str { color:#c3e88d; } pre .nm { color:var(--nv-green-l); } .container { max-width:1200px; margin:0 auto; padding:0 2rem; } + #hero .container { max-width:1360px; } section { padding:6rem 0; } .section-label { font-size:.72rem; font-weight:700; letter-spacing:.15em; text-transform:uppercase; color:var(--nv-green); margin-bottom:.75rem; } .section-title { color:var(--text-pri); margin-bottom:1rem; } @@ -76,26 +77,45 @@ .btn-outline:hover { color:var(--text-pri); border-color:#444; background:rgba(255,255,255,.04); } /* HERO */ - #hero { min-height:100vh; display:flex; align-items:center; padding-top:var(--nav-h); position:relative; overflow:hidden; } - .hero-inner { display:grid; grid-template-columns:1fr auto; gap:4rem; align-items:center; } - .hero-logo-wrap { display:flex; align-items:center; justify-content:center; flex-shrink:0; } - .hero-logo-wrap img { width:320px; max-width:38vw; filter:drop-shadow(0 0 40px rgba(118,185,0,0.18)); } + #hero { min-height:calc(100vh - 24px); display:flex; align-items:center; padding:calc(var(--nav-h) + 3rem) 0 4rem; position:relative; overflow:hidden; } + .hero-inner { display:grid; grid-template-columns:minmax(0,1fr) minmax(460px,650px); column-gap:2rem; row-gap:2rem; align-items:center; } + .hero-visual { position:relative; z-index:1; grid-column:2; grid-row:1 / span 3; display:flex; align-items:center; justify-content:center; } + .hero-visual::before { content:''; position:absolute; inset:-5% -8% -2%; background:radial-gradient(ellipse,rgba(118,185,0,.28) 0%,transparent 68%); filter:blur(20px); z-index:-1; } + .hero-visual-link { display:block; width:min(100%,650px); padding:.45rem; border-radius:20px; appearance:none; background:linear-gradient(135deg,rgba(118,185,0,.34),rgba(93,216,242,.18)); border:1px solid rgba(160,208,0,.38); box-shadow:0 24px 70px rgba(0,0,0,.58),0 0 0 1px rgba(255,255,255,.05) inset; transition:transform var(--ease),border-color var(--ease),box-shadow var(--ease); cursor:zoom-in; } + .hero-visual-link:hover { transform:translateY(-2px); border-color:rgba(160,208,0,.68); box-shadow:0 30px 90px rgba(0,0,0,.65),0 0 34px rgba(118,185,0,.16); } + .hero-visual-link:focus-visible { outline:2px solid var(--nv-green); outline-offset:4px; } + .hero-visual img { width:100%; display:block; border-radius:16px; filter:contrast(1.08) brightness(1.08) saturate(1.12) drop-shadow(0 0 44px rgba(118,185,0,0.18)); } .hero-grid { position:absolute; inset:0; z-index:0; background-image:linear-gradient(rgba(118,185,0,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(118,185,0,.04) 1px,transparent 1px); background-size:60px 60px; mask-image:radial-gradient(ellipse 80% 60% at 50% 40%,black 30%,transparent 100%); } .hero-glow { position:absolute; top:-20%; left:50%; transform:translateX(-50%); width:800px; height:500px; background:radial-gradient(ellipse,rgba(118,185,0,.11) 0%,transparent 70%); pointer-events:none; z-index:0; } - .hero-content { position:relative; z-index:1; max-width:780px; } + .hero-content { position:relative; z-index:1; grid-column:1; max-width:760px; } .hero-eyebrow { display:inline-flex; align-items:center; gap:.5rem; font-size:.72rem; font-weight:700; letter-spacing:.15em; text-transform:uppercase; color:var(--nv-green); background:rgba(118,185,0,.08); border:1px solid rgba(118,185,0,.2); border-radius:99px; padding:.35rem 1rem; margin-bottom:2rem; } .hero-eyebrow::before { content:''; width:6px; height:6px; border-radius:50%; background:var(--nv-green); animation:pulse 2s ease-in-out infinite; } @keyframes pulse { 0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)} } - .hero-title { margin-bottom:1.5rem; } + .hero-title { font-size:clamp(1.9rem,3.3vw,2.65rem); margin-bottom:1.5rem; } .hero-title .hi { color:var(--nv-green); } - .hero-desc { font-size:1.15rem; color:var(--text-mut); max-width:620px; margin-bottom:2rem; line-height:1.75; } - .hero-actions { display:flex; align-items:center; gap:1rem; flex-wrap:wrap; margin-bottom:3.5rem; } - .hero-stats { display:flex; gap:3rem; flex-wrap:wrap; border-top:1px solid var(--border); padding-top:2.5rem; } - .stat-value { font-size:1.75rem; font-weight:800; color:var(--text-pri); letter-spacing:-.03em; } + .hero-desc { font-size:1.15rem; color:var(--text-mut); max-width:620px; margin-bottom:0; line-height:1.75; } + .hero-actions { position:relative; z-index:1; grid-column:1; display:flex; align-items:center; gap:1rem; flex-wrap:wrap; } + .hero-stats { grid-column:1 / -1; display:flex; gap:3rem; flex-wrap:wrap; border-top:1px solid var(--border); padding-top:2.5rem; } + .stat-value { font-size:1.45rem; font-weight:800; color:var(--text-pri); letter-spacing:-.03em; } .stat-label { font-size:.78rem; color:var(--text-dim); font-weight:500; text-transform:uppercase; letter-spacing:.1em; margin-top:.2rem; } + /* GRAPHIC OVERLAY */ + body.graphic-overlay-open { overflow:hidden; } + .graphic-overlay { position:fixed; inset:calc(var(--nav-h) + 1rem) 1.5rem 1.5rem; z-index:2000; display:grid; place-items:center; opacity:0; visibility:hidden; pointer-events:none; transition:opacity var(--ease),visibility var(--ease); } + .graphic-overlay.is-open { opacity:1; visibility:visible; pointer-events:auto; } + .graphic-overlay-backdrop { position:absolute; inset:0; border-radius:22px; background:rgba(4,7,4,.74); border:1px solid rgba(118,185,0,.22); box-shadow:0 24px 120px rgba(0,0,0,.72); backdrop-filter:blur(6px); } + .graphic-overlay-panel { position:relative; width:min(1120px,calc(100vw - 6rem)); max-height:calc(100vh - var(--nav-h) - 4.5rem); display:flex; flex-direction:column; border-radius:18px; background:#070907; border:1px solid rgba(160,208,0,.5); box-shadow:0 0 0 1px rgba(255,255,255,.05) inset,0 0 48px rgba(118,185,0,.16); overflow:hidden; transform:translateY(8px) scale(.985); transition:transform var(--ease); } + .graphic-overlay.is-open .graphic-overlay-panel { transform:translateY(0) scale(1); } + .graphic-overlay-bar { display:flex; align-items:center; justify-content:space-between; gap:1rem; padding:.85rem 1rem; border-bottom:1px solid rgba(118,185,0,.2); background:rgba(17,22,13,.96); } + .graphic-overlay-title { margin:0; color:var(--text-pri); font-size:.95rem; font-weight:800; letter-spacing:0; } + .graphic-overlay-close { width:36px; height:36px; display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; border-radius:8px; border:1px solid rgba(255,255,255,.14); background:rgba(255,255,255,.05); color:var(--text-pri); cursor:pointer; transition:background var(--ease),border-color var(--ease),color var(--ease); } + .graphic-overlay-close:hover { background:rgba(118,185,0,.14); border-color:rgba(160,208,0,.5); color:var(--nv-green-l); } + .graphic-overlay-close:focus-visible { outline:2px solid var(--nv-green); outline-offset:3px; } + .graphic-overlay-close svg { width:18px; height:18px; display:block; } + .graphic-overlay-img { width:100%; height:auto; max-height:calc(100vh - var(--nav-h) - 8.5rem); display:block; object-fit:contain; background:#050705; } + /* WARNING BANNER */ - .warn-banner { background:rgba(255,193,7,.07); border:1px solid rgba(255,193,7,.25); border-radius:var(--radius); padding:.9rem 1.25rem; display:flex; gap:.75rem; align-items:flex-start; margin-bottom:2rem; } + .warn-banner { position:relative; z-index:1; grid-column:1; background:rgba(255,193,7,.07); border:1px solid rgba(255,193,7,.25); border-radius:var(--radius); padding:.9rem 1.25rem; display:flex; gap:.75rem; align-items:flex-start; } .warn-banner p { color:rgba(255,203,107,.85); font-size:.875rem; } /* FEATURES */ @@ -253,9 +273,9 @@ font-size:.85rem; } } - @media (max-width:1000px) { .hero-inner { grid-template-columns:1fr; } .hero-logo-wrap { display:none; } } + @media (max-width:1000px) { #hero .container { max-width:1200px; } .hero-inner { grid-template-columns:1fr; } .hero-content { grid-column:auto; order:1; } .hero-visual { grid-column:auto; grid-row:auto; order:2; margin:.5rem 0; } .warn-banner { grid-column:auto; order:3; } .hero-actions { grid-column:auto; order:4; } .hero-stats { order:5; } .hero-visual-link { width:min(100%,720px); } } @media (max-width:900px) { .gs-layout { grid-template-columns:1fr; } .gs-code-panel { position:static; } .footer-inner { grid-template-columns:1fr 1fr; } } - @media (max-width:640px) { section { padding:4rem 0; } .footer-inner { grid-template-columns:1fr; } .tut-meta { display:none; } .nav-actions .btn-outline { display:none; } } + @media (max-width:640px) { section { padding:4rem 0; } .hero-stats { gap:1.5rem 2rem; } .stat-value { font-size:1.2rem; } .footer-inner { grid-template-columns:1fr; } .tut-meta { display:none; } .nav-actions .btn-outline { display:none; } .graphic-overlay { inset:calc(var(--nav-h) + .5rem) .5rem .5rem; } .graphic-overlay-panel { width:100%; max-height:calc(100vh - var(--nav-h) - 1rem); } .graphic-overlay-img { max-height:calc(100vh - var(--nav-h) - 5rem); } } @@ -269,13 +289,16 @@ News @@ -309,15 +333,20 @@
-
-
NVIDIA Open Source · Data Acquisition
-

DAQIRI — Command the
Data Deluge at the Source

-

- DAQIRI (Data Acquisition for Integrated Real-time Instruments) connects high-bandwidth streaming sensors - directly to the NVIDIA compute ecosystem. By abstracting zero-copy data movement from sensor to GPU, - DAQIRI puts scalable, real-time AI, signal processing, and scientific computing within reach of the next - generation of instruments. -

+
+
NVIDIA Open Source · Data Acquisition
+

DAQIRI for Sensor Data
in CPU or NVIDIA GPU Memory

+

+ DAQIRI (Data Acquisition for Integrated Real-time Instruments) moves high-bandwidth data between external + sensors and CPU or NVIDIA GPU memory. Streams can arrive from PCIe devices such as FPGAs or from network-capable sensors + over Raw Ethernet (UDP/TCP) or RoCE/RDMA, giving applications one zero-copy path for ingest and egress. +

+
+
+ +
⚠️

The library is undergoing large improvements as we aim to better support it as an NVIDIA product. API breakages may be more frequent until version 1.0.

@@ -326,18 +355,16 @@

DAQIRI — Command the
Data Deluge at the Quick Start → Key Concepts API Reference - Examples + Benchmarking

-
Gbps – Tbps+
Sensor Bandwidth
-
Zero-Copy
Sensor → GPU
-
UDP, RoCE
Protocol
C++
Language
Multi-Sensor
Scalable
Minutes
Time to Deployment
Apache 2.0
License
+
PCIe + Ethernet
Sensor Paths
+
Ingest + Egress
Data Direction
+
Zero-Copy
CPU/GPU Memory
+
Raw Ethernet, RoCE
Protocols
+
C++ / Python
Application API
-
- DAQIRI — sensor connected to GPU infrastructure -
-
@@ -664,11 +691,12 @@

Tutorials

02
Bare-Metal CMake Build
End-to-end bare-metal build: verify prerequisites, install RDMA libraries, build patched DPDK 25.11 from source, configure DAQIRI_MGR / DAQIRI_BUILD_PYTHON / CMAKE_CUDA_ARCHITECTURES, install, smoke-test, troubleshoot.
Intermediate~45 min
03
Container Build with Patched DPDK
Build the Docker image with build-container.sh. The container ships a dmabuf-patched DPDK, so peermem is not required.
Coming Soon
04
System Tuning for High-Performance Networking
Isolate CPU cores, configure hugepages, set NUMA affinity, and run python/tune_system.py to diagnose common configuration issues.
Intermediate~30 min
- 05
Benchmarking Examples
Run a TX/RX loopback test to validate your setup, and walk through interpreting throughput results.
Beginner~20 min
- 06
YAML Configuration Deep Dive
Memory regions (huge, device, host_pinned), RX/TX queue setup, flow steering rules, flex items, and RDMA client/server config schemas.
Intermediate~40 min
-
07
GPUDirect: Header-Data Split Pipeline
Configure a two-region memory layout, access CPU headers and GPU payloads per-packet with get_segment_packet_ptr(), and reorder scattered GPU buffers with the built-in CUDA kernel.
Coming Soon
-
08
RoCE (RDMA) Client/Server Setup
Configure stream_type: socket, protocol: roce with RC transport, assign client and server roles across two hosts, and run daqiri_bench_rdma to validate the connection.
Coming Soon
-
09
Timed TX with ConnectX-7
Enable accurate_send in the TX config and use set_packet_tx_time() for PTP-synchronized, hardware-scheduled packet transmission on ConnectX-7+.
Coming Soon
+ 05
Benchmarking Overview
Choose between Linux sockets, RoCE/RDMA, and raw Ethernet before editing benchmark YAML.
Beginner~10 min
+ 06
Socket and RDMA Benchmarking
Run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation and PHY-counter checks.
Intermediate~30 min
+ 07
Raw Ethernet Benchmarking
Run a DPDK raw Ethernet TX/RX loopback test and interpret NIC throughput counters.
Intermediate~20 min
+ 08
YAML Configuration Deep Dive
Memory regions (huge, device, host_pinned), RX/TX queue setup, flow steering rules, flex items, and RDMA client/server config schemas.
Intermediate~40 min
+
09
GPUDirect: Header-Data Split Pipeline
Configure a two-region memory layout, access CPU headers and GPU payloads per-packet with get_segment_packet_ptr(), and reorder scattered GPU buffers with the built-in CUDA kernel.
Coming Soon
+
10
Timed TX with ConnectX-7
Enable accurate_send in the TX config and use set_packet_tx_time() for PTP-synchronized, hardware-scheduled packet transmission on ConnectX-7+.
Coming Soon
@@ -749,7 +777,7 @@

Connect Your Sensors to the NVIDIA Ecosystem

  • C++ API Usage
  • Python API Usage
  • Getting Started
  • -
  • Examples
  • +
  • Benchmarking
  • @@ -782,39 +810,113 @@

    Connect Your Sensors to the NVIDIA Ecosystem

    + + diff --git a/docs/tutorials/benchmarking.md b/docs/tutorials/benchmarking.md new file mode 100644 index 0000000..22d7eef --- /dev/null +++ b/docs/tutorials/benchmarking.md @@ -0,0 +1,49 @@ +# Benchmarking + +DAQIRI ships with several backends to handle different types of incoming and outgoing streams. Choosing the stream type depends on the type of sensor being used and its capabilities. The `stream_type` is decided from the decision tree below: + +![DAQIRI networking backend decision tree](../images/backend-decision-tree.svg) + +## Choose a backend + +| Use case | DAQIRI config | Benchmark | Start here | +|---|---|---|---| +| Ingest from or egress to a programmable PCIe sensor, such as an FPGA on the PCIe bus. | `stream_type: "pcie"` | Coming soon | PCIe benchmarking docs are coming soon. | +| Compare against normal Linux networking, run on a non-NVIDIA NIC, or test a peer that speaks TCP/UDP sockets. | `stream_type: "socket"` with `protocol: "tcp"` or `protocol: "udp"` | `daqiri_bench_socket` | [Socket and RDMA Benchmarking](socket_benchmarking.md) | +| Test a peer that already implements RDMA verbs over RoCE. | `stream_type: "socket"` with `protocol: "roce"` | `daqiri_bench_rdma` | [Socket and RDMA Benchmarking](socket_benchmarking.md#run-the-rdma-roce-benchmark) | +| Drive raw Ethernet packets directly from an NVIDIA NIC under DAQIRI control. | `stream_type: "raw"` | `daqiri_bench_raw_gpudirect` and the other `raw_*` benches | [Raw Ethernet Benchmarking](benchmarking_examples.md) | + +!!! note "PCIe backend status" + + The PCIe programmable-sensor path is under development. Once completed it will allow 3rd party PCIe devices + to read from and write to the GPU's BAR1 memory. + +!!! note "Why RDMA is listed under socket" + + The RoCE benchmark uses the connection-oriented socket/RDMA configuration model. The executable is named `daqiri_bench_rdma` to show the RDMA-specific API calls. + +## Common benchmark workflow + +1. Build the examples with the backend you plan to test. The default container build enables all three: + + ```bash + BASE_TARGET=dpdk DAQIRI_MGR="dpdk socket rdma" scripts/build-container.sh + ``` + +2. Pick the physical pair or host pair that should carry the traffic. For same-host Spark wire tests, prefer a client namespace and a server namespace so the route cannot silently fall back to loopback. + +3. Prove the direction with hardware counters before trusting bandwidth numbers. For one-way client-to-server tests, the important counters are the client-side `tx_packets_phy` / `tx_bytes_phy` and the server-side `rx_packets_phy` / `rx_bytes_phy`. + +4. Run the DAQIRI benchmark and a known baseline such as `iperf3` or `ib_send_bw` with the same namespace, interface, and message-size assumptions. + +5. Monitor line rate with NIC counters or `mlnx_perf`; application-side byte counts are useful, but hardware counters answer whether packets actually reached the physical path. + +## Page map + +- [Socket and RDMA Benchmarking](socket_benchmarking.md) covers Linux TCP/UDP and RoCE/RDMA runs with matching client/server namespace setup. +- [Raw Ethernet Benchmarking](benchmarking_examples.md) covers the DPDK/raw Ethernet examples, hugepage sizing, physical loopback configuration, and raw benchmark troubleshooting. +- [Understanding the Configuration File](configuration-walkthrough.md) explains the YAML fields once you have selected the backend and example config. + +--- +**Previous:** [System Configuration](system_configuration.md)
    +**Next:** [Socket and RDMA Benchmarking](socket_benchmarking.md) diff --git a/docs/tutorials/benchmarking_examples.md b/docs/tutorials/benchmarking_examples.md index 1cb98fe..95db594 100644 --- a/docs/tutorials/benchmarking_examples.md +++ b/docs/tutorials/benchmarking_examples.md @@ -3,13 +3,13 @@ hide: - navigation --- -# Benchmarking Examples +# Raw Ethernet Benchmarking -DAQIRI provides a benchmarking application named `daqiri_bench_raw_gpudirect` that can be used to test the performance of the networking configuration. In this section, we'll walk you through the steps needed to configure the application for your NIC for Tx and Rx, and run a loopback test between the two interfaces with a [physical SFP cable](https://www.nvidia.com/en-us/networking/interconnect/) connecting them. +DAQIRI provides raw Ethernet benchmark applications that use DPDK to drive an NVIDIA NIC directly. This page walks through `daqiri_bench_raw_gpudirect`, the TX/RX loopback config, and the raw Ethernet checks needed before interpreting throughput results. Make sure to [build the DAQIRI library](../getting-started.md#build-the-daqiri-library) beforehand. -**Not sure which YAML to start from?** See [Choosing an example config](configuration-walkthrough.md#choosing-an-example-config) in the configuration tutorial — a use-case-driven decision tree from "I just want to verify the build" through reorder, recording, RDMA, and sockets. +**Not sure which backend to benchmark?** Start with the [Benchmarking overview](benchmarking.md). Use this page after you have chosen the raw Ethernet backend. Use [Socket and RDMA Benchmarking](socket_benchmarking.md) for TCP, UDP, and RoCE/RDMA runs. !!! note "Prerequisites" @@ -41,7 +41,7 @@ docker run --rm -it --privileged \ | Flag | Purpose | |------|---------| - | `--privileged` | DPDK requires raw access to NIC hardware (PCI devices, hugepage files). Also covers `/dev/infiniband` for RDMA. | + | `--privileged` | DPDK requires raw access to NIC hardware, PCI devices, and hugepage files. | | `--runtime=nvidia` | Makes the host GPU visible inside the container via the NVIDIA Container Toolkit | | `--network=host` | Shares the host network namespace so DPDK can discover the physical NIC interfaces and their PCIe topology | | `-v /dev/hugepages:/dev/hugepages` | Mounts the hugepage filesystem for DPDK memory allocation (`--privileged` alone does not cover mounted filesystems) | @@ -478,5 +478,5 @@ The `*_packets_phy` and `*_bytes_phy` counters are physical-link counters. They You might need to kill some of the listed processes to free up GPU VRAM. --- -**Previous:** [System Configuration](system_configuration.md) +**Previous:** [Benchmarking](benchmarking.md)
    **Next:** [Understanding the Configuration File](configuration-walkthrough.md) — deep dive into the YAML parameters diff --git a/docs/tutorials/configuration-walkthrough.md b/docs/tutorials/configuration-walkthrough.md index 95f2ccf..ef9afc0 100644 --- a/docs/tutorials/configuration-walkthrough.md +++ b/docs/tutorials/configuration-walkthrough.md @@ -19,7 +19,7 @@ If you don't have any NIC at all, the `*_sw_loopback*` variants of the Raw Ether (`DAQIRI_MGR` at the CMake layer is the inverse selector: it tells the build which manager implementations to compile in — `dpdk` enables `stream_type: "raw"`, `socket` enables `stream_type: "socket"` with `protocol: "udp"`/`"tcp"`, and `rdma` enables `protocol: "roce"`. The default build enables all three.) -With a stream type in mind, read down the questions below and stop at the first one that matches what you're trying to do. Each section names the YAML, the binary that consumes it, and any platform-specific notes. +For a shorter backend-selection guide, start with the [Benchmarking overview](benchmarking.md). With a stream type in mind, read down the questions below and stop at the first one that matches what you're trying to do. Each section names the YAML, the binary that consumes it, and any platform-specific notes. ??? question "1. I want to measure baseline throughput" Pick the stream type that matches your stack (see the [overview](#choosing-the-appropriate-daqiri-stream-type-for-your-setup) above), then the hardware or protocol variant. @@ -38,9 +38,9 @@ With a stream type in mind, read down the questions below and stop at the first **Socket — RoCE (RDMA)** (`stream_type: "socket"`, `protocol: "roce"`) — runs on `daqiri_bench_rdma` (use `--mode {tx,rx,both}`). Configs use `kind: host_pinned` regardless of platform. - **Generic** (template — replace IPs) — [`daqiri_bench_rdma_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx.yaml). - - **DGX Spark** (prefilled) — [`daqiri_bench_rdma_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx_spark.yaml). See the [Spark profile callout](benchmarking_examples.md#update-the-loopback-configuration) for run details. + - **DGX Spark** (prefilled) — [`daqiri_bench_rdma_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx_spark.yaml). See [Socket and RDMA Benchmarking](socket_benchmarking.md#run-the-rdma-roce-benchmark) for namespace and wire-counter run details. - **Socket — UDP / TCP** (`stream_type: "socket"`, `protocol: "udp"` or `"tcp"`) — runs on `daqiri_bench_socket`. Both bind to `127.0.0.1`. + **Socket — UDP / TCP** (`stream_type: "socket"`, `protocol: "udp"` or `"tcp"`) — runs on `daqiri_bench_socket`. The shipped smoke-test configs bind to `127.0.0.1`; see [Socket and RDMA Benchmarking](socket_benchmarking.md) for namespace-based wire tests. - **UDP** — [`daqiri_bench_socket_udp_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_socket_udp_tx_rx.yaml). - **TCP** — [`daqiri_bench_socket_tcp_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_socket_tcp_tx_rx.yaml). @@ -418,4 +418,4 @@ The reorder bench runs on `daqiri_bench_raw_reorder_seq`: Other reorder variants are listed under [question 2 of the decision tree above](#choosing-an-example-config): the CPU-kernel variant, the RX-only variants, and the `seq_batch_number` algorithm with in-kernel int4 → fp32 type conversion (runs on `daqiri_bench_raw_reorder_quantize`). --- -**Previous:** [Benchmarking Examples](benchmarking_examples.md) +**Previous:** [Raw Ethernet Benchmarking](benchmarking_examples.md) diff --git a/docs/tutorials/socket_benchmarking.md b/docs/tutorials/socket_benchmarking.md new file mode 100644 index 0000000..b599b48 --- /dev/null +++ b/docs/tutorials/socket_benchmarking.md @@ -0,0 +1,369 @@ +# Socket and RDMA Benchmarking + +Use this page when the peer protocol is TCP, UDP, or RoCE/RDMA. These benchmarks use the Linux networking stack for TCP/UDP and RDMA verbs for RoCE, so the same client/server namespace shape is useful for proving that traffic leaves the host through the expected NIC path. + +Make sure to [build DAQIRI](../getting-started.md#build-the-daqiri-library) with the socket and RDMA backends first. + +## Backend choices + +| Protocol | YAML selector | Benchmark executable | Typical reason to use it | +|---|---|---|---| +| TCP | `stream_type: "socket"`, `protocol: "tcp"` | `daqiri_bench_socket` | Baseline against normal Linux streams or test a TCP-speaking peer. | +| UDP | `stream_type: "socket"`, `protocol: "udp"` | `daqiri_bench_socket` | Datagram baseline against Linux networking. UDP payloads must be at most `65507` bytes. | +| RoCE/RDMA | `stream_type: "socket"`, `protocol: "roce"` | `daqiri_bench_rdma` | Compare DAQIRI RDMA verbs against tools such as `ib_send_bw` or `ib_write_bw`. | + +## Build and launch a test shell + +Build the socket and RDMA benchmarks inside the DAQIRI container: + +```bash +docker run --rm --privileged --network=host --gpus all --ipc=host \ + --user "$(id -u):$(id -g)" \ + -v /dev/hugepages:/dev/hugepages \ + -v "$PWD:/work" \ + -w /work daqiri:local \ + bash -lc 'cmake -S . -B build-socket-rdma \ + -DBUILD_SHARED_LIBS=ON \ + -DDAQIRI_BUILD_PYTHON=OFF \ + -DDAQIRI_MGR="dpdk socket rdma" && + cmake --build build-socket-rdma \ + --target daqiri_bench_socket daqiri_bench_rdma -j"$(nproc)"' +``` + +Run the benchmark setup commands as root. The easiest path is a privileged, host-networked DAQIRI container: + +```bash +docker run --rm -it --privileged --network=host --pid=host --ipc=host \ + --gpus all \ + -v "$PWD:/work" \ + -v /tmp:/tmp \ + -w /work daqiri:local bash +``` + +Install network tools inside the container if needed: + +```bash +apt-get update +apt-get install -y iproute2 iputils-ping ethtool iperf3 rdma-core ibverbs-utils +``` + +## Create isolated namespaces + +Choose one transmit-facing interface and one receive-facing interface. The example below uses the Spark pair that was verified to increment physical counters on the tested system; adjust names, IPs, and MAC addresses on other machines. + +```bash +CLIENT_NS=dq_wire_client +SERVER_NS=dq_wire_server + +CLIENT_IF=enp1s0f0np0 +SERVER_IF=enp1s0f1np1 + +CLIENT_IP=10.250.0.1 +SERVER_IP=10.250.0.2 + +CLIENT_MAC=4c:bb:47:2a:ea:ed +SERVER_MAC=4c:bb:47:2a:ea:ee + +MTU=9082 +``` + +Create namespaces and pin routes to the physical interfaces: + +```bash +ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true +ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true + +ip addr flush dev "$CLIENT_IF" || true +ip addr flush dev "$SERVER_IF" || true + +ip netns add "$CLIENT_NS" +ip netns add "$SERVER_NS" + +ip link set "$CLIENT_IF" netns "$CLIENT_NS" +ip link set "$SERVER_IF" netns "$SERVER_NS" + +ip -n "$CLIENT_NS" addr add "$CLIENT_IP/24" dev "$CLIENT_IF" +ip -n "$SERVER_NS" addr add "$SERVER_IP/24" dev "$SERVER_IF" + +ip -n "$CLIENT_NS" link set lo up +ip -n "$SERVER_NS" link set lo up +ip -n "$CLIENT_NS" link set "$CLIENT_IF" mtu "$MTU" up +ip -n "$SERVER_NS" link set "$SERVER_IF" mtu "$MTU" up + +ip -n "$CLIENT_NS" route add "$SERVER_IP/32" dev "$CLIENT_IF" +ip -n "$SERVER_NS" route add "$CLIENT_IP/32" dev "$SERVER_IF" + +ip -n "$CLIENT_NS" neigh replace "$SERVER_IP" \ + lladdr "$SERVER_MAC" dev "$CLIENT_IF" nud permanent +ip -n "$SERVER_NS" neigh replace "$CLIENT_IP" \ + lladdr "$CLIENT_MAC" dev "$SERVER_IF" nud permanent +``` + +Verify the route and a short control packet: + +```bash +ip -n "$CLIENT_NS" route get "$SERVER_IP" from "$CLIENT_IP" +ip -n "$SERVER_NS" route get "$CLIENT_IP" from "$SERVER_IP" +ip netns exec "$CLIENT_NS" ping -c 1 -W 1 "$SERVER_IP" +``` + +The route output should name the namespace interface, not `lo`. + +!!! note "RDMA device visibility" + + On most RoCE setups, the RDMA device follows the netdev/GID association used by the namespace. If `ibv_devinfo` or `rdma link show` inside a namespace cannot see the expected device, move the matching RDMA device into the namespace with `rdma dev set netns `, or run the RDMA benchmark in the host namespace and still verify the same physical counters. + +## Prove the pair hits the wire + +Capture directional PHY counters before and after a short transfer. For one-way client-to-server traffic: + +```bash +ip netns exec "$CLIENT_NS" ethtool -S "$CLIENT_IF" | \ + grep -E 'tx_packets_phy|tx_bytes_phy|tx_vport_unicast' +ip netns exec "$SERVER_NS" ethtool -S "$SERVER_IF" | \ + grep -E 'rx_packets_phy|rx_bytes_phy|rx_vport_unicast' +``` + +Use `iperf3` as a quick proof before running DAQIRI: + +```bash +ip netns exec "$SERVER_NS" iperf3 -s -B "$SERVER_IP" -1 & +sleep 1 +ip netns exec "$CLIENT_NS" iperf3 -c "$SERVER_IP" -B "$CLIENT_IP" -t 2 -P 1 +wait +``` + +Then check the counters again. Treat the result as on-wire only when the client `tx_packets_phy` and server `rx_packets_phy` counters increase by matching packet counts. If only vport counters move, pick a different port pair. + +## Run the Linux socket benchmark + +The shipped configs run both endpoints on `127.0.0.1` and are useful for a smoke test: + +```bash +./build-socket-rdma/examples/daqiri_bench_socket \ + examples/daqiri_bench_socket_udp_tx_rx.yaml \ + --seconds 10 --mode both + +./build-socket-rdma/examples/daqiri_bench_socket \ + examples/daqiri_bench_socket_tcp_tx_rx.yaml \ + --seconds 10 --mode both +``` + +For an on-wire namespace test, use separate server and client YAML files. The important fields are the protocol, namespace IPs, server port, `max_payload_size`, memory-region `buf_size`, and benchmark `message_size`. + +Server-side UDP template: + +```yaml +%YAML 1.2 +--- +daqiri: + cfg: + version: 1 + stream_type: "socket" + protocol: "udp" + master_core: 3 + debug: false + log_level: "info" + memory_regions: + - name: "DATA_SOCKET_SERVER" + kind: "host" + affinity: 0 + num_bufs: 1024 + buf_size: 65507 + interfaces: + - name: udp_server + address: 10.250.0.2 + socket_config: + mode: server + local_ip: 10.250.0.2 + local_port: 5021 + max_payload_size: 65535 + rx: + queues: + - name: "RX_Queue" + id: 0 + cpu_core: 8 + batch_size: 1 + memory_regions: ["DATA_SOCKET_SERVER"] + tx: + queues: + - name: "TX_Queue" + id: 0 + cpu_core: 7 + batch_size: 1 + memory_regions: ["DATA_SOCKET_SERVER"] + +socket_bench_server: + server: true + send: false + receive: true + iterations: 1000000000 + message_size: 65507 + server_address: 10.250.0.2 + client_address: 10.250.0.1 + server_port: 5021 +``` + +Client-side UDP template: + +```yaml +%YAML 1.2 +--- +daqiri: + cfg: + version: 1 + stream_type: "socket" + protocol: "udp" + master_core: 3 + debug: false + log_level: "info" + memory_regions: + - name: "DATA_SOCKET_CLIENT" + kind: "host" + affinity: 0 + num_bufs: 1024 + buf_size: 65507 + interfaces: + - name: udp_client + address: 10.250.0.1 + socket_config: + mode: client + local_ip: 10.250.0.1 + local_port: 5121 + remote_ip: 10.250.0.2 + remote_port: 5021 + max_payload_size: 65535 + rx: + queues: + - name: "RX_Queue" + id: 0 + cpu_core: 8 + batch_size: 1 + memory_regions: ["DATA_SOCKET_CLIENT"] + tx: + queues: + - name: "TX_Queue" + id: 0 + cpu_core: 7 + batch_size: 1 + memory_regions: ["DATA_SOCKET_CLIENT"] + +socket_bench_client: + server: false + send: true + receive: false + iterations: 1000000000 + message_size: 65507 + server_address: 10.250.0.2 + client_address: 10.250.0.1 + server_port: 5021 +``` + +For TCP, change `protocol: "udp"` to `protocol: "tcp"` in both files. For UDP, keep `message_size` at or below `65507`. + +Run the server and client in their namespaces: + +```bash +export LD_LIBRARY_PATH=/work/build-socket-rdma/src:${LD_LIBRARY_PATH:-} +BIN=/work/build-socket-rdma/examples/daqiri_bench_socket + +ip netns exec "$SERVER_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/socket-server.yaml --seconds 11 --mode server & + +sleep 1 + +ip netns exec "$CLIENT_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/socket-client.yaml --seconds 10 --mode client + +wait +``` + +For a four-process run, create four server/client YAML pairs with unique server ports such as `5021`, `5022`, `5023`, and `5024`, and unique client local ports such as `5121`, `5122`, `5123`, and `5124`. + +## Run the RDMA RoCE benchmark + +Start from `examples/daqiri_bench_rdma_tx_rx.yaml` or `examples/daqiri_bench_rdma_tx_rx_spark.yaml`. The full config can run both endpoints in one process: + +```bash +./build-socket-rdma/examples/daqiri_bench_rdma \ + examples/daqiri_bench_rdma_tx_rx_spark.yaml \ + --seconds 10 --mode both +``` + +For namespace testing, split the file by role just as in the Linux socket test: + +- The server YAML keeps the server memory regions, the server interface with `socket_config.mode: server`, and `rdma_bench_server`. +- The client YAML keeps the client memory regions, the client interface with `socket_config.mode: client`, and `rdma_bench_client`. +- Both files use `stream_type: "socket"` and `protocol: "roce"`. +- `rdma_bench_client.client_address` should be the client namespace IP. + +Run the split RDMA test with the same namespace pair: + +```bash +export LD_LIBRARY_PATH=/work/build-socket-rdma/src:${LD_LIBRARY_PATH:-} +BIN=/work/build-socket-rdma/examples/daqiri_bench_rdma + +ip netns exec "$SERVER_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/rdma-server.yaml --seconds 11 --mode server & + +sleep 1 + +ip netns exec "$CLIENT_NS" env LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ + "$BIN" /tmp/rdma-client.yaml --seconds 10 --mode client + +wait +``` + +Use `ib_send_bw` or `ib_write_bw` in the same namespaces as a comparison baseline, and monitor `mlnx_perf` or `ethtool -S` on the same directional interfaces. + +## Example Spark socket results + +The following DAQIRI socket matrix was run on the verified physical path `enp1s0f0np0 -> enp1s0f1np1` with four client/server process pairs: + +| Protocol | Message size | App TX | App RX | Loss | Client `tx_packets_phy` | Server `rx_packets_phy` | +|---|---:|---:|---:|---:|---:|---:| +| TCP | 1000 | 10.93 Gb/s | 10.93 Gb/s | 0.00% | 1,513,047 | 1,513,047 | +| TCP | 8000 | 11.20 Gb/s | 11.20 Gb/s | 0.00% | 1,550,052 | 1,550,052 | +| TCP | 1 MiB | 11.67 Gb/s | 11.67 Gb/s | 0.00% | 1,615,399 | 1,615,399 | +| UDP | 1000 | 12.28 Gb/s | 11.68 Gb/s | 4.88% | 15,350,463 | 15,350,463 | +| UDP | 8000 | 12.93 Gb/s | 10.10 Gb/s | 21.91% | 2,020,461 | 2,020,461 | +| UDP | 65507 | 12.84 Gb/s | 12.41 Gb/s | 3.34% | 1,960,392 | 1,960,392 | + +UDP 1 MiB is intentionally skipped because Linux UDP payloads above `65507` bytes require fragmentation or segmentation behavior outside the benchmark's supported payload model. + +## Restore host networking + +After tests, move interfaces back to the host and restore the usual IPs. Adjust names and addresses for the target machine: + +```bash +for ns in "$CLIENT_NS" "$SERVER_NS"; do + ip netns exec "$ns" ip link set "$CLIENT_IF" netns 1 >/dev/null 2>&1 || true + ip netns exec "$ns" ip link set "$SERVER_IF" netns 1 >/dev/null 2>&1 || true +done + +ip netns delete "$CLIENT_NS" >/dev/null 2>&1 || true +ip netns delete "$SERVER_NS" >/dev/null 2>&1 || true + +for ifc in enp1s0f0np0 enp1s0f1np1 enP2p1s0f0np0 enP2p1s0f1np1; do + ip addr flush dev "$ifc" >/dev/null 2>&1 || true + ip link set dev "$ifc" mtu 9082 up >/dev/null 2>&1 || true +done +``` + +## Loopback disable knobs + +If namespace isolation still increments only vport counters, check whether the platform exposes loopback control: + +```bash +ethtool --show-priv-flags +ethtool --set-priv-flags local_lb off + +mlxconfig -d q | grep FORCE_LOOPBACK_DISABLE +mlxconfig -d set FORCE_LOOPBACK_DISABLE=1 +``` + +Treat firmware settings as maintenance-window changes: query first, set only with the proper Mellanox tooling available, then reset or reboot as required and rerun the same `rx_packets_phy` proof. + +--- +**Previous:** [Benchmarking](benchmarking.md)
    +**Next:** [Raw Ethernet Benchmarking](benchmarking_examples.md) diff --git a/docs/tutorials/system_configuration.md b/docs/tutorials/system_configuration.md index d67c0cb..3f48ca9 100644 --- a/docs/tutorials/system_configuration.md +++ b/docs/tutorials/system_configuration.md @@ -18,7 +18,7 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ## System Setup for DAQIRI - This section covers the essential system setup steps needed before using DAQIRI. Complete this setup before moving on to [System Optimization](#system-optimization) or [running benchmarks](benchmarking_examples.md). + This section covers the essential system setup steps needed before using DAQIRI. Complete this setup before moving on to [System Optimization](#system-optimization) or [running benchmarks](benchmarking.md). In this tutorial, we will be developing on an **NVIDIA IGX Orin platform** with [IGX SW 1.1](https://docs.nvidia.com/igx-orin/user-guide/latest/base-os.html) and an [NVIDIA RTX 6000 ADA GPU](https://www.nvidia.com/en-us/design-visualization/rtx-6000/), which is the configuration that is currently actively tested. The concepts should be applicable to other systems based on Ubuntu 22.04 as well. It should also work on other Linux distributions with a glibc version of 2.35 or higher by containerizing the dependencies and applications on top of an Ubuntu 22.04 image, but this is not actively tested at this time. @@ -1298,7 +1298,7 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ``` --- - **Next:** [Benchmarking Examples](benchmarking_examples.md) — run your first DAQIRI benchmark + **Next:** [Benchmarking](benchmarking.md) — choose and run your first DAQIRI benchmark === "DGX Spark" @@ -1585,6 +1585,6 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ``` --- - **Next:** [Benchmarking Examples](benchmarking_examples.md) — run your first DAQIRI benchmark + **Next:** [Benchmarking](benchmarking.md) — choose and run your first DAQIRI benchmark diff --git a/mkdocs.yml b/mkdocs.yml index 65d9e7d..263cebe 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -58,6 +58,10 @@ nav: - Tutorials: - System Configuration: tutorials/system_configuration.md - Bare-Metal CMake Build: tutorials/bare-metal-cmake-build.md + - Benchmarking: + - Overview: tutorials/benchmarking.md + - Socket and RDMA: tutorials/socket_benchmarking.md + - Raw Ethernet: tutorials/benchmarking_examples.md - Configuration YAML Walkthrough: tutorials/configuration-walkthrough.md markdown_extensions: diff --git a/pcie_schematic.png b/pcie_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1e5b6d4d762545306db68ffb23d1e1f0943dce GIT binary patch literal 156204 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�Q}q3}qH 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 Date: Wed, 3 Jun 2026 13:57:33 -0500 Subject: [PATCH 04/10] Group benchmarking pages under docs/benchmarks/ and surface them as a top-level "Benchmarking" nav section instead of being split between a single top-level Benchmarks link and a Tutorials > Benchmarking submenu. - Move docs/tutorials/{benchmarking,socket_benchmarking,benchmarking_examples}.md into docs/benchmarks/, renaming benchmarking.md to benchmarks.md and benchmarking_examples.md to raw_benchmarking.md. - Restructure mkdocs.yml nav so Benchmarking is a top-level section with Overview, Socket and RDMA Benchmarking, and Raw Ethernet Benchmarking entries; drop the duplicate Tutorials > Benchmarking submenu. - Drop the hide: navigation frontmatter from the raw Ethernet page so it inherits the new section sidebar. - Update cross-references and link paths in docs/index.html, README.md, AGENTS.md, getting-started.md, configuration-walkthrough.md, system_configuration.md, .claude/rules/docs-sync.md, and .greptile/rules.md to the new locations. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Ramya Gurunathan --- .claude/rules/docs-sync.md | 10 +++---- .greptile/rules.md | 4 +-- AGENTS.md | 7 +++-- README.md | 10 +++---- .../benchmarks.md} | 8 +++--- .../raw_benchmarking.md} | 27 ++++++++----------- .../socket_benchmarking.md | 4 +-- docs/getting-started.md | 2 +- docs/index.html | 22 ++++++++------- docs/tutorials/configuration-walkthrough.md | 12 ++++----- docs/tutorials/system_configuration.md | 8 +++--- mkdocs.yml | 9 +++---- 12 files changed, 62 insertions(+), 61 deletions(-) rename docs/{tutorials/benchmarking.md => benchmarks/benchmarks.md} (86%) rename docs/{tutorials/benchmarking_examples.md => benchmarks/raw_benchmarking.md} (95%) rename docs/{tutorials => benchmarks}/socket_benchmarking.md (99%) diff --git a/.claude/rules/docs-sync.md b/.claude/rules/docs-sync.md index ad05793..fa8f595 100644 --- a/.claude/rules/docs-sync.md +++ b/.claude/rules/docs-sync.md @@ -31,11 +31,11 @@ When the user is committing, pushing, or otherwise wrapping up a change that tou - `docs/getting-started.md` (build instructions) - `AGENTS.md` (build section) - `README.md` (Quick Start commands) -- `src/kernels.cu` / `src/kernels.h` — reorder or quantize kernel changes affect `docs/tutorials/benchmarking_examples.md` and the Reorder & quantize kernels subsection in `AGENTS.md`. +- `src/kernels.cu` / `src/kernels.h` — reorder or quantize kernel changes affect `docs/benchmarks/raw_benchmarking.md` and the Reorder & quantize kernels subsection in `AGENTS.md`. ### Benchmark and example changes (medium impact) - `examples/*.cpp` or `examples/*.yaml` — new benchmarks, changed CLI flags, or new YAML config keys may need updating in: - - `docs/tutorials/benchmarking_examples.md` + - `docs/benchmarks/raw_benchmarking.md` - `docs/tutorials/configuration-walkthrough.md` — when adding or removing a YAML, add or remove a leaf in the **"Choosing an example config"** decision tree (`#choosing-an-example-config`). CI's `scripts/check_doc_refs.py` enforces that every YAML in `examples/` is referenced in this file; a new config without a tree leaf will fail the check. - `AGENTS.md` (benchmark table) - When adding or removing a benchmark executable, also update the benchmark table in `AGENTS.md`. @@ -77,10 +77,10 @@ When the user is committing, pushing, or otherwise wrapping up a change that tou | `src/manager.h` | `docs/api-reference/cpp.md`, `docs/concepts.md`, `AGENTS.md` | | `src/managers/*/` | `docs/getting-started.md`, `docs/concepts.md` (backend list + maturity), `docs/api-reference/configuration.md`, `docs/tutorials/configuration-walkthrough.md`, `README.md`, `AGENTS.md` | | `src/CMakeLists.txt` | `docs/getting-started.md`, `AGENTS.md`, `README.md` | -| `src/kernels.cu` | `docs/tutorials/benchmarking_examples.md`, `AGENTS.md` | +| `src/kernels.cu` | `docs/benchmarks/raw_benchmarking.md`, `AGENTS.md` | | `python/daqiri_common_pybind.cpp` | `docs/api-reference/python.md`, `AGENTS.md` | -| `examples/*.cpp` | `docs/tutorials/benchmarking_examples.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` | -| `examples/*.yaml` | `docs/tutorials/benchmarking_examples.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` | +| `examples/*.cpp` | `docs/benchmarks/raw_benchmarking.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` | +| `examples/*.yaml` | `docs/benchmarks/raw_benchmarking.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` | | `examples/*.py` | `docs/api-reference/python.md`, `AGENTS.md` | | `mkdocs.yml` | `docs/index.html` (nav links) | | Any `docs/*` rename/move | `README.md` (Documentation table), `AGENTS.md` (Documentation section), `mkdocs.yml`, `docs/index.html` | diff --git a/.greptile/rules.md b/.greptile/rules.md index af38c34..09b38a4 100644 --- a/.greptile/rules.md +++ b/.greptile/rules.md @@ -106,8 +106,8 @@ The mapping (mirrored from `.claude/rules/docs-sync.md`): | `src/manager.h` | `docs/api-guide.md`, `AGENTS.md` (Manager abstraction) | | `src/managers/*/` | `docs/getting-started.md`, `docs/configuration.md`, `docs/tutorials/configuration-walkthrough.md`, `README.md` (Backends), `AGENTS.md` | | `src/CMakeLists.txt` (CMake options, `DAQIRI_MGR` default, CUDA arch) | `docs/getting-started.md`, `AGENTS.md` (Build & run), `README.md` (Quick Start) | -| `src/kernels.cu` / `src/kernels.h` | `docs/tutorials/benchmarking_examples.md`, `AGENTS.md` (Reorder & quantize kernels) | -| `examples/*.cpp`, `examples/*.yaml` (new bench, new CLI flag, new YAML key) | `docs/tutorials/benchmarking_examples.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` (benchmark table) | +| `src/kernels.cu` / `src/kernels.h` | `docs/benchmarks/raw_benchmarking.md`, `AGENTS.md` (Reorder & quantize kernels) | +| `examples/*.cpp`, `examples/*.yaml` (new bench, new CLI flag, new YAML key) | `docs/benchmarks/raw_benchmarking.md`, `docs/tutorials/configuration-walkthrough.md`, `AGENTS.md` (benchmark table) | | `mkdocs.yml` nav | `docs/index.html` (landing page links) | | Any `docs/*` rename or move | `README.md` (Documentation table), `AGENTS.md` (Documentation section), `mkdocs.yml`, `docs/index.html` | diff --git a/AGENTS.md b/AGENTS.md index effe7ff..3e78e3e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -97,7 +97,10 @@ The web docs live in `docs/` and are built with [MkDocs Material](https://squidf - `docs/api-reference/index.md` — API guide (6-step application lifecycle, configuration-first model) - `docs/api-reference/configuration.md`, `docs/api-reference/cpp.md`, `docs/api-reference/python.md` — YAML schema, C++ API, and Python bindings docs - `docs/tutorials/` — tutorial walkthroughs (system config, config-file walkthrough) -- `docs/tutorials/benchmarking_examples.md` — surfaced as a top-level "Benchmarks" nav entry in `mkdocs.yml` and `docs/index.html`; file kept at its original path for inbound-link stability +- `docs/benchmarks/` — benchmark guide pages, surfaced as a top-level "Benchmarking" nav section in `mkdocs.yml` and `docs/index.html`: + - `docs/benchmarks/benchmarks.md` — overview and backend-selection decision tree + - `docs/benchmarks/socket_benchmarking.md` — "Socket and RDMA Benchmarking" (TCP/UDP and RoCE/RDMA) + - `docs/benchmarks/raw_benchmarking.md` — "Raw Ethernet Benchmarking" (DPDK `raw_*` benches) - `docs/stylesheets/extra.css` — custom theme overrides **User-facing vocabulary:** docs and the YAML schema use `stream_type` (`raw`, `socket`, future `pcie`) and `protocol` (`udp`, `tcp`, `roce`). The word "backend" is internal-only — accurate for `src/managers//`, the `Manager` ABC, CMake `DAQIRI_MGR`, and API-reference function blurbs, but should not appear in tutorials, the landing page, or concept pages. The mapping: `stream_type: "raw"` is implemented by the `dpdk` manager; `stream_type: "socket"` with `protocol: "udp"` / `"tcp"` is implemented by the `socket` manager; `stream_type: "socket"` with `protocol: "roce"` is implemented by the `rdma` manager. @@ -105,7 +108,7 @@ The web docs live in `docs/` and are built with [MkDocs Material](https://squidf **Keeping docs in sync with code:** before committing changes, scan for the recurring drift hotspots: - **Stream-type list** (`src/managers/*/`) — README Backends table, `docs/getting-started.md`, `docs/concepts.md` (Stream Types section + Support and testing admonition), `docs/api-reference/configuration.md` - **CMake options / `DAQIRI_MGR` default** (`src/CMakeLists.txt:137`) — README Quick Start, `docs/getting-started.md`, this file's Build & run section -- **Benchmark binary or YAML names** (`examples/`) — the benchmark table above, `docs/tutorials/benchmarking_examples.md`, and the "Choosing an example config" decision tree in `docs/tutorials/configuration-walkthrough.md` (every YAML must have a leaf; CI's `scripts/check_doc_refs.py` enforces coverage) +- **Benchmark binary or YAML names** (`examples/`) — the benchmark table above, `docs/benchmarks/raw_benchmarking.md`, and the "Choosing an example config" decision tree in `docs/tutorials/configuration-walkthrough.md` (every YAML must have a leaf; CI's `scripts/check_doc_refs.py` enforces coverage) - **Public API include** (`#include `; source files under `include/daqiri/`) — `docs/api-reference/index.md`, `docs/api-reference/cpp.md`, `docs/api-reference/python.md`; if the change adds or renames a user-facing concept, also `docs/concepts.md` - **Python bindings** (`python/daqiri_common_pybind.cpp`) — `docs/api-reference/python.md` (function reference tables, enums/classes tables, GIL Behavior section) - **Doc reorganization** (any rename in `docs/`) — `docs/index.html` landing page, `mkdocs.yml` nav, README Documentation table diff --git a/README.md b/README.md index 04b19de..617ed90 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ running the benchmarks. ## Benchmarking -Start with the [Benchmarking overview](https://nvidia.github.io/daqiri/tutorials/benchmarking/) to choose between Linux sockets, RoCE/RDMA, and raw Ethernet. +Start with the [Benchmarking overview](https://nvidia.github.io/daqiri/benchmarks/benchmarks/) to choose between Linux sockets, RoCE/RDMA, and raw Ethernet. For Spark-style on-wire tests, use the same client/server namespace shape for Linux sockets and RDMA/RoCE: put the client-facing NIC in one namespace, the server-facing NIC in another, pin routes and neighbors to those interfaces, then verify `tx_packets_phy` on the client and `rx_packets_phy` on the server before trusting bandwidth numbers. @@ -103,7 +103,7 @@ ip netns exec dq_wire_client ./build/examples/daqiri_bench_rdma \ wait ``` -See [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/tutorials/socket_benchmarking/) for the full namespace setup and YAML templates. See [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/tutorials/benchmarking_examples/) for DPDK/raw Ethernet loopback tests. +See [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/benchmarks/socket_benchmarking/) for the full namespace setup and YAML templates. See [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/benchmarks/raw_benchmarking/) for DPDK/raw Ethernet loopback tests. ## Documentation @@ -122,9 +122,9 @@ Reference material for the DAQIRI codebase: Step-by-step walkthroughs to get hands-on: - [System Configuration](https://nvidia.github.io/daqiri/tutorials/system_configuration/) — NIC drivers, link layers, GPUDirect, hugepages, CPU isolation, GPU clocks -- [Benchmarking Overview](https://nvidia.github.io/daqiri/tutorials/benchmarking/) — choose between Linux sockets, RoCE/RDMA, and raw Ethernet benchmarks -- [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/tutorials/socket_benchmarking/) — run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation -- [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/tutorials/benchmarking_examples/) — run `daqiri_bench_raw_gpudirect` with a physical loopback test +- [Benchmarking Overview](https://nvidia.github.io/daqiri/benchmarks/benchmarks/) — choose between Linux sockets, RoCE/RDMA, and raw Ethernet benchmarks +- [Socket and RDMA Benchmarking](https://nvidia.github.io/daqiri/benchmarks/socket_benchmarking/) — run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation +- [Raw Ethernet Benchmarking](https://nvidia.github.io/daqiri/benchmarks/raw_benchmarking/) — run `daqiri_bench_raw_gpudirect` with a physical loopback test - [Understanding the Configuration File](https://nvidia.github.io/daqiri/tutorials/configuration-walkthrough/) — annotated YAML walkthrough ## License diff --git a/docs/tutorials/benchmarking.md b/docs/benchmarks/benchmarks.md similarity index 86% rename from docs/tutorials/benchmarking.md rename to docs/benchmarks/benchmarks.md index 22d7eef..c8dc400 100644 --- a/docs/tutorials/benchmarking.md +++ b/docs/benchmarks/benchmarks.md @@ -11,7 +11,7 @@ DAQIRI ships with several backends to handle different types of incoming and out | Ingest from or egress to a programmable PCIe sensor, such as an FPGA on the PCIe bus. | `stream_type: "pcie"` | Coming soon | PCIe benchmarking docs are coming soon. | | Compare against normal Linux networking, run on a non-NVIDIA NIC, or test a peer that speaks TCP/UDP sockets. | `stream_type: "socket"` with `protocol: "tcp"` or `protocol: "udp"` | `daqiri_bench_socket` | [Socket and RDMA Benchmarking](socket_benchmarking.md) | | Test a peer that already implements RDMA verbs over RoCE. | `stream_type: "socket"` with `protocol: "roce"` | `daqiri_bench_rdma` | [Socket and RDMA Benchmarking](socket_benchmarking.md#run-the-rdma-roce-benchmark) | -| Drive raw Ethernet packets directly from an NVIDIA NIC under DAQIRI control. | `stream_type: "raw"` | `daqiri_bench_raw_gpudirect` and the other `raw_*` benches | [Raw Ethernet Benchmarking](benchmarking_examples.md) | +| Drive raw Ethernet packets directly from an NVIDIA NIC under DAQIRI control. | `stream_type: "raw"` | `daqiri_bench_raw_gpudirect` and the other `raw_*` benches | [Raw Ethernet Benchmarking](raw_benchmarking.md) | !!! note "PCIe backend status" @@ -41,9 +41,9 @@ DAQIRI ships with several backends to handle different types of incoming and out ## Page map - [Socket and RDMA Benchmarking](socket_benchmarking.md) covers Linux TCP/UDP and RoCE/RDMA runs with matching client/server namespace setup. -- [Raw Ethernet Benchmarking](benchmarking_examples.md) covers the DPDK/raw Ethernet examples, hugepage sizing, physical loopback configuration, and raw benchmark troubleshooting. -- [Understanding the Configuration File](configuration-walkthrough.md) explains the YAML fields once you have selected the backend and example config. +- [Raw Ethernet Benchmarking](raw_benchmarking.md) covers the DPDK/raw Ethernet examples, hugepage sizing, physical loopback configuration, and raw benchmark troubleshooting. +- [Understanding the Configuration File](../tutorials/configuration-walkthrough.md) explains the YAML fields once you have selected the backend and example config. --- -**Previous:** [System Configuration](system_configuration.md)
    +**Previous:** [System Configuration](../tutorials/system_configuration.md)
    **Next:** [Socket and RDMA Benchmarking](socket_benchmarking.md) diff --git a/docs/tutorials/benchmarking_examples.md b/docs/benchmarks/raw_benchmarking.md similarity index 95% rename from docs/tutorials/benchmarking_examples.md rename to docs/benchmarks/raw_benchmarking.md index 95db594..1eb415c 100644 --- a/docs/tutorials/benchmarking_examples.md +++ b/docs/benchmarks/raw_benchmarking.md @@ -1,19 +1,14 @@ ---- -hide: - - navigation ---- - # Raw Ethernet Benchmarking DAQIRI provides raw Ethernet benchmark applications that use DPDK to drive an NVIDIA NIC directly. This page walks through `daqiri_bench_raw_gpudirect`, the TX/RX loopback config, and the raw Ethernet checks needed before interpreting throughput results. Make sure to [build the DAQIRI library](../getting-started.md#build-the-daqiri-library) beforehand. -**Not sure which backend to benchmark?** Start with the [Benchmarking overview](benchmarking.md). Use this page after you have chosen the raw Ethernet backend. Use [Socket and RDMA Benchmarking](socket_benchmarking.md) for TCP, UDP, and RoCE/RDMA runs. +**Not sure which backend to benchmark?** Start with the [Benchmarking overview](benchmarks.md). Use this page after you have chosen the raw Ethernet backend. Use [Socket and RDMA Benchmarking](socket_benchmarking.md) for TCP, UDP, and RoCE/RDMA runs. !!! note "Prerequisites" - Before running the benchmarking application, ensure your system has been fully configured per the [System Configuration](system_configuration.md) page. + Before running the benchmarking application, ensure your system has been fully configured per the [System Configuration](../tutorials/system_configuration.md) page. ## Configure hugepages first @@ -23,11 +18,11 @@ Size the hugepage pool to your YAML's `memory_regions` plus DPDK overhead before grep Huge /proc/meminfo ``` -For a persistent allocation across reboots, use the grub recipe in [Step 4 of System Configuration](system_configuration.md#step-4-enable-huge-pages). +For a persistent allocation across reboots, use the grub recipe in [Step 4 of System Configuration](../tutorials/system_configuration.md#step-4-enable-huge-pages). ## Running the DAQIRI container -If you built DAQIRI using the container approach, use the following command to launch the container with Raw Ethernet (DPDK) and GPU support. The host system must be fully configured (see [System Configuration](system_configuration.md)) before the container can access the NIC and GPU hardware. +If you built DAQIRI using the container approach, use the following command to launch the container with Raw Ethernet (DPDK) and GPU support. The host system must be fully configured (see [System Configuration](../tutorials/system_configuration.md)) before the container can access the NIC and GPU hardware. ```bash docker run --rm -it --privileged \ @@ -50,7 +45,7 @@ docker run --rm -it --privileged \ !!! tip "DGX Spark" - For systems configured per the [DGX Spark profile](system_configuration.md#dgx-spark-profile), use these configs to skip the PCIe/IP/CPU-core edits below: + For systems configured per the [DGX Spark profile](../tutorials/system_configuration.md#dgx-spark-profile), use these configs to skip the PCIe/IP/CPU-core edits below: - [`daqiri_bench_raw_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_tx_rx_spark.yaml) for `daqiri_bench_raw_gpudirect` — still set `eth_dst_addr` to the RX MAC. The rx_port is `0002:01:00.1` (physical port p1), so read its MAC: `cat /sys/class/net/enP2p1s0f1np1/address`. This p0-to-p1 pairing is intentional for an over-the-wire single-machine loopback; using two PFs that map to the same physical port exercises the on-chip eswitch path instead. - [`daqiri_bench_rdma_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx_spark.yaml) for `daqiri_bench_rdma` — no further edits needed. @@ -62,7 +57,7 @@ The benchmark executables and example YAML configurations are located at: | **Container** | `/opt/daqiri/bin/` | `/opt/daqiri/bin/` | | **From source** | `./build/examples/` | `./examples/` | -The fields in the YAML configs will be explained in more detail in [Understanding the Configuration File](configuration-walkthrough.md). For now, we'll stick to modifying the strict minimum required fields to run the application as-is on your system. +The fields in the YAML configs will be explained in more detail in [Understanding the Configuration File](../tutorials/configuration-walkthrough.md). For now, we'll stick to modifying the strict minimum required fields to run the application as-is on your system. ##### Identify your NIC's PCIe addresses @@ -426,7 +421,7 @@ The `*_packets_phy` and `*_bytes_phy` counters are physical-link counters. They [critical] [adv_network_dpdk_mgr.cpp:430] Failed to map MRs ``` - Check the [GPUDirect setup](system_configuration.md#enable-gpudirect) for your + Check the [GPUDirect setup](../tutorials/system_configuration.md#enable-gpudirect) for your deployment. Some host builds use `nvidia-peermem`; the container path uses dma-buf support from the patched DPDK build. @@ -450,13 +445,13 @@ The `*_packets_phy` and `*_bytes_phy` counters are physical-link counters. They EAL: x hugepages of size x reserved, no mounted hugetlbfs found for that size ``` - Ensure your [hugepages are mounted](system_configuration.md#step-4-enable-huge-pages). + Ensure your [hugepages are mounted](../tutorials/system_configuration.md#step-4-enable-huge-pages). ```log EAL: No free x kB hugepages reported on node 0 ``` - Reachable only when the in-process preflight is bypassed (e.g. running an older binary against a host with hugepages reserved but not mounted). Mount per [System Configuration: Step 4](system_configuration.md#step-4-enable-huge-pages) and re-run. + Reachable only when the in-process preflight is bypassed (e.g. running an older binary against a host with hugepages reserved but not mounted). Mount per [System Configuration: Step 4](../tutorials/system_configuration.md#step-4-enable-huge-pages) and re-run. ??? failure "Stale `map_*` files in /dev/hugepages after a SIGKILL" @@ -478,5 +473,5 @@ The `*_packets_phy` and `*_bytes_phy` counters are physical-link counters. They You might need to kill some of the listed processes to free up GPU VRAM. --- -**Previous:** [Benchmarking](benchmarking.md)
    -**Next:** [Understanding the Configuration File](configuration-walkthrough.md) — deep dive into the YAML parameters +**Previous:** [Benchmarking](benchmarks.md)
    +**Next:** [Understanding the Configuration File](../tutorials/configuration-walkthrough.md) — deep dive into the YAML parameters diff --git a/docs/tutorials/socket_benchmarking.md b/docs/benchmarks/socket_benchmarking.md similarity index 99% rename from docs/tutorials/socket_benchmarking.md rename to docs/benchmarks/socket_benchmarking.md index b599b48..eb6731c 100644 --- a/docs/tutorials/socket_benchmarking.md +++ b/docs/benchmarks/socket_benchmarking.md @@ -365,5 +365,5 @@ mlxconfig -d set FORCE_LOOPBACK_DISABLE=1 Treat firmware settings as maintenance-window changes: query first, set only with the proper Mellanox tooling available, then reset or reboot as required and rerun the same `rx_packets_phy` proof. --- -**Previous:** [Benchmarking](benchmarking.md)
    -**Next:** [Raw Ethernet Benchmarking](benchmarking_examples.md) +**Previous:** [Benchmarking](benchmarks.md)
    +**Next:** [Raw Ethernet Benchmarking](raw_benchmarking.md) diff --git a/docs/getting-started.md b/docs/getting-started.md index a5af874..cd61b5a 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -201,5 +201,5 @@ Once DAQIRI is built, follow the tutorials to configure your system and run your 1. [**Concepts**](concepts.md) — terminology (stream types and protocols, packet, burst, segment, flow, queue, memory region), GPUDirect, and zero-copy ownership. Keep this open in a second tab. 2. [**API Guide**](api-reference/index.md) — the six-step DAQIRI application lifecycle and configuration-first model 3. [**System Configuration**](tutorials/system_configuration.md) — NIC drivers, link layers, GPUDirect, hugepages, CPU isolation, GPU clocks, and more -4. [**Benchmarking**](tutorials/benchmarking.md) — choose a backend, then run socket/RDMA or raw Ethernet benchmarks +4. [**Benchmarking**](benchmarks/benchmarks.md) — choose a backend, then run socket/RDMA or raw Ethernet benchmarks 5. [**Understanding the Configuration File**](tutorials/configuration-walkthrough.md) — annotated YAML walkthrough diff --git a/docs/index.html b/docs/index.html index e4805be..edbe892 100644 --- a/docs/index.html +++ b/docs/index.html @@ -291,14 +291,18 @@
    Features Quick Start Concepts - Benchmarking + @@ -355,7 +359,7 @@

    DAQIRI for Sensor Data
    in CPU or NVID Quick Start → Key Concepts API Reference - Benchmarking + Benchmarking
    PCIe + Ethernet
    Sensor Paths
    @@ -691,9 +695,9 @@

    Tutorials

    02
    Bare-Metal CMake Build
    End-to-end bare-metal build: verify prerequisites, install RDMA libraries, build patched DPDK 25.11 from source, configure DAQIRI_MGR / DAQIRI_BUILD_PYTHON / CMAKE_CUDA_ARCHITECTURES, install, smoke-test, troubleshoot.
    Intermediate~45 min
    03
    Container Build with Patched DPDK
    Build the Docker image with build-container.sh. The container ships a dmabuf-patched DPDK, so peermem is not required.
    Coming Soon
    04
    System Tuning for High-Performance Networking
    Isolate CPU cores, configure hugepages, set NUMA affinity, and run python/tune_system.py to diagnose common configuration issues.
    Intermediate~30 min
    - 05
    Benchmarking Overview
    Choose between Linux sockets, RoCE/RDMA, and raw Ethernet before editing benchmark YAML.
    Beginner~10 min
    - 06
    Socket and RDMA Benchmarking
    Run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation and PHY-counter checks.
    Intermediate~30 min
    - 07
    Raw Ethernet Benchmarking
    Run a DPDK raw Ethernet TX/RX loopback test and interpret NIC throughput counters.
    Intermediate~20 min
    + 05
    Benchmarking Overview
    Choose between Linux sockets, RoCE/RDMA, and raw Ethernet before editing benchmark YAML.
    Beginner~10 min
    + 06
    Socket and RDMA Benchmarking
    Run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation and PHY-counter checks.
    Intermediate~30 min
    + 07
    Raw Ethernet Benchmarking
    Run a DPDK raw Ethernet TX/RX loopback test and interpret NIC throughput counters.
    Intermediate~20 min
    08
    YAML Configuration Deep Dive
    Memory regions (huge, device, host_pinned), RX/TX queue setup, flow steering rules, flex items, and RDMA client/server config schemas.
    Intermediate~40 min
    09
    GPUDirect: Header-Data Split Pipeline
    Configure a two-region memory layout, access CPU headers and GPU payloads per-packet with get_segment_packet_ptr(), and reorder scattered GPU buffers with the built-in CUDA kernel.
    Coming Soon
    10
    Timed TX with ConnectX-7
    Enable accurate_send in the TX config and use set_packet_tx_time() for PTP-synchronized, hardware-scheduled packet transmission on ConnectX-7+.
    Coming Soon
    @@ -777,7 +781,7 @@

    Connect Your Sensors to the NVIDIA Ecosystem

  • C++ API Usage
  • Python API Usage
  • Getting Started
  • -
  • Benchmarking
  • +
  • Benchmarking
  • diff --git a/docs/tutorials/configuration-walkthrough.md b/docs/tutorials/configuration-walkthrough.md index ef9afc0..f601894 100644 --- a/docs/tutorials/configuration-walkthrough.md +++ b/docs/tutorials/configuration-walkthrough.md @@ -19,7 +19,7 @@ If you don't have any NIC at all, the `*_sw_loopback*` variants of the Raw Ether (`DAQIRI_MGR` at the CMake layer is the inverse selector: it tells the build which manager implementations to compile in — `dpdk` enables `stream_type: "raw"`, `socket` enables `stream_type: "socket"` with `protocol: "udp"`/`"tcp"`, and `rdma` enables `protocol: "roce"`. The default build enables all three.) -For a shorter backend-selection guide, start with the [Benchmarking overview](benchmarking.md). With a stream type in mind, read down the questions below and stop at the first one that matches what you're trying to do. Each section names the YAML, the binary that consumes it, and any platform-specific notes. +For a shorter backend-selection guide, start with the [Benchmarking overview](../benchmarks/benchmarks.md). With a stream type in mind, read down the questions below and stop at the first one that matches what you're trying to do. Each section names the YAML, the binary that consumes it, and any platform-specific notes. ??? question "1. I want to measure baseline throughput" Pick the stream type that matches your stack (see the [overview](#choosing-the-appropriate-daqiri-stream-type-for-your-setup) above), then the hardware or protocol variant. @@ -28,19 +28,19 @@ For a shorter backend-selection guide, start with the [Benchmarking overview](be - **Generic discrete GPU** (template — replace ``) — [`daqiri_bench_raw_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_tx_rx.yaml). This is the file annotated line-by-line in the [walkthrough below](#annotated-walkthrough). - **Four queue closed-loop TX+RX** (template — replace ``) — [`daqiri_bench_raw_tx_rx_4q.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_tx_rx_4q.yaml). Uses one application worker per TX/RX queue, with each `bench_tx` entry sending a different UDP flow. - - **DGX Spark / GB10** (prefilled) — [`daqiri_bench_raw_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_tx_rx_spark.yaml). `kind: host_pinned` for the integrated GPU; cores, PCIe addresses, and IPs are prefilled. See the [Spark profile callout](benchmarking_examples.md#update-the-loopback-configuration) for run details. + - **DGX Spark / GB10** (prefilled) — [`daqiri_bench_raw_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_tx_rx_spark.yaml). `kind: host_pinned` for the integrated GPU; cores, PCIe addresses, and IPs are prefilled. See the [Spark profile callout](../benchmarks/raw_benchmarking.md#update-the-loopback-configuration) for run details. - **No physical NIC available** — [`daqiri_bench_raw_sw_loopback.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_raw_sw_loopback.yaml). `loopback: "sw"`, no NIC required. Useful for first-time build verification, not representative of production performance. To watch the same raw loopback benchmark with live Prometheus and Grafana counters, use the Grafana compose stack described in - [Watch live OpenTelemetry metrics in Grafana](benchmarking_examples.md#watch-live-opentelemetry-metrics-in-grafana). + [Watch live OpenTelemetry metrics in Grafana](../benchmarks/raw_benchmarking.md#watch-live-opentelemetry-metrics-in-grafana). **Socket — RoCE (RDMA)** (`stream_type: "socket"`, `protocol: "roce"`) — runs on `daqiri_bench_rdma` (use `--mode {tx,rx,both}`). Configs use `kind: host_pinned` regardless of platform. - **Generic** (template — replace IPs) — [`daqiri_bench_rdma_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx.yaml). - - **DGX Spark** (prefilled) — [`daqiri_bench_rdma_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx_spark.yaml). See [Socket and RDMA Benchmarking](socket_benchmarking.md#run-the-rdma-roce-benchmark) for namespace and wire-counter run details. + - **DGX Spark** (prefilled) — [`daqiri_bench_rdma_tx_rx_spark.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_rdma_tx_rx_spark.yaml). See [Socket and RDMA Benchmarking](../benchmarks/socket_benchmarking.md#run-the-rdma-roce-benchmark) for namespace and wire-counter run details. - **Socket — UDP / TCP** (`stream_type: "socket"`, `protocol: "udp"` or `"tcp"`) — runs on `daqiri_bench_socket`. The shipped smoke-test configs bind to `127.0.0.1`; see [Socket and RDMA Benchmarking](socket_benchmarking.md) for namespace-based wire tests. + **Socket — UDP / TCP** (`stream_type: "socket"`, `protocol: "udp"` or `"tcp"`) — runs on `daqiri_bench_socket`. The shipped smoke-test configs bind to `127.0.0.1`; see [Socket and RDMA Benchmarking](../benchmarks/socket_benchmarking.md) for namespace-based wire tests. - **UDP** — [`daqiri_bench_socket_udp_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_socket_udp_tx_rx.yaml). - **TCP** — [`daqiri_bench_socket_tcp_tx_rx.yaml`](https://github.com/nvidia/daqiri/blob/main/examples/daqiri_bench_socket_tcp_tx_rx.yaml). @@ -418,4 +418,4 @@ The reorder bench runs on `daqiri_bench_raw_reorder_seq`: Other reorder variants are listed under [question 2 of the decision tree above](#choosing-an-example-config): the CPU-kernel variant, the RX-only variants, and the `seq_batch_number` algorithm with in-kernel int4 → fp32 type conversion (runs on `daqiri_bench_raw_reorder_quantize`). --- -**Previous:** [Raw Ethernet Benchmarking](benchmarking_examples.md) +**Previous:** [Raw Ethernet Benchmarking](../benchmarks/raw_benchmarking.md) diff --git a/docs/tutorials/system_configuration.md b/docs/tutorials/system_configuration.md index 3f48ca9..ae37301 100644 --- a/docs/tutorials/system_configuration.md +++ b/docs/tutorials/system_configuration.md @@ -18,7 +18,7 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ## System Setup for DAQIRI - This section covers the essential system setup steps needed before using DAQIRI. Complete this setup before moving on to [System Optimization](#system-optimization) or [running benchmarks](benchmarking.md). + This section covers the essential system setup steps needed before using DAQIRI. Complete this setup before moving on to [System Optimization](#system-optimization) or [running benchmarks](../benchmarks/benchmarks.md). In this tutorial, we will be developing on an **NVIDIA IGX Orin platform** with [IGX SW 1.1](https://docs.nvidia.com/igx-orin/user-guide/latest/base-os.html) and an [NVIDIA RTX 6000 ADA GPU](https://www.nvidia.com/en-us/design-visualization/rtx-6000/), which is the configuration that is currently actively tested. The concepts should be applicable to other systems based on Ubuntu 22.04 as well. It should also work on other Linux distributions with a glibc version of 2.35 or higher by containerizing the dependencies and applications on top of an Ubuntu 22.04 image, but this is not actively tested at this time. @@ -1298,7 +1298,7 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ``` --- - **Next:** [Benchmarking](benchmarking.md) — choose and run your first DAQIRI benchmark + **Next:** [Benchmarking](../benchmarks/benchmarks.md) — choose and run your first DAQIRI benchmark === "DGX Spark" @@ -1362,7 +1362,7 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking - **Same physical port** (e.g. `mlx5_0` ↔ `mlx5_2`, both p0) → TX/RX loop **on-chip** through the eswitch; traffic never reaches the cable. Physical-link packet counters stay flat while the vport counters (`tx_good_packets` / `rx_good_packets`) run at line rate. This is a software-path test. - **Different physical ports** (e.g. `mlx5_0` p0 ↔ `mlx5_3` p1 `0002:01:00.1`, or `mlx5_0` ↔ `mlx5_1`) → TX/RX loop **over the wire**; physical-link packet counters rise to match the TX/RX counts. This is an over-the-wire test. - Confirm which case you got from the physical-link packet counters: near zero for on-chip, matching the TX/RX packet counts for over-the-wire. These counters count packets that reached the SerDes/QSFP side of the NIC rather than packets switched internally by the eswitch. The [daqiri bench](benchmarking_examples.md)'s DPDK "Extended Stats" output reports them as `tx_phy_packets` / `rx_phy_packets`; `ethtool -S` and `mlnx_perf` report the same wire counters as `tx_packets_phy` / `rx_packets_phy`. + Confirm which case you got from the physical-link packet counters: near zero for on-chip, matching the TX/RX packet counts for over-the-wire. These counters count packets that reached the SerDes/QSFP side of the NIC rather than packets switched internally by the eswitch. The [daqiri bench](../benchmarks/raw_benchmarking.md)'s DPDK "Extended Stats" output reports them as `tx_phy_packets` / `rx_phy_packets`; `ethtool -S` and `mlnx_perf` report the same wire counters as `tx_packets_phy` / `rx_packets_phy`. `ethtool -m` reports identical `Connector: 0x23 No separable connector` on all 4 PFs and is **not** useful for distinguishing them; use `phys_port_name` above (the cable-yank carrier test confirms a cable is present but does **not** distinguish ports). @@ -1585,6 +1585,6 @@ DAQIRI requires an [**NVIDIA SmartNIC**](https://www.nvidia.com/en-us/networking ``` --- - **Next:** [Benchmarking](benchmarking.md) — choose and run your first DAQIRI benchmark + **Next:** [Benchmarking](../benchmarks/benchmarks.md) — choose and run your first DAQIRI benchmark
    diff --git a/mkdocs.yml b/mkdocs.yml index 263cebe..5c5c4b4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,7 +49,10 @@ site_dir: site nav: - Getting Started: getting-started.md - Concepts: concepts.md - - Benchmarks: tutorials/benchmarking_examples.md + - Benchmarking: + - Overview: benchmarks/benchmarks.md + - Socket and RDMA Benchmarking: benchmarks/socket_benchmarking.md + - Raw Ethernet Benchmarking: benchmarks/raw_benchmarking.md - API Reference: - API Guide: api-reference/index.md - Configuration YAML Reference: api-reference/configuration.md @@ -58,10 +61,6 @@ nav: - Tutorials: - System Configuration: tutorials/system_configuration.md - Bare-Metal CMake Build: tutorials/bare-metal-cmake-build.md - - Benchmarking: - - Overview: tutorials/benchmarking.md - - Socket and RDMA: tutorials/socket_benchmarking.md - - Raw Ethernet: tutorials/benchmarking_examples.md - Configuration YAML Walkthrough: tutorials/configuration-walkthrough.md markdown_extensions: From 8a2f8a82e3689a940e0461bde412bf4a64328a90 Mon Sep 17 00:00:00 2001 From: Ramya Gurunathan Date: Wed, 3 Jun 2026 14:02:26 -0500 Subject: [PATCH 05/10] #15 - Repoint stale benchmarking_examples.md links after merge The bare-metal CMake build tutorial and Greptile doc-sync rule both reference the old docs/tutorials/benchmarking_examples.md path. Update to the renamed docs/benchmarks/raw_benchmarking.md and adjust link text to match the new "Raw Ethernet Benchmarking" page title. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Ramya Gurunathan --- .greptile/config.json | 2 +- docs/tutorials/bare-metal-cmake-build.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.greptile/config.json b/.greptile/config.json index 75d2798..5436c2f 100644 --- a/.greptile/config.json +++ b/.greptile/config.json @@ -62,7 +62,7 @@ }, { "id": "doc-sync", - "rule": "DAQIRI has no automated doc-sync gate beyond mkdocs/strict link checks. When a PR changes any of the files listed in .claude/rules/docs-sync.md, the matching docs must be updated in the same PR. Specifically: src/common.h | src/types.h | src/manager.h => docs/api-guide.md + docs/daqiri-api.html + AGENTS.md (Architecture); src/managers/* => docs/getting-started.md + docs/configuration.md + docs/tutorials/configuration-walkthrough.md + README.md (Backends) + AGENTS.md; src/CMakeLists.txt => docs/getting-started.md + AGENTS.md (Build & run) + README.md (Quick Start); src/kernels.cu => docs/tutorials/benchmarking_examples.md + AGENTS.md; examples/*.{cpp,yaml} => docs/tutorials/benchmarking_examples.md + docs/tutorials/configuration-walkthrough.md + AGENTS.md (benchmark table). If the PR touches code in these paths but does not update the matching docs, flag it as medium severity and list the specific docs to update.", + "rule": "DAQIRI has no automated doc-sync gate beyond mkdocs/strict link checks. When a PR changes any of the files listed in .claude/rules/docs-sync.md, the matching docs must be updated in the same PR. Specifically: src/common.h | src/types.h | src/manager.h => docs/api-guide.md + docs/daqiri-api.html + AGENTS.md (Architecture); src/managers/* => docs/getting-started.md + docs/configuration.md + docs/tutorials/configuration-walkthrough.md + README.md (Backends) + AGENTS.md; src/CMakeLists.txt => docs/getting-started.md + AGENTS.md (Build & run) + README.md (Quick Start); src/kernels.cu => docs/benchmarks/raw_benchmarking.md + AGENTS.md; examples/*.{cpp,yaml} => docs/benchmarks/raw_benchmarking.md + docs/tutorials/configuration-walkthrough.md + AGENTS.md (benchmark table). If the PR touches code in these paths but does not update the matching docs, flag it as medium severity and list the specific docs to update.", "scope": ["src/**", "examples/**", "mkdocs.yml", "README.md", "AGENTS.md", "docs/**"], "severity": "medium" }, diff --git a/docs/tutorials/bare-metal-cmake-build.md b/docs/tutorials/bare-metal-cmake-build.md index 3a2f243..8969cd2 100644 --- a/docs/tutorials/bare-metal-cmake-build.md +++ b/docs/tutorials/bare-metal-cmake-build.md @@ -12,7 +12,7 @@ It is the long-form companion to the five-line `cmake` snippet in [Getting Start - you are packaging DAQIRI into another product that already provides a runtime image; - you are debugging a build problem inside the container's `daqiri-build` stage and need to reproduce it on the host. - If none of those apply, follow [System Configuration](system_configuration.md) and then [Benchmarking Examples](benchmarking_examples.md) instead. + If none of those apply, follow [System Configuration](system_configuration.md) and then [Raw Ethernet Benchmarking](../benchmarks/raw_benchmarking.md) instead. ## Prerequisite verification @@ -305,7 +305,7 @@ ldd /opt/daqiri/lib/libdaqiri.so | head ### 5.3 Smoke test -Verify the build with the standard two-port TX/RX loopback. This requires a NIC with two ports connected to each other by a physical SFP cable, and that you replace the `` placeholders in the YAML (PCIe BDFs, CPU cores, destination MAC) for your system. The walkthrough for those edits lives in [Benchmarking Examples → Update the loopback configuration](benchmarking_examples.md#update-the-loopback-configuration); do that first, then run: +Verify the build with the standard two-port TX/RX loopback. This requires a NIC with two ports connected to each other by a physical SFP cable, and that you replace the `` placeholders in the YAML (PCIe BDFs, CPU cores, destination MAC) for your system. The walkthrough for those edits lives in [Raw Ethernet Benchmarking → Update the loopback configuration](../benchmarks/raw_benchmarking.md#update-the-loopback-configuration); do that first, then run: ```bash sudo ./build/examples/daqiri_bench_raw_gpudirect \ @@ -317,7 +317,7 @@ A successful run prints a stream of `[INFO]` lines followed by an RX/TX rate sum !!! tip "DGX Spark" - On DGX Spark, use the prefilled `daqiri_bench_raw_tx_rx_spark.yaml` instead; only `eth_dst_addr` needs an edit. See the [DGX Spark profile callout](benchmarking_examples.md#update-the-loopback-configuration) for the exact MAC-lookup command. + On DGX Spark, use the prefilled `daqiri_bench_raw_tx_rx_spark.yaml` instead; only `eth_dst_addr` needs an edit. See the [DGX Spark profile callout](../benchmarks/raw_benchmarking.md#update-the-loopback-configuration) for the exact MAC-lookup command. !!! note "No NIC available?" @@ -406,7 +406,7 @@ The build recipe above is the same on every supported host. The notes below cove - GB10 is **compute capability 12.1** (`sm_121`). DAQIRI's default arch list adds `121` automatically when configuring with **CUDA Toolkit 13.0 or newer**; on those toolkits no override is needed. On older toolkits, GB10 is not supported. - DGX Spark uses **NVLink-C2C unified memory** and has no separate GPU BAR1, so data buffers in YAML configs use `kind: host_pinned` rather than `kind: device`. The DGX-Spark-prefilled YAMLs in `examples/*_spark.yaml` already encode this. - `nvidia-peermem` is not used; GPUDirect goes through the dma-buf path enabled by the DPDK patches in [Step 3](#step-3-build-dpdk-with-daqiri-patches). - - For a runnable end-to-end test after the build completes, follow the [DGX Spark profile callout](benchmarking_examples.md#update-the-loopback-configuration) in Benchmarking Examples: the prefilled `daqiri_bench_raw_tx_rx_spark.yaml` and `daqiri_bench_rdma_tx_rx_spark.yaml` need only an `eth_dst_addr` edit. + - For a runnable end-to-end test after the build completes, follow the [DGX Spark profile callout](../benchmarks/raw_benchmarking.md#update-the-loopback-configuration) in Raw Ethernet Benchmarking: the prefilled `daqiri_bench_raw_tx_rx_spark.yaml` and `daqiri_bench_rdma_tx_rx_spark.yaml` need only an `eth_dst_addr` edit. === "IGX Orin + dGPU" @@ -444,5 +444,5 @@ The build recipe above is the same on every supported host. The notes below cove Once `libdaqiri.so` is installed and the [smoke test](#53-smoke-test) passes: 1. [**System Configuration**](system_configuration.md): tune the host (hugepages, NIC link layer, GPU BAR1, CPU isolation) for production performance. -2. [**Benchmarking Examples**](benchmarking_examples.md): run `daqiri_bench_raw_gpudirect` over a physical loopback. +2. [**Raw Ethernet Benchmarking**](../benchmarks/raw_benchmarking.md): run `daqiri_bench_raw_gpudirect` over a physical loopback. 3. [**Understanding the Configuration File**](configuration-walkthrough.md): pick the right starter YAML for your use case from the decision tree. From 1766e786ab847b642b26e838a12a9a8438082c1b Mon Sep 17 00:00:00 2001 From: Ramya Gurunathan Date: Wed, 3 Jun 2026 14:06:56 -0500 Subject: [PATCH 06/10] #15 - Drop Benchmarking Overview tile from landing page The landing-page tutorials grid was overcrowded after the docs reorg; the Benchmarking Overview tile largely duplicates the new top-level Benchmarking nav entry. Renumber subsequent tiles 06-09 down to 05-08. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Ramya Gurunathan --- docs/index.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/index.html b/docs/index.html index edbe892..84cc993 100644 --- a/docs/index.html +++ b/docs/index.html @@ -695,11 +695,10 @@

    Tutorials

    02
    Bare-Metal CMake Build
    End-to-end bare-metal build: verify prerequisites, install RDMA libraries, build patched DPDK 25.11 from source, configure DAQIRI_MGR / DAQIRI_BUILD_PYTHON / CMAKE_CUDA_ARCHITECTURES, install, smoke-test, troubleshoot.
    Intermediate~45 min
    03
    Container Build with Patched DPDK
    Build the Docker image with build-container.sh. The container ships a dmabuf-patched DPDK, so peermem is not required.
    Coming Soon
    04
    System Tuning for High-Performance Networking
    Isolate CPU cores, configure hugepages, set NUMA affinity, and run python/tune_system.py to diagnose common configuration issues.
    Intermediate~30 min
    - 05
    Benchmarking Overview
    Choose between Linux sockets, RoCE/RDMA, and raw Ethernet before editing benchmark YAML.
    Beginner~10 min
    - 06
    Socket and RDMA Benchmarking
    Run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation and PHY-counter checks.
    Intermediate~30 min
    - 07
    Raw Ethernet Benchmarking
    Run a DPDK raw Ethernet TX/RX loopback test and interpret NIC throughput counters.
    Intermediate~20 min
    - 08
    YAML Configuration Deep Dive
    Memory regions (huge, device, host_pinned), RX/TX queue setup, flow steering rules, flex items, and RDMA client/server config schemas.
    Intermediate~40 min
    -
    09
    GPUDirect: Header-Data Split Pipeline
    Configure a two-region memory layout, access CPU headers and GPU payloads per-packet with get_segment_packet_ptr(), and reorder scattered GPU buffers with the built-in CUDA kernel.
    Coming Soon
    + 05
    Socket and RDMA Benchmarking
    Run TCP/UDP sockets and RoCE/RDMA with matching namespace isolation and PHY-counter checks.
    Intermediate~30 min
    + 06
    Raw Ethernet Benchmarking
    Run a DPDK raw Ethernet TX/RX loopback test and interpret NIC throughput counters.
    Intermediate~20 min
    + 07
    YAML Configuration Deep Dive
    Memory regions (huge, device, host_pinned), RX/TX queue setup, flow steering rules, flex items, and RDMA client/server config schemas.
    Intermediate~40 min
    +
    08
    GPUDirect: Header-Data Split Pipeline
    Configure a two-region memory layout, access CPU headers and GPU payloads per-packet with get_segment_packet_ptr(), and reorder scattered GPU buffers with the built-in CUDA kernel.
    Coming Soon
    10
    Timed TX with ConnectX-7
    Enable accurate_send in the TX config and use set_packet_tx_time() for PTP-synchronized, hardware-scheduled packet transmission on ConnectX-7+.
    Coming Soon
    From eecd4b7e92ba351eb1a867d30278a28872c9b87b Mon Sep 17 00:00:00 2001 From: Ramya Gurunathan Date: Wed, 3 Jun 2026 14:16:00 -0500 Subject: [PATCH 07/10] #15 - Surface Bare-Metal CMake Build in top-nav Tutorials dropdowns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the bare-metal tutorial (introduced by #95, brought into this branch by merging origin/main) to the two hand-mirrored nav lists that are not generated from mkdocs.yml: - docs/index.html — landing-page Tutorials hover dropdown - docs/javascripts/tab-dropdowns.js — top-tab dropdown rendered on every docs page Without this the entry only appears in the mkdocs Material sidebar. Co-Authored-By: Claude Opus 4.7 (1M context) Signed-off-by: Ramya Gurunathan --- docs/index.html | 1 + docs/javascripts/tab-dropdowns.js | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/index.html b/docs/index.html index 84cc993..953053e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -303,6 +303,7 @@ Tutorials diff --git a/docs/javascripts/tab-dropdowns.js b/docs/javascripts/tab-dropdowns.js index d3dad08..aa5de0a 100644 --- a/docs/javascripts/tab-dropdowns.js +++ b/docs/javascripts/tab-dropdowns.js @@ -18,6 +18,7 @@ ], "Tutorials": [ { label: "System Configuration", path: "tutorials/system_configuration/" }, + { label: "Bare-Metal CMake Build", path: "tutorials/bare-metal-cmake-build/" }, { label: "Configuration YAML Walkthrough", path: "tutorials/configuration-walkthrough/" } ] }; From 4ed1f5acc3a5c1e9144501a3f6a71d936e9ed2e7 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Wed, 3 Jun 2026 12:37:26 -0700 Subject: [PATCH 08/10] #15 - Refine landing graphic data path animation Signed-off-by: Cliff Burdick --- docs/images/daqiri-landing-graphic.svg | 80 +++++++++++++++++++------- docs/index.html | 13 +++-- 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/docs/images/daqiri-landing-graphic.svg b/docs/images/daqiri-landing-graphic.svg index e0dd666..2f3bc86 100644 --- a/docs/images/daqiri-landing-graphic.svg +++ b/docs/images/daqiri-landing-graphic.svg @@ -1,6 +1,6 @@ - - DAQIRI sensor data paths to CPU or NVIDIA GPU memory - A diagram showing sensor data entering or leaving CPU memory or NVIDIA GPU memory through DAQIRI from a PCIe FPGA path or a network-capable sensor path through a NIC. + + DAQIRI sensor data paths to CPU, NVIDIA GPU memory, and storage + A diagram showing sensor data entering or leaving CPU memory or NVIDIA GPU memory through DAQIRI from a PCIe FPGA path or a network-capable sensor path through a NIC, then GPU-resident data writing out through GPUDirect Storage. @@ -23,6 +23,10 @@ + + + + @@ -47,38 +51,44 @@ + + + - - - + + + - - + + - Sensor streams meet CPU or GPU memory - PCIe devices and network-capable sensors share one DAQIRI application path + Sensor streams meet CPU or GPU memory + DAQIRI carries PCIe and network-capable streams into memory, then GPU data out to storage @@ -146,13 +156,15 @@ DAQIRI C++/Python Library - + RX/TX bursts - - flow steering - - zero-copy API + + flow steering + + zero-copy API + + GDS writes @@ -171,6 +183,18 @@ + + + + + + + + + GPUDirect + Storage + + @@ -201,6 +225,8 @@ + + @@ -209,14 +235,24 @@ - - - + + + + + + + + + + + + + - - one application, bidirectional data paths - PCIe or network sensors into CPU/GPU memory + + one application, sensor I/O plus GPU storage writes + PCIe or network sensors into CPU/GPU memory, then GPU data out to storage diff --git a/docs/index.html b/docs/index.html index 953053e..20edd91 100644 --- a/docs/index.html +++ b/docs/index.html @@ -78,10 +78,10 @@ /* HERO */ #hero { min-height:calc(100vh - 24px); display:flex; align-items:center; padding:calc(var(--nav-h) + 3rem) 0 4rem; position:relative; overflow:hidden; } - .hero-inner { display:grid; grid-template-columns:minmax(0,1fr) minmax(460px,650px); column-gap:2rem; row-gap:2rem; align-items:center; } + .hero-inner { display:grid; grid-template-columns:minmax(0,1fr) minmax(460px,700px); column-gap:2rem; row-gap:2rem; align-items:center; } .hero-visual { position:relative; z-index:1; grid-column:2; grid-row:1 / span 3; display:flex; align-items:center; justify-content:center; } .hero-visual::before { content:''; position:absolute; inset:-5% -8% -2%; background:radial-gradient(ellipse,rgba(118,185,0,.28) 0%,transparent 68%); filter:blur(20px); z-index:-1; } - .hero-visual-link { display:block; width:min(100%,650px); padding:.45rem; border-radius:20px; appearance:none; background:linear-gradient(135deg,rgba(118,185,0,.34),rgba(93,216,242,.18)); border:1px solid rgba(160,208,0,.38); box-shadow:0 24px 70px rgba(0,0,0,.58),0 0 0 1px rgba(255,255,255,.05) inset; transition:transform var(--ease),border-color var(--ease),box-shadow var(--ease); cursor:zoom-in; } + .hero-visual-link { display:block; width:min(100%,700px); padding:.45rem; border-radius:20px; appearance:none; background:linear-gradient(135deg,rgba(118,185,0,.34),rgba(93,216,242,.18)); border:1px solid rgba(160,208,0,.38); box-shadow:0 24px 70px rgba(0,0,0,.58),0 0 0 1px rgba(255,255,255,.05) inset; transition:transform var(--ease),border-color var(--ease),box-shadow var(--ease); cursor:zoom-in; } .hero-visual-link:hover { transform:translateY(-2px); border-color:rgba(160,208,0,.68); box-shadow:0 30px 90px rgba(0,0,0,.65),0 0 34px rgba(118,185,0,.16); } .hero-visual-link:focus-visible { outline:2px solid var(--nv-green); outline-offset:4px; } .hero-visual img { width:100%; display:block; border-radius:16px; filter:contrast(1.08) brightness(1.08) saturate(1.12) drop-shadow(0 0 44px rgba(118,185,0,0.18)); } @@ -91,7 +91,7 @@ .hero-eyebrow { display:inline-flex; align-items:center; gap:.5rem; font-size:.72rem; font-weight:700; letter-spacing:.15em; text-transform:uppercase; color:var(--nv-green); background:rgba(118,185,0,.08); border:1px solid rgba(118,185,0,.2); border-radius:99px; padding:.35rem 1rem; margin-bottom:2rem; } .hero-eyebrow::before { content:''; width:6px; height:6px; border-radius:50%; background:var(--nv-green); animation:pulse 2s ease-in-out infinite; } @keyframes pulse { 0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)} } - .hero-title { font-size:clamp(1.9rem,3.3vw,2.65rem); margin-bottom:1.5rem; } + .hero-title { font-size:clamp(1.85rem,2.8vw,2.35rem); margin-bottom:1.5rem; } .hero-title .hi { color:var(--nv-green); } .hero-desc { font-size:1.15rem; color:var(--text-mut); max-width:620px; margin-bottom:0; line-height:1.75; } .hero-actions { position:relative; z-index:1; grid-column:1; display:flex; align-items:center; gap:1rem; flex-wrap:wrap; } @@ -345,11 +345,12 @@

    DAQIRI for Sensor Data
    in CPU or NVID DAQIRI (Data Acquisition for Integrated Real-time Instruments) moves high-bandwidth data between external sensors and CPU or NVIDIA GPU memory. Streams can arrive from PCIe devices such as FPGAs or from network-capable sensors over Raw Ethernet (UDP/TCP) or RoCE/RDMA, giving applications one zero-copy path for ingest and egress. + GPU-resident data can also write out through GPUDirect Storage.

    @@ -818,14 +819,14 @@

    Connect Your Sensors to the NVIDIA Ecosystem

    From 1db6a4eb544a2c2bd1fb264f87029734d9fa97c2 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Wed, 3 Jun 2026 13:00:43 -0700 Subject: [PATCH 09/10] #15 - Refine landing page graphics Signed-off-by: Cliff Burdick --- docs/images/architecture.svg | 2 +- docs/images/daqiri-landing-graphic.svg | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/images/architecture.svg b/docs/images/architecture.svg index b336eec..c0a9272 100644 --- a/docs/images/architecture.svg +++ b/docs/images/architecture.svg @@ -42,7 +42,7 @@ INGEST - NIC + NIC/PCIe GPUDirect RDMA diff --git a/docs/images/daqiri-landing-graphic.svg b/docs/images/daqiri-landing-graphic.svg index 2f3bc86..26967e7 100644 --- a/docs/images/daqiri-landing-graphic.svg +++ b/docs/images/daqiri-landing-graphic.svg @@ -210,8 +210,6 @@ PCIe - - zero-copy @@ -236,16 +234,16 @@ - + - + - + - + From 9fe967ac2c4680fb086a17a9be145c9243fbfca2 Mon Sep 17 00:00:00 2001 From: Cliff Burdick Date: Wed, 3 Jun 2026 14:01:52 -0700 Subject: [PATCH 10/10] #15 - Remove generated PCIe schematic artifact Signed-off-by: Cliff Burdick --- pcie_schematic.png | Bin 156204 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pcie_schematic.png diff --git a/pcie_schematic.png b/pcie_schematic.png deleted file mode 100644 index ce1e5b6d4d762545306db68ffb23d1e1f0943dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156204 zcmeFZbyU>v`#y+o3sFK!0Rd4$T1jaoq`O>qn}j(-fw%no^L>H)u@qD0lOWv8C&3QeyY>?0H@ER@ zw|95(?h)&T`+IEfk`ljuO&~5!w|Z&fxw=Q#7WASW+0s-B8JuQLrEI%Mx%_D$OCR5N z6FlNSuWm1{G0ML`U@758-T3>1sS53#zwf)Vr3nANkC2X}{rmoL^b_g7?_beNME!mL zUM`px4F2~kfmr(A8U5$Q!TA3_;P*=WyF{;Ze{HPjcQ;fVm7&syH}ND>IN$}{YPawH z{*}ih75T1iAu8%7CQF3Go9m|iR>@gvJ&Pqty!Nx{E>XCKF!x5(_hE|KT@RQy>P*&h zym-2k@5@2rN`Y33+?)=)H-;^t4pS+K(jsO&m2EB6%k#$szEZbNTyUR7jp`XxqW}OZ>I+-m3BeWV%IidUwA5vg&iz)vJ4C z26}q4-xr9o?|pE<%bHT{(m)p#mxc{cK+<4?$%q;o!*}n38chD2k@rWexO8`Dr>Aw` zOqySxdvvEq66FxqUYBHei63b||8R*zHIgP@r2su%En8JxogF^jQBoYD3*8!X=}NtB z{rM4WeC{ILu<0PG=0X4pQG?Y~={J2f+c%E$rfg)>tI-e>Q?=XAxlJm8)8g(ZKd1b6 z2O3B8qF$-A=vj5RsEuhts1e2ztW<&?9!JPZ6(dsl{+pco#AN^YH<{;V1s-df1%Vxy zyTD81^WE=|En_znJw84T*4E~M=#`l?#%WhtV+ya|7xlV>3!U>ET0*bHrNTDAbugj4H8C9n2cl z#-NbOhdDYcQlv@4#XY|J;3uNk;SxlTIVYE#o(Mg?`BDv-^`pa+eK>rWQ8Rb!+Xsc3 zoMIw1)qQ*StC33OBDN8iPYvAhKT|3!JIo-@mpD1CJQ?GERD~F zrwNCLL_eskc(*-YATfGtKhX1Xb!X}@o?Wly0J=PlcbCf5|N@%Yqbq?#K8Ag zhJ~v`zS&*=eftz~=%O&=3wT@K{Cvwkr0|$|_3~%^pNtr>pFK?bA*go#J%K2F^c@;J zYLT301qRib?gpc3u9#oLqb*{c=V!i3F4(@pd38p>-o5MIX~g&TMktc=3ckJ! z3hEwczBO0pt$2RAqkB~ETdLRMGCBwS6bgMIQ9U-tYP7Jh({SQ`f{s1fkDW+LIE)wa z+-Fiuoh=%-Q&($5{o4Pf%m(Jx=xkf`tax;c?KK31$;Xc(b9GSHnbOM(m*UHWB*TNO zwSQ|Vc)be9j&vk})6%7(VQ8D85frPj@AacWNd&;%$=;y@bq~%iK z&2Wf^E#lkH$w?{f{p~a6ylYv+_!YhZh`{#-mv5v75l#=y5G_6%A)XKLccy5Y2?$6@ zh2NdJb!(~3piis`F?l&tUlhbw=SyrS(g?-6h8XL>W{Zw>G-NbG-@C;Amm+U2Y zXf{}5vUKnO#b%HAW{db>GGcQB$Gu-}3x1XQu!8;1k)4l$^+wTrS_8%)-!Q@W;4nF2D_=0qtQNsG_n zNqd2l2*Q2y$?P|1?Gv)+`H-?rbtX$28+g8s!>hF2&z`%(In7n~DJW_!Feqs1^?yX> zo4gID?UnKZGBQ3yO%}6+aM`G_`+P+)LUh{I_BKj;3|5UG zXP5-wKj-Yv%8IV8i93Ce@hUM!JyP z)mCk`Rd@OR!$cl?C0%8EImoFwtkp zbHHO|EdjY*>|8)gn>6wy^J(E@{bMF!zk1gpPTVH%Wi4=RU zrd8x&)^XkD3^VvT#yW3MKZd8m(wZk_xplIJ7%rWHIpu2%CDx zRTlLMx2@ICMUnb}6z05eq^Fg@n ziIljwxY2r;60Br8*|=mrCok;NXMU$Ato)DnOs>4#muk7W&tQDJhwVuRSIudd{~Udi zHF^5zgw>vsd|PwtC(%8GdG8vgYLf(=G6-4+F>Pldnp@+AE=TQFR`KQK$|dCL;xZNH z@Kg??~o&!RQ4g5S1{^`m0zdFU`56Ce+iX$ zC+k!pPj1GlJ=5%59cT_5IRTZx*XH^C`}bkrcoXE#=KUIph@biTFG>nvxKr|n>@LRp zS6Q_wsiYY}$rwi;R6zu#76jPhEnvE_Zmk`mo z3-=?-nhd%Of1U+`QFmeT7wctMdKx8UWtlf#FU2yro8=7{6n7K6Jg!1+4XJxP%?NEC z1rUjF;`Z;*ey=7gCjF7P+H(4BTb%yLNe(mb{KeTCH|OQB0v9*;Pq{-WSl0x6*xl{0 zcvG=RRY=L!R_}XPxH+bUfPjdIi1^6+jhmevYezO0PViJ5?X_zkg6%dUd~-o4TiVBU z&8(#mh_c1szU9Nk*?%acgLzL&?XtDCRc!-zPTCTtX|KN<&->tKS$=M>o|tq6n|-zI zRn-N4TGR2_)slCCth_ufrz(+^4yLZIZem_Im<;XPN!_SRytue%kGO2H{RB|uodGf8 zg1d}g(ojhQB!8xL^bEH|I^u~g1&B&mnJEPk#g?FvxpStpCYau!ZiSA!2=3;11kaPK zOog<|n>P5gc|Iwd!FC-V+eCv@sW9#Boia1H@FD6xorQ1`uLu#m>7G9h z@Z+QzgzuiXJHus41BKZjyc;LOhV;qT$Em6Z(<=S__cTe}tTq-mF3@BLofm6ZHU zQ2M4S$z*2wG$9RcD{q{gj{wp!?>A&4v9_@ZeK^a|QB1B8 z*UrvA8~O#9C#+sLOgG()FTHuwH#jWp#Cwg`?qqQSGA{!qA1eZoG5sZ}iOEwdPgF}A zNKgA1g45%zS^%guA(Jh}JEZEjV7JPEhx#QW^r66DW zS-XjjIV?@ENGA0cZwm9Dl)jW4aWdx1Mb&*@%IA^o{R#NEZTer?b z*5qo++2ZPqz*PMu#mB5hXnc%##M($g%$a<6Qa1-wDUB9HZ<@*?t!?d63D zoy)G^%?a#GHe+ULEhEROu7nz@V2+n@i&=8?Hlvy42l>lrjg1eI*6iR- z$|7B*C(XC$wPDJa(|64qY!S^E(1Yy-Ns&mN$^RE(pFfdx?9oQMry9&3C;DP;x`Iw> zqU>wlyqg+o(B~hKXOgkpMH7b@Ou6Xvb-C)v-AEkC7BIMM6;`%Y!hOPWR z*{>UC@fd3;#!3?EJ|aCuti%9l9}R$Fl(hc*-uswr*hWD5n?4Q50fu0x*rE9e0Ivg9 z+iTR{Y!Dg!Gbky~5R&R|HZy`gmtVhr1&ETG&qwFn649c*coy{MTd+1oqp(CCbFut{ zB42~OBtllOnl-yj>2);piUyHVdI)==<@U?Lu0FkmI=lY*FKwkJ4nFpF5-V>}f;BAV zXz$2liJBmvX0$uDuPz3s--GE2iFb_8lK0coTE+g znN+9>J&;B%uSJ%pWZAo3n#*9T zHM-f2y42GC+awfD%?|X;8?BGPbwRvc{k+ydebwj`7$=Fc?>4uLXrQ`!NB*ZK!o*3B z@nDV%V_xq4_Vez~E%p-~Yv@!j-{CMtDV$a(xjtY+ytPsF+KHP(UJ8F9o3DL!)kOV| z@UF-a%FxXA9_Nty%WqEd)7$9UTPL#Fm)Mx58-~;!yd6VB=`fSEjv^k`B!Ql-(7_F- z`1rvj+MNcMCHo@t<7k^yy`tE=d89ufS1;D1`@Tp309>e_bwK^HA^de3&V!#APN8>$ zzxOU%(prHKn+8A+Ce3GA(dsjUB9D_Ye)J3A^VqrGy@yj%@l3D|;tDVUjrd|~fm2*Z zM@Mx9@~PistzAx-f<{3t!=RzvWW!o$EfQ>UpHKdqu$b?-`i$=vx~Pl&80#7;{XWcx>=K_AchCGR=PDe>(`=4xfsr$noUhwZoF z;fKE?=kS^6q!SGS@pm$JTMC~@wFyT$Y#zi17`a&209U^14w4h&=XI5t6%EhzgMYh* z_ht&0X!hYrm>9}dyR;-HcGfQ9u^LVL7++s+e7V(po&CqB@?Nad&KnF+pN-8Dd4bu? zER*Rf%Q~~QtG31ox(V?G$r<{V1){WM<_V_$u>k}i)DI42@U60aNj~$YB z1Hrx$$mloeyN)M&dj9uDaNWzYzhX; zRaaqd#~$751t6Ch3i~=v%s(acs*GxixznIB3%_%PH<5o3A0^`bJJ^&s>(8AXAD*w4 zKx}Qd;S{bjP)Y)FQYtiKdudmCk}H+CxVXK;oQN@6u3j(IG((RKGFe}D?oy>c*~a^Z7%vLkCb`CU2M(A`~9QWA{5!4shj;Mt1f+0#A`wQlKxmqOo({fi+m)J zAM8Nn3sVsc{0x)q(GMYp34&)mC^I3u*4aM}a$KrC-R z+X6F%o7442+roQ{EWyl2U{fI)48oJ`7Ti6fIp@4m9L_(v1}7j(@$DFMx-*6suQf-6 zqECgD9T$G@c)E+VPxRYg-94g!M&NM~7rE{Yc%WU-^~d?_PIr{TKeRDCeVUcpyeFrZ zUsM!b2hxcF3FFr?g{A_&m?}F&!{?efjgEsFfjK-`5wcRH(xX*M`{0_CY3>O)oKbhW zp)R)LFy4TqZ{|v%w~u$eMXXB>3UdGfN%3);zO#jtY zxbLgCQHaRpFt(maLd2anQ#+Vqi?{S}i{=yL)O_$>|<4|Ih}q$7jWOOyGB7*y|qYgQVEywDxv=x)#M4y_dhY zH9zHig7*2KjmN=H5djzKVyyuUHpNVZDE~!7{Y%0zd8I@>T^hfdxHtk)F)^{}h?=Fv zD9gtfjKQ*_a-nJYRCEfFTFB?m?pqi0uMByY595~$SyP4fH$w$L3Y)5MLiGBpR##&@ zwc^;ztUfjeKlUde=g1)yv!REVmGMgbDe$| zt;YwM^L}^Qu5ATbqNr~K)q%Kmdq=-Gvtd=!%*btIbiSx=ViBi*R1Jg@<;+}zqLxOMfDZ&L}m55RY% zTrYSW>(M{5^1MBvDkFjpMW>$sl4UyOv(>sNLWVoU#1`E98wZE@YFD^23XX{48=vSA z>a7>F^+nhJv-a<+UWv_J3j%@DPY&;~uyF=+De-r8-;&o2W&RF|0X-@{~@ zK_IHAIEWN`g)S`)d2sBp)}T^QojEqC`Q0(VQy_02p19XquH+64VLIh^rPRwF z55wU-nFa2cg;6kYPkbuH7tcuqFef`n0l5LGr2}~p5uhDr>IL~v#EBw1-!FD0D~}zl zBo!H1wGAQ?F~M`?Kqt&c7pyJlesXZtmKPbRTxuT}y-l-^o7Mg?3R3DidiK89~K@HPxXh0lGw5v0r`ZN$U&%>DL<=qFe9#AV@$HndQ>Y`Bc z5znQX<`2}LN?7iOlW)`dbsNP9Ib;xI+J(G%+BJADJV=d2FS&o{dx!h4^Abh4=K!$LZ(eMHRIo|HCI@0s>N7va(xwa>F(UIx8X&epC2bFj2B9PEJoWLE!;-5Yh8*Z&htS|Japn>9j57rME$kfwW^@ z>v-;I>-WdHNra-p4<=44y~^duC2L8wD(+|sF(&EVCOWH; zpB-=}3_RZemt=`+Akte2X@6JK_RHtbcGKT#T2f1caeb@o&`UB0%l9@WoHi0!dsy|7 zm;c>3BH!6|L|IJui(%BW{c5F^txCv+3?1S=*uy6Y0yJ<#YX80o2+Vy;px9TD#xEn| zwaD#@4rbn1X4MKue-4pp>kYjJ`$$3CTjw5TvhmxtfZeZ5JasO(I+lA}57BV+B_xtU zyS`*%V%mq3J$F<=DcBK~Iph95VIp$$nj9pu^y9Mw8|(A9n_>U>P6KTFB6@Wog`b~f zG(%kc4FKu2Yg@Idow%3Lc9A@|5BaQiV}?J+vz@x5p})JX@9Z%e^R!qa|JbpXbW}22 zSr!3+Vc6oM%V0BZtRZm=wQDwEgH;%D zC6n)9!0~_P;&^ZPWda*3U!j?uDB}M$hX_Z-X7xbkxJdb-TMpo`zBbK)oYF(cfGF6 z`{}cGXun){Uo7Om0DxN&qd_-T=HUgsh_#Ad7@qhQ|z|N7dX z9sw1py?$@Qn-ualZ>Dw{XYSI}K&E$(du6c~E>}y`O1?s0kR+j-)KD<5;o!Qumn4!? zEmn;e2Cg*imJilQ?R3^RHdZ)#)Jx2(b8O<*H#e`AX|Swt|Ay78euYPT!&xSSV0j8- zO06ea?Pogeg01WT_Ok&C>(Ji`Hlf^RxLl>6H`IoEs>wbivm~=MtY1KYtG38ewLqeo z6s()F!+Ic!`UJ_Hu8`9}V#ibs88_OW?Vv`BVAHgUww3C)(EEL3v8I7nRaFp(f_35a zP1``&d_Vd;nsZUPpHAeqS?0aW*k{>}z z3Mf0zTWLA@E#ot6^~__k%qLw2vvrl+qf_RE34j zM7f<&NULZNTvjvZWy7Fu+7Nq&Xb`Fe`RUWgySl`?Q;l5@lC(YcF+yE1 z{OY?87-{|7&d{-Am4s&pYn&XtY<^mTt`1q`p+(ag6u+MD&F^@MVhdd&qmfTR9Ts*y4S!(3kPY!MJz(o=Bhk9fykLSn+UfbyAv$x6eBS%?kHj z5;n`^(U&iuorbP$t*={}KN1b-O8RRwnx34TwzRayrrDiuxZu3>^TIhhLb4+eO(&$H zS~}V?Ld+I+Ce3c}%tPJ*{W@qypejC%xR&Ktgn&q!Z9r_1I-#gr%TbKAN6QhRXt!yF zN9ZQqlsZ!)dZ-*Nhv7)D-Ru6Lves*3ZE1P5IjV|%pYY&pGGnPQ5I0-(f41yJkICXt z*K2GC^xo&CKt=I4Z_dw8sRW#xEbmQPviT5C+2G9@BylMw@k?JF3maqM!a!R zdid*0Pux1UUE{Z}(o4fY>}dNDbn=DXC1!f;_mIy%J2iDaT2hfc6-G>WFa=F2BFK~- z93YiojoNxnBJZ=V<&%pcuP%zeEGlNY=IpdSo-0N{)84dk2u?LA85!9lVy~TpW24Ie ziCiw-`w_d(=LmjRzjTF9l6VzW74MwpcuhvWFfQeOO-PDmv=Fd8dVXE(I$YpIpN-CB z=DR_KW-r9~YF}Cz>iazR)_9D|Tr;#5Oe;8%h9=F9wGW$yULk2H!|8UH51yy~oVk1o z@=<}g<)ff+IlYkPctpk3XoNj_118PQ&F#Cc^}b3m_xzsOpDM1V z>^+4?)6Uj);`_E(c<#ag<~a9rb{lz@;p+Q4nED%j(qDm-kXZ)5IWj9zP;RFw-uHmbPk+C>lr37 z@p+}v!9Ye{%Kg%a*_=Os_Nm<884SmJ#rj{svbnsvIbP`+ZcJC~n6OOF=d)b0RXgw2 ztgMn6OrJDvYi&^Le^4WnKdBd+s``TeJ%TBu;SZ*fQlt`e&)Fr2@W?4)g;R=(g5AC@ zd?SWMU*%k@J@Z>w=|G4D`sUUw|KgxRkG*Ae zaKP`N9TOctcnDs)Dw$FoHpOw-qU^Y zCs5zZjQlz@L+6i-$64*@6L??0{_pY4&!pwz8vFkJas9ywQclP51K=oz(B$&l;tvqPy^^WT~444J9SsXp_{+lnO%SRUYj!WT}_0r9Gnjj(qjU zq5JrzDK^K~syK%Aq58JCV_lGj_FwERwQAqR6lxhHW{K1vsBwLU9ej(jkIphaTy~Ks zUiwG>cMeus1<{!L5#e8*1rE(xdebdlZp`GxQzxg-I_zuUdgGU2^>YBf?*Vn#;O z?w_<4>iDo=63rlaJDrrHUaxfb;qMR~;hLxIcJo1Tm$cXh5*WvuTp)OFy#Lbfvjp_^ z92$KLdPt7<&l9m;(RVnD{r()8xSZT}T*`$)GCwuJLsN5Wm0FEhs+5_H&CUFIvD*2k z1|BVuHMdb)!yTou!ML?Z{%?+#C)KhR({W7uSw`2f#)AIz1g~zr@Sb<1HiQ)r1%T$C zfcR)*+n*Vu*D{>%(@(u=I@92<5$Erl-(v$wn?X^LcE_Uvb*_QdB$wiMyU~s9<#j1I zV3@!OtqQG<1sP7*sS*r@k>dtFwTRQYNP`QJ=Y@e-*?iqozkI#gol?~W!ghXPVZrV~{+O^$Z?GG< zCnO~SPCvnIB7W#weaM6YIcN5}1vI-5;)_GVQjK>G!4od7pLR37jrgfQ^_y}vj%8F< zuC?g{4rw~~G@nKR_>PuPs^8wb`{tDr<+5&%7L68EKHx1&VDOt<-885*CvmD2gkcD- z0p$PR2NQ7YU)G|-Q=7mn>{c4=fQ^XFuMV@f!OV`_^_CpBv|JnVb^g`$%M}UWnum*3 zSy7Q{wMu=&pdk=^{0U|z*!i7I0~@zCy;gIh&Do>{#iMUkZvwLUK>CZB6Z?>3UUbm386ocW9_m0LX5`{*3{cmLkJHPdcKr5OI| zdQ0OMS`FvMNBy|;kZN3Zbg$>&nGl>M!LZ;w_>WaanuN=g+`+*ixD;>$+r#xcz;o`TzdWh!qJF9MOLJl4WboIv z*}cDE8F7Dk&_W~6JQk4MxYX-!m9yU-)mn;RuxNmzQ)Y%Zt@06ab;6Fv%RfmKO+`Q^2!W_8yf)xJh98sr}Vr>C1U;Fu7D7R9^z=a zYQCjc?`C#TEN!>blJ+xx(69zF{#sKLHQiRU8Oq8B2%-|L3YA4iT=~$(K_vRjO~tP3 zYDWa|If~hBVceaLVRJlmhC&n4f*;RI-DvXkvni_mlon9gBE2m~_PgnL!66&Jy{05K1 z!Zf};L&uYJm!?1W0U}=4eWBFLNZx7R2qCXp2dbbGAX|OA*hI0jwx>u3$bGk$>pM$4 zHA-h{6h;T6c~CwV3W?eI-V@h+u0D*?-&0gt0B6H>SBPAAs9Y)o9X7Y4XU-BF8hW`S z8Ox_dQajx^D!=bgR+Oafz|7qloms41IqwTqJlBLdT=Gy(OU-OBi|yT|bG;dxmVeAV z0d?K>IUgyg)}5Gbaqv7D<5M||{PZRu(0@my1^KJz`Zel*^g89Ddb{MwTru$Gm902B zyti$Mp$y?EAk^o|DDI$5m}ef~rAXMGTegOsi$qI!p?kf;c!F8%82Y8=w%@$^smz1=Q8 zCM+G$>x9&SgDSwo5=YNyJymrzox=&>0Es8cR)4_eMuA3_OK5~*8r7UHtzS@3&`XD9 zanFmB;AY^|a>^UD(W`W*u7KY@rrJggC`xO7^1!dDW>L+xoT9HzD%GtwcwrHvf44C< zM3W!7qYtmq>AO`@YH*IE^#7IqtGulXUaFM`dM=_Aec?baynEQiss*LSKi>B&<-T-r z2o4FAHEzPh>*X&PE&Tg1l}4*$NA6t3WI!h}#=`bJqF-h&i^@N;Sj37dBHE*Qo4%9| zTES^9>q?s$Hc#cQH`Cnd?%kKn_#52)Q)YA$1?(%E{sgRl3{8J_ zid$dbP;GOL_yF@htg$V3>_uwjQ~tLn><9LW9sX)WrBgV;;`)cIl`AF-bMwMU0i&_@ zTFAV;^PJn}Vo$3C4*r&i;1xOHonkE*`l`s&HFeIQ$$I!cu&9TjOD3Vq-y@9%#Dq#y z?1pnYP9uqk75!3f3k3QHG*HepZlxE&(lCC?M2<8X@2&3j(*jUPA<}H5daOHM~Vk=1#!i3M*bI|TUkN3Eqe?aUF#Y6H(0l_qe(a2h#Kj7Lh287h8hTZMlPny?8a5*3B6HtKB@Dmah@9SZbW%59h)Ow z)Xv>@)dyetv!}8LI#~?mgrR&;_K0ZVhMj56932u)r%K|dAISfwK`qnos-emo^u{~e z26rjCN?n2v@UN%^72M?#gr)@3>RUcs?Y(I8nm-5KirPHjvEMjsEuPHn45kT{J=-3s z3<)g>4J%dXVsrWN`o~E4sJFKlWUfxgr}uQ0zFxjxu1kU333T7#*Ql8_i^lrPXNFqD zEEE$sE%vwd>YZ}juzUPBQS%t|)Zyr=0<*Dp`|~8D3xyr)@sa}CY}&r)5KbSg9=Q9~ zjuY~v*&(`X_4z;~yKf6X?fFz*q$MmmIy&dK&b2GeS@m;|g39mYEvQKC;uIQB)achj zX5;vIdrXW$BWAqc8~%a%`t^S_S+yCXds^FCW4Pi^$RCn3$=t)mZHuz5aOzV4Ct^e- zd~_|ll@=K{AjGdbqqViMQEfT;`ja03U2BwwxC*s)9%n+9CR(5bR-nSje< z@9)giwq4*?Z%v*AD%`vh{A(q7WzJ=}JcgL`d>uk*n;lLM zat;8!;YV;>#1mwAcG-xM2qBTLNK<7{fao<3UsTs}YADwRo^a9#>iK?GqP|0 zACa;{KbuhFm(=y*)BJ7w7gxfWE*f@}l$84Vb4cpyN}o#<2VH^5L|BT>RJaS7_gO1l zKZ~|CyeMb;SLCg~xg2Z6FHC>iV@lx5Ljl1nHBR$Ycc1|d%)PWQjS=dg`Y3!Wl#IuG zA=p2*P-AR#bf&)J7?~xl7@qakI*x&dXB^oK(>740@e8jFCukk}$;HNIpIIr}-@uJT zH2V(iyxqbpQGFy-uXH(o(bds;)^yCO^xQW%1#OvJIQAJx<3T~#XT(od?s$27spA`9 zD}$BNf!YA)NXkpc%y@71@FELvG^6fu^f2eoc5+kb*X~Z&Ien5C#t_Q7AFk-v*cViJ z|5*CyqOqe=!z080f}__ys%v@wQ&&!345_G_drMgG7a510Ewx$J!e_?X*)b*k3zvZd zsRx$uQnNS~!H)`Cb)vsPcJ~(zmSpq=e_4yIB$G~Tk6Z+CF|4-&^qHT%q}`tlu~ z9)4Zj_u8m8It~CE3XGQwy9+jBn(oQ7Lqo5?t*al+fdV{`!B~OXgV%>EgPJX(XWFXf z@~JNv>3Pfts_Nl3>VsxcHaiE^)M&ImeuJ>jo|{x!22Tx7oJL%4qYRr`Wm7Kb$&&?L zD*Em{Ac~%42v6%x5r{YLq#>bukQWTK?Tbqlf(}edo3ysI#j|PUdhCJISns}L4whQJ z|De6I(>wH>oI%m$br5Y?I$_^~(w8pl>#O=nphqWwd0pi0bjT1_mRGwwV}`d2oRZH4 zHYnDak%eMwc)H^dR?Q5r0lm(<7OdzZ<1J;#nCl+3?1cS z?cd9g5n;#MYv^tNJU}xA^YM%$d|%F%pn~F4A=x_sm^zo+#HPc6oH1_ie0)J*8OPu% z(!~a~QU46%rKfl48}MdONWsUx$HB>6pj#vpKCt5qh58YM>Yz@+4G8SW{-JaL60!nO z@ZKm1?0wY6U4Z)U?M^JAsO-$SO@4f-?wk0Rw>)~$J<>Z;4l{`&`-et+-pf5O90cy< zBzqbx=9zY;L6!#!DJWHraqn9lNUKlRuRP&MD7FqQ%wph2G`To!1=!7?>_*}6%c2oO zp^KwO+>`DTuQfZ8IYr1fxBV;QShdDs7MSkt?pyNYU&uu`NY-c^k_#siYHjDM?u;hE zt?Z4h0Ufvncx)>xs{%r_VQjC6=Yef{+k1TKe{e|HUizMS2?;f;-AL0C7jF-MQ}_|E zZq~-gfXi|a;d&asd_?}$7imt20W6`5OA)_o7nFh=oL$ekys$KSJ3#c_7uBnCH}DW@ zEl4w2j~^1A^N@Tap``CWlBEucM&U-Z#EXk%TlarGT{f$49xhh5s%}VF%wm3{8yM|K| z6BC1RqAghW_m3%FbPs1reMnDN1iJeR?w+}PA9)(_tZ^X?)>M1tx>v8>4n+*BdP1$( zW5bg;V5*I)H90cqE0arZ(Cx;~(@w5TUZHS5s5QD>jhsdn|!~Gfq^RaT17%|7+OUQ18ukbC&!0rM{2dpqb?UeXB$U)DL|d zO!u{Gi~{c4*}1vqvE=Grh!$NA$Q}GLU+Q|j7K^S_fUd_OdWLi5uju{~f*k4pYdeX7 zIA{W!irH+${Uvj7{fL5mojsBB#nt?SvZkN?@;UcjM>V{}i{{yc7wY5~^U<`2&fxdP zmJdhtl+HGxUaXHU2yNjW`SyFUdFoqP4qB~-v}nXD-$22x$Kklz>luS>Q+n4Oqb=*QD>MciHX`wm zu|fl7>`0NcDH{lao5D4&vbsR0J{gF}zN>B@h=F@9t=74;A*-9%Ua+NfmtfE2e{NL! zgltdU^K`bqK<8L|V+%Cs8%O`p(g23&f@8Lg0u_%=cZG|U1~jmhpTo{_;fDuFNt7bcmXM{rGDFzqs@M%I zG|OKqifj~^n058%LUgsIwr)QIQuO5k-8Sf@K!+&cyWydwCEnt8cz@-;Evt~v`IF79 ziJ_tApk>|12w~F*`+K##+wl1D&uVyT%QKzqw_vy`^##(UVLOT8Gp{wqxFd#-5~`@!d* zdioklSxKhtdY2j2mlhRy?kuQ7yZ*^0IiWz^p<%<_IA04iZ=m^ID6>~LJ3Fe8N=H2>cwX<5LYzTjt>b*4(ctRal0|cENok`Y&TJdt% zi&aW_YhK*DxUxfqI#Zi~BVEK?{KCA(F1MeV-npo`ESS8O{r<0p9TA{+wdTm~8TgMs zj;+(o$zcCoC(=Q@ySR(96%8XR=NoyML@k`Rrb+JarbFbpMx zqIxZ!8=#JlzyQwa)qIxL#TCvkdMo|j-_GZ839#dF()ZiWWgK@qJjEep%g-t@u`=T` z9s3m^Pk}@8@zcjHJZjBG;}rhbO$BF{vquNo)@DHQTUm@%(D&4=E*Y4v zy{D`e*g&i446o_I7m}g!_K_u)|3-OZI+J*go6WtDfjXnqDGx1KjSQqhK;y|A}>SJE$ zy`Ir7#Tlq^Db3^1-pt+K2MlZEHlt!hTpIgR2`dZ^Y0a}_Uc-5l+u^Zn(eL7XRVxL{ z%ge!}0W!s*@oMt+Bgi$+EqK`RQ?M)`ptGK0?aP;nE_ReBlKKI~+TnQZs~_n7J~Q%) zQ)&|vlP)}piEN4J&!hC9Mk+eHXg5OTD>eEPtF7bQiknM4nbk|ari)=&-Tr$()c1v7 zd&GBg-uRC(6NvT;my+unTh$vwowVUS0tnYG{Iq8pt%XLT0V~WgY20Sx%Vg2O5xFXt zq}!}=9yAW^j{Bze0z5jE-s|i{Nr?r90gQ*bU zd61Wvr)lr)C<2f-r7N6J^h*j?jrSp*01t9~b%=HU6%gcnsV_ZO(PSd-I#_7ozg64k z)wFLfI_VxcpE`EA@q#JzcGSLlk+xm*RwtBs!qpDJ%EVOo>c>C*I^bqYZ5)B|d`11C z1)JqWakCtK5$Ge=KMxd8nRR|71AHOSTc59+MC8Qg0F~OR|NRsI$-3W)eFv|=`NU1+ zddTgQO^~UXma5vR2%W3xo9^_;Ka5Dxb={q;)lY;;AzlIAG2znVxJ<9a5eR5RUmTZz zDPO<-i63_}`^p*XwBI!NX8-RL{(d=v_LK&gT?jhN{=O4dAxc>KIS-kN| z-DI7F6X`^uQX_CrfaV|n{2^_ui0?s@T7rs70N{VHR6hJI5AP9{voQ`R!#Uj+`vj&~ z-r^~@gUKG~%s8ch=g~~<`mk7+)C!0Xo$2Y`Ei9>(#&${_pC(e*KvZPV*l;A%hHV`4p0uA6rXXVNG=T?g!Tcv`{=cM1<= z8ff9Qkm>tWRP%M(S)WH4fToO1bL*JOYkyWELC)OV9;mlT^VgG2IT8-;GiwyQgmj`o zDD{|DSaTQgDL#yyd)7$s1eAx4#n`pMRD7T>Gww zu_@2ZniA?0#w?C?xOZn84i`5<&^Hgk#laf6Gmc*TS!mJLNxuN7R5Ux_3$>qnE&ztapWwn}XG`e&#?V#U=PhC;mGyXi!pEF6 zzgcZ*;EOVSJMth|?b=Aprwcqbz4~uec8q}aFgU>jdUm+SqdWNc)Q1>Yq=@IV31BV! zgNYLb?CcS{mjKIGA-~S7MGQ7?Q!;6a%zTr+PSYNI+~-dK_;nzCzoXht23%7vYtl37 z;quC?($vzK;bxH403S>LCGnea8_s`ecnvaVcWU+RLo`{Llq=d(Q#^0K#1mX~;0kmITgIEZs7AF;h4Ado zDz)aeALb1zK00d@?;-pj1+-B0zY3^Ev7xYM@AlV8t@sThF;U?%!)h7_%BUN!Hh&k3 z_kP4=A2+@63U~>zU~M_j5BqxEW6$jMXImOC&nnlV zIXd2NhAy3aKJ0QzS|hr{1QbzPk&rG$x;v%2OBxgeK|&CaR-_RS=@?My zZiXC`?i!i_{ujF4@AH1^eLj}Uwf5T1@XPzY;yjNFp>-8DNT_`g3OjyTT~ke~@xy}$ zg2GO~WBXk|AHBGG(N|M5GbjO=z!u;b+w;3@;uqk5k^0J&tAzb0CA=R$CODPSaIpIS z)HZ#NZyRBY;bM`z-#k}Slt<`#I+eoMRXQyM_vlnbMFpI0TG-y@sW9F4-Eqnp3zPnV z?ru=;9v;c_EFv@Wd$zOiGdS~5bBDt`tgH&yZ$}dZg03AN@|&8Q&$P$v90Z<2U#7+! zVrsk&vj1$MySb>nDtzI-{9!7uU$D8R(Fj$ao(U30pWfr&^_H`5n%Qdu6J?=k$3(a+ zwMu=kGhhzXE;9UEFw-zK&GhvZ!o14vJN1G4PYKcIIGh@b6?ZH9vE2CD#VFzLrn9%B2Gf?K#dB ztC?zP`YZ=J@^9rqrY61dp4V$lE&J#69ydK}OLmzuM&w)6h zU5KF4E=M2Ap&{0uwzC%zIRmhS3p+Pg2CMk$X+bf>p!*T?nXZukyvHU4gb%H(w>0`4 zVy9R^2vTU>-fVE!-L)Db>5-boL&`Akw!ek0;2n$A%%)6eu;Z=@U`9%96jZG%N3F-o zzyx3IR677SdW&>GnRTUK5($Noqk)mTw6wGw94i)m$VaXTcqxBsNuEcW^^HI-_)|-& z3%;7EaKR_&kCfq?OO+^=AxD*zPm$TtSJ!LT-nK8WQ7*BSL6|Dg$6-@lRoi%l?4hNl z@`(9mW9Cd`W)gkw3{!kgMg}rZ{Xiyn39eR~)_oCr&||B}GqfJ@9dPFME;WC;OPH;M zC)}oX{}YIk&XAuU$Wt?c4j9u&F$8_l3#E&F)_Xsuw{qB^EVdhTwUsc32$Y7U#f%Tj zI>XBbAN^5n2=n`6l(VYzIBI=y&Sb~r6d0hl_gZJ6Xnm17VV{e`a`=mEDN1^gt+%Iz z)n=%w?o`gn$r;+0YmGg?!deS%*PYH@!Nb~exY?x+`^-G9_-QKq2%-nZMyHkkGalhr z(k&6eE@&-4RGis!Skf5WvR&x@to+dF!s%4W|4hEXPbv6H*bPfAyc#F<5Bo*pWI-|{ z54z$jGOMx>a#rjzNBPa`!fm?K5=p-|*Kl%pbbPJ|x8Q}}#3D$|ucbwbOr3~d)-EjZ zeN~0y61#fxHW;2Y#P*pI8^3Hk@w>@S^ZM`hiiP!?XeLAp)OX{7bLhzT$e^(E=iT<&r8U`ekU5%~eA*OG_5g#kI_NNkdTH`KnSar+pM#@A zr!VDag;6h5zXr!)A{UWhJod(ouBZvt9{k; zl)-Y>L?VcHa04LnTRZqi&4po%l~O@Sl%IFXhNB+$uw7g+psw3zg4ZzgB6a#3%D!qR z5l=qt$Wbl}WM-LJe_Qe%yPN%~A~X5%Z-TPecAKl{7KYW~s;=3gavI&+yAL5Cmrbrz zfJ4zv{M=#zfVJhtLHXg(4d|j4nvvi4*BD5 zU!Kj(l`xUfytlr`&27A$;QC_}{;zvuf}m7$ zXxgTlKYn$Od^lB4S{bMDUggJEuNawSZeHJbB0uN+bCsepjMx1aAq9RU7=9vOv7g^r zH2;tvGl5E9-UmywaJEWX5(4i>%h#@%5{kD-4jpRyQ;a9W^IavsrlihIHBFvUFsX^DY)I7_g=i#!Idqw8ltirAwjF;k1r8X z;1?PkR;8gER!7}wg#6Vn59E#&fg!+VWT0K0)dsUY7U0b~gP*}{Zf2CFTN$+RG6E!z zx15aRAJr(aIvfpOo1CfM+(4C^eP<6FYvB5tuThgDQmO}>ql~hh-J@c#+=uU%yE(^n z7CO-Lr-ymlDUv^l_}P}>_8;dO?gvGoES|HeI%XDT=K70so$M}CKVH>w=3M2ius>Y!m*iaN`}|I;)_D1Vt^_z_ z$Q+B2UH3DmUsgDoo0(=N8;*ntQIBZhUZmFG%vT*Kf$LKfd5AX~8+1wNJ9WGZIi7Hl zwMxE6Y=m&&Da0}`xS|%`PfkpMnJ-T#&BLC$o*4KQW9bOcwQ47RKdiV!jlrBj+6*!H znIgab0u$aP>Q`5nP`NwrpUUd22smathXhG%54)H~PXxZcQ(e|#AonH((*~lq)N8-< z!0;|8eLrtW$g?|le1Dz<;ajcqR(Ma7J%6z)H&KeV_3fD4Fc~>{ioO6i0E0t9@P*sd zi@Z8gw$@!-tGDGNXdac=NSnp$>)3d>Z;~7gkCa-)P~UvYxrpHz^9I$!JKhYh^#vy> z%g<24u|1Vl_f^dIIDZXxL{V%#GkH0By8Ttr1^sHz9eF5{XHp{~E{hAj#dN{O;r+@X zD?&v$@IqLU$AgL8P#*WYXDEM^~GMg9! zcc{!!Y!HaGtrds?)1{SgK@;4-$Lx(@*sr@QPwiP%A6n-^zjs+xx{oFL#(H_Ds8af1dTwsV(fYz9*GY#LXf-Y>zu+MRP8Wx?5oj!P79 zXIs}{$>$7-E5;YTLfPXj=$(W zs@RjZyE3|ceSM~C`5Hm&VX#^zafYG&_CR$-!s=!W4QXkz0V(n@G5RE$opj*{V%2(i zug#PDoO#Xyv|=APR;)*KdCS=i7W_;)br`j(^uJFKE`(xJiGV&^wPkL{Fs$R?N{b{pto>7B+^^=>myoj(Ry0Yz!jQ;UYb|8CQ5==_nY4m8(&!QQU1N*86<#@3JW4-sV>p74PZ9y-GDEKXp-z5KByIy-_HH-4m=4ZQj4wdb8KY&!HIk@&)+-fO1w8|<=4{J6NdENWEVA*9Og zj?0GTaT(GFd0{sNqT-NwQYeo^=Pk3<#@#+(^J;-JfcAc$T7}t`44}AMi>&@z3g=4LVK^o0}`BaVcBz z+{UD7F<&BRLRJ_RT5B&s6yv=xdJ4-AJQ{{y_Z}vYA@d6yR^QG$sD_bqs!B2h+l4Nv z93OEA6m-`n2B{OGst?x6=z>M1-^V~?vteY_5VnxxVeW2*!hl_~+<^>skY~FeZVIpw zR=2)CQvYfSD_sjp&+uZ-t;FTHN-15UnjgFJo@{Jvqd1tcEM(Jll_yKXY)Kq0QFyl` zqZtKA(XSPc;b0oJys5;g{N_eltP@+N z5-i7{AkEIrz2hfWt%}{9tv&{9J$J1#luMIgxfZI}Ab3deDMpSr`%OfuE-Ral<5P_U z!8M6fK8Bf`B2-|-^0xK@a%!LT5xpw4AH<~DN-B2JFUl`RTMw4CcXd6h9X8rS$KsMt zcgJtMYP{H)zPI^l{ymU(shEjO(@ zoDr467q-;m5{XJXH<8m@6yWQNdW*>MmNgYL*U~^rV0Sm|y{b4Pe&Kvb0==JFf$dlL zkNi}nQ&{&h`S_^7%|w-`*W=?D(#U2eF@iG|F*3b+tcQ-K5Dpw*ijQKjVDP)a_My}u z`8z!F0?&7!lZ=4#T*M!56@|dPbflCj_7T8xhaOk_FA>ebt$K0E*VlKOVuXy8l*XEj zfS{@u#5CP0t_CAL9KwO9P(IPnq|8h_a*WwQ2cK}@Ogm`|lcEN8cVpIU<^$%SOO*U) zKWo>hV|ODgGA8Pw#sSntRJFtL@RlYqi*~Luy7A^dME_qN&VtZ)>sy``KDx^Frhq5J zO`_C~{p~rnjpnsolO;AxtRKAV1&XVP7?zO&tF=DbJ)n&FU> zJ@;PHk)|3!G{?%A`yd=87@43rGs~>T?ebj#c&HoGEm!7dm8ui07WAJVg1Kt^qfOPg z^TLATL|{C?MV|Nrrj9n28c(>&W15hRjKS}o!mfMxMSDUPUDx`$I&5mjU;-Iif(Y1Z z#RAHob#I&tj&2;^+7ICrKb>my;6VXEEqLq}JOrPG$7YF-X(+onT4&_sd~(Aba|?Su zzb6VX#{8$mJW)DNt_xd^J3X7;U$%(pC}L8ccv^eDCqGX4c*Et~=@QobjEafs*= zyxXwvW~?ly)w@GzAD#!*lb)+dEGD3(j?ii>l6^p&EJdqGK)1cHFlUMSV!ss^Qo1sF z8Rv-L=FRoadIpzOzB0!nKaj7|zhcnJe3la}9h0lJxOlL#P)z1ze#{AF`)JBt-G#G? z*tGmXQ}k^KEBeUlt*{F?neCgdt)3o-=`uF}vnVLnl~G8XhjG{w{j|^Sof&DhNTi`o zBvY=#n~(6c9(Pxx((QTp`V`6gl9FhH9p})oku07QQwhcmvvNj^^7+>Uz26(CFTuN# zf@m+&`T0E!`gONuCaZUJiW1m*ieKwmrZ4B|@;jij10unM_1M&OuyV&sIIvH8n(`zo zc-&Z*IhdMhbnT>)?}uFERA^rGe)&#~usEE)$_tGcZC#YcTmr>_M1bqT_Lx%LmCWF< z{N%IzrQ`epJ$z^o!`2_|C$JaO_&|j*L({N7;?No=i#j#S)fIr~I z##ysuSWk5LDlbvvQ1E;0pk4xujX^b^SXeFQ-TTs9f`x2sYA&R55B)_JUXHr zu))-*CxwJKIIa%QyZZ-(9bQ*%ifl{`Q07QzTVP0I@(9$(ot7g?f0r(yUKYf@F*k9(uIWQ`M?WhdEJ^z)WRaQqb0fI0_NXR z2+0VeE?jZRLRKxV6+A>Cc4WI`q0J4*Ihpq*Yv3gZ03kW&*BU(i_#F4KIOVqX4NS*N z2&k}p1VTkK#Sm5iVkNj?5k_y&UmkSSriL}jBt&o!SWsN1j^nf#tx`9b{*Gl96lHX6 z+{Fvf0S>dQ@RC%_{Hk_XrOrp%_~Su#u0;~B9Grf~GzB(vE7K-6;4=Dkz2i6TG#>oq zFfy?1Ic@LyLfkLKK)(uA#m?4+d$g&JZMV0-yjZ%ToVDXAyj?AFx9rW$zRz}J<8G-Z zC%AS2>JvV1K8bz`h3qqj=MvRbE|;T;s&lPXRVYB}jFr24uSX~g2X0JTF7_Q2Y-#(l z-SOrxu?6O#Z?W*#qLfn4vvx<17d1F z`EAR~CLsdO8(NbCd<;k{%?z_ynt1mbPw+&Hv^b5Fta5+r6tIQv=S6z0GRMOX#M9af z+(dNm#tSMF0i1;iBaI*+BjYqck&e*k=C-golTK{_Q)}bI&Qy>)91rgmm3HJGw>s6i zdAnZ|*;^<1%2P!}v@DLsC;7(0r_T3g-ifvLOtMS2&g9z@3O{nRPFoT5DYA%Mq^9;m z`=nCFF{~l!CV#~pWk#YIE>UOiaHUF28|9QjZNU+}pbn9INZfq^`h`W5RdCe16F*sP z7J@4rrTt$*kW*L~2~0SiU<*Ccs?uTgBayR=1?MtU!JIR6L>AZ8uWhHmvF@8%4`SD zf_SGjV=T|LY;j@X9{0sPOug%bWhIBSEak9Qdo9B5rN-+Kdiuut`sI;=?0C<3aIR<) z(LEpaR1C=`EL|GR$OI2nGkA~eZXa~MuVJN`3QoZQIBK-sqA_&Nd%wv!rr@OslUmeW z*}Nke?YmN%AcI0Eny`eD4IPIiJcQ8TEpRF)j(>f!%9`kTDjEEuf?GYA7cKS2(I&H( zC(uO>5Bt3K2?&A8b8aXt5itGW*vSnh&Q&OYdb>-f3=qFTOzW{b86WaV=}U`rTVVG`A`W< z;?LJfd!gj@zgI~Sur67Tx!xZ(>Hwd{*4C!i-k$im`6t?#>*tt)0L4J%DYnicOWDZm zO?w?9j$!G*HPg#BZ~yYemijTr8P6x;C6?#)^nNu*W#lz~<4?S>J^wj1cSBoXh`0Ww z@|NML`BUCZ%ABTCO2*`;ect#%0Xj+ycjZY$&U+eVs1QVC-;-5K!hF5g({q}Xlr)I_ zJmfyGq(#iBV07>PyWG{Yya|21?uH)d5)|0&ot+W|(VSeOuWvQpgk;r)Y29i+k{fe( zPdtirI2j&DN>e}?_-uyKobsWR%QjqxlARX9E<=iLF}HFQ7>ixKz0zO11a&)i5Z>Q0 zGwbmq(ew{2zGo}mB(_k^XXM+L{hAx}-Ez33RF>tSQC1i5!}cwMAA>f4GX(eCX?HjF z)s{I7v!Ewr)-429wtwq;YCxar)_9bNuO!sWy-U3*fY|egEzvt*o5Fq2$jn?z_b8l+3EOKp?%4KaG+`u>aDykkjrWQ^PCKC zV2YKl4QyaMw+s+ zb=ej%qYVcWX_;ewpUa_WmBV)CMHGJG1yT~DV1bq&>XTuKyvQ=APFN8K%!c>=i)+cr zIS$qPW{??5# zDm@wnHnn)wPE{1gQ6TW;Zw^%o4a4?3TxK7dB2y}31(i_zn*RDo_tcPxJD&%b6G^;P za~GmgL!zY@OD#17?4Ah*4djhDF70Mn#jDJ=nekdr6zSb=SQ)I45kK({KS~H{_kCm1 z8n-7L=&XH#=H7UT^~WfqUo`Qc?v{x!w46zO8+AnQu+^X)LlSJRoS&JMm6dt_zxq0* z%~m@?B*7JkjeUib)h!#sYK1-jR!;6>izCfYy!ozg{Mr!eEcQ7(Hta*j^&e@lxqtoN z8yBpnSWQ|QMFsiVg~PccF3J4v@?Qjx#PJ*7v6wLUVPC$iTV>g=9_B4v+d9>vMy09XWp>Yn946OG}LRoC+D5?`rP~X zBn~mURc;KoZuI~m_+{n5(c3e^ai6lXezB(4Kox~PIwR$^{`9Xtr-R7$*-l%P=?}21 z{!Yxond`mFPwmQAI4nrQ0;uE z0$e!)XGp(H;4$^VHS(D*Ytb*6yeWa#?q$2rArn)+Yw93>;LVh4PFG255l zvr_cv!@G;FN?&&Y4G7)jt2Z||AF?ryb_sfSC%j(YseV3fWNn>o7!}7HTALc;R-CPp zr6z-IH@W@N-pG>8@GAr7>Iq=(d8ZrT@pQe#-~=ElJ8`;G^%j8aO`(1R3WyM+&omp@ zFSM2KcpaJWF}KCC*Y~7|0qt1E*=q7cwGh)lIvO@c8E zS##T}2{)(?hpN50V{h|}YOBsZPTq@V@7YeLX6XEJh1$D^Oz78`E{)?E6b^=J8BrL<-(52nLa;Y735)%`#hd z5aN!zz4?6#nkU)!?(*WK)=*HLgbMy7{{|%M>@i+!l zz?=w`uD4}qsBjirC{^1nR%(o)agzT`K@lQTCdW_%Q0P_#CAfcN44GAHG&ljFoN zLjl9_Ls9WG^c4Ci&UwZDE47V{%U|WGF9}=aQS9ZNnQ?_VMo@UAMb#l6WN z&F|(`9r`ASUVfDRKTcs09n+PYw*t{_>ed+oD7$;@U3dP~vjuAB#2QCFM#fvZReOPe z|Hx4+Y$>BdLy_g$)|Q2->HB1FpWWk|et5v;(=BsEJUfMcDyvJtq;TIt#VQLDMb$>< z_NP~up=-ZBkB%Al{Bx<}p=;c8VdE^xd6E}J-<)=;$vABS0-jn97LAP`i`4ErZN$Y6 zWN90~*(d!TjRg6BD02O?mHsCHjnWiz#e@Z28{Wiu}BaJKm0C|aSt14o2KtAg1Nw8^$DyB~8n zmQ1^{M;5N~KzlQ;y^G2#nc3ii>OB)4yZw~&Och&mv*cuCBjW|Z`ZmOkdaz>@FFqIq zz^zMI=&@FX{3nekW-$kEAs8&lRme~5{q`Vnxb!}I^HxB|?_2?6&Zu=Il}sVYXSQ{o zRP}zyoFUS=J0eOp8NsMVb^NNh^-YKaHZ@U4e1YwHkdDlm+qZ7VvsvHwYFj&-yT5I> zd!2MRSG6WHGZQrZ@IpQL$NOJDBiQiJ3G*duGN7J?PVF0Sv(u6`CzG-zGEcr7H0{k> zSy6W+buS!L<7~fnN#reK7iyliD6McdXR<1_>dpkrTlTBpKqa&HjNjXGv3ee%?usFs z@G!J!)$&W!m1j0(I z4r1V{@L=M>`C>EPRxJWDf(`E;W2N0O=3I+Aex_3%B4fU(xGzOz2!%hZJyHktAeI-& z33`m=i02r0^7zboEUf1F1-AVkY4JQ9Z8^$_7fL-v+T$wi3)@a}bN8PKbBMgWp$Hki;g}M-^f}$^^f|qu1#q8R zYw((A9SmHJ3|;^&KnR#PXHTugP&{WOLM2f=|v%PGT~|6e$m+8>Fb0#kr| z2?=@tHqSfvR)-6w3nGcDJuWJ~tJ>a1IHSFYD~T?eb35D2qL)T{H5*IvlPw~6Omafc z9P=mIYLkm=C3qmKCliM`$I54I?bj1(o`2FtQUk`8r_6o&r9}X^#z3eKMB@Iwo4WfS z_PH<*qjOOxKOB9+r_@1^7X~f)9p=tI47L*!6hk%`9 z4Uh)FCvKrsQz1nwDL4Bgjg0FnSw|dimHn7Zr*1W~N|Ei0OZMd+qwne|M%bN5dUfgP zREpN#Uz6$CZu}5VSE!;@;igH84{KlouXVV*Gb9C{KpAbWT6J$Kc1*C^DWXdQqL^ZMu&`SGqA{R31anJuE+nT9lG34cG0J(;e@#H z816>jfyAlb#D|}i03>1bihTQp>N{mPd(QUzYlvBvF=*zI)M$x_7>|F9T|^o5G|tVv z_q-tMJU_@=k26wa`V;cDS&QVlO6Mi6iN3;@;Nwfu)>s{NV6*dAO#(jk-d#?7`C~mr z;o2WEH%DzP$A@>kd_|siDlH8oj_cr;P>%Bse^uAcGK7h79U>IgI<^+wsWLnK1}|QS zD6Q(X#trdzb|AbQjSn}>tS`vipOA_@PSiz&M{5v5NAh_uD<#tcOr- zMtUK2P*bOHR5(zUTKD=pZ)|M0%_*bSbnyOZ^Az)XEeOM4o3lh4$1&?^P`>QfHCgk&k6-^p#S27+D>=1 zKlYsI3EKu=ubzQ+k!op41}`&%fZ;SBkF$+#x}zP)Va9k$_iqqvP*aJy+T22MZK828 zaFo!-L(e{Zc)u(D=jdwthznTAI+EJI$Ro_%$7Hdo!AM?x<}Oc(Mcju-7q3$pe0hv< zeCZ%NvK+cnG02{;TPa~rK}*~`L$Lw_L*nN~WySYcNU#Ot(wguxp}cMuH;g{}o2mhV z%IS;GtA7g=Xuwov*5<<;+M&&JH12lBRmy%KR~tanw~eeM0S%n0-TJD6{_{-?ibW1v zFX6WPiw&q_B6cp{v+Na=x1Xxxs=xIuB7y6TAKuX^N_1Q-&C-AXRd9OxMB|44rT3Bs zu~Qv%eqvhSG=5m`{2gNq0E+A#TaXJeAj{nl+u+H)E-a=SBm}^ySjDWPhH# z9ctq0#g=`HU9GFBDI*r9(K!}$ z6JuK6Ubm1djSJ%QxUvt9^37t&43!)O8C_YI$&$l>Fn6&^Hns?_x7x0qSsxw+aC57( zvl;H>k+kyBAJ}N3WBf!s=hPw*+r_as|;{suS6@56#*;l3nV_#Df6~lq9TX zUV6C;gdq-ws}BwB_gDvBBS}J8pcg*UXtPs2d4QXwfiSdxk+D6?g2EGq(KNz=ErgcI zh&8wE9}GvbtwyXvOLVn~=ga37=bg>R``Bcyf&BCGX~(;J)RwsX1sNYW8jI)3fIIc08 zkykZGrKGBn51Oqoo8_u7NeTus?n+;p;ym~`s3Z_DV@!K>L4^#2fvtn5Kvbq%<$>^6 z?obYSRJ5=^A$g9_2$WZf{}Q;kuSLq5;3^Gp=+C5skucaah0lkdo7VnUf_m{4n~ zA=?*1Vd|!{vy8!QLiZ*UYwqvmtKY8m2FKWNTWx29dXV0E%jK)UPUlui8d>quBPyXB z${?l(cV=yyN9|zhnByW}g;dl4^TX(&VzbZBJFJm;>#*#>O2nX8@jPOTIbPsnnes1Y znNK+brQW-{Px>W{qFn9)Wf=wy&hpgw#D!E$v*_IQUgsuCBcrD~+4%sc6a;X-9G>%7 zVwL~VfA(elH^OwG5*#jW-U`S2;VNiyqCIu`kAN~$5rP6w3hok+wM}OWzOpsbW}tq2 zdzNeghsN`#z+0t8kZX7ap14r3i={a0{+o?N?TRqYAn41f|2SArSuuyRab*E{g_YcoI*f}zdZ__MATBl9P1oJz`T z!h?guOQSU+^jZkZ_BbO8KfHsm)xx5$Z*<$Yd@Pz327+c{n6-vWEyimvgbBY8`D)xA zSNrIxUh9uw73RKyfg}H?XEP~If(X{rI<#03wH7C*R<_X@b^Ai7<5Ev|Ny0KN`=-bI zP_D=h7-2d!?xQ!Odbzo|0gI}`W>QeJGgBPjO2p_5MzN*T2ViE2FLhk$e3O>aw{<*s zbQ_Sb*+?+PDmKcJ%{`jik0Jwyuuc`a^H*;`gDgcx)<+UDvV%$aGiE1@Pr>saoAATw zv1o$w&z!VLe5CRKgBq;Lk|&?>D!n0$?+U2Dgr2LFIngbWI+@=fF)CfPX7L*Y{wb1y zh1zci$jrt11NB~BjD%?w$J4TOZ^!ceJb)FE%L3wLb~BKnRqu$JXy$7 z1Aci+7bw%UiVe4btYZC>M)yZR`g?h`A}l_bzO!GVBf)sP7Rvt`t0uQc+$|ROZMZxdj7UEA~3y zTu!}w@`yIcLAEvX_8!%*ML3~wozH4T@CA0@{j)+L_6Ey8Rk*obHen$JkJu5*IM6QK zt2al#70ou5mxQp2F-kRudNF-}0djseda7;~4>`Bt$9I`K19P6Bc z<72gMDU){S*B-6#{z~?~C0s zE%oEsmF;>7wTsjhJdTwv2dF;?RRx5KQ&wDh`plPZ5g4KyUu62#x}KZ5E;1ktfHSFc zPa)8Ex*5UbUgAtKVm)4TSUkH3G}Zo0ZSB1|ej87y1YV*>9aQ7uTw=DAFZ=RD&rJ34 z^VFiZFblHiW7PCPVcpu=S~AzvxFe%P5x5E4`zkPZh z`*(bf_01(D!3LWe5?SbpVPU9ycC`0b&Ma)qeV+u`K6PEsxmEzH4g%@;fo*EhVn|GB zibjVP7aY3(Nm43#M;D-0qdnbDcfFy8O4s%5}h^F7Gx8UB#*e4D@*L;NoujX((ej-YrpU^&c za2fym_hbdWTj8Pq$f!Zm$8TT0>3z2|u5TdE%D$NG_>ikcswv_#Rpg;6^Koe>!Tj99 zXVh1>!|barHe-h{ih!3Fvmp?3!cN)W$O70>t0B+>kM__zx&sUxjEupVgWeG*M}W*! z|0Hd}Dd4@2`B_asRKTEA_Q6hO63|whN%`Qlj2wkacA_V{Syu-(Fj+7E1veTDV|90TB>;`W{#_17d$bvg$OVhn1J#Q5R6 zbgT`JdAfdB#qNO6%W#Xd{~%UQ@!f)fJk0XFdXr0SLCaMd#zvY^Pltzh0=w=wR>;@! zADbSA@=219(y4HHy6T^X*x^L)!8SZM36re7cI$vSee3pZfE$HTaH9$p^S^Z6?>_*1 zbt^IR@y1>-EcM8we1E*dfKAB)<*vpLCu}%gmk0N$SH|v6GcgHHA(r^Rw#@YDFtvEHua2jvddCe z0f0T=;(;{}caf8kHEk%!$1&iK*`Mm8Xa}cENB+I%X;@8NO?XtxH+b#A1?nHaSWOaX zEJeau-!}SLifcsgQvk^g(oEEA@VfpW@^^P$m_8Wb)IIV*T-eT22ZzHVTy{R5Erq@- z7xyeJ)J6XiupezZ3@$EkSS&1k!}T3OMV?-LJnyXb=h->VP@+8Dga?^g)5xHV!hFGCab~wR#x8rR}h^+qI~>K&9h<$ z;Wb?mTRt>SEQ9g=<(2csk?|XD!9UVtq<{e1pO;hc>+=X~*lXT|u%Gx#e*ZM3{_F7+ zYXrPe&I+DaEPP(j?fZX=5dP(yVug$UOVWbw?_b!=-zeet_seDcA4bvCKg}fuzxRAb zCp1p5^B4t39dw&2lY=S<3-c%8IQhKO@E7Ar@IXPY-(_j38;16R$^O&dkKX{0HLR@B z`I^x||Ho(T9h?@2DxVfyR{=g$2)V$73z08TH1nxJ%2>lRr8LLWl~Vmsm$Mv z+uw&Ap2YinLt>0NQyLnjw-S?mq2{oFL;Vq68E~9SL^IQQGV05#Jyo5pFC-Ri;EG^m zQA(AghnA2QhC3@zMO=w~`--6U-^-M_@I6x1Y>n=rQq1}MXV2B%T*(|974u;}nk3RXyq`Atk+Ym-?WfePs^6TQfk0N5<*RjB=u^Hz#_6QPZ4XnEOM+NxUVpwzmE-;OLVDXF=&I`zFlHf&9>EWM$YT z)%8N-3`GKnF!EYXO7q1_gCoZxC#3KJKA4V0APga2yKV)_RZTZmYI_6+2WzeJ@3tl= z3NxQ#$^ntGlJMFEX79yUK3`6KAaaSgfAAx?6S>{(&~dK9fmV4dP8KQ;I9t&NxYw}O z7T5n`fX-9nk9)Ts&ou|bSpZDad4F_TI1sYO>Wz&Rl#5}=D`yY}g5uokuc`~?TmGx+ zQo%0pJWP4`)VZuOuLBY@vzdrG5jHcq9Jy2IZf1vcY4W`MjM@2V&z|5c#xlVyUxiypf(bo$^^umEK zu|&7VDPIEN4Bd>aZC9kroS%WWJI43rIWNK_>*FgOIt}0cK9(dxM;^vb<|=^RN3Hqd zKn^MD9lVXk#bb@dODU3GSHG+Rdd74;1Sz+AVfx_7*v~)2od1zo0TGCV-+6z3x)2)N z%huy6!~F$~Ki5B<9|U}GD=t&*BFr2BlqT&-D6?|V?6HS2IxwaHQdd4-RW@oc0=>0} z47$T`hZ)(`S9XBuNDjN(@4PgAgigFy{({&#QPn;L?4t;P=z)C~OqBg*awhN5a-L^A zsp}ej!q6s6WzKsVj*gCr`%VqABzL1alUUt%LiuiGp~;EKN)3;CL=JGDJo$~gn%I2J z>%_U6yY7 z-ET><`t^AoSV4a8g`-hIZOG->c`qyLU=d4V7}Y0GZeuD zEvtiL9Yzf)fXN#7Qi^@4Y?p)J86%+Fsi*+-w1NRIT}vGMB5W6_-dkiyo8FHhMTym{ zXKUo_Rps_xYt-0lLmrU9lBiMX)V>U}*JTrLvr}@J8a`JWJeoYfN#X_K%QvGonk=Z) z|HCp+pTOeyKUfAdBqqQ{Ay~&4zQQ6o582+y4>&v-B%`6fbU_QL#aoQ@oLzWOdobM+ zD>AJ7)vq7)I-SXbPVKdaqjsv)b?jlsv=_NtMwK-+bDo`YFk?;W4Jc)K&&6z$QXFWZ zoL^*6t8W&O0%C=HZEi*QDRAi=n645HH)l6TV()Fv1MLUqA_NBFKb0vewaFhOyLRn? z%YGHm`BWJ+VRX-T$avm4vS;o*JK21LqOBAv=PRNX2^~a-ioa-bq z7SfJU^4K_+Zt{3&EeAO*C}s0NM&!^m`_1PY(01sFuDs{94l*D<+39H-4!oQFNpBMI z!!HBKs|t&%!G7I5z&8~3fP)GYM&`bM_@JqURnG zZ!Y!a*k{pOkruncc$Sio5mF@!wPLAam~BF5d{>fpEId9(voigdVt0horj>{x0~6{$ z{BP9LCnX{>kf(US$FqY?9eVST#!9}uv2l730$)_x<6vf46d97ioW!V=y7uL$b~2y( z?Kj{ntkzVx%nmKr=MbGZ{3n{mgS27F2+0g@-{kNROf`8!$tAS@c+mBW0}$7NxB%RQ z{ewN(8|>7j;wwYJ#+?alt*z)SpawA~RX%cQCcoPLF8K~E@xuQB21?%uk6@JjgTS5S zH7xS|_`Sg4X^f4U7h7z9MC29JALxQHOTt!X?&aGJIAPxWlZsyFld>Nel}r;$8Q=_tT+h7r&r5;G%B#yfj@$3J09Vx!#iJS& z5U!Q^Ur8a^Tr05@#Sf_`8KuYfMk#RzvwYu= zA5-dpd&ZbW%To%DCC1x_=trJ1^imtv^P`^%i$jXRX%Ni81Vq+^yWA$6Ejo~FNGLNL zg&}yta?G?Rv5uBz-abat+@WcaQZP&kP`Lh4DmGFAzd1bR7D>t@;g5z*wzhr-p>4fF zVrfEYY$?M#Vbe<^W`kC56Zbs@_>(KQdH5}I9rL!9wyN0?GD459U%&pTF@&4^+LOn+ z)gD}SQ)RK!eybG(Ym0i5`oC8;_{%hi=uuvFV>f$Ib!mX5r21|A+cshS^-teOxY79n`b-W*jbqj-`gt}o8QW!dycP&KioxUT~;hY2g1V7&yIEd!ugZxK-#ECuvGK)=sf48Vch^7ZFfh{wFR#<;X6k4 zM`xsY6ZvAwx#{oG(^N}c8N0bqIi&jdaq0qgvLt_D>rhXR!jB(6px!uKW1`Ez#kCTd zot@>p*lm@FtcbEuc^4g(x3kU8`oR3oIK82yn5c$ZT|wYo++@Z$gqp0btmf1B137m8 z?9|VumgZIVdlH@ONgEsXCbG$qkrwspc7adX>zfV84w(}@RdRK!f24t87TrLFdMO)N z;|}Y*9eyJnJ>9#gC~xLHt&Ti9kwEiRDq>B{OUQQ0@7kBTS!@MOA2_dCAU`H1Rih>^ zgu(YDn+Yf?NJJdS;op_T7$8x3d=?%omy;HYSAS z9I70@JM~fLANUVEIBR6_{K)ye;K#QvUDe6YI9Lv@RWxDpjNOgq(s|?(S6n|Rfne6E zzImPKZS=a3xR7;TVsVyua!_$vnvpkoAiu+k!c2hWohPn}k^H^1@ldS4*4<^-yTLz= zFaOYt4*!!*2abcEzhB^7Cpt!#wp#m~tgd`bw$|0s;(fmR)5tp1sSHPXataZm z8=hQxu<-VbXfs1gSn{J4013m*uR1%9P%WL6P3|mBjCuQZNJG(}Hu@?o0Z!P}*(oV0 zUCSRIv$=KMNC*7i)OPRlTcm7`U2%lK(5%S)ka@qoqoJiC$PCZnk#ST!r^DxbE5XMx zHoE#cVeh$+%*TpHOId|Mk`h-!fF`rwPbxU(rSV*kyROfrST_vC=QTBUZP!RGfui;l z)(3iH{}#7H=RY+THV;UB7CvjXx@7LPTDDXvTT9Z@UgXs#S}?Ux87cexxy|w2)-Yix zqJnHRux7TLmTG0{l#q~+%*&`njyoBtOxn*f`bGJ84klqnBH{G(D;!qZl#i3?R+qJM z)3TEGsNLV9vq=VKq{?%Uuf&Z%ZSpu}9y=UzEgU4V+FXA;9E%($kTX$b)^>7mtc+OW ztT|&=RPC|H+GP7BK4$TYeC;kpt4%FEV_aY!bKJ&aM#KM}<+;A$bQiI$D=CTGwJx`x zl#!P&NO>_@&=js~FN{^p7^b+a6ijlvwmM^U%wkGfo(1~yrL;7fGXw5QpFP(Xii3h~ zMN(%*7mr<^dG_J8UUHK5>wEma^iv;nL(6Bi;peSGt1=w9v0O(PTtbdn);EaEAme`M_7kVE` zKYmEeNQ{S9cBJaqQ>oNCfBChThJ->*WL|0InO^&^%M)BBkF$o9ksO+#-y6^I==b+K&$Hg&dY|?D_3m}n zI*yFP-h1wSU)S}C>jK7*Op`bB^b|J_blVWZKff05WKuzoA$8SwxB|O;q$R#Jyd>R) z&D0Zp#{)c*glHQysn7WAbqKN92$G^f*K(ik+0ll5e8mQq38U`3wK9O}SPNEuL#ROr zZ{~b8p{T4hX)j17?D!iI1YvSYY<>E4!tgp_ie*)qO6P6Rkm~hz0u}X?jO*$?D;bZi zb8Au$Rr1mOq@nV*me7QkA$6W-W-Q}+k#K6+jaq>dFndBFOjkZj70x7nJbn%D!r+VX z?Y{1r{{5**N(|Y`lgnBc@kV`VrZW4Zb2r0 z>L`BREl98Y*RgeuN5diU+}(YSS%CV8DUT@)IY>3c@cVH8sVL7FPX~$C$szIM6lj)T zq_K__=|G2GNz-tB9$Q8y>mY*9XloR--?w3=0h>Gpe8{umgWvv!UdhYh?D6CT zdYxhLt#ir`l?R#|g_Y&yqb`LVprlkS&+Q%IjM3x#=wC8!#;8@o z+plt1vQq@H2{d<5Eryth3B=30cAr*#(c^Mt(TYExzUATADL|rv1 zPgtF0mDl@5sbquZt#s}Sc$UO}<};@3k87WTx>UQJFfmZ9Pl6e?mh8|`z9=XZH$49H z3E)XfeXk`~I8^#1Z2}15jPqo5b;b3>Rp_;&*G0I8wDa0ZBnLZ3r+7@qqt=No*rKOm zhFk*9y?dnW7Bkp7#E?wvUw{{I_@@@C?AaxDR1%qYx*3rA;_UDEH5mh4IAcG zQc^@c`izu|KSDBi1qry#f3i&rYTwT;%cB<|= zV!{F!8BkQ3LJbWKJD}xQWCD{76TntcKq{L=?&kb~n9puuG+cR^m)N!(`l?3?^@?!A zKMgY>kb*72Z;1Ri#@GG*oAg{>SMiN9e+-MdFJxO?{np(~YIOzIc-*m=!v(3KWtQBZ0`z=5**@~B5N(wYe2h>dTT+`f1mIh&Lt04^YJIfXC` zY?a+fyvs|UiB7SurhNK(Gl)7hCn){&IIGYW^pN}eNbV|5v}PH93s*R$D7IXZ<|vy5 zZCtl7qyL`A2HrN4A;g?K>wLX#uzTyaClC`~`28Mn2!0+%`%`82>l6QXF9|bqvDLx8 zT|s7lL~{M&V|27Dx68qb1^26Rf;xQ^lNVqAI5l<${EJHD!tDI+NVlZq^KHI+-r{I~ z@qs^om$1Oj_Dd9ia*8yLWa>1eYs6+}kexxTfNO7@O+w7@9&>-3;7`R-#e10Amz;T0)cfy#V;6 z-Z#;6GM(rK>L_Lg24YUT%oa0j6ciK+jmPG*0Qgp8h>i&CM+VFrcg45q6_)pm7R$-i zaS&PQRDqY^3w5;99o90Cy#OcYPs_{dI$Rx#5zT}Q7$Hju5CQF={yw~W zLd3{+;j3`F5Cv<>=jfAxP%KoCo!`80ZzPn0z1 zl(R$z`gDCpu|VV&nxN7p8B8%i-d1s zY01#Yz-fIl+;l+vxstTjdebicx2jU)>myK#yW}4rT~tXR{$D5m9*YWY1Y9PLw=E^7 z);mRbr)r_93{hEN7imeClb&BXYHHhL6qzA2JT&kzEDQuw2L*-jNIxa}*rnCHAvb~p z_k#uXrf2{JZ8%P7j;U!^+60_@plhRZp2MB2o?KX1y!-Jkw7{mqZpBQ+NM-zF?>Rn` z%ZY1QpB3el^tgLOY+;tIxU2YN1vhi@NBV5~2*n6c#zw%YXlkVmniEVo3f&4e!C#iz z8`09X>T=_^EJnQtWignfnf4Gc9(+U&I+c@e{BL61^nWI$5jP;Mp;4KVlEO4{7xLQY zkH;J-EvX*P)B3FEEB?h+IfkeSZm#m$zUVR-%KP5K;quXqKKVE_Jsej%?Th6l7M>G>Lks%CcdIGC)& zT7_F6)hyi@zZ0Hac{4*^Oq+vJz^8*QCo>yqr9<{r@bRI3zU)b9WQKa#S_%UMD=H;a(UY0^MP5ZE`am#I zlIS4~6>d04Fh=_OcZzlvoat5xFXUd(X3=6?zpnM6j+SzudNn4i4RPUh%9M6de?Iw{ zgN1{Ig@cZnSqRt7$am;NIT5~rK^(|-gj|qcik}!$xF#agzm$t+)O0&*UxgrfV&=&pVa6JbWlpSaGSK#bu z@05~zu8Y_(H_#iDs{I&Ilvf34#v*ZSEtWo&+P978IJb!jx_|( z9d7I5m$0;YR(jalZqLm6Kr49e^u-06KP_EPFy<5Dd!(r;G0{COD=PZV)S9!+BIqI- zzegw2G!xCwYIa?N_`g6QtJ66Xpe^(AM0ZDPt3_T`;j4~oH*VaZi2LvOh%#pRIEtZ0 z>z3yyh__FZQSlK8Dnz&eR&R@kgLYD|;QZjP>)hgFxj8N;8t$}oinTCOc;Ax6a;YR- zUt)*vwl_RNS&bb>Tbq4xL@s#oQlj|l_;0as9f<#a9YU)%>#r{3tK*wL9=!iieEq-n zX3rv!O56?y*I9>(;thxFR=qu{*5kok5z!3@ zJG;uOK2d|aCCPOzpsm+Gr?`q1NiOUPfn+zG+JTgI$vO%0$M<{c4(x9b<{0=LcP;2Y zGgvPFu{ZV2UrZf%k$kHF2LeGLPgqg@STPWY%-#Q6FQabP{a%&cmAeiH{5ZHBN3?WQ zS*h8q?t_nWOjQ89CmMAic&4^jSZ;3%qA37aG|EgZ1*TkE{mJ=5bX8QGK(pzX29}ZY zS{)r7Cdz@+ox~3Q0~z<&`^2~1X#_ukfFq*RFxfuYKmN8!&zA7r#&tfs$JCSppG!&{ zezbl9038??=TmF$-VGZX7~!)q5K<}^Flh-%ArW<0a40Da;mnX}?DG#vbl~wQ(5WRP zAvgmg3MLb@6cqaI6*02II8aNEgZ%wZbL~-(biYJA;D!t9-?n9+JMVA<>DP3vXO)Y7 zulod=1!uhfTTZL!aMMk)>TNyu$rAMe1l(h$q?N});(lm@&c%uAdY{^J^XF&z$8bEk zxsJvxTuY{NN7Jch*m6NK7z44py>mm2tku*8!0;)-nu$ z3@XeGI@IaZqER+{v)`uBMHg^q^bPgXrZuz`75kmKZy72ZQXK1#=#aLobEW9c9MpTF z9^bg>4li!RH0J`<{Hjy`23Jb*2Wk69M2{%O%iQ2=ss*vvB(32r=o=0b+oOxTe)|5cV*{pp$UcDi=PhXNb8J@e7~t+&p$q%`MwB6tuBeFR-7f9gzm)4nC-7VC)nyAO4o<74nZ;K=5+qekR6T6WogF4 zOk+rcoSdBEIO=d^cew|z1zxvY->7g;VBa;El$-Ye_^3mMT=!7`h|6nDLbgSUV`S?v_*Uov6F!U%IL@%QgCy4YXV6*UmjpEe5}k{)_tPvl|g1E!JK zA{5t#W;~f-zK!ocNbimm=p^%cW)EX1>gaSgQc@1M50)#yO3`Qd{&=R5bleYKSNNEl z*{vq|xXEhs(=n0HB5)srnz{**mr)}p2i9|?7c@9gM#F5Jx=x0xU@F_R{zHlMlCZj1 zmg3M9n9fw=At4&45eJYoycQsWR|Z@kz8n;!F#xpy7*QU_4geN6j617<;4}xiHdLj` zdG!bu_R(-!;dLT1PJKO7eRoM(zx&Bt&WLDwRn@lWi0McM_dS@g4OTs!ag;`!29RovW4U4eIA6ps(ZeV2K`+l7|wT)9{ zgZD>kX%wt5QA!ldysh^Gi)@9cnIxs-Qc+HG%Rx4>o;$7JIBb0ewujtJTR!D#DaQvW8)pb z4kuf#nml-iB>5+Z2;(*zv0YTzO$FY#hihg=g+xH%>W$f1fA4hWG4D23e;j~`85A0G z)s4;F>54vqD_0Nd$cLn)wJc7^CY&uXYMhs+0kir3{d=(a9stG~pcJO1eFlYU7My&{ zhzYJW9(0Xy%WRV1L#D|BahYXBzc6}2Ub`QgVFDNYC(CMkwoF|b=4N0;bhUN6#3Ppg z!lq_>olx+%X9-fz<$CN2szXr+M0d?`ykR6f9Yg|A10$YS&Fd@5L<^psXGjDW99}C) zL19T^N&R@!Vc!9@3{5Mr?)6dkqA6Pjj=~eqCmLpP4s0va9&R`aa~-1ThI1VwqK$fm z*RV*`Hsl?DDCWg=FQT^?7ph^9;Iq!#n^He`P_H#RIav)nLA#`!kh(u$?|QDCn>(e& zmH|KZ0@whEOUJ|{D=Ew4c)GVI$p+AM&-S|#pF>#VZyd6&FPzMl30o#&x#p^|pC3IUBmdoua0@TgZ8j1eI+9W_Q0EUG*E%pzA z^YGugPEnL3sGgIjB7-{oslz$313Ls>P^SRh)Hbu^9CBI(%Q&Fb8V1jr&j3ZIeUUu? zPhbX{5qkO0@ldwV{zPvw-iKh6IF_VRq>kjO%`dK|eMvRwRrU(ly+dc3mCWjC@cN;> z&DwEZ{zj#3yFPPcws|H?i&T3c*j@%`x}Lc}Q?t`~&CeP1mGskB0jvZ5a%Qi+t7~9{ z^8p36^!l`V{~uXXiqK~ipL%#;WEzdch0706!;9hrFlZ_36KU9oD6)80zE4qWQq z@*>-5$f5*Cy8WB<=0E6DJCT1LkblX94nPN$zYmj2CttrUzIVy#EQuKP%zwfJ{|5^Y zWEK#8y!1$s3_Y*m-FN!x+}ho~q|=?Y3J3rYq$o&FmEl9zAfEq>*aYW}q;rrM9aA!P_C@eJ&MrWibrbQcY?zl7VdiVHM11kP zsy*-5r^0V1&lH;pTz({o6JYl*TfdbpQZkuSn}Z43+5J&IY$?4E9o$nN0I-=U6}-K# zYr8v-4@hel6}!{u4XmG$eVzu;i-skvlYwTk#sg|v=hm{Rkp8*iaPe)+X7vXxzcG{) zog3SHzizBIyzM9Lab-~3SliOmPhQ>1O2 zWH1d>;CK?XxXHb;Wh9{k%Bv?eeLMGuu)DD!`zXKjT^#}U<7^Z`!)wzV^?Yh-^1`Bu z{rw4dz+j%YZ{NnXS2$#GTNu1Hcn2bx;jrY2ChrP=if)K=&K6yzyItl zo?23}9*Wv$+^yYy8kYBk*4nJ!c-(-^)|O>jB8Jy|rK7Q|bNhS6KrUnR&Zw>KLSJ6h z!Fvmx9C%j4p)V!`;{F>g6Q(R2w|;IXHBRr0p2xX5Hb%y*ReOF2Lw@r4P-h;tm3YoO z9tR&I_#hUk9Lcf;`X^l@<6 zOi62>4=kxt0V1Bcm3K%gxQ{vcN^da8l>a|u8M$h<#F&nFC$UPCHD|^>F%FyGKML@j z`qT1LG!K@C21YzROQrxuV)uW%Mv#>7mwjc39U;%-)UuU#)9JV>CsyRCpyx=9YoY;L zOCkI=hNjyxwmMH1g3aHg5>`=O9`mXozrrP1>UoF12|VAsPVcZq)IwERL95V7X^74j zo6|Hee{Q{EdZOWp;!}!k$Nm~Wxvplc6GxgGc+xEKg!bI&tJ{e0fI9}!&C@*rzCB4q zF!>fv_`6ySeiPypA2nD4ey`}4j2wG5CZpL&Q)#^Tu1&KPXEr9^U5V#PiT(gEi@kP* z;SG?8b<20fOUlLb&n80yEI6zB8G!Nyco=CIsbY6oLjCinq{Oo|5_A`p?|`xZUv)wVHcX4D*GHsi0jd&?|OHa3P5_Wk3tH$zuJ2 z>_w0-9iCU5tj%W?pGh2?As=XM&Mfjl%e6B3wr>CxCh4Tx19EZ}z^ws}8^GWJw2#=# z8!CfARdIT}zvle}b+TG3){cxh8B|jWjw2P-x$XnLT`i%+%ye`t?5p#IrJob(+@clAHQr|Fsq`ed2V=*jy0K;neoi0tV$&98nj@#((R(K!M%zzZ)n|ufq&#G z(CH1GsB>WQZa89*`OmrY6XT=}==gVjdFuQwQNYp37}>3aFY9@K_SGLr+>qBtGg#CBnZ1NCL3QMCJB*CM$ zi<7f4s1w@6OQmLGZ?jfMpU@cWjz2f1ux@VB;wO0`$~Avp_pG&P0EdF&JK-vQr=IAt z-1~@;9fJ*RY|LB;ktIKr8fhM)Yq<{lMa4<#Ix0F{?ib2RneWlw*XEr0 z9+JHpguy}C3nUiOM_^W9j_(VlOy&7pLSY$8RyNk<3C71j+~N5H*}C-%RK=5_6?d`s z`Omy2)*I4c5pnbh)zAM2m?ErQ<*clzxG-4By!-m_KwC|8wBnI5$Ak$}p>t-rpC}ce z$M|16UTp5ZtG7fcWTEM9Ja5Yi6dG_{@V!uZ@0>SXV*%#Y)w@#95UGMVF!%|fC7 zUWo%>^z3%*1W^RdRdd}Ek<ws@`=gPysoqMLPC-bS2r}A>hy}8L&?DGu1A1l+f zw()MyhN4x2i_IV$U@({eZStr>y2<@K72C zl>7bgK;Hh|eq&=35Lw$5*~c(vWIW8643M+gwTp~|DgipD_WNRcT8?_Gdd$qOHp=dHc!RUzm6wIw+&FQt*%Htd-j1;s4_FN zwXGqmLfU?Rc(vx1+wdMQ8jj@UkGNKCMDOBw9PKPNhR*|}qjpWPzQ8Z|ucjR!0ZO3* z1y44q#7OV)G-(l|VX*XvY5^5|d_1B9wracWn@UM>2~wgyx6oBBP6hWpCY&sDNR}sK zcR>J%n10Ce{P?~DTP8P}{R4VxDN!n_$`h+pw}ob}2s_WpO$;&*vcrCeRZ4`Lk!OC1J1Hm4~te zzNF8{NXxi$6=188#hkFHW_V1r4dhNZW_nin$8EmMqxd69)|Wc<;Q~r;54C~u3QFj3Xw`?!9v%8!2qdsy!NdoOR0=&kJpdNN z1q1y(&ks43JM01%zZ9x;Cv}f7>EhkJ!%ATCePiJhitry8{FARGr7^Dzs~jpsn$nE^ zLkzTb9hBxk41MZz1}N&NurTf|iN<7_99>dB5e3Olxw#A*9+eSA6gX6Wv7~w~E){-} z8GwBBal;M~BO&6l)ygX#`MLIfv8QG*teqO$o&NO9^770~+CzP&NSbGovaBiA(GO!OXK+IXc>jC z7wyMHle8vYB(9DdefuDYe!Te)X{xofnwgRrhGb=NaLYs(>4Fxe*_7@~N1aT@pvV3V z3=E;_3zLf^kGzG2a=Gm6^zl52GDn>?m3(yt4VB92iILXEOkn>AV{(lur50w22XRw^^}-|64{@mnZ3z{~NkymANvf1&Et zhIn!K62rZYugRZ^{RY5oJM{HM1YzOh<0GbXPWHwIpo|WI{P(`8+b_9^?EiPxd3cuh zMR4RHr{@#T>CGGotou|2v_hV9f$ z396rKx_9fc-Y>RdgnwFME~eX6sbI{CdAQ}Ep7}XX-EtntX$BOA%~iP%R;_F(&y$wp zyvrleucD#xU;@{3R6<0l!<$4EqW$&tP<$p`)hH+tZ)=RdZ%BM8qYW%N-F3-tU93CD zNG+aiF<*y>IySf;G5G1cXMZ^p;nrR)dE3-j$4f~#QMO1@t>r3D9&SD2} zQCaEaH;7}-J2TW_{-F^5E$U)tymIAAUX1oDbp{HvA;nTX-v>NYjGO)Yl<1`$9k7QK z%6Ms}kzLtX-x(^Vb7Mh(I6K~N>KIAf8~0*l)Sj)kqFu5QHX(ULOfv{}m#vhebFF(2*XFTs3Ot;h|J#fd1 z(;37yo&2Ea%KR>7+NkJ=TWSb}!h@!q5qkPSY2Or$VW;OYK5wXfJzSlrQjzccv@!Rt zs^zYgA&d>Z_-##~Q42llp=dM4D???6z^STI;RaNJ*u=ax0RwuT5`!lD{cDU<(yl|U z%oggWRrMafv=k;52OBpZq*luveR9LjQ>&u0SUV1cfvf9KJ+9#ELJSnI!QyXps3OG? z6U`Pp^)GRPcwV3GHFcr^y~aW>N)i)B?03{x@g?j-#rAeJ!4abt0GgR&u zQFuZg^yTjR!^=IoOxiWd^73CaUI|=Y5lXX%R?TS=znj9&k-aB?zFn!$oUc+G$HY4y ztukUder)N{DY5)aPEY?m3P|FM*oj~k+qvJrr-r&DubvR2KxWYYKv>|T?T+!?=lfhZ zU0PqYz@;7Q_DLcX88et4Qkc?7p2=2DZ(>Pzw3P-ekIHhgtPWMjmOv-wEI*wHj9jIq zYj>+)w4!EIww3N##BlbLaLL7LZEp{cG#|?W9cU9dGNQ*Kg*7y?jk(U$2N)VCLl4#_ zBC`Sm1lI8Hf7dJ2Xm6KhCCj6QuR^r|Tb#+Kk~Y!>QlC_`kQ{&7Q7;;^`#GTGlJSh^hMgR&lTCYx0wN+!$D`{0iaF7X)5!3oC!)Z#cp&C? zkv)o%a_^4Fp+ zWCs5awPnhu*OAC2kM@(kc?o6BwUXYf2SQ*}+-$2p&Wh>EX2&Fta-oDiAi6`UTwVb- z*(zi+A^4d&y)zI;Zf;b4_5W(G+HF?ar=^FG*U^y`1wZde;-4TSbYJRU!E&txQp$sg z^_-lHwT-p2nV~a)p0G^iWylTp4n8J&1@e7su94^y$wWb0aW%Eqy{0O2-ORe1TGd9jfJ86%HJa*n+ZP zNmh9o1vJ!5My8hGk%_zHyQt8e4|^W~(WN8!Ncn~G!?cGaTG0>dp3Az&#sE1)|NH0D zwbLN8d&U*XnQUNWVWwr7z;Mre>+84V9YIVo0WIN_XyXrk;eGR+ErI_2gGWWco&DsW z+&9Ik6_=e5lLxr|ii#NhX+i#OrtGTW3uKQ)*{r(?GJnYv>l`iUI{xzYw$%}lsA~Qy zDA-PJIQOk+sL3M*_s>oSU!Xie;cy(%n3tB3#N3;>S)K`hgU9?DE$4)SbX=XbX{&9-Us4y_2P%!AtZ)XHoZGb8QkM1x1B> zz(RE2OF=x{rD><+a0Sq^Z3so6RHu(FzN&^N6#eldqwXB9`<@M8qd=o~AhPydpJK6F zZv_f9mBclh##!LVeS~=(f{Fe+@Kt|5xms6sEs6XA#l4`#*^SMYbuXSO>YX-j1Hvzh zE(>sdrXx>`f%Ig`)j@L^X0;fHmu8p-+{U2x(r7EoZeRc;*%^A=YhE`dd&d{@FP>fU z_5y>>#RdPG<$f&8DojY2>{w=QZ*K=NB*4Ucru6&wr!-}Tq9yK4cDo9=hlnwuAt$q; z06;9B^B*mbW14$z{pZ&?!^eJ_(YbH%+ss5*SKI92Eb(q*veG>8XfPt;jw9wixbnD| zxZB~nVF+IsQI~jJu^K~zr*Ai@tYea4S2G8>rc-xuVshfgyu8nr#?~$C1T*t>OeXqa zXAUQzw))n9&TMc0FqNPuAO@OtRr&;Xds`J;Xs_2ly*%No9f z-5{Xqw#Tul+4F?s0k8xo2sn0MqMIbwg+*TB-IEbj#g{qSSJI#V$G#2`j5p?k>y@C@ zeMX8IO?1YZSv4SNAu~k3VR=ZsoR^MZ1LC%4R^luQn(og#I1pdU=XCz-sRZU)POKogiuU3TB@ZFiibyvwNa3oe`9zieIv>qd9?D+D(^8>&LATR%B zVY~?wr+OpdWhFrQrMU#=O;|BV<|4idc zgMP$jVij{zjr@STy>`W9N<7LT23{eT9z5v`c-w$)z-HTFv$qfxM@&p~tUIT1q~FQih_L@oVnIlhbOQupkC7+iNDtS`d7@5$NYj0A!J!%=2k@O zO(6~vT&f$YEB2&8dGdxpr4+zAa?MTm?%k_AJ;XrZcefm&TU$(}!wSj}#PJoNkO&sU z`v{HaYG^Ml>w8b$fR3xMmCq>pLPzC%E*W1IBk{%13yBW|-5%mqZBBD{<`ihKp&viG zaJy78+hb#4Qd4kA99CCX=Y9GHq7tyoS9#2rf<5VkHIzBI4lwO)t*z^$cZwRP$#>MQ zMkZ$tB_iKBRc>&TfiAFD%FrBsjL!DHY1my~N)F^3ds-?c;}JRi@aW{~JCf@gDI>GV z#uo_zXT`u~QBmOnqC5$ov%z>tU;kZPe7EgWF>tD2Ri_ym0@IFvX1WnbfNuXXzCu-~?i)Z}dR;aYU9QW?wzZ>Ha7pq+zXxYS8x5kJUA>#sQF&{xHL0`u?8wln~V22wDuh1;B#>ih>fao?4Bn z%zs*5<~>S3z4MS0O-c2_3t?P2;~vn1 z1!!o%>DYdCM(!+PK)1_~=n`V08v&ErbRfY4_8(xSxru>s=)2kVtcRGpF{*=`D}Vad zc=@8XqMfO!sk-{nazxMKx*bIvx62$^)xr7hy4bKE!-eDdl$%qIQw9oYJPP}hU&P)F zQMEXvcW}n=ib)I*5a!wKlJdNadYf9kI4B7)wxybaqU<8@WI(ApgcdzkdkY)tKcSLM zdZ?K**FAs(iD+CfXvwSwy36obqau+77~}U1gr;iC%U^G8ee0Mc4lw!exd`awqBzhB z+&Z5oL;_6qQdpz|07Sfz0Y7h!m0_Kjt6K!^9L)&LzJ1c5hc#z$V^%l_mZ@rDQ$E>B*0(-*TgV8=yjs;j|xbEu;iSKVhGjzq6P5 zORtE@i!f5i%*%7$2g*MSSO`SxXGjP}rxAI{=fdDciDGiyNrIRr6?1|jjOMTRc*p(q zo~u74;NCt*YhU^1z>{+M(_RQkh(IS0oO}B}^M+qm#iv(+7JTsCk=vV(<$wMA6pcS> z%wKs=y)`z_g4_5(|JInNQ2&=VjsDeE9FoEm&7@1_xX!TrIV$R1T;SYjII6L9;sbJ~ zX1Y4$Vcwaa9+;<+w96tV{X$fw)J2mqIPu9eU^x?TWW^9aaz{4NQNwQIo9BIEb#3&n zaEg3)6|KUdByRRK7__Er_@2lXJ!iPq^~|c?-&Ay=WYj7AY!DF~D6u@BKhbRuuV`{Z z&Uk*zrcZ=^dG}h=GMFw}pP|e5A}R~@?Zx$5)6Ye@m_)O)X;mhCTjDjzlrGifr+UAx zX9{Vv4itxvh^QLMbA(`W~0FV8qwJl2@XxU(AYESR#7vi+m zHF1E3;J3M$wdaf%Xmf954hq8+fpHz;`(1t`@?O7ebM>Kmg=*p+l~|-NpNW=P302!8 zZs2SjQ_{1p-ox=vTlmPKKcv8hpXc~qUX1+Q-W;*qkO{pBww#QdeJ+_DG2 z3=2AtXH*h6Op+2xiZU9+#RijnKY7q1r#1bG7D3Y!jijQ*?GJ*xb z`B>EMqNjc6Z=)-YrYm=C<~5dY=wDOSu==q!qL}QR$kNgSK*%A>3=T833n^3pc;{nZ z4;FNa9;nyfH_HA>+IQIOK0jPDS$#Sy^1+3NBzCF)%9Y$5J14768rfHaeL{z1A3VsBexIWPM&zvQ23EBccPrl;P4Ze4fGD7RoB*I3IB#GbbmM2UKMQi z*Y*(&XJ77<*$c6Vn3`s@P?>YRV{qK}IO1KY-wfuO$7(M%skKyHXv}&Jy1ZzZZ>&&~ zV_~GT%uklzjy*l42n}6%G(D+d{OU#Jj$;xbxWW`2FxUR_N;8}PLpImD02HTS%y4qu z>qLLo{U4Jx&n3E3*#Yj&j}?&=4zpCfiqjRt`lPJp9!^)>E8COJdGK!ST0)`va#a}; ziMXCcVso?1?ikijdX@m~&Wdb)_WZfZ1lJ=zF8(=goM0l3uR)&Z6h+CVuvSyXj3-XA zn@ML90Vb2JZ>DbX-s!7WR|!fS8RA*mu{#*U82NDQkVE$+P)bS=G3gQG|FE&?UU%YC zQPUMNr!(6a|IX%HE7NI|IE=B@Y>v?#^BK&c#6lxrEi=JXa3zL$^_7*anGWxB7u(eB zTwX2a)xXjO`7vG+yc(8A^FnwTxkq5oOcq*qQfV>y3@ z=k}_MsX74;_`2Ar#w`agCT1*6P3dq<%}pOuSzZWaYIfc@BsKPI)hRU*mm#;ci68^z zJJB$=<7%deC^p$eLuYG1B<|=Gx}2dV`?8{@-@_*`E~wkB1od)V7l_FoXxyWBw**el zz=>ZntjP+S+1b!onN;I*W>N?%rKsMV1g8j9544&^`hN+aj}# zwGnH-5OzumKe2<|b>s6^bzxk;<&I!sfS^vc=mxlm>t=loPIt|TW>p`nDA1`pIfg|+ z@%%>Dt=D#uc{(b7En}7%IkNZJxE~-x7otjXxDa;tc5&_<*Loe=e$U(sZ_-n?l=q7P z<3cHDX&)QBgllLf1x|lT&7E1Oojq+@3rZNdc>^Q(zMd8bX*N@mnfY4Ecznk^1Ke%# z@)1T}aRb*5*^-eSti_i@8pB`ac)XxOJ`F0v|9YXN7*{2P6i!YE`M%dd>Xdn>u zrSaq?bW4IVT}$KxHrv~M8}B3><4Y3GEIa1<3)1+V`uc|N-nsiQwUG-E6Vb@khDTIl zev}VT?SQ8Z@Vj!gXoa39Tf+rYYGf?9hZ?}MSx#Ww| ztr7YB*T%BbI-?}@{eOVBACd{mJ-_%Wz+R;11Nz{wrOQ4@)i1;+<##<7WVCnt@r}3T z6m(8(2cAUue0^E75S88k6M8FBU{px|b|xfxvEJ z*kb+mCalvtn?4Z!*5x?j@GI9omM${4plWiegvTfceV(n%zHvHs&_9@>g$BJfhSG|~G$;6^*(YMy~tdivc zax_3GP51dk*$9E4g?t(cAgj+%ee^>T7ueNcL6K@=7 zFKe@ZQ*CK8BRjV@FDPlEh-VU7YCPP9f9GygWMtxFqpuBbP2sS+wHZM*VPP}j^UJvw zBz!+gVl7zO?H%Qtu32>$0aLXo$(eostrjd^ONM6b-GeD{(Wg(J!ihla@G4fzedSY2 zDJd*!Z=|+9Mi!Z@d%x&p%VBMMQ`X+0gyVpOpT(uQs30wkUh3wqk@{uO6cvr}FCV$n zHyWNkVnyAkUCUwICk1knCcBcJ>@+wYHgoZdwG3%YNF9lh{gv;J&>-@t=SJ7BUuvek z&5o=li3#s9F*5E;jH+-be>@6GaPmF3-5(Fm^zn*<7F!xKA)}JX?*8EG9pt83^q6d_ zbKbx@bg<_otVxCn+@RMh9?R%XctlJ4FtzWquWB~qBW59&Rk@2`b6}LAN(Czc&wRvs z^lmNUC7bEW)TeJik6FCTls`CSt>2qegZ|~qLubTI75T7a4r7J1Yj5JqEGKZNnVFq! zykZixa*l$c^A0hp9gf$nhRa*OQc>zgE%?ljU7#dEui0sFsb%xB=miAyd&o{ew2TSYuKI!7 z_tvF&-H6%!cs*I4MwaM@^Kn$NoM=`SqS#)r)O4UyCVp6mRKy(9F`h2^BcVHT>sx!j z7U0ax;OpxNs5lCsHQwOkvu;;W_71DK&&B8&Ph`7WJkYUl`ZB{CD(^c`r;f2@Fxzi0 zu!AWKx5i+8{ub%dW^f(w{|q_F@{^gRJU-R@>BlVj9zwv4Z9;Kg=|FkjEfRF2K{*N! z5Q&RrbRYa(9fpXIi0Rhqs@Ja80#~m?w%kk}$N~C|9uNyN&TrFFy`0N^Fr~nbE$a#| zz4v#RQriE~Rt$P|QOxn5fnEXzSetOK%ku?gG{A(wY}6C0Nd`K)zPy}o)fH@2jza~S zx2&hByW)zGmi<+dN=8Wm!FOv7-+Nd@5+njlk5N4bWx3zZ!?I$(s86V ztjm0#&k;HO6~$Ax*>@^(x+b}9kZ)V2C@keAkqiekjm>yGhAsZ^GXJW##+1C`4ZoJe z%yp&nT10s$CRu!!5tbUmy$pY)M@-bEG!APAB(Iz|r+eCt0PeGQ_;KxUQ>fZ?rZY{ZnSbqM`zX;ee~=>(6i1k=ycAqT@HF=W}r7ml)kVZ|8S|kJ_Q$N z#c}*$a$p)rB(XI3ySt0=4T$s;-Ze4?RC}F2|P#*jdp!#>A2-3gYjcOzD&9; z-pj|}N6C;LVYSOi-s%2Y86H^HtE~w}PrujjHr}ddZlg1`h2|INF6L(BP%=@cXQ#4T z77@^hZ2f4n2jcPbhP+%OhFTmisK0BxtpA4)5{^Er!Nypi2%a+x{NkLY&tRNp?EWCN zx5kfOh+hK?lN<;o&3kmB4yTPPZii%^ zt?kp59{4ybP9|Jdo&LGrZmOxm?^u}4p&rKO)e^Y_;%jk3)9Br8f!FV*=#E=h3N zwvx*_G9;0^>sEh;DmJMb%z}>3C4vX1Dd}`~wt;44g`n#Dd2xF&@D9e)Mb>h>-g}rQ zg^GrD1Rg)!zJN%t=A_f&@^Wq-o_*1Ef*d-hqa!qaUzDx2n%DapVqyxQ*c-~0J3^~{ zL*4-$PY#`0u5h2N44#k@^rHS-#&6ZJgm%@>maxZuiE*|+l)deGYnTxZc)TpSu#;j zSd8YFTTN&5_p_3dfBWw(Ap7q&pvO;Eob-;_d$caWBJSJ?D2Ut?aIb6|`D?H(gb@GI z|CwUC{r@oc)=^bhZiD z;zCcpLQd>RdKPF!cNJ7@9hB8lHP&KR3NWDVT3p6fT6TJ7J1?o<^mDOMj1Db+Os&cl z%VzG!I=*Zv#QTvC8HdU2-rj2j?7Mg?%;agh1i&?v|FQTJ^~h?nzrVz?cHV7l&D1`G zF|L#bo#v0s?|;2RMoUY2M}v#`7edlh+PvSuD(U(A%FxhCry~*hm-KV$_^3){Atp<$ zCtR1Rs2jMn^U6}T-UieNE$s-M$Jj6)E}V}CU;e6uP~by@+y#JvwSqFo%vUR%P6~@Z zO|MoUzKJSCeN~iwc@*wUmRDqYC&Cn0wz89GYz5iDF)Me~eQM4iSt_E%%)Zl| zC~H!Yv)W90$qW$f*b}P_F6l^(XuWRos{rB3TV|VstE&yi9}Lx*CbSf9Zt?R7lYq!w z;}<3}-t=6ax#&7^e+zc1PW%_zyLXtDlkU?N^>-BTuU%l!q5;OEnT6~+f4`Mhm72>~ z*xaToXX&DSCh|QFyTvahBAS|-yH>rt54y@D&e)11v}uuXSSp}N(I>+E*cRQdirf>BtiULlZ^35#aX{Sll_d@q;)EFIvBTn_c z-nS4VR9Nj_z&#)%GH9GSAZ6~*~B28X|zZ5tkhY1 z^rfm8Y=YsgHA^cVQ6l!64#KbobOl~XIlc<0Z=%H4XCd&BaQPoP1l&f@ z>l?DDep6G=uh4vR0M8acsGqRBulhuDI4^hw1BCHu(lh>|0%$}6SKehqwuIv1Pm^LO z1l&b2b7~yTpW)fjA3fk@fC54VZChY%i=Q|_4aHy>7s>7(ZSJ;y18rP9Rah2 zQ>1Mb4m;9GE(DymM*3^R&cz`;KD8{9YY!^~@zhx?<`K@u9@^LgbMiTH^gMfY?wVEDq_GWVkt+C@%n%@>FcYvi%nW|5-R%;6?z*s0s8C|WfT}q+Elshl zGDma&zR8M1cT4d-=pbvo4=qd491c`<{*Rp<##*3@>78);?hGRhEv^4(m0^01jr&YS z!H`b0-@r&)?i|6(XdG#;WNVUO zQh@QOQ+poI%pSLsN&n%}Pu55kJE0RI_)oeo^lDA2sTHkqv>T2Uine9*GU^|Gy5#PU zj*iZ4cPQFZt%qp4zi+FM)mw8l%H(DG3MC<-2rsiV8Z<;5?JS@k)+d;Lbi4g(Y;>gX z{d@Dn!9iJA1oxJcbNZgnZR9)q9B#jEB;c^yU9=2r!Q~fe>fXcppQlgmlf&){TZuHs zcd_LS5AZI2T}$X4sy zbSzVAaXy3J9HOD=;dmej+C;^7-i_#U$|=*_{knFsirTgaFhtV07ok7!=OulFvYIxi zB$Q4Gh2S104H=poTZOw?`aqVu(29Qvl$0=Tdu|GzVZHx%2F+X7*IfW<;-{ns=3KKq zjKt?7WDWKkp7Ro}h%<3q=r05W&QCbf+!P#ARMCp}@KjDhcJq`)`AvnKk@Kl@+!|sF z1P6B!yrG;8BnVUb;)7O48^Wy&3m!c9o|t1$l|th#k{9sp^&S zY=?7!qwP&C>-~uVhD->p52gnMb7s6*XJU2+bB2mnzAsd{-CQPpNYQxLXdths!Y?$X zi3moSwc$oUnEpW!jljr61`9W8zNx9>qoQanI@5C3gJL^uf^p1@9hNr8hdKQ|*E7p* z5*&pFgk3_f5_;b8x0Nj}-Ra2q{%JC>t#qY8k7BOV73-1B+?$aJI`^7OmR}UMxRkPL zdabQp_+Y)TeJ?`;Ib(uzKGRqNcW$8z z-R)V!()Wk17v^JFET|6mY4pD|j?)X%Pp!#C@EzJN5rOG_n>l8Ee*sBkqFYWdq8b_$ zf!C~D&<7B1Y6FaI96ept{QIk$zAw*F>L4tQkQ>^=QBzgTf6d>2q1Cw%guZn**)=j- z25%`;g@)44ILB6%Yu1k*vOeEG5sG2d;_pvLX+r~#YnvmZwGkc_K?z?$)-Z~yuk9xR zq<*;lisU?ErgIZ)H;>+p#BeanwwPoV{Ifcot3SF|VeOkMHeNGww71Uaj@L`@?YWGT zab3zCbi}G{ySIjqq@&NH!Q~0DSy?bCHdwL~iGm!gXbfYeS`MW)3LPRO5Z)UoE95nP zPsKEUr1d?Xj`*t7t()=EgzVOFY>qSzd%L03no6AIVN^<$&TAqxGm7bjMkrC7=8;a? z6<@ZuYmu`@^^cExWlo<-0NKO$#T!g zINvcRTp!?FU-_w%J~9*#5m1;}jsF*LepZRWZSjFl!v4NN(7z(-Ng5^XMp_l`I1T1> z<<{FyJX_idbB+|@jE=gdKeVSRM=m)?o6+W^rRS#F2sT_GqQ_?o(R~OO8T;$F{#~Xy zhgW{xa7AwC>P1HCkM#;WEUWgU6QlWaw2a+7(l*5wOX;G#SFX6ec{)V%{Uqj$-1+0L7fFQ^y8j(%52SEH?V4TClo85|B!xvFy8}unH?Ue*;7>&KPvHDxxj4Vx7(_?}o zq6mM&veU=7j@#7(Q;LUXITu~LE?>S3_;eDY^Da&)!2vIaYe8eJ>DTpW$q-K>i2c<#EN05xscPLUUF-=KLm3{SeRaT>cmX%P)1j1eprDaZ~ zWm~G8w3p(~IL<3LDdWo=iteh;8vGa1bhGroRy@6d5e1 z4slJs?rvs9qK)RHp&U|+@YV+GkxqjaG@x{8w~m!tYCk!1il%|BHDDlP*ex}<^mKK- zygfPXPZOUbMd&p#F)`^aiZAFo9j{y-*<}kMn(hp%SG^GFXNw$bz--y8UuDoC1Xyq{ zDQFsKvg{D=D>%5~+9@7*VTqHXxANysC7_9h>HjGC{`9?#`;>x;?o3xQj*;*AUtBWQ@Sb4t_VVIxK4O)nAdny$k7a&$MkN9}AqE{SAI9|53lPtD%4m`o1Gn*U9t_RD}b|A+hz zl_swljS?{j(!C`;z{^alC@-@nuJX-$W9f8LSQJFa{#b)SaPe&dVmri!B8r`tQ zhbj;I9{$ce+yK~m6lFz6X=!9JT-HAZTPL>WXm=dEejYQz&Xx1*1SI!Y+(lJ3*l+CX z{=uBriiIe-!Ve?g8NuD_^JI$X71*pF9v?I%WfVan zO_DN`|5I{0tiT&tQ4e7=+-10<9;sI2v0b_#a>3JLVPIdLfYhuu&T~;+w{?3s_~j%DIO6D zo`7iEJ$fCNOat!=Cr8xQ3I$prW##3=3*2qcK#~4svRy+kzdd(7cBHJ(pr^B*Hdou< zsF@i7hFIE-{x3WGo?WO%JPP`$GSP{Xb+wlFFyc)iNbDM@I(?W35ZH47<{2g1f>Qd- zwkz)gYLc`u0q87!qsuyAwShbI16p_^S%P-W6w0YBs^%gQz@me;s1`&$6n+b^pYJ1DRqN4oSZhHGWP+!|wPUhB+)U=uIaB{S#m!iwlKDo#PJT5`G2!Yv; z=ral@f%?BL==v6n!u6pivGJ&1@eJ-iloPrJ2R^VB2AT5&!l&n=-i9$_U+35BJ`r2q zUf%8~ILot>VrhNR1BG#$TPdyK3gY5w-9>GOmde9T`soxPk;DHS<#81Sr;QPE0JfXs zSI=kPi#p$-bw+Nc@RORSTj|S!qkjJ7(Pq}wu^j6&rwV;+3E3Aqepx-Z3K{8A+Wsq9 zl4dKjG2}sYboFR_C^3)h$Z`@OsD%gP>&%ywMHio3a<_DM(r>uk9R#Wdj|QtvS!Ha0 zd}Ai_y6!x6zHW0dgj-Fk9#g#2ps?7}YS3inDoz<&T6T-&)c{El_+K2?$+qUx6X-IT zKB&5M;O~Zo-d&WzUVo=UEX4*e{r0kdGhp_0VY&TkeD$pLtakm(1s0I_hZ0(BDwTHj z&Z%*puTYXT-Va3Q5ev`t%MZ4i8$YBj_|aFOW{-q}7*m+lXG0T9-z8V(TN*ZWQR_0% z9dvXE!3HV>>m$0F*_R5YeA*bNd~Sbn9D~f$rM|LAe;jcMNhr6V4Cbx1j?~wZ#3^KC zK%$_*YVk51T}Pbr>6k8j9+pI%C@#0pfz4!lVH`cxp8kG?(@RO%S6)MA{a|wD`RV=s zhc|pie)&)~Dh|E`YAE1hfUNRKjhSV~T_^V^?|=7zE@rw4>M7G7zc_QjXJ$Hq$?E{WXH*$p2LhAVJ$EY%PCiE$_w2(<8V$IEP+CIKt~E`g#Tlc zd0ycS#nL;*%m9yYTg-c>KrqUIzq}R@r($!eHuHQ18*4OYA_o<|Dz1X}P*@_7m2tV{ z(VMx*mf@xg@#K$g4Eo=^fFRlP#EJDM2vtX3&7W`cyvI<7c(bpAO{XXJ;KZ710+~i;`>gaZEk0MfNJL+n>XnrA{?ylwcO5Bb9Hrh1 z;n9IwjNcCj53Wg}*LuAI?+wF#Tq~N@!<6H<9W{qJCNZ>xG}0?BAw-`26#=a69Y&l3 zYLc@1sH-!UvDXlsFr!Ib&he|hml3eB&zs5UfjBuPbK@U{u|t=f3{KP-VkIypsOjjM^YXfYlha1aRF#$Ch98^V?ta>1qCt$@ zL<#;F1cERasTnj2HJa1J^{udKSK3q8ISjYgw(8psNajp3DNasqJtSw+8%y5zb}wM; z(WYLfqSf{%;GEY~>kQH!a~i?pI)pams}Kf+)X7bk?{;*BO%N^_AEOTlw> z-7aZ@_G-$4AE)7hykM1*j(kMJx-z?hs4qkH>Vt7w=7Y7Byhp2>Srf*J{ehj%8*rE_w~8SY*TK{RpOz6a2yLG zTAGJ?47LW+Rz`eU%zGWF)l5QyXX|qZl%PjQOQQhcP%(Rp;}OkHZ3YXFPf+ms_e`3x zh@e#0!QTeAQYzyMJ^9&#;-w2*G=>FC5YT=uyvLO492a>tlRS{~NZqJzY|kXJDd{*x z=rY1B3{sx2;F}Wvbjm&!;TH!5G^(~2IaE%wCXi2GLPLsc6Nf%~3VG<+fbo;3l}Wm1 zqln1$=eN(eN#;N};Uvd0{xR3erSp=ra@z6h?X*4Jh)BD4tR#8bG-k{fw7wV+^6)N1 z$Thy)3~?83gZllngIr}n=?#Xkaz#O+^g(4MVNdhSgyi7R(>HslBB!>xORXM##(~~m zf*u}n=^jJm=6EHVf>_ClLXyEAFS%qyd?gvitNI?XlK6U*;+)M5D4OZn*~c(rpt;eS z$uCV9I4`xVO-shz^1wvJ zsNQsRq$ZezU!_cnoOVbnydy6$Cni~ zw8RIZybvvRR*e;tCZ-<|JVHss68NF}PWWi^@iXb&dgzPeVa{0`O346?oGiFXrc8xX zTzIpnqA|y1hG&wU5FVcDg0OVDqYjcUDLwV!B6k1~sDv3E+nzS|qb93KZL*}Ndx7jh z;Ky3Trz?QS&P%>Pd41IOwY5$2#QGDwmEPedXA>d>orZPn3kd5povp)wP*aIQ`zcKX zs_j<^Etj>)Sw`*gRIEFbYUoH1P=m6G%f6%0=xV9d9#(ehmoJRutShg#7vMHG9Q*RQ zQ{qTaX42Cmi12>mDCaiFmQFw;;-x|jLQyVdWCl!|moGg;=?M~2?}tSPT2bxhAg>hg zqpXc(@N4@^MLEc@gVZcbHeb`lly)}buxHSE{e9jm6wZ-CMC97!6z6-)4XH_)H))B3 zgB@sS&l}ght|5&%t}|}?li3~^8&1z?#GP!Fe#sPiA(pF#X~~qd=HHnnOX!D7Ll>nzJgy;K%WbYl9>H^({`PUsy@o{!Px!fjlh_%TpOI5# zMkqx?kr$`=E9J_W_)|wc>|8Y!NDqVqd=-8~8svx7g}CE%zt zdOv{s+*LZtL8&C#uV6+84sP|N*}v|zfaQA%oGO3f)O4~^_Lhh$3(F%T;&R8rTLfy& zX(0Hr+*ngEWJiH?ZH{=(npYMDO`l0nP6o6~r{zcAI`r96MAM*ix;MvK<~ooYRYZ`Q zMuBBvq_UFx6lZv7Nk_iTf*Dr>io!@W%1Xs34P;alqj${iGf{Wh%u5#RUV^XLzR2-j z&^Ctj{JiYT{gY2eU{plHl|cnq!AmE^i^B%}7*BZ%gX+&|<8J!a-%W|kB3UA!vdL(n z&9eP~=;J^=$ZomMSAM^&nfG+>^o?({lPQj{hI+WM)owxS&ZSe&@9gLGkFnZw1mOPX z;oHAugYdZ!xg`F<`}}SpD+Eefz@K=fH?F^`$xN052LZHKfGbh&sGn@DC8-dAwp4xS z_SmslA|!TOf9xbDHvkH6b>w=*qa!=m@&jMC$(m-XpJhW+4LU%fIU{iL&Mo0v=9K1w z`beN`)xBLvyxj0D9J&cRJ3AAI-47R=5@QkI&;@v(N?y*)*izgvrHR(hNXfAtZ*WRB zv2XXod&=%H->{$qdd_%V;ojVQ-DgM1C5#kl3eQHRsHcb5|!bsUXQo=48!_bVGBp+mjiLP`-de%vN8U zx2NZU&B5hNlxfCd$1SV&I%??5gKkOy@QfMf8^_E|zKW@LJ{~s(O9*@%s89k~U~2_q zxD>zYyY5CvnRDD@=V8N;jChyVa60$+Z;4f%UuYM;w?U*&(h*#~9W1#(Fng}N`=*v> zhqViI4#LFuL)TGOx$YCiArJtu08lM~fj=!JGAPhGKr+AiSgY#7$;BeXU7U7NvGJo= z60l4Jx|CQ^kP-X<`pLoD0=1)Z}KYY+38B5PG9cv+s3b$s565-GKt*?7m`H%DBkuo_#DgxH|ZQ?Rk z4LB&oJp#LfW0I&A=`JxmCZlfXlnJ-gg{HU?%ahQ+&y(8&3~I==4=RN92#2aW2hD(> z%H*3I|DX-GTvQm`7sS$}&kNtcDTRG|K0r#ekI5O5@wv@777PR5zCB*PlF#o?&>}eP zkIyk!sCxvC0#Fl%)|ew~91-ZcdHO2he%1JFK@{(&5ovGTw5*TMc@3D4a=6bTD_$1@ zva&BnQ9C_3a_DwP=L~X}mdF$r-d@JWySeJWNy!PIGu~T1ez!ocH=IfkjX93__1xF6 zJ@s)*ln;L*!p&pL^U<}hbQ$q7=z)ZVMMlg`+S0s9Ye^m)J6@a}XwBKL*ny@{01EN! zt$ohR7Z4O4nl4(HEl^;(6&?`!1D7m=Oe($9{%94vN<3aj2ueT~&g6cMa`_GR+l!M6 zn>6GDH9xk1D^$P-a1n;B%(0%Poy8GKoVUmF4UP0`WaT0bEmT(BnYQN1baVGNdi03~ zE48ECi`XST)3O}{L8Uj`VBK^nU&I&%_@D_RuP&N?7Kp^VwGlTGe?q)Y*5Os!zbhTBXWtq~W`V?n5%N z;_tS3pFT~mchp#4U3-w2;vc)cI+W3=11Eg9W$0gaa#nfV|0_FrcV%?%;YJJm`r!`C zB)$W5Q~`5?cN+$Ph?O7o;wFbal#r5?ZN~kFo;-&C9D300zqsf)II14Ep|Nm30PBJi*6*2dy#+Ss;Du*Sb#9fQ^8Vnc^>_qvJggoiE;tNC zxnT7Hj!5uNaE_f`%2u7RTrh8)wSSJc%Xc4^V zc*%ViM+*RGu`9<%*Y`YMJlhdO9<@Y@0MmM58of{uVG zU07&~MrFmLfS|1neyz*vOK}WxOgfPwQz9;IVdJKA0Qeu1_p6eAg#0 z!Bd!IAY#=z^qmE;+_hdj?d$)D!x3E0YML%12qP*JyIg$+mbp*FTs&4sN@Se#4K|1F zTGRM>0HRB>Y|3=Ce%SxaY3pPq>H$$_Z->^!DG?b_788Z9N&DVmYl>RT=wuC$vJ(z6 zdf1YA7PLe+QO}8CPPpn z2)@^T2Zf)$HLa$)U6_c3X2WbpT>KUNe0tS)ThHJx-J)3B^c;b##g-@1eO4on zXMQyohO3ikJ{P8LSqRelR4({RN+O2IIW#YgPQnrzW8p;;yP4Tpz((8-a4$Og{sV1g zb`amsL%yhSj;GFjmO2szi_2y;v7{NB-EgSjmj7TGlS#&scproVuvWq9C=|)&DVRDu zH@V@kMq zL+W!G2%$aC;k_Ne)phG-Xlk)e0PaHQXoTI$pB}HJf)*1vzcmdAU#gijTwkDc za{tN#75W91s*5p}1qXP~H2<{fauxn=)phkT@YZWmfaYb1FyJoB;2wxLJYyfR;t-KZ zTifGnvX?|?Z~uL7LwuV7g$AatDa~KYuG%0X{bQ{qK?Hyz(1@K^-q78B|80>y&|&ZE zwaTXUcg&bfvLE5Qicnee->_xlXa65z%e(dbfWH18h!?kkctI_CpSVj=`RVD88q((a zK2PJ9UV;{bOWo(y{w+EKe%blm+}ukEU`4jYHG;x-G(~*rZ}PhslEyXc2)9tu@c(F( zRPWu$NrP*PaWzW8b!CP>;5D9>6>OsOyCnMS}cwrhLTJAbN}#j zEONI*>xV(za<^NqmW0HO&kfwRX*r?=2pL|nEq=3{^x$_=f@nsXSt3YcUYOi_w>k2n=Rth;Z;nGI4 zw+yOL`Qz<9#~&%xR{>GoVGNstaX*X*{@;ywa2MXmI4K16N0ym&yWYpxn3Ij_nI&fx zZvwW4{j#gq#};xvW*sOgjXoeD9d`bdoqnuT0h-S`QfCcB^lPGg+&i< z&$M(h;V6T;AGbN|HivshOU_IvGqAjkzmJh5LiwNQqdLFv7aS(jSx_9m)h(J75_71xRK(zd1uN#C8L0hU`TwHOq*TPv)l07sa#)%y z;nEwEK3Bzh+!(W4n~)g$iU&2I@VYHrjsXKu#W@WmMo=_*q1Sha$>hbc){YE0@A?SL z(I^h&*Z6x>6RQdN9;K3zcb}181c<_4){@xQF(6%c2K`VVf`#n2YQY)?k=^?IKt`Vc zvpMe3t-Ra<>(dV*L5E!LJdzcn0IG$xyBHa@m-gk0j|ZT$_9?BLg}z%sdKq1xMJh&Z z|8-FBB1LQLQUxdO1Cj@KR7gkc_qz?2b5*PZ#lGFmPXi~Gbo?_KDn5m1HmAjU*h9Bf z1bn03&-!CH)qZbYr$|6R_~=6j53gM*8_Sd$G;`HSf@eqeRXce0*csCJo-d#QLHCzV zaqcESq5k1zHE88iwroOM{mzgz6qQ*Cwmjwsv)(IMukK;#^bT1(6E|Cou3b$z^*Opi zinN|TzOd{6wMQTK&*u4wdi?J)VqA@bLKZW&N|l4KVA}(5IzLC26`2lsb~)d|>W41W zFTDwyTr+FF9=bUnr7WY~P_yqA_H}Gp$W7-u>;QZKMLL_@81*6f|wi-$!*72j0WxCIT0~6M#-~|)?J%k!TX^2GTn_oSau}`wOg+0^u&zY z$>DgM4i)5c;5npjq}iGVbhk|LKV zCefz40-O}l$c{3JIIv6Qwp%CTpmH!7BLrWHijfM|j36l`BQgr2MuYEXqQ^jV26oNN zDH@W)xpeOLBknq6Q6EMSu$g#xh~RS$6xhp|aRUDc5fTKZ-Rj(QCsPw{grTg_h%@)B8W>2}WbokCZ>MJJw<0w{AsKO>q^ua&Q2& z6MlT}7ovi||DqwKokJVXx2i3LWnay|PPxRU*1F5?!neUVlHR-N|6$=>;x1`u+w(Z% zs+a^$%JWw7PVp3)*x@^+Ga9$bNMvvvI-?#y#7uBz={#0aeh!gcl0)5NZ}0}n7uZ~( zqMCn3$2@}KN?Y7%O_K3{`B=PK`lRS2PZRBLzH8!DW|?3f)@p7rTj_Yhd??xdO+6rN z>hyGJ*){SiE~}Bo;L#V@uSWR43g~b=+yw+yI@6tT;=lcg+M3Ot4Ig;hme|7Ygi267 zo`GGl>D*+wgLHaoIz&!v#Z&@LVbQQ{JJJD0{2#|v2_4Q6dDs{VDK>Ww5&<6Qz|0Oj zI3e<7p=DvUWqnRkJ430Mtymfv646s;oRelHf!QXvJXPT27%xg$B3%#*Sm6J*6gR(~ zHnLksYG#WxfRV13?j1%w$!SBVN(h!r0_4!_*8v=qFq)k5o0$B- zZO06l2)Mp+y?GpX8>M!o-`*(Xb7?p>9OoK#Nn?0R$%=hVIy&nwTeG1!VnH77%hSdh zu>Ta;IVw^1=@~CJpFJrN`QY7;(iJvF+_ObvHINnh9!XYMN6n-l=35?#@NuvfLOZNzSc~!#FbCt$SDpX$c0Z-L$N$qku>`!?!x-mxlYZmadwkSxstnk&b)zX=L3 z>=!>SWLH+1THw7~+!Yg(obSya3Un1j+C(a~STkGcWJ=~BC-n3KnzF zZ4wO_R9C|rN4L-3$aSVj4M``Zyhi>`@*R*d>o}-M4^p5VEki$@K}w!Yo;Nr!y7NUz z#|!qQTwztPrCM$;xx}3!CYMV8nf_VzGx@Kh|kU=1R7F)DB5gs;>Hx>BlI>44X2KM&)l5&sY71@043Ety0Sm z$_oiRS&x(wJa*e5pn3RkmcI62HOt;?bCZMbLudeD;&3#sk${MZpO25wLFhRMU1h%R zB(zV|yV@TM+*}^OgM`G{f%4($%2-(1vqI#;k8T4c_GM$mX24nhbk3X>!PmR+*ErX^ zGStEBXC-3JIUB63$0y9A^y0;Q=ZK)0*{uv*!YT8*+1F-l-oSN%<4~ZW6GTHx5uDF&#+U zD0?5XPWMWIKcn$!Iu0qfAqcyGKb>ExL1+8+`+MHgcch82TAcQgI~vgIs3yWX$f{g! z`Sh81V)cDWhby*7L%0}ul=M^_-SHb|Xo8E8i%%8$80uwclu^+z^;Pw%)o-(wxHVEV zwyDPz8T15tOpexKV%(K3*|WUmB)^|voH|zBJ>CE9BPJ~0TAGAJZxz}L@RSLEPo1g$ zZ!ck-RemeGvXb>Qhk0d)!}h3HC?T>`FNcd0Cg3^SQn>5O?YC$wBvQxhxasKfHi;c5 zkLy&;VSvLTu1>%`Ql>6SOhPgmq^GA_XgFr&+U8Z;gn=G*H%ET5FH5_KuhF;Apg%A& z`i|*?N!#VE2sG`8@W^}ESey9ipT&B*rR>9ZWS8^$?IVglf9{M3(hdp6HkHAhl+ZNY z9H{$Z*%VTl!GX~Nx+{gMhaP9+fPt}D+pU-&cF#yp3l7e$LU&R(rx>}NSS|Cx{nmwV zq<;8gs3l4YGG!JAu`BkGjQVP7dYj8X^5O3&CKtbGda;GC_vxe|X2_~QcT74j;MrF% z7c0EM#l@w~Rq=Om7+eEv{n^_}J0x38;%7-!8c+7K{%puoYwAR;>~{|FP+hO)(9@l6 ze4C&{o2|6ni)D?avmMrnQq{CmDmF70l;t(kD~#`xH+^r$q&${^u4p1l;T_g3?Y6j;fD@)Nu(NZ#x^27psIYP4P>z26ygf3W zd@AMc-Mia3-NvIA`>++=H%&Lk>bM)6J^MNdD_TONLil}fPnUl%fPaM3TjRdGl?=?B zWL9B#boF$}Rj7iAo#d^zVByToZ6QI1dTT}hTQFE#kJy`rc^o3omlPsI(Ku;AeE2!G|uh6436>7rGxO=S$54V&WJ+($*;|O_~a$eSj_RrS(*fqIzW7Z@!NubM?L5Z>ZEWd;jEYvolS^LawMT}xI zeJsY)U6b@xs(icJ#Wd+JqhqgdM6u3yYPmv%fB#SGCU{ z>qP_k)E_+H?s&gCSfz7Nn(LeKvTt?{(}rqy&n&99geMB8h`@$w(|Z)H`Zv3Ice0?# z0)+^hKE7!07)wairl0K+=Za4=RUGbZy9Hq<$WS*;eve>�Q}q3}qH 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