+
+ {p.matrix && (
+
+ {p.matrix}
+
+ )}
+
+ {Object.entries(ERROR_LABELS).map(([key, label]) => {
+ const e = errors[key];
+ const hit = e?.returned === true;
+ return (
+
+
+ {label}{hit && e?.rtt_ms ? ` ${e.rtt_ms}ms` : ''}
+
+
+ );
+ })}
+
+ {errors.hop_limit_exceeded?.src_ip && (
+
+ FIRST HOP
+ {errors.hop_limit_exceeded.src_ip}
+
+ )}
+ {(p.target_ip || p.target_port) && (
+
+ {p.target_ip && {p.target_ip}}
+ {p.target_port && :{p.target_port}}
+
+ )}
+
+ );
+};
+
export const FingerprintGroup: React.FC<{ fpType: string; items: any[] }> = ({ fpType, items }) => {
const label = fpTypeLabel[fpType] || fpType.toUpperCase().replace(/_/g, ' ');
const icon = fpTypeIcon[fpType] ||