@dbx-tools/appkit-mastra 0.9.64 → 0.9.67

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.
@@ -18,11 +18,15 @@
18
18
  * @module
19
19
  */
20
20
  import { StringDecoder } from "node:string_decoder";
21
- import { json, log, object, stringUtils } from "@dbx-tools/shared-core";
21
+ import { getRequestTags } from "@dbx-tools/appkit/request-tags";
22
+ import { environmentUtils, json, log, object, stringUtils } from "@dbx-tools/shared-core";
22
23
  import { feedback, thread } from "@dbx-tools/shared-mastra";
23
- import { context, SpanKind, trace } from "@opentelemetry/api";
24
+ import { context, createContextKey, SpanKind, trace } from "@opentelemetry/api";
24
25
  import { getRPCMetadata, RPCType } from "@opentelemetry/core";
25
26
  import { USER_EMAIL_HEADER, USER_ID_HEADER } from "./identity.js";
27
+ import { directMlflowTracingActive, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
28
+ import { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_MODEL_TAG, MLFLOW_LOCAL_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
29
+ export { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_MODEL_TAG, MLFLOW_MODEL_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_LOCAL_TAG_ATTR, MLFLOW_OBO_AUTH_TAG, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
26
30
  const logger = log.logger("mastra/telemetry");
27
31
  /** Cap on each payload copied onto a span, so one turn cannot bloat the export. */
28
32
  export const TRACE_IO_LIMIT = 8_000;
@@ -64,28 +68,13 @@ export const GEN_AI_OPERATION_NAME_ATTR = "gen_ai.operation.name";
64
68
  export const MLFLOW_USER_ATTR = "user.id";
65
69
  /** Root-span session id that enables the MLflow Sessions tab. */
66
70
  export const MLFLOW_SESSION_ATTR = "session.id";
67
- /**
68
- * Prefix Databricks/MLflow copies onto the unified-view `tags` map. The
69
- * suffix after this prefix is the tag name shown in the experiment UI.
70
- */
71
- export const MLFLOW_TRACE_TAG_PREFIX = "mlflow.trace.tag.";
72
- /** Experiment-UI tag marking a turn that called Genie. */
73
- export const MLFLOW_GENIE_TAG = "genie";
74
71
  /** Root-span type for a Mastra agent turn. */
75
72
  export const MLFLOW_SPAN_TYPE_AGENT = "AGENT";
76
73
  /** Span type for an `ask_genie` tool call. */
77
74
  export const MLFLOW_SPAN_TYPE_GENIE = "GENIE";
78
- /** Attribute key for the `genie` trace tag. */
79
- export const MLFLOW_GENIE_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_GENIE_TAG}`;
75
+ const CHAT_TRACE_STATE_KEY = createContextKey("@dbx-tools/appkit-mastra/chat-trace-state");
80
76
  /** OpenTelemetry's sentinel for "no valid trace" - 32 zero hex chars. */
81
77
  const INVALID_TRACE_ID = "0".repeat(32);
82
- /**
83
- * Publish the turn's MLflow trace id before the handler writes the body.
84
- *
85
- * The chat UI only shows thumbs when this header is present. Stamping it here
86
- * (on the same span the middleware just resolved) avoids relying on async
87
- * Express continuation still sitting inside `context.with()`.
88
- */
89
78
  /**
90
79
  * Mark the active span as a Genie call so the experiment UI types it `GENIE`
91
80
  * and tags the trace `genie=true`. Safe no-op when no recording span is active.
@@ -117,7 +106,73 @@ function stampMlflowActor(span, req) {
117
106
  const session = requestHeader(req, thread.THREAD_ID_HEADER) ?? requestQuery(req, thread.THREAD_ID_QUERY);
118
107
  if (session)
119
108
  span.setAttribute(MLFLOW_SESSION_ATTR, session);
109
+ return user;
110
+ }
111
+ function traceId(span = trace.getActiveSpan()) {
112
+ const value = span?.spanContext().traceId;
113
+ return value && value !== INVALID_TRACE_ID ? value : undefined;
114
+ }
115
+ function activeChatTraceState() {
116
+ return context.active().getValue(CHAT_TRACE_STATE_KEY);
117
+ }
118
+ function setChatTraceTag(state, name, value) {
119
+ const tag = stringUtils.trimToNull(name);
120
+ if (!tag)
121
+ return;
122
+ state.tags.set(tag, String(value));
123
+ }
124
+ /** Inject one MLflow trace tag into the active chat request. */
125
+ export function recordActiveTraceTag(name, value = true) {
126
+ const state = activeChatTraceState();
127
+ if (state)
128
+ setChatTraceTag(state, name, value);
129
+ }
130
+ /** Inject multiple MLflow trace tags into the active chat request. */
131
+ export function recordActiveTraceTags(tags) {
132
+ const state = activeChatTraceState();
133
+ if (!state)
134
+ return;
135
+ for (const [name, value] of Object.entries(tags)) {
136
+ if (value !== undefined)
137
+ setChatTraceTag(state, name, value);
138
+ }
139
+ }
140
+ /** Record a selected model on the active chat trace, preserving first-use order. */
141
+ export function recordActiveTraceModel(modelId) {
142
+ const value = stringUtils.trimToNull(modelId);
143
+ if (!value)
144
+ return;
145
+ activeChatTraceState()?.models.add(value);
146
+ }
147
+ /** Record the best resolved user identifier on the active chat trace. */
148
+ export function recordActiveTraceUser(user) {
149
+ const value = stringUtils.trimToNull(user);
150
+ if (!value)
151
+ return;
152
+ const state = activeChatTraceState();
153
+ if (state)
154
+ state.user = value;
155
+ }
156
+ /** Record one Databricks authentication mode used during the active chat trace. */
157
+ export function recordActiveTraceAuth(auth) {
158
+ recordActiveTraceTag(auth === "obo" ? MLFLOW_OBO_AUTH_TAG : MLFLOW_SP_AUTH_TAG);
120
159
  }
160
+ /** Serialize model tags as a scalar or an ordered JSON array for multiple values. */
161
+ export function modelTraceTag(models) {
162
+ const values = [];
163
+ const seen = new Set();
164
+ for (const model of models) {
165
+ const value = stringUtils.trimToNull(model);
166
+ if (!value || seen.has(value))
167
+ continue;
168
+ seen.add(value);
169
+ values.push(value);
170
+ }
171
+ if (values.length === 0)
172
+ return undefined;
173
+ return values.length === 1 ? values[0] : JSON.stringify(values);
174
+ }
175
+ /** Publish the turn's MLflow trace id before the handler writes the body. */
121
176
  function stampMlflowTraceId(res, span) {
122
177
  if (res.headersSent)
123
178
  return;
@@ -285,6 +340,23 @@ class AssistantResponseCollector {
285
340
  */
286
341
  function resolveTraceTarget() {
287
342
  const activeContext = context.active();
343
+ if (directMlflowTracingActive()) {
344
+ const span = trace
345
+ .getTracer(CHAT_TURN_TRACER)
346
+ .startSpan("mastra.chat_turn", {
347
+ kind: SpanKind.SERVER,
348
+ attributes: {
349
+ [MLFLOW_AGENT_TAG_ATTR]: "true",
350
+ [MLFLOW_SPAN_TYPE_ATTR]: MLFLOW_SPAN_TYPE_AGENT,
351
+ [GEN_AI_OPERATION_NAME_ATTR]: "invoke_agent",
352
+ },
353
+ }, trace.deleteSpan(activeContext));
354
+ if (!span.isRecording()) {
355
+ span.end();
356
+ return undefined;
357
+ }
358
+ return { span, owned: true };
359
+ }
288
360
  const rpc = getRPCMetadata(activeContext);
289
361
  if (rpc?.type === RPCType.HTTP && rpc.span.isRecording()) {
290
362
  return { span: rpc.span, owned: false };
@@ -294,7 +366,14 @@ function resolveTraceTarget() {
294
366
  return { span: active, owned: false };
295
367
  const span = trace
296
368
  .getTracer(CHAT_TURN_TRACER)
297
- .startSpan("mastra.chat_turn", { kind: SpanKind.SERVER }, activeContext);
369
+ .startSpan("mastra.chat_turn", {
370
+ kind: SpanKind.SERVER,
371
+ attributes: {
372
+ [MLFLOW_AGENT_TAG_ATTR]: "true",
373
+ [MLFLOW_SPAN_TYPE_ATTR]: MLFLOW_SPAN_TYPE_AGENT,
374
+ [GEN_AI_OPERATION_NAME_ATTR]: "invoke_agent",
375
+ },
376
+ }, activeContext);
298
377
  if (!span.isRecording()) {
299
378
  span.end();
300
379
  return undefined;
@@ -321,13 +400,37 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
321
400
  next();
322
401
  return;
323
402
  }
403
+ const targetTraceId = traceId(target.span);
404
+ if (!targetTraceId) {
405
+ if (target.owned)
406
+ target.span.end();
407
+ next();
408
+ return;
409
+ }
410
+ const traceState = { models: new Set(), tags: new Map() };
411
+ setChatTraceTag(traceState, MLFLOW_AGENT_TAG, true);
412
+ if (!environmentUtils.isDatabricksAppEnv()) {
413
+ setChatTraceTag(traceState, MLFLOW_LOCAL_TAG, true);
414
+ }
415
+ for (const [name, value] of Object.entries(getRequestTags(req))) {
416
+ setChatTraceTag(traceState, name, value);
417
+ }
418
+ const initialTags = typeof options.tags === "function" ? options.tags(req) : options.tags;
419
+ if (initialTags) {
420
+ for (const [name, value] of Object.entries(initialTags)) {
421
+ if (value !== undefined)
422
+ setChatTraceTag(traceState, name, value);
423
+ }
424
+ }
324
425
  stampMlflowTraceId(res, target.span);
325
- stampMlflowActor(target.span, req);
426
+ traceState.user = stampMlflowActor(target.span, req);
326
427
  target.span.setAttribute(MLFLOW_SPAN_TYPE_ATTR, MLFLOW_SPAN_TYPE_AGENT);
327
428
  target.span.setAttribute(GEN_AI_OPERATION_NAME_ATTR, "invoke_agent");
429
+ target.span.setAttribute(MLFLOW_AGENT_TAG_ATTR, "true");
328
430
  const identity = typeof options.identity === "function" ? options.identity(req) : options.identity;
329
431
  if (identity) {
330
432
  target.span.setAttribute(CHAT_IDENTITY_ATTR, identity);
433
+ setChatTraceTag(traceState, identity === "obo" ? MLFLOW_OBO_AUTH_TAG : MLFLOW_SP_AUTH_TAG, true);
331
434
  }
332
435
  target.span.setAttribute(CHAT_GENIE_USED_ATTR, false);
333
436
  const messages = req.body?.messages;
@@ -339,7 +442,9 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
339
442
  const collector = new AssistantResponseCollector();
340
443
  let outputRecorded = false;
341
444
  let fullOutputRecorded = false;
445
+ let genieRecorded = false;
342
446
  let ownedSpanEnded = false;
447
+ let traceFinalized = false;
343
448
  const passThroughWrite = res.write.bind(res);
344
449
  const passThroughEnd = res.end.bind(res);
345
450
  const passThroughJson = res.json.bind(res);
@@ -356,10 +461,35 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
356
461
  fullOutputRecorded = true;
357
462
  };
358
463
  const recordGenie = (used) => {
359
- if (!used)
464
+ if (!used || genieRecorded)
360
465
  return;
466
+ genieRecorded = true;
361
467
  target.span.setAttribute(CHAT_GENIE_USED_ATTR, true);
362
468
  target.span.setAttribute(MLFLOW_GENIE_TAG_ATTR, "true");
469
+ setChatTraceTag(traceState, MLFLOW_GENIE_TAG, true);
470
+ context.with(trace.setSpan(context.active(), target.span), () => {
471
+ updateActiveMlflowTraceTags({ [MLFLOW_GENIE_TAG]: "true" });
472
+ });
473
+ };
474
+ const finalizeTrace = () => {
475
+ if (traceFinalized)
476
+ return;
477
+ traceFinalized = true;
478
+ const model = modelTraceTag(traceState.models);
479
+ if (model)
480
+ setChatTraceTag(traceState, MLFLOW_MODEL_TAG, model);
481
+ const tags = Object.fromEntries(traceState.tags);
482
+ for (const [name, value] of traceState.tags) {
483
+ target.span.setAttribute(`${MLFLOW_TRACE_TAG_PREFIX}${name}`, value);
484
+ }
485
+ if (traceState.user)
486
+ target.span.setAttribute(MLFLOW_USER_ATTR, traceState.user);
487
+ context.with(trace.setSpan(context.active(), target.span), () => {
488
+ updateActiveMlflowTrace({
489
+ ...(Object.keys(tags).length > 0 ? { tags } : {}),
490
+ ...(traceState.user ? { user: traceState.user } : {}),
491
+ });
492
+ });
363
493
  };
364
494
  const endOwnedSpan = () => {
365
495
  if (!target.owned || ownedSpanEnded)
@@ -382,6 +512,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
382
512
  recordOutput(collector.finish());
383
513
  recordFullOutput(collector.rawBody());
384
514
  recordGenie(collector.usedGenie());
515
+ finalizeTrace();
385
516
  try {
386
517
  return passThroughEnd(chunk, ...rest);
387
518
  }
@@ -393,9 +524,16 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
393
524
  recordOutput(collector.finish());
394
525
  recordFullOutput(collector.rawBody());
395
526
  recordGenie(collector.usedGenie());
527
+ finalizeTrace();
396
528
  endOwnedSpan();
397
529
  });
398
- context.with(trace.setSpan(context.active(), target.span), next);
530
+ const chatContext = trace
531
+ .setSpan(context.active(), target.span)
532
+ .setValue(CHAT_TRACE_STATE_KEY, traceState);
533
+ context.with(chatContext, () => {
534
+ updateActiveMlflowTraceTags({ [MLFLOW_AGENT_TAG]: "true" });
535
+ next();
536
+ });
399
537
  }
400
538
  /**
401
539
  * Install {@link chatTurnTelemetryMiddleware} on a Mastra Express sub-app.
@@ -408,4 +546,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
408
546
  app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
409
547
  logger.info("chat turn telemetry middleware attached", options);
410
548
  }
411
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFOUMsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFFcEMsdUZBQXVGO0FBQ3ZGLE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUUvQywrRUFBK0U7QUFDL0UsTUFBTSxnQkFBZ0IsR0FBRyxvQ0FBb0MsQ0FBQztBQUU5RDs7Ozs7R0FLRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsbUVBQW1FLENBQUM7QUFFN0Ysb0ZBQW9GO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDO0FBQzNELGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQztBQUM3RCx1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdB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cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5IGVhY2ggTWFzdHJhIGNoYXQgdHVybidzIHJlcXVlc3QvcmVzcG9uc2Ugb250byBpdHMgT1RlbCByb290IHNwYW5cbiAqIHNvIERhdGFicmlja3MtbWFuYWdlZCBNTGZsb3cgY2FuIGRpc3BsYXkgdGhlbS5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHM6IE1MZmxvdydzIFVDIGA8dGFyZ2V0Pl90cmFjZV91bmlmaWVkYCB2aWV3IHBpY2tzIHRoZVxuICogb25lIHNwYW4gd2hvc2UgYHBhcmVudF9zcGFuX2lkYCBpcyBlbXB0eSBhbmQgcmVhZHMgcmVxdWVzdC9yZXNwb25zZVxuICogZnJvbSBgbWxmbG93LnNwYW5JbnB1dHNgIC8gYG1sZmxvdy5zcGFuT3V0cHV0c2AgKG9yIHRoZSBgZ2VuX2FpLipgXG4gKiBlcXVpdmFsZW50cykgb24gVEhBVCBzcGFuIG9ubHkuIE1hc3RyYSByZWNvcmRzIHRoZSB0dXJuIG9uIGl0c1xuICogYGludm9rZV9hZ2VudGAgY2hpbGQgdW5kZXIgYG1hc3RyYS5hZ2VudF9ydW4uaW5wdXRgIC8gYC5vdXRwdXRgLCBrZXlzXG4gKiB0aGUgdmlldyBuZXZlciByZWFkcywgc28gY2hhdCB0cmFjZXMgYXJyaXZlIHdpdGggYm90aCBjb2x1bW5zIG51bGxcbiAqIGV2ZW4gd2hlbiB0aGUgc3BhbnMgdGhlbXNlbHZlcyBsb29rIGhlYWx0aHkuXG4gKlxuICogQXBwS2l0J3MgSFRUUCBpbnN0cnVtZW50YXRpb24gcmVjb3JkcyB0aGUgc2VydmVyIHNwYW4gaW4gT1RlbCBSUEMgbWV0YWRhdGEsXG4gKiB3aGljaCByZW1haW5zIGF2YWlsYWJsZSBldmVuIHdoZW4gRXhwcmVzcyBtYWtlcyBhIG1pZGRsZXdhcmUtbGF5ZXIgY2hpbGRcbiAqIGFjdGl2ZS4gV2hlbiBpbnN0cnVtZW50YXRpb24gaXMgdW5hdmFpbGFibGUsIHRoaXMgbW9kdWxlIGNyZWF0ZXMgb25lXG4gKiByZXF1ZXN0LWxpZmV0aW1lIHNlcnZlciBzcGFuIGFuZCBydW5zIE1hc3RyYSB1bmRlciBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgU3RyaW5nRGVjb2RlciB9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCI7XG5cbmltcG9ydCB7IGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgY29udGV4dCwgU3BhbktpbmQsIHRyYWNlLCB0eXBlIFNwYW4gfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyBnZXRSUENNZXRhZGF0YSwgUlBDVHlwZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvdGVsZW1ldHJ5XCIpO1xuXG4vKiogQ2FwIG9uIGVhY2ggcGF5bG9hZCBjb3BpZWQgb250byBhIHNwYW4sIHNvIG9uZSB0dXJuIGNhbm5vdCBibG9hdCB0aGUgZXhwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFRSQUNFX0lPX0xJTUlUID0gOF8wMDA7XG5cbi8qKiBCb3VuZCBmb3IgYSBub24tc3RyZWFtaW5nIGJvZHkgY2FwdHVyZWQgdGhyb3VnaCBgcmVzLmVuZGAgaW5zdGVhZCBvZiBgcmVzLmpzb25gLiAqL1xuY29uc3QgUkVTUE9OU0VfQk9EWV9MSU1JVCA9IFRSQUNFX0lPX0xJTUlUICogNDtcblxuLyoqIFRyYWNlciBzY29wZSB1c2VkIG9ubHkgd2hlbiBBcHBLaXQgZGlkIG5vdCBjcmVhdGUgYSByZWNvcmRpbmcgSFRUUCBzcGFuLiAqL1xuY29uc3QgQ0hBVF9UVVJOX1RSQUNFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhL3RlbGVtZXRyeVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC9eKD86XFwvYWdlbnRzXFwvW14vXStcXC8oPzpzdHJlYW18Z2VuZXJhdGUpKD86XFwvfCQpfFxcL2NoYXRcXC9bXi9dKyQpL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqXG4gKiBSb290LXNwYW4gdXNlciBpZCB0aGUgTUxmbG93IGV4cGVyaW1lbnQgVUkncyBVc2VyIGNvbHVtbiByZWFkcyBmcm9tIE9UZWxcbiAqIHRyYWNlcy4gUHJlZmVyIHRoZSBmb3J3YXJkZWQgZW1haWwgd2hlbiBwcmVzZW50IHNvIHRoZSBjb2x1bW4gaXMgaHVtYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfVVNFUl9BVFRSID0gXCJ1c2VyLmlkXCI7XG4vKiogUm9vdC1zcGFuIHNlc3Npb24gaWQgdGhhdCBlbmFibGVzIHRoZSBNTGZsb3cgU2Vzc2lvbnMgdGFiLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TRVNTSU9OX0FUVFIgPSBcInNlc3Npb24uaWRcIjtcbi8qKlxuICogUHJlZml4IERhdGFicmlja3MvTUxmbG93IGNvcGllcyBvbnRvIHRoZSB1bmlmaWVkLXZpZXcgYHRhZ3NgIG1hcC4gVGhlXG4gKiBzdWZmaXggYWZ0ZXIgdGhpcyBwcmVmaXggaXMgdGhlIHRhZyBuYW1lIHNob3duIGluIHRoZSBleHBlcmltZW50IFVJLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVggPSBcIm1sZmxvdy50cmFjZS50YWcuXCI7XG4vKiogRXhwZXJpbWVudC1VSSB0YWcgbWFya2luZyBhIHR1cm4gdGhhdCBjYWxsZWQgR2VuaWUuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX0dFTklFX1RBRyA9IFwiZ2VuaWVcIjtcbi8qKiBSb290LXNwYW4gdHlwZSBmb3IgYSBNYXN0cmEgYWdlbnQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UID0gXCJBR0VOVFwiO1xuLyoqIFNwYW4gdHlwZSBmb3IgYW4gYGFza19nZW5pZWAgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgPSBcIkdFTklFXCI7XG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBnZW5pZWAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19HRU5JRV9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX0dFTklFX1RBR31gO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbn1cblxuaW50ZXJmYWNlIFRyYWNlVGFyZ2V0IHtcbiAgc3BhbjogU3BhbjtcbiAgb3duZWQ6IGJvb2xlYW47XG59XG5cbi8qKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5cbi8qKlxuICogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LlxuICpcbiAqIFRoZSBjaGF0IFVJIG9ubHkgc2hvd3MgdGh1bWJzIHdoZW4gdGhpcyBoZWFkZXIgaXMgcHJlc2VudC4gU3RhbXBpbmcgaXQgaGVyZVxuICogKG9uIHRoZSBzYW1lIHNwYW4gdGhlIG1pZGRsZXdhcmUganVzdCByZXNvbHZlZCkgYXZvaWRzIHJlbHlpbmcgb24gYXN5bmNcbiAqIEV4cHJlc3MgY29udGludWF0aW9uIHN0aWxsIHNpdHRpbmcgaW5zaWRlIGBjb250ZXh0LndpdGgoKWAuXG4gKi9cbi8qKlxuICogTWFyayB0aGUgYWN0aXZlIHNwYW4gYXMgYSBHZW5pZSBjYWxsIHNvIHRoZSBleHBlcmltZW50IFVJIHR5cGVzIGl0IGBHRU5JRWBcbiAqIGFuZCB0YWdzIHRoZSB0cmFjZSBgZ2VuaWU9dHJ1ZWAuIFNhZmUgbm8tb3Agd2hlbiBubyByZWNvcmRpbmcgc3BhbiBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFtcEdlbmllVG9vbFNwYW4oc3BhbjogU3BhbiB8IHVuZGVmaW5lZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKSk6IHZvaWQge1xuICBpZiAoIXNwYW4/LmlzUmVjb3JkaW5nKCkpIHJldHVybjtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiZXhlY3V0ZV90b29sXCIpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhlYWRlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbU1ldGhvZCA9XG4gICAgdHlwZW9mIHJlcS5oZWFkZXIgPT09IFwiZnVuY3Rpb25cIiA/IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxLmhlYWRlcihuYW1lKSkgOiB1bmRlZmluZWQ7XG4gIGlmIChmcm9tTWV0aG9kKSByZXR1cm4gZnJvbU1ldGhvZDtcbiAgY29uc3QgcmF3ID0gcmVxLmhlYWRlcnM/LltuYW1lLnRvTG93ZXJDYXNlKCldO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFF1ZXJ5KHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSByZXEucXVlcnk/LltuYW1lXTtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0YW1wTWxmbG93QWN0b3Ioc3BhbjogU3BhbiwgcmVxOiBleHByZXNzLlJlcXVlc3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0VNQUlMX0hFQURFUikgPz8gcmVxdWVzdEhlYWRlcihyZXEsIFVTRVJfSURfSEVBREVSKTtcbiAgaWYgKHVzZXIpIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHVzZXIpO1xuICBjb25zdCBzZXNzaW9uID1cbiAgICByZXF1ZXN0SGVhZGVyKHJlcSwgdGhyZWFkLlRIUkVBRF9JRF9IRUFERVIpID8/IHJlcXVlc3RRdWVyeShyZXEsIHRocmVhZC5USFJFQURfSURfUVVFUlkpO1xuICBpZiAoc2Vzc2lvbikgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NFU1NJT05fQVRUUiwgc2Vzc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN0YW1wTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UsIHNwYW46IFNwYW4pOiB2b2lkIHtcbiAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICBjb25zdCB0cmFjZUlkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbn1cblxuLyoqIFJldHVybiBvbmUgcmF3IHByb21wdCB3aGVuIHRoZSByZXF1ZXN0IGlzIGV4YWN0bHkgb25lIHRleHQtb25seSB1c2VyIG1lc3NhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXM6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIG1lc3NhZ2VzID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZXMgfHwgdW5kZWZpbmVkO1xuICBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZXMpIHx8IG1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChtZXNzYWdlKSB8fCBtZXNzYWdlLnJvbGUgIT09IFwidXNlclwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG1lc3NhZ2UuY29udGVudCB8fCB1bmRlZmluZWQ7XG4gIHJldHVybiB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UucGFydHMpID8/IHRleHRGcm9tUGFydHMobWVzc2FnZS5jb250ZW50KTtcbn1cblxuZnVuY3Rpb24gdGV4dEZyb21QYXJ0cyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgdmFsdWUpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ganNvbi5wYXJzZShsaW5lLnNsaWNlKDUpKTtcbn1cblxuZnVuY3Rpb24gdmFsdWVVc2VzR2VuaWUodmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IGJvb2xlYW4ge1xuICBpZiAoZGVwdGggPiAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IHZhbHVlVXNlc0dlbmllKGl0ZW0sIGRlcHRoICsgMSkpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZnJhbWUpIHx8IGZyYW1lLnR5cGUgIT09IFwidGV4dC1kZWx0YVwiKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdGV4dCA9XG4gICAgdHlwZW9mIGZyYW1lLmRlbHRhID09PSBcInN0cmluZ1wiXG4gICAgICA/IGZyYW1lLmRlbHRhXG4gICAgICA6IG9iamVjdC5pc1JlY29yZChmcmFtZS5wYXlsb2FkKVxuICAgICAgICA/IGZyYW1lLnBheWxvYWQudGV4dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiID8gdGV4dCA6IFwiXCI7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgdGhlIGFzc2lzdGFudCdzIGFuc3dlciBvdXQgb2YgYW4gQUkgU0RLIFNTRSB0cmFuc2NyaXB0LlxuICpcbiAqIFRoZSBhZ2VudCBzdHJlYW1zIGl0cyByZXBseSBhcyBgdGV4dC1kZWx0YWAgZnJhbWVzXG4gKiAoYGRhdGE6IHtcInR5cGVcIjpcInRleHQtZGVsdGFcIixcInBheWxvYWRcIjp7XCJ0ZXh0XCI6XCIuLi5cIn19YCksIHNvIHRoZSBmdWxsXG4gKiBhbnN3ZXIgb25seSBldmVyIGV4aXN0cyBhcyBkZWx0YXMgb24gdGhlIHdpcmUgYW5kIGhhcyB0byBiZVxuICogcmVhc3NlbWJsZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgYm9keS5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZSk7XG4gICAgaWYgKHRleHQpIHBhcnRzLnB1c2godGV4dCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIikuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUmVhZCB0aGUgZmluYWwgYXNzaXN0YW50IHRleHQgZnJvbSBhIG5vbi1zdHJlYW1pbmcgTWFzdHJhIHJlc3BvbnNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tSnNvbihib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oanNvbi5wYXJzZSh0aGlzLmJvZHkpKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc3BhbiBNTGZsb3cgdHJlYXRzIGFzIHRoZSByZXF1ZXN0IHJvb3QuXG4gKlxuICogT1RlbCBIVFRQIGluc3RydW1lbnRhdGlvbiBzdG9yZXMgaXRzIHNlcnZlciBzcGFuIGluIFJQQyBtZXRhZGF0YS4gVGhhdCBzcGFuXG4gKiB3aW5zIG92ZXIgYW4gYWN0aXZlIEV4cHJlc3MgY2hpbGQuIElmIG5vIHJlY29yZGluZyBsb2NhbCBzcGFuIGV4aXN0cywgY3JlYXRlXG4gKiBvbmUgdW5kZXIgdGhlIGN1cnJlbnQgY29udGV4dCBzbyBlbmFibGVkIFczQyBwcm9wYWdhdGlvbiByZW1haW5zIGludGFjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk6IFRyYWNlVGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWN0aXZlQ29udGV4dCA9IGNvbnRleHQuYWN0aXZlKCk7XG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2VcbiAgICAuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpXG4gICAgLnN0YXJ0U3BhbihcIm1hc3RyYS5jaGF0X3R1cm5cIiwgeyBraW5kOiBTcGFuS2luZC5TRVJWRVIgfSwgYWN0aXZlQ29udGV4dCk7XG4gIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgc3Bhbi5lbmQoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHNwYW4sIG93bmVkOiB0cnVlIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgc3RhbXBzIGNoYXQgdHVybiBJL08gb250byB0aGUgZXhwb3J0ZWQgT1RlbCByb290LlxuICpcbiAqIFRlZSBgcmVzLndyaXRlYCwgYHJlcy5qc29uYCwgYW5kIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGxpc3RlbmluZyBmb3IgYGZpbmlzaGA6XG4gKiBIVFRQIGluc3RydW1lbnRhdGlvbiBlbmRzIGl0cyBzZXJ2ZXIgc3BhbiBvbiBmaW5pc2gsIGFuZCBhdHRyaWJ1dGVzIHNldFxuICogYWZ0ZXIgYSBzcGFuIGVuZHMgbmV2ZXIgcmVhY2ggdGhlIGV4cG9ydGVyLlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgTWFzdHJhIHN1Yi1hcHAgc2VlcyksIGUuZy5cbiAqIGAvYWdlbnRzL3N1cHBvcnQvc3RyZWFtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24sXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGlmIChyZXEubWV0aG9kICE9PSBcIlBPU1RcIiB8fCAhQUdFTlRfVFVSTl9ST1VURS50ZXN0KHJlcS5wYXRoKSkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0YXJnZXQuc3Bhbik7XG4gIHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgfVxuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIGZhbHNlKTtcblxuICBjb25zdCBtZXNzYWdlcyA9IChyZXEuYm9keSBhcyB7IG1lc3NhZ2VzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZXM7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfTUVTU0FHRVNfQVRUUiwgZnVsbElucHV0KTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoXG4gICAgICBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUixcbiAgICAgICh0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0KS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvcigpO1xuICBsZXQgb3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGZ1bGxPdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgb3duZWRTcGFuRW5kZWQgPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIHRydWUpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbiAgfTtcbiAgY29uc3QgZW5kT3duZWRTcGFuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGFyZ2V0Lm93bmVkIHx8IG93bmVkU3BhbkVuZGVkKSByZXR1cm47XG4gICAgb3duZWRTcGFuRW5kZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLmVuZCgpO1xuICB9O1xuXG4gIHJlcy53cml0ZSA9ICgoY2h1bms6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFzc1Rocm91Z2hFbmQoY2h1bmssIC4uLnJlc3QpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmRPd25lZFNwYW4oKTtcbiAgICB9XG4gIH0pIGFzIHR5cGVvZiByZXMuZW5kO1xuXG4gIHJlcy5vbmNlKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
549
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix3QkFB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RUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEdBQW9CLEVBQ3BCLFVBQW9DLEVBQUU7SUFFdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgY29udGV4dCwgY3JlYXRlQ29udGV4dEtleSwgU3BhbktpbmQsIHRyYWNlLCB0eXBlIFNwYW4gfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyBnZXRSUENNZXRhZGF0YSwgUlBDVHlwZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTU9ERUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTU9ERUxfVEFHLFxuICBNTEZMT1dfTU9ERUxfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19MT0NBTF9UQUdfQVRUUixcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS90ZWxlbWV0cnlcIjtcblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBNYXN0cmEgYWdlbnQgaW52b2tlIHBhdGhzIHRoYXQgY2FycnkgYSBjaGF0IHR1cm4gYm9keVxuICogKGBtZXNzYWdlc2ApIGFuZCBzdHJlYW0gYW4gYXNzaXN0YW50IGFuc3dlci4gUmVzdW1lIC8gYXBwcm92ZSB2ZXJic1xuICogYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQ6IHRoZWlyIGJvZGllcyBhcmUgdG9vbCBkZWNpc2lvbnMsIG5vdCB0aGVcbiAqIHVzZXIgcHJvbXB0LCBhbmQgdGhleSByYXJlbHkgcHJvZHVjZSBhIGZyZXNoIGFuc3dlciB3b3J0aCBzdXJmYWNpbmcuXG4gKi9cbmNvbnN0IEFHRU5UX1RVUk5fUk9VVEUgPSAvXig/OlxcL2FnZW50c1xcL1teL10rXFwvKD86c3RyZWFtfGdlbmVyYXRlKSg/OlxcL3wkKXxcXC9jaGF0XFwvW14vXSskKS9pO1xuXG4vKiogQXR0cmlidXRlIGtleXMgdGhlIE1MZmxvdyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IHJlYWRzIGZyb20gdGhlIHJvb3Qgc3Bhbi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5JbnB1dHNcIjtcbi8qKiBSb290LXNwYW4gYXR0cmlidXRlIGNvbnN1bWVkIGFzIGNoYXQgb3V0cHV0IGJ5IE1MZmxvdyB1bmlmaWVkIHRyYWNlIHZpZXdzLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5PdXRwdXRzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlcXVlc3QgbWVzc2FnZXMgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX01FU1NBR0VTX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5tZXNzYWdlc1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXNwb25zZSByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfUkVTUE9OU0VfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0LnJlc3BvbnNlXCI7XG4vKiogQ3JlZGVudGlhbCBtb2RlIHVzZWQgYnkgRGF0YWJyaWNrcyBjYWxscyBpbiB0aGlzIGNoYXQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0lERU5USVRZX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuaWRlbnRpdHkubW9kZVwiO1xuLyoqIFdoZXRoZXIgdGhlIHN0cmVhbWVkIHR1cm4gZW1pdHRlZCBhIEdlbmllIHRvb2wgb3IgcHJvZ3Jlc3MgZXZlbnQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9HRU5JRV9VU0VEX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuZ2VuaWUudXNlZFwiO1xuLyoqXG4gKiBNTGZsb3cgc3Bhbi10eXBlIGF0dHJpYnV0ZS4gRGF0YWJyaWNrcyBtYXBzIHRoaXMgKG9yIGBnZW5fYWkub3BlcmF0aW9uLm5hbWVgKVxuICogb250byB0aGUgdHlwZSBjaGlwIGluIHRoZSBleHBlcmltZW50IFVJLiBDdXN0b20gdmFsdWVzIHN1Y2ggYXMgYEdFTklFYCBhcmVcbiAqIGFsbG93ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIgPSBcIm1sZmxvdy5zcGFuVHlwZVwiO1xuLyoqIEdlbkFJIHNlbWFudGljLWNvbnZlbnRpb24gb3BlcmF0aW9uIG5hbWUsIGFuIGFsdGVybmF0ZSBzcGFuLXR5cGUgc291cmNlLiAqL1xuZXhwb3J0IGNvbnN0IEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSID0gXCJnZW5fYWkub3BlcmF0aW9uLm5hbWVcIjtcbi8qKlxuICogUm9vdC1zcGFuIHVzZXIgaWQgdGhlIE1MZmxvdyBleHBlcmltZW50IFVJJ3MgVXNlciBjb2x1bW4gcmVhZHMgZnJvbSBPVGVsXG4gKiB0cmFjZXMuIFByZWZlciB0aGUgZm9yd2FyZGVkIGVtYWlsIHdoZW4gcHJlc2VudCBzbyB0aGUgY29sdW1uIGlzIGh1bWFuLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1VTRVJfQVRUUiA9IFwidXNlci5pZFwiO1xuLyoqIFJvb3Qtc3BhbiBzZXNzaW9uIGlkIHRoYXQgZW5hYmxlcyB0aGUgTUxmbG93IFNlc3Npb25zIHRhYi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU0VTU0lPTl9BVFRSID0gXCJzZXNzaW9uLmlkXCI7XG4vKiogUm9vdC1zcGFuIHR5cGUgZm9yIGEgTWFzdHJhIGFnZW50IHR1cm4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCA9IFwiQUdFTlRcIjtcbi8qKiBTcGFuIHR5cGUgZm9yIGFuIGBhc2tfZ2VuaWVgIHRvb2wgY2FsbC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFID0gXCJHRU5JRVwiO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLyoqIEluaXRpYWwgdHJhY2UgdGFncyBkZXJpdmVkIGZyb20gdGhlIGluYm91bmQgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgdGFncz86XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+XG4gICAgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pik7XG59XG5cbmludGVyZmFjZSBUcmFjZVRhcmdldCB7XG4gIHNwYW46IFNwYW47XG4gIG93bmVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2hhdFRyYWNlU3RhdGUge1xuICByZWFkb25seSBtb2RlbHM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG4vKiogVmFsdWVzIGFjY2VwdGVkIGJ5IHJlcXVlc3Qtc2NvcGVkIHRyYWNlLXRhZyBpbmplY3Rpb24gaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIENoYXRUcmFjZVRhZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuY29uc3QgQ0hBVF9UUkFDRV9TVEFURV9LRVkgPSBjcmVhdGVDb250ZXh0S2V5KFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhL2NoYXQtdHJhY2Utc3RhdGVcIik7XG5cbi8qKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5cbi8qKlxuICogTWFyayB0aGUgYWN0aXZlIHNwYW4gYXMgYSBHZW5pZSBjYWxsIHNvIHRoZSBleHBlcmltZW50IFVJIHR5cGVzIGl0IGBHRU5JRWBcbiAqIGFuZCB0YWdzIHRoZSB0cmFjZSBgZ2VuaWU9dHJ1ZWAuIFNhZmUgbm8tb3Agd2hlbiBubyByZWNvcmRpbmcgc3BhbiBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFtcEdlbmllVG9vbFNwYW4oc3BhbjogU3BhbiB8IHVuZGVmaW5lZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKSk6IHZvaWQge1xuICBpZiAoIXNwYW4/LmlzUmVjb3JkaW5nKCkpIHJldHVybjtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiZXhlY3V0ZV90b29sXCIpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhlYWRlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbU1ldGhvZCA9XG4gICAgdHlwZW9mIHJlcS5oZWFkZXIgPT09IFwiZnVuY3Rpb25cIiA/IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxLmhlYWRlcihuYW1lKSkgOiB1bmRlZmluZWQ7XG4gIGlmIChmcm9tTWV0aG9kKSByZXR1cm4gZnJvbU1ldGhvZDtcbiAgY29uc3QgcmF3ID0gcmVxLmhlYWRlcnM/LltuYW1lLnRvTG93ZXJDYXNlKCldO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFF1ZXJ5KHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSByZXEucXVlcnk/LltuYW1lXTtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0YW1wTWxmbG93QWN0b3Ioc3BhbjogU3BhbiwgcmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB1c2VyID0gcmVxdWVzdEhlYWRlcihyZXEsIFVTRVJfRU1BSUxfSEVBREVSKSA/PyByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9JRF9IRUFERVIpO1xuICBpZiAodXNlcikgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1VTRVJfQVRUUiwgdXNlcik7XG4gIGNvbnN0IHNlc3Npb24gPVxuICAgIHJlcXVlc3RIZWFkZXIocmVxLCB0aHJlYWQuVEhSRUFEX0lEX0hFQURFUikgPz8gcmVxdWVzdFF1ZXJ5KHJlcSwgdGhyZWFkLlRIUkVBRF9JRF9RVUVSWSk7XG4gIGlmIChzZXNzaW9uKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU0VTU0lPTl9BVFRSLCBzZXNzaW9uKTtcbiAgcmV0dXJuIHVzZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNlSWQoc3BhbjogU3BhbiB8IHVuZGVmaW5lZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3Bhbj8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUgIT09IElOVkFMSURfVFJBQ0VfSUQgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTogQ2hhdFRyYWNlU3RhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dC5hY3RpdmUoKS5nZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSkgYXMgQ2hhdFRyYWNlU3RhdGUgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhcbiAgc3RhdGU6IENoYXRUcmFjZVN0YXRlLFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSxcbik6IHZvaWQge1xuICBjb25zdCB0YWcgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG5hbWUpO1xuICBpZiAoIXRhZykgcmV0dXJuO1xuICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vKiogSW5qZWN0IG9uZSBNTGZsb3cgdHJhY2UgdGFnIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWcoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlID0gdHJ1ZSxcbik6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG59XG5cbi8qKiBJbmplY3QgbXVsdGlwbGUgTUxmbG93IHRyYWNlIHRhZ3MgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZ3MoXG4gIHRhZ3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm47XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogUmVjb3JkIGEgc2VsZWN0ZWQgbW9kZWwgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLCBwcmVzZXJ2aW5nIGZpcnN0LXVzZSBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZU1vZGVsKG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gIGlmICghdmFsdWUpIHJldHVybjtcbiAgYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKT8ubW9kZWxzLmFkZCh2YWx1ZSk7XG59XG5cbi8qKiBSZWNvcmQgdGhlIGJlc3QgcmVzb2x2ZWQgdXNlciBpZGVudGlmaWVyIG9uIHRoZSBhY3RpdmUgY2hhdCB0cmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVVzZXIodXNlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh1c2VyKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc3RhdGUudXNlciA9IHZhbHVlO1xufVxuXG4vKiogUmVjb3JkIG9uZSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIG1vZGUgdXNlZCBkdXJpbmcgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChhdXRoOiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTogdm9pZCB7XG4gIHJlY29yZEFjdGl2ZVRyYWNlVGFnKGF1dGggPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHKTtcbn1cblxuLyoqIFNlcmlhbGl6ZSBtb2RlbCB0YWdzIGFzIGEgc2NhbGFyIG9yIGFuIG9yZGVyZWQgSlNPTiBhcnJheSBmb3IgbXVsdGlwbGUgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVHJhY2VUYWcobW9kZWxzOiBJdGVyYWJsZTxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsKTtcbiAgICBpZiAoIXZhbHVlIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgc3BhbjogU3Bhbik6IHZvaWQge1xuICBpZiAocmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBJbmNyZW1lbnRhbGx5IGFzc2VtYmxlIFVURi04IFNTRSB0ZXh0IHdoaWxlIHJldGFpbmluZyBhIGJvdW5kZWQgSlNPTiBmYWxsYmFjay4gKi9cbmNsYXNzIEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoXCJ1dGY4XCIpO1xuICBwcml2YXRlIGFuc3dlciA9IFwiXCI7XG4gIHByaXZhdGUgYm9keSA9IFwiXCI7XG4gIHByaXZhdGUgcGVuZGluZ0xpbmUgPSBcIlwiO1xuICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgZ2VuaWUgPSBmYWxzZTtcblxuICB3cml0ZShjaHVuazogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5jb25zdW1lKGNodW5rKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykpIHtcbiAgICAgIHRoaXMuY29uc3VtZShcbiAgICAgICAgdGhpcy5kZWNvZGVyLndyaXRlKEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBmaW5pc2goKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuIHRoaXMuYW5zd2VyIHx8IHRoaXMuanNvbkFuc3dlcigpO1xuICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuY29uc3VtZSh0aGlzLmRlY29kZXIuZW5kKCkpO1xuICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZSk7XG4gICAgdGhpcy5wZW5kaW5nTGluZSA9IFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyIHx8IHRoaXMuanNvbkFuc3dlcigpO1xuICB9XG5cbiAgcmF3Qm9keSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJvZHkuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xuICB9XG5cbiAgdXNlZEdlbmllKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdlbmllO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGV4dCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmJvZHkubGVuZ3RoIDwgUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5ib2R5ICs9IHRleHQuc2xpY2UoMCwgUkVTUE9OU0VfQk9EWV9MSU1JVCAtIHRoaXMuYm9keS5sZW5ndGgpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdMaW5lICs9IHRleHQ7XG4gICAgbGV0IG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgd2hpbGUgKG5ld2xpbmUgPj0gMCkge1xuICAgICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKDAsIG5ld2xpbmUpLnJlcGxhY2UoL1xcciQvLCBcIlwiKSk7XG4gICAgICB0aGlzLnBlbmRpbmdMaW5lID0gdGhpcy5wZW5kaW5nTGluZS5zbGljZShuZXdsaW5lICsgMSk7XG4gICAgICBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZW5kaW5nTGluZS5sZW5ndGggPiBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLnBlbmRpbmdMaW5lID0gdGhpcy5wZW5kaW5nTGluZS5zbGljZSgtUkVTUE9OU0VfQk9EWV9MSU1JVCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lU3NlTGluZShsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHNzZUZyYW1lKGxpbmUpO1xuICAgIHRoaXMuZ2VuaWUgfHw9IHZhbHVlVXNlc0dlbmllKGZyYW1lKTtcbiAgICBpZiAodGhpcy5hbnN3ZXIubGVuZ3RoID49IFRSQUNFX0lPX0xJTUlUKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWUpO1xuICAgIHRoaXMuYW5zd2VyICs9IHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQgLSB0aGlzLmFuc3dlci5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBqc29uQW5zd2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tSnNvbihqc29uLnBhcnNlKHRoaXMuYm9keSkpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzcGFuIE1MZmxvdyB0cmVhdHMgYXMgdGhlIHJlcXVlc3Qgcm9vdC5cbiAqXG4gKiBPVGVsIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHN0b3JlcyBpdHMgc2VydmVyIHNwYW4gaW4gUlBDIG1ldGFkYXRhLiBUaGF0IHNwYW5cbiAqIHdpbnMgb3ZlciBhbiBhY3RpdmUgRXhwcmVzcyBjaGlsZC4gSWYgbm8gcmVjb3JkaW5nIGxvY2FsIHNwYW4gZXhpc3RzLCBjcmVhdGVcbiAqIG9uZSB1bmRlciB0aGUgY3VycmVudCBjb250ZXh0IHNvIGVuYWJsZWQgVzNDIHByb3BhZ2F0aW9uIHJlbWFpbnMgaW50YWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlVHJhY2VUYXJnZXQoKTogVHJhY2VUYXJnZXQgfCB1bmRlZmluZWQge1xuICBjb25zdCBhY3RpdmVDb250ZXh0ID0gY29udGV4dC5hY3RpdmUoKTtcbiAgaWYgKGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUoKSkge1xuICAgIGNvbnN0IHNwYW4gPSB0cmFjZVxuICAgICAgLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKVxuICAgICAgLnN0YXJ0U3BhbihcbiAgICAgICAgXCJtYXN0cmEuY2hhdF90dXJuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgW01MRkxPV19BR0VOVF9UQUdfQVRUUl06IFwidHJ1ZVwiLFxuICAgICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgICBbR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFJdOiBcImludm9rZV9hZ2VudFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWNlLmRlbGV0ZVNwYW4oYWN0aXZlQ29udGV4dCksXG4gICAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2VcbiAgICAuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpXG4gICAgLnN0YXJ0U3BhbihcbiAgICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgICAge1xuICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBbTUxGTE9XX0FHRU5UX1RBR19BVFRSXTogXCJ0cnVlXCIsXG4gICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3RpdmVDb250ZXh0LFxuICAgICk7XG4gIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgc3Bhbi5lbmQoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHNwYW4sIG93bmVkOiB0cnVlIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgc3RhbXBzIGNoYXQgdHVybiBJL08gb250byB0aGUgZXhwb3J0ZWQgT1RlbCByb290LlxuICpcbiAqIFRlZSBgcmVzLndyaXRlYCwgYHJlcy5qc29uYCwgYW5kIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGxpc3RlbmluZyBmb3IgYGZpbmlzaGA6XG4gKiBIVFRQIGluc3RydW1lbnRhdGlvbiBlbmRzIGl0cyBzZXJ2ZXIgc3BhbiBvbiBmaW5pc2gsIGFuZCBhdHRyaWJ1dGVzIHNldFxuICogYWZ0ZXIgYSBzcGFuIGVuZHMgbmV2ZXIgcmVhY2ggdGhlIGV4cG9ydGVyLlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgTWFzdHJhIHN1Yi1hcHAgc2VlcyksIGUuZy5cbiAqIGAvYWdlbnRzL3N1cHBvcnQvc3RyZWFtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24sXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGlmIChyZXEubWV0aG9kICE9PSBcIlBPU1RcIiB8fCAhQUdFTlRfVFVSTl9ST1VURS50ZXN0KHJlcS5wYXRoKSkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXRUcmFjZUlkID0gdHJhY2VJZCh0YXJnZXQuc3Bhbik7XG4gIGlmICghdGFyZ2V0VHJhY2VJZCkge1xuICAgIGlmICh0YXJnZXQub3duZWQpIHRhcmdldC5zcGFuLmVuZCgpO1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdHJhY2VTdGF0ZTogQ2hhdFRyYWNlU3RhdGUgPSB7IG1vZGVsczogbmV3IFNldCgpLCB0YWdzOiBuZXcgTWFwKCkgfTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19BR0VOVF9UQUcsIHRydWUpO1xuICBpZiAoIWVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KCkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX0xPQ0FMX1RBRywgdHJ1ZSk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldFJlcXVlc3RUYWdzKHJlcSkpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgfVxuICBjb25zdCBpbml0aWFsVGFncyA9IHR5cGVvZiBvcHRpb25zLnRhZ3MgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMudGFncyhyZXEpIDogb3B0aW9ucy50YWdzO1xuICBpZiAoaW5pdGlhbFRhZ3MpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5pdGlhbFRhZ3MpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgc3RhbXBNbGZsb3dUcmFjZUlkKHJlcywgdGFyZ2V0LnNwYW4pO1xuICB0cmFjZVN0YXRlLnVzZXIgPSBzdGFtcE1sZmxvd0FjdG9yKHRhcmdldC5zcGFuLCByZXEpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImludm9rZV9hZ2VudFwiKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19BR0VOVF9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgaWYgKG1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmdWxsSW5wdXQgPSBzZXJpYWxpemVkKG1lc3NhZ2VzKTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9NRVNTQUdFU19BVFRSLCBmdWxsSW5wdXQpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShcbiAgICAgIE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLFxuICAgICAgKHRleHRPbmx5Q2hhdElucHV0KG1lc3NhZ2VzKSA/PyBmdWxsSW5wdXQpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCBvdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgZnVsbE91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBnZW5pZVJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBvd25lZFNwYW5FbmRlZCA9IGZhbHNlO1xuICBsZXQgdHJhY2VGaW5hbGl6ZWQgPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUcmFjZVRhZyh0cmFjZVN0YXRlLm1vZGVscyk7XG4gICAgaWYgKG1vZGVsKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX01PREVMX1RBRywgbW9kZWwpO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfQUdFTlRfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ /** Prefix Databricks/MLflow copies onto the unified-view trace tags map. */
2
+ export declare const MLFLOW_TRACE_TAG_PREFIX = "mlflow.traceTag.";
3
+ /** Experiment-UI tag marking every Mastra chat turn as an agent trace. */
4
+ export declare const MLFLOW_AGENT_TAG = "agent";
5
+ /** Experiment-UI tag marking a turn that called Genie. */
6
+ export declare const MLFLOW_GENIE_TAG = "genie";
7
+ /** Experiment-UI tag recording the model or ordered models used by a turn. */
8
+ export declare const MLFLOW_MODEL_TAG = "model";
9
+ /** Experiment-UI tag marking a turn that invoked OBO authentication. */
10
+ export declare const MLFLOW_OBO_AUTH_TAG = "obo_auth";
11
+ /** Experiment-UI tag marking a turn that invoked service-principal authentication. */
12
+ export declare const MLFLOW_SP_AUTH_TAG = "sp_auth";
13
+ /** Experiment-UI tag marking a turn emitted outside Databricks Apps. */
14
+ export declare const MLFLOW_LOCAL_TAG = "local";
15
+ /** Attribute key for the `agent` trace tag. */
16
+ export declare const MLFLOW_AGENT_TAG_ATTR = "mlflow.traceTag.agent";
17
+ /** Attribute key for the `genie` trace tag. */
18
+ export declare const MLFLOW_GENIE_TAG_ATTR = "mlflow.traceTag.genie";
19
+ /** Attribute key for the `model` trace tag. */
20
+ export declare const MLFLOW_MODEL_TAG_ATTR = "mlflow.traceTag.model";
21
+ /** Attribute key for the `obo_auth` trace tag. */
22
+ export declare const MLFLOW_OBO_AUTH_TAG_ATTR = "mlflow.traceTag.obo_auth";
23
+ /** Attribute key for the `sp_auth` trace tag. */
24
+ export declare const MLFLOW_SP_AUTH_TAG_ATTR = "mlflow.traceTag.sp_auth";
25
+ /** Attribute key for the `local` trace tag. */
26
+ export declare const MLFLOW_LOCAL_TAG_ATTR = "mlflow.traceTag.local";
@@ -0,0 +1,27 @@
1
+ /** Prefix Databricks/MLflow copies onto the unified-view trace tags map. */
2
+ export const MLFLOW_TRACE_TAG_PREFIX = "mlflow.traceTag.";
3
+ /** Experiment-UI tag marking every Mastra chat turn as an agent trace. */
4
+ export const MLFLOW_AGENT_TAG = "agent";
5
+ /** Experiment-UI tag marking a turn that called Genie. */
6
+ export const MLFLOW_GENIE_TAG = "genie";
7
+ /** Experiment-UI tag recording the model or ordered models used by a turn. */
8
+ export const MLFLOW_MODEL_TAG = "model";
9
+ /** Experiment-UI tag marking a turn that invoked OBO authentication. */
10
+ export const MLFLOW_OBO_AUTH_TAG = "obo_auth";
11
+ /** Experiment-UI tag marking a turn that invoked service-principal authentication. */
12
+ export const MLFLOW_SP_AUTH_TAG = "sp_auth";
13
+ /** Experiment-UI tag marking a turn emitted outside Databricks Apps. */
14
+ export const MLFLOW_LOCAL_TAG = "local";
15
+ /** Attribute key for the `agent` trace tag. */
16
+ export const MLFLOW_AGENT_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_AGENT_TAG}`;
17
+ /** Attribute key for the `genie` trace tag. */
18
+ export const MLFLOW_GENIE_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_GENIE_TAG}`;
19
+ /** Attribute key for the `model` trace tag. */
20
+ export const MLFLOW_MODEL_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_MODEL_TAG}`;
21
+ /** Attribute key for the `obo_auth` trace tag. */
22
+ export const MLFLOW_OBO_AUTH_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_OBO_AUTH_TAG}`;
23
+ /** Attribute key for the `sp_auth` trace tag. */
24
+ export const MLFLOW_SP_AUTH_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_SP_AUTH_TAG}`;
25
+ /** Attribute key for the `local` trace tag. */
26
+ export const MLFLOW_LOCAL_TAG_ATTR = `${MLFLOW_TRACE_TAG_PREFIX}${MLFLOW_LOCAL_TAG}`;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFjZS1hdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxrQkFBa0IsQ0FBQztBQUUxRCwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0FBRXhDLDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7QUFFeEMsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUV4Qyx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRTlDLHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFFNUMsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUV4QywrQ0FBK0M7QUFDL0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyx1QkFBdUIsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBRXJGLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLHVCQUF1QixHQUFHLGdCQUFnQixFQUFFLENBQUM7QUFFckYsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsdUJBQXVCLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztBQUVyRixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBRyx1QkFBdUIsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0FBRTNGLGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLHVCQUF1QixHQUFHLGtCQUFrQixFQUFFLENBQUM7QUFFekYsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsdUJBQXVCLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBQcmVmaXggRGF0YWJyaWNrcy9NTGZsb3cgY29waWVzIG9udG8gdGhlIHVuaWZpZWQtdmlldyB0cmFjZSB0YWdzIG1hcC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCA9IFwibWxmbG93LnRyYWNlVGFnLlwiO1xuXG4vKiogRXhwZXJpbWVudC1VSSB0YWcgbWFya2luZyBldmVyeSBNYXN0cmEgY2hhdCB0dXJuIGFzIGFuIGFnZW50IHRyYWNlLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19BR0VOVF9UQUcgPSBcImFnZW50XCI7XG5cbi8qKiBFeHBlcmltZW50LVVJIHRhZyBtYXJraW5nIGEgdHVybiB0aGF0IGNhbGxlZCBHZW5pZS4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfR0VOSUVfVEFHID0gXCJnZW5pZVwiO1xuXG4vKiogRXhwZXJpbWVudC1VSSB0YWcgcmVjb3JkaW5nIHRoZSBtb2RlbCBvciBvcmRlcmVkIG1vZGVscyB1c2VkIGJ5IGEgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfTU9ERUxfVEFHID0gXCJtb2RlbFwiO1xuXG4vKiogRXhwZXJpbWVudC1VSSB0YWcgbWFya2luZyBhIHR1cm4gdGhhdCBpbnZva2VkIE9CTyBhdXRoZW50aWNhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfT0JPX0FVVEhfVEFHID0gXCJvYm9fYXV0aFwiO1xuXG4vKiogRXhwZXJpbWVudC1VSSB0YWcgbWFya2luZyBhIHR1cm4gdGhhdCBpbnZva2VkIHNlcnZpY2UtcHJpbmNpcGFsIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUF9BVVRIX1RBRyA9IFwic3BfYXV0aFwiO1xuXG4vKiogRXhwZXJpbWVudC1VSSB0YWcgbWFya2luZyBhIHR1cm4gZW1pdHRlZCBvdXRzaWRlIERhdGFicmlja3MgQXBwcy4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfTE9DQUxfVEFHID0gXCJsb2NhbFwiO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBhZ2VudGAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19BR0VOVF9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX0FHRU5UX1RBR31gO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBnZW5pZWAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19HRU5JRV9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX0dFTklFX1RBR31gO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBtb2RlbGAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19NT0RFTF9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX01PREVMX1RBR31gO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBvYm9fYXV0aGAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX09CT19BVVRIX1RBR31gO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBzcF9hdXRoYCB0cmFjZSB0YWcuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQX0FVVEhfVEFHX0FUVFIgPSBgJHtNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWH0ke01MRkxPV19TUF9BVVRIX1RBR31gO1xuXG4vKiogQXR0cmlidXRlIGtleSBmb3IgdGhlIGBsb2NhbGAgdHJhY2UgdGFnLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19MT0NBTF9UQUdfQVRUUiA9IGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7TUxGTE9XX0xPQ0FMX1RBR31gO1xuIl19
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-cache.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-cache.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/trace-attributes.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}