Skip to content

Commit 3bbd571

Browse files
feat: finished stats
1 parent 03bd677 commit 3bbd571

12 files changed

Lines changed: 263 additions & 46 deletions

File tree

src-tauri/src/commands/stats.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ pub fn get_network_infos(state: State<Arc<Mutex<NetworkState>>>) -> Value {
239239
}
240240

241241
use crate::error::NetworkError;
242-
use crate::network::metrics::{DroneMetrics, PacketTypeLabel};
242+
use crate::network::metrics::{DroneMetrics, HostMetricsTimePoint, PacketTypeLabel};
243243
use serde::{Deserialize, Serialize};
244244

245245
#[derive(Serialize, Deserialize)]
@@ -297,7 +297,7 @@ pub fn get_node_info(
297297
NodeType::Client => "Client",
298298
NodeType::Server => "Server",
299299
};
300-
300+
301301
let node_group = metadata.node_group.clone();
302302

303303
let metrics = match metadata.node_type {
@@ -433,6 +433,7 @@ pub fn get_drone_metrics(
433433
pub struct HostStats {
434434
latencies: Vec<Duration>,
435435
number_of_fragment_sent: u64,
436+
time_series: Vec<HostMetricsTimePoint>,
436437
}
437438

438439
#[tauri::command]
@@ -455,8 +456,16 @@ pub fn get_host_metrics(
455456
.map(|m| m.number_of_fragments_sent())
456457
.ok_or_else(|| NetworkError::NodeNotFound(node_id.to_string()))?;
457458

459+
let time_series = state
460+
.metrics
461+
.host_metrics
462+
.get(&node_id)
463+
.map(|m| m.time_series.clone())
464+
.ok_or_else(|| NetworkError::NodeNotFound(node_id.to_string()))?;
465+
458466
Ok(HostStats {
459467
latencies,
460468
number_of_fragment_sent,
469+
time_series,
461470
})
462471
}

src-tauri/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn run() {
3939
if cfg!(debug_assertions) {
4040
app.handle().plugin(
4141
tauri_plugin_log::Builder::default()
42-
.level(log::LevelFilter::Info)
42+
.level(log::LevelFilter::Error)
4343
// .filter(|metadata| metadata.target().starts_with("reactsc"))
4444
.build(),
4545
)?;

src-tauri/src/network/metrics.rs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
use crate::network::state::NodeType;
22
use common_utils::PacketTypeHeader;
3+
use log::error;
34
use serde::{Deserialize, Serialize};
45
use std::collections::HashMap;
56
use std::time::{Duration, SystemTime, UNIX_EPOCH};
67
use wg_2024::network::NodeId;
78
use wg_2024::packet::{Packet, PacketType};
89

10+
const ROLLING_WINDOW_SIZE: usize = 100;
11+
912
// =============================================================================
1013
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Eq, Hash)]
1114
pub enum PacketTypeLabel {
@@ -55,6 +58,8 @@ pub struct DroneMetrics {
5558

5659
pub current_pdr: f32,
5760

61+
pub rolling_window: Vec<bool>,
62+
5863
/// Number of shortcuts used by the drone
5964
pub shortcuts: u64,
6065

@@ -77,15 +82,28 @@ impl DroneMetrics {
7782
}
7883

7984
pub fn update_pdr(&mut self, successful: bool) {
80-
self.current_pdr = self.current_pdr * 0.99 + if successful { 0.00 } else { 0.1 };
85+
// Add success/failure to rolling window
86+
self.rolling_window.push(successful);
87+
if self.rolling_window.len() > ROLLING_WINDOW_SIZE {
88+
self.rolling_window.remove(0);
89+
}
90+
91+
// Compute PDR based on recent `ROLLING_WINDOW_SIZE` packets
92+
let failed = self.rolling_window.iter().filter(|&&s| !s).count() as f32;
93+
self.current_pdr = if self.rolling_window.is_empty() {
94+
0.0
95+
} else {
96+
failed / self.rolling_window.len() as f32
97+
};
8198

8299
let sent = self.number_of_msg_fragments_sent();
83100
let dropped = self.drops;
84-
85101
let timestamp = SystemTime::now()
86102
.duration_since(UNIX_EPOCH)
87103
.map(|d| d.as_secs())
88104
.unwrap_or_default();
105+
106+
// Maintain rolling window for time series
89107
self.time_series.push(MetricsTimePoint {
90108
timestamp,
91109
sent,
@@ -109,6 +127,13 @@ impl DroneMetrics {
109127
// 5. Statistiche per gli host (client/server)
110128
// =============================================================================
111129

130+
#[derive(Debug, Clone, Serialize, Deserialize)]
131+
pub struct HostMetricsTimePoint {
132+
pub timestamp: u64,
133+
pub sent: u64,
134+
pub acked: u64,
135+
}
136+
112137
#[derive(Debug, Default)]
113138
pub struct HostMetrics {
114139
/// For each destination: (sent, acked)
@@ -120,20 +145,40 @@ pub struct HostMetrics {
120145
/// Latency for each message sent by the host. It could be use to compute number of Message sent
121146
pub latencies: Vec<Duration>,
122147
/// Time series for the number of packets sent and dropped
123-
pub time_series: Vec<MetricsTimePoint>,
148+
pub time_series: Vec<HostMetricsTimePoint>,
124149
}
125150

126151
impl HostMetrics {
127152
pub fn record_packet(&mut self, dest: NodeId, packet_type: PacketTypeLabel) {
128153
let entry = self.dest_stats.entry(dest).or_insert((0, 0));
129154
entry.0 += 1;
130155
*self.packet_type_counts.entry(packet_type).or_insert(0) += 1;
156+
157+
if packet_type == PacketTypeLabel::MsgFragment {
158+
self.update_time_series();
159+
}
131160
}
132161

133162
/// Record an ack received by the host from another host.
134163
pub fn record_ack(&mut self, src: NodeId) {
135164
let entry = self.dest_stats.entry(src).or_insert((0, 0));
136165
entry.1 += 1;
166+
167+
self.update_time_series();
168+
}
169+
170+
fn update_time_series(&mut self) {
171+
let timestamp = SystemTime::now()
172+
.duration_since(UNIX_EPOCH)
173+
.map(|d| d.as_secs())
174+
.unwrap_or_default();
175+
let sent = self.dest_stats.values().map(|(s, _)| s).sum();
176+
let acked = self.dest_stats.values().map(|(_, a)| a).sum();
177+
self.time_series.push(HostMetricsTimePoint {
178+
timestamp,
179+
sent,
180+
acked,
181+
});
137182
}
138183

139184
/// Record a shortcut used by the host.
@@ -252,6 +297,12 @@ impl Metrics {
252297
host_metrics.record_packet(destination, packet_type);
253298
}
254299
}
300+
301+
if let Some(current_hop) = packet_header.routing_header.current_hop() {
302+
if matches!(packet_header.pack_type, PacketTypeHeader::MsgFragment) {
303+
self.update_global_heatmap(node_id, current_hop);
304+
}
305+
}
255306
}
256307

257308
/// Update the global heatmap with a packet sent from `src` to `dest`.

src/components/AppSidebar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export function AppSidebar() {
4141
xmlns="http://www.w3.org/2000/svg"
4242
className="h-10 w-full transition-all duration-300"
4343
>
44-
<path fill-rule="evenodd" clip-rule="evenodd"
44+
<path fillRule="evenodd" clipRule="evenodd"
4545
d="M464.171 38.6874C480.731 38.6874 494.239 52.1941 494.239 68.7546C494.239 85.317 480.731 98.8237 464.171 98.8237C447.609 98.8237 434.102 85.317 434.102 68.7546C434.102 52.1941 447.609 38.6874 464.171 38.6874Z"
4646
fill="currentColor"/>
4747
<path
@@ -73,7 +73,7 @@ export function AppSidebar() {
7373
<path
7474
d="M113.993 74.7L107.493 68.1C106.359 67.4333 105.059 67 103.593 66.8C103.526 70.2 103.493 73.5667 103.493 76.9V85.6C103.493 88.3333 103.626 90.1667 103.893 91.1C104.426 93.1667 105.659 94.2 107.593 94.2H108.593V97H83.3926V94.2H84.3926C86.3259 94.2 87.5592 93.1667 88.0926 91.1C88.3592 90.1667 88.4926 88.3333 88.4926 85.6V40.6C88.4926 37.8667 88.3592 36.0333 88.0926 35.1C87.5592 33.0333 86.3259 32 84.3926 32H83.3926V29.2H117.193C121.059 29.2 124.426 29.6667 127.293 30.6C135.959 33.5333 140.293 39.3333 140.293 48C140.293 49.9333 139.926 51.7667 139.193 53.5C136.859 58.8333 131.993 62.6 124.593 64.8C131.193 75.8667 137.126 84.1 142.393 89.5C145.393 92.6333 147.526 94.2 148.793 94.2V97H124.993C125.459 96.1333 125.693 95.3667 125.693 94.7C125.693 93.9667 124.993 92.5333 123.593 90.4C120.459 85.7333 117.259 80.5 113.993 74.7ZM103.593 62.8C106.126 63.1333 108.159 63.3 109.693 63.3C114.093 63.3 117.426 62.3 119.693 60.3C122.426 57.8333 123.793 53.8667 123.793 48.4C123.793 47.7333 123.593 46.7 123.193 45.3C122.659 43.4333 121.826 41.8 120.693 40.4C118.293 37.5333 114.726 36.1 109.993 36.1C108.126 36.1 106.259 36.2667 104.393 36.6C104.326 37.6 104.259 39.0333 104.193 40.9C104.126 42.7667 104.059 44 103.993 44.6C103.926 47.2 103.859 50.0333 103.793 53.1L103.593 62.8ZM200.6 44.7C200.6 42.1 200.434 39.9667 200.1 38.3C199.234 34.0333 197.367 31.9 194.5 31.9H192.1V29.1L217.2 29.2V32H216.2C214.734 32 213.6 32.8667 212.8 34.6C211.8 36.7333 211.3 40.4333 211.3 45.7V73.1C211.3 80.6333 208.734 86.7667 203.6 91.5C198.534 96.2333 192.134 98.6 184.4 98.6C177.267 98.6 171.2 96.4667 166.2 92.2C160.667 87.5333 157.9 81.1667 157.9 73.1V40.6C157.9 37.8667 157.767 36.0333 157.5 35.1C156.967 33.0333 155.734 32 153.8 32H152.8V29.2H178.5V32H177.5C175.634 32 174.4 33.0333 173.8 35.1C173.6 35.9667 173.467 37.8 173.4 40.6C173.134 52.9333 173 64.2667 173 74.6C173 78.1333 173.934 81.2667 175.8 84C177.734 86.6667 180.4 88.5667 183.8 89.7C184.734 90.0333 185.867 90.2 187.2 90.2C188.4 90.2 189.6 89.9667 190.8 89.5C192.667 88.8333 194.334 87.8 195.8 86.4C199 83.2667 200.6 78.9667 200.6 73.5V44.7ZM270.968 30.2V45C269.235 42.6667 267.202 40.7333 264.868 39.2C262.868 37.8667 260.602 36.8 258.068 36C255.935 35.3333 253.668 35 251.268 35C248.602 35 246.168 35.5667 243.968 36.7C242.902 37.2333 242.235 37.6333 241.968 37.9C241.768 38.1 241.068 39 239.868 40.6C239.468 41.1333 239.202 41.9 239.068 42.9C238.868 43.9667 238.868 44.7667 239.068 45.3C239.802 47.5 240.468 48.9 241.068 49.5C243.135 51.0333 244.868 52.2 246.268 53C249.268 54.4 251.668 55.4333 253.468 56.1C254.468 56.5667 256.335 57.2 259.068 58C261.402 58.6667 263.035 59.3 263.968 59.9C271.502 64.6333 275.268 70.6667 275.268 78C275.268 83.7333 272.835 88.6 267.968 92.6C263.102 96.5333 256.868 98.5 249.268 98.5C245.202 98.5 240.635 98.0333 235.568 97.1C233.502 96.3667 232.002 95.7333 231.068 95.2C230.535 95.0667 229.902 95.1 229.168 95.3C228.235 95.5667 227.702 95.7 227.568 95.7V86.2L227.368 78.5C229.968 80.8333 231.668 82.3667 232.468 83.1C234.002 84.8333 235.835 86.1667 237.968 87.1C240.568 88.3 242.402 89.0333 243.468 89.3C246.735 90.1667 248.868 90.6 249.868 90.6C253.735 90.6 256.602 89.7667 258.468 88.1C260.135 86.5667 261.335 84.8 262.068 82.8C262.535 81.5333 262.502 80.3 261.968 79.1C261.568 78.1667 260.402 76.8 258.468 75C256.268 73.6667 254.468 72.7 253.068 72.1C250.202 71.0333 247.935 70.3 246.268 69.9C240.202 67.1667 235.835 64.4667 233.168 61.8C229.502 58.1333 227.668 53.4333 227.668 47.7C227.668 42.7 229.735 38.2 233.868 34.2C238.402 29.8 244.602 27.6 252.468 27.6C255.535 27.6 259.335 28.0333 263.868 28.9C265.935 29.6333 267.402 30.2667 268.268 30.8C268.802 30.9333 269.368 30.8667 269.968 30.6C270.568 30.3333 270.902 30.2 270.968 30.2ZM328.36 37.8C326.226 37.7333 322.76 37.6333 317.96 37.5C317.893 40.1667 317.826 43.1 317.76 46.3C317.626 50.7667 317.526 59.7667 317.46 73.3L317.36 85.6C317.36 88.3333 317.493 90.1667 317.76 91.1C318.293 93.1667 319.526 94.2 321.46 94.2H322.46V97H297.26V94.2H298.26C300.193 94.2 301.426 93.1667 301.96 91.1C302.226 90.1667 302.36 88.3333 302.36 85.6L302.26 37.5C300.926 37.5667 298.16 37.6 293.96 37.6C291.093 37.6 289.093 37.7 287.96 37.9C286.293 38.1667 284.626 38.8667 282.96 40C282.226 40.4667 281.66 40.9 281.26 41.3C280.593 41.9667 280.26 42.6667 280.26 43.4L280.16 39.1V29.2H339.76L339.66 35.7V44C337.593 40.4 335.326 38.4333 332.86 38.1L328.36 37.8ZM366.486 81.8C366.486 83.4667 366.586 86.1667 366.786 89.9C370.852 89.8333 373.952 89.8 376.086 89.8C381.086 89.8 384.386 89.0333 385.986 87.5C387.252 86.2333 388.086 85.2 388.486 84.4C389.019 83.3333 389.286 81.7333 389.286 79.6C389.286 78.6 389.019 77.2333 388.486 75.5C387.952 73.7 386.986 72.0333 385.586 70.5C382.519 67.2333 377.786 65.6 371.386 65.6H366.486C366.419 69.1333 366.386 72.6667 366.386 76.2C366.386 77.3333 366.419 78.2667 366.486 79C366.486 79.6667 366.486 80.6 366.486 81.8ZM366.686 58H374.286C380.352 58 383.952 55.2667 385.086 49.8C385.286 48.8667 385.386 47.8 385.386 46.6C385.386 46.0667 385.152 45 384.686 43.4C384.286 41.8 383.586 40.4 382.586 39.2C380.386 36.5333 377.086 35.2 372.686 35.2C371.086 35.2 369.119 35.3667 366.786 35.7C366.719 38.5667 366.686 46 366.686 58ZM346.186 97V94.2H347.186C349.119 94.2 350.352 93.1667 350.886 91.1C351.152 90.1667 351.286 88.3333 351.286 85.6V40.6C351.286 37.8667 351.152 36.0333 350.886 35.1C350.352 33.0333 349.119 32 347.186 32H346.186V29.2H375.486C380.019 29.2 383.919 29.6667 387.186 30.6C396.452 33.2667 401.086 38.5 401.086 46.3C401.086 50.9 399.252 54.5333 395.586 57.2C392.452 59.4 388.419 60.6333 383.486 60.9V61.7C387.486 61.9667 390.886 62.6333 393.686 63.7C401.552 66.7667 405.486 72.1333 405.486 79.8C405.486 85.1333 403.519 89.2333 399.586 92.1C395.052 95.3667 387.986 97 378.386 97H346.186ZM559.25 30.2V45C557.516 42.6667 555.483 40.7333 553.15 39.2C551.15 37.8667 548.883 36.8 546.35 36C544.216 35.3333 541.95 35 539.55 35C536.883 35 534.45 35.5667 532.25 36.7C531.183 37.2333 530.516 37.6333 530.25 37.9C530.05 38.1 529.35 39 528.15 40.6C527.75 41.1333 527.483 41.9 527.35 42.9C527.15 43.9667 527.15 44.7667 527.35 45.3C528.083 47.5 528.75 48.9 529.35 49.5C531.416 51.0333 533.15 52.2 534.55 53C537.55 54.4 539.95 55.4333 541.75 56.1C542.75 56.5667 544.616 57.2 547.35 58C549.683 58.6667 551.316 59.3 552.25 59.9C559.783 64.6333 563.55 70.6667 563.55 78C563.55 83.7333 561.116 88.6 556.25 92.6C551.383 96.5333 545.15 98.5 537.55 98.5C533.483 98.5 528.916 98.0333 523.85 97.1C521.783 96.3667 520.283 95.7333 519.35 95.2C518.816 95.0667 518.183 95.1 517.45 95.3C516.516 95.5667 515.983 95.7 515.85 95.7V86.2L515.65 78.5C518.25 80.8333 519.95 82.3667 520.75 83.1C522.283 84.8333 524.116 86.1667 526.25 87.1C528.85 88.3 530.683 89.0333 531.75 89.3C535.016 90.1667 537.15 90.6 538.15 90.6C542.016 90.6 544.883 89.7667 546.75 88.1C548.416 86.5667 549.616 84.8 550.35 82.8C550.816 81.5333 550.783 80.3 550.25 79.1C549.85 78.1667 548.683 76.8 546.75 75C544.55 73.6667 542.75 72.7 541.35 72.1C538.483 71.0333 536.216 70.3 534.55 69.9C528.483 67.1667 524.116 64.4667 521.45 61.8C517.783 58.1333 515.95 53.4333 515.95 47.7C515.95 42.7 518.016 38.2 522.15 34.2C526.683 29.8 532.883 27.6 540.75 27.6C543.816 27.6 547.616 28.0333 552.15 28.9C554.216 29.6333 555.683 30.2667 556.55 30.8C557.083 30.9333 557.65 30.8667 558.25 30.6C558.85 30.3333 559.183 30.2 559.25 30.2ZM616.641 37.8C614.508 37.7333 611.041 37.6333 606.241 37.5C606.174 40.1667 606.108 43.1 606.041 46.3C605.908 50.7667 605.808 59.7667 605.741 73.3L605.641 85.6C605.641 88.3333 605.774 90.1667 606.041 91.1C606.574 93.1667 607.808 94.2 609.741 94.2H610.741V97H585.541V94.2H586.541C588.474 94.2 589.708 93.1667 590.241 91.1C590.508 90.1667 590.641 88.3333 590.641 85.6L590.541 37.5C589.208 37.5667 586.441 37.6 582.241 37.6C579.374 37.6 577.374 37.7 576.241 37.9C574.574 38.1667 572.908 38.8667 571.241 40C570.508 40.4667 569.941 40.9 569.541 41.3C568.874 41.9667 568.541 42.6667 568.541 43.4L568.441 39.1V29.2H628.041L627.941 35.7V44C625.874 40.4 623.608 38.4333 621.141 38.1L616.641 37.8ZM673.567 68.2L668.867 66.6L654.667 67C654.6 70.7333 654.567 73.5 654.567 75.3V81.5C654.567 84.9667 655.667 87.3 657.867 88.5C659.467 89.3667 662.167 89.8 665.967 89.8C669.567 89.8 672.733 89.3667 675.467 88.5C680.6 86.8333 684.3 83.9 686.567 79.7C686.833 79.1667 687.267 78.6667 687.867 78.2C688.267 77.8667 688.533 77.3 688.667 76.5H691.467L690.467 97H634.467V94.2H635.467C637.4 94.2 638.633 93.1667 639.167 91.1C639.433 90.1667 639.567 88.3333 639.567 85.6V40.6C639.567 37.8667 639.433 36.0333 639.167 35.1C638.633 33.0333 637.4 32 635.467 32H634.467V29.2H686.467L686.967 48.8H684.167C684.033 46.8 683.5 45.3333 682.567 44.4C681.3 43.3333 680.033 42.3 678.767 41.3C675.5 38.5 670.633 37.1 664.167 37.1H655.167C655.033 43.3 654.967 46.9 654.967 47.9C654.967 52.5 654.967 55.6667 654.967 57.4H660.067C665.067 57.4 667.833 57.3333 668.367 57.2C668.9 57 669.267 56.9 669.467 56.9C669.533 56.9 669.567 56.9 669.567 56.9C669.633 56.9 669.667 56.9 669.667 56.9C669.667 56.9 669.7 56.9 669.767 56.9L671.667 56.2L673.567 54.7V68.2ZM730.008 74.7L723.508 68.1C722.375 67.4333 721.075 67 719.608 66.8C719.542 70.2 719.508 73.5667 719.508 76.9V85.6C719.508 88.3333 719.642 90.1667 719.908 91.1C720.442 93.1667 721.675 94.2 723.608 94.2H724.608V97H699.408V94.2H700.408C702.342 94.2 703.575 93.1667 704.108 91.1C704.375 90.1667 704.508 88.3333 704.508 85.6V40.6C704.508 37.8667 704.375 36.0333 704.108 35.1C703.575 33.0333 702.342 32 700.408 32H699.408V29.2H733.208C737.075 29.2 740.442 29.6667 743.308 30.6C751.975 33.5333 756.308 39.3333 756.308 48C756.308 49.9333 755.942 51.7667 755.208 53.5C752.875 58.8333 748.008 62.6 740.608 64.8C747.208 75.8667 753.142 84.1 758.408 89.5C761.408 92.6333 763.542 94.2 764.808 94.2V97H741.008C741.475 96.1333 741.708 95.3667 741.708 94.7C741.708 93.9667 741.008 92.5333 739.608 90.4C736.475 85.7333 733.275 80.5 730.008 74.7ZM719.608 62.8C722.142 63.1333 724.175 63.3 725.708 63.3C730.108 63.3 733.442 62.3 735.708 60.3C738.442 57.8333 739.808 53.8667 739.808 48.4C739.808 47.7333 739.608 46.7 739.208 45.3C738.675 43.4333 737.842 41.8 736.708 40.4C734.308 37.5333 730.742 36.1 726.008 36.1C724.142 36.1 722.275 36.2667 720.408 36.6C720.342 37.6 720.275 39.0333 720.208 40.9C720.142 42.7667 720.075 44 720.008 44.6C719.942 47.2 719.875 50.0333 719.808 53.1L719.608 62.8ZM814.816 30.2V45C813.083 42.6667 811.049 40.7333 808.716 39.2C806.716 37.8667 804.449 36.8 801.916 36C799.783 35.3333 797.516 35 795.116 35C792.449 35 790.016 35.5667 787.816 36.7C786.749 37.2333 786.083 37.6333 785.816 37.9C785.616 38.1 784.916 39 783.716 40.6C783.316 41.1333 783.049 41.9 782.916 42.9C782.716 43.9667 782.716 44.7667 782.916 45.3C783.649 47.5 784.316 48.9 784.916 49.5C786.983 51.0333 788.716 52.2 790.116 53C793.116 54.4 795.516 55.4333 797.316 56.1C798.316 56.5667 800.183 57.2 802.916 58C805.249 58.6667 806.883 59.3 807.816 59.9C815.349 64.6333 819.116 70.6667 819.116 78C819.116 83.7333 816.683 88.6 811.816 92.6C806.949 96.5333 800.716 98.5 793.116 98.5C789.049 98.5 784.483 98.0333 779.416 97.1C777.349 96.3667 775.849 95.7333 774.916 95.2C774.383 95.0667 773.749 95.1 773.016 95.3C772.083 95.5667 771.549 95.7 771.416 95.7V86.2L771.216 78.5C773.816 80.8333 775.516 82.3667 776.316 83.1C777.849 84.8333 779.683 86.1667 781.816 87.1C784.416 88.3 786.249 89.0333 787.316 89.3C790.583 90.1667 792.716 90.6 793.716 90.6C797.583 90.6 800.449 89.7667 802.316 88.1C803.983 86.5667 805.183 84.8 805.916 82.8C806.383 81.5333 806.349 80.3 805.816 79.1C805.416 78.1667 804.249 76.8 802.316 75C800.116 73.6667 798.316 72.7 796.916 72.1C794.049 71.0333 791.783 70.3 790.116 69.9C784.049 67.1667 779.683 64.4667 777.016 61.8C773.349 58.1333 771.516 53.4333 771.516 47.7C771.516 42.7 773.583 38.2 777.716 34.2C782.249 29.8 788.449 27.6 796.316 27.6C799.383 27.6 803.183 28.0333 807.716 28.9C809.783 29.6333 811.249 30.2667 812.116 30.8C812.649 30.9333 813.216 30.8667 813.816 30.6C814.416 30.3333 814.749 30.2 814.816 30.2Z"
7575
fill="currentColor"/>
76-
<path fill-rule="evenodd" clip-rule="evenodd"
76+
<path fillRule="evenodd" clipRule="evenodd"
7777
d="M464.171 38.6874C480.731 38.6874 494.239 52.1941 494.239 68.7546C494.239 85.317 480.731 98.8237 464.171 98.8237C447.609 98.8237 434.102 85.317 434.102 68.7546C434.102 52.1941 447.609 38.6874 464.171 38.6874Z"
7878
fill="black"/>
7979
<path

0 commit comments

Comments
 (0)