@newrelic/preflight 1.16.3 → 1.16.4
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.
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* where the same tool is either failing repeatedly or being called with
|
|
4
4
|
* near-identical input, both signs of retrying the same broken approach
|
|
5
5
|
* instead of changing strategy. Similarity between calls is measured with
|
|
6
|
-
* Levenshtein distance over each call's serialized (non-metadata) fields
|
|
6
|
+
* Levenshtein distance over each call's serialized (non-metadata) fields,
|
|
7
|
+
* falling back to exact-match equality on a raw input hash only when those
|
|
8
|
+
* fields carry no signal of their own (see computeGroupSimilarity()).
|
|
7
9
|
*/
|
|
8
10
|
import type { MetricAggregator } from '../shared/index.js';
|
|
9
11
|
import type { ToolCallRecord } from '../storage/types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-detector.d.ts","sourceRoot":"","sources":["../../src/metrics/retry-detector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"retry-detector.d.ts","sourceRoot":"","sources":["../../src/metrics/retry-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAmBD,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAa5E;AA+BD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;gBAEnC,OAAO,CAAC,EAAE,oBAAoB;IAO1C,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI;IAW7D,UAAU,IAAI,oBAAoB;IAQlC,WAAW,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAO/C,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAO/B,OAAO,CAAC,WAAW;IAyEnB,OAAO,CAAC,sBAAsB;IAwE9B,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* where the same tool is either failing repeatedly or being called with
|
|
4
4
|
* near-identical input, both signs of retrying the same broken approach
|
|
5
5
|
* instead of changing strategy. Similarity between calls is measured with
|
|
6
|
-
* Levenshtein distance over each call's serialized (non-metadata) fields
|
|
6
|
+
* Levenshtein distance over each call's serialized (non-metadata) fields,
|
|
7
|
+
* falling back to exact-match equality on a raw input hash only when those
|
|
8
|
+
* fields carry no signal of their own (see computeGroupSimilarity()).
|
|
7
9
|
*/
|
|
8
10
|
import { createLogger } from '../shared/index.js';
|
|
9
11
|
const logger = createLogger('retry-detector');
|
|
@@ -175,10 +177,29 @@ export class RetryDetector {
|
|
|
175
177
|
const inputs = calls.map((c) => this.serializeInput(c));
|
|
176
178
|
let totalSimilarity = 0;
|
|
177
179
|
let comparisons = 0;
|
|
178
|
-
// Compare each pair against the first (reference) input
|
|
180
|
+
// Compare each pair against the first (reference) input. When the
|
|
181
|
+
// non-hash fields already carry a discriminating signal (Levenshtein
|
|
182
|
+
// similarity < 1 — real parser-populated content differs, e.g. Edit's
|
|
183
|
+
// command text or Bash's command string), trust that signal alone;
|
|
184
|
+
// inputHash contributes nothing here, so a tool with rich parser
|
|
185
|
+
// fields keeps its pre-existing near-identical (not just
|
|
186
|
+
// byte-identical) retry detection.
|
|
187
|
+
//
|
|
188
|
+
// Only when the non-hash fields carry NO signal at all (similarity
|
|
189
|
+
// exactly 1 — every remaining field is identical, which for a
|
|
190
|
+
// parser-less tool means the serialized string reduced to just
|
|
191
|
+
// `{toolName}`) does inputHash's binary equality take over: 1 when
|
|
192
|
+
// both calls' hashes match (a genuine retry), 0 when they don't.
|
|
193
|
+
// Levenshtein-comparing the hash itself creates a false-positive floor
|
|
194
|
+
// there, because unrelated random hex strings still share characters
|
|
195
|
+
// by chance. See serializeInput()'s doc comment.
|
|
179
196
|
const reference = inputs[0];
|
|
197
|
+
const referenceHash = calls[0].inputHash;
|
|
180
198
|
for (let i = 1; i < inputs.length; i++) {
|
|
181
|
-
|
|
199
|
+
const levenshteinSimilarity = normalizedLevenshteinSimilarity(reference, inputs[i]);
|
|
200
|
+
const hashSimilarity = referenceHash === calls[i].inputHash ? 1 : 0;
|
|
201
|
+
const combinedSimilarity = levenshteinSimilarity === 1 ? hashSimilarity : levenshteinSimilarity;
|
|
202
|
+
totalSimilarity += combinedSimilarity;
|
|
182
203
|
comparisons++;
|
|
183
204
|
}
|
|
184
205
|
return comparisons > 0 ? totalSimilarity / comparisons : 0;
|
|
@@ -197,19 +218,29 @@ export class RetryDetector {
|
|
|
197
218
|
// genuinely distinct calls' similarity up into a false-positive band just
|
|
198
219
|
// above the default 0.8 threshold.
|
|
199
220
|
//
|
|
200
|
-
// inputHash is
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
221
|
+
// inputHash is also excluded here, but NOT dropped from similarity scoring
|
|
222
|
+
// entirely — computeGroupSimilarity() falls back to comparing it by
|
|
223
|
+
// equality, but ONLY when the fields above give it nothing else to work
|
|
224
|
+
// with (see that method's comment for the exact condition). inputHash is
|
|
225
|
+
// a hash of the FULL raw tool input, computed for every call regardless
|
|
226
|
+
// of tool name, unlike the narrowed per-tool fields
|
|
227
|
+
// extractInputMeta()/parseToolSpecificFields() only populate for a known
|
|
228
|
+
// subset of tools; for a tool outside that subset (a third-party MCP
|
|
229
|
+
// tool, ...) the remaining serialized string is just `{toolName}` —
|
|
230
|
+
// identical for every call. Levenshtein-comparing inputHash directly used
|
|
231
|
+
// to compensate for that, but two *unrelated* 16-hex-char hashes still
|
|
232
|
+
// share enough characters by chance for Levenshtein similarity to land
|
|
233
|
+
// above the 0.8 threshold once the boilerplate JSON/toolName padding
|
|
234
|
+
// dilutes the comparison. Equality doesn't have that floor: two unrelated
|
|
235
|
+
// hashes essentially never match (contributes 0), while a genuine repeat
|
|
236
|
+
// still hashes identically (contributes 1) — real-retry detection for
|
|
237
|
+
// parser-less tools is unaffected. Gating this on the fields above having
|
|
238
|
+
// no signal of their own also means a tool WITH rich parser fields (Edit,
|
|
239
|
+
// Bash, ...) never has its near-identical-but-not-byte-identical retry
|
|
240
|
+
// detection capped by an unrelated hash comparison — only a parser-less
|
|
241
|
+
// tool's calls ever reach the gate condition in practice.
|
|
211
242
|
serializeInput(record) {
|
|
212
|
-
const { id: _id, sessionId: _s, timestamp: _t, durationMs: _d, success: _su, errorType: _e, error: _er, inputSizeBytes: _is, outputSizeBytes: _os, toolUseId: _tu, cwd: _cwd, transcriptPath: _tp, permissionMode: _pm, isTestCommand: _itc, isBuildCommand: _ibc, isLintCommand: _ilc, bashCategory: _bc, bashDestructive: _bdes, bashNetwork: _bnet, ...rest } = record;
|
|
243
|
+
const { id: _id, sessionId: _s, timestamp: _t, durationMs: _d, success: _su, errorType: _e, error: _er, inputSizeBytes: _is, outputSizeBytes: _os, toolUseId: _tu, cwd: _cwd, transcriptPath: _tp, permissionMode: _pm, isTestCommand: _itc, isBuildCommand: _ibc, isLintCommand: _ilc, bashCategory: _bc, bashDestructive: _bdes, bashNetwork: _bnet, inputHash: _ih, ...rest } = record;
|
|
213
244
|
try {
|
|
214
245
|
return JSON.stringify(rest, null, 0);
|
|
215
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-detector.js","sourceRoot":"","sources":["../../src/metrics/retry-detector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"retry-detector.js","sourceRoot":"","sources":["../../src/metrics/retry-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AA4B9C,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,4BAA4B,GAAG,GAAG,CAAC;AACzC,2EAA2E;AAC3E,yEAAyE;AACzE,uEAAuE;AACvE,kEAAkE;AAClE,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,UAAU,+BAA+B,CAAC,CAAS,EAAE,CAAS;IAClE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE3B,0DAA0D;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,QAAQ,GAAG,YAAY,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAEnB,qCAAqC;IACrC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IACP,cAAc,CAAS;IACvB,UAAU,CAAS;IACnB,mBAAmB,CAAS;IAC5B,OAAO,CAA2C;IAElD,WAAW,GAAqB,EAAE,CAAC;IACnC,MAAM,GAAqB,EAAE,CAAC;IACvC,iBAAiB,GAAG,CAAC,CAAC;IAC9B,iEAAiE;IAChD,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C,YAAY,OAA8B;QACxC,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,uBAAuB,CAAC;QACzE,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC;QAC7D,IAAI,CAAC,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,4BAA4B,CAAC;QACxF,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,cAAc,CAAC,MAAsB;QACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,+BAA+B;QAC/B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,UAAU;QACR,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SACvC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,UAA4B;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/D,UAAU,CAAC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAkB;QACtB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,WAAW;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAErD,yEAAyE;QACzE,oEAAoE;QACpE,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA4B,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc;gBAAE,SAAS;YACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC;YAEpC,yDAAyD;YACzD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,mBAAmB,CAAC;YAEzD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEvC,oEAAoE;YACpE,qEAAqE;YACrE,wEAAwE;YACxE,qEAAqE;YACrE,sEAAsE;YACtE,wDAAwD;YACxD,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,KAAK;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChB,IAAI,EAAE;iBACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,KAAK,GAAmB;gBAC5B,QAAQ;gBACR,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,UAAU;gBACV,oBAAoB,EAAE,YAAY;gBAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,iBAAiB,IAAI,YAAY,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBAChC,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;gBACxC,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,sBAAsB,CAAC,KAAuB;QACpD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,kEAAkE;QAClE,qEAAqE;QACrE,sEAAsE;QACtE,mEAAmE;QACnE,iEAAiE;QACjE,yDAAyD;QACzD,mCAAmC;QACnC,EAAE;QACF,mEAAmE;QACnE,8DAA8D;QAC9D,+DAA+D;QAC/D,mEAAmE;QACnE,iEAAiE;QACjE,uEAAuE;QACvE,qEAAqE;QACrE,iDAAiD;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,qBAAqB,GAAG,+BAA+B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,cAAc,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,kBAAkB,GACtB,qBAAqB,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACvE,eAAe,IAAI,kBAAkB,CAAC;YACtC,WAAW,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,mEAAmE;IACnE,0EAA0E;IAC1E,yEAAyE;IACzE,qEAAqE;IACrE,wEAAwE;IACxE,kEAAkE;IAClE,sEAAsE;IACtE,gEAAgE;IAChE,4DAA4D;IAC5D,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,mCAAmC;IACnC,EAAE;IACF,2EAA2E;IAC3E,oEAAoE;IACpE,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,oDAAoD;IACpD,yEAAyE;IACzE,qEAAqE;IACrE,oEAAoE;IACpE,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,0EAA0E;IAC1E,0EAA0E;IAC1E,uEAAuE;IACvE,wEAAwE;IACxE,0DAA0D;IAClD,cAAc,CAAC,MAAsB;QAC3C,MAAM,EACJ,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,EAAE,EACb,SAAS,EAAE,EAAE,EACb,UAAU,EAAE,EAAE,EACd,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,EAAE,EACb,KAAK,EAAE,GAAG,EACV,cAAc,EAAE,GAAG,EACnB,eAAe,EAAE,GAAG,EACpB,SAAS,EAAE,GAAG,EACd,GAAG,EAAE,IAAI,EACT,cAAc,EAAE,GAAG,EACnB,cAAc,EAAE,GAAG,EACnB,aAAa,EAAE,IAAI,EACnB,cAAc,EAAE,IAAI,EACpB,aAAa,EAAE,IAAI,EACnB,YAAY,EAAE,GAAG,EACjB,eAAe,EAAE,KAAK,EACtB,WAAW,EAAE,KAAK,EAClB,SAAS,EAAE,GAAG,EACd,GAAG,IAAI,EACR,GAAG,MAAM,CAAC;QACX,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,uDAAuD;IAC/C,oBAAoB,CAAC,KAAuB;QAClD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,UAAU,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,wBAAwB,CAAC,CAAC;IAC1D,CAAC;CACF"}
|