whopper 0.1.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +3 -2
  2. package/dist/analyzer/apply.d.ts +2 -2
  3. package/dist/analyzer/apply.d.ts.map +1 -1
  4. package/dist/analyzer/apply.js +60 -15
  5. package/dist/analyzer/apply.js.map +1 -1
  6. package/dist/analyzer/apply.test.js +143 -9
  7. package/dist/analyzer/apply.test.js.map +1 -1
  8. package/dist/analyzer/index.d.ts +2 -2
  9. package/dist/analyzer/index.d.ts.map +1 -1
  10. package/dist/analyzer/index.js +2 -2
  11. package/dist/analyzer/index.js.map +1 -1
  12. package/dist/analyzer/index.test.js +20 -7
  13. package/dist/analyzer/index.test.js.map +1 -1
  14. package/dist/analyzer/types.d.ts +0 -4
  15. package/dist/analyzer/types.d.ts.map +1 -1
  16. package/dist/analyzer/util.d.ts +0 -1
  17. package/dist/analyzer/util.d.ts.map +1 -1
  18. package/dist/analyzer/util.js +0 -8
  19. package/dist/analyzer/util.js.map +1 -1
  20. package/dist/browser/index.d.ts +1 -1
  21. package/dist/browser/index.d.ts.map +1 -1
  22. package/dist/browser/index.js +174 -5
  23. package/dist/browser/index.js.map +1 -1
  24. package/dist/browser/index.test.js +957 -2
  25. package/dist/browser/index.test.js.map +1 -1
  26. package/dist/browser/types.d.ts +6 -0
  27. package/dist/browser/types.d.ts.map +1 -1
  28. package/dist/browser/utils.d.ts +1 -0
  29. package/dist/browser/utils.d.ts.map +1 -1
  30. package/dist/browser/utils.js +3 -0
  31. package/dist/browser/utils.js.map +1 -1
  32. package/dist/browser/utils.test.js +9 -2
  33. package/dist/browser/utils.test.js.map +1 -1
  34. package/dist/commands/detect.d.ts.map +1 -1
  35. package/dist/commands/detect.js +12 -20
  36. package/dist/commands/detect.js.map +1 -1
  37. package/dist/commands/detect.test.js +31 -10
  38. package/dist/commands/detect.test.js.map +1 -1
  39. package/dist/commands/detect_types.d.ts +4 -2
  40. package/dist/commands/detect_types.d.ts.map +1 -1
  41. package/dist/commands/detect_utils.d.ts +2 -1
  42. package/dist/commands/detect_utils.d.ts.map +1 -1
  43. package/dist/commands/detect_utils.js +70 -54
  44. package/dist/commands/detect_utils.js.map +1 -1
  45. package/dist/commands/detect_utils.test.js +158 -35
  46. package/dist/commands/detect_utils.test.js.map +1 -1
  47. package/dist/commands/version.test.d.ts +2 -0
  48. package/dist/commands/version.test.d.ts.map +1 -0
  49. package/dist/commands/version.test.js +27 -0
  50. package/dist/commands/version.test.js.map +1 -0
  51. package/dist/e2e/cli.e2e.test.js +1 -1
  52. package/dist/e2e/cli.e2e.test.js.map +1 -1
  53. package/dist/logger/types.js +2 -2
  54. package/dist/logger/types.js.map +1 -1
  55. package/dist/signatures/_types.d.ts +2 -0
  56. package/dist/signatures/_types.d.ts.map +1 -1
  57. package/dist/signatures/index.d.ts.map +1 -1
  58. package/dist/signatures/index.js +2 -0
  59. package/dist/signatures/index.js.map +1 -1
  60. package/dist/signatures/nginx.d.ts.map +1 -1
  61. package/dist/signatures/nginx.js +7 -7
  62. package/dist/signatures/nginx.js.map +1 -1
  63. package/dist/signatures/signatures.test.js +10 -0
  64. package/dist/signatures/signatures.test.js.map +1 -1
  65. package/dist/signatures/technologies/cloudflare.d.ts +3 -0
  66. package/dist/signatures/technologies/cloudflare.d.ts.map +1 -0
  67. package/dist/signatures/technologies/cloudflare.js +20 -0
  68. package/dist/signatures/technologies/cloudflare.js.map +1 -0
  69. package/dist/signatures/technologies/nginx.d.ts.map +1 -1
  70. package/dist/signatures/technologies/nginx.js +1 -0
  71. package/dist/signatures/technologies/nginx.js.map +1 -1
  72. package/dist/signatures/technologies/wordpress.d.ts.map +1 -1
  73. package/dist/signatures/technologies/wordpress.js +1 -0
  74. package/dist/signatures/technologies/wordpress.js.map +1 -1
  75. package/package.json +1 -1
  76. package/dist/signatures/nextjs.d.ts +0 -3
  77. package/dist/signatures/nextjs.d.ts.map +0 -1
  78. package/dist/signatures/nextjs.js +0 -16
  79. package/dist/signatures/nextjs.js.map +0 -1
@@ -12,41 +12,61 @@ export function colorizeConfidence(confidence) {
12
12
  return confidence;
13
13
  }
14
14
  }
15
- export function makeDetectCommandOutput(detections, signatures) {
16
- // Handle directly detected softwares
17
- const detectedSoftwares = detections.map((detection) => {
15
+ function compareMaybeString(a, b) {
16
+ return (a ?? "").localeCompare(b ?? "");
17
+ }
18
+ function compareEvidence(a, b) {
19
+ return (compareMaybeString(a.type, b.type) ||
20
+ compareMaybeString(a.value, b.value) ||
21
+ compareMaybeString(a.version, b.version) ||
22
+ compareMaybeString(a.confidence, b.confidence) ||
23
+ compareMaybeString(a.host, b.host) ||
24
+ compareMaybeString(a.sourceUrl, b.sourceUrl));
25
+ }
26
+ export function makeDetectCommandOutput(urls, detections, signatures) {
27
+ // Handle directly detected softwares (one entry per version)
28
+ const detectedSoftwares = detections.flatMap((detection) => {
18
29
  const signature = signatures.find((signature) => signature.name === detection.name);
19
- const detectedSoftware = {
20
- name: detection.name,
21
- confidence: maxConfidence(detection.evidences?.map((e) => e.confidence) || []),
22
- };
23
- if (signature.description) {
24
- detectedSoftware.description = signature.description;
25
- }
26
- const evidences = detection.evidences;
27
- if (evidences && evidences.length > 0) {
28
- detectedSoftware.evidences = evidences;
29
- }
30
- const versions = [
31
- ...new Set(evidences
32
- ?.map((evidence) => evidence.version)
33
- .filter((v) => v !== undefined)),
34
- ];
35
- if (versions && versions.length > 0) {
36
- detectedSoftware.versions = versions;
30
+ const evidences = [...(detection.evidences || [])].sort(compareEvidence);
31
+ // Group evidences by version
32
+ const versionGroups = new Map();
33
+ for (const evidence of evidences) {
34
+ const key = evidence.version;
35
+ if (!versionGroups.has(key)) {
36
+ versionGroups.set(key, []);
37
+ }
38
+ versionGroups.get(key).push(evidence);
37
39
  }
38
- const cpes = signature.cpe
39
- ? [
40
- ...new Set(evidences
41
- ?.map((evidence) => evidence.version)
42
- .filter((v) => v !== undefined)
43
- .map((version) => signature.cpe + ":" + version)),
44
- ]
45
- : undefined;
46
- if (cpes && cpes.length > 0) {
47
- detectedSoftware.cpes = cpes;
40
+ // If no evidences, create a single entry
41
+ if (versionGroups.size === 0) {
42
+ const ds = {
43
+ name: detection.name,
44
+ confidence: maxConfidence([]),
45
+ };
46
+ if (signature.description) {
47
+ ds.description = signature.description;
48
+ }
49
+ return [ds];
48
50
  }
49
- return detectedSoftware;
51
+ return [...versionGroups.entries()].map(([version, versionEvidences]) => {
52
+ const ds = {
53
+ name: detection.name,
54
+ confidence: maxConfidence(versionEvidences.map((e) => e.confidence)),
55
+ };
56
+ if (signature.description) {
57
+ ds.description = signature.description;
58
+ }
59
+ if (versionEvidences.length > 0) {
60
+ ds.evidences = versionEvidences;
61
+ }
62
+ if (version) {
63
+ ds.version = version;
64
+ if (signature.cpe) {
65
+ ds.cpe = signature.cpe + ":" + version;
66
+ }
67
+ }
68
+ return ds;
69
+ });
50
70
  });
51
71
  // Handle implied softwares
52
72
  const impliedSoftwares = detectedSoftwares.flatMap((detectedSoftware) => {
@@ -68,12 +88,13 @@ export function makeDetectCommandOutput(detections, signatures) {
68
88
  return [impliedSoftware];
69
89
  });
70
90
  });
71
- const mergedByName = new Map();
91
+ const mergedByKey = new Map();
72
92
  const allSoftwares = [...detectedSoftwares, ...impliedSoftwares];
73
93
  for (const software of allSoftwares) {
74
- const existing = mergedByName.get(software.name);
94
+ const key = software.name + "|" + (software.version || "");
95
+ const existing = mergedByKey.get(key);
75
96
  if (!existing) {
76
- mergedByName.set(software.name, software);
97
+ mergedByKey.set(key, software);
77
98
  continue;
78
99
  }
79
100
  const impliedBy = [
@@ -89,50 +110,45 @@ export function makeDetectCommandOutput(detections, signatures) {
89
110
  if (description) {
90
111
  merged.description = description;
91
112
  }
92
- const versions = [
93
- ...new Set([...(existing.versions || []), ...(software.versions || [])]),
94
- ];
95
- if (versions.length > 0) {
96
- merged.versions = versions;
113
+ if (existing.version) {
114
+ merged.version = existing.version;
97
115
  }
98
- const cpes = [
99
- ...new Set([...(existing.cpes || []), ...(software.cpes || [])]),
100
- ];
101
- if (cpes.length > 0) {
102
- merged.cpes = cpes;
116
+ if (existing.cpe) {
117
+ merged.cpe = existing.cpe;
103
118
  }
104
119
  const evidences = [
105
120
  ...(existing.evidences || []),
106
121
  ...(software.evidences || []),
107
- ];
122
+ ].sort(compareEvidence);
108
123
  if (evidences.length > 0) {
109
124
  merged.evidences = evidences;
110
125
  }
111
126
  if (uniqueImpliedBy.length > 0) {
112
127
  merged.impliedBy = uniqueImpliedBy.join(", ");
113
128
  }
114
- mergedByName.set(software.name, merged);
129
+ mergedByKey.set(key, merged);
115
130
  }
116
131
  return {
117
- detectedSoftwares: [...mergedByName.values()],
132
+ urls,
133
+ detectedSoftwares: [...mergedByKey.values()],
118
134
  };
119
135
  }
120
136
  export function printDetectCommandOutputAsText(output, showEvidence) {
121
137
  console.log();
122
138
  for (const detection of output.detectedSoftwares) {
123
139
  let message = `* ${chalk.green(detection.name)}`;
124
- const versions = [
125
- ...new Set(detection.evidences?.map((e) => e.version).filter((v) => v)),
126
- ];
127
- if (versions.length > 0) {
128
- message += ` ${versions.join(", ")}`;
140
+ if (detection.version) {
141
+ message += ` ${detection.version}`;
129
142
  }
130
143
  console.log(message);
131
144
  if (!showEvidence) {
132
145
  continue;
133
146
  }
134
147
  for (const evidence of detection.evidences || []) {
135
- console.log(` [${evidence.type}] ${evidence.value}`);
148
+ const evidenceValue = evidence.type === "body" && evidence.sourceUrl
149
+ ? evidence.sourceUrl
150
+ : evidence.value;
151
+ console.log(` [${evidence.type}] ${evidenceValue}`);
136
152
  }
137
153
  if (detection.impliedBy) {
138
154
  console.log(` [implied] ${detection.impliedBy}`);
@@ -1 +1 @@
1
- {"version":3,"file":"detect_utils.js","sourceRoot":"","sources":["../../src/commands/detect_utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect_utils.js","sourceRoot":"","sources":["../../src/commands/detect_utils.ts"],"names":[],"mappings":"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"}
@@ -40,12 +40,12 @@ describe("makeDetectCommandOutput", () => {
40
40
  ],
41
41
  },
42
42
  ];
43
- const result = makeDetectCommandOutput(detections, baseSignatures);
43
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
44
44
  expect(result.detectedSoftwares).toHaveLength(1);
45
45
  expect(result.detectedSoftwares[0].name).toBe("nginx");
46
46
  expect(result.detectedSoftwares[0].description).toBe("Web server");
47
47
  expect(result.detectedSoftwares[0].confidence).toBe("high");
48
- expect(result.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
48
+ expect(result.detectedSoftwares[0].version).toBe("1.20.0");
49
49
  });
50
50
  it("should generate CPEs when signature has cpe", () => {
51
51
  const detections = [
@@ -61,10 +61,8 @@ describe("makeDetectCommandOutput", () => {
61
61
  ],
62
62
  },
63
63
  ];
64
- const result = makeDetectCommandOutput(detections, baseSignatures);
65
- expect(result.detectedSoftwares[0].cpes).toEqual([
66
- "cpe:2.3:a:nginx:nginx:1.20.0",
67
- ]);
64
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
65
+ expect(result.detectedSoftwares[0].cpe).toBe("cpe:2.3:a:nginx:nginx:1.20.0");
68
66
  });
69
67
  it("should not include cpes when signature has no cpe", () => {
70
68
  const detections = [
@@ -80,20 +78,20 @@ describe("makeDetectCommandOutput", () => {
80
78
  ],
81
79
  },
82
80
  ];
83
- const result = makeDetectCommandOutput(detections, baseSignatures);
84
- expect(result.detectedSoftwares[0].cpes).toBeUndefined();
81
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
82
+ expect(result.detectedSoftwares[0].cpe).toBeUndefined();
85
83
  });
86
84
  });
87
85
  describe("confidence calculation", () => {
88
- it("should use highest confidence from evidences", () => {
86
+ it("should use highest confidence from evidences with same version", () => {
89
87
  const detections = [
90
88
  {
91
89
  name: "nginx",
92
90
  evidences: [
93
91
  {
94
92
  type: "header",
95
- value: "nginx",
96
- version: undefined,
93
+ value: "nginx/1.20.0",
94
+ version: "1.20.0",
97
95
  confidence: "low",
98
96
  },
99
97
  {
@@ -105,8 +103,9 @@ describe("makeDetectCommandOutput", () => {
105
103
  ],
106
104
  },
107
105
  ];
108
- const result = makeDetectCommandOutput(detections, baseSignatures);
109
- expect(result.detectedSoftwares[0].confidence).toBe("high");
106
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
107
+ const nginx = result.detectedSoftwares.find((s) => s.version === "1.20.0");
108
+ expect(nginx.confidence).toBe("high");
110
109
  });
111
110
  });
112
111
  describe("implied softwares", () => {
@@ -124,7 +123,7 @@ describe("makeDetectCommandOutput", () => {
124
123
  ],
125
124
  },
126
125
  ];
127
- const result = makeDetectCommandOutput(detections, baseSignatures);
126
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
128
127
  const names = result.detectedSoftwares.map((s) => s.name);
129
128
  expect(names).toContain("WordPress");
130
129
  expect(names).toContain("PHP");
@@ -144,7 +143,7 @@ describe("makeDetectCommandOutput", () => {
144
143
  ],
145
144
  },
146
145
  ];
147
- const result = makeDetectCommandOutput(detections, baseSignatures);
146
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
148
147
  const php = result.detectedSoftwares.find((s) => s.name === "PHP");
149
148
  expect(php?.impliedBy).toBe("WordPress");
150
149
  });
@@ -173,7 +172,7 @@ describe("makeDetectCommandOutput", () => {
173
172
  ],
174
173
  },
175
174
  ];
176
- const result = makeDetectCommandOutput(detections, baseSignatures);
175
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
177
176
  const phpInstances = result.detectedSoftwares.filter((s) => s.name === "PHP");
178
177
  expect(phpInstances).toHaveLength(1);
179
178
  });
@@ -199,8 +198,8 @@ describe("makeDetectCommandOutput", () => {
199
198
  ],
200
199
  },
201
200
  ];
202
- const result = makeDetectCommandOutput(detections, baseSignatures);
203
- expect(result.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
201
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
202
+ expect(result.detectedSoftwares[0].version).toBe("1.20.0");
204
203
  });
205
204
  it("should merge implied software from multiple sources", () => {
206
205
  const signatures = [
@@ -232,14 +231,14 @@ describe("makeDetectCommandOutput", () => {
232
231
  ],
233
232
  },
234
233
  ];
235
- const result = makeDetectCommandOutput(detections, signatures);
234
+ const result = makeDetectCommandOutput([], detections, signatures);
236
235
  const js = result.detectedSoftwares.find((s) => s.name === "JavaScript");
237
236
  expect(js).toBeDefined();
238
237
  expect(js.impliedBy).toContain("React");
239
238
  expect(js.impliedBy).toContain("Vue");
240
239
  expect(js.confidence).toBe("high"); // Should use highest confidence
241
240
  });
242
- it("should merge versions and cpes when same software detected multiple ways", () => {
241
+ it("should create separate entries when same software has different versions", () => {
243
242
  const signatures = [
244
243
  { name: "nginx", cpe: "cpe:2.3:a:nginx:nginx" },
245
244
  ];
@@ -267,15 +266,19 @@ describe("makeDetectCommandOutput", () => {
267
266
  ],
268
267
  },
269
268
  ];
270
- const result = makeDetectCommandOutput(detections, signatures);
271
- const nginx = result.detectedSoftwares.find((s) => s.name === "nginx");
272
- expect(nginx).toBeDefined();
273
- expect(nginx.versions).toContain("1.18.0");
274
- expect(nginx.versions).toContain("1.20.0");
275
- expect(nginx.cpes).toContain("cpe:2.3:a:nginx:nginx:1.18.0");
276
- expect(nginx.cpes).toContain("cpe:2.3:a:nginx:nginx:1.20.0");
277
- expect(nginx.confidence).toBe("high");
278
- expect(nginx.evidences).toHaveLength(2);
269
+ const result = makeDetectCommandOutput([], detections, signatures);
270
+ const nginxEntries = result.detectedSoftwares.filter((s) => s.name === "nginx");
271
+ expect(nginxEntries).toHaveLength(2);
272
+ const v1180 = nginxEntries.find((s) => s.version === "1.18.0");
273
+ expect(v1180).toBeDefined();
274
+ expect(v1180.cpe).toBe("cpe:2.3:a:nginx:nginx:1.18.0");
275
+ expect(v1180.confidence).toBe("medium");
276
+ expect(v1180.evidences).toHaveLength(1);
277
+ const v1200 = nginxEntries.find((s) => s.version === "1.20.0");
278
+ expect(v1200).toBeDefined();
279
+ expect(v1200.cpe).toBe("cpe:2.3:a:nginx:nginx:1.20.0");
280
+ expect(v1200.confidence).toBe("high");
281
+ expect(v1200.evidences).toHaveLength(1);
279
282
  });
280
283
  it("should merge description from existing or new software", () => {
281
284
  const signatures = [
@@ -285,22 +288,110 @@ describe("makeDetectCommandOutput", () => {
285
288
  { name: "nginx" },
286
289
  { name: "nginx" },
287
290
  ];
288
- const result = makeDetectCommandOutput(detections, signatures);
291
+ const result = makeDetectCommandOutput([], detections, signatures);
289
292
  expect(result.detectedSoftwares).toHaveLength(1);
290
293
  });
291
294
  });
292
295
  describe("edge cases", () => {
293
296
  it("should handle empty detections", () => {
294
- const result = makeDetectCommandOutput([], baseSignatures);
297
+ const result = makeDetectCommandOutput([], [], baseSignatures);
295
298
  expect(result.detectedSoftwares).toEqual([]);
296
299
  });
297
300
  it("should handle detections without evidences", () => {
298
301
  const detections = [{ name: "nginx" }];
299
- const result = makeDetectCommandOutput(detections, baseSignatures);
302
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
300
303
  expect(result.detectedSoftwares).toHaveLength(1);
301
304
  expect(result.detectedSoftwares[0].confidence).toBe("low");
302
305
  });
303
306
  });
307
+ describe("evidence ordering", () => {
308
+ it("should sort evidences by explicit key order", () => {
309
+ const detections = [
310
+ {
311
+ name: "nginx",
312
+ evidences: [
313
+ {
314
+ type: "header",
315
+ value: "B",
316
+ version: undefined,
317
+ confidence: "high",
318
+ host: "b.example.com",
319
+ sourceUrl: "https://b.example.com/app.js",
320
+ },
321
+ {
322
+ type: "body",
323
+ value: "Z",
324
+ version: undefined,
325
+ confidence: "high",
326
+ host: "z.example.com",
327
+ sourceUrl: "https://z.example.com/index.html",
328
+ },
329
+ {
330
+ type: "header",
331
+ value: "A",
332
+ version: undefined,
333
+ confidence: "high",
334
+ host: "a.example.com",
335
+ sourceUrl: "https://a.example.com/app.js",
336
+ },
337
+ {
338
+ type: "header",
339
+ value: "B",
340
+ version: undefined,
341
+ confidence: "low",
342
+ host: "a.example.com",
343
+ sourceUrl: "https://a.example.com/app.js",
344
+ },
345
+ ],
346
+ },
347
+ ];
348
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
349
+ const evidences = result.detectedSoftwares[0].evidences;
350
+ expect(evidences.map((e) => `${e.type}|${e.value}|${e.host}|${e.sourceUrl}|${e.confidence}`)).toEqual([
351
+ "body|Z|z.example.com|https://z.example.com/index.html|high",
352
+ "header|A|a.example.com|https://a.example.com/app.js|high",
353
+ "header|B|b.example.com|https://b.example.com/app.js|high",
354
+ "header|B|a.example.com|https://a.example.com/app.js|low",
355
+ ]);
356
+ });
357
+ it("should keep merged evidences in stable order", () => {
358
+ const detections = [
359
+ {
360
+ name: "nginx",
361
+ evidences: [
362
+ {
363
+ type: "header",
364
+ value: "Server: nginx/1.20.0",
365
+ version: "1.20.0",
366
+ confidence: "high",
367
+ host: "b.example.com",
368
+ sourceUrl: "https://b.example.com",
369
+ },
370
+ ],
371
+ },
372
+ {
373
+ name: "nginx",
374
+ evidences: [
375
+ {
376
+ type: "header",
377
+ value: "Server: nginx/1.20.0",
378
+ version: "1.20.0",
379
+ confidence: "high",
380
+ host: "a.example.com",
381
+ sourceUrl: "https://a.example.com",
382
+ },
383
+ ],
384
+ },
385
+ ];
386
+ const result = makeDetectCommandOutput([], detections, baseSignatures);
387
+ const nginx = result.detectedSoftwares.find((s) => s.name === "nginx" && s.version === "1.20.0");
388
+ expect(nginx).toBeDefined();
389
+ expect(nginx.evidences.map((e) => e.host)).toEqual([
390
+ "a.example.com",
391
+ "b.example.com",
392
+ ]);
393
+ });
394
+ });
304
395
  });
305
396
  describe("printDetectCommandOutputAsText", () => {
306
397
  let consoleLogSpy;
@@ -312,6 +403,7 @@ describe("printDetectCommandOutputAsText", () => {
312
403
  });
313
404
  it("should print software names", () => {
314
405
  const output = {
406
+ urls: [],
315
407
  detectedSoftwares: [
316
408
  {
317
409
  name: "nginx",
@@ -326,11 +418,13 @@ describe("printDetectCommandOutputAsText", () => {
326
418
  .join("\n");
327
419
  expect(allOutput).toContain("nginx");
328
420
  });
329
- it("should print versions when available", () => {
421
+ it("should print version when available", () => {
330
422
  const output = {
423
+ urls: [],
331
424
  detectedSoftwares: [
332
425
  {
333
426
  name: "nginx",
427
+ version: "1.20.0",
334
428
  confidence: "high",
335
429
  evidences: [
336
430
  {
@@ -349,6 +443,7 @@ describe("printDetectCommandOutputAsText", () => {
349
443
  });
350
444
  it("should print evidences when showEvidence is true", () => {
351
445
  const output = {
446
+ urls: [],
352
447
  detectedSoftwares: [
353
448
  {
354
449
  name: "nginx",
@@ -369,8 +464,33 @@ describe("printDetectCommandOutputAsText", () => {
369
464
  expect(allOutput).toContain("[header]");
370
465
  expect(allOutput).toContain("Server: nginx");
371
466
  });
467
+ it("should print sourceUrl for body evidences", () => {
468
+ const output = {
469
+ urls: [],
470
+ detectedSoftwares: [
471
+ {
472
+ name: "WordPress",
473
+ confidence: "high",
474
+ evidences: [
475
+ {
476
+ type: "body",
477
+ value: "<!doctype html>...",
478
+ version: undefined,
479
+ confidence: "high",
480
+ sourceUrl: "https://example.com/index.html",
481
+ },
482
+ ],
483
+ },
484
+ ],
485
+ };
486
+ printDetectCommandOutputAsText(output, true);
487
+ const allOutput = consoleLogSpy.mock.calls.map((c) => c[0]).join("\n");
488
+ expect(allOutput).toContain("[body] https://example.com/index.html");
489
+ expect(allOutput).not.toContain("<!doctype html>...");
490
+ });
372
491
  it("should not print evidences when showEvidence is false", () => {
373
492
  const output = {
493
+ urls: [],
374
494
  detectedSoftwares: [
375
495
  {
376
496
  name: "nginx",
@@ -392,6 +512,7 @@ describe("printDetectCommandOutputAsText", () => {
392
512
  });
393
513
  it("should print impliedBy when present", () => {
394
514
  const output = {
515
+ urls: [],
395
516
  detectedSoftwares: [
396
517
  {
397
518
  name: "PHP",
@@ -416,6 +537,7 @@ describe("printDetectCommandOutputAsJSON", () => {
416
537
  });
417
538
  it("should print valid JSON", () => {
418
539
  const output = {
540
+ urls: [],
419
541
  detectedSoftwares: [
420
542
  {
421
543
  name: "nginx",
@@ -430,11 +552,12 @@ describe("printDetectCommandOutputAsJSON", () => {
430
552
  });
431
553
  it("should include all fields in JSON output", () => {
432
554
  const output = {
555
+ urls: [],
433
556
  detectedSoftwares: [
434
557
  {
435
558
  name: "nginx",
436
559
  description: "Web server",
437
- versions: ["1.20.0"],
560
+ version: "1.20.0",
438
561
  confidence: "high",
439
562
  },
440
563
  ],
@@ -443,7 +566,7 @@ describe("printDetectCommandOutputAsJSON", () => {
443
566
  const jsonOutput = JSON.parse(consoleLogSpy.mock.calls[0][0]);
444
567
  expect(jsonOutput.detectedSoftwares[0].name).toBe("nginx");
445
568
  expect(jsonOutput.detectedSoftwares[0].description).toBe("Web server");
446
- expect(jsonOutput.detectedSoftwares[0].versions).toEqual(["1.20.0"]);
569
+ expect(jsonOutput.detectedSoftwares[0].version).toBe("1.20.0");
447
570
  });
448
571
  });
449
572
  //# sourceMappingURL=detect_utils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect_utils.test.js","sourceRoot":"","sources":["../../src/commands/detect_utils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect_utils.test.js","sourceRoot":"","sources":["../../src/commands/detect_utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAI3B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,MAAM,cAAc,GAAgB;QAClC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,uBAAuB,EAAE;QAC1E,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACrD,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE;QACpD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,KAAK;YAClB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;SACpC;KACF,CAAC;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,sBAAsB;4BAC7B,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAC3C,8BAA8B,CAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,eAAe;4BACtB,OAAO,EAAE,OAAO;4BAChB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,KAAK;yBAClB;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAC9B,CAAC;YACF,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,YAAY;4BACnB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,YAAY;4BACnB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,YAAY;4BACnB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,KAAK;oBACX,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,uBAAuB;4BAC9B,OAAO,EAAE,KAAK;4BACd,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CACxB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,UAAU,GAAgB;gBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,EAAE;gBACnD,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,EAAE;gBACjD,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE;aAC5D,CAAC;YAEF,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,KAAK;oBACX,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,YAAY;4BACnB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,QAAQ;yBACrB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YAEnE,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YACzE,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,CAAC,EAAG,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,EAAG,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,EAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,gCAAgC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,UAAU,GAAgB;gBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,uBAAuB,EAAE;aAChD,CAAC;YAEF,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,QAAQ;yBACrB;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;yBACnB;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YAEnE,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAC1B,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACxD,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEzC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACxD,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,UAAU,GAAgB;gBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,iBAAiB;aACrC,CAAC;YAEF,MAAM,UAAU,GAAgB;gBAC9B,EAAE,IAAI,EAAE,OAAO,EAAE;gBACjB,EAAE,IAAI,EAAE,OAAO,EAAE;aAClB,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,UAAU,GAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;4BAClB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,8BAA8B;yBAC1C;wBACD;4BACE,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;4BAClB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,kCAAkC;yBAC9C;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAM;4BAClB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,8BAA8B;yBAC1C;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,KAAK;4BACjB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,8BAA8B;yBAC1C;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAE,CAAC,SAAU,CAAC;YAE1D,MAAM,CACJ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CACtF,CAAC,OAAO,CAAC;gBACR,4DAA4D;gBAC5D,0DAA0D;gBAC1D,0DAA0D;gBAC1D,yDAAyD;aAC1D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAgB;gBAC9B;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,sBAAsB;4BAC7B,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;4BAClB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,uBAAuB;yBACnC;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,sBAAsB;4BAC7B,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAM;4BAClB,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,uBAAuB;yBACnC;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CACpD,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,SAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnD,eAAe;gBACf,eAAe;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,aAA0C,CAAC;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,MAAe;iBAC5B;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9C,MAAM,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK;aACvC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE,MAAe;oBAC3B,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAiB;4BACvB,KAAK,EAAE,cAAc;4BACrB,OAAO,EAAE,QAAQ;4BACjB,UAAU,EAAE,MAAe;yBAC5B;qBACF;iBACF;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,MAAe;oBAC3B,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAiB;4BACvB,KAAK,EAAE,eAAe;4BACtB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAe;yBAC5B;qBACF;iBACF;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,MAAe;oBAC3B,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,MAAe;4BACrB,KAAK,EAAE,oBAAoB;4BAC3B,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAe;4BAC3B,SAAS,EAAE,gCAAgC;yBAC5C;qBACF;iBACF;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,MAAe;oBAC3B,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,QAAiB;4BACvB,KAAK,EAAE,eAAe;4BACtB,OAAO,EAAE,SAAS;4BAClB,UAAU,EAAE,MAAe;yBAC5B;qBACF;iBACF;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,KAAK;oBACX,UAAU,EAAE,MAAe;oBAC3B,SAAS,EAAE,WAAW;iBACvB;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,aAA0C,CAAC;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,MAAe;iBAC5B;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,EAAE;YACR,iBAAiB,EAAE;gBACjB;oBACE,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,YAAY;oBACzB,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE,MAAe;iBAC5B;aACF;SACF,CAAC;QAEF,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvE,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}