@dbx-tools/shared-model 0.6.212 → 0.6.214

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.
package/README.md CHANGED
@@ -183,7 +183,7 @@ one-by-one (`openaiResponses.responsesToChat`) already can't leak them. Pass
183
183
  and capability flags.
184
184
  - `display` - human-readable endpoint labels.
185
185
  - `openaiChat` - Chat Completions message / tool-call types,
186
- `chatContentToText`, and `stripUnsupportedChatFields`.
186
+ `chatContentParts`, `chatContentToText`, and `stripUnsupportedChatFields`.
187
187
  - `openaiResponses` - Responses API translation in both directions, plus
188
188
  `sanitizeOpenResponsesRequest` and the shared `REASONING_TYPES` constant.
189
189
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
6
- export const PACKAGE_VERSION = "0.6.212";
6
+ export const PACKAGE_VERSION = "0.6.214";
7
7
  export * as classify from "./src/classify.ts";
8
8
  export * as display from "./src/display.ts";
9
9
  export * as model from "./src/model.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
2
- export declare const PACKAGE_VERSION = "0.6.212";
2
+ export declare const PACKAGE_VERSION = "0.6.214";
3
3
  export * as classify from "./src/classify.ts";
4
4
  export * as display from "./src/display.ts";
5
5
  export * as model from "./src/model.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
5
- export const PACKAGE_VERSION = "0.6.212";
5
+ export const PACKAGE_VERSION = "0.6.214";
6
6
  export * as classify from "./src/classify.js";
7
7
  export * as display from "./src/display.js";
8
8
  export * as model from "./src/model.js";
@@ -11,4 +11,4 @@ export * as openaiResponses from "./src/openai-responses.js";
11
11
  export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
12
12
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.js";
13
13
  export { REASONING_TYPES } from "./src/openai-responses.js";
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhOLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjEyXCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGRpc3BsYXkgZnJvbSBcIi4vc3JjL2Rpc3BsYXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpQ2hhdCBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5haVJlc3BvbnNlcyBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbmRwb2ludENhcGFiaWxpdGllcywgRmFtaWx5Q2xhc3MgfSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCB7IE1vZGVsQ2xhc3MsIE1vZGVsQ2xhc3NTY2hlbWEsIE1vZGVsUHJvZmlsZVNjaGVtYSwgUmVhc29uaW5nRWZmb3J0LCBSZWFzb25pbmdFZmZvcnRTY2hlbWEsIE1vZGVsU3RhdHVzU2NoZW1hLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLCBNb2RlbFF1ZXJ5U2NoZW1hLCBSYW5rZWRNb2RlbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFByb2ZpbGUsIE1vZGVsU3RhdHVzLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFJvbGUsIENoYXRDb250ZW50UGFydCwgQ2hhdFRvb2xDYWxsRnVuY3Rpb24sIENoYXRUb29sQ2FsbCwgQ2hhdE1lc3NhZ2UsIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgUkVBU09OSU5HX1RZUEVTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciwgUmVzcG9uc2VzQ2l0YXRpb24sIFJlc3BvbnNlc091dHB1dCB9IGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG4iXX0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhOLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjE0XCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGRpc3BsYXkgZnJvbSBcIi4vc3JjL2Rpc3BsYXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpQ2hhdCBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5haVJlc3BvbnNlcyBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbmRwb2ludENhcGFiaWxpdGllcywgRmFtaWx5Q2xhc3MgfSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCB7IE1vZGVsQ2xhc3MsIE1vZGVsQ2xhc3NTY2hlbWEsIE1vZGVsUHJvZmlsZVNjaGVtYSwgUmVhc29uaW5nRWZmb3J0LCBSZWFzb25pbmdFZmZvcnRTY2hlbWEsIE1vZGVsU3RhdHVzU2NoZW1hLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLCBNb2RlbFF1ZXJ5U2NoZW1hLCBSYW5rZWRNb2RlbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFByb2ZpbGUsIE1vZGVsU3RhdHVzLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFJvbGUsIENoYXRDb250ZW50UGFydCwgQ2hhdFRvb2xDYWxsRnVuY3Rpb24sIENoYXRUb29sQ2FsbCwgQ2hhdE1lc3NhZ2UsIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgUkVBU09OSU5HX1RZUEVTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciwgUmVzcG9uc2VzQ2l0YXRpb24sIFJlc3BvbnNlc091dHB1dCB9IGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG4iXX0=
@@ -51,7 +51,7 @@ export interface ChatToolCall {
51
51
  export interface ChatMessage {
52
52
  /** See {@link ChatRole} for the standard values; widened for provider extensions. */
53
53
  role: string;
54
- content?: string | ChatContentPart[] | null;
54
+ content?: string | ChatContentPart | ChatContentPart[] | null;
55
55
  tool_calls?: ChatToolCall[];
56
56
  /** Set on a `tool` turn, keying it back to the call it answers. */
57
57
  tool_call_id?: string;
@@ -98,11 +98,18 @@ export interface ChatContentToTextOptions {
98
98
  */
99
99
  types?: readonly string[];
100
100
  }
101
+ /**
102
+ * Normalize structured chat content to an array. Providers usually emit a
103
+ * parts array, but some compatibility layers collapse a one-part array to the
104
+ * object itself. Returns `undefined` for strings, nulls, and other scalar
105
+ * values so callers can distinguish structured content from plain text.
106
+ */
107
+ export declare function chatContentParts(content: unknown): ChatContentPart[] | undefined;
101
108
  /**
102
109
  * Flatten a message `content` value to plain text. Accepts the string form and
103
- * the structured-parts form ({@link ChatContentPart}), and yields `""` for
104
- * anything else (null, a lone image part, a malformed payload). Typed as
105
- * `unknown` because most callers are reading a just-parsed JSON body, and the
106
- * point of this helper is that they do not have to pre-check it.
110
+ * structured content as either one {@link ChatContentPart} or an array, and
111
+ * yields `""` for anything else (null, a lone image part, a malformed payload).
112
+ * Typed as `unknown` because most callers are reading a just-parsed JSON body,
113
+ * and the point of this helper is that they do not have to pre-check it.
107
114
  */
108
115
  export declare function chatContentToText(content: unknown, options?: ChatContentToTextOptions): string;
@@ -59,24 +59,38 @@ export function stripUnsupportedChatFields(body, extra = []) {
59
59
  }
60
60
  return dropped;
61
61
  }
62
+ /**
63
+ * Normalize structured chat content to an array. Providers usually emit a
64
+ * parts array, but some compatibility layers collapse a one-part array to the
65
+ * object itself. Returns `undefined` for strings, nulls, and other scalar
66
+ * values so callers can distinguish structured content from plain text.
67
+ */
68
+ export function chatContentParts(content) {
69
+ const values = Array.isArray(content)
70
+ ? content
71
+ : content && typeof content === "object"
72
+ ? [content]
73
+ : undefined;
74
+ if (!values)
75
+ return undefined;
76
+ return values.filter((part) => Boolean(part && typeof part === "object"));
77
+ }
62
78
  /**
63
79
  * Flatten a message `content` value to plain text. Accepts the string form and
64
- * the structured-parts form ({@link ChatContentPart}), and yields `""` for
65
- * anything else (null, a lone image part, a malformed payload). Typed as
66
- * `unknown` because most callers are reading a just-parsed JSON body, and the
67
- * point of this helper is that they do not have to pre-check it.
80
+ * structured content as either one {@link ChatContentPart} or an array, and
81
+ * yields `""` for anything else (null, a lone image part, a malformed payload).
82
+ * Typed as `unknown` because most callers are reading a just-parsed JSON body,
83
+ * and the point of this helper is that they do not have to pre-check it.
68
84
  */
69
85
  export function chatContentToText(content, options = {}) {
70
86
  if (typeof content === "string")
71
87
  return content;
72
- if (!Array.isArray(content))
88
+ const normalized = chatContentParts(content);
89
+ if (!normalized)
73
90
  return "";
74
91
  const { separator = "", types } = options;
75
92
  const parts = [];
76
- for (const raw of content) {
77
- if (!raw || typeof raw !== "object")
78
- continue;
79
- const part = raw;
93
+ for (const part of normalized) {
80
94
  if (types && (typeof part.type !== "string" || !types.includes(part.type)))
81
95
  continue;
82
96
  if (typeof part.text === "string")
@@ -84,4 +98,4 @@ export function chatContentToText(content, options = {}) {
84
98
  }
85
99
  return parts.join(separator);
86
100
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNoYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFpLWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBa0RIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCw4RUFBOEU7SUFDOUUsOEJBQThCO0lBQzlCLHFCQUFxQjtJQUNyQix5RUFBeUU7SUFDekUsT0FBTztJQUNQLFVBQVU7SUFDVixjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsSUFBNkIsRUFDN0IsUUFBMkIsRUFBRTtJQUU3QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsdUJBQXVCLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFrQkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUFnQixFQUNoQixVQUFvQyxFQUFFO0lBRXRDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQzlDLE1BQU0sSUFBSSxHQUFHLEdBQXNCLENBQUM7UUFDcEMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQ3JGLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIHdpcmUgc2hhcGVzLCBhcyBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgc3BlYWtzIHRoZW0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSByZXF1ZXN0L3JlcGx5IHBheWxvYWQgdHlwZXMgZm9yIGAvY2hhdC9jb21wbGV0aW9uc2AgYW5kIGFcbiAqIHNlcnZpbmcgZW5kcG9pbnQncyBgaW52b2NhdGlvbnNgIFVSTC4gVGhleSBhcmUgZGVsaWJlcmF0ZWx5IGRlY2xhcmVkIGhlcmVcbiAqIHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gdGhlIE9wZW5BSSBvciBBSSBTREsgcGFja2FnZXM6IGJvdGgga2VlcCB0aGVzZVxuICogZmllbGRzIHVuZGVyIGludGVybmFsIG5hbWVzcGFjZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlaXIgcHVibGljIEFQSSxcbiAqIHdoZXJlYXMgdGhlIHdpcmUgcGF5bG9hZCBpdHNlbGYgaXMgdGhlIHN0YWJsZSBjb250cmFjdCBldmVyeSBjYWxsZXIgaW4gdGhpc1xuICogcmVwbyBhY3R1YWxseSBjb2RlcyBhZ2FpbnN0LlxuICpcbiAqIFB1cmUgdHlwZXMgcGx1cyBvbmUgdGV4dC1mbGF0dGVuaW5nIGhlbHBlciAtIG5vIHpvZCwgbm8gcnVudGltZSBkZXBzIC0gc28gYVxuICogYnJvd3NlciBjbGllbnQsIGEgTm9kZSBwcm94eSwgYW5kIGFuIEFwcEtpdCBwbHVnaW4gY2FuIGFsbCBhZ3JlZSBvbiB0aGUgc2hhcGVcbiAqIHdpdGhvdXQgYW55IG9mIHRoZW0gcHVsbGluZyBpbiB0aGUgb3RoZXJzJyBkZXBlbmRlbmNpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogVGhlIHJvbGVzIE9wZW5BSSBkZWZpbmVzIGZvciBhIGNoYXQgdHVybi4ge0BsaW5rIENoYXRNZXNzYWdlLnJvbGV9IGlzIHR5cGVkIGFzXG4gKiBhIHBsYWluIHN0cmluZyByYXRoZXIgdGhhbiB0aGlzIHVuaW9uLCBiZWNhdXNlIHByb3ZpZGVycyBhZGQgdGhlaXIgb3duIChmb3JcbiAqIGV4YW1wbGUgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlcGxheXMgYSBgXCJyZWFzb25pbmdcImAgdHVybik7IHVzZSB0aGlzIHdoZW5cbiAqIHlvdSB3YW50IHRoZSBzdGFuZGFyZCBzZXQgbmFtZWQuXG4gKi9cbmV4cG9ydCB0eXBlIENoYXRSb2xlID0gXCJzeXN0ZW1cIiB8IFwiZGV2ZWxvcGVyXCIgfCBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCIgfCBcInRvb2xcIjtcblxuLyoqXG4gKiBPbmUgZW50cnkgb2YgYSBzdHJ1Y3R1cmVkIGBjb250ZW50YCBhcnJheS4gT25seSBgdHlwZWAgYW5kIGB0ZXh0YCBhcmUgcmVhZFxuICogaGVyZTsgdGhlIGluZGV4IHNpZ25hdHVyZSBrZWVwcyBwcm92aWRlci1zcGVjaWZpYyBwYXJ0cyAoaW1hZ2VzLCB0aGlua2luZ1xuICogYmxvY2tzLCBjYWNoZSBtYXJrZXJzKSBpbnRhY3QgdGhyb3VnaCBhIHBhcnNlL3NlcmlhbGl6ZSByb3VuZCB0cmlwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb250ZW50UGFydCB7XG4gIHR5cGU/OiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKiBUaGUgZnVuY3Rpb24gYSB0b29sIGNhbGwgaW52b2tlcywgd2l0aCBpdHMgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRUb29sQ2FsbEZ1bmN0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogSlNPTi1lbmNvZGVkIGFyZ3VtZW50IG9iamVjdC4gU3RyZWFtZWQgaW4gZnJhZ21lbnRzLCBzbyBhc3NlbWJsZSBiZWZvcmUgcGFyc2luZy4gKi9cbiAgYXJndW1lbnRzOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgdG9vbCBjYWxsIGF0dGFjaGVkIHRvIGFuIGFzc2lzdGFudCB0dXJuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VG9vbENhbGwge1xuICBpZDogc3RyaW5nO1xuICAvKiogYFwiZnVuY3Rpb25cImAgaW4gcHJhY3RpY2U7IHdpZGVuZWQgc28gYW4gdW5yZWNvZ25pemVkIHR5cGUgcm91bmQtdHJpcHMuICovXG4gIHR5cGU6IHN0cmluZztcbiAgZnVuY3Rpb246IENoYXRUb29sQ2FsbEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGNoYXQgbWVzc2FnZS4gYGNvbnRlbnRgIGlzIG51bGxhYmxlIGJlY2F1c2UgYW4gYXNzaXN0YW50IHR1cm4gdGhhdFxuICogb25seSBjYWxscyB0b29scyBjYXJyaWVzIGBjb250ZW50OiBudWxsYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0TWVzc2FnZSB7XG4gIC8qKiBTZWUge0BsaW5rIENoYXRSb2xlfSBmb3IgdGhlIHN0YW5kYXJkIHZhbHVlczsgd2lkZW5lZCBmb3IgcHJvdmlkZXIgZXh0ZW5zaW9ucy4gKi9cbiAgcm9sZTogc3RyaW5nO1xuICBjb250ZW50Pzogc3RyaW5nIHwgQ2hhdENvbnRlbnRQYXJ0W10gfCBudWxsO1xuICB0b29sX2NhbGxzPzogQ2hhdFRvb2xDYWxsW107XG4gIC8qKiBTZXQgb24gYSBgdG9vbGAgdHVybiwga2V5aW5nIGl0IGJhY2sgdG8gdGhlIGNhbGwgaXQgYW5zd2Vycy4gKi9cbiAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRvcC1sZXZlbCByZXF1ZXN0IGZpZWxkcyBhbiBPcGVuQUkgY2xpZW50IG1heSBzZW5kIHRoYXQgRGF0YWJyaWNrcyBNb2RlbFxuICogU2VydmluZyByZWplY3RzIG91dHJpZ2h0LCBmYWlsaW5nIHRoZSB3aG9sZSB0dXJuIHJhdGhlciB0aGFuIGlnbm9yaW5nIHRoZW0uXG4gKlxuICogRGF0YWJyaWNrcyB2YWxpZGF0ZXMgdGhlIGNoYXQgYm9keSBzdHJpY3RseSwgc28gYW4gdW5yZWNvZ25pemVkIGtleSBjb21lc1xuICogYmFjayBhcyBgcGFyYWxsZWxfdG9vbF9jYWxsczogRXh0cmEgaW5wdXRzIGFyZSBub3QgcGVybWl0dGVkYCAodGhlXG4gKiBnYXRld2F5J3MgcHlkYW50aWMgdmFsaWRhdGlvbikgb3IgYGpzb246IHVua25vd24gZmllbGQgXCJwYXJhbGxlbF90b29sX2NhbGxzXCJgXG4gKiAoaXRzIHN0cmljdCBKU09OIGRlY29kZSksIGRlcGVuZGluZyBvbiB0aGUgZW5kcG9pbnQuIEV2ZXJ5dGhpbmcgbGlzdGVkIGhlcmVcbiAqIGlzIGVpdGhlciBPcGVuQUktcGxhdGZvcm0gYm9va2tlZXBpbmcgd2l0aCBubyBiZWFyaW5nIG9uIHRoZSBjb21wbGV0aW9uLCBvciAtXG4gKiBpbiB0aGUgY2FzZSBvZiBgcGFyYWxsZWxfdG9vbF9jYWxsc2AgLSBhIHJlYWwgc2V0dGluZyBEYXRhYnJpY2tzIGhhcyBubyB3YXlcbiAqIHRvIGFjY2VwdCwgc28gZHJvcHBpbmcgaXQgaXMgdGhlIG9ubHkgd2F5IHRoZSByZXF1ZXN0IGNhbiBzdWNjZWVkIGF0IGFsbC5cbiAqXG4gKiBDYWxsZXJzIHRoYXQgdHJhbnNsYXRlIGEgcmVxdWVzdCBmaWVsZC1ieS1maWVsZCAoYW4gYWxsb3dsaXN0LCBhc1xuICogYG9wZW5haVJlc3BvbnNlcy5yZXNwb25zZXNUb0NoYXRgIGRvZXMpIG5ldmVyIG5lZWQgdGhpczsgaXQgZXhpc3RzIGZvciB0aGVcbiAqIHBhdGhzIHRoYXQgZm9yd2FyZCBhIGNsaWVudCBib2R5IGxhcmdlbHkgYXMtaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBVTlNVUFBPUlRFRF9DSEFUX0ZJRUxEUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIFRvb2wtY2FsbGluZyBjb25jdXJyZW5jeSBoaW50LiBEYXRhYnJpY2tzIHJlamVjdHMgaXQ7IHRoZSB1cHN0cmVhbSBwcm92aWRlclxuICAvLyBkZWNpZGVzIHBhcmFsbGVsaXNtIGl0c2VsZi5cbiAgXCJwYXJhbGxlbF90b29sX2NhbGxzXCIsXG4gIC8vIFJlc3BvbnNlLXBlcnNpc3RlbmNlIGFuZCBib29ra2VlcGluZyBmaWVsZHMgZm9yIE9wZW5BSSdzIG93biBwbGF0Zm9ybS5cbiAgXCJzdG9yZVwiLFxuICBcIm1ldGFkYXRhXCIsXG4gIFwic2VydmljZV90aWVyXCIsXG4gIFwicHJvbXB0X2NhY2hlX2tleVwiLFxuICBcInNhZmV0eV9pZGVudGlmaWVyXCIsXG5dO1xuXG4vKipcbiAqIERlbGV0ZSB0aGUgZmllbGRzIERhdGFicmlja3MgcmVqZWN0cyBmcm9tIGEgY2hhdCByZXF1ZXN0IGJvZHksIGluIHBsYWNlLlxuICogUmV0dXJucyB0aGUgbmFtZXMgYWN0dWFsbHkgcmVtb3ZlZCBzbyBhIGNhbGxlciBjYW4gbG9nIHdoYXQgaXQgZHJvcHBlZC5cbiAqXG4gKiBAcGFyYW0gYm9keSAtIFBhcnNlZCBjaGF0IHJlcXVlc3QgYm9keS4gTXV0YXRlZC5cbiAqIEBwYXJhbSBleHRyYSAtIEFkZGl0aW9uYWwgZmllbGQgbmFtZXMgdG8gZHJvcCwgZm9yIGEgd29ya3NwYWNlIG9yIGVuZHBvaW50XG4gKiAgIHRoYXQgcmVqZWN0cyBzb21ldGhpbmcgbm90IHlldCBpbiB7QGxpbmsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMoXG4gIGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBleHRyYTogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZHJvcHBlZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBbLi4uVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMsIC4uLmV4dHJhXSkge1xuICAgIGlmICghKGZpZWxkIGluIGJvZHkpKSBjb250aW51ZTtcbiAgICBkZWxldGUgYm9keVtmaWVsZF07XG4gICAgZHJvcHBlZC5wdXNoKGZpZWxkKTtcbiAgfVxuICByZXR1cm4gZHJvcHBlZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBjaGF0Q29udGVudFRvVGV4dH0uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQbGFjZWQgYmV0d2VlbiBwYXJ0cy4gRGVmYXVsdHMgdG8gYFwiXCJgLCB3aGljaCByZWFzc2VtYmxlcyBhIG1lc3NhZ2UgdGhhdCB3YXNcbiAgICogc3BsaXQgcHVyZWx5IGZvciB0cmFuc3BvcnQ7IHBhc3MgYFwiXFxuXFxuXCJgIHdoZW4gdGhlIHBhcnRzIGFyZSBzZXBhcmF0ZVxuICAgKiBwYXJhZ3JhcGhzIHRoYXQgYSBodW1hbiB3aWxsIHJlYWQuXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXN0cmljdCB0byB0aGVzZSBgdHlwZWAgdmFsdWVzLiBEZWZhdWx0cyB0byBhY2NlcHRpbmcgYW55IHBhcnQgY2FycnlpbmdcbiAgICogYHRleHRgLCB3aGljaCBjb3ZlcnMgdGhlIGBpbnB1dF90ZXh0YCAvIGBvdXRwdXRfdGV4dGAgLyBgdGV4dGAgc3BlbGxpbmdzXG4gICAqIGRpZmZlcmVudCBBUElzIHVzZSBmb3IgdGhlIHNhbWUgdGhpbmcuXG4gICAqL1xuICB0eXBlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBtZXNzYWdlIGBjb250ZW50YCB2YWx1ZSB0byBwbGFpbiB0ZXh0LiBBY2NlcHRzIHRoZSBzdHJpbmcgZm9ybSBhbmRcbiAqIHRoZSBzdHJ1Y3R1cmVkLXBhcnRzIGZvcm0gKHtAbGluayBDaGF0Q29udGVudFBhcnR9KSwgYW5kIHlpZWxkcyBgXCJcImAgZm9yXG4gKiBhbnl0aGluZyBlbHNlIChudWxsLCBhIGxvbmUgaW1hZ2UgcGFydCwgYSBtYWxmb3JtZWQgcGF5bG9hZCkuIFR5cGVkIGFzXG4gKiBgdW5rbm93bmAgYmVjYXVzZSBtb3N0IGNhbGxlcnMgYXJlIHJlYWRpbmcgYSBqdXN0LXBhcnNlZCBKU09OIGJvZHksIGFuZCB0aGVcbiAqIHBvaW50IG9mIHRoaXMgaGVscGVyIGlzIHRoYXQgdGhleSBkbyBub3QgaGF2ZSB0byBwcmUtY2hlY2sgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0Q29udGVudFRvVGV4dChcbiAgY29udGVudDogdW5rbm93bixcbiAgb3B0aW9uczogQ2hhdENvbnRlbnRUb1RleHRPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiBcIlwiO1xuICBjb25zdCB7IHNlcGFyYXRvciA9IFwiXCIsIHR5cGVzIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByYXcgb2YgY29udGVudCkge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnQgPSByYXcgYXMgQ2hhdENvbnRlbnRQYXJ0O1xuICAgIGlmICh0eXBlcyAmJiAodHlwZW9mIHBhcnQudHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhdHlwZXMuaW5jbHVkZXMocGFydC50eXBlKSkpIGNvbnRpbnVlO1xuICAgIGlmICh0eXBlb2YgcGFydC50ZXh0ID09PSBcInN0cmluZ1wiKSBwYXJ0cy5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oc2VwYXJhdG9yKTtcbn1cbiJdfQ==
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNoYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFpLWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBa0RIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCw4RUFBOEU7SUFDOUUsOEJBQThCO0lBQzlCLHFCQUFxQjtJQUNyQix5RUFBeUU7SUFDekUsT0FBTztJQUNQLFVBQVU7SUFDVixjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsSUFBNkIsRUFDN0IsUUFBMkIsRUFBRTtJQUU3QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsdUJBQXVCLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFrQkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZ0I7SUFDL0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbkMsQ0FBQyxDQUFDLE9BQU87UUFDVCxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7WUFDdEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBMkIsRUFBRSxDQUNyRCxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBZ0IsRUFDaEIsVUFBb0MsRUFBRTtJQUV0QyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDckYsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIENoYXQgQ29tcGxldGlvbnMgd2lyZSBzaGFwZXMsIGFzIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBzcGVha3MgdGhlbS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHJlcXVlc3QvcmVwbHkgcGF5bG9hZCB0eXBlcyBmb3IgYC9jaGF0L2NvbXBsZXRpb25zYCBhbmQgYVxuICogc2VydmluZyBlbmRwb2ludCdzIGBpbnZvY2F0aW9uc2AgVVJMLiBUaGV5IGFyZSBkZWxpYmVyYXRlbHkgZGVjbGFyZWQgaGVyZVxuICogcmF0aGVyIHRoYW4gaW1wb3J0ZWQgZnJvbSB0aGUgT3BlbkFJIG9yIEFJIFNESyBwYWNrYWdlczogYm90aCBrZWVwIHRoZXNlXG4gKiBmaWVsZHMgdW5kZXIgaW50ZXJuYWwgbmFtZXNwYWNlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGVpciBwdWJsaWMgQVBJLFxuICogd2hlcmVhcyB0aGUgd2lyZSBwYXlsb2FkIGl0c2VsZiBpcyB0aGUgc3RhYmxlIGNvbnRyYWN0IGV2ZXJ5IGNhbGxlciBpbiB0aGlzXG4gKiByZXBvIGFjdHVhbGx5IGNvZGVzIGFnYWluc3QuXG4gKlxuICogUHVyZSB0eXBlcyBwbHVzIG9uZSB0ZXh0LWZsYXR0ZW5pbmcgaGVscGVyIC0gbm8gem9kLCBubyBydW50aW1lIGRlcHMgLSBzbyBhXG4gKiBicm93c2VyIGNsaWVudCwgYSBOb2RlIHByb3h5LCBhbmQgYW4gQXBwS2l0IHBsdWdpbiBjYW4gYWxsIGFncmVlIG9uIHRoZSBzaGFwZVxuICogd2l0aG91dCBhbnkgb2YgdGhlbSBwdWxsaW5nIGluIHRoZSBvdGhlcnMnIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqXG4gKiBUaGUgcm9sZXMgT3BlbkFJIGRlZmluZXMgZm9yIGEgY2hhdCB0dXJuLiB7QGxpbmsgQ2hhdE1lc3NhZ2Uucm9sZX0gaXMgdHlwZWQgYXNcbiAqIGEgcGxhaW4gc3RyaW5nIHJhdGhlciB0aGFuIHRoaXMgdW5pb24sIGJlY2F1c2UgcHJvdmlkZXJzIGFkZCB0aGVpciBvd24gKGZvclxuICogZXhhbXBsZSBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGUgcmVwbGF5cyBhIGBcInJlYXNvbmluZ1wiYCB0dXJuKTsgdXNlIHRoaXMgd2hlblxuICogeW91IHdhbnQgdGhlIHN0YW5kYXJkIHNldCBuYW1lZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFJvbGUgPSBcInN5c3RlbVwiIHwgXCJkZXZlbG9wZXJcIiB8IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIiB8IFwidG9vbFwiO1xuXG4vKipcbiAqIE9uZSBlbnRyeSBvZiBhIHN0cnVjdHVyZWQgYGNvbnRlbnRgIGFycmF5LiBPbmx5IGB0eXBlYCBhbmQgYHRleHRgIGFyZSByZWFkXG4gKiBoZXJlOyB0aGUgaW5kZXggc2lnbmF0dXJlIGtlZXBzIHByb3ZpZGVyLXNwZWNpZmljIHBhcnRzIChpbWFnZXMsIHRoaW5raW5nXG4gKiBibG9ja3MsIGNhY2hlIG1hcmtlcnMpIGludGFjdCB0aHJvdWdoIGEgcGFyc2Uvc2VyaWFsaXplIHJvdW5kIHRyaXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbnRlbnRQYXJ0IHtcbiAgdHlwZT86IHN0cmluZztcbiAgdGV4dD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqIFRoZSBmdW5jdGlvbiBhIHRvb2wgY2FsbCBpbnZva2VzLCB3aXRoIGl0cyBhcmd1bWVudHMgYXMgYSBKU09OIHN0cmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFRvb2xDYWxsRnVuY3Rpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBKU09OLWVuY29kZWQgYXJndW1lbnQgb2JqZWN0LiBTdHJlYW1lZCBpbiBmcmFnbWVudHMsIHNvIGFzc2VtYmxlIGJlZm9yZSBwYXJzaW5nLiAqL1xuICBhcmd1bWVudHM6IHN0cmluZztcbn1cblxuLyoqIE9uZSB0b29sIGNhbGwgYXR0YWNoZWQgdG8gYW4gYXNzaXN0YW50IHR1cm4uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRUb29sQ2FsbCB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBgXCJmdW5jdGlvblwiYCBpbiBwcmFjdGljZTsgd2lkZW5lZCBzbyBhbiB1bnJlY29nbml6ZWQgdHlwZSByb3VuZC10cmlwcy4gKi9cbiAgdHlwZTogc3RyaW5nO1xuICBmdW5jdGlvbjogQ2hhdFRvb2xDYWxsRnVuY3Rpb247XG59XG5cbi8qKlxuICogQSBzaW5nbGUgY2hhdCBtZXNzYWdlLiBgY29udGVudGAgaXMgbnVsbGFibGUgYmVjYXVzZSBhbiBhc3Npc3RhbnQgdHVybiB0aGF0XG4gKiBvbmx5IGNhbGxzIHRvb2xzIGNhcnJpZXMgYGNvbnRlbnQ6IG51bGxgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRNZXNzYWdlIHtcbiAgLyoqIFNlZSB7QGxpbmsgQ2hhdFJvbGV9IGZvciB0aGUgc3RhbmRhcmQgdmFsdWVzOyB3aWRlbmVkIGZvciBwcm92aWRlciBleHRlbnNpb25zLiAqL1xuICByb2xlOiBzdHJpbmc7XG4gIGNvbnRlbnQ/OiBzdHJpbmcgfCBDaGF0Q29udGVudFBhcnQgfCBDaGF0Q29udGVudFBhcnRbXSB8IG51bGw7XG4gIHRvb2xfY2FsbHM/OiBDaGF0VG9vbENhbGxbXTtcbiAgLyoqIFNldCBvbiBhIGB0b29sYCB0dXJuLCBrZXlpbmcgaXQgYmFjayB0byB0aGUgY2FsbCBpdCBhbnN3ZXJzLiAqL1xuICB0b29sX2NhbGxfaWQ/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVG9wLWxldmVsIHJlcXVlc3QgZmllbGRzIGFuIE9wZW5BSSBjbGllbnQgbWF5IHNlbmQgdGhhdCBEYXRhYnJpY2tzIE1vZGVsXG4gKiBTZXJ2aW5nIHJlamVjdHMgb3V0cmlnaHQsIGZhaWxpbmcgdGhlIHdob2xlIHR1cm4gcmF0aGVyIHRoYW4gaWdub3JpbmcgdGhlbS5cbiAqXG4gKiBEYXRhYnJpY2tzIHZhbGlkYXRlcyB0aGUgY2hhdCBib2R5IHN0cmljdGx5LCBzbyBhbiB1bnJlY29nbml6ZWQga2V5IGNvbWVzXG4gKiBiYWNrIGFzIGBwYXJhbGxlbF90b29sX2NhbGxzOiBFeHRyYSBpbnB1dHMgYXJlIG5vdCBwZXJtaXR0ZWRgICh0aGVcbiAqIGdhdGV3YXkncyBweWRhbnRpYyB2YWxpZGF0aW9uKSBvciBganNvbjogdW5rbm93biBmaWVsZCBcInBhcmFsbGVsX3Rvb2xfY2FsbHNcImBcbiAqIChpdHMgc3RyaWN0IEpTT04gZGVjb2RlKSwgZGVwZW5kaW5nIG9uIHRoZSBlbmRwb2ludC4gRXZlcnl0aGluZyBsaXN0ZWQgaGVyZVxuICogaXMgZWl0aGVyIE9wZW5BSS1wbGF0Zm9ybSBib29ra2VlcGluZyB3aXRoIG5vIGJlYXJpbmcgb24gdGhlIGNvbXBsZXRpb24sIG9yIC1cbiAqIGluIHRoZSBjYXNlIG9mIGBwYXJhbGxlbF90b29sX2NhbGxzYCAtIGEgcmVhbCBzZXR0aW5nIERhdGFicmlja3MgaGFzIG5vIHdheVxuICogdG8gYWNjZXB0LCBzbyBkcm9wcGluZyBpdCBpcyB0aGUgb25seSB3YXkgdGhlIHJlcXVlc3QgY2FuIHN1Y2NlZWQgYXQgYWxsLlxuICpcbiAqIENhbGxlcnMgdGhhdCB0cmFuc2xhdGUgYSByZXF1ZXN0IGZpZWxkLWJ5LWZpZWxkIChhbiBhbGxvd2xpc3QsIGFzXG4gKiBgb3BlbmFpUmVzcG9uc2VzLnJlc3BvbnNlc1RvQ2hhdGAgZG9lcykgbmV2ZXIgbmVlZCB0aGlzOyBpdCBleGlzdHMgZm9yIHRoZVxuICogcGF0aHMgdGhhdCBmb3J3YXJkIGEgY2xpZW50IGJvZHkgbGFyZ2VseSBhcy1pcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOU1VQUE9SVEVEX0NIQVRfRklFTERTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLy8gVG9vbC1jYWxsaW5nIGNvbmN1cnJlbmN5IGhpbnQuIERhdGFicmlja3MgcmVqZWN0cyBpdDsgdGhlIHVwc3RyZWFtIHByb3ZpZGVyXG4gIC8vIGRlY2lkZXMgcGFyYWxsZWxpc20gaXRzZWxmLlxuICBcInBhcmFsbGVsX3Rvb2xfY2FsbHNcIixcbiAgLy8gUmVzcG9uc2UtcGVyc2lzdGVuY2UgYW5kIGJvb2trZWVwaW5nIGZpZWxkcyBmb3IgT3BlbkFJJ3Mgb3duIHBsYXRmb3JtLlxuICBcInN0b3JlXCIsXG4gIFwibWV0YWRhdGFcIixcbiAgXCJzZXJ2aWNlX3RpZXJcIixcbiAgXCJwcm9tcHRfY2FjaGVfa2V5XCIsXG4gIFwic2FmZXR5X2lkZW50aWZpZXJcIixcbl07XG5cbi8qKlxuICogRGVsZXRlIHRoZSBmaWVsZHMgRGF0YWJyaWNrcyByZWplY3RzIGZyb20gYSBjaGF0IHJlcXVlc3QgYm9keSwgaW4gcGxhY2UuXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBhY3R1YWxseSByZW1vdmVkIHNvIGEgY2FsbGVyIGNhbiBsb2cgd2hhdCBpdCBkcm9wcGVkLlxuICpcbiAqIEBwYXJhbSBib2R5IC0gUGFyc2VkIGNoYXQgcmVxdWVzdCBib2R5LiBNdXRhdGVkLlxuICogQHBhcmFtIGV4dHJhIC0gQWRkaXRpb25hbCBmaWVsZCBuYW1lcyB0byBkcm9wLCBmb3IgYSB3b3Jrc3BhY2Ugb3IgZW5kcG9pbnRcbiAqICAgdGhhdCByZWplY3RzIHNvbWV0aGluZyBub3QgeWV0IGluIHtAbGluayBVTlNVUFBPUlRFRF9DSEFUX0ZJRUxEU30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFVuc3VwcG9ydGVkQ2hhdEZpZWxkcyhcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGV4dHJhOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkcm9wcGVkOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIFsuLi5VTlNVUFBPUlRFRF9DSEFUX0ZJRUxEUywgLi4uZXh0cmFdKSB7XG4gICAgaWYgKCEoZmllbGQgaW4gYm9keSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBib2R5W2ZpZWxkXTtcbiAgICBkcm9wcGVkLnB1c2goZmllbGQpO1xuICB9XG4gIHJldHVybiBkcm9wcGVkO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGNoYXRDb250ZW50VG9UZXh0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbnRlbnRUb1RleHRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBsYWNlZCBiZXR3ZWVuIHBhcnRzLiBEZWZhdWx0cyB0byBgXCJcImAsIHdoaWNoIHJlYXNzZW1ibGVzIGEgbWVzc2FnZSB0aGF0IHdhc1xuICAgKiBzcGxpdCBwdXJlbHkgZm9yIHRyYW5zcG9ydDsgcGFzcyBgXCJcXG5cXG5cImAgd2hlbiB0aGUgcGFydHMgYXJlIHNlcGFyYXRlXG4gICAqIHBhcmFncmFwaHMgdGhhdCBhIGh1bWFuIHdpbGwgcmVhZC5cbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc3RyaWN0IHRvIHRoZXNlIGB0eXBlYCB2YWx1ZXMuIERlZmF1bHRzIHRvIGFjY2VwdGluZyBhbnkgcGFydCBjYXJyeWluZ1xuICAgKiBgdGV4dGAsIHdoaWNoIGNvdmVycyB0aGUgYGlucHV0X3RleHRgIC8gYG91dHB1dF90ZXh0YCAvIGB0ZXh0YCBzcGVsbGluZ3NcbiAgICogZGlmZmVyZW50IEFQSXMgdXNlIGZvciB0aGUgc2FtZSB0aGluZy5cbiAgICovXG4gIHR5cGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHN0cnVjdHVyZWQgY2hhdCBjb250ZW50IHRvIGFuIGFycmF5LiBQcm92aWRlcnMgdXN1YWxseSBlbWl0IGFcbiAqIHBhcnRzIGFycmF5LCBidXQgc29tZSBjb21wYXRpYmlsaXR5IGxheWVycyBjb2xsYXBzZSBhIG9uZS1wYXJ0IGFycmF5IHRvIHRoZVxuICogb2JqZWN0IGl0c2VsZi4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3Igc3RyaW5ncywgbnVsbHMsIGFuZCBvdGhlciBzY2FsYXJcbiAqIHZhbHVlcyBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaCBzdHJ1Y3R1cmVkIGNvbnRlbnQgZnJvbSBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdENvbnRlbnRQYXJ0cyhjb250ZW50OiB1bmtub3duKTogQ2hhdENvbnRlbnRQYXJ0W10gfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvbnRlbnQpXG4gICAgPyBjb250ZW50XG4gICAgOiBjb250ZW50ICYmIHR5cGVvZiBjb250ZW50ID09PSBcIm9iamVjdFwiXG4gICAgICA/IFtjb250ZW50XVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmICghdmFsdWVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWVzLmZpbHRlcigocGFydCk6IHBhcnQgaXMgQ2hhdENvbnRlbnRQYXJ0ID0+XG4gICAgQm9vbGVhbihwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgbWVzc2FnZSBgY29udGVudGAgdmFsdWUgdG8gcGxhaW4gdGV4dC4gQWNjZXB0cyB0aGUgc3RyaW5nIGZvcm0gYW5kXG4gKiBzdHJ1Y3R1cmVkIGNvbnRlbnQgYXMgZWl0aGVyIG9uZSB7QGxpbmsgQ2hhdENvbnRlbnRQYXJ0fSBvciBhbiBhcnJheSwgYW5kXG4gKiB5aWVsZHMgYFwiXCJgIGZvciBhbnl0aGluZyBlbHNlIChudWxsLCBhIGxvbmUgaW1hZ2UgcGFydCwgYSBtYWxmb3JtZWQgcGF5bG9hZCkuXG4gKiBUeXBlZCBhcyBgdW5rbm93bmAgYmVjYXVzZSBtb3N0IGNhbGxlcnMgYXJlIHJlYWRpbmcgYSBqdXN0LXBhcnNlZCBKU09OIGJvZHksXG4gKiBhbmQgdGhlIHBvaW50IG9mIHRoaXMgaGVscGVyIGlzIHRoYXQgdGhleSBkbyBub3QgaGF2ZSB0byBwcmUtY2hlY2sgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0Q29udGVudFRvVGV4dChcbiAgY29udGVudDogdW5rbm93bixcbiAgb3B0aW9uczogQ2hhdENvbnRlbnRUb1RleHRPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBub3JtYWxpemVkID0gY2hhdENvbnRlbnRQYXJ0cyhjb250ZW50KTtcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgeyBzZXBhcmF0b3IgPSBcIlwiLCB0eXBlcyB9ID0gb3B0aW9ucztcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiBub3JtYWxpemVkKSB7XG4gICAgaWYgKHR5cGVzICYmICh0eXBlb2YgcGFydC50eXBlICE9PSBcInN0cmluZ1wiIHx8ICF0eXBlcy5pbmNsdWRlcyhwYXJ0LnR5cGUpKSkgY29udGludWU7XG4gICAgaWYgKHR5cGVvZiBwYXJ0LnRleHQgPT09IFwic3RyaW5nXCIpIHBhcnRzLnB1c2gocGFydC50ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihzZXBhcmF0b3IpO1xufVxuIl19
@@ -45,7 +45,7 @@
45
45
  * @module
46
46
  */
47
47
  import { string } from "@dbx-tools/shared-core";
48
- import { chatContentToText } from "./openai-chat.js";
48
+ import { chatContentParts, chatContentToText, } from "./openai-chat.js";
49
49
  /**
50
50
  * Lower a Responses request body to a chat-completions body. Returns the chat
51
51
  * body plus whether the caller asked for streaming (the server needs it to pick
@@ -429,17 +429,19 @@ export function createResponsesStreamTranslator(model, responseId) {
429
429
  const choices = Array.isArray(chunk.choices) ? chunk.choices : [];
430
430
  const choice = (choices[0] ?? {});
431
431
  const delta = (choice.delta ?? {});
432
- // Assistant text deltas.
433
- if (typeof delta.content === "string" && delta.content.length > 0) {
432
+ // Assistant text deltas. Compatibility layers may emit one content part,
433
+ // a parts array, or the OpenAI string form.
434
+ const deltaText = chatContentToText(delta.content, { types: ["text", "output_text"] });
435
+ if (deltaText.length > 0) {
434
436
  if (!textOpen)
435
437
  out += openText();
436
- textBuffer += delta.content;
438
+ textBuffer += deltaText;
437
439
  out += sse("response.output_text.delta", {
438
440
  type: "response.output_text.delta",
439
441
  item_id: textItemId,
440
442
  output_index: outputIndex,
441
443
  content_index: 0,
442
- delta: delta.content,
444
+ delta: deltaText,
443
445
  });
444
446
  }
445
447
  // Tool-call deltas: each is keyed by `index`; `arguments` arrives in pieces.
@@ -538,9 +540,10 @@ export function readResponsesOutput(payload) {
538
540
  if (!rawItem || typeof rawItem !== "object")
539
541
  continue;
540
542
  const content = rawItem.content;
541
- if (!Array.isArray(content))
543
+ const parts = chatContentParts(content);
544
+ if (!parts)
542
545
  continue;
543
- for (const rawPart of content) {
546
+ for (const rawPart of parts) {
544
547
  if (!rawPart || typeof rawPart !== "object")
545
548
  continue;
546
549
  const part = rawPart;
@@ -643,13 +646,14 @@ export function sanitizeOpenResponsesInput(body) {
643
646
  changed = true;
644
647
  continue;
645
648
  }
646
- if (!Array.isArray(item.content)) {
649
+ const parts = chatContentParts(item.content);
650
+ if (!parts) {
647
651
  input.push(raw);
648
652
  continue;
649
653
  }
650
- let partChanged = false;
654
+ let partChanged = !Array.isArray(item.content);
651
655
  const content = [];
652
- for (const part of item.content) {
656
+ for (const part of parts) {
653
657
  if (!part || typeof part !== "object") {
654
658
  content.push(part);
655
659
  continue;
@@ -747,4 +751,4 @@ function isAssistantMessageItem(value) {
747
751
  export function sanitizeOpenResponsesRequest(body) {
748
752
  return repairTrailingAssistantInput(sanitizeOpenResponsesInput(sanitizeResponsesTools(body)));
749
753
  }
750
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlc3BvbnNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUF1QyxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQTZCO0lBSTNELE1BQU0sUUFBUSxHQUFrQixFQUFFLENBQUM7SUFFbkMscURBQXFEO0lBQ3JELElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsR0FBOEIsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXZCLElBQUksSUFBSSxLQUFLLGVBQWUsRUFBRSxDQUFDO1lB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RSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLG1EQUFtRDtJQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLEtBQWdDLENBQUM7SUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsSUFBNkI7SUFFN0IsT0FBTyw0QkFBNEIsQ0FBQywwQkFBMEIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgPC0+IENoYXQgQ29tcGxldGlvbnMgdHJhbnNsYXRpb24uXG4gKlxuICogU29tZSBjbGllbnRzIHNwZWFrIG9ubHkgdGhlIFJlc3BvbnNlcyBBUEkgKGBQT1NUIC92MS9yZXNwb25zZXNgKSAtIHRoZSBDb2RleFxuICogQ0xJIGlzIHRoZSBtb3RpdmF0aW5nIG9uZS4gRGF0YWJyaWNrcyBub3cgYWxzbyBleHBvc2VzIG5hdGl2ZSBSZXNwb25zZXNcbiAqIHN1cmZhY2VzIChgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgYW5kIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgKSxcbiAqIHdoaWxlIG1vc3QgZW5kcG9pbnRzIHN0aWxsIHNwZWFrIENoYXQgQ29tcGxldGlvbnMgYXQgYC9pbnZvY2F0aW9uc2AuIFRoaXNcbiAqIG1vZHVsZSBicmlkZ2VzIHRoZSB0d28sIGluIGJvdGggZGlyZWN0aW9uczpcbiAqXG4gKiAgIC0ge0BsaW5rIHJlc3BvbnNlc1RvQ2hhdH0gbG93ZXJzIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXRcbiAqICAgICBjb21wbGV0aW9ucyBib2R5IChpbnN0cnVjdGlvbnMgLT4gc3lzdGVtIG1lc3NhZ2UsIHR5cGVkIGBpbnB1dGAgaXRlbXMgLT5cbiAqICAgICBgbWVzc2FnZXNgLCBgdG9vbHNgL2B0b29sX2Nob2ljZWAgY2FycmllZCB0aHJvdWdoLCBmdW5jdGlvbi1jYWxsIG91dHB1dHNcbiAqICAgICBmb2xkZWQgYmFjayBpbnRvIHRoZSB0cmFuc2NyaXB0KS5cbiAqICAgLSB7QGxpbmsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdH0gcmFpc2VzIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYVxuICogICAgIFJlc3BvbnNlcyByZXF1ZXN0ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fSksIGZvciByb3V0aW5nIGFcbiAqICAgICBjaGF0IGNsaWVudCBhdCBhIFJlc3BvbnNlcy1vbmx5IG1vZGVsIGxpa2UgQ29kZXguXG4gKiAgIC0ge0BsaW5rIGNoYXRUb1Jlc3BvbnNlfSBsaWZ0cyBhIG5vbi1zdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uIGJhY2sgaW50byBhXG4gKiAgICAgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LlxuICogICAtIHtAbGluayByZXNwb25zZVRvQ2hhdENvbXBsZXRpb259IGxpZnRzIGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgXG4gKiAgICAgYmFjayBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9KS5cbiAqICAgLSB7QGxpbmsgY3JlYXRlUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvcn0gbGlmdHMgYSBzdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uXG4gKiAgICAgKGFuIE9wZW5BSSBTU0UgYGNoYXQuY29tcGxldGlvbi5jaHVua2Agc3RyZWFtKSBpbnRvIHRoZSBSZXNwb25zZXMgU1NFXG4gKiAgICAgZXZlbnQgc3RyZWFtIHRob3NlIGNsaWVudHMgY29uc3VtZSAoYHJlc3BvbnNlLmNyZWF0ZWRgLFxuICogICAgIGByZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YWAsIGZ1bmN0aW9uLWNhbGwgYXJndW1lbnQgZGVsdGFzLFxuICogICAgIGByZXNwb25zZS5jb21wbGV0ZWRgKS5cbiAqICAgLSB7QGxpbmsgcmVhZFJlc3BvbnNlc091dHB1dH0gcmVhZHMgdGhlIG90aGVyIGRpcmVjdGlvbjogcHVsbCB0aGUgYW5zd2VyXG4gKiAgICAgdGV4dCBhbmQgY2l0YXRpb25zIG91dCBvZiBhIGByZXNwb25zZWAgb2JqZWN0IHJldHVybmVkIGJ5IGFuIGVuZHBvaW50XG4gKiAgICAgdGhhdCBzcGVha3MgUmVzcG9uc2VzIG5hdGl2ZWx5ICh0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sKS5cbiAqICAgLSB7QGxpbmsgc2FuaXRpemVSZXNwb25zZXNUb29sc30ga2VlcHMgb25seSBgZnVuY3Rpb25gIHRvb2xzIG9uIGEgUmVzcG9uc2VzXG4gKiAgICAgcmVxdWVzdCBib2R5IChmb3IgYC9vcGVuLXJlc3BvbnNlc2AgLyBBbnRocm9waWMsIHdoaWNoIHJlamVjdCBDb2RleFxuICogICAgIGJ1aWx0LWlucyBsaWtlIGB3ZWJfc2VhcmNoYCkuXG4gKiAgIC0ge0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSByZXdyaXRlcyBgb3V0cHV0XypgIGNvbnRlbnQgcGFydCB0eXBlc1xuICogICAgIGluIGBpbnB1dGAgdG8gYGlucHV0XypgLCBhbmQgZHJvcHMgQ2xhdWRlIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2Nrc1xuICogICAgIHRoYXQgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBvbiByZXBsYXkgKGByZWRhY3RlZF90aGlua2luZ2AsIOKApikuXG4gKiAgIC0ge0BsaW5rIHJlcGFpclRyYWlsaW5nQXNzaXN0YW50SW5wdXR9IGRyb3BzIGEgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gdGhhdFxuICogICAgIEFudGhyb3BpYyByZWFkcyBhcyBhIHByZWZpbGwgcmVxdWVzdCwgdGhlIFJlc3BvbnNlcy1zaWRlIGNvdW50ZXJwYXJ0IHRvXG4gKiAgICAgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBgcmVwYWlyQXNzaXN0YW50UHJlZmlsbGAuXG4gKlxuICogT25seSB0aGUgc3VyZmFjZSByZWFsIGNsaWVudHMgZXhlcmNpc2UgaXMgdHJhbnNsYXRlZDsgdW5rbm93biBmaWVsZHMgYXJlXG4gKiBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkLCBzbyBhIG5ld2VyIGNsaWVudCBkZWdyYWRlcyBpbnN0ZWFkIG9mIGJyZWFraW5nLlxuICpcbiAqIEJyb3dzZXItc2FmZTogcHVyZSBmdW5jdGlvbnMgb3ZlciBwbGFpbiBKU09OLCBubyB0cmFuc3BvcnQgYW5kIG5vIE5vZGVcbiAqIGJ1aWx0LWlucywgc28gdGhlIHNhbWUgdHJhbnNsYXRpb24gcnVucyBpbiBhIHByb3h5LCBhIHNlcnZlciByb3V0ZSwgb3IgYSB0ZXN0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQgeyB0eXBlIENoYXRNZXNzYWdlLCB0eXBlIENoYXRUb29sQ2FsbCwgY2hhdENvbnRlbnRUb1RleHQgfSBmcm9tIFwiLi9vcGVuYWktY2hhdC50c1wiO1xuXG4vKipcbiAqIExvd2VyIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXQtY29tcGxldGlvbnMgYm9keS4gUmV0dXJucyB0aGUgY2hhdFxuICogYm9keSBwbHVzIHdoZXRoZXIgdGhlIGNhbGxlciBhc2tlZCBmb3Igc3RyZWFtaW5nICh0aGUgc2VydmVyIG5lZWRzIGl0IHRvIHBpY2tcbiAqIHRoZSB1cHN0cmVhbSBgYWNjZXB0YCBoZWFkZXIgYW5kIHRoZSB0cmFuc2xhdGlvbiBwYXRoKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlc1RvQ2hhdChib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgY2hhdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xuXG4gIC8vIGBpbnN0cnVjdGlvbnNgIGJlY29tZXMgdGhlIGxlYWRpbmcgc3lzdGVtIG1lc3NhZ2UuXG4gIGlmICh0eXBlb2YgYm9keS5pbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIgJiYgYm9keS5pbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBib2R5Lmluc3RydWN0aW9ucyB9KTtcbiAgfVxuXG4gIC8vIGBpbnB1dGAgaXMgYW4gYXJyYXkgb2YgdHlwZWQgaXRlbXM6IG1lc3NhZ2VzLCBmdW5jdGlvbl9jYWxsLCBhbmRcbiAgLy8gZnVuY3Rpb25fY2FsbF9vdXRwdXQuIEZvbGQgZWFjaCBpbnRvIHRoZSBjaGF0IHRyYW5zY3JpcHQuXG4gIGNvbnN0IGlucHV0ID0gQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSA/IGJvZHkuaW5wdXQgOiBbXTtcbiAgZm9yIChjb25zdCByYXcgb2YgaW5wdXQpIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBpdGVtID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcbiAgICAgIC8vIEEgcHJpb3IgdG9vbCBjYWxsIHRoZSBtb2RlbCBtYWRlOyByZS1hdHRhY2ggaXQgdG8gYW4gYXNzaXN0YW50IHR1cm4uXG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY29udGVudDogbnVsbCxcbiAgICAgICAgdG9vbF9jYWxsczogW3RvQ2hhdFRvb2xDYWxsKGl0ZW0pXSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIikge1xuICAgICAgLy8gVGhlIHRvb2wncyByZXN1bHQsIGtleWVkIGJhY2sgdG8gdGhlIGNhbGwgaXQgYW5zd2Vycy5cbiAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgdG9vbF9jYWxsX2lkOiBTdHJpbmcoaXRlbS5jYWxsX2lkID8/IGl0ZW0uaWQgPz8gXCJcIiksXG4gICAgICAgIGNvbnRlbnQ6IHR5cGVvZiBpdGVtLm91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ub3V0cHV0IDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5vdXRwdXQpLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBhIG1lc3NhZ2UgaXRlbSB3aXRoIGEgcm9sZSBhbmQgdHlwZWQgY29udGVudC5cbiAgICBjb25zdCByb2xlID0gdHlwZW9mIGl0ZW0ucm9sZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ucm9sZSA6IFwidXNlclwiO1xuICAgIC8vIENoYXQgaGFzIG5vIFwiZGV2ZWxvcGVyXCIgcm9sZTsgdHJlYXQgaXQgYXMgc3lzdGVtIChpdHMgaW50ZW50IGhlcmUpLlxuICAgIGNvbnN0IGNoYXRSb2xlID0gcm9sZSA9PT0gXCJkZXZlbG9wZXJcIiA/IFwic3lzdGVtXCIgOiByb2xlO1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBjaGF0Um9sZSwgY29udGVudDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5jb250ZW50KSB9KTtcbiAgfVxuXG4gIGNvbnN0IGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIG1lc3NhZ2VzLFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG5cbiAgLy8gQ2FycnkgdGhyb3VnaCBmdW5jdGlvbi1jYWxsaW5nIGNvbmZpZyB3aGVuIHByZXNlbnQuIFJlc3BvbnNlcyBmdW5jdGlvblxuICAvLyB0b29scyBhcmUgRkxBVCAoYHt0eXBlOlwiZnVuY3Rpb25cIiwgbmFtZSwgZGVzY3JpcHRpb24sIHBhcmFtZXRlcnN9YCk7IGNoYXRcbiAgLy8gd2FudHMgdGhlbSBORVNURUQgKGB7dHlwZTpcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uOntuYW1lLCDigKZ9fWApLiBDbGllbnRzIGFsc29cbiAgLy8gc2VuZCBidWlsdC1pbiB0b29sIHR5cGVzIChsb2NhbF9zaGVsbCwgd2ViX3NlYXJjaCwg4oCmKSB0aGF0IERhdGFicmlja3MgY2hhdFxuICAvLyByZWplY3RzIChcIk1pc3NpbmcgJ2Z1bmN0aW9uJyBpbiB0aGUgdG9vbCBzcGVjaWZpY2F0aW9uXCIpLCBzbyB3ZSB0cmFuc2xhdGVcbiAgLy8gb25seSBmdW5jdGlvbiB0b29scyBhbmQgZHJvcCB0aGUgcmVzdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2hhdFRvb2xzID0gYm9keS50b29sc1xuICAgICAgLm1hcCh0b0NoYXRUb29sKVxuICAgICAgLmZpbHRlcigodCk6IHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gdCAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAoY2hhdFRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYXQudG9vbHMgPSBjaGF0VG9vbHM7XG4gICAgICBpZiAoYm9keS50b29sX2Nob2ljZSAhPT0gdW5kZWZpbmVkKSBjaGF0LnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICAgIC8vIE5PVEU6IGRvIE5PVCBmb3J3YXJkIGBwYXJhbGxlbF90b29sX2NhbGxzYC4gQ2xpZW50cyBzZW5kIGl0LCBidXRcbiAgICAgIC8vIERhdGFicmlja3MgTW9kZWwgU2VydmluZydzIGNoYXQgQVBJIHJlamVjdHMgdW5rbm93biBmaWVsZHNcbiAgICAgIC8vIChcInBhcmFsbGVsX3Rvb2xfY2FsbHM6IEV4dHJhIGlucHV0cyBhcmUgbm90IHBlcm1pdHRlZFwiKSwgd2hpY2ggd291bGRcbiAgICAgIC8vIGZhaWwgdGhlIHdob2xlIHR1cm4uIERyb3AgaXQuXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2hhdCwgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSB9O1xufVxuXG4vKipcbiAqIFJhaXNlIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYSBSZXNwb25zZXMgcmVxdWVzdCBib2R5LiBJbnZlcnNlIG9mXG4gKiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fTogdXNlZCB3aGVuIGEgY2hhdCBjbGllbnQgaGl0cyBhIFJlc3BvbnNlcy1vbmx5XG4gKiBEYXRhYnJpY2tzIG1vZGVsIChlLmcuIENvZGV4KSBzbyB0aGUgcHJveHkgY2FuIFBPU1QgdG9cbiAqIGAvc2VydmluZy1lbmRwb2ludHMvcmVzcG9uc2VzYCB3aXRob3V0IHRoZSBjbGllbnQga25vd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlc1JlcXVlc3QoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIHJlc3BvbnNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlcyA9IEFycmF5LmlzQXJyYXkoYm9keS5tZXNzYWdlcykgPyBib2R5Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcbiAgbGV0IGluc3RydWN0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIG1lc3NhZ2VzKSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByb2xlID0gdHlwZW9mIG1lc3NhZ2Uucm9sZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2Uucm9sZSA6IFwidXNlclwiO1xuXG4gICAgLy8gTGVhZGluZyBzeXN0ZW0gLyBkZXZlbG9wZXIgbWVzc2FnZXMgYmVjb21lIHRvcC1sZXZlbCBgaW5zdHJ1Y3Rpb25zYC5cbiAgICBpZiAoXG4gICAgICAocm9sZSA9PT0gXCJzeXN0ZW1cIiB8fCByb2xlID09PSBcImRldmVsb3BlclwiKSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25zID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGlucHV0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkgaW5zdHJ1Y3Rpb25zID0gdGV4dDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChyb2xlID09PSBcInRvb2xcIikge1xuICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIixcbiAgICAgICAgY2FsbF9pZDogU3RyaW5nKG1lc3NhZ2UudG9vbF9jYWxsX2lkID8/IFwiXCIpLFxuICAgICAgICBvdXRwdXQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSAmJlxuICAgICAgbWVzc2FnZS50b29sX2NhbGxzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcmF3Q2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgaWYgKCFyYXdDYWxsIHx8IHR5cGVvZiByYXdDYWxsICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICAgICAgaW5wdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3Q2FsbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IHRleHQgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpbnB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZSxcbiAgICAgIGNvbnRlbnQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIGlucHV0LFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG4gIGlmIChpbnN0cnVjdGlvbnMpIHJlc3BvbnNlcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG5cbiAgLy8gQ2hhdCB0b29scyBhcmUgbmVzdGVkIChgZnVuY3Rpb246IHsgbmFtZSwg4oCmIH1gKTsgUmVzcG9uc2VzIHdhbnRzIHRoZW0gZmxhdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG9vbHMgPSBib2R5LnRvb2xzXG4gICAgICAubWFwKHRvUmVzcG9uc2VzVG9vbClcbiAgICAgIC5maWx0ZXIoKHQpOiB0IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHQgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKHRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3BvbnNlcy50b29scyA9IHRvb2xzO1xuICAgICAgaWYgKGJvZHkudG9vbF9jaG9pY2UgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2VzLnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgUmVzcG9uc2VzJyBtYXhfb3V0cHV0X3Rva2VucyBuYW1pbmc7IGZhbGwgYmFjayBmcm9tIGNoYXQgbWF4X3Rva2Vucy5cbiAgaWYgKHR5cGVvZiBib2R5Lm1heF9vdXRwdXRfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfb3V0cHV0X3Rva2VucztcbiAgfSBlbHNlIGlmICh0eXBlb2YgYm9keS5tYXhfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfdG9rZW5zO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzcG9uc2VzLCBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlIH07XG59XG5cbi8qKiBMaWZ0IGEgbm9uLXN0cmVhbWluZyBjaGF0IGNvbXBsZXRpb24gSlNPTiBpbnRvIGEgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlKGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtb2RlbDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNoYXQuY2hvaWNlcykgPyBjaGF0LmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSAoY2hvaWNlc1swXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1lc3NhZ2UgPSAoZmlyc3QubWVzc2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG91dHB1dDogdW5rbm93bltdID0gW107XG5cbiAgY29uc3QgdGV4dCA9IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlLmNvbnRlbnQgOiBcIlwiO1xuICBpZiAodGV4dCkge1xuICAgIG91dHB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dCB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN1cmZhY2UgYW55IHRvb2wgY2FsbHMgYXMgUmVzcG9uc2VzIGBmdW5jdGlvbl9jYWxsYCBvdXRwdXQgaXRlbXMuXG4gIGNvbnN0IHRvb2xDYWxscyA9IEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSA/IG1lc3NhZ2UudG9vbF9jYWxscyA6IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0b29sQ2FsbHMpIHtcbiAgICBvdXRwdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gIH1cblxuICBjb25zdCB1c2FnZSA9IChjaGF0LnVzYWdlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpZDogU3RyaW5nKGNoYXQuaWQgPz8gXCJyZXNwXCIpLFxuICAgIG9iamVjdDogXCJyZXNwb25zZVwiLFxuICAgIGNyZWF0ZWRfYXQ6IHR5cGVvZiBjaGF0LmNyZWF0ZWQgPT09IFwibnVtYmVyXCIgPyBjaGF0LmNyZWF0ZWQgOiAwLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICBvdXRwdXQsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogTnVtYmVyKHVzYWdlLnByb21wdF90b2tlbnMgPz8gMCksXG4gICAgICBvdXRwdXRfdG9rZW5zOiBOdW1iZXIodXNhZ2UuY29tcGxldGlvbl90b2tlbnMgPz8gMCksXG4gICAgICB0b3RhbF90b2tlbnM6IE51bWJlcih1c2FnZS50b3RhbF90b2tlbnMgPz8gMCksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWZ0IGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgIG9iamVjdCBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5LlxuICogSW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiB1c2VkIGFmdGVyIGEgUmVzcG9uc2VzLW9ubHkgdXBzdHJlYW0gY2FsbFxuICogd2hlbiB0aGUgY2xpZW50IHNwb2tlIENoYXQgQ29tcGxldGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvQ2hhdENvbXBsZXRpb24oXG4gIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbW9kZWw6IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyB0ZXh0IH0gPSByZWFkUmVzcG9uc2VzT3V0cHV0KHJlc3BvbnNlKTtcbiAgY29uc3QgdG9vbENhbGxzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5vdXRwdXQpID8gcmVzcG9uc2Uub3V0cHV0IDogW107XG4gIGZvciAoY29uc3QgcmF3IG9mIG91dHB1dCkge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGl0ZW0udHlwZSAhPT0gXCJmdW5jdGlvbl9jYWxsXCIpIGNvbnRpbnVlO1xuICAgIHRvb2xDYWxscy5wdXNoKHRvQ2hhdFRvb2xDYWxsKGl0ZW0pKTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgY29udGVudDogdGV4dCB8fCBudWxsLFxuICB9O1xuICBpZiAodG9vbENhbGxzLmxlbmd0aCA+IDApIG1lc3NhZ2UudG9vbF9jYWxscyA9IHRvb2xDYWxscztcblxuICBjb25zdCB1c2FnZSA9IChyZXNwb25zZS51c2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhyZXNwb25zZS5pZCA/PyBcImNoYXRjbXBsXCIpLFxuICAgIG9iamVjdDogXCJjaGF0LmNvbXBsZXRpb25cIixcbiAgICBjcmVhdGVkOiB0eXBlb2YgcmVzcG9uc2UuY3JlYXRlZF9hdCA9PT0gXCJudW1iZXJcIiA/IHJlc3BvbnNlLmNyZWF0ZWRfYXQgOiAwLFxuICAgIG1vZGVsLFxuICAgIGNob2ljZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpbmlzaF9yZWFzb246IHRvb2xDYWxscy5sZW5ndGggPiAwID8gXCJ0b29sX2NhbGxzXCIgOiBcInN0b3BcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB1c2FnZToge1xuICAgICAgcHJvbXB0X3Rva2VuczogTnVtYmVyKHVzYWdlLmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiBOdW1iZXIodXNhZ2Uub3V0cHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIHRvdGFsX3Rva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEEgdG9vbCBjYWxsJ3MgYGFyZ3VtZW50c2AgSlNPTi4gQm90aCB3aXJlcyBjYXJyeSBpdCBhcyBhbiB1bnBhcnNlZCBzdHJpbmc7XG4gKiBhbnl0aGluZyBlbHNlIChhYnNlbnQsIGFuIGFscmVhZHktcGFyc2VkIG9iamVjdCkgYmVjb21lcyBhbiBlbXB0eSBsaXRlcmFsIHNvXG4gKiB0aGUgcmVjZWl2aW5nIHNpZGUgYWx3YXlzIGhhcyB2YWxpZCBKU09OIHRvIHBhcnNlLlxuICovXG5mdW5jdGlvbiBjYWxsQXJndW1lbnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogXCJ7fVwiO1xufVxuXG4vKipcbiAqIFRoZSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0gZm9yIGEgdG9vbCBjYWxsIGluIGVpdGhlciBzcGVsbGluZzogYSBjaGF0XG4gKiBgdG9vbF9jYWxsc1tdYCBlbnRyeSAoYHtpZCwgZnVuY3Rpb246e25hbWUsIGFyZ3VtZW50c319YCkgb3IgYW4gaXRlbSB0aGF0IGlzXG4gKiBhbHJlYWR5IGZsYXQuXG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb25DYWxsSXRlbShjYWxsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZm4gPSAoY2FsbC5mdW5jdGlvbiA/PyBjYWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICBjYWxsX2lkOiBTdHJpbmcoY2FsbC5jYWxsX2lkID8/IGNhbGwuaWQgPz8gXCJcIiksXG4gICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgYXJndW1lbnRzOiBjYWxsQXJndW1lbnRzKGZuLmFyZ3VtZW50cyksXG4gIH07XG59XG5cbi8qKiBUaGUgY2hhdCBgdG9vbF9jYWxsc1tdYCBlbnRyeSBmb3IgYSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0uICovXG5mdW5jdGlvbiB0b0NoYXRUb29sQ2FsbChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IENoYXRUb29sQ2FsbCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhpdGVtLmNhbGxfaWQgPz8gaXRlbS5pZCA/PyBcIlwiKSxcbiAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgZnVuY3Rpb246IHtcbiAgICAgIG5hbWU6IFN0cmluZyhpdGVtLm5hbWUgPz8gXCJcIiksXG4gICAgICBhcmd1bWVudHM6IGNhbGxBcmd1bWVudHMoaXRlbS5hcmd1bWVudHMpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGNoYXQtbmVzdGVkIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBmdW5jdGlvbjp7bmFtZSwg4oCmfX1gKSBvZiBhIHRvb2xcbiAqIHNwZWMsIG9yIGB1bmRlZmluZWRgIGZvciBhIGJ1aWx0LWluIFJlc3BvbnNlcyB0b29sIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCDigKYpIHRoYXQgY2hhdCBjYW5ub3QgZXhwcmVzcyBhbmQgRGF0YWJyaWNrcyByZWplY3RzLlxuICovXG5mdW5jdGlvbiB0b0NoYXRUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSByZXR1cm4gdG9vbDsgLy8gYWxyZWFkeSBuZXN0ZWRcbiAgaWYgKHR5cGVvZiB0b29sLm5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgIGZ1bmN0aW9uOiB7XG4gICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAuLi4odG9vbC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0b29sLnBhcmFtZXRlcnMgPyB7IHBhcmFtZXRlcnM6IHRvb2wucGFyYW1ldGVycyB9IDoge30pLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGZsYXQgUmVzcG9uc2VzIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBuYW1lLCDigKZ9YCkgb2YgYSB0b29sIHNwZWMuXG4gKiBJbnZlcnNlIG9mIHtAbGluayB0b0NoYXRUb29sfTsgbm9uLWZ1bmN0aW9uIHRvb2xzIGFyZSBkcm9wcGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuZnVuY3Rpb24gdG9SZXNwb25zZXNUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgZm4gPSB0b29sLmZ1bmN0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICBuYW1lOiBmbi5uYW1lLFxuICAgICAgLi4uKGZuLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm4uZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihmbi5wYXJhbWV0ZXJzID8geyBwYXJhbWV0ZXJzOiBmbi5wYXJhbWV0ZXJzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHRvb2wubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHRvb2wgOiB1bmRlZmluZWQ7IC8vIGFscmVhZHkgZmxhdFxufVxuXG4vKiogT25lIFNlcnZlci1TZW50IEV2ZW50LCByZWFkeSB0byB3cml0ZSB0byB0aGUgY2xpZW50LiAqL1xuZnVuY3Rpb24gc3NlKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gYGV2ZW50OiAke2V2ZW50fVxcbmRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9XFxuXFxuYDtcbn1cblxuLyoqXG4gKiBJbmNyZW1lbnRhbCBjaGF0LWNodW5rIC0+IFJlc3BvbnNlcy1TU0UgdHJhbnNsYXRvci4gYGZlZWRgIGFuZCBgZmluaXNoYCBib3RoXG4gKiByZXR1cm4gdGhlIFNTRSBieXRlcyB0byBmb3J3YXJkLCBvciBgXCJcImAgd2hlbiBhIGNodW5rIHByb2R1Y2VkIG5vIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICAvKiogVHJhbnNsYXRlIG9uZSB1cHN0cmVhbSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3QuICovXG4gIGZlZWQoY2h1bms6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nO1xuICAvKiogQ2xvc2UgYW55IG9wZW4gaXRlbXMgYW5kIGVtaXQgYHJlc3BvbnNlLmNvbXBsZXRlZGAuIENhbGwgb25jZSwgYXQgZW5kIG9mIHN0cmVhbS4gKi9cbiAgZmluaXNoKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgYW4gdXBzdHJlYW0gY2hhdC1jb21wbGV0aW9ucyBTU0Ugc3RyZWFtIGludG8gdGhlIFJlc3BvbnNlcyBTU0VcbiAqIGV2ZW50IHN0cmVhbSBhIFJlc3BvbnNlcyBjbGllbnQgY29uc3VtZXMuXG4gKlxuICogVXBzdHJlYW0gY2h1bmtzIGFyZSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3RzIHdob3NlIGBjaG9pY2VzWzBdLmRlbHRhYFxuICogY2FycmllcyBpbmNyZW1lbnRhbCBgY29udGVudGAgKGFzc2lzdGFudCB0ZXh0KSBhbmQvb3IgYHRvb2xfY2FsbHNgIChmdW5jdGlvblxuICogY2FsbHMsIHN0cmVhbWVkIGJ5IGBpbmRleGAgd2l0aCBwYXJ0aWFsIGBhcmd1bWVudHNgKS4gV2UgZW1pdCB0aGUgUmVzcG9uc2VzXG4gKiBsaWZlY3ljbGUgYXJvdW5kIHRoZW06XG4gKlxuICogICByZXNwb25zZS5jcmVhdGVkXG4gKiAgIC0+IHBlciB0ZXh0IHJ1bjogIG91dHB1dF9pdGVtLmFkZGVkIOKGkiBvdXRwdXRfdGV4dC5kZWx0YSog4oaSIG91dHB1dF9pdGVtLmRvbmVcbiAqICAgLT4gcGVyIHRvb2wgY2FsbDogb3V0cHV0X2l0ZW0uYWRkZWQg4oaSIGZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhKlxuICogICAgICAgICAgICAgICAgICAgICAgIOKGkiBmdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lIOKGkiBvdXRwdXRfaXRlbS5kb25lXG4gKiAgIHJlc3BvbnNlLmNvbXBsZXRlZCAgICh3aXRoIHRoZSBhc3NlbWJsZWQgZmluYWwgYHJlc3BvbnNlYCBvYmplY3QpXG4gKlxuICogVGhlIHRyYW5zbGF0b3IgaXMgaW50ZW50aW9uYWxseSB0b2xlcmFudDogbWFsZm9ybWVkL2tlZXBhbGl2ZSBsaW5lcyB5aWVsZFxuICogbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHJlc3BvbnNlSWQ6IHN0cmluZyxcbik6IFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuXG4gIC8vIFRleHQgcnVuIHN0YXRlOiB3aGV0aGVyIGEgbWVzc2FnZSBpdGVtIGlzIGN1cnJlbnRseSBvcGVuLCBhbmQgaXRzIGJ1ZmZlci5cbiAgbGV0IHRleHRPcGVuID0gZmFsc2U7XG4gIGxldCB0ZXh0QnVmZmVyID0gXCJcIjtcbiAgbGV0IHRleHRJdGVtSWQgPSBcIlwiO1xuXG4gIC8vIFRvb2wtY2FsbCBzdGF0ZSwga2V5ZWQgYnkgdGhlIHVwc3RyZWFtIGB0b29sX2NhbGxzW10uaW5kZXhgLlxuICBpbnRlcmZhY2UgVG9vbFN0YXRlIHtcbiAgICBvdXRwdXRJbmRleDogbnVtYmVyO1xuICAgIGNhbGxJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhcmdzOiBzdHJpbmc7XG4gIH1cbiAgY29uc3QgdG9vbHMgPSBuZXcgTWFwPG51bWJlciwgVG9vbFN0YXRlPigpO1xuXG4gIGNvbnN0IGNyZWF0ZWQgPSAoKSA9PlxuICAgIHNzZShcInJlc3BvbnNlLmNyZWF0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jcmVhdGVkXCIsXG4gICAgICByZXNwb25zZTogeyBpZDogcmVzcG9uc2VJZCwgb2JqZWN0OiBcInJlc3BvbnNlXCIsIHN0YXR1czogXCJpbl9wcm9ncmVzc1wiLCBtb2RlbCwgb3V0cHV0OiBbXSB9LFxuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIG9wZW5UZXh0KCk6IHN0cmluZyB7XG4gICAgdGV4dE9wZW4gPSB0cnVlO1xuICAgIHRleHRJdGVtSWQgPSBgJHtyZXNwb25zZUlkfS1tc2ctJHtvdXRwdXRJbmRleH1gO1xuICAgIGNvbnN0IGV2ID0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLFxuICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgIGl0ZW06IHsgaWQ6IHRleHRJdGVtSWQsIHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBbXSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBldjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dE9wZW4pIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBpZDogdGV4dEl0ZW1JZCxcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dDogdGV4dEJ1ZmZlciB9XSxcbiAgICB9O1xuICAgIGNvbnN0IGV2ID1cbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIixcbiAgICAgICAgaXRlbV9pZDogdGV4dEl0ZW1JZCxcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgY29udGVudF9pbmRleDogMCxcbiAgICAgICAgdGV4dDogdGV4dEJ1ZmZlcixcbiAgICAgIH0pICtcbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbSxcbiAgICAgIH0pO1xuICAgIHRleHRPcGVuID0gZmFsc2U7XG4gICAgdGV4dEJ1ZmZlciA9IFwiXCI7XG4gICAgb3V0cHV0SW5kZXggKz0gMTtcbiAgICByZXR1cm4gZXY7XG4gIH1cblxuICBmdW5jdGlvbiBmZWVkKGNodW5rOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgbGV0IG91dCA9IFwiXCI7XG4gICAgaWYgKCFzdGFydGVkKSB7XG4gICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgIG91dCArPSBjcmVhdGVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNodW5rLmNob2ljZXMpID8gY2h1bmsuY2hvaWNlcyA6IFtdO1xuICAgIGNvbnN0IGNob2ljZSA9IChjaG9pY2VzWzBdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBkZWx0YSA9IChjaG9pY2UuZGVsdGEgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQXNzaXN0YW50IHRleHQgZGVsdGFzLlxuICAgIGlmICh0eXBlb2YgZGVsdGEuY29udGVudCA9PT0gXCJzdHJpbmdcIiAmJiBkZWx0YS5jb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghdGV4dE9wZW4pIG91dCArPSBvcGVuVGV4dCgpO1xuICAgICAgdGV4dEJ1ZmZlciArPSBkZWx0YS5jb250ZW50O1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIsIHtcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiLFxuICAgICAgICBpdGVtX2lkOiB0ZXh0SXRlbUlkLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBjb250ZW50X2luZGV4OiAwLFxuICAgICAgICBkZWx0YTogZGVsdGEuY29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRvb2wtY2FsbCBkZWx0YXM6IGVhY2ggaXMga2V5ZWQgYnkgYGluZGV4YDsgYGFyZ3VtZW50c2AgYXJyaXZlcyBpbiBwaWVjZXMuXG4gICAgY29uc3QgdG9vbERlbHRhcyA9IEFycmF5LmlzQXJyYXkoZGVsdGEudG9vbF9jYWxscykgPyBkZWx0YS50b29sX2NhbGxzIDogW107XG4gICAgZm9yIChjb25zdCByYXdUYyBvZiB0b29sRGVsdGFzKSB7XG4gICAgICBjb25zdCB0YyA9IHJhd1RjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgaWR4ID0gTnVtYmVyKHRjLmluZGV4ID8/IDApO1xuICAgICAgY29uc3QgZm4gPSAodGMuZnVuY3Rpb24gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgbGV0IHN0YXRlID0gdG9vbHMuZ2V0KGlkeCk7XG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIC8vIEZpcnN0IGZyYWdtZW50IGZvciB0aGlzIGNhbGw6IGEgdGV4dCBydW4gKGlmIG9wZW4pIG11c3QgY2xvc2UgZmlyc3Qgc29cbiAgICAgICAgLy8gb3V0cHV0IG9yZGVyaW5nIHN0YXlzIG1vbm90b25pYywgdGhlbiB3ZSBvcGVuIGEgZnVuY3Rpb25fY2FsbCBpdGVtLlxuICAgICAgICBvdXQgKz0gY2xvc2VUZXh0KCk7XG4gICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgIG91dHB1dEluZGV4LFxuICAgICAgICAgIGNhbGxJZDogU3RyaW5nKHRjLmlkID8/IGAke3Jlc3BvbnNlSWR9LWNhbGwtJHtpZHh9YCksXG4gICAgICAgICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgICAgICAgYXJnczogXCJcIixcbiAgICAgICAgfTtcbiAgICAgICAgdG9vbHMuc2V0KGlkeCwgc3RhdGUpO1xuICAgICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIixcbiAgICAgICAgICBvdXRwdXRfaW5kZXg6IHN0YXRlLm91dHB1dEluZGV4LFxuICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICAgICAgICAgIGNhbGxfaWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIG91dHB1dEluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZuLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgZm4ubmFtZSAmJiAhc3RhdGUubmFtZSkgc3RhdGUubmFtZSA9IGZuLm5hbWU7XG4gICAgICBpZiAodHlwZW9mIGZuLmFyZ3VtZW50cyA9PT0gXCJzdHJpbmdcIiAmJiBmbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGF0ZS5hcmdzICs9IGZuLmFyZ3VtZW50cztcbiAgICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsIHtcbiAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsXG4gICAgICAgICAgaXRlbV9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgICAgZGVsdGE6IGZuLmFyZ3VtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2goKTogc3RyaW5nIHtcbiAgICBsZXQgb3V0ID0gY2xvc2VUZXh0KCk7XG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gdG9vbCBjYWxscywgZW1pdHRpbmcgdGhlaXIgYXNzZW1ibGVkIGFyZ3VtZW50cy5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRvb2xzLnZhbHVlcygpKSB7XG4gICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLFxuICAgICAgICBpdGVtX2lkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgIGFyZ3VtZW50czogc3RhdGUuYXJncyxcbiAgICAgIH0pO1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBzdGF0ZS5vdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbToge1xuICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgdHlwZTogXCJmdW5jdGlvbl9jYWxsXCIsXG4gICAgICAgICAgY2FsbF9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgYXJndW1lbnRzOiBzdGF0ZS5hcmdzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIG91dCArPSBzc2UoXCJyZXNwb25zZS5jb21wbGV0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jb21wbGV0ZWRcIixcbiAgICAgIHJlc3BvbnNlOiB7IGlkOiByZXNwb25zZUlkLCBvYmplY3Q6IFwicmVzcG9uc2VcIiwgc3RhdHVzOiBcImNvbXBsZXRlZFwiLCBtb2RlbCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICByZXR1cm4geyBmZWVkLCBmaW5pc2ggfTtcbn1cblxuLyoqIEEgc291cmNlIHRoZSBtb2RlbCBjaXRlZCwgYXMgY2FycmllZCBieSBhIFJlc3BvbnNlcyBjb250ZW50LXBhcnQgYW5ub3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzQ2l0YXRpb24ge1xuICB1cmw6IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IHtAbGluayByZWFkUmVzcG9uc2VzT3V0cHV0fSBwdWxscyBvdXQgb2YgYSBgcmVzcG9uc2VgIG9iamVjdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzT3V0cHV0IHtcbiAgLyoqIFRoZSBhc3Npc3RhbnQncyBhbnN3ZXIsIHdpdGggdGhlIG91dHB1dCBpdGVtcyBjb25jYXRlbmF0ZWQuICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIENpdGVkIHNvdXJjZXMgaW4gZmlyc3Qtc2VlbiBvcmRlciwgZGVkdXBsaWNhdGVkIGJ5IFVSTC4gKi9cbiAgY2l0YXRpb25zOiBSZXNwb25zZXNDaXRhdGlvbltdO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGFuc3dlciB0ZXh0IGFuZCBjaXRlZCBzb3VyY2VzIG91dCBvZiBhIFJlc3BvbnNlcyBgcmVzcG9uc2VgIHBheWxvYWQuXG4gKlxuICogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiBpdCBjb25zdW1lcyB3aGF0IGFuIGVuZHBvaW50XG4gKiBzcGVha2luZyBSZXNwb25zZXMgbmF0aXZlbHkgcmV0dXJucywgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIGl0LiBUaGUgRGF0YWJyaWNrc1xuICogbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBhbnN3ZXJzIHRoaXMgd2F5LCB3aXRoIGVhY2ggc291cmNlIGF0dGFjaGVkIGFzIGFcbiAqIGB1cmxfY2l0YXRpb25gIGFubm90YXRpb24gb24gdGhlIGNvbnRlbnQgcGFydCB0aGF0IHVzZWQgaXQuXG4gKlxuICogUHJlZmVycyB0aGUgZmxhdHRlbmVkIGBvdXRwdXRfdGV4dGAgd2hlbiB0aGUgcGF5bG9hZCBjYXJyaWVzIGl0LCBhbmQgZmFsbHNcbiAqIGJhY2sgdG8gd2Fsa2luZyBgb3V0cHV0W10uY29udGVudFtdLnRleHRgLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbCB1cHN0cmVhbSxcbiAqIHNvIGEgcGF5bG9hZCBtaXNzaW5nIGFueSBvZiBpdCB5aWVsZHMgZW1wdHkgcmVzdWx0cyByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZXNwb25zZXNPdXRwdXQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZXNwb25zZXNPdXRwdXQge1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQub3V0cHV0KSA/IChwYXlsb2FkLm91dHB1dCBhcyB1bmtub3duW10pIDogW107XG4gIGNvbnN0IHRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBjaXRhdGlvbnM6IFJlc3BvbnNlc0NpdGF0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcmF3SXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIXJhd0l0ZW0gfHwgdHlwZW9mIHJhd0l0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAocmF3SXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudDtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcmF3UGFydCBvZiBjb250ZW50KSB7XG4gICAgICBpZiAoIXJhd1BhcnQgfHwgdHlwZW9mIHJhd1BhcnQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGFydCA9IHJhd1BhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgcmF3QW5uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAgIGlmICghcmF3QW5uIHx8IHR5cGVvZiByYXdBbm4gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhbm4gPSByYXdBbm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZy50cmltVG9FbXB0eShhbm4udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nLnRyaW1Ub0VtcHR5KGFubi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdGV4dDogc3RyaW5nLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBTdHJpcCB0b29sIHR5cGVzIHRoZSB1cHN0cmVhbSBtb2RlbCBkb2Vzbid0IHN1cHBvcnQgZnJvbSBhIFJlc3BvbnNlcyByZXF1ZXN0XG4gKiBib2R5LCByZXR1cm5pbmcgYSBzaGFsbG93IGNvcHkgc2FmZSB0byBmb3J3YXJkICh0aGUgaW5wdXQgaXMgbm90IG11dGF0ZWQpLlxuICpcbiAqIENsaWVudHMgbGlrZSB0aGUgQ29kZXggQ0xJIGluY2x1ZGUgYnVpbHQtaW4gUmVzcG9uc2VzIHRvb2xzIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCBgY3VzdG9tYCwgLi4uKSBhbG9uZ3NpZGUgdGhlaXIgYGZ1bmN0aW9uYCB0b29scy4gRGF0YWJyaWNrcydcbiAqIE9wZW4gUmVzcG9uc2VzIHN1cmZhY2UgZm9yIEFudGhyb3BpYy9DbGF1ZGUgKGFuZCBvdGhlciBub24tT3BlbkFJIHByb3ZpZGVycylcbiAqIG9ubHkgYWNjZXB0cyBgZnVuY3Rpb25gIHRvb2xzIGFuZCBoYXJkLWVycm9ycyBvdGhlcndpc2U6XG4gKiAgIFwiQW50aHJvcGljIGRvZXMgbm90IHN1cHBvcnQgdG9vbCB0eXBlICd3ZWJfc2VhcmNoJy4gT25seSAnZnVuY3Rpb24nIGlzIHN1cHBvcnRlZC5cIlxuICogQ2FsbCB0aGlzIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgLiBUaGUgT3BlbkFJXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgcGF0aCBzaG91bGQga2VlcCBidWlsdC1pbnMgKEdQVCBzdXBwb3J0cyB0aGVtKS5cbiAqIElmIGZpbHRlcmluZyBlbXB0aWVzIHRoZSBsaXN0LCBgdG9vbHNgIC8gYHRvb2xfY2hvaWNlYCAvIGBwYXJhbGxlbF90b29sX2NhbGxzYFxuICogYXJlIGRyb3BwZWQgc28gd2UgbmV2ZXIgc2VuZCBhbiBlbXB0eSBgdG9vbHM6IFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVzcG9uc2VzVG9vbHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSB8fCBib2R5LnRvb2xzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IGZuVG9vbHMgPSBib2R5LnRvb2xzLmZpbHRlcihcbiAgICAodCkgPT4gdCAmJiB0eXBlb2YgdCA9PT0gXCJvYmplY3RcIiAmJiAodCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikudHlwZSA9PT0gXCJmdW5jdGlvblwiLFxuICApO1xuICBpZiAoZm5Ub29scy5sZW5ndGggPT09IGJvZHkudG9vbHMubGVuZ3RoKSByZXR1cm4gYm9keTsgLy8gbm90aGluZyB0byBzdHJpcFxuICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuICBpZiAoZm5Ub29scy5sZW5ndGggPiAwKSB7XG4gICAgbmV4dC50b29scyA9IGZuVG9vbHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIG5leHQudG9vbHM7XG4gICAgZGVsZXRlIG5leHQudG9vbF9jaG9pY2U7XG4gICAgZGVsZXRlIG5leHQucGFyYWxsZWxfdG9vbF9jYWxscztcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuLyoqXG4gKiBDb250ZW50LXBhcnQgLyBpbnB1dC1pdGVtIHR5cGVzIENsYXVkZSBleHRlbmRlZCB0aGlua2luZyB1c2VzIG9uIHRoZSB3aXJlLlxuICpcbiAqIFNoYXJlZCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgc3RyaXAgdGhlIHNhbWUgc2V0OiB0aGUgUmVzcG9uc2VzIHBhdGggaGVyZVxuICogKHtAbGluayBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dH0pIGFuZCB0aGUgQ2hhdCBDb21wbGV0aW9ucyBwYXRoIGluXG4gKiBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCdzIHNlcnZpbmcgc2FuaXRpemUuIEFudGhyb3BpYyBzaWducyB0aGVzZSBibG9ja3MsXG4gKiBzbyBhIHJlcGxheSB0aGF0IG11dGF0ZXMgb25lIGlzIHJlamVjdGVkIG91dHJpZ2h0IC0gYm90aCBwYXRocyBtdXN0IGFncmVlIG9uXG4gKiB3aGF0IGNvdW50cyBhcyBhIHJlYXNvbmluZyBibG9jay5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQVNPTklOR19UWVBFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcInJlYXNvbmluZ1wiLFxuICBcInRoaW5raW5nXCIsXG4gIFwicmVkYWN0ZWRfdGhpbmtpbmdcIixcbl0pO1xuXG4vKipcbiAqIFJld3JpdGUgUmVzcG9uc2VzIGBpbnB1dGAgc28gT3BlbiBSZXNwb25zZXMgd2lsbCBhY2NlcHQgaXQuXG4gKlxuICogVHdvIE9wZW5BSSAvIENvZGV4IHNoYXBlcyB0aGF0IERhdGFicmlja3MgT3BlbiBSZXNwb25zZXMgKENsYXVkZSwgR2VtaW5pLCDigKYpXG4gKiByZWplY3Q6XG4gKlxuICogMS4gUHJpb3IgYXNzaXN0YW50IHR1cm5zIHdpdGggYG91dHB1dF90ZXh0YCAvIGBvdXRwdXRfKmAgY29udGVudCBwYXJ0cyDigJRcbiAqICAgIE9wZW4gUmVzcG9uc2VzIG9ubHkgYWxsb3dzIGBpbnB1dF90ZXh0YCwgYGlucHV0X2ltYWdlYCwgYGlucHV0X2ZpbGVgLFxuICogICAgYGlucHV0X2F1ZGlvYC4gTWFwIGV2ZXJ5IGBvdXRwdXRfPGtpbmQ+YCBwYXJ0IHRvIGBpbnB1dF88a2luZD5gLlxuICogMi4gUmVwbGF5ZWQgZXh0ZW5kZWQtdGhpbmtpbmcgYmxvY2tzIChgdGhpbmtpbmdgLCBgcmVkYWN0ZWRfdGhpbmtpbmdgLFxuICogICAgYHJlYXNvbmluZ2AgY29udGVudCBwYXJ0cywgYW5kIHRvcC1sZXZlbCBgcmVhc29uaW5nYCBpbnB1dCBpdGVtcykuIENsYXVkZVxuICogICAgc2lnbnMgdGhvc2U7IGFueSBjbGllbnQgcm91bmQtdHJpcCB0aGF0IG11dGF0ZXMgdGhlbSAob3IgYSBjcm9zcy1wcm92aWRlclxuICogICAgcmVwbGF5KSBmYWlscyB3aXRoIGUuZy5cbiAqICAgICAgXCJtZXNzYWdlcy5OLmNvbnRlbnQuTTogSW52YWxpZCBgZGF0YWAgaW4gYHJlZGFjdGVkX3RoaW5raW5nYCBibG9ja1wiXG4gKiAgICBTdHJpcCB0aGVtIOKAlCB0aGUgVUkvY2xpZW50IGFscmVhZHkgc2hvd2VkIHRoZSB0aGlua2luZzsgcmVwbGF5IGRvZXMgbm90XG4gKiAgICBuZWVkIHRoZSBzaWduZWQgYmxvYi4gU2FtZSBwb2xpY3kgYXMgYXBwa2l0LW1hc3RyYSdzIHNlcnZpbmcgc2FuaXRpemUuXG4gKlxuICogUmV0dXJucyBhIHNoYWxsb3cgY29weSB3aGVuIGFueXRoaW5nIGNoYW5nZXM7IG90aGVyd2lzZSB0aGUgaW5wdXQgYm9keS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0KGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYm9keS5pbnB1dCkgfHwgYm9keS5pbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBib2R5O1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBib2R5LmlucHV0KSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgaW5wdXQucHVzaChyYXcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBUb3AtbGV2ZWwgUmVzcG9uc2VzIHJlYXNvbmluZyBpdGVtcyAobm90IG1lc3NhZ2UgY29udGVudCBwYXJ0cykuXG4gICAgaWYgKHR5cGVvZiBpdGVtLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhpdGVtLnR5cGUpKSB7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtLmNvbnRlbnQpKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcGFydENoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjb250ZW50OiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgaXRlbS5jb250ZW50KSB7XG4gICAgICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29udGVudC5wdXNoKHBhcnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHR5cGVvZiBwLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhwLnR5cGUpKSB7XG4gICAgICAgIHBhcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHAudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBwLnR5cGUuc3RhcnRzV2l0aChcIm91dHB1dF9cIikpIHtcbiAgICAgICAgcGFydENoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250ZW50LnB1c2goeyAuLi5wLCB0eXBlOiBgaW5wdXRfJHtwLnR5cGUuc2xpY2UoXCJvdXRwdXRfXCIubGVuZ3RoKX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQucHVzaChwYXJ0KTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnRDaGFuZ2VkKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gICAgLy8gRHJvcCBhc3Npc3RhbnQgdHVybnMgdGhhdCBvbmx5IGNhcnJpZWQgdGhpbmtpbmcgKG5vdGhpbmcgbGVmdCB0byByZXBsYXkpLlxuICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIGNvbnRpbnVlO1xuICAgIGlucHV0LnB1c2goeyAuLi5pdGVtLCBjb250ZW50IH0pO1xuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IC4uLmJvZHksIGlucHV0IH0gOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm5zIHNvIHRoZSB0cmFuc2NyaXB0IGVuZHMgb24gc29tZXRoaW5nIEFudGhyb3BpY1xuICogd2lsbCBjb250aW51ZSBmcm9tLlxuICpcbiAqIERhdGFicmlja3MgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBhIGJvZHkgd2hvc2UgbGFzdCBpdGVtIGlzIGFuIGFzc2lzdGFudFxuICogbWVzc2FnZSB3aXRoIGBcIlRoaXMgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCBhc3Npc3RhbnQgbWVzc2FnZSBwcmVmaWxsLiBUaGVcbiAqIGNvbnZlcnNhdGlvbiBtdXN0IGVuZCB3aXRoIGEgdXNlciBtZXNzYWdlLlwiYCAodGhlIHVwc3RyZWFtIEJlZHJvY2sgcm91dGVcbiAqIGRpc2FsbG93cyBwcmVmaWxsKS4gVHdvIHdheXMgYSByZWFsIGNsaWVudCBoaXRzIGl0OlxuICpcbiAqIDEuIFRoZSBjbGllbnQgcmVwbGF5cyBpdHMgb3duIGxhc3QgYW5zd2VyLiBUaGUgQ29kZXggQ0xJIGRvZXMgdGhpcyB3aGVuIGEgdHVyblxuICogICAgZW5kcyB3aXRob3V0IGEgdG9vbCBjYWxsIGFuZCB0aGUgbmV4dCByZXF1ZXN0IGNhcnJpZXMgdGhlIGZ1bGwgdHJhbnNjcmlwdC5cbiAqIDIuIHtAbGluayBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dH0gQ1JFQVRFUyB0aGUgc2hhcGU6IGEgdHVybiB0aGF0IGVuZGVkIGluIGFcbiAqICAgIGByZWFzb25pbmdgIGl0ZW0gaXMgc3RyaXBwZWQgZm9yIHJlcGxheSBjb21wYXRpYmlsaXR5LCBwcm9tb3RpbmcgdGhlXG4gKiAgICBhc3Npc3RhbnQgbWVzc2FnZSBiZWZvcmUgaXQgdG8gbGFzdC4gUnVubmluZyB0aGlzIHJlcGFpciBhZnRlciB0aGF0IHN0cmlwXG4gKiAgICBpcyB3aGF0IGtlZXBzIG9uZSBmaXggZnJvbSBjYXVzaW5nIHRoZSBvdGhlciBmYWlsdXJlLlxuICpcbiAqIERyb3BwaW5nIGlzIGNvcnJlY3QgcmF0aGVyIHRoYW4gbG9zc3k6IGEgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gY2FycmllcyB0ZXh0XG4gKiB0aGUgbW9kZWwgaXRzZWxmIGp1c3QgcHJvZHVjZWQsIHNvIGl0IGlzIGNvbnRleHQgdGhlIHByb3ZpZGVyIGRvZXMgbm90IG5lZWRcbiAqIHJlcGVhdGVkIGluIG9yZGVyIHRvIGNvbnRpbnVlLiBBcHBlbmRpbmcgYSBzeW50aGV0aWMgYFwiQ29udGludWUuXCJgIHVzZXIgdHVyblxuICogYWxzbyBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVyLCBidXQgaXQgcHV0cyB3b3JkcyBpbiB0aGUgdXNlcidzIG1vdXRoIHRoYXQgc2hvd1xuICogdXAgaW4gdGhlIG1vZGVsJ3MgY29udGV4dCwgc28gdGhpcyB0YWtlcyB0aGUgaG9uZXN0IG9wdGlvbi5cbiAqXG4gKiBBIHRyYWlsaW5nIGBmdW5jdGlvbl9jYWxsYCBpcyBsZWZ0IEFMT05FLiBJdCBpcyBhbHNvIGFuIGFzc2lzdGFudC1zaWRlIGl0ZW0sXG4gKiBidXQgQW50aHJvcGljIHJlamVjdHMgYW4gdW5hbnN3ZXJlZCBgdG9vbF91c2VgIG9uIGEgZGlmZmVyZW50IHJ1bGVcbiAqIChgdG9vbF91c2VgIGlkcyB3aXRob3V0IGB0b29sX3Jlc3VsdGApLCBhbmQgZHJvcHBpbmcgaXQgd291bGQgc2lsZW50bHkgZGlzY2FyZFxuICogYSB0b29sIGNhbGwgdGhlIGNsaWVudCBpcyBhYm91dCB0byBhbnN3ZXIuIFRoYXQgaXMgdGhlIGNsaWVudCdzIGJ1ZyB0byBmaXgsXG4gKiBub3Qgc29tZXRoaW5nIHRvIHBhcGVyIG92ZXIgaGVyZS5cbiAqXG4gKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IHdoZW4gYW55dGhpbmcgY2hhbmdlczsgb3RoZXJ3aXNlIHRoZSBpbnB1dCBib2R5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyVHJhaWxpbmdBc3Npc3RhbnRJbnB1dChcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSB8fCBib2R5LmlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG5cbiAgY29uc3QgaW5wdXQgPSBbLi4uYm9keS5pbnB1dF07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIC8vIEEgbG9vcCwgbm90IG9uZSBjaGVjazogc3RyaXBwaW5nIHJlYXNvbmluZyBjYW4gbGVhdmUgc2V2ZXJhbCBhc3Npc3RhbnRcbiAgLy8gdHVybnMgaW4gYSByb3cgYXQgdGhlIGVuZC5cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA+IDAgJiYgaXNBc3Npc3RhbnRNZXNzYWdlSXRlbShpbnB1dFtpbnB1dC5sZW5ndGggLSAxXSkpIHtcbiAgICBpbnB1dC5wb3AoKTtcbiAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgfVxuICAvLyBOZXZlciBzZW5kIGFuIGVtcHR5IGBpbnB1dGA6IGFuIGFsbC1hc3Npc3RhbnQgdHJhbnNjcmlwdCBpcyBub3Qgc29tZXRoaW5nXG4gIC8vIHRoaXMgcmVwYWlyIGNhbiByZXNjdWUsIHNvIGxlYXZlIHRoZSBib2R5IGZvciB0aGUgcHJvdmlkZXIgdG8gcmVqZWN0IHdpdGhcbiAgLy8gaXRzIG93biBtZXNzYWdlIHJhdGhlciB0aGFuIGludmVudGluZyBhIHJlcXVlc3QuXG4gIGlmICghY2hhbmdlZCB8fCBpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBib2R5O1xuICByZXR1cm4geyAuLi5ib2R5LCBpbnB1dCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gYGlucHV0YCBpdGVtIGlzIGFuIGFzc2lzdGFudCBNRVNTQUdFICh0aGUgcHJlZmlsbCB0cmlnZ2VyKSwgYXNcbiAqIG9wcG9zZWQgdG8gYSBgZnVuY3Rpb25fY2FsbGAgb3IgYW55IG90aGVyIGFzc2lzdGFudC1zaWRlIGl0ZW0gdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNBc3Npc3RhbnRNZXNzYWdlSXRlbSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpdGVtID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChpdGVtLnJvbGUgIT09IFwiYXNzaXN0YW50XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGl0ZW0udHlwZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCI7XG59XG5cbi8qKlxuICogRnVsbCBPcGVuIFJlc3BvbnNlcyByZXF1ZXN0IHNhbml0aXplcjogc3RyaXAgbm9uLWBmdW5jdGlvbmAgdG9vbHMsIHJld3JpdGVcbiAqIGBvdXRwdXRfKmAgY29udGVudCBwYXJ0cywgZHJvcCB0aGlua2luZyAvIHJlYXNvbmluZyBibG9ja3MsIGFuZCBkcm9wIGFcbiAqIHRyYWlsaW5nIGFzc2lzdGFudCB0dXJuIHRoZSBwcm92aWRlciB3b3VsZCByZWFkIGFzIGEgcHJlZmlsbC4gU2FmZSBuby1vcFxuICogd2hlbiBub3RoaW5nIG5lZWRzIGNoYW5naW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPcGVuUmVzcG9uc2VzUmVxdWVzdChcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiByZXBhaXJUcmFpbGluZ0Fzc2lzdGFudElucHV0KHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0KHNhbml0aXplUmVzcG9uc2VzVG9vbHMoYm9keSkpKTtcbn1cbiJdfQ==
754
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlc3BvbnNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUdMLGdCQUFnQixFQUNoQixpQkFBaUIsR0FDbEIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUE2QjtJQUkzRCxNQUFNLFFBQVEsR0FBa0IsRUFBRSxDQUFDO0lBRW5DLHFEQUFxRDtJQUNyRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsNERBQTREO0lBQzVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQzlDLE1BQU0sSUFBSSxHQUFHLEdBQThCLENBQUM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV2QixJQUFJLElBQUksS0FBSyxlQUFl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LENBQUM7SUFDcEIseUVBQXlFO0lBQ3pFLDZCQUE2QjtJQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLG1EQUFtRDtJQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLEtBQWdDLENBQUM7SUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsSUFBNkI7SUFFN0IsT0FBTyw0QkFBNEIsQ0FBQywwQkFBMEIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgPC0+IENoYXQgQ29tcGxldGlvbnMgdHJhbnNsYXRpb24uXG4gKlxuICogU29tZSBjbGllbnRzIHNwZWFrIG9ubHkgdGhlIFJlc3BvbnNlcyBBUEkgKGBQT1NUIC92MS9yZXNwb25zZXNgKSAtIHRoZSBDb2RleFxuICogQ0xJIGlzIHRoZSBtb3RpdmF0aW5nIG9uZS4gRGF0YWJyaWNrcyBub3cgYWxzbyBleHBvc2VzIG5hdGl2ZSBSZXNwb25zZXNcbiAqIHN1cmZhY2VzIChgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgYW5kIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgKSxcbiAqIHdoaWxlIG1vc3QgZW5kcG9pbnRzIHN0aWxsIHNwZWFrIENoYXQgQ29tcGxldGlvbnMgYXQgYC9pbnZvY2F0aW9uc2AuIFRoaXNcbiAqIG1vZHVsZSBicmlkZ2VzIHRoZSB0d28sIGluIGJvdGggZGlyZWN0aW9uczpcbiAqXG4gKiAgIC0ge0BsaW5rIHJlc3BvbnNlc1RvQ2hhdH0gbG93ZXJzIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXRcbiAqICAgICBjb21wbGV0aW9ucyBib2R5IChpbnN0cnVjdGlvbnMgLT4gc3lzdGVtIG1lc3NhZ2UsIHR5cGVkIGBpbnB1dGAgaXRlbXMgLT5cbiAqICAgICBgbWVzc2FnZXNgLCBgdG9vbHNgL2B0b29sX2Nob2ljZWAgY2FycmllZCB0aHJvdWdoLCBmdW5jdGlvbi1jYWxsIG91dHB1dHNcbiAqICAgICBmb2xkZWQgYmFjayBpbnRvIHRoZSB0cmFuc2NyaXB0KS5cbiAqICAgLSB7QGxpbmsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdH0gcmFpc2VzIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYVxuICogICAgIFJlc3BvbnNlcyByZXF1ZXN0ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fSksIGZvciByb3V0aW5nIGFcbiAqICAgICBjaGF0IGNsaWVudCBhdCBhIFJlc3BvbnNlcy1vbmx5IG1vZGVsIGxpa2UgQ29kZXguXG4gKiAgIC0ge0BsaW5rIGNoYXRUb1Jlc3BvbnNlfSBsaWZ0cyBhIG5vbi1zdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uIGJhY2sgaW50byBhXG4gKiAgICAgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LlxuICogICAtIHtAbGluayByZXNwb25zZVRvQ2hhdENvbXBsZXRpb259IGxpZnRzIGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgXG4gKiAgICAgYmFjayBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9KS5cbiAqICAgLSB7QGxpbmsgY3JlYXRlUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvcn0gbGlmdHMgYSBzdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uXG4gKiAgICAgKGFuIE9wZW5BSSBTU0UgYGNoYXQuY29tcGxldGlvbi5jaHVua2Agc3RyZWFtKSBpbnRvIHRoZSBSZXNwb25zZXMgU1NFXG4gKiAgICAgZXZlbnQgc3RyZWFtIHRob3NlIGNsaWVudHMgY29uc3VtZSAoYHJlc3BvbnNlLmNyZWF0ZWRgLFxuICogICAgIGByZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YWAsIGZ1bmN0aW9uLWNhbGwgYXJndW1lbnQgZGVsdGFzLFxuICogICAgIGByZXNwb25zZS5jb21wbGV0ZWRgKS5cbiAqICAgLSB7QGxpbmsgcmVhZFJlc3BvbnNlc091dHB1dH0gcmVhZHMgdGhlIG90aGVyIGRpcmVjdGlvbjogcHVsbCB0aGUgYW5zd2VyXG4gKiAgICAgdGV4dCBhbmQgY2l0YXRpb25zIG91dCBvZiBhIGByZXNwb25zZWAgb2JqZWN0IHJldHVybmVkIGJ5IGFuIGVuZHBvaW50XG4gKiAgICAgdGhhdCBzcGVha3MgUmVzcG9uc2VzIG5hdGl2ZWx5ICh0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sKS5cbiAqICAgLSB7QGxpbmsgc2FuaXRpemVSZXNwb25zZXNUb29sc30ga2VlcHMgb25seSBgZnVuY3Rpb25gIHRvb2xzIG9uIGEgUmVzcG9uc2VzXG4gKiAgICAgcmVxdWVzdCBib2R5IChmb3IgYC9vcGVuLXJlc3BvbnNlc2AgLyBBbnRocm9waWMsIHdoaWNoIHJlamVjdCBDb2RleFxuICogICAgIGJ1aWx0LWlucyBsaWtlIGB3ZWJfc2VhcmNoYCkuXG4gKiAgIC0ge0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSByZXdyaXRlcyBgb3V0cHV0XypgIGNvbnRlbnQgcGFydCB0eXBlc1xuICogICAgIGluIGBpbnB1dGAgdG8gYGlucHV0XypgLCBhbmQgZHJvcHMgQ2xhdWRlIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2Nrc1xuICogICAgIHRoYXQgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBvbiByZXBsYXkgKGByZWRhY3RlZF90aGlua2luZ2AsIOKApikuXG4gKiAgIC0ge0BsaW5rIHJlcGFpclRyYWlsaW5nQXNzaXN0YW50SW5wdXR9IGRyb3BzIGEgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gdGhhdFxuICogICAgIEFudGhyb3BpYyByZWFkcyBhcyBhIHByZWZpbGwgcmVxdWVzdCwgdGhlIFJlc3BvbnNlcy1zaWRlIGNvdW50ZXJwYXJ0IHRvXG4gKiAgICAgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBgcmVwYWlyQXNzaXN0YW50UHJlZmlsbGAuXG4gKlxuICogT25seSB0aGUgc3VyZmFjZSByZWFsIGNsaWVudHMgZXhlcmNpc2UgaXMgdHJhbnNsYXRlZDsgdW5rbm93biBmaWVsZHMgYXJlXG4gKiBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkLCBzbyBhIG5ld2VyIGNsaWVudCBkZWdyYWRlcyBpbnN0ZWFkIG9mIGJyZWFraW5nLlxuICpcbiAqIEJyb3dzZXItc2FmZTogcHVyZSBmdW5jdGlvbnMgb3ZlciBwbGFpbiBKU09OLCBubyB0cmFuc3BvcnQgYW5kIG5vIE5vZGVcbiAqIGJ1aWx0LWlucywgc28gdGhlIHNhbWUgdHJhbnNsYXRpb24gcnVucyBpbiBhIHByb3h5LCBhIHNlcnZlciByb3V0ZSwgb3IgYSB0ZXN0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQge1xuICB0eXBlIENoYXRNZXNzYWdlLFxuICB0eXBlIENoYXRUb29sQ2FsbCxcbiAgY2hhdENvbnRlbnRQYXJ0cyxcbiAgY2hhdENvbnRlbnRUb1RleHQsXG59IGZyb20gXCIuL29wZW5haS1jaGF0LnRzXCI7XG5cbi8qKlxuICogTG93ZXIgYSBSZXNwb25zZXMgcmVxdWVzdCBib2R5IHRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5LiBSZXR1cm5zIHRoZSBjaGF0XG4gKiBib2R5IHBsdXMgd2hldGhlciB0aGUgY2FsbGVyIGFza2VkIGZvciBzdHJlYW1pbmcgKHRoZSBzZXJ2ZXIgbmVlZHMgaXQgdG8gcGlja1xuICogdGhlIHVwc3RyZWFtIGBhY2NlcHRgIGhlYWRlciBhbmQgdGhlIHRyYW5zbGF0aW9uIHBhdGgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2VzVG9DaGF0KGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBjaGF0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc3RyZWFtOiBib29sZWFuO1xufSB7XG4gIGNvbnN0IG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XG5cbiAgLy8gYGluc3RydWN0aW9uc2AgYmVjb21lcyB0aGUgbGVhZGluZyBzeXN0ZW0gbWVzc2FnZS5cbiAgaWYgKHR5cGVvZiBib2R5Lmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lmluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IGJvZHkuaW5zdHJ1Y3Rpb25zIH0pO1xuICB9XG5cbiAgLy8gYGlucHV0YCBpcyBhbiBhcnJheSBvZiB0eXBlZCBpdGVtczogbWVzc2FnZXMsIGZ1bmN0aW9uX2NhbGwsIGFuZFxuICAvLyBmdW5jdGlvbl9jYWxsX291dHB1dC4gRm9sZCBlYWNoIGludG8gdGhlIGNoYXQgdHJhbnNjcmlwdC5cbiAgY29uc3QgaW5wdXQgPSBBcnJheS5pc0FycmF5KGJvZHkuaW5wdXQpID8gYm9keS5pbnB1dCA6IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBpbnB1dCkge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcblxuICAgIGlmICh0eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIikge1xuICAgICAgLy8gQSBwcmlvciB0b29sIGNhbGwgdGhlIG1vZGVsIG1hZGU7IHJlLWF0dGFjaCBpdCB0byBhbiBhc3Npc3RhbnQgdHVybi5cbiAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBjb250ZW50OiBudWxsLFxuICAgICAgICB0b29sX2NhbGxzOiBbdG9DaGF0VG9vbENhbGwoaXRlbSldLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICAvLyBUaGUgdG9vbCdzIHJlc3VsdCwga2V5ZWQgYmFjayB0byB0aGUgY2FsbCBpdCBhbnN3ZXJzLlxuICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgIHJvbGU6IFwidG9vbFwiLFxuICAgICAgICB0b29sX2NhbGxfaWQ6IFN0cmluZyhpdGVtLmNhbGxfaWQgPz8gaXRlbS5pZCA/PyBcIlwiKSxcbiAgICAgICAgY29udGVudDogdHlwZW9mIGl0ZW0ub3V0cHV0ID09PSBcInN0cmluZ1wiID8gaXRlbS5vdXRwdXQgOiBjaGF0Q29udGVudFRvVGV4dChpdGVtLm91dHB1dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQ6IGEgbWVzc2FnZSBpdGVtIHdpdGggYSByb2xlIGFuZCB0eXBlZCBjb250ZW50LlxuICAgIGNvbnN0IHJvbGUgPSB0eXBlb2YgaXRlbS5yb2xlID09PSBcInN0cmluZ1wiID8gaXRlbS5yb2xlIDogXCJ1c2VyXCI7XG4gICAgLy8gQ2hhdCBoYXMgbm8gXCJkZXZlbG9wZXJcIiByb2xlOyB0cmVhdCBpdCBhcyBzeXN0ZW0gKGl0cyBpbnRlbnQgaGVyZSkuXG4gICAgY29uc3QgY2hhdFJvbGUgPSByb2xlID09PSBcImRldmVsb3BlclwiID8gXCJzeXN0ZW1cIiA6IHJvbGU7XG4gICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IGNoYXRSb2xlLCBjb250ZW50OiBjaGF0Q29udGVudFRvVGV4dChpdGVtLmNvbnRlbnQpIH0pO1xuICB9XG5cbiAgY29uc3QgY2hhdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgbW9kZWw6IGJvZHkubW9kZWwsXG4gICAgbWVzc2FnZXMsXG4gICAgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgfTtcblxuICAvLyBDYXJyeSB0aHJvdWdoIGZ1bmN0aW9uLWNhbGxpbmcgY29uZmlnIHdoZW4gcHJlc2VudC4gUmVzcG9uc2VzIGZ1bmN0aW9uXG4gIC8vIHRvb2xzIGFyZSBGTEFUIChge3R5cGU6XCJmdW5jdGlvblwiLCBuYW1lLCBkZXNjcmlwdGlvbiwgcGFyYW1ldGVyc31gKTsgY2hhdFxuICAvLyB3YW50cyB0aGVtIE5FU1RFRCAoYHt0eXBlOlwiZnVuY3Rpb25cIiwgZnVuY3Rpb246e25hbWUsIOKApn19YCkuIENsaWVudHMgYWxzb1xuICAvLyBzZW5kIGJ1aWx0LWluIHRvb2wgdHlwZXMgKGxvY2FsX3NoZWxsLCB3ZWJfc2VhcmNoLCDigKYpIHRoYXQgRGF0YWJyaWNrcyBjaGF0XG4gIC8vIHJlamVjdHMgKFwiTWlzc2luZyAnZnVuY3Rpb24nIGluIHRoZSB0b29sIHNwZWNpZmljYXRpb25cIiksIHNvIHdlIHRyYW5zbGF0ZVxuICAvLyBvbmx5IGZ1bmN0aW9uIHRvb2xzIGFuZCBkcm9wIHRoZSByZXN0LlxuICBpZiAoQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSAmJiBib2R5LnRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjaGF0VG9vbHMgPSBib2R5LnRvb2xzXG4gICAgICAubWFwKHRvQ2hhdFRvb2wpXG4gICAgICAuZmlsdGVyKCh0KTogdCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB0ICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChjaGF0VG9vbHMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhdC50b29scyA9IGNoYXRUb29scztcbiAgICAgIGlmIChib2R5LnRvb2xfY2hvaWNlICE9PSB1bmRlZmluZWQpIGNoYXQudG9vbF9jaG9pY2UgPSBib2R5LnRvb2xfY2hvaWNlO1xuICAgICAgLy8gTk9URTogZG8gTk9UIGZvcndhcmQgYHBhcmFsbGVsX3Rvb2xfY2FsbHNgLiBDbGllbnRzIHNlbmQgaXQsIGJ1dFxuICAgICAgLy8gRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nJ3MgY2hhdCBBUEkgcmVqZWN0cyB1bmtub3duIGZpZWxkc1xuICAgICAgLy8gKFwicGFyYWxsZWxfdG9vbF9jYWxsczogRXh0cmEgaW5wdXRzIGFyZSBub3QgcGVybWl0dGVkXCIpLCB3aGljaCB3b3VsZFxuICAgICAgLy8gZmFpbCB0aGUgd2hvbGUgdHVybi4gRHJvcCBpdC5cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjaGF0LCBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlIH07XG59XG5cbi8qKlxuICogUmFpc2UgYSBjaGF0LWNvbXBsZXRpb25zIHJlcXVlc3QgaW50byBhIFJlc3BvbnNlcyByZXF1ZXN0IGJvZHkuIEludmVyc2Ugb2ZcbiAqIHtAbGluayByZXNwb25zZXNUb0NoYXR9OiB1c2VkIHdoZW4gYSBjaGF0IGNsaWVudCBoaXRzIGEgUmVzcG9uc2VzLW9ubHlcbiAqIERhdGFicmlja3MgbW9kZWwgKGUuZy4gQ29kZXgpIHNvIHRoZSBwcm94eSBjYW4gUE9TVCB0b1xuICogYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgIHdpdGhvdXQgdGhlIGNsaWVudCBrbm93aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFRvUmVzcG9uc2VzUmVxdWVzdChib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgcmVzcG9uc2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc3RyZWFtOiBib29sZWFuO1xufSB7XG4gIGNvbnN0IG1lc3NhZ2VzID0gQXJyYXkuaXNBcnJheShib2R5Lm1lc3NhZ2VzKSA/IGJvZHkubWVzc2FnZXMgOiBbXTtcbiAgY29uc3QgaW5wdXQ6IHVua25vd25bXSA9IFtdO1xuICBsZXQgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCByYXcgb2YgbWVzc2FnZXMpIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBtZXNzYWdlID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJvbGUgPSB0eXBlb2YgbWVzc2FnZS5yb2xlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZS5yb2xlIDogXCJ1c2VyXCI7XG5cbiAgICAvLyBMZWFkaW5nIHN5c3RlbSAvIGRldmVsb3BlciBtZXNzYWdlcyBiZWNvbWUgdG9wLWxldmVsIGBpbnN0cnVjdGlvbnNgLlxuICAgIGlmIChcbiAgICAgIChyb2xlID09PSBcInN5c3RlbVwiIHx8IHJvbGUgPT09IFwiZGV2ZWxvcGVyXCIpICYmXG4gICAgICBpbnN0cnVjdGlvbnMgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgaW5wdXQubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KTtcbiAgICAgIGlmICh0ZXh0KSBpbnN0cnVjdGlvbnMgPSB0ZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHJvbGUgPT09IFwidG9vbFwiKSB7XG4gICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiLFxuICAgICAgICBjYWxsX2lkOiBTdHJpbmcobWVzc2FnZS50b29sX2NhbGxfaWQgPz8gXCJcIiksXG4gICAgICAgIG91dHB1dDogY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgQXJyYXkuaXNBcnJheShtZXNzYWdlLnRvb2xfY2FsbHMpICYmXG4gICAgICBtZXNzYWdlLnRvb2xfY2FsbHMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgZm9yIChjb25zdCByYXdDYWxsIG9mIG1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICBpZiAoIXJhd0NhbGwgfHwgdHlwZW9mIHJhd0NhbGwgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgICBpbnB1dC5wdXNoKHRvRnVuY3Rpb25DYWxsSXRlbShyYXdDYWxsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0ID0gY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KTtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIm1lc3NhZ2VcIiwgcm9sZTogXCJhc3Npc3RhbnRcIiwgY29udGVudDogdGV4dCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlucHV0LnB1c2goe1xuICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICByb2xlLFxuICAgICAgY29udGVudDogY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgbW9kZWw6IGJvZHkubW9kZWwsXG4gICAgaW5wdXQsXG4gICAgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgfTtcbiAgaWYgKGluc3RydWN0aW9ucykgcmVzcG9uc2VzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcblxuICAvLyBDaGF0IHRvb2xzIGFyZSBuZXN0ZWQgKGBmdW5jdGlvbjogeyBuYW1lLCDigKYgfWApOyBSZXNwb25zZXMgd2FudHMgdGhlbSBmbGF0LlxuICBpZiAoQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSAmJiBib2R5LnRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB0b29scyA9IGJvZHkudG9vbHNcbiAgICAgIC5tYXAodG9SZXNwb25zZXNUb29sKVxuICAgICAgLmZpbHRlcigodCk6IHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gdCAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAodG9vbHMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzcG9uc2VzLnRvb2xzID0gdG9vbHM7XG4gICAgICBpZiAoYm9keS50b29sX2Nob2ljZSAhPT0gdW5kZWZpbmVkKSByZXNwb25zZXMudG9vbF9jaG9pY2UgPSBib2R5LnRvb2xfY2hvaWNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByZWZlciBSZXNwb25zZXMnIG1heF9vdXRwdXRfdG9rZW5zIG5hbWluZzsgZmFsbCBiYWNrIGZyb20gY2hhdCBtYXhfdG9rZW5zLlxuICBpZiAodHlwZW9mIGJvZHkubWF4X291dHB1dF90b2tlbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXNwb25zZXMubWF4X291dHB1dF90b2tlbnMgPSBib2R5Lm1heF9vdXRwdXRfdG9rZW5zO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5Lm1heF90b2tlbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXNwb25zZXMubWF4X291dHB1dF90b2tlbnMgPSBib2R5Lm1heF90b2tlbnM7XG4gIH1cblxuICByZXR1cm4geyByZXNwb25zZXMsIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUgfTtcbn1cblxuLyoqIExpZnQgYSBub24tc3RyZWFtaW5nIGNoYXQgY29tcGxldGlvbiBKU09OIGludG8gYSBSZXNwb25zZXMgYHJlc3BvbnNlYCBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFRvUmVzcG9uc2UoY2hhdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1vZGVsOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkoY2hhdC5jaG9pY2VzKSA/IGNoYXQuY2hvaWNlcyA6IFtdO1xuICBjb25zdCBmaXJzdCA9IChjaG9pY2VzWzBdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbWVzc2FnZSA9IChmaXJzdC5tZXNzYWdlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qgb3V0cHV0OiB1bmtub3duW10gPSBbXTtcblxuICBjb25zdCB0ZXh0ID0gdHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UuY29udGVudCA6IFwiXCI7XG4gIGlmICh0ZXh0KSB7XG4gICAgb3V0cHV0LnB1c2goe1xuICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgY29udGVudDogW3sgdHlwZTogXCJvdXRwdXRfdGV4dFwiLCB0ZXh0IH1dLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gU3VyZmFjZSBhbnkgdG9vbCBjYWxscyBhcyBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIG91dHB1dCBpdGVtcy5cbiAgY29uc3QgdG9vbENhbGxzID0gQXJyYXkuaXNBcnJheShtZXNzYWdlLnRvb2xfY2FsbHMpID8gbWVzc2FnZS50b29sX2NhbGxzIDogW107XG4gIGZvciAoY29uc3QgcmF3IG9mIHRvb2xDYWxscykge1xuICAgIG91dHB1dC5wdXNoKHRvRnVuY3Rpb25DYWxsSXRlbShyYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgfVxuXG4gIGNvbnN0IHVzYWdlID0gKGNoYXQudXNhZ2UgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4ge1xuICAgIGlkOiBTdHJpbmcoY2hhdC5pZCA/PyBcInJlc3BcIiksXG4gICAgb2JqZWN0OiBcInJlc3BvbnNlXCIsXG4gICAgY3JlYXRlZF9hdDogdHlwZW9mIGNoYXQuY3JlYXRlZCA9PT0gXCJudW1iZXJcIiA/IGNoYXQuY3JlYXRlZCA6IDAsXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxuICAgIG91dHB1dCxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiBOdW1iZXIodXNhZ2UucHJvbXB0X3Rva2VucyA/PyAwKSxcbiAgICAgIG91dHB1dF90b2tlbnM6IE51bWJlcih1c2FnZS5jb21wbGV0aW9uX3Rva2VucyA/PyAwKSxcbiAgICAgIHRvdGFsX3Rva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIExpZnQgYSBuYXRpdmUgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0IGludG8gYSBjaGF0LWNvbXBsZXRpb25zIGJvZHkuXG4gKiBJbnZlcnNlIG9mIHtAbGluayBjaGF0VG9SZXNwb25zZX06IHVzZWQgYWZ0ZXIgYSBSZXNwb25zZXMtb25seSB1cHN0cmVhbSBjYWxsXG4gKiB3aGVuIHRoZSBjbGllbnQgc3Bva2UgQ2hhdCBDb21wbGV0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlVG9DaGF0Q29tcGxldGlvbihcbiAgcmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBtb2RlbDogc3RyaW5nLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IHRleHQgfSA9IHJlYWRSZXNwb25zZXNPdXRwdXQocmVzcG9uc2UpO1xuICBjb25zdCB0b29sQ2FsbHM6IHVua25vd25bXSA9IFtdO1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLm91dHB1dCkgPyByZXNwb25zZS5vdXRwdXQgOiBbXTtcbiAgZm9yIChjb25zdCByYXcgb2Ygb3V0cHV0KSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3QgaXRlbSA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXRlbS50eXBlICE9PSBcImZ1bmN0aW9uX2NhbGxcIikgY29udGludWU7XG4gICAgdG9vbENhbGxzLnB1c2godG9DaGF0VG9vbENhbGwoaXRlbSkpO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICBjb250ZW50OiB0ZXh0IHx8IG51bGwsXG4gIH07XG4gIGlmICh0b29sQ2FsbHMubGVuZ3RoID4gMCkgbWVzc2FnZS50b29sX2NhbGxzID0gdG9vbENhbGxzO1xuXG4gIGNvbnN0IHVzYWdlID0gKHJlc3BvbnNlLnVzYWdlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpZDogU3RyaW5nKHJlc3BvbnNlLmlkID8/IFwiY2hhdGNtcGxcIiksXG4gICAgb2JqZWN0OiBcImNoYXQuY29tcGxldGlvblwiLFxuICAgIGNyZWF0ZWQ6IHR5cGVvZiByZXNwb25zZS5jcmVhdGVkX2F0ID09PSBcIm51bWJlclwiID8gcmVzcG9uc2UuY3JlYXRlZF9hdCA6IDAsXG4gICAgbW9kZWwsXG4gICAgY2hvaWNlczogW1xuICAgICAge1xuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZmluaXNoX3JlYXNvbjogdG9vbENhbGxzLmxlbmd0aCA+IDAgPyBcInRvb2xfY2FsbHNcIiA6IFwic3RvcFwiLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHVzYWdlOiB7XG4gICAgICBwcm9tcHRfdG9rZW5zOiBOdW1iZXIodXNhZ2UuaW5wdXRfdG9rZW5zID8/IDApLFxuICAgICAgY29tcGxldGlvbl90b2tlbnM6IE51bWJlcih1c2FnZS5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgICAgdG90YWxfdG9rZW5zOiBOdW1iZXIodXNhZ2UudG90YWxfdG9rZW5zID8/IDApLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQSB0b29sIGNhbGwncyBgYXJndW1lbnRzYCBKU09OLiBCb3RoIHdpcmVzIGNhcnJ5IGl0IGFzIGFuIHVucGFyc2VkIHN0cmluZztcbiAqIGFueXRoaW5nIGVsc2UgKGFic2VudCwgYW4gYWxyZWFkeS1wYXJzZWQgb2JqZWN0KSBiZWNvbWVzIGFuIGVtcHR5IGxpdGVyYWwgc29cbiAqIHRoZSByZWNlaXZpbmcgc2lkZSBhbHdheXMgaGFzIHZhbGlkIEpTT04gdG8gcGFyc2UuXG4gKi9cbmZ1bmN0aW9uIGNhbGxBcmd1bWVudHModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiBcInt9XCI7XG59XG5cbi8qKlxuICogVGhlIFJlc3BvbnNlcyBgZnVuY3Rpb25fY2FsbGAgaXRlbSBmb3IgYSB0b29sIGNhbGwgaW4gZWl0aGVyIHNwZWxsaW5nOiBhIGNoYXRcbiAqIGB0b29sX2NhbGxzW11gIGVudHJ5IChge2lkLCBmdW5jdGlvbjp7bmFtZSwgYXJndW1lbnRzfX1gKSBvciBhbiBpdGVtIHRoYXQgaXNcbiAqIGFscmVhZHkgZmxhdC5cbiAqL1xuZnVuY3Rpb24gdG9GdW5jdGlvbkNhbGxJdGVtKGNhbGw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBmbiA9IChjYWxsLmZ1bmN0aW9uID8/IGNhbGwpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuICAgIGNhbGxfaWQ6IFN0cmluZyhjYWxsLmNhbGxfaWQgPz8gY2FsbC5pZCA/PyBcIlwiKSxcbiAgICBuYW1lOiBTdHJpbmcoZm4ubmFtZSA/PyBcIlwiKSxcbiAgICBhcmd1bWVudHM6IGNhbGxBcmd1bWVudHMoZm4uYXJndW1lbnRzKSxcbiAgfTtcbn1cblxuLyoqIFRoZSBjaGF0IGB0b29sX2NhbGxzW11gIGVudHJ5IGZvciBhIFJlc3BvbnNlcyBgZnVuY3Rpb25fY2FsbGAgaXRlbS4gKi9cbmZ1bmN0aW9uIHRvQ2hhdFRvb2xDYWxsKGl0ZW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogQ2hhdFRvb2xDYWxsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogU3RyaW5nKGl0ZW0uY2FsbF9pZCA/PyBpdGVtLmlkID8/IFwiXCIpLFxuICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICBmdW5jdGlvbjoge1xuICAgICAgbmFtZTogU3RyaW5nKGl0ZW0ubmFtZSA/PyBcIlwiKSxcbiAgICAgIGFyZ3VtZW50czogY2FsbEFyZ3VtZW50cyhpdGVtLmFyZ3VtZW50cyksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgY2hhdC1uZXN0ZWQgc3BlbGxpbmcgKGB7dHlwZTpcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uOntuYW1lLCDigKZ9fWApIG9mIGEgdG9vbFxuICogc3BlYywgb3IgYHVuZGVmaW5lZGAgZm9yIGEgYnVpbHQtaW4gUmVzcG9uc2VzIHRvb2wgKGB3ZWJfc2VhcmNoYCxcbiAqIGBsb2NhbF9zaGVsbGAsIOKApikgdGhhdCBjaGF0IGNhbm5vdCBleHByZXNzIGFuZCBEYXRhYnJpY2tzIHJlamVjdHMuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhdFRvb2wodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0b29sID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0b29sLnR5cGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHRvb2wuZnVuY3Rpb24gJiYgdHlwZW9mIHRvb2wuZnVuY3Rpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiB0b29sOyAvLyBhbHJlYWR5IG5lc3RlZFxuICBpZiAodHlwZW9mIHRvb2wubmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgZnVuY3Rpb246IHtcbiAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgIC4uLih0b29sLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKHRvb2wucGFyYW1ldGVycyA/IHsgcGFyYW1ldGVyczogdG9vbC5wYXJhbWV0ZXJzIH0gOiB7fSksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgZmxhdCBSZXNwb25zZXMgc3BlbGxpbmcgKGB7dHlwZTpcImZ1bmN0aW9uXCIsIG5hbWUsIOKApn1gKSBvZiBhIHRvb2wgc3BlYy5cbiAqIEludmVyc2Ugb2Yge0BsaW5rIHRvQ2hhdFRvb2x9OyBub24tZnVuY3Rpb24gdG9vbHMgYXJlIGRyb3BwZWQgdGhlIHNhbWUgd2F5LlxuICovXG5mdW5jdGlvbiB0b1Jlc3BvbnNlc1Rvb2wodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0b29sID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0b29sLnR5cGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHRvb2wuZnVuY3Rpb24gJiYgdHlwZW9mIHRvb2wuZnVuY3Rpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBmbiA9IHRvb2wuZnVuY3Rpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgIG5hbWU6IGZuLm5hbWUsXG4gICAgICAuLi4oZm4uZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBmbi5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKGZuLnBhcmFtZXRlcnMgPyB7IHBhcmFtZXRlcnM6IGZuLnBhcmFtZXRlcnMgfSA6IHt9KSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB0eXBlb2YgdG9vbC5uYW1lID09PSBcInN0cmluZ1wiID8gdG9vbCA6IHVuZGVmaW5lZDsgLy8gYWxyZWFkeSBmbGF0XG59XG5cbi8qKiBPbmUgU2VydmVyLVNlbnQgRXZlbnQsIHJlYWR5IHRvIHdyaXRlIHRvIHRoZSBjbGllbnQuICovXG5mdW5jdGlvbiBzc2UoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBgZXZlbnQ6ICR7ZXZlbnR9XFxuZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5cXG5gO1xufVxuXG4vKipcbiAqIEluY3JlbWVudGFsIGNoYXQtY2h1bmsgLT4gUmVzcG9uc2VzLVNTRSB0cmFuc2xhdG9yLiBgZmVlZGAgYW5kIGBmaW5pc2hgIGJvdGhcbiAqIHJldHVybiB0aGUgU1NFIGJ5dGVzIHRvIGZvcndhcmQsIG9yIGBcIlwiYCB3aGVuIGEgY2h1bmsgcHJvZHVjZWQgbm8gZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciB7XG4gIC8qKiBUcmFuc2xhdGUgb25lIHVwc3RyZWFtIGBjaGF0LmNvbXBsZXRpb24uY2h1bmtgIG9iamVjdC4gKi9cbiAgZmVlZChjaHVuazogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmc7XG4gIC8qKiBDbG9zZSBhbnkgb3BlbiBpdGVtcyBhbmQgZW1pdCBgcmVzcG9uc2UuY29tcGxldGVkYC4gQ2FsbCBvbmNlLCBhdCBlbmQgb2Ygc3RyZWFtLiAqL1xuICBmaW5pc2goKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZSBhbiB1cHN0cmVhbSBjaGF0LWNvbXBsZXRpb25zIFNTRSBzdHJlYW0gaW50byB0aGUgUmVzcG9uc2VzIFNTRVxuICogZXZlbnQgc3RyZWFtIGEgUmVzcG9uc2VzIGNsaWVudCBjb25zdW1lcy5cbiAqXG4gKiBVcHN0cmVhbSBjaHVua3MgYXJlIGBjaGF0LmNvbXBsZXRpb24uY2h1bmtgIG9iamVjdHMgd2hvc2UgYGNob2ljZXNbMF0uZGVsdGFgXG4gKiBjYXJyaWVzIGluY3JlbWVudGFsIGBjb250ZW50YCAoYXNzaXN0YW50IHRleHQpIGFuZC9vciBgdG9vbF9jYWxsc2AgKGZ1bmN0aW9uXG4gKiBjYWxscywgc3RyZWFtZWQgYnkgYGluZGV4YCB3aXRoIHBhcnRpYWwgYGFyZ3VtZW50c2ApLiBXZSBlbWl0IHRoZSBSZXNwb25zZXNcbiAqIGxpZmVjeWNsZSBhcm91bmQgdGhlbTpcbiAqXG4gKiAgIHJlc3BvbnNlLmNyZWF0ZWRcbiAqICAgLT4gcGVyIHRleHQgcnVuOiAgb3V0cHV0X2l0ZW0uYWRkZWQg4oaSIG91dHB1dF90ZXh0LmRlbHRhKiDihpIgb3V0cHV0X2l0ZW0uZG9uZVxuICogICAtPiBwZXIgdG9vbCBjYWxsOiBvdXRwdXRfaXRlbS5hZGRlZCDihpIgZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGEqXG4gKiAgICAgICAgICAgICAgICAgICAgICAg4oaSIGZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRvbmUg4oaSIG91dHB1dF9pdGVtLmRvbmVcbiAqICAgcmVzcG9uc2UuY29tcGxldGVkICAgKHdpdGggdGhlIGFzc2VtYmxlZCBmaW5hbCBgcmVzcG9uc2VgIG9iamVjdClcbiAqXG4gKiBUaGUgdHJhbnNsYXRvciBpcyBpbnRlbnRpb25hbGx5IHRvbGVyYW50OiBtYWxmb3JtZWQva2VlcGFsaXZlIGxpbmVzIHlpZWxkXG4gKiBub3RoaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgcmVzcG9uc2VJZDogc3RyaW5nLFxuKTogUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciB7XG4gIGxldCBzdGFydGVkID0gZmFsc2U7XG4gIGxldCBvdXRwdXRJbmRleCA9IDA7XG5cbiAgLy8gVGV4dCBydW4gc3RhdGU6IHdoZXRoZXIgYSBtZXNzYWdlIGl0ZW0gaXMgY3VycmVudGx5IG9wZW4sIGFuZCBpdHMgYnVmZmVyLlxuICBsZXQgdGV4dE9wZW4gPSBmYWxzZTtcbiAgbGV0IHRleHRCdWZmZXIgPSBcIlwiO1xuICBsZXQgdGV4dEl0ZW1JZCA9IFwiXCI7XG5cbiAgLy8gVG9vbC1jYWxsIHN0YXRlLCBrZXllZCBieSB0aGUgdXBzdHJlYW0gYHRvb2xfY2FsbHNbXS5pbmRleGAuXG4gIGludGVyZmFjZSBUb29sU3RhdGUge1xuICAgIG91dHB1dEluZGV4OiBudW1iZXI7XG4gICAgY2FsbElkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFyZ3M6IHN0cmluZztcbiAgfVxuICBjb25zdCB0b29scyA9IG5ldyBNYXA8bnVtYmVyLCBUb29sU3RhdGU+KCk7XG5cbiAgY29uc3QgY3JlYXRlZCA9ICgpID0+XG4gICAgc3NlKFwicmVzcG9uc2UuY3JlYXRlZFwiLCB7XG4gICAgICB0eXBlOiBcInJlc3BvbnNlLmNyZWF0ZWRcIixcbiAgICAgIHJlc3BvbnNlOiB7IGlkOiByZXNwb25zZUlkLCBvYmplY3Q6IFwicmVzcG9uc2VcIiwgc3RhdHVzOiBcImluX3Byb2dyZXNzXCIsIG1vZGVsLCBvdXRwdXQ6IFtdIH0sXG4gICAgfSk7XG5cbiAgZnVuY3Rpb24gb3BlblRleHQoKTogc3RyaW5nIHtcbiAgICB0ZXh0T3BlbiA9IHRydWU7XG4gICAgdGV4dEl0ZW1JZCA9IGAke3Jlc3BvbnNlSWR9LW1zZy0ke291dHB1dEluZGV4fWA7XG4gICAgY29uc3QgZXYgPSBzc2UoXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLCB7XG4gICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmFkZGVkXCIsXG4gICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgaXRlbTogeyBpZDogdGV4dEl0ZW1JZCwgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFtdIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGV2O1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0T3BlbikgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIGlkOiB0ZXh0SXRlbUlkLFxuICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgY29udGVudDogW3sgdHlwZTogXCJvdXRwdXRfdGV4dFwiLCB0ZXh0OiB0ZXh0QnVmZmVyIH1dLFxuICAgIH07XG4gICAgY29uc3QgZXYgPVxuICAgICAgc3NlKFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZG9uZVwiLFxuICAgICAgICBpdGVtX2lkOiB0ZXh0SXRlbUlkLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBjb250ZW50X2luZGV4OiAwLFxuICAgICAgICB0ZXh0OiB0ZXh0QnVmZmVyLFxuICAgICAgfSkgK1xuICAgICAgc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBpdGVtLFxuICAgICAgfSk7XG4gICAgdGV4dE9wZW4gPSBmYWxzZTtcbiAgICB0ZXh0QnVmZmVyID0gXCJcIjtcbiAgICBvdXRwdXRJbmRleCArPSAxO1xuICAgIHJldHVybiBldjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZlZWQoY2h1bms6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBsZXQgb3V0ID0gXCJcIjtcbiAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgb3V0ICs9IGNyZWF0ZWQoKTtcbiAgICB9XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmlzQXJyYXkoY2h1bmsuY2hvaWNlcykgPyBjaHVuay5jaG9pY2VzIDogW107XG4gICAgY29uc3QgY2hvaWNlID0gKGNob2ljZXNbMF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGRlbHRhID0gKGNob2ljZS5kZWx0YSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBBc3Npc3RhbnQgdGV4dCBkZWx0YXMuIENvbXBhdGliaWxpdHkgbGF5ZXJzIG1heSBlbWl0IG9uZSBjb250ZW50IHBhcnQsXG4gICAgLy8gYSBwYXJ0cyBhcnJheSwgb3IgdGhlIE9wZW5BSSBzdHJpbmcgZm9ybS5cbiAgICBjb25zdCBkZWx0YVRleHQgPSBjaGF0Q29udGVudFRvVGV4dChkZWx0YS5jb250ZW50LCB7IHR5cGVzOiBbXCJ0ZXh0XCIsIFwib3V0cHV0X3RleHRcIl0gfSk7XG4gICAgaWYgKGRlbHRhVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIXRleHRPcGVuKSBvdXQgKz0gb3BlblRleHQoKTtcbiAgICAgIHRleHRCdWZmZXIgKz0gZGVsdGFUZXh0O1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIsIHtcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiLFxuICAgICAgICBpdGVtX2lkOiB0ZXh0SXRlbUlkLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBjb250ZW50X2luZGV4OiAwLFxuICAgICAgICBkZWx0YTogZGVsdGFUZXh0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVG9vbC1jYWxsIGRlbHRhczogZWFjaCBpcyBrZXllZCBieSBgaW5kZXhgOyBgYXJndW1lbnRzYCBhcnJpdmVzIGluIHBpZWNlcy5cbiAgICBjb25zdCB0b29sRGVsdGFzID0gQXJyYXkuaXNBcnJheShkZWx0YS50b29sX2NhbGxzKSA/IGRlbHRhLnRvb2xfY2FsbHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHJhd1RjIG9mIHRvb2xEZWx0YXMpIHtcbiAgICAgIGNvbnN0IHRjID0gcmF3VGMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBpZHggPSBOdW1iZXIodGMuaW5kZXggPz8gMCk7XG4gICAgICBjb25zdCBmbiA9ICh0Yy5mdW5jdGlvbiA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBsZXQgc3RhdGUgPSB0b29scy5nZXQoaWR4KTtcbiAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgLy8gRmlyc3QgZnJhZ21lbnQgZm9yIHRoaXMgY2FsbDogYSB0ZXh0IHJ1biAoaWYgb3BlbikgbXVzdCBjbG9zZSBmaXJzdCBzb1xuICAgICAgICAvLyBvdXRwdXQgb3JkZXJpbmcgc3RheXMgbW9ub3RvbmljLCB0aGVuIHdlIG9wZW4gYSBmdW5jdGlvbl9jYWxsIGl0ZW0uXG4gICAgICAgIG91dCArPSBjbG9zZVRleHQoKTtcbiAgICAgICAgc3RhdGUgPSB7XG4gICAgICAgICAgb3V0cHV0SW5kZXgsXG4gICAgICAgICAgY2FsbElkOiBTdHJpbmcodGMuaWQgPz8gYCR7cmVzcG9uc2VJZH0tY2FsbC0ke2lkeH1gKSxcbiAgICAgICAgICBuYW1lOiBTdHJpbmcoZm4ubmFtZSA/PyBcIlwiKSxcbiAgICAgICAgICBhcmdzOiBcIlwiLFxuICAgICAgICB9O1xuICAgICAgICB0b29scy5zZXQoaWR4LCBzdGF0ZSk7XG4gICAgICAgIG91dCArPSBzc2UoXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLCB7XG4gICAgICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLFxuICAgICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgaWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuICAgICAgICAgICAgY2FsbF9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgICAgbmFtZTogc3RhdGUubmFtZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0SW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZm4ubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBmbi5uYW1lICYmICFzdGF0ZS5uYW1lKSBzdGF0ZS5uYW1lID0gZm4ubmFtZTtcbiAgICAgIGlmICh0eXBlb2YgZm4uYXJndW1lbnRzID09PSBcInN0cmluZ1wiICYmIGZuLmFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXRlLmFyZ3MgKz0gZm4uYXJndW1lbnRzO1xuICAgICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGFcIiwge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGFcIixcbiAgICAgICAgICBpdGVtX2lkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgb3V0cHV0X2luZGV4OiBzdGF0ZS5vdXRwdXRJbmRleCxcbiAgICAgICAgICBkZWx0YTogZm4uYXJndW1lbnRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGxldCBvdXQgPSBjbG9zZVRleHQoKTtcbiAgICAvLyBDbG9zZSBhbnkgb3BlbiB0b29sIGNhbGxzLCBlbWl0dGluZyB0aGVpciBhc3NlbWJsZWQgYXJndW1lbnRzLlxuICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgdG9vbHMudmFsdWVzKCkpIHtcbiAgICAgIG91dCArPSBzc2UoXCJyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lXCIsIHtcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lXCIsXG4gICAgICAgIGl0ZW1faWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgb3V0cHV0X2luZGV4OiBzdGF0ZS5vdXRwdXRJbmRleCxcbiAgICAgICAgYXJndW1lbnRzOiBzdGF0ZS5hcmdzLFxuICAgICAgfSk7XG4gICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHN0YXRlLm91dHB1dEluZGV4LFxuICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgaWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICAgICAgICBjYWxsX2lkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgbmFtZTogc3RhdGUubmFtZSxcbiAgICAgICAgICBhcmd1bWVudHM6IHN0YXRlLmFyZ3MsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLmNvbXBsZXRlZFwiLCB7XG4gICAgICB0eXBlOiBcInJlc3BvbnNlLmNvbXBsZXRlZFwiLFxuICAgICAgcmVzcG9uc2U6IHsgaWQ6IHJlc3BvbnNlSWQsIG9iamVjdDogXCJyZXNwb25zZVwiLCBzdGF0dXM6IFwiY29tcGxldGVkXCIsIG1vZGVsIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHJldHVybiB7IGZlZWQsIGZpbmlzaCB9O1xufVxuXG4vKiogQSBzb3VyY2UgdGhlIG1vZGVsIGNpdGVkLCBhcyBjYXJyaWVkIGJ5IGEgUmVzcG9uc2VzIGNvbnRlbnQtcGFydCBhbm5vdGF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZXNDaXRhdGlvbiB7XG4gIHVybDogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqIFdoYXQge0BsaW5rIHJlYWRSZXNwb25zZXNPdXRwdXR9IHB1bGxzIG91dCBvZiBhIGByZXNwb25zZWAgb2JqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZXNPdXRwdXQge1xuICAvKiogVGhlIGFzc2lzdGFudCdzIGFuc3dlciwgd2l0aCB0aGUgb3V0cHV0IGl0ZW1zIGNvbmNhdGVuYXRlZC4gKi9cbiAgdGV4dDogc3RyaW5nO1xuICAvKiogQ2l0ZWQgc291cmNlcyBpbiBmaXJzdC1zZWVuIG9yZGVyLCBkZWR1cGxpY2F0ZWQgYnkgVVJMLiAqL1xuICBjaXRhdGlvbnM6IFJlc3BvbnNlc0NpdGF0aW9uW107XG59XG5cbi8qKlxuICogUmVhZCB0aGUgYW5zd2VyIHRleHQgYW5kIGNpdGVkIHNvdXJjZXMgb3V0IG9mIGEgUmVzcG9uc2VzIGByZXNwb25zZWAgcGF5bG9hZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIHtAbGluayBjaGF0VG9SZXNwb25zZX06IGl0IGNvbnN1bWVzIHdoYXQgYW4gZW5kcG9pbnRcbiAqIHNwZWFraW5nIFJlc3BvbnNlcyBuYXRpdmVseSByZXR1cm5zLCByYXRoZXIgdGhhbiBwcm9kdWNpbmcgaXQuIFRoZSBEYXRhYnJpY2tzXG4gKiBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIGFuc3dlcnMgdGhpcyB3YXksIHdpdGggZWFjaCBzb3VyY2UgYXR0YWNoZWQgYXMgYVxuICogYHVybF9jaXRhdGlvbmAgYW5ub3RhdGlvbiBvbiB0aGUgY29udGVudCBwYXJ0IHRoYXQgdXNlZCBpdC5cbiAqXG4gKiBQcmVmZXJzIHRoZSBmbGF0dGVuZWQgYG91dHB1dF90ZXh0YCB3aGVuIHRoZSBwYXlsb2FkIGNhcnJpZXMgaXQsIGFuZCBmYWxsc1xuICogYmFjayB0byB3YWxraW5nIGBvdXRwdXRbXS5jb250ZW50W10udGV4dGAuIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIHVwc3RyZWFtLFxuICogc28gYSBwYXlsb2FkIG1pc3NpbmcgYW55IG9mIGl0IHlpZWxkcyBlbXB0eSByZXN1bHRzIHJhdGhlciB0aGFuIHRocm93aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlc3BvbnNlc091dHB1dChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlc3BvbnNlc091dHB1dCB7XG4gIGNvbnN0IG91dHB1dCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5vdXRwdXQpID8gKHBheWxvYWQub3V0cHV0IGFzIHVua25vd25bXSkgOiBbXTtcbiAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNpdGF0aW9uczogUmVzcG9uc2VzQ2l0YXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCByYXdJdGVtIG9mIG91dHB1dCkge1xuICAgIGlmICghcmF3SXRlbSB8fCB0eXBlb2YgcmF3SXRlbSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3QgY29udGVudCA9IChyYXdJdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5jb250ZW50O1xuICAgIGNvbnN0IHBhcnRzID0gY2hhdENvbnRlbnRQYXJ0cyhjb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHJhd1BhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghcmF3UGFydCB8fCB0eXBlb2YgcmF3UGFydCAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICBjb25zdCBwYXJ0ID0gcmF3UGFydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocGFydC50ZXh0KTtcbiAgICAgIGlmICh0ZXh0KSB0ZXh0cy5wdXNoKHRleHQpO1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBBcnJheS5pc0FycmF5KHBhcnQuYW5ub3RhdGlvbnMpID8gcGFydC5hbm5vdGF0aW9ucyA6IFtdO1xuICAgICAgZm9yIChjb25zdCByYXdBbm4gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFyYXdBbm4gfHwgdHlwZW9mIHJhd0FubiAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICAgIGNvbnN0IGFubiA9IHJhd0FubiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgdXJsID0gc3RyaW5nLnRyaW1Ub0VtcHR5KGFubi51cmwpO1xuICAgICAgICBpZiAoIXVybCB8fCBzZWVuLmhhcyh1cmwpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBzdHJpbmcudHJpbVRvRW1wdHkoYW5uLnRpdGxlKTtcbiAgICAgICAgY2l0YXRpb25zLnB1c2goeyB1cmwsIC4uLih0aXRsZSA/IHsgdGl0bGUgfSA6IHt9KSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyB0ZXh0OiBzdHJpbmcudHJpbVRvRW1wdHkocGF5bG9hZC5vdXRwdXRfdGV4dCkgfHwgdGV4dHMuam9pbihcIlxcblwiKS50cmltKCksIGNpdGF0aW9ucyB9O1xufVxuXG4vKipcbiAqIFN0cmlwIHRvb2wgdHlwZXMgdGhlIHVwc3RyZWFtIG1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCBmcm9tIGEgUmVzcG9uc2VzIHJlcXVlc3RcbiAqIGJvZHksIHJldHVybmluZyBhIHNoYWxsb3cgY29weSBzYWZlIHRvIGZvcndhcmQgKHRoZSBpbnB1dCBpcyBub3QgbXV0YXRlZCkuXG4gKlxuICogQ2xpZW50cyBsaWtlIHRoZSBDb2RleCBDTEkgaW5jbHVkZSBidWlsdC1pbiBSZXNwb25zZXMgdG9vbHMgKGB3ZWJfc2VhcmNoYCxcbiAqIGBsb2NhbF9zaGVsbGAsIGBjdXN0b21gLCAuLi4pIGFsb25nc2lkZSB0aGVpciBgZnVuY3Rpb25gIHRvb2xzLiBEYXRhYnJpY2tzJ1xuICogT3BlbiBSZXNwb25zZXMgc3VyZmFjZSBmb3IgQW50aHJvcGljL0NsYXVkZSAoYW5kIG90aGVyIG5vbi1PcGVuQUkgcHJvdmlkZXJzKVxuICogb25seSBhY2NlcHRzIGBmdW5jdGlvbmAgdG9vbHMgYW5kIGhhcmQtZXJyb3JzIG90aGVyd2lzZTpcbiAqICAgXCJBbnRocm9waWMgZG9lcyBub3Qgc3VwcG9ydCB0b29sIHR5cGUgJ3dlYl9zZWFyY2gnLiBPbmx5ICdmdW5jdGlvbicgaXMgc3VwcG9ydGVkLlwiXG4gKiBDYWxsIHRoaXMgYmVmb3JlIGZvcndhcmRpbmcgdG8gYC9zZXJ2aW5nLWVuZHBvaW50cy9vcGVuLXJlc3BvbnNlc2AuIFRoZSBPcGVuQUlcbiAqIGAvc2VydmluZy1lbmRwb2ludHMvcmVzcG9uc2VzYCBwYXRoIHNob3VsZCBrZWVwIGJ1aWx0LWlucyAoR1BUIHN1cHBvcnRzIHRoZW0pLlxuICogSWYgZmlsdGVyaW5nIGVtcHRpZXMgdGhlIGxpc3QsIGB0b29sc2AgLyBgdG9vbF9jaG9pY2VgIC8gYHBhcmFsbGVsX3Rvb2xfY2FsbHNgXG4gKiBhcmUgZHJvcHBlZCBzbyB3ZSBuZXZlciBzZW5kIGFuIGVtcHR5IGB0b29sczogW11gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVSZXNwb25zZXNUb29scyhib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGJvZHkudG9vbHMpIHx8IGJvZHkudG9vbHMubGVuZ3RoID09PSAwKSByZXR1cm4gYm9keTtcbiAgY29uc3QgZm5Ub29scyA9IGJvZHkudG9vbHMuZmlsdGVyKFxuICAgICh0KSA9PiB0ICYmIHR5cGVvZiB0ID09PSBcIm9iamVjdFwiICYmICh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS50eXBlID09PSBcImZ1bmN0aW9uXCIsXG4gICk7XG4gIGlmIChmblRvb2xzLmxlbmd0aCA9PT0gYm9keS50b29scy5sZW5ndGgpIHJldHVybiBib2R5OyAvLyBub3RoaW5nIHRvIHN0cmlwXG4gIGNvbnN0IG5leHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5ib2R5IH07XG4gIGlmIChmblRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICBuZXh0LnRvb2xzID0gZm5Ub29scztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgbmV4dC50b29scztcbiAgICBkZWxldGUgbmV4dC50b29sX2Nob2ljZTtcbiAgICBkZWxldGUgbmV4dC5wYXJhbGxlbF90b29sX2NhbGxzO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG4vKipcbiAqIENvbnRlbnQtcGFydCAvIGlucHV0LWl0ZW0gdHlwZXMgQ2xhdWRlIGV4dGVuZGVkIHRoaW5raW5nIHVzZXMgb24gdGhlIHdpcmUuXG4gKlxuICogU2hhcmVkIHNvIGJvdGggd2lyZSBzdXJmYWNlcyBzdHJpcCB0aGUgc2FtZSBzZXQ6IHRoZSBSZXNwb25zZXMgcGF0aCBoZXJlXG4gKiAoe0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSkgYW5kIHRoZSBDaGF0IENvbXBsZXRpb25zIHBhdGggaW5cbiAqIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgJ3Mgc2VydmluZyBzYW5pdGl6ZS4gQW50aHJvcGljIHNpZ25zIHRoZXNlIGJsb2NrcyxcbiAqIHNvIGEgcmVwbGF5IHRoYXQgbXV0YXRlcyBvbmUgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgLSBib3RoIHBhdGhzIG11c3QgYWdyZWUgb25cbiAqIHdoYXQgY291bnRzIGFzIGEgcmVhc29uaW5nIGJsb2NrLlxuICovXG5leHBvcnQgY29uc3QgUkVBU09OSU5HX1RZUEVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwicmVhc29uaW5nXCIsXG4gIFwidGhpbmtpbmdcIixcbiAgXCJyZWRhY3RlZF90aGlua2luZ1wiLFxuXSk7XG5cbi8qKlxuICogUmV3cml0ZSBSZXNwb25zZXMgYGlucHV0YCBzbyBPcGVuIFJlc3BvbnNlcyB3aWxsIGFjY2VwdCBpdC5cbiAqXG4gKiBUd28gT3BlbkFJIC8gQ29kZXggc2hhcGVzIHRoYXQgRGF0YWJyaWNrcyBPcGVuIFJlc3BvbnNlcyAoQ2xhdWRlLCBHZW1pbmksIOKApilcbiAqIHJlamVjdDpcbiAqXG4gKiAxLiBQcmlvciBhc3Npc3RhbnQgdHVybnMgd2l0aCBgb3V0cHV0X3RleHRgIC8gYG91dHB1dF8qYCBjb250ZW50IHBhcnRzIOKAlFxuICogICAgT3BlbiBSZXNwb25zZXMgb25seSBhbGxvd3MgYGlucHV0X3RleHRgLCBgaW5wdXRfaW1hZ2VgLCBgaW5wdXRfZmlsZWAsXG4gKiAgICBgaW5wdXRfYXVkaW9gLiBNYXAgZXZlcnkgYG91dHB1dF88a2luZD5gIHBhcnQgdG8gYGlucHV0XzxraW5kPmAuXG4gKiAyLiBSZXBsYXllZCBleHRlbmRlZC10aGlua2luZyBibG9ja3MgKGB0aGlua2luZ2AsIGByZWRhY3RlZF90aGlua2luZ2AsXG4gKiAgICBgcmVhc29uaW5nYCBjb250ZW50IHBhcnRzLCBhbmQgdG9wLWxldmVsIGByZWFzb25pbmdgIGlucHV0IGl0ZW1zKS4gQ2xhdWRlXG4gKiAgICBzaWducyB0aG9zZTsgYW55IGNsaWVudCByb3VuZC10cmlwIHRoYXQgbXV0YXRlcyB0aGVtIChvciBhIGNyb3NzLXByb3ZpZGVyXG4gKiAgICByZXBsYXkpIGZhaWxzIHdpdGggZS5nLlxuICogICAgICBcIm1lc3NhZ2VzLk4uY29udGVudC5NOiBJbnZhbGlkIGBkYXRhYCBpbiBgcmVkYWN0ZWRfdGhpbmtpbmdgIGJsb2NrXCJcbiAqICAgIFN0cmlwIHRoZW0g4oCUIHRoZSBVSS9jbGllbnQgYWxyZWFkeSBzaG93ZWQgdGhlIHRoaW5raW5nOyByZXBsYXkgZG9lcyBub3RcbiAqICAgIG5lZWQgdGhlIHNpZ25lZCBibG9iLiBTYW1lIHBvbGljeSBhcyBhcHBraXQtbWFzdHJhJ3Mgc2VydmluZyBzYW5pdGl6ZS5cbiAqXG4gKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IHdoZW4gYW55dGhpbmcgY2hhbmdlczsgb3RoZXJ3aXNlIHRoZSBpbnB1dCBib2R5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPcGVuUmVzcG9uc2VzSW5wdXQoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSB8fCBib2R5LmlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG5cbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgY29uc3QgaW5wdXQ6IHVua25vd25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIGJvZHkuaW5wdXQpIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXRlbSA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIFRvcC1sZXZlbCBSZXNwb25zZXMgcmVhc29uaW5nIGl0ZW1zIChub3QgbWVzc2FnZSBjb250ZW50IHBhcnRzKS5cbiAgICBpZiAodHlwZW9mIGl0ZW0udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBSRUFTT05JTkdfVFlQRVMuaGFzKGl0ZW0udHlwZSkpIHtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBjaGF0Q29udGVudFBhcnRzKGl0ZW0uY29udGVudCk7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgaW5wdXQucHVzaChyYXcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHBhcnRDaGFuZ2VkID0gIUFycmF5LmlzQXJyYXkoaXRlbS5jb250ZW50KTtcbiAgICBjb25zdCBjb250ZW50OiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghcGFydCB8fCB0eXBlb2YgcGFydCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb250ZW50LnB1c2gocGFydCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBpZiAodHlwZW9mIHAudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBSRUFTT05JTkdfVFlQRVMuaGFzKHAudHlwZSkpIHtcbiAgICAgICAgcGFydENoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcC50eXBlID09PSBcInN0cmluZ1wiICYmIHAudHlwZS5zdGFydHNXaXRoKFwib3V0cHV0X1wiKSkge1xuICAgICAgICBwYXJ0Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNvbnRlbnQucHVzaCh7IC4uLnAsIHR5cGU6IGBpbnB1dF8ke3AudHlwZS5zbGljZShcIm91dHB1dF9cIi5sZW5ndGgpfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29udGVudC5wdXNoKHBhcnQpO1xuICAgIH1cblxuICAgIGlmICghcGFydENoYW5nZWQpIHtcbiAgICAgIGlucHV0LnB1c2gocmF3KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAvLyBEcm9wIGFzc2lzdGFudCB0dXJucyB0aGF0IG9ubHkgY2FycmllZCB0aGlua2luZyAobm90aGluZyBsZWZ0IHRvIHJlcGxheSkuXG4gICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAwICYmIGl0ZW0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikgY29udGludWU7XG4gICAgaW5wdXQucHVzaCh7IC4uLml0ZW0sIGNvbnRlbnQgfSk7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IHsgLi4uYm9keSwgaW5wdXQgfSA6IGJvZHk7XG59XG5cbi8qKlxuICogRHJvcCB0cmFpbGluZyBhc3Npc3RhbnQgdHVybnMgc28gdGhlIHRyYW5zY3JpcHQgZW5kcyBvbiBzb21ldGhpbmcgQW50aHJvcGljXG4gKiB3aWxsIGNvbnRpbnVlIGZyb20uXG4gKlxuICogRGF0YWJyaWNrcyBPcGVuIFJlc3BvbnNlcyByZWplY3RzIGEgYm9keSB3aG9zZSBsYXN0IGl0ZW0gaXMgYW4gYXNzaXN0YW50XG4gKiBtZXNzYWdlIHdpdGggYFwiVGhpcyBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IGFzc2lzdGFudCBtZXNzYWdlIHByZWZpbGwuIFRoZVxuICogY29udmVyc2F0aW9uIG11c3QgZW5kIHdpdGggYSB1c2VyIG1lc3NhZ2UuXCJgICh0aGUgdXBzdHJlYW0gQmVkcm9jayByb3V0ZVxuICogZGlzYWxsb3dzIHByZWZpbGwpLiBUd28gd2F5cyBhIHJlYWwgY2xpZW50IGhpdHMgaXQ6XG4gKlxuICogMS4gVGhlIGNsaWVudCByZXBsYXlzIGl0cyBvd24gbGFzdCBhbnN3ZXIuIFRoZSBDb2RleCBDTEkgZG9lcyB0aGlzIHdoZW4gYSB0dXJuXG4gKiAgICBlbmRzIHdpdGhvdXQgYSB0b29sIGNhbGwgYW5kIHRoZSBuZXh0IHJlcXVlc3QgY2FycmllcyB0aGUgZnVsbCB0cmFuc2NyaXB0LlxuICogMi4ge0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSBDUkVBVEVTIHRoZSBzaGFwZTogYSB0dXJuIHRoYXQgZW5kZWQgaW4gYVxuICogICAgYHJlYXNvbmluZ2AgaXRlbSBpcyBzdHJpcHBlZCBmb3IgcmVwbGF5IGNvbXBhdGliaWxpdHksIHByb21vdGluZyB0aGVcbiAqICAgIGFzc2lzdGFudCBtZXNzYWdlIGJlZm9yZSBpdCB0byBsYXN0LiBSdW5uaW5nIHRoaXMgcmVwYWlyIGFmdGVyIHRoYXQgc3RyaXBcbiAqICAgIGlzIHdoYXQga2VlcHMgb25lIGZpeCBmcm9tIGNhdXNpbmcgdGhlIG90aGVyIGZhaWx1cmUuXG4gKlxuICogRHJvcHBpbmcgaXMgY29ycmVjdCByYXRoZXIgdGhhbiBsb3NzeTogYSB0cmFpbGluZyBhc3Npc3RhbnQgdHVybiBjYXJyaWVzIHRleHRcbiAqIHRoZSBtb2RlbCBpdHNlbGYganVzdCBwcm9kdWNlZCwgc28gaXQgaXMgY29udGV4dCB0aGUgcHJvdmlkZXIgZG9lcyBub3QgbmVlZFxuICogcmVwZWF0ZWQgaW4gb3JkZXIgdG8gY29udGludWUuIEFwcGVuZGluZyBhIHN5bnRoZXRpYyBgXCJDb250aW51ZS5cImAgdXNlciB0dXJuXG4gKiBhbHNvIHNhdGlzZmllcyB0aGUgcHJvdmlkZXIsIGJ1dCBpdCBwdXRzIHdvcmRzIGluIHRoZSB1c2VyJ3MgbW91dGggdGhhdCBzaG93XG4gKiB1cCBpbiB0aGUgbW9kZWwncyBjb250ZXh0LCBzbyB0aGlzIHRha2VzIHRoZSBob25lc3Qgb3B0aW9uLlxuICpcbiAqIEEgdHJhaWxpbmcgYGZ1bmN0aW9uX2NhbGxgIGlzIGxlZnQgQUxPTkUuIEl0IGlzIGFsc28gYW4gYXNzaXN0YW50LXNpZGUgaXRlbSxcbiAqIGJ1dCBBbnRocm9waWMgcmVqZWN0cyBhbiB1bmFuc3dlcmVkIGB0b29sX3VzZWAgb24gYSBkaWZmZXJlbnQgcnVsZVxuICogKGB0b29sX3VzZWAgaWRzIHdpdGhvdXQgYHRvb2xfcmVzdWx0YCksIGFuZCBkcm9wcGluZyBpdCB3b3VsZCBzaWxlbnRseSBkaXNjYXJkXG4gKiBhIHRvb2wgY2FsbCB0aGUgY2xpZW50IGlzIGFib3V0IHRvIGFuc3dlci4gVGhhdCBpcyB0aGUgY2xpZW50J3MgYnVnIHRvIGZpeCxcbiAqIG5vdCBzb21ldGhpbmcgdG8gcGFwZXIgb3ZlciBoZXJlLlxuICpcbiAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgd2hlbiBhbnl0aGluZyBjaGFuZ2VzOyBvdGhlcndpc2UgdGhlIGlucHV0IGJvZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBhaXJUcmFpbGluZ0Fzc2lzdGFudElucHV0KFxuICBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGJvZHkuaW5wdXQpIHx8IGJvZHkuaW5wdXQubGVuZ3RoID09PSAwKSByZXR1cm4gYm9keTtcblxuICBjb25zdCBpbnB1dCA9IFsuLi5ib2R5LmlucHV0XTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgLy8gQSBsb29wLCBub3Qgb25lIGNoZWNrOiBzdHJpcHBpbmcgcmVhc29uaW5nIGNhbiBsZWF2ZSBzZXZlcmFsIGFzc2lzdGFudFxuICAvLyB0dXJucyBpbiBhIHJvdyBhdCB0aGUgZW5kLlxuICB3aGlsZSAoaW5wdXQubGVuZ3RoID4gMCAmJiBpc0Fzc2lzdGFudE1lc3NhZ2VJdGVtKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdKSkge1xuICAgIGlucHV0LnBvcCgpO1xuICAgIGNoYW5nZWQgPSB0cnVlO1xuICB9XG4gIC8vIE5ldmVyIHNlbmQgYW4gZW1wdHkgYGlucHV0YDogYW4gYWxsLWFzc2lzdGFudCB0cmFuc2NyaXB0IGlzIG5vdCBzb21ldGhpbmdcbiAgLy8gdGhpcyByZXBhaXIgY2FuIHJlc2N1ZSwgc28gbGVhdmUgdGhlIGJvZHkgZm9yIHRoZSBwcm92aWRlciB0byByZWplY3Qgd2l0aFxuICAvLyBpdHMgb3duIG1lc3NhZ2UgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgcmVxdWVzdC5cbiAgaWYgKCFjaGFuZ2VkIHx8IGlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG4gIHJldHVybiB7IC4uLmJvZHksIGlucHV0IH07XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBgaW5wdXRgIGl0ZW0gaXMgYW4gYXNzaXN0YW50IE1FU1NBR0UgKHRoZSBwcmVmaWxsIHRyaWdnZXIpLCBhc1xuICogb3Bwb3NlZCB0byBhIGBmdW5jdGlvbl9jYWxsYCBvciBhbnkgb3RoZXIgYXNzaXN0YW50LXNpZGUgaXRlbSB0eXBlLlxuICovXG5mdW5jdGlvbiBpc0Fzc2lzdGFudE1lc3NhZ2VJdGVtKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGl0ZW0gPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGl0ZW0ucm9sZSAhPT0gXCJhc3Npc3RhbnRcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXRlbS50eXBlID09PSB1bmRlZmluZWQgfHwgaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIjtcbn1cblxuLyoqXG4gKiBGdWxsIE9wZW4gUmVzcG9uc2VzIHJlcXVlc3Qgc2FuaXRpemVyOiBzdHJpcCBub24tYGZ1bmN0aW9uYCB0b29scywgcmV3cml0ZVxuICogYG91dHB1dF8qYCBjb250ZW50IHBhcnRzLCBkcm9wIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2NrcywgYW5kIGRyb3AgYVxuICogdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gdGhlIHByb3ZpZGVyIHdvdWxkIHJlYWQgYXMgYSBwcmVmaWxsLiBTYWZlIG5vLW9wXG4gKiB3aGVuIG5vdGhpbmcgbmVlZHMgY2hhbmdpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZU9wZW5SZXNwb25zZXNSZXF1ZXN0KFxuICBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlcGFpclRyYWlsaW5nQXNzaXN0YW50SW5wdXQoc2FuaXRpemVPcGVuUmVzcG9uc2VzSW5wdXQoc2FuaXRpemVSZXNwb25zZXNUb29scyhib2R5KSkpO1xufVxuIl19
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "dependencies": {
27
- "@dbx-tools/shared-core": "0.6.212",
27
+ "@dbx-tools/shared-core": "0.6.214",
28
28
  "zod": "4.3.6"
29
29
  },
30
30
  "main": "./lib/index.js",
@@ -41,7 +41,7 @@
41
41
  "./package.json": "./package.json"
42
42
  }
43
43
  },
44
- "version": "0.6.212",
44
+ "version": "0.6.214",
45
45
  "types": "./lib/index.d.ts",
46
46
  "type": "module",
47
47
  "exports": {
@@ -56,7 +56,7 @@ export interface ChatToolCall {
56
56
  export interface ChatMessage {
57
57
  /** See {@link ChatRole} for the standard values; widened for provider extensions. */
58
58
  role: string;
59
- content?: string | ChatContentPart[] | null;
59
+ content?: string | ChatContentPart | ChatContentPart[] | null;
60
60
  tool_calls?: ChatToolCall[];
61
61
  /** Set on a `tool` turn, keying it back to the call it answers. */
62
62
  tool_call_id?: string;
@@ -128,24 +128,41 @@ export interface ChatContentToTextOptions {
128
128
  types?: readonly string[];
129
129
  }
130
130
 
131
+ /**
132
+ * Normalize structured chat content to an array. Providers usually emit a
133
+ * parts array, but some compatibility layers collapse a one-part array to the
134
+ * object itself. Returns `undefined` for strings, nulls, and other scalar
135
+ * values so callers can distinguish structured content from plain text.
136
+ */
137
+ export function chatContentParts(content: unknown): ChatContentPart[] | undefined {
138
+ const values = Array.isArray(content)
139
+ ? content
140
+ : content && typeof content === "object"
141
+ ? [content]
142
+ : undefined;
143
+ if (!values) return undefined;
144
+ return values.filter((part): part is ChatContentPart =>
145
+ Boolean(part && typeof part === "object"),
146
+ );
147
+ }
148
+
131
149
  /**
132
150
  * Flatten a message `content` value to plain text. Accepts the string form and
133
- * the structured-parts form ({@link ChatContentPart}), and yields `""` for
134
- * anything else (null, a lone image part, a malformed payload). Typed as
135
- * `unknown` because most callers are reading a just-parsed JSON body, and the
136
- * point of this helper is that they do not have to pre-check it.
151
+ * structured content as either one {@link ChatContentPart} or an array, and
152
+ * yields `""` for anything else (null, a lone image part, a malformed payload).
153
+ * Typed as `unknown` because most callers are reading a just-parsed JSON body,
154
+ * and the point of this helper is that they do not have to pre-check it.
137
155
  */
138
156
  export function chatContentToText(
139
157
  content: unknown,
140
158
  options: ChatContentToTextOptions = {},
141
159
  ): string {
142
160
  if (typeof content === "string") return content;
143
- if (!Array.isArray(content)) return "";
161
+ const normalized = chatContentParts(content);
162
+ if (!normalized) return "";
144
163
  const { separator = "", types } = options;
145
164
  const parts: string[] = [];
146
- for (const raw of content) {
147
- if (!raw || typeof raw !== "object") continue;
148
- const part = raw as ChatContentPart;
165
+ for (const part of normalized) {
149
166
  if (types && (typeof part.type !== "string" || !types.includes(part.type))) continue;
150
167
  if (typeof part.text === "string") parts.push(part.text);
151
168
  }
@@ -47,7 +47,12 @@
47
47
 
48
48
  import { string } from "@dbx-tools/shared-core";
49
49
 
50
- import { type ChatMessage, type ChatToolCall, chatContentToText } from "./openai-chat.ts";
50
+ import {
51
+ type ChatMessage,
52
+ type ChatToolCall,
53
+ chatContentParts,
54
+ chatContentToText,
55
+ } from "./openai-chat.ts";
51
56
 
52
57
  /**
53
58
  * Lower a Responses request body to a chat-completions body. Returns the chat
@@ -489,16 +494,18 @@ export function createResponsesStreamTranslator(
489
494
  const choice = (choices[0] ?? {}) as Record<string, unknown>;
490
495
  const delta = (choice.delta ?? {}) as Record<string, unknown>;
491
496
 
492
- // Assistant text deltas.
493
- if (typeof delta.content === "string" && delta.content.length > 0) {
497
+ // Assistant text deltas. Compatibility layers may emit one content part,
498
+ // a parts array, or the OpenAI string form.
499
+ const deltaText = chatContentToText(delta.content, { types: ["text", "output_text"] });
500
+ if (deltaText.length > 0) {
494
501
  if (!textOpen) out += openText();
495
- textBuffer += delta.content;
502
+ textBuffer += deltaText;
496
503
  out += sse("response.output_text.delta", {
497
504
  type: "response.output_text.delta",
498
505
  item_id: textItemId,
499
506
  output_index: outputIndex,
500
507
  content_index: 0,
501
- delta: delta.content,
508
+ delta: deltaText,
502
509
  });
503
510
  }
504
511
 
@@ -614,8 +621,9 @@ export function readResponsesOutput(payload: Record<string, unknown>): Responses
614
621
  for (const rawItem of output) {
615
622
  if (!rawItem || typeof rawItem !== "object") continue;
616
623
  const content = (rawItem as Record<string, unknown>).content;
617
- if (!Array.isArray(content)) continue;
618
- for (const rawPart of content) {
624
+ const parts = chatContentParts(content);
625
+ if (!parts) continue;
626
+ for (const rawPart of parts) {
619
627
  if (!rawPart || typeof rawPart !== "object") continue;
620
628
  const part = rawPart as Record<string, unknown>;
621
629
  const text = string.trimToEmpty(part.text);
@@ -720,14 +728,15 @@ export function sanitizeOpenResponsesInput(body: Record<string, unknown>): Recor
720
728
  continue;
721
729
  }
722
730
 
723
- if (!Array.isArray(item.content)) {
731
+ const parts = chatContentParts(item.content);
732
+ if (!parts) {
724
733
  input.push(raw);
725
734
  continue;
726
735
  }
727
736
 
728
- let partChanged = false;
737
+ let partChanged = !Array.isArray(item.content);
729
738
  const content: unknown[] = [];
730
- for (const part of item.content) {
739
+ for (const part of parts) {
731
740
  if (!part || typeof part !== "object") {
732
741
  content.push(part);
733
742
  continue;