@k8slens/ai-tools-contracts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/index.d.ts +34 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +642 -0
  4. package/dist/src/ai-tool-configuration.d.ts +51 -0
  5. package/dist/src/ai-tool-configuration.d.ts.map +1 -0
  6. package/dist/src/ai-tool-description.d.ts +25 -0
  7. package/dist/src/ai-tool-description.d.ts.map +1 -0
  8. package/dist/src/ai-tool-detection.d.ts +20 -0
  9. package/dist/src/ai-tool-detection.d.ts.map +1 -0
  10. package/dist/src/ai-tool-display-name.d.ts +18 -0
  11. package/dist/src/ai-tool-display-name.d.ts.map +1 -0
  12. package/dist/src/ai-tool-icon.d.ts +577 -0
  13. package/dist/src/ai-tool-icon.d.ts.map +1 -0
  14. package/dist/src/ai-tool-injection-token.d.ts +10 -0
  15. package/dist/src/ai-tool-injection-token.d.ts.map +1 -0
  16. package/dist/src/ai-tool-installation-instructions.d.ts +20 -0
  17. package/dist/src/ai-tool-installation-instructions.d.ts.map +1 -0
  18. package/dist/src/ai-tool-installed-via-cli-command.d.ts +17 -0
  19. package/dist/src/ai-tool-installed-via-cli-command.d.ts.map +1 -0
  20. package/dist/src/ai-tool-instructions-filename.d.ts +20 -0
  21. package/dist/src/ai-tool-instructions-filename.d.ts.map +1 -0
  22. package/dist/src/ai-tool-instructions-filenames.d.ts +13 -0
  23. package/dist/src/ai-tool-instructions-filenames.d.ts.map +1 -0
  24. package/dist/src/ai-tool-is-configured.d.ts +17 -0
  25. package/dist/src/ai-tool-is-configured.d.ts.map +1 -0
  26. package/dist/src/ai-tool-name.d.ts +17 -0
  27. package/dist/src/ai-tool-name.d.ts.map +1 -0
  28. package/dist/src/ai-tool-order-number.d.ts +16 -0
  29. package/dist/src/ai-tool-order-number.d.ts.map +1 -0
  30. package/dist/src/ai-tool-selection-row.d.ts +18 -0
  31. package/dist/src/ai-tool-selection-row.d.ts.map +1 -0
  32. package/dist/src/ai-tool-settings.d.ts +18 -0
  33. package/dist/src/ai-tool-settings.d.ts.map +1 -0
  34. package/dist/src/ai-tool-top-bar-menu.d.ts +46 -0
  35. package/dist/src/ai-tool-top-bar-menu.d.ts.map +1 -0
  36. package/dist/src/ai-tool.d.ts +64 -0
  37. package/dist/src/ai-tool.d.ts.map +1 -0
  38. package/dist/src/ai-tools-injection-token.d.ts +12 -0
  39. package/dist/src/ai-tools-injection-token.d.ts.map +1 -0
  40. package/dist/src/ai-tools-open-externally.d.ts +17 -0
  41. package/dist/src/ai-tools-open-externally.d.ts.map +1 -0
  42. package/dist/src/build-external-terminal-command.d.ts +33 -0
  43. package/dist/src/build-external-terminal-command.d.ts.map +1 -0
  44. package/dist/src/current-shell-family.d.ts +13 -0
  45. package/dist/src/current-shell-family.d.ts.map +1 -0
  46. package/dist/src/default-ai-tool-icon.d.ts +8 -0
  47. package/dist/src/default-ai-tool-icon.d.ts.map +1 -0
  48. package/dist/src/detected-ai-tools.d.ts +15 -0
  49. package/dist/src/detected-ai-tools.d.ts.map +1 -0
  50. package/dist/src/get-ai-command-for-terminal.d.ts +17 -0
  51. package/dist/src/get-ai-command-for-terminal.d.ts.map +1 -0
  52. package/dist/src/get-ai-tool-injectable-bunch.d.ts +534 -0
  53. package/dist/src/get-ai-tool-injectable-bunch.d.ts.map +1 -0
  54. package/dist/src/get-ai-tool-is-installed-cli-command.d.ts +20 -0
  55. package/dist/src/get-ai-tool-is-installed-cli-command.d.ts.map +1 -0
  56. package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts +17 -0
  57. package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts.map +1 -0
  58. package/dist/src/get-resume-ai-command-for-terminal.d.ts +23 -0
  59. package/dist/src/get-resume-ai-command-for-terminal.d.ts.map +1 -0
  60. package/dist/src/operating-system-specific.d.ts +16 -0
  61. package/dist/src/operating-system-specific.d.ts.map +1 -0
  62. package/dist/src/os-and-shell-specific.d.ts +133 -0
  63. package/dist/src/os-and-shell-specific.d.ts.map +1 -0
  64. package/dist/src/resolve-llm-command.d.ts +16 -0
  65. package/dist/src/resolve-llm-command.d.ts.map +1 -0
  66. package/dist/src/selected-ai-tool-injection-tokens.d.ts +363 -0
  67. package/dist/src/selected-ai-tool-injection-tokens.d.ts.map +1 -0
  68. package/dist/tsconfig.tsbuildinfo +1 -0
  69. package/package.json +63 -0
package/dist/index.js ADDED
@@ -0,0 +1,642 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ AiToolSelectionRow: () => AiToolSelectionRow,
34
+ DefaultAiToolIcon: () => DefaultAiToolIcon,
35
+ agentsInstructionsFilename: () => agentsInstructionsFilename,
36
+ agentsInstructionsIndirectionContents: () => agentsInstructionsIndirectionContents,
37
+ aiToolConfigurationMenuKind: () => aiToolConfigurationMenuKind,
38
+ aiToolConfigurationStateInjectionToken: () => aiToolConfigurationStateInjectionToken,
39
+ aiToolDescriptionInjectionToken: () => aiToolDescriptionInjectionToken,
40
+ aiToolDisplayNameInjectionToken: () => aiToolDisplayNameInjectionToken,
41
+ aiToolIconForKindInjectionToken: () => aiToolIconForKindInjectionToken,
42
+ aiToolIconInjectionToken: () => aiToolIconInjectionToken,
43
+ aiToolInjectionToken: () => aiToolInjectionToken,
44
+ aiToolInstallationInstructionsInjectionToken: () => aiToolInstallationInstructionsInjectionToken,
45
+ aiToolInstalledViaCliCommandInjectionToken: () => aiToolInstalledViaCliCommandInjectionToken,
46
+ aiToolInstructionsFilenameInjectionToken: () => aiToolInstructionsFilenameInjectionToken,
47
+ aiToolInstructionsIndirectionFilenamesInjectionToken: () => aiToolInstructionsIndirectionFilenamesInjectionToken,
48
+ aiToolIsConfiguredForKindInjectionToken: () => aiToolIsConfiguredForKindInjectionToken,
49
+ aiToolIsConfiguredInjectionToken: () => aiToolIsConfiguredInjectionToken,
50
+ aiToolNameInjectionToken: () => aiToolNameInjectionToken,
51
+ aiToolOrderNumberInjectionToken: () => aiToolOrderNumberInjectionToken,
52
+ aiToolSettingsInjectionToken: () => aiToolSettingsInjectionToken,
53
+ aiToolTopBarMenuKind: () => aiToolTopBarMenuKind,
54
+ aiToolTopBarMenuOrderNumbers: () => aiToolTopBarMenuOrderNumbers,
55
+ aiToolsInjectionToken: () => aiToolsInjectionToken,
56
+ aiToolsOpenExternallyInjectionToken: () => aiToolsOpenExternallyInjectionToken,
57
+ currentShellFamilyInjectionToken: () => currentShellFamilyInjectionToken,
58
+ customAiToolKind: () => customAiToolKind,
59
+ detectedAiToolsInjectionToken: () => detectedAiToolsInjectionToken,
60
+ effectiveAiToolDisplayNameInjectionToken: () => effectiveAiToolDisplayNameInjectionToken,
61
+ effectiveAiToolIconInjectionToken: () => effectiveAiToolIconInjectionToken,
62
+ effectiveAiToolKindInjectionToken: () => effectiveAiToolKindInjectionToken,
63
+ effectiveAiToolNameInjectionToken: () => effectiveAiToolNameInjectionToken,
64
+ externalTerminalCommandBuilderInjectionToken: () => externalTerminalCommandBuilderInjectionToken,
65
+ getAiCommandForTerminalInjectionToken: () => getAiCommandForTerminalInjectionToken,
66
+ getAiToolInjectableBunch: () => getAiToolInjectableBunch,
67
+ getAiToolIsInstalledCliCommandInjectionToken: () => getAiToolIsInstalledCliCommandInjectionToken,
68
+ getOpenToolInExternalTerminalForToolInjectionToken: () => getOpenToolInExternalTerminalForToolInjectionToken,
69
+ getOsAndShellAwareInjectable: () => getOsAndShellAwareInjectable,
70
+ getResumeAiCommandForTerminalInjectionToken: () => getResumeAiCommandForTerminalInjectionToken,
71
+ noAiToolKind: () => noAiToolKind,
72
+ refreshAiToolDetectionInjectionToken: () => refreshAiToolDetectionInjectionToken,
73
+ resolveLlmCommand: () => resolveLlmCommand,
74
+ selectedAiToolCommandInjectionToken: () => selectedAiToolCommandInjectionToken,
75
+ selectedAiToolKindInjectionToken: () => selectedAiToolKindInjectionToken,
76
+ selectedAiToolOpenInExternalTerminalCommandInjectionToken: () => selectedAiToolOpenInExternalTerminalCommandInjectionToken,
77
+ selectedAiToolResumeCommandInjectionToken: () => selectedAiToolResumeCommandInjectionToken,
78
+ shellQuote: () => import_public_utilities2.shellQuote,
79
+ windowsShellQuote: () => import_public_utilities2.windowsShellQuote
80
+ });
81
+ module.exports = __toCommonJS(index_exports);
82
+
83
+ // src/ai-tool.ts
84
+ var customAiToolKind = "custom";
85
+ var noAiToolKind = "none";
86
+ var agentsInstructionsFilename = "AGENTS.md";
87
+ var agentsInstructionsIndirectionContents = `@${agentsInstructionsFilename}
88
+ `;
89
+
90
+ // src/ai-tool-is-configured.ts
91
+ var import_injectable = require("@k8slens/injectable");
92
+ var aiToolIsConfiguredInjectionToken = (0, import_injectable.getInjectionToken2)({
93
+ id: "ai-tool-is-configured",
94
+ cardinality: "one"
95
+ })();
96
+
97
+ // src/os-and-shell-specific.ts
98
+ var import_platform_specific_injectables = require("@k8slens/platform-specific-injectables");
99
+ var isFunction = (value) => typeof value === "function";
100
+ var isShellSpecific = (value) => "posix" in value;
101
+ var sameForEveryShell = (value) => ({
102
+ posix: () => value,
103
+ fish: () => value,
104
+ cmd: () => value,
105
+ powershell: () => value
106
+ });
107
+ var perShellProducers = (value) => ({
108
+ posix: () => value.posix,
109
+ fish: () => value.fish,
110
+ cmd: () => value.cmd,
111
+ powershell: () => value.powershell
112
+ });
113
+ var getOsAndShellAwareInjectable = (args) => {
114
+ const { id, injectionToken, value } = args;
115
+ if (isFunction(value)) {
116
+ return (0, import_platform_specific_injectables.getInjectableForShells)({ id, injectionToken, instantiate: sameForEveryShell(value) });
117
+ }
118
+ if (isShellSpecific(value)) {
119
+ return (0, import_platform_specific_injectables.getInjectableForShells)({ id, injectionToken, instantiate: perShellProducers(value) });
120
+ }
121
+ const perOperatingSystem = (osValue) => isFunction(osValue) ? sameForEveryShell(osValue) : perShellProducers(osValue);
122
+ return (0, import_platform_specific_injectables.getInjectableForOperatingSystemsAndShells)({
123
+ id,
124
+ injectionToken,
125
+ instantiate: {
126
+ macos: perOperatingSystem(value.macos),
127
+ windows: perOperatingSystem(value.windows),
128
+ linux: perOperatingSystem(value.linux)
129
+ }
130
+ });
131
+ };
132
+
133
+ // src/current-shell-family.ts
134
+ var import_injectable2 = require("@k8slens/injectable");
135
+ var currentShellFamilyInjectionToken = (0, import_injectable2.getInjectionToken2)({
136
+ id: "current-shell-family",
137
+ cardinality: "one"
138
+ })();
139
+
140
+ // src/ai-tool-injection-token.ts
141
+ var import_injectable3 = require("@k8slens/injectable");
142
+ var aiToolInjectionToken = (0, import_injectable3.getInjectionToken2)({
143
+ id: "ai-tool",
144
+ cardinality: "zero-or-many"
145
+ })();
146
+
147
+ // src/get-ai-command-for-terminal.ts
148
+ var import_injectable4 = require("@k8slens/injectable");
149
+ var getAiCommandForTerminalInjectionToken = (0, import_injectable4.getInjectionToken2)({
150
+ id: "get-ai-command-for-terminal",
151
+ cardinality: "zero-or-many"
152
+ })(
153
+ (kind) => (0, import_injectable4.getInjectionToken2)({
154
+ id: `get-ai-command-for-terminal-${kind}`,
155
+ speciality: kind,
156
+ cardinality: "zero-or-many"
157
+ })()
158
+ );
159
+
160
+ // src/get-resume-ai-command-for-terminal.ts
161
+ var import_injectable5 = require("@k8slens/injectable");
162
+ var getResumeAiCommandForTerminalInjectionToken = (0, import_injectable5.getInjectionToken2)({
163
+ id: "get-resume-ai-command-for-terminal",
164
+ cardinality: "zero-or-many"
165
+ })(
166
+ (kind) => (0, import_injectable5.getInjectionToken2)({
167
+ id: `get-resume-ai-command-for-terminal-${kind}`,
168
+ speciality: kind,
169
+ cardinality: "zero-or-many"
170
+ })()
171
+ );
172
+
173
+ // src/ai-tool-installed-via-cli-command.ts
174
+ var import_injectable6 = require("@k8slens/injectable");
175
+ var aiToolInstalledViaCliCommandInjectionToken = (0, import_injectable6.getInjectionToken2)({
176
+ id: "ai-tool-installed-via-cli-command",
177
+ cardinality: "one"
178
+ })();
179
+
180
+ // src/ai-tool-detection.ts
181
+ var import_injectable7 = require("@k8slens/injectable");
182
+ var refreshAiToolDetectionInjectionToken = (0, import_injectable7.getInjectionToken2)(
183
+ {
184
+ id: "refresh-ai-tool-detection",
185
+ cardinality: "one"
186
+ }
187
+ )();
188
+
189
+ // src/ai-tool-name.ts
190
+ var import_injectable8 = require("@k8slens/injectable");
191
+ var aiToolNameInjectionToken = (0, import_injectable8.getInjectionToken2)({
192
+ id: "ai-tool-name",
193
+ cardinality: "zero-or-many"
194
+ })(
195
+ (kind) => (0, import_injectable8.getInjectionToken2)({
196
+ id: `ai-tool-name-${kind}`,
197
+ speciality: kind,
198
+ cardinality: "one"
199
+ })()
200
+ );
201
+
202
+ // src/ai-tool-display-name.ts
203
+ var import_injectable9 = require("@k8slens/injectable");
204
+ var aiToolDisplayNameInjectionToken = (0, import_injectable9.getInjectionToken2)({
205
+ id: "ai-tool-display-name",
206
+ cardinality: "zero-or-many"
207
+ })(
208
+ (kind) => (0, import_injectable9.getInjectionToken2)({
209
+ id: `ai-tool-display-name-${kind}`,
210
+ speciality: kind,
211
+ cardinality: "one"
212
+ })()
213
+ );
214
+
215
+ // src/ai-tool-description.ts
216
+ var import_injectable10 = require("@k8slens/injectable");
217
+ var aiToolDescriptionInjectionToken = (0, import_injectable10.getInjectionToken2)({
218
+ id: "ai-tool-description",
219
+ cardinality: "zero-or-many"
220
+ })(
221
+ (kind) => (0, import_injectable10.getInjectionToken2)({
222
+ id: `ai-tool-description-${kind}`,
223
+ speciality: kind,
224
+ cardinality: "one"
225
+ })()
226
+ );
227
+
228
+ // src/ai-tool-icon.ts
229
+ var import_injectable11 = require("@k8slens/injectable");
230
+ var aiToolIconInjectionToken = (0, import_injectable11.getInjectionToken2)({
231
+ id: "ai-tool-icon",
232
+ cardinality: "zero-or-many"
233
+ })(
234
+ (kind) => (0, import_injectable11.getInjectionToken2)({
235
+ id: `ai-tool-icon-${kind}`,
236
+ speciality: kind,
237
+ cardinality: "one"
238
+ })()
239
+ );
240
+ var aiToolIconForKindInjectionToken = (0, import_injectable11.getInjectionToken2)({
241
+ id: "ai-tool-icon-for-kind",
242
+ cardinality: "one"
243
+ })();
244
+
245
+ // src/default-ai-tool-icon.tsx
246
+ var import_element_components = require("@k8slens/element-components");
247
+ var import_jsx_runtime = require("react/jsx-runtime");
248
+ var DefaultAiToolIcon = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element_components.Svg, { ...props, viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H3zm0 2h18v14H3V5zm3.5 2.5L5 9l2 2-2 2 1.5 1.5L11 11 6.5 7.5zM12 14h5v2h-5v-2z" }) });
249
+
250
+ // src/ai-tool-order-number.ts
251
+ var import_injectable12 = require("@k8slens/injectable");
252
+ var aiToolOrderNumberInjectionToken = (0, import_injectable12.getInjectionToken2)({
253
+ id: "ai-tool-order-number",
254
+ cardinality: "zero-or-many"
255
+ })(
256
+ (kind) => (0, import_injectable12.getInjectionToken2)({
257
+ id: `ai-tool-order-number-${kind}`,
258
+ speciality: kind,
259
+ cardinality: "one"
260
+ })()
261
+ );
262
+
263
+ // src/ai-tool-settings.ts
264
+ var import_injectable13 = require("@k8slens/injectable");
265
+ var aiToolSettingsInjectionToken = (0, import_injectable13.getInjectionToken2)({
266
+ id: "ai-tool-settings",
267
+ cardinality: "zero-or-many"
268
+ })(
269
+ (kind) => (0, import_injectable13.getInjectionToken2)({
270
+ id: `ai-tool-settings-${kind}`,
271
+ speciality: kind,
272
+ cardinality: "one"
273
+ })()
274
+ );
275
+
276
+ // src/ai-tool-installation-instructions.ts
277
+ var import_injectable14 = require("@k8slens/injectable");
278
+ var aiToolInstallationInstructionsInjectionToken = (0, import_injectable14.getInjectionToken2)({
279
+ id: "ai-tool-installation-instructions",
280
+ cardinality: "zero-or-many"
281
+ })(
282
+ (kind) => (0, import_injectable14.getInjectionToken2)({
283
+ id: `ai-tool-installation-instructions-${kind}`,
284
+ speciality: kind,
285
+ cardinality: "one"
286
+ })()
287
+ );
288
+
289
+ // src/ai-tool-instructions-filename.ts
290
+ var import_injectable15 = require("@k8slens/injectable");
291
+ var aiToolInstructionsFilenameInjectionToken = (0, import_injectable15.getInjectionToken2)({
292
+ id: "ai-tool-instructions-filename",
293
+ cardinality: "zero-or-many"
294
+ })(
295
+ (kind) => (0, import_injectable15.getInjectionToken2)({
296
+ id: `ai-tool-instructions-filename-${kind}`,
297
+ speciality: kind,
298
+ cardinality: "one"
299
+ })()
300
+ );
301
+
302
+ // src/ai-tool-instructions-filenames.ts
303
+ var import_injectable16 = require("@k8slens/injectable");
304
+ var aiToolInstructionsIndirectionFilenamesInjectionToken = (0, import_injectable16.getInjectionToken2)({
305
+ id: "ai-tool-instructions-indirection-filenames",
306
+ cardinality: "one"
307
+ })();
308
+
309
+ // src/resolve-llm-command.ts
310
+ var import_public_utilities = require("@k8slens/public-utilities");
311
+ var promptPlaceholder = "{prompt}";
312
+ var dirPlaceholder = "{dir}";
313
+ var escapeForRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
314
+ var substitute = (template, placeholder, value) => {
315
+ if (value !== void 0 && value !== "") {
316
+ return template.split(placeholder).join((0, import_public_utilities.shellQuote)(value));
317
+ }
318
+ const stripPattern = new RegExp(`\\s*${escapeForRegex(placeholder)}`, "g");
319
+ return template.replace(stripPattern, "");
320
+ };
321
+ var resolveLlmCommand = (template, { prompt, dir } = {}) => {
322
+ let resolved = substitute(template, dirPlaceholder, dir);
323
+ resolved = substitute(resolved, promptPlaceholder, prompt);
324
+ return resolved;
325
+ };
326
+
327
+ // index.ts
328
+ var import_public_utilities2 = require("@k8slens/public-utilities");
329
+
330
+ // src/build-external-terminal-command.ts
331
+ var import_injectable17 = require("@k8slens/injectable");
332
+ var externalTerminalCommandBuilderInjectionToken = (0, import_injectable17.getInjectionToken2)({
333
+ id: "external-terminal-command-builder",
334
+ cardinality: "one"
335
+ })();
336
+
337
+ // src/get-open-tool-in-external-terminal-for-tool.ts
338
+ var import_injectable18 = require("@k8slens/injectable");
339
+ var getOpenToolInExternalTerminalForToolInjectionToken = (0, import_injectable18.getInjectionToken2)({
340
+ id: "open-tool-in-external-terminal-for-tool",
341
+ cardinality: "zero-or-many"
342
+ })(
343
+ (kind) => (0, import_injectable18.getInjectionToken2)({
344
+ id: `open-tool-in-external-terminal-for-tool-${kind}`,
345
+ speciality: kind,
346
+ cardinality: "zero-or-many"
347
+ })()
348
+ );
349
+
350
+ // src/get-ai-tool-is-installed-cli-command.ts
351
+ var import_injectable19 = require("@k8slens/injectable");
352
+ var getAiToolIsInstalledCliCommandInjectionToken = (0, import_injectable19.getInjectionToken2)({
353
+ id: "ai-tool-is-installed-cli-command",
354
+ cardinality: "zero-or-many"
355
+ })(
356
+ (kind) => (0, import_injectable19.getInjectionToken2)({
357
+ id: `ai-tool-is-installed-cli-command-${kind}`,
358
+ speciality: kind,
359
+ cardinality: "zero-or-many"
360
+ })()
361
+ );
362
+
363
+ // src/ai-tools-open-externally.ts
364
+ var import_injectable20 = require("@k8slens/injectable");
365
+ var aiToolsOpenExternallyInjectionToken = (0, import_injectable20.getInjectionToken2)({
366
+ id: "ai-tools-open-externally",
367
+ cardinality: "one"
368
+ })();
369
+
370
+ // src/get-ai-tool-injectable-bunch.ts
371
+ var import_injectable22 = require("@k8slens/injectable");
372
+ var import_drop_down_menu_contracts2 = require("@k8slens/drop-down-menu-contracts");
373
+ var import_mobx = require("mobx");
374
+ var import_react = __toESM(require("react"));
375
+
376
+ // src/ai-tool-selection-row.ts
377
+ var import_injectable_react = require("@k8slens/injectable-react");
378
+ var AiToolSelectionRow = (0, import_injectable_react.getInjectionTokenComponent2)({
379
+ id: "ai-tool-selection-row"
380
+ })();
381
+
382
+ // src/ai-tool-top-bar-menu.ts
383
+ var import_drop_down_menu_contracts = require("@k8slens/drop-down-menu-contracts");
384
+ var aiToolTopBarMenuKind = (0, import_drop_down_menu_contracts.getDropDownMenuKind)()("ai-tool-top-bar-menu");
385
+ var aiToolTopBarMenuOrderNumbers = {
386
+ /** The heading above the selection rows. */
387
+ aiToolsHeader: 100,
388
+ /** The scanning indicator shown while the first detection has not settled. */
389
+ detectionPending: 200,
390
+ /** The first order number of the band holding the rows of installed tools. */
391
+ installedAiToolBand: 300,
392
+ /** The first order number of the band holding the rows of not-installed tools. */
393
+ notInstalledAiToolBand: 400,
394
+ /** How wide each selection band is, and so how far a tool's own number may reach. */
395
+ bandWidth: 100,
396
+ /** The first order number past the whole selection section. */
397
+ sectionEnd: 500
398
+ };
399
+
400
+ // src/detected-ai-tools.ts
401
+ var import_injectable21 = require("@k8slens/injectable");
402
+ var detectedAiToolsInjectionToken = (0, import_injectable21.getInjectionToken2)({
403
+ id: "detected-ai-tools",
404
+ cardinality: "one"
405
+ })();
406
+
407
+ // src/get-ai-tool-injectable-bunch.ts
408
+ var detectedInstallState = (detectedAiTools, kind) => {
409
+ var _a;
410
+ return (_a = detectedAiTools.get().find((tool) => tool.kind === kind)) == null ? void 0 : _a.isInstalled;
411
+ };
412
+ var inSelectionBand = (band, toolOrderNumber) => band + Math.max(0, Math.min(toolOrderNumber, aiToolTopBarMenuOrderNumbers.bandWidth - 1));
413
+ var getAiToolInjectableBunch = (params) => {
414
+ const displayName = params.name ?? params.kind;
415
+ const NameComponent = params.Name ?? (() => import_react.default.createElement(import_react.default.Fragment, null, displayName));
416
+ const DescriptionComponent = params.Description ?? (() => null);
417
+ const IconComponent = params.Icon ?? DefaultAiToolIcon;
418
+ const SelectionRowComponent = () => import_react.default.createElement(AiToolSelectionRow, { kind: params.kind });
419
+ const SettingsComponent = params.Settings ?? (() => null);
420
+ const InstallationInstructionsComponent = params.InstallationInstructions ?? (() => null);
421
+ return (0, import_injectable22.getInjectableBunch)({
422
+ aiTool: (0, import_injectable22.getInjectable2)({
423
+ id: `ai-tool-${params.kind}`,
424
+ instantiate: () => () => params.kind,
425
+ injectionToken: aiToolInjectionToken
426
+ }),
427
+ orderNumber: (0, import_injectable22.getInjectable2)({
428
+ id: `ai-tool-order-number-${params.kind}`,
429
+ instantiate: () => () => params.orderNumber,
430
+ injectionToken: aiToolOrderNumberInjectionToken.for(params.kind)
431
+ }),
432
+ getCliCommand: getOsAndShellAwareInjectable({
433
+ id: `get-ai-command-for-terminal-${params.kind}`,
434
+ injectionToken: getAiCommandForTerminalInjectionToken.for(params.kind),
435
+ value: params.getCliCommand
436
+ }),
437
+ getResumeCliCommand: getOsAndShellAwareInjectable({
438
+ id: `get-resume-ai-command-for-terminal-${params.kind}`,
439
+ injectionToken: getResumeAiCommandForTerminalInjectionToken.for(params.kind),
440
+ value: params.getResumeCliCommand
441
+ }),
442
+ getOpenToolInExternalTerminalCliCommand: getOsAndShellAwareInjectable({
443
+ id: `open-tool-in-external-terminal-for-tool-${params.kind}`,
444
+ injectionToken: getOpenToolInExternalTerminalForToolInjectionToken.for(params.kind),
445
+ value: params.getOpenToolInExternalTerminalCliCommand
446
+ }),
447
+ name: (0, import_injectable22.getInjectable2)({
448
+ id: `ai-tool-name-${params.kind}`,
449
+ instantiate: () => () => NameComponent,
450
+ injectionToken: aiToolNameInjectionToken.for(params.kind)
451
+ }),
452
+ displayName: (0, import_injectable22.getInjectable2)({
453
+ id: `ai-tool-display-name-${params.kind}`,
454
+ instantiate: () => () => displayName,
455
+ injectionToken: aiToolDisplayNameInjectionToken.for(params.kind)
456
+ }),
457
+ description: (0, import_injectable22.getInjectable2)({
458
+ id: `ai-tool-description-${params.kind}`,
459
+ instantiate: () => () => DescriptionComponent,
460
+ injectionToken: aiToolDescriptionInjectionToken.for(params.kind)
461
+ }),
462
+ icon: (0, import_injectable22.getInjectable2)({
463
+ id: `ai-tool-icon-${params.kind}`,
464
+ instantiate: () => () => IconComponent,
465
+ injectionToken: aiToolIconInjectionToken.for(params.kind)
466
+ }),
467
+ settings: (0, import_injectable22.getInjectable2)({
468
+ id: `ai-tool-settings-${params.kind}`,
469
+ instantiate: () => () => SettingsComponent,
470
+ injectionToken: aiToolSettingsInjectionToken.for(params.kind)
471
+ }),
472
+ installationInstructions: (0, import_injectable22.getInjectable2)({
473
+ id: `ai-tool-installation-instructions-${params.kind}`,
474
+ instantiate: () => () => InstallationInstructionsComponent,
475
+ injectionToken: aiToolInstallationInstructionsInjectionToken.for(params.kind)
476
+ }),
477
+ instructionsFilename: (0, import_injectable22.getInjectable2)({
478
+ id: `ai-tool-instructions-filename-${params.kind}`,
479
+ instantiate: () => () => params.instructionsFilename,
480
+ injectionToken: aiToolInstructionsFilenameInjectionToken.for(params.kind)
481
+ }),
482
+ // The tool's rows in the AI tool button's drop-down menu: one per band, the
483
+ // visibility switching on the detected install state so the tool sits in
484
+ // whichever band matches — and in neither while no scan has determined it.
485
+ // What a row looks like and does is the AiToolSelectionRow implementation's
486
+ // business.
487
+ installedSelectionRow: (0, import_injectable22.getInjectable2)({
488
+ id: `ai-tool-selection-row-installed-${params.kind}`,
489
+ consumptions: [detectedAiToolsInjectionToken],
490
+ instantiate: (di) => {
491
+ const detectedAiTools = di.inject(detectedAiToolsInjectionToken)();
492
+ const item = {
493
+ id: `ai-tool-selection-row-installed-${params.kind}`,
494
+ orderNumber: inSelectionBand(aiToolTopBarMenuOrderNumbers.installedAiToolBand, params.orderNumber),
495
+ isVisible: (0, import_mobx.computed)(() => detectedInstallState(detectedAiTools, params.kind) === true),
496
+ Component: SelectionRowComponent
497
+ };
498
+ return () => item;
499
+ },
500
+ injectionToken: import_drop_down_menu_contracts2.dropDownMenuItemInjectionToken.for(aiToolTopBarMenuKind)
501
+ }),
502
+ notInstalledSelectionRow: (0, import_injectable22.getInjectable2)({
503
+ id: `ai-tool-selection-row-not-installed-${params.kind}`,
504
+ consumptions: [detectedAiToolsInjectionToken],
505
+ instantiate: (di) => {
506
+ const detectedAiTools = di.inject(detectedAiToolsInjectionToken)();
507
+ const item = {
508
+ id: `ai-tool-selection-row-not-installed-${params.kind}`,
509
+ orderNumber: inSelectionBand(aiToolTopBarMenuOrderNumbers.notInstalledAiToolBand, params.orderNumber),
510
+ isVisible: (0, import_mobx.computed)(() => detectedInstallState(detectedAiTools, params.kind) === false),
511
+ Component: SelectionRowComponent
512
+ };
513
+ return () => item;
514
+ },
515
+ injectionToken: import_drop_down_menu_contracts2.dropDownMenuItemInjectionToken.for(aiToolTopBarMenuKind)
516
+ }),
517
+ // The install-detection command, registered only when the tool declares one;
518
+ // the detected-tools list runs it (exit 0 ⇒ installed). A tool that declares
519
+ // none (e.g. Custom) is reported as installed.
520
+ ...params.getAiToolIsInstalledCliCommand !== void 0 ? {
521
+ aiToolIsInstalledCliCommand: getOsAndShellAwareInjectable({
522
+ id: `ai-tool-is-installed-cli-command-${params.kind}`,
523
+ injectionToken: getAiToolIsInstalledCliCommandInjectionToken.for(params.kind),
524
+ value: params.getAiToolIsInstalledCliCommand
525
+ })
526
+ } : {}
527
+ });
528
+ };
529
+
530
+ // src/ai-tools-injection-token.ts
531
+ var import_injectable23 = require("@k8slens/injectable");
532
+ var aiToolsInjectionToken = (0, import_injectable23.getInjectionToken2)({
533
+ id: "ai-tools",
534
+ cardinality: "one"
535
+ })();
536
+
537
+ // src/ai-tool-configuration.ts
538
+ var import_injectable24 = require("@k8slens/injectable");
539
+ var import_drop_down_menu_contracts3 = require("@k8slens/drop-down-menu-contracts");
540
+ var aiToolConfigurationMenuKind = (0, import_drop_down_menu_contracts3.getDropDownMenuKind)()(
541
+ "ai-tool-configuration-menu"
542
+ );
543
+ var aiToolIsConfiguredForKindInjectionToken = (0, import_injectable24.getInjectionToken2)({
544
+ id: "ai-tool-is-configured-for-kind",
545
+ cardinality: "zero-or-one"
546
+ })(
547
+ (kind) => (0, import_injectable24.getInjectionToken2)({
548
+ id: `ai-tool-is-configured-for-kind-${kind}`,
549
+ speciality: kind,
550
+ cardinality: "zero-or-one"
551
+ })()
552
+ );
553
+ var aiToolConfigurationStateInjectionToken = (0, import_injectable24.getInjectionToken2)({
554
+ id: "ai-tool-configuration-state",
555
+ cardinality: "one"
556
+ })();
557
+
558
+ // src/selected-ai-tool-injection-tokens.ts
559
+ var import_injectable25 = require("@k8slens/injectable");
560
+ var selectedAiToolKindInjectionToken = (0, import_injectable25.getInjectionToken2)({
561
+ id: "selected-ai-tool-kind",
562
+ cardinality: "one"
563
+ })();
564
+ var effectiveAiToolKindInjectionToken = (0, import_injectable25.getInjectionToken2)({
565
+ id: "effective-ai-tool-kind",
566
+ cardinality: "one"
567
+ })();
568
+ var selectedAiToolCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
569
+ id: "selected-ai-tool-command",
570
+ cardinality: "one"
571
+ })();
572
+ var selectedAiToolResumeCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
573
+ id: "selected-ai-tool-resume-command",
574
+ cardinality: "one"
575
+ })();
576
+ var selectedAiToolOpenInExternalTerminalCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
577
+ id: "selected-ai-tool-open-in-external-terminal-command",
578
+ cardinality: "one"
579
+ })();
580
+ var effectiveAiToolNameInjectionToken = (0, import_injectable25.getInjectionToken2)({
581
+ id: "effective-ai-tool-name",
582
+ cardinality: "one"
583
+ })();
584
+ var effectiveAiToolDisplayNameInjectionToken = (0, import_injectable25.getInjectionToken2)({
585
+ id: "effective-ai-tool-display-name",
586
+ cardinality: "one"
587
+ })();
588
+ var effectiveAiToolIconInjectionToken = (0, import_injectable25.getInjectionToken2)({
589
+ id: "effective-ai-tool-icon",
590
+ cardinality: "one"
591
+ })();
592
+ // Annotate the CommonJS export names for ESM import in node:
593
+ 0 && (module.exports = {
594
+ AiToolSelectionRow,
595
+ DefaultAiToolIcon,
596
+ agentsInstructionsFilename,
597
+ agentsInstructionsIndirectionContents,
598
+ aiToolConfigurationMenuKind,
599
+ aiToolConfigurationStateInjectionToken,
600
+ aiToolDescriptionInjectionToken,
601
+ aiToolDisplayNameInjectionToken,
602
+ aiToolIconForKindInjectionToken,
603
+ aiToolIconInjectionToken,
604
+ aiToolInjectionToken,
605
+ aiToolInstallationInstructionsInjectionToken,
606
+ aiToolInstalledViaCliCommandInjectionToken,
607
+ aiToolInstructionsFilenameInjectionToken,
608
+ aiToolInstructionsIndirectionFilenamesInjectionToken,
609
+ aiToolIsConfiguredForKindInjectionToken,
610
+ aiToolIsConfiguredInjectionToken,
611
+ aiToolNameInjectionToken,
612
+ aiToolOrderNumberInjectionToken,
613
+ aiToolSettingsInjectionToken,
614
+ aiToolTopBarMenuKind,
615
+ aiToolTopBarMenuOrderNumbers,
616
+ aiToolsInjectionToken,
617
+ aiToolsOpenExternallyInjectionToken,
618
+ currentShellFamilyInjectionToken,
619
+ customAiToolKind,
620
+ detectedAiToolsInjectionToken,
621
+ effectiveAiToolDisplayNameInjectionToken,
622
+ effectiveAiToolIconInjectionToken,
623
+ effectiveAiToolKindInjectionToken,
624
+ effectiveAiToolNameInjectionToken,
625
+ externalTerminalCommandBuilderInjectionToken,
626
+ getAiCommandForTerminalInjectionToken,
627
+ getAiToolInjectableBunch,
628
+ getAiToolIsInstalledCliCommandInjectionToken,
629
+ getOpenToolInExternalTerminalForToolInjectionToken,
630
+ getOsAndShellAwareInjectable,
631
+ getResumeAiCommandForTerminalInjectionToken,
632
+ noAiToolKind,
633
+ refreshAiToolDetectionInjectionToken,
634
+ resolveLlmCommand,
635
+ selectedAiToolCommandInjectionToken,
636
+ selectedAiToolKindInjectionToken,
637
+ selectedAiToolOpenInExternalTerminalCommandInjectionToken,
638
+ selectedAiToolResumeCommandInjectionToken,
639
+ shellQuote,
640
+ windowsShellQuote
641
+ });
642
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vc3JjL2FpLXRvb2wudHMiLCAiLi4vc3JjL2FpLXRvb2wtaXMtY29uZmlndXJlZC50cyIsICIuLi9zcmMvb3MtYW5kLXNoZWxsLXNwZWNpZmljLnRzIiwgIi4uL3NyYy9jdXJyZW50LXNoZWxsLWZhbWlseS50cyIsICIuLi9zcmMvYWktdG9vbC1pbmplY3Rpb24tdG9rZW4udHMiLCAiLi4vc3JjL2dldC1haS1jb21tYW5kLWZvci10ZXJtaW5hbC50cyIsICIuLi9zcmMvZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbC50cyIsICIuLi9zcmMvYWktdG9vbC1pbnN0YWxsZWQtdmlhLWNsaS1jb21tYW5kLnRzIiwgIi4uL3NyYy9haS10b29sLWRldGVjdGlvbi50cyIsICIuLi9zcmMvYWktdG9vbC1uYW1lLnRzIiwgIi4uL3NyYy9haS10b29sLWRpc3BsYXktbmFtZS50cyIsICIuLi9zcmMvYWktdG9vbC1kZXNjcmlwdGlvbi50cyIsICIuLi9zcmMvYWktdG9vbC1pY29uLnRzIiwgIi4uL3NyYy9kZWZhdWx0LWFpLXRvb2wtaWNvbi50c3giLCAiLi4vc3JjL2FpLXRvb2wtb3JkZXItbnVtYmVyLnRzIiwgIi4uL3NyYy9haS10b29sLXNldHRpbmdzLnRzIiwgIi4uL3NyYy9haS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMudHMiLCAiLi4vc3JjL2FpLXRvb2wtaW5zdHJ1Y3Rpb25zLWZpbGVuYW1lLnRzIiwgIi4uL3NyYy9haS10b29sLWluc3RydWN0aW9ucy1maWxlbmFtZXMudHMiLCAiLi4vc3JjL3Jlc29sdmUtbGxtLWNvbW1hbmQudHMiLCAiLi4vc3JjL2J1aWxkLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmQudHMiLCAiLi4vc3JjL2dldC1vcGVuLXRvb2wtaW4tZXh0ZXJuYWwtdGVybWluYWwtZm9yLXRvb2wudHMiLCAiLi4vc3JjL2dldC1haS10b29sLWlzLWluc3RhbGxlZC1jbGktY29tbWFuZC50cyIsICIuLi9zcmMvYWktdG9vbHMtb3Blbi1leHRlcm5hbGx5LnRzIiwgIi4uL3NyYy9nZXQtYWktdG9vbC1pbmplY3RhYmxlLWJ1bmNoLnRzIiwgIi4uL3NyYy9haS10b29sLXNlbGVjdGlvbi1yb3cudHMiLCAiLi4vc3JjL2FpLXRvb2wtdG9wLWJhci1tZW51LnRzIiwgIi4uL3NyYy9kZXRlY3RlZC1haS10b29scy50cyIsICIuLi9zcmMvYWktdG9vbHMtaW5qZWN0aW9uLXRva2VuLnRzIiwgIi4uL3NyYy9haS10b29sLWNvbmZpZ3VyYXRpb24udHMiLCAiLi4vc3JjL3NlbGVjdGVkLWFpLXRvb2wtaW5qZWN0aW9uLXRva2Vucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHtcbiAgdHlwZSBBaVRvb2xLaW5kLFxuICBjdXN0b21BaVRvb2xLaW5kLFxuICBub0FpVG9vbEtpbmQsXG4gIGFnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lLFxuICBhZ2VudHNJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkNvbnRlbnRzLFxuICB0eXBlIEdldENsaUNvbW1hbmQsXG4gIHR5cGUgR2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kLFxuICB0eXBlIEdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsQ2xpQ29tbWFuZCxcbiAgdHlwZSBBaVRvb2xMaXN0RW50cnksXG59IGZyb20gXCIuL3NyYy9haS10b29sXCI7XG5leHBvcnQgeyBhaVRvb2xJc0NvbmZpZ3VyZWRJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9haS10b29sLWlzLWNvbmZpZ3VyZWRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWMsXG4gIE1heWJlT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWMsXG59IGZyb20gXCIuL3NyYy9vcGVyYXRpbmctc3lzdGVtLXNwZWNpZmljXCI7XG5leHBvcnQge1xuICB0eXBlIFNoZWxsU3BlY2lmaWMsXG4gIHR5cGUgTWF5YmVTaGVsbFNwZWNpZmljLFxuICB0eXBlIE9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWMsXG4gIHR5cGUgTWF5YmVPcGVyYXRpbmdTeXN0ZW1BbmRTaGVsbFNwZWNpZmljLFxuICBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlLFxufSBmcm9tIFwiLi9zcmMvb3MtYW5kLXNoZWxsLXNwZWNpZmljXCI7XG5leHBvcnQgeyBjdXJyZW50U2hlbGxGYW1pbHlJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9jdXJyZW50LXNoZWxsLWZhbWlseVwiO1xuXG5leHBvcnQgeyBhaVRvb2xJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9haS10b29sLWluamVjdGlvbi10b2tlblwiO1xuZXhwb3J0IHsgZ2V0QWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9nZXQtYWktY29tbWFuZC1mb3ItdGVybWluYWxcIjtcbmV4cG9ydCB7IGdldFJlc3VtZUFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9zcmMvZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiO1xuZXhwb3J0IHtcbiAgYWlUb29sSW5zdGFsbGVkVmlhQ2xpQ29tbWFuZEluamVjdGlvblRva2VuLFxuICB0eXBlIEFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmQsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RhbGxlZC12aWEtY2xpLWNvbW1hbmRcIjtcbmV4cG9ydCB7IHJlZnJlc2hBaVRvb2xEZXRlY3Rpb25JbmplY3Rpb25Ub2tlbiwgdHlwZSBSZWZyZXNoQWlUb29sRGV0ZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtZGV0ZWN0aW9uXCI7XG5leHBvcnQgeyBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4sIHR5cGUgQWlUb29sTmFtZSB9IGZyb20gXCIuL3NyYy9haS10b29sLW5hbWVcIjtcbmV4cG9ydCB7IGFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4sIHR5cGUgQWlUb29sRGlzcGxheU5hbWUgfSBmcm9tIFwiLi9zcmMvYWktdG9vbC1kaXNwbGF5LW5hbWVcIjtcbmV4cG9ydCB7XG4gIGFpVG9vbERlc2NyaXB0aW9uSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sRGVzY3JpcHRpb24sXG4gIHR5cGUgQWlUb29sRGVzY3JpcHRpb25Qcm9wcyxcbn0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtZGVzY3JpcHRpb25cIjtcbmV4cG9ydCB7XG4gIGFpVG9vbEljb25JbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJY29uLFxuICBhaVRvb2xJY29uRm9yS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIEFpVG9vbEljb25Gb3JLaW5kLFxufSBmcm9tIFwiLi9zcmMvYWktdG9vbC1pY29uXCI7XG5leHBvcnQgeyBEZWZhdWx0QWlUb29sSWNvbiB9IGZyb20gXCIuL3NyYy9kZWZhdWx0LWFpLXRvb2wtaWNvblwiO1xuZXhwb3J0IHsgYWlUb29sT3JkZXJOdW1iZXJJbmplY3Rpb25Ub2tlbiwgdHlwZSBBaVRvb2xPcmRlck51bWJlciB9IGZyb20gXCIuL3NyYy9haS10b29sLW9yZGVyLW51bWJlclwiO1xuZXhwb3J0IHsgYWlUb29sU2V0dGluZ3NJbmplY3Rpb25Ub2tlbiwgdHlwZSBBaVRvb2xTZXR0aW5ncyB9IGZyb20gXCIuL3NyYy9haS10b29sLXNldHRpbmdzXCI7XG5leHBvcnQge1xuICBhaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnNJbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnMsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnNcIjtcbmV4cG9ydCB7XG4gIGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sSW5zdHJ1Y3Rpb25zRmlsZW5hbWUsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RydWN0aW9ucy1maWxlbmFtZVwiO1xuZXhwb3J0IHtcbiAgYWlUb29sSW5zdHJ1Y3Rpb25zSW5kaXJlY3Rpb25GaWxlbmFtZXNJbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkZpbGVuYW1lcyxcbn0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtaW5zdHJ1Y3Rpb25zLWZpbGVuYW1lc1wiO1xuZXhwb3J0IHsgcmVzb2x2ZUxsbUNvbW1hbmQsIHR5cGUgUmVzb2x2ZUxsbUNvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUtbGxtLWNvbW1hbmRcIjtcbi8vIEdlbmVyaWMgc2hlbGwgZXNjYXBpbmcsIGRlZmluZWQgd2l0aCB0aGUgb3RoZXIgc2hlbGwgaGVscGVycyBpblxuLy8gQGs4c2xlbnMvcHVibGljLXV0aWxpdGllczsgcmUtZXhwb3J0ZWQgc28gZXhpc3RpbmcgaW1wb3J0ZXJzIGFyZSB1bmFmZmVjdGVkLlxuZXhwb3J0IHsgc2hlbGxRdW90ZSwgd2luZG93c1NoZWxsUXVvdGUgfSBmcm9tIFwiQGs4c2xlbnMvcHVibGljLXV0aWxpdGllc1wiO1xuZXhwb3J0IHtcbiAgZXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVySW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRPcHRpb25zLFxuICB0eXBlIEV4dGVybmFsVGVybWluYWxDb21tYW5kQnVpbGRlcixcbn0gZnJvbSBcIi4vc3JjL2J1aWxkLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmRcIjtcbmV4cG9ydCB7IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vc3JjL2dldC1vcGVuLXRvb2wtaW4tZXh0ZXJuYWwtdGVybWluYWwtZm9yLXRvb2xcIjtcbmV4cG9ydCB7IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vc3JjL2dldC1haS10b29sLWlzLWluc3RhbGxlZC1jbGktY29tbWFuZFwiO1xuZXhwb3J0IHsgYWlUb29sc09wZW5FeHRlcm5hbGx5SW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9zcmMvYWktdG9vbHMtb3Blbi1leHRlcm5hbGx5XCI7XG5leHBvcnQgeyBnZXRBaVRvb2xJbmplY3RhYmxlQnVuY2gsIHR5cGUgQWlUb29sQnVuY2hQYXJhbXMgfSBmcm9tIFwiLi9zcmMvZ2V0LWFpLXRvb2wtaW5qZWN0YWJsZS1idW5jaFwiO1xuZXhwb3J0IHsgYWlUb29sc0luamVjdGlvblRva2VuLCB0eXBlIEFpVG9vbHMgfSBmcm9tIFwiLi9zcmMvYWktdG9vbHMtaW5qZWN0aW9uLXRva2VuXCI7XG5leHBvcnQgeyBkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbiwgdHlwZSBEZXRlY3RlZEFpVG9vbHMgfSBmcm9tIFwiLi9zcmMvZGV0ZWN0ZWQtYWktdG9vbHNcIjtcbmV4cG9ydCB7IGFpVG9vbFRvcEJhck1lbnVLaW5kLCBhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzIH0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtdG9wLWJhci1tZW51XCI7XG5leHBvcnQge1xuICBhaVRvb2xDb25maWd1cmF0aW9uTWVudUtpbmQsXG4gIGFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUluamVjdGlvblRva2VuLFxuICBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sQ29uZmlndXJhdGlvblN0YXRlLFxuICB0eXBlIEFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUZvcixcbiAgdHlwZSBBaVRvb2xJc0NvbmZpZ3VyZWQsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWNvbmZpZ3VyYXRpb25cIjtcbmV4cG9ydCB7IEFpVG9vbFNlbGVjdGlvblJvdywgdHlwZSBBaVRvb2xTZWxlY3Rpb25Sb3dQcm9wcyB9IGZyb20gXCIuL3NyYy9haS10b29sLXNlbGVjdGlvbi1yb3dcIjtcbmV4cG9ydCB7XG4gIHNlbGVjdGVkQWlUb29sS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIFNlbGVjdGVkQWlUb29sS2luZCxcbiAgZWZmZWN0aXZlQWlUb29sS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIEVmZmVjdGl2ZUFpVG9vbEtpbmQsXG4gIHNlbGVjdGVkQWlUb29sQ29tbWFuZEluamVjdGlvblRva2VuLFxuICB0eXBlIFNlbGVjdGVkQWlUb29sQ29tbWFuZCxcbiAgc2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kLFxuICBzZWxlY3RlZEFpVG9vbE9wZW5JbkV4dGVybmFsVGVybWluYWxDb21tYW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgU2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZCxcbiAgZWZmZWN0aXZlQWlUb29sTmFtZUluamVjdGlvblRva2VuLFxuICB0eXBlIEVmZmVjdGl2ZUFpVG9vbE5hbWUsXG4gIGVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRWZmZWN0aXZlQWlUb29sRGlzcGxheU5hbWUsXG4gIGVmZmVjdGl2ZUFpVG9vbEljb25JbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBFZmZlY3RpdmVBaVRvb2xJY29uLFxufSBmcm9tIFwiLi9zcmMvc2VsZWN0ZWQtYWktdG9vbC1pbmplY3Rpb24tdG9rZW5zXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBDb25zdW1wdGlvbkRpLCBEaUNvbnRhaW5lckZvckluamVjdGlvbiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5cbi8qKiBJZGVudGlmaWVyIGZvciBhIGtpbmQgb2YgQUkgQ0xJIHRvb2wsIGUuZy4gYFwiY2xhdWRlXCJgLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sS2luZCA9IHN0cmluZztcblxuLyoqIFRoZSBwc2V1ZG8ta2luZCBmb3IgdGhlIHVzZXIncyBmcmVlLXRleHQgXCJDdXN0b21cIiBjb21tYW5kLiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbUFpVG9vbEtpbmQ6IEFpVG9vbEtpbmQgPSBcImN1c3RvbVwiO1xuXG4vKipcbiAqIFRoZSBwc2V1ZG8ta2luZCBmb3IgXCJObyBBSSB0b29sXCIgXHUyMDE0IHRoZSBleHBsaWNpdCBvcHQtb3V0LCBhbmQgdGhlIGRlZmF1bHQvZmFsbGJhY2tcbiAqIGVmZmVjdGl2ZSBraW5kLiBJdCBpcyBub3QgYSByZWdpc3RlcmVkIHRvb2w6IHdoZW4gaXQgaXMgdGhlIGVmZmVjdGl2ZSBzZWxlY3Rpb24sXG4gKiBMZW5zIGxhdW5jaGVzIG5vdGhpbmcgYW5kIHRoZSBBSSBzdXJmYWNlcyBoaWRlICh0aGUgdG9wLWJhciBidXR0b24gYmVjb21lc1xuICogXCJDb25maWd1cmUgQUlcIikuIFRoZSBlZmZlY3RpdmUga2luZCByZXNvbHZlcyB0byB0aGlzIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gaXNcbiAqIHVuc2V0LCBzZXQgdG8gdGhpcyBzZW50aW5lbCwgb3Igc2V0IHRvIGEgdG9vbCB0aGF0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBub0FpVG9vbEtpbmQ6IEFpVG9vbEtpbmQgPSBcIm5vbmVcIjtcblxuLyoqXG4gKiBUaGUgY2Fub25pY2FsIGFnZW50LWluc3RydWN0aW9ucyBmaWxlbmFtZSwgd3JpdHRlbiBpbnRvIGV2ZXJ5IEFJIHRvb2wgdGFiJ3NcbiAqIHdvcmtpbmcgZGlyZWN0b3J5LiBUb29scyB0aGF0IHJlYWQgYSBkaWZmZXJlbnRseS1uYW1lZCBmaWxlIChzZWVcbiAqIHtAbGluayBBaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZX0pIGdldCB0aGF0IGZpbGUgdG9vLCBhcyBhbiBpbmRpcmVjdGlvblxuICogaW1wb3J0aW5nIHRoaXMgb25lLlxuICovXG5leHBvcnQgY29uc3QgYWdlbnRzSW5zdHJ1Y3Rpb25zRmlsZW5hbWUgPSBcIkFHRU5UUy5tZFwiO1xuXG4vKipcbiAqIFRoZSBjb250ZW50cyBvZiBhIHRvb2wtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGZpbGUgKGUuZy4gYENMQVVERS5tZGApOiBhIHNpbmdsZVxuICogbGluZSBpbXBvcnRpbmcgdGhlIGNhbm9uaWNhbCB7QGxpbmsgYWdlbnRzSW5zdHJ1Y3Rpb25zRmlsZW5hbWV9LCBzbyBhIHRvb2wgdGhhdFxuICogcmVhZHMgaXRzIG93biBmaWxlbmFtZSBzdGlsbCBwaWNrcyB1cCB0aGUgaW5zdHJ1Y3Rpb25zIHdyaXR0ZW4gdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhZ2VudHNJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkNvbnRlbnRzID0gYEAke2FnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lfVxcbmA7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzaGVsbCBjb21tYW5kIHRoYXQgbGF1bmNoZXMgYW4gQUkgQ0xJIHRvb2wgaW4gYSB0ZXJtaW5hbC4gQW4gYXN5bmNcbiAqIGNhbGxiYWNrIHJlY2VpdmluZyB0aGUgREkgY29udGFpbmVyLCBzbyBhIHRvb2wgY2FuIGluamVjdCAoYW5kIGF3YWl0KSB3aGF0ZXZlclxuICogaXQgbmVlZHMgd2hpbGUgYXNzZW1ibGluZyBpdHMgY29tbWFuZC4gYGRpcmAgaXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZVxuICogY29tbWFuZCBydW5zIGluOyB0aGUgbGF1bmNoZXIgaGFzIGFscmVhZHkgd3JpdHRlbiB0aGUgY2x1c3RlciBjb250ZXh0IHRoZXJlIGFzXG4gKiBgQUdFTlRTLm1kYCAocGx1cyBwZXItdG9vbCBpbmRpcmVjdGlvbiBmaWxlcyksIHNvIHRvb2xzIGRpc2NvdmVyIGl0IGZyb20gY3dkLlxuICovXG5leHBvcnQgdHlwZSBHZXRDbGlDb21tYW5kID0gKGRpOiBEaUNvbnRhaW5lckZvckluamVjdGlvbiwgYXJnczogeyBwcm9tcHQ/OiBzdHJpbmc7IGRpcjogc3RyaW5nIH0pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGhvc3QgY29tbWFuZCB0aGF0IGNoZWNrcyB3aGV0aGVyIGFuIEFJIHRvb2wgaXMgaW5zdGFsbGVkIChlLmcuXG4gKiBgY29tbWFuZCAtdiBjbGF1ZGVgIC8gYHdoZXJlIGNsYXVkZWApLiBUaGUgY29tbWFuZCBpcyBydW4gb24gdGhlIGhvc3QgYW5kIGFuXG4gKiBleGl0IGNvZGUgb2YgYDBgIG1lYW5zIGluc3RhbGxlZC4gR2l2ZW4gdGhlIERJIGNvbnRhaW5lciwgcmV0dXJucyB0aGUgY29tbWFuZFxuICogc3RyaW5nLiBPbWl0IChvbiBgQWlUb29sQnVuY2hQYXJhbXNgKSBmb3IgYW4gYWx3YXlzLWF2YWlsYWJsZSB0b29sLlxuICovXG4vLyBSZWNlaXZlcyB0aGUgaW52b2tpbmcgaW5qZWN0YWJsZSdzIHNjb3BlZCBgZGlgLCBzbyBhIGJ1aWxkZXIgbWF5IGluamVjdFxuLy8gaW5qZWN0YWJsZXMgYnkgcmVmZXJlbmNlIGJ1dCBubyBpbmplY3Rpb24gdG9rZW5zICh0aGV5IHdvdWxkIGhhdmUgdG8gYmVcbi8vIGRlY2xhcmVkIGJ5IGV2ZXJ5IGludm9rZXIpLiBUaGUgYnVpbHQtaW4gY2hlY2tzIGFyZSBzdGF0aWMgc3RyaW5ncyBhbnl3YXkuXG5leHBvcnQgdHlwZSBHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgPSAoZGk6IENvbnN1bXB0aW9uRGkpID0+IHN0cmluZztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZ1bGwgaG9zdCBjb21tYW5kIHRoYXQgb3BlbnMgYW4gQUkgdG9vbCBpbiBhIGZyZXNoIGV4dGVybmFsIHRlcm1pbmFsXG4gKiB3aW5kb3cgXHUyMDE0IHR5cGljYWxseSBieSB3cmFwcGluZyB0aGUgdG9vbCdzIG93biBpbnZvY2F0aW9uIHdpdGggb25lIG9mIHRoZVxuICogYGJ1aWxke01hYyxXaW5kb3dzLExpbnV4fUV4dGVybmFsVGVybWluYWxDb21tYW5kYCBoZWxwZXJzLiBNaXJyb3JzXG4gKiB7QGxpbmsgR2V0Q2xpQ29tbWFuZH0ncyBhcmdzIChzbyBpdCBjYW4gcmV1c2UgdGhlIHRvb2wncyBsYXVuY2ggY29tbWFuZCksXG4gKiBwbHVzIGBlbnZgIChlLmcuIGB7IEtVQkVDT05GSUcgfWApIHdoaWNoIGlzIGJha2VkIGludG8gdGhlIGNvbW1hbmQgYmVjYXVzZSB0aGVcbiAqIGZyZXNobHktb3BlbmVkIHRlcm1pbmFsIGRvZXMgbm90IGluaGVyaXQgdGhlIGxhdW5jaGVyJ3MgZW52aXJvbm1lbnQuIFJldHVybnNcbiAqIGBcIlwiYCB3aGVuIHRoZSB0b29sIGhhcyBubyBjb21tYW5kIHRvIHJ1biAoZS5nLiBhbiBlbXB0eSBDdXN0b20gdGVtcGxhdGUpLlxuICovXG5leHBvcnQgdHlwZSBHZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQgPSAoXG4gIGRpOiBEaUNvbnRhaW5lckZvckluamVjdGlvbixcbiAgYXJnczogeyBwcm9tcHQ/OiBzdHJpbmc7IGRpcjogc3RyaW5nOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG4pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqIEFuIEFJIHRvb2wga2luZCB0b2dldGhlciB3aXRoIGl0cyBkZXRlY3RlZCBpbnN0YWxsYXRpb24gc3RhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbExpc3RFbnRyeSB7XG4gIHJlYWRvbmx5IGtpbmQ6IEFpVG9vbEtpbmQ7XG4gIHJlYWRvbmx5IGlzSW5zdGFsbGVkOiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVhbCBBSSB0b29sIGlzIGNvbmZpZ3VyZWQgXHUyMDE0IGkuZS4gdGhlIGVmZmVjdGl2ZSBBSSB0b29sIGtpbmQgaXMgYSByZWFsXG4gKiB0b29sIChvciBDdXN0b20pLCBub3Qge0BsaW5rIG5vQWlUb29sS2luZH0uIERlcml2ZWQgcHVyZWx5IGZyb20gdGhlIHVzZXInc1xuICogc2VsZWN0aW9uLCBOT1QgZnJvbSBpbnN0YWxsIGRldGVjdGlvbjogb2JzZXJ2aW5nIHRoZSBjb25maWd1cmVkIHN0YXRlIG11c3Qgbm90XG4gKiBkZXBlbmQgb24gdGhlIGFzeW5jIFBBVEggc2NhbiBoYXZpbmcgcnVuIGZpcnN0LlxuICpcbiAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBlcnNpc3RlZCBzZWxlY3Rpb24gaGFzIGxvYWRlZCAodGhlbiBhIHJlYWN0aXZlXG4gKiBib29sZWFuKSwgc28gY29uc3VtZXJzIHJlZmxlY3QgYSBnZW51aW5lICpwZW5kaW5nKiBzdGF0ZSB3aGlsZSBpdCBsb2FkcyBpbnN0ZWFkXG4gKiBvZiBndWVzc2luZyBgZmFsc2VgLiBSZWFjdCBzdXJmYWNlcyByZWFkIGl0IHZpYSBgdXNlSW5qZWN0KC4uLilgIHVuZGVyXG4gKiBgPFN1c3BlbnNlPmAgKG9yIGJyaWRnZSBpdCB3aXRoIGBhc1JlYWN0aXZlYCk7IHRoZSBsYXVuY2ggaGFuZGxlcnMgYGF3YWl0YCBpdC5cbiAqIFRoZSBBc2stQUkgbGF1bmNoIHN1cmZhY2VzIGdhdGUgdGhlaXIgdmlzaWJpbGl0eSBvbiBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbElzQ29uZmlndXJlZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxib29sZWFuPj47XG59Pih7XG4gIGlkOiBcImFpLXRvb2wtaXMtY29uZmlndXJlZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHR5cGUgeyBGYWN0b3J5LCBJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0YWJsZUZvck9wZXJhdGluZ1N5c3RlbXNBbmRTaGVsbHMsXG4gIGdldEluamVjdGFibGVGb3JTaGVsbHMsXG4gIHR5cGUgUGVyU2hlbGxGYW1pbHksXG4gIHR5cGUgU2hlbGxTY29wZWQsXG59IGZyb20gXCJAazhzbGVucy9wbGF0Zm9ybS1zcGVjaWZpYy1pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYyB9IGZyb20gXCIuL29wZXJhdGluZy1zeXN0ZW0tc3BlY2lmaWNcIjtcblxuLyoqXG4gKiBBIHZhbHVlIHByb3ZpZGVkIHNlcGFyYXRlbHkgcGVyIHNoZWxsIGZhbWlseS4gVGhlIHNoZWxsIGFuYWxvZ3VlIG9mXG4gKiB7QGxpbmsgT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWN9LlxuICovXG5leHBvcnQgdHlwZSBTaGVsbFNwZWNpZmljPFQ+ID0gUGVyU2hlbGxGYW1pbHk8VD47XG5cbi8qKlxuICogQSB2YWx1ZSB0aGF0IGlzIGVpdGhlciBzaGVsbC1hZ25vc3RpYyAodGhlIHZhbHVlIGl0c2VsZikgb3Igc2hlbGwgc3BlY2lmaWMgKGFcbiAqIHtAbGluayBTaGVsbFNwZWNpZmljfSBvYmplY3QpLiBUaGUgc2hlbGwgYW5hbG9ndWUgb2YgYE1heWJlT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWNgLlxuICovXG5leHBvcnQgdHlwZSBNYXliZVNoZWxsU3BlY2lmaWM8VD4gPSBUIHwgU2hlbGxTcGVjaWZpYzxUPjtcblxuLyoqIEEgdmFsdWUgcHJvdmlkZWQgcGVyIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCB3aXRoaW4gZWFjaCwgcGVyIHNoZWxsIGZhbWlseS4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8VD4gPSBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYzxTaGVsbFNwZWNpZmljPFQ+PjtcblxuLyoqXG4gKiBBIHZhbHVlIHRoYXQgbWF5IHZhcnkgYWxvbmcgZWl0aGVyIGF4aXM6IGFnbm9zdGljLCBvcGVyYXRpbmctc3lzdGVtIHNwZWNpZmljLFxuICogc2hlbGwgc3BlY2lmaWMsIG9yIGJvdGguIFVzZWQgZm9yIHRoZSBBSS10b29sIENMSSBjb21tYW5kcyBzbyBhIHRvb2wgbWF5IGRpZmZlclxuICogaXRzIGNvbW1hbmQgKmNvbnRlbnQqIHBlciBPUyBhbmQvb3Igc2hlbGwgKGUuZy4gbGF1bmNoLWJ5LW5hbWUgdnMgcGF0aCwgb3JcbiAqIHBlci1PUyBkaXNjb3ZlcnkgbG9naWMpLlxuICovXG5leHBvcnQgdHlwZSBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8VD4gPVxuICB8IFRcbiAgfCBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYzxUPlxuICB8IFNoZWxsU3BlY2lmaWM8VD5cbiAgfCBPcGVyYXRpbmdTeXN0ZW1BbmRTaGVsbFNwZWNpZmljPFQ+O1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRmFjdG9yeSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcblxuY29uc3QgaXNTaGVsbFNwZWNpZmljID0gPEY+KFxuICB2YWx1ZTogT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWM8RiB8IFNoZWxsU3BlY2lmaWM8Rj4+IHwgU2hlbGxTcGVjaWZpYzxGPixcbik6IHZhbHVlIGlzIFNoZWxsU3BlY2lmaWM8Rj4gPT4gXCJwb3NpeFwiIGluIHZhbHVlO1xuXG5jb25zdCBzYW1lRm9yRXZlcnlTaGVsbCA9IDxGPih2YWx1ZTogRik6IFBlclNoZWxsRmFtaWx5PCgpID0+IEY+ID0+ICh7XG4gIHBvc2l4OiAoKSA9PiB2YWx1ZSxcbiAgZmlzaDogKCkgPT4gdmFsdWUsXG4gIGNtZDogKCkgPT4gdmFsdWUsXG4gIHBvd2Vyc2hlbGw6ICgpID0+IHZhbHVlLFxufSk7XG5cbmNvbnN0IHBlclNoZWxsUHJvZHVjZXJzID0gPEY+KHZhbHVlOiBTaGVsbFNwZWNpZmljPEY+KTogUGVyU2hlbGxGYW1pbHk8KCkgPT4gRj4gPT4gKHtcbiAgcG9zaXg6ICgpID0+IHZhbHVlLnBvc2l4LFxuICBmaXNoOiAoKSA9PiB2YWx1ZS5maXNoLFxuICBjbWQ6ICgpID0+IHZhbHVlLmNtZCxcbiAgcG93ZXJzaGVsbDogKCkgPT4gdmFsdWUucG93ZXJzaGVsbCxcbn0pO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHtAbGluayBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWN9IHZhbHVlIHVuZGVyIGEgc2luZ2xlXG4gKiB0b2tlbiBzbyBjb25zdW1lcnMgcmVzb2x2ZSBpdCBhdCBydW50aW1lIHdpdGhcbiAqIGByZXNvbHZlRm9yU2hlbGwoaW5qZWN0TWFueSh0b2tlbikoKSwgc2hlbGxGYW1pbHkpYC4gVGhlICoqT1MqKiBheGlzIGlzIGZpbHRlcmVkXG4gKiBzeW5jaHJvbm91c2x5IGF0IHJlZ2lzdHJhdGlvbiAoaG9zdC1vbmx5IGAqLW9ubHlgIHRhZ3MsIHZpYVxuICogYGdldEluamVjdGFibGVGb3JPcGVyYXRpbmdTeXN0ZW1zQW5kU2hlbGxzYCk7IHRoZSAqKnNoZWxsKiogYXhpcyBpcyBzZWxlY3RlZCBhdFxuICogcnVudGltZSwgc2luY2UgdGhlIGNvbmZpZ3VyZWQgc2hlbGwgaXMgYXN5bmMuIEFnbm9zdGljIGFuZCBPUy1vbmx5IHZhbHVlcyBhcmVcbiAqIHJlcGVhdGVkIGFjcm9zcyB0aGUgc2hlbGwgZmFtaWxpZXMgc28gZXZlcnkgdG9rZW4gdW5pZm9ybWx5IHlpZWxkc1xuICogYFNoZWxsU2NvcGVkPEY+YC4gVGhlIHNoZWxsIGFuYWxvZ3VlL3N1cGVyc2V0IG9mIGBnZXRJbmplY3RhYmxlRm9yT3BlcmF0aW5nU3lzdGVtc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlID0gPEYgZXh0ZW5kcyBGYWN0b3J5PihhcmdzOiB7XG4gIGlkOiBzdHJpbmc7XG4gIGluamVjdGlvblRva2VuOiBJbmplY3Rpb25Ub2tlbjI8e1xuICAgIHNpbmdsZUZhY3Rvcnk6ICgpID0+IFNoZWxsU2NvcGVkPEY+O1xuICAgIG1hbnlGYWN0b3J5OiBhbnk7XG4gICAgc3BlY2lmaWNUb2tlbkZhY3Rvcnk6IHVuZGVmaW5lZDtcbiAgICBjYXJkaW5hbGl0eTogYW55O1xuICB9PjtcbiAgdmFsdWU6IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxGPjtcbn0pID0+IHtcbiAgY29uc3QgeyBpZCwgaW5qZWN0aW9uVG9rZW4sIHZhbHVlIH0gPSBhcmdzO1xuXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBnZXRJbmplY3RhYmxlRm9yU2hlbGxzKHsgaWQsIGluamVjdGlvblRva2VuLCBpbnN0YW50aWF0ZTogc2FtZUZvckV2ZXJ5U2hlbGwodmFsdWUpIH0pO1xuICB9XG5cbiAgaWYgKGlzU2hlbGxTcGVjaWZpYyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZ2V0SW5qZWN0YWJsZUZvclNoZWxscyh7IGlkLCBpbmplY3Rpb25Ub2tlbiwgaW5zdGFudGlhdGU6IHBlclNoZWxsUHJvZHVjZXJzKHZhbHVlKSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBlck9wZXJhdGluZ1N5c3RlbSA9IChvc1ZhbHVlOiBGIHwgU2hlbGxTcGVjaWZpYzxGPik6IFBlclNoZWxsRmFtaWx5PCgpID0+IEY+ID0+XG4gICAgaXNGdW5jdGlvbihvc1ZhbHVlKSA/IHNhbWVGb3JFdmVyeVNoZWxsKG9zVmFsdWUpIDogcGVyU2hlbGxQcm9kdWNlcnMob3NWYWx1ZSk7XG5cbiAgcmV0dXJuIGdldEluamVjdGFibGVGb3JPcGVyYXRpbmdTeXN0ZW1zQW5kU2hlbGxzKHtcbiAgICBpZCxcbiAgICBpbmplY3Rpb25Ub2tlbixcbiAgICBpbnN0YW50aWF0ZToge1xuICAgICAgbWFjb3M6IHBlck9wZXJhdGluZ1N5c3RlbSh2YWx1ZS5tYWNvcyksXG4gICAgICB3aW5kb3dzOiBwZXJPcGVyYXRpbmdTeXN0ZW0odmFsdWUud2luZG93cyksXG4gICAgICBsaW51eDogcGVyT3BlcmF0aW5nU3lzdGVtKHZhbHVlLmxpbnV4KSxcbiAgICB9LFxuICB9KTtcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBTaGVsbEZhbWlseSB9IGZyb20gXCJAazhzbGVucy9wdWJsaWMtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogUmVhY3RpdmUgbG9va3VwIG9mIHRoZSBhY3RpdmUgc2hlbGwgKmZhbWlseSogKGBwb3NpeGAvYGZpc2hgL2BjbWRgL2Bwb3dlcnNoZWxsYCksXG4gKiBkZXJpdmVkIGZyb20gdGhlIHVzZXItY29uZmlndXJlZCBzaGVsbC4gQ29uc3VtZXJzIG9mIHRoZSBwZXIta2luZCBBSSBjb21tYW5kXG4gKiB0b2tlbnMgKHdoaWNoIHJlZ2lzdGVyIG9uZSB7QGxpbmsgaW1wb3J0KFwiQGs4c2xlbnMvcHVibGljLXV0aWxpdGllc1wiKS5TaGVsbFNjb3BlZH0gY2VsbFxuICogcGVyIGZhbWlseSkgdXNlIHRoaXMgdG8gcGljayB0aGUgYWN0aXZlIHNoZWxsJ3MgY29tbWFuZCBhdCBydW50aW1lIHZpYVxuICogYHJlc29sdmVGb3JTaGVsbChpbmplY3RNYW55KHRva2VuLmZvcihraW5kKSkoKSwgY3VycmVudFNoZWxsRmFtaWx5LmdldCgpKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXJyZW50U2hlbGxGYW1pbHlJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6ICgpID0+IElDb21wdXRlZFZhbHVlPFNoZWxsRmFtaWx5Pjtcbn0+KHtcbiAgaWQ6IFwiY3VycmVudC1zaGVsbC1mYW1pbHlcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIGF2YWlsYWJsZSBBSSB0b29sIGtpbmRzLiBFYWNoIGNvbnRyaWJ1dGlvbiBpcyBKVVNUIGEga2luZDtcbiAqIGV2ZXJ5IG90aGVyIGFzcGVjdCAoY29tbWFuZCwgaW5zdGFsbC1zdGF0ZSwgbmFtZSwgb3JkZXIsIFx1MjAyNikgaXMgY29udHJpYnV0ZWRcbiAqIHZpYSBpdHMgb3duIGAuZm9yKGtpbmQpYCB0b2tlbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogKCkgPT4gQWlUb29sS2luZCB9Pih7XG4gIGlkOiBcImFpLXRvb2xcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYW55RmFjdG9yeSB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFNoZWxsU2NvcGVkIH0gZnJvbSBcIkBrOHNsZW5zL3BsYXRmb3JtLXNwZWNpZmljLWluamVjdGFibGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQsIEdldENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCBsYXVuY2hlcyBhbiBBSSB0b29sIGluIGEgdGVybWluYWwuXG4gKiBDb250cmlidXRlIG9uZSBwZXIgdG9vbCBraW5kIHZpYSBgLmZvcihraW5kKWAuIFJlZ2lzdGVyZWQgKGJ5IHRoZSBidW5jaCBmYWN0b3J5KVxuICogYXMgb25lIHtAbGluayBTaGVsbFNjb3BlZH0gY2VsbCBwZXIgc2hlbGwgZmFtaWx5OyBjb25zdW1lcnMgcGljayB0aGUgYWN0aXZlXG4gKiBzaGVsbCdzIGF0IHJ1bnRpbWUgd2l0aCBgcmVzb2x2ZUZvclNoZWxsKGluamVjdE1hbnkodG9rZW4uZm9yKGtpbmQpKSgpLCBmYW1pbHkpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7XG4gICAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0Q2xpQ29tbWFuZD47XG4gICAgbWFueUZhY3Rvcnk6IE1hbnlGYWN0b3J5PCgpID0+IFNoZWxsU2NvcGVkPEdldENsaUNvbW1hbmQ+PjtcbiAgfT4oe1xuICAgIGlkOiBgZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYW55RmFjdG9yeSB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFNoZWxsU2NvcGVkIH0gZnJvbSBcIkBrOHNsZW5zL3BsYXRmb3JtLXNwZWNpZmljLWluamVjdGFibGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQsIEdldENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCAqcmVzdW1lcyogYW4gQUkgdG9vbCBpbiBhIHRlcm1pbmFsIFx1MjAxNFxuICogcnVuIGluc3RlYWQgb2Yge0BsaW5rIGdldEFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW59IHdoZW4gdGhlIHRhYidzXG4gKiBzZXNzaW9uIGlzIHJlLWVzdGFibGlzaGVkIChlLmcuIGFmdGVyIGFuIGFwcCByZXN0YXJ0KSByYXRoZXIgdGhhbiBmaXJzdFxuICogb3BlbmVkLCBzbyB0aGUgdG9vbCBjb250aW51ZXMgaXRzIHByZXZpb3VzIHNlc3Npb24gKGUuZy4gYGNsYXVkZSAtLWNvbnRpbnVlXG4gKiB8fCBjbGF1ZGVgLCB3aGljaCBmYWxscyBiYWNrIHRvIGEgZnJlc2ggbGF1bmNoIHdoZW4gdGhlcmUgaXMgbm8gc2Vzc2lvbikuXG4gKlxuICogUmVzb2x2ZXMgdG8gYSB7QGxpbmsgR2V0Q2xpQ29tbWFuZH0gKHRoZSBsYXVuY2gtY29tbWFuZCBzaWduYXR1cmUpOyByZXN1bWVcbiAqIGJ1aWxkZXJzIHR5cGljYWxseSBpZ25vcmUgYHByb21wdGAgKHRoZXkgY29udGludWUgdGhlIHByaW9yIHNlc3Npb24gcmF0aGVyXG4gKiB0aGFuIHN0YXJ0aW5nIGEgbmV3IG9uZSkuIEV2ZXJ5IHRvb2wgY29udHJpYnV0ZXMgb25lIHZpYSBgLmZvcihraW5kKWAgXHUyMDE0IGEgdG9vbFxuICogd2l0aCBubyBkZWRpY2F0ZWQgcmVzdW1lIGludm9jYXRpb24gcGFzc2VzIGl0cyBsYXVuY2ggY29tbWFuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc3VtZUFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICAgIHNpbmdsZUZhY3Rvcnk6ICgpID0+IFNoZWxsU2NvcGVkPEdldENsaUNvbW1hbmQ+O1xuICAgIG1hbnlGYWN0b3J5OiBNYW55RmFjdG9yeTwoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPj47XG4gIH0+KHtcbiAgICBpZDogYGdldC1yZXN1bWUtYWktY29tbWFuZC1mb3ItdGVybWluYWwtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqIFJ1bnMgYW4gaW5zdGFsbGF0aW9uLWRldGVjdGlvbiBjb21tYW5kIG9uIHRoZSBob3N0OyByZXNvbHZlcyBgdHJ1ZWAgaWZmIGl0IGV4aXRzIDAuICovXG5leHBvcnQgdHlwZSBBaVRvb2xJbnN0YWxsZWRWaWFDbGlDb21tYW5kID0gKGNvbW1hbmQ6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSdW5zIGEgdG9vbCdzIGBnZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmRgIG91dHB1dCBvbiB0aGUgaG9zdCBhbmQgcmVwb3J0c1xuICogd2hldGhlciBpdCBzdWNjZWVkZWQgKGV4aXQgY29kZSAwKS4gSW1wbGVtZW50ZWQgaW4gdGhlIGBAbGVuc2FwcC9haS10b29sc2BcbiAqIGZlYXR1cmUgdmlhIGBjbGlFeGVjdXRlYCBhZ2FpbnN0IHRoZSBzaGVsbC1zeW5jZWQgZW52aXJvbm1lbnQsIHNvIGRldGVjdGlvblxuICogcmVzb2x2ZXMgdGhlIHNhbWUgUEFUSCB0aGUgbGF1bmNoZWQgdG9vbHMgc2VlLiBUaGUgZGV0ZWN0ZWQtdG9vbHMgbGlzdFxuICogKGByZWZyZXNoQWlUb29sc2ApIHJ1bnMgdGhlIHBlci1raW5kIGNvbW1hbmQgdGhyb3VnaCBpdC5cbiAqXG4gKiBUaGUgaW5zdGFuY2UgaXMgdGhlIGNoZWNrIGZ1bmN0aW9uIGl0c2VsZiAoYGRpLmluamVjdCh0b2tlbikoKWAgeWllbGRzIGl0KSBcdTIwMTRcbiAqIGEgdjIgaW5qZWN0YWJsZSBtZW1vaXNlcyBpdHMgaW5zdGFuY2UgYnkgY2FsbCBhcmdzLCBzbyByZXR1cm5pbmcgYSBmdW5jdGlvblxuICogKHJhdGhlciB0aGFuIGEgYFByb21pc2U8Ym9vbGVhbj5gKSBrZWVwcyBldmVyeSBjaGVjayBsaXZlIGFjcm9zcyByZS1zY2Fucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmRJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6ICgpID0+IEFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmQ7XG59Pih7XG4gIGlkOiBcImFpLXRvb2wtaW5zdGFsbGVkLXZpYS1jbGktY29tbWFuZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqXG4gKiBSZS1zY2FucyBBSSB0b29sIGluc3RhbGxhdGlvbiBzdGF0ZSBhbmQgdXBkYXRlcyB7QGxpbmsgYWlUb29sc0luamVjdGlvblRva2VufS5cbiAqIEF3YWl0YWJsZSwgc28gY2FsbGVycyBjYW4gYWN0IG9uY2UgZGV0ZWN0aW9uIHNldHRsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZnJlc2hBaVRvb2xEZXRlY3Rpb24gPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBleHBsaWNpdCBcInJlLXNjYW4gaW5zdGFsbGVkIEFJIHRvb2xzXCIgYWN0aW9uLiBEZXRlY3Rpb24gaXMgbmV2ZXJcbiAqIGEgc2lkZSBlZmZlY3Qgb2YgaW5qZWN0aW9uOiB0aGUgcHJlZmVyZW5jZXMgVUkgY2FsbHMgdGhpcyBvbiBtb3VudCBhbmQgZnJvbSBhXG4gKiBcIlJlZnJlc2hcIiBjb250cm9sLCBhbmQgdGhlIGxhdW5jaCBwYXRoIGF3YWl0cyBpdCBiZWZvcmUgcmVzb2x2aW5nIHRoZVxuICogZWZmZWN0aXZlIHRvb2wgXHUyMDE0IHNvIHRvb2xzIGluc3RhbGxlZC9yZW1vdmVkIHdoaWxlIExlbnMgaXMgcnVubmluZyBhcmUgcGlja2VkXG4gKiB1cCB3aXRob3V0IGEgcmVzdGFydC5cbiAqXG4gKiBTaGFwZWQgYXMgYSBmYWN0b3J5IHJldHVybmluZyB0aGUgYWN0aW9uIChsaWtlIGBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW5gKSBzb1xuICogaXQgaXMgY29uc3VtYWJsZSB2aWEgYHVzZUluamVjdGAgLyBgZGkuaW5qZWN0YCBcdTIwMTQgd2hpY2ggcmV0dXJuIHRoZSBhY3Rpb24gXHUyMDE0IGFuZFxuICogbmV2ZXIgbmVlZHMgYGluamVjdDJgIChhYnNlbnQgZnJvbSB0aGUgUmVhY3QtY29udGV4dCBESSBjb250YWluZXIpLlxuICovXG5leHBvcnQgY29uc3QgcmVmcmVzaEFpVG9vbERldGVjdGlvbkluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogKCkgPT4gUmVmcmVzaEFpVG9vbERldGVjdGlvbiB9PihcbiAge1xuICAgIGlkOiBcInJlZnJlc2gtYWktdG9vbC1kZXRlY3Rpb25cIixcbiAgICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbiAgfSxcbikoKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgZGlzcGxheS1uYW1lIGNvbXBvbmVudCBmb3IgYSBnaXZlbiBBSSB0b29sIGtpbmQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xOYW1lID0gKCkgPT4gUmVhY3QuQ29tcG9uZW50VHlwZTtcblxuLyoqXG4gKiBQZXIta2luZCBkaXNwbGF5IG5hbWUgZm9yIGFuIEFJIHRvb2wgXHUyMDE0IGEgUmVhY3QgY29tcG9uZW50IChub3QgYSBzdHJpbmcpLCBzb1xuICogYSB0b29sIGNhbiByZW5kZXIgYnJhbmRpbmcvbWFya3VwLiBDb250cmlidXRlIG9uZSBwZXIgdG9vbCBraW5kLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sTmFtZUluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sTmFtZSB9Pih7XG4gIGlkOiBcImFpLXRvb2wtbmFtZVwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xOYW1lIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtbmFtZS0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHBsYWluLXRleHQgZGlzcGxheSBuYW1lIGZvciBhIGdpdmVuIEFJIHRvb2wga2luZC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbERpc3BsYXlOYW1lID0gKCkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFBlci1raW5kIHBsYWluLXRleHQgZGlzcGxheSBuYW1lIChlLmcuIFwiQ2xhdWRlIENvZGVcIikuIFVzZWQgYnkgc3RyaW5nLW9ubHlcbiAqIHNsb3RzIHRoYXQgY2Fubm90IHJlbmRlciB0aGUgUmVhY3QgYGFpVG9vbE5hbWVJbmplY3Rpb25Ub2tlbmAgY29tcG9uZW50IFx1MjAxNCBmb3JcbiAqIGV4YW1wbGUgdGhlIGNvbW1hbmQtcGFsZXR0ZSBlbnRyeSB0aXRsZS4gVGhlIFJlYWN0IG5hbWUgY29tcG9uZW50IGRlcml2ZXNcbiAqIGZyb20gdGhpcyBzYW1lIHZhbHVlLCBzbyB0aGUgdHdvIHN0YXkgaW4gc3luYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xEaXNwbGF5TmFtZSB9Pih7XG4gIGlkOiBcImFpLXRvb2wtZGlzcGxheS1uYW1lXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbERpc3BsYXlOYW1lIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtZGlzcGxheS1uYW1lLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCB9IGZyb20gXCIuL2FpLXRvb2xcIjtcblxuLyoqIFByb3BzIGEgdG9vbCdzIGRlc2NyaXB0aW9uIGNvbXBvbmVudCByZWNlaXZlcywgc28gaXQgY2FuIGFkYXB0IHRvIGRldGVjdGlvbiBzdGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWlUb29sRGVzY3JpcHRpb25Qcm9wcyB7XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIHdhcyBkZXRlY3RlZCBhcyBpbnN0YWxsZWQ7IGxldHMgYSBkZXNjcmlwdGlvbiBzd2FwIGluIGEgXCJOb3QgZm91bmQgaW4gUEFUSFwiIG1lc3NhZ2UuICovXG4gIHJlYWRvbmx5IGlzSW5zdGFsbGVkOiBib29sZWFuO1xufVxuXG4vKiogUmVzb2x2ZXMgYSBraW5kJ3MgZGVzY3JpcHRpb24gY29tcG9uZW50LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sRGVzY3JpcHRpb24gPSAoKSA9PiBSZWFjdC5Db21wb25lbnRUeXBlPEFpVG9vbERlc2NyaXB0aW9uUHJvcHM+O1xuXG4vKipcbiAqIFBlci1raW5kIGRlc2NyaXB0aW9uIGZvciBhbiBBSSB0b29sIFx1MjAxNCBhIHNob3J0IGJsdXJiIGludHJvZHVjaW5nIHRoZSB0b29sIChlLmcuXG4gKiBcIlRoZSBjb2RpbmcgYXNzaXN0YW50IGJ5IEFudGhyb3BpY1wiKSwgc2hvd24gYXMgdGhlIHNlbGVjdG9yJ3Mgc2Vjb25kYXJ5IGxpbmUuXG4gKiBBIFJlYWN0IGNvbXBvbmVudCAobm90IGEgc3RyaW5nKSByZWNlaXZpbmcgdGhlIHRvb2wncyBkZXRlY3Rpb24gc3RhdGUsIHNvIGl0XG4gKiBtYXkgaW5jbHVkZSBtYXJrdXAvbGlua3MgYW5kIG9wdCB0byBzaG93IGEgXCJOb3QgZm91bmQgaW4gUEFUSFwiIG1lc3NhZ2UgKG9yIGFueVxuICogb3RoZXIgZ3VpZGFuY2UpIHdoZW4gdGhlIHRvb2wgaXMgbm90IGluc3RhbGxlZC4gQ29udHJpYnV0ZSBvbmUgcGVyIHRvb2wga2luZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbERlc2NyaXB0aW9uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xEZXNjcmlwdGlvbiB9Pih7XG4gIGlkOiBcImFpLXRvb2wtZGVzY3JpcHRpb25cIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sRGVzY3JpcHRpb24gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1kZXNjcmlwdGlvbi0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgU3ZnUHJvcHMgfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgaWNvbiBjb21wb25lbnQgZm9yIGEgZ2l2ZW4gQUkgdG9vbCBraW5kLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sSWNvbiA9ICgpID0+IFJlYWN0LkNvbXBvbmVudFR5cGU8U3ZnUHJvcHM+O1xuXG4vKipcbiAqIFBlci1raW5kIGljb24gZm9yIGFuIEFJIHRvb2wgXHUyMDE0IGEgUmVhY3QgY29tcG9uZW50IChub3QgYW4gaWNvbiBuYW1lKS4gSXRcbiAqIGFjY2VwdHMgYFN2Z1Byb3BzYCBzbyBjYWxsIHNpdGVzIGNhbiBzaXplIGl0IChgJHNpemVgKSwgYnV0IGV2ZXJ5IGZpZWxkIGlzXG4gKiBvcHRpb25hbCwgc28gYSBwcm9wLWxlc3MgY29tcG9uZW50IGlzIGFzc2lnbmFibGUgdG9vLiBTaG93biBiZXNpZGUgdGhlIHRvb2wnc1xuICogbmFtZSBpbiB0aGUgc2VsZWN0b3IgYW5kIHdoZXJldmVyIHRoZSB0b29sIGlzIG9mZmVyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJY29uIH0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pY29uXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbEljb24gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pY29uLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBpY29uIGNvbXBvbmVudCBmb3IgYW4gYXJiaXRyYXJ5IEFJIHRvb2wga2luZCwgZmFsbGluZyBiYWNrIHRvIHRoZSBnZW5lcmljIGljb24gZm9yIGtpbmRzXG4gKiB3aXRob3V0IGEgcmVnaXN0ZXJlZCBvbmUgKGUuZy4gdGhlIGN1c3RvbSBraW5kKS4gVXNlIHRoaXMgdG8gcmVuZGVyIGEgKnNwZWNpZmljKiB0b29sJ3MgaWNvbiBcdTIwMTQgZS5nLiBhblxuICogZW50cnkgcG9pbnQgdGhhdCBtdXN0IHN0YXkgb24gdGhlIHRvb2wgaXQgd2FzIGNyZWF0ZWQgZm9yIHJhdGhlciB0aGFuIGZvbGxvd2luZyB0aGUgbGl2ZSBzZWxlY3Rpb24uXG4gKiBGb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCB0b29sLCBwcmVmZXIge0BsaW5rIGVmZmVjdGl2ZUFpVG9vbEljb25JbmplY3Rpb25Ub2tlbn0uXG4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEljb25Gb3JLaW5kID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTwoa2luZDogQWlUb29sS2luZCkgPT4gUmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz4+PjtcblxuZXhwb3J0IGNvbnN0IGFpVG9vbEljb25Gb3JLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJY29uRm9yS2luZCB9Pih7XG4gIGlkOiBcImFpLXRvb2wtaWNvbi1mb3Ita2luZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgdHlwZSBTdmdQcm9wcywgU3ZnIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuXG4vKipcbiAqIEdlbmVyaWMgZmFsbGJhY2sgaWNvbiBmb3IgYW4gQUkgdG9vbCB0aGF0IGNvbnRyaWJ1dGVzIG5vIGBJY29uYCBvZiBpdHMgb3duIChhXG4gKiB0ZXJtaW5hbCBnbHlwaCkuIFRoZSBidW5jaCBmYWN0b3J5IGZhbGxzIGJhY2sgdG8gdGhpcyBzbyB0aGUgZWZmZWN0aXZlLWljb25cbiAqIHRva2VuIG5ldmVyIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEFpVG9vbEljb24gPSAocHJvcHM6IFN2Z1Byb3BzKSA9PiAoXG4gIDxTdmcgey4uLnByb3BzfSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgIDxwYXRoIGQ9XCJNMyAzYTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxOGEyIDIgMCAwIDAgMi0yVjVhMiAyIDAgMCAwLTItMkgzem0wIDJoMTh2MTRIM1Y1em0zLjUgMi41TDUgOWwyIDItMiAyIDEuNSAxLjVMMTEgMTEgNi41IDcuNXpNMTIgMTRoNXYyaC01di0yelwiIC8+XG4gIDwvU3ZnPlxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIG9yZGVyL3ByaW9yaXR5IG51bWJlciBmb3IgYSBnaXZlbiBBSSB0b29sIGtpbmQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xPcmRlck51bWJlciA9ICgpID0+IG51bWJlcjtcblxuLyoqXG4gKiBQZXIta2luZCBvcmRlcmluZy9wcmlvcml0eSBmb3IgYW4gQUkgdG9vbC4gTG93ZXIgY29tZXMgZmlyc3QgaW4gdGhlIHNlbGVjdG9yO1xuICogdGhlIGxvd2VzdC1udW1iZXJlZCAqaW5zdGFsbGVkKiB0b29sIGlzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbE9yZGVyTnVtYmVySW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xPcmRlck51bWJlciB9Pih7XG4gIGlkOiBcImFpLXRvb2wtb3JkZXItbnVtYmVyXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbE9yZGVyTnVtYmVyIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtb3JkZXItbnVtYmVyLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCB9IGZyb20gXCIuL2FpLXRvb2xcIjtcblxuLyoqIFJlc29sdmVzIGEga2luZCdzIHNldHRpbmdzIGNvbXBvbmVudCwgc2hvd24gYmVsb3cgdGhlIHNlbGVjdG9yIHdoZW4gdGhhdCBraW5kIGlzIHNlbGVjdGVkLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sU2V0dGluZ3MgPSAoKSA9PiBSZWFjdC5Db21wb25lbnRUeXBlO1xuXG4vKipcbiAqIFBlci1raW5kIHNldHRpbmdzIFVJLCByZW5kZXJlZCBiZW5lYXRoIHRoZSBBSS10b29sIHNlbGVjdG9yIHdoZW4gdGhhdCBraW5kIGlzXG4gKiB0aGUgYWN0aXZlIHNlbGVjdGlvbi4gT3B0aW9uYWwgXHUyMDE0IG1vc3QgdG9vbHMgbmVlZCBub25lOyBlLmcuIHRoZSBcImN1c3RvbVwiIGtpbmRcbiAqIGNvbnRyaWJ1dGVzIGEgY29tbWFuZCBpbnB1dCArIGEgcnVuLWV4dGVybmFsbHkgdG9nZ2xlLiBBIFJlYWN0IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbFNldHRpbmdzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xTZXR0aW5ncyB9Pih7XG4gIGlkOiBcImFpLXRvb2wtc2V0dGluZ3NcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sU2V0dGluZ3MgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1zZXR0aW5ncy0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyBhIGtpbmQncyBpbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zIGNvbXBvbmVudC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9ucyA9ICgpID0+IFJlYWN0LkNvbXBvbmVudFR5cGU7XG5cbi8qKlxuICogUGVyLWtpbmQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBVSSwgcmVuZGVyZWQgYmVuZWF0aCB0aGUgQUktdG9vbCBzZWxlY3RvclxuICogd2hlbiB0aGF0IGtpbmQgaXMgZGV0ZWN0ZWQgYXMgbm90IGluc3RhbGxlZCBcdTIwMTQgc28gdGhlIHRvb2wgaXMgc2hvd24gZGlzYWJsZWRcbiAqIGluc3RlYWQgb2YgaGlkZGVuLCB3aXRoIGd1aWRhbmNlIG9uIGhvdyB0byBpbnN0YWxsIGl0LiBPcHRpb25hbDsgYSBSZWFjdFxuICogY29tcG9uZW50LCBzbyBpbnN0cnVjdGlvbnMgbWF5IGluY2x1ZGUgbGlua3MgKGUuZy4gYDxCcm93c2VyTGluaz5gKSBvciBhbnlcbiAqIG90aGVyIG1hcmt1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0luamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zO1xufT4oe1xuICBpZDogXCJhaS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnNcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtaW5zdGFsbGF0aW9uLWluc3RydWN0aW9ucy0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGluc3RydWN0aW9ucyBmaWxlbmFtZSBhIGdpdmVuIEFJIHRvb2wga2luZCByZWFkcyBmcm9tIGl0cyB3b3JraW5nIGRpcmVjdG9yeS4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lID0gKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBlci1raW5kIGluc3RydWN0aW9ucyBmaWxlbmFtZSBcdTIwMTQgdGhlIGZpbGUgdGhlIHRvb2wgYXV0by1kaXNjb3ZlcnMgaW4gaXRzXG4gKiB3b3JraW5nIGRpcmVjdG9yeSAoZS5nLiBgXCJDTEFVREUubWRcImAgZm9yIENsYXVkZSBDb2RlLCBgXCJHRU1JTkkubWRcImAgZm9yXG4gKiBHZW1pbmkgQ0xJKS4gVGhlIGxhdW5jaGVyIGFsd2F5cyB3cml0ZXMgdGhlIGNhbm9uaWNhbFxuICoge0BsaW5rIGFnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lfTsgd2hlbiBhIGtpbmQgZGVjbGFyZXMgYSBkaWZmZXJlbnQgZmlsZW5hbWVcbiAqIHRoZSBsYXVuY2hlciBhZGRpdGlvbmFsbHkgd3JpdGVzIHRoYXQgZmlsZSBhcyBhbiBpbmRpcmVjdGlvbiBpbXBvcnRpbmcgdGhlXG4gKiBjYW5vbmljYWwgb25lLiBgdW5kZWZpbmVkYCBmb3Iga2luZHMgdGhhdCByZWFkIG5vIHN1Y2ggZmlsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZTtcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWVcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdHJ1Y3Rpb25zRmlsZW5hbWUgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWUtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqIFJlc29sdmVzIHRoZSBpbmRpcmVjdGlvbiBpbnN0cnVjdGlvbnMgZmlsZW5hbWVzIHRvIHdyaXRlIGFjcm9zcyBhbGwgcmVnaXN0ZXJlZCBBSSB0b29scy4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RydWN0aW9uc0luZGlyZWN0aW9uRmlsZW5hbWVzID0gKCkgPT4gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKlxuICogVGhlIGRpc3RpbmN0IHRvb2wtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGZpbGVuYW1lcyBhY3Jvc3MgKiphbGwqKiByZWdpc3RlcmVkIEFJXG4gKiB0b29sIGtpbmRzIFx1MjAxNCByZWdhcmRsZXNzIG9mIGluc3RhbGxhdGlvbiBzdGF0ZSBcdTIwMTQgZXhjbHVkaW5nIHRoZSBjYW5vbmljYWxcbiAqIHtAbGluayBhZ2VudHNJbnN0cnVjdGlvbnNGaWxlbmFtZX0uIEEgbGF1bmNoZXIgd3JpdGVzIHRoZSBjYW5vbmljYWxcbiAqIGBBR0VOVFMubWRgIHBsdXMgZWFjaCBvZiB0aGVzZSBhcyBhbiBpbmRpcmVjdGlvbiBpbXBvcnRpbmcgaXQsIHNvIHdoaWNoZXZlclxuICogdG9vbCB0aGUgdXNlciBsYXRlciBwaWNrcyBmaW5kcyBpdHMgaW5zdHJ1Y3Rpb25zIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RydWN0aW9uc0luZGlyZWN0aW9uRmlsZW5hbWVzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkZpbGVuYW1lcztcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pbnN0cnVjdGlvbnMtaW5kaXJlY3Rpb24tZmlsZW5hbWVzXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBzaGVsbFF1b3RlIH0gZnJvbSBcIkBrOHNsZW5zL3B1YmxpYy11dGlsaXRpZXNcIjtcblxuY29uc3QgcHJvbXB0UGxhY2Vob2xkZXIgPSBcIntwcm9tcHR9XCI7XG5jb25zdCBkaXJQbGFjZWhvbGRlciA9IFwie2Rpcn1cIjtcblxuY29uc3QgZXNjYXBlRm9yUmVnZXggPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5jb25zdCBzdWJzdGl0dXRlID0gKHRlbXBsYXRlOiBzdHJpbmcsIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIikge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5zcGxpdChwbGFjZWhvbGRlcikuam9pbihzaGVsbFF1b3RlKHZhbHVlKSk7XG4gIH1cblxuICAvLyBTdHJpcCB0aGUgcGxhY2Vob2xkZXIgYW5kIG9uZSBsZWFkaW5nIHdoaXRlc3BhY2UgcnVuLCBzbyBgY2xhdWRlIHtwcm9tcHR9YFxuICAvLyBiZWNvbWVzIGBjbGF1ZGVgLCBub3QgYGNsYXVkZSBgLlxuICBjb25zdCBzdHJpcFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxccyoke2VzY2FwZUZvclJlZ2V4KHBsYWNlaG9sZGVyKX1gLCBcImdcIik7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHN0cmlwUGF0dGVybiwgXCJcIik7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVMbG1Db21tYW5kT3B0aW9ucyB7XG4gIC8qKiBTZWVkZWQgaW5pdGlhbCB1c2VyIG1lc3NhZ2UsIHN1YnN0aXR1dGVkIGludG8gYHtwcm9tcHR9YC4gKi9cbiAgcHJvbXB0Pzogc3RyaW5nO1xuICAvKiogV29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbW1hbmQgcnVucyBpbiwgc3Vic3RpdHV0ZWQgKHNoZWxsLWVzY2FwZWQpIGludG8gYHtkaXJ9YC4gKi9cbiAgZGlyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBmcmVlLXRleHQgTExNIGNvbW1hbmQgdGVtcGxhdGUgYnkgc3Vic3RpdHV0aW5nIHRoZSBge3Byb21wdH1gIGFuZFxuICogYHtkaXJ9YCBwbGFjZWhvbGRlcnMgd2l0aCBzaGVsbC1lc2NhcGVkIHZhbHVlcy4gVW5maWxsZWQgcGxhY2Vob2xkZXJzIChhbmQgb25lXG4gKiBsZWFkaW5nIHdoaXRlc3BhY2UgcnVuKSBhcmUgc3RyaXBwZWQuIEEgdmFsdWUgd2l0aCBubyBtYXRjaGluZyBwbGFjZWhvbGRlciBpc1xuICogc2ltcGx5IG9taXR0ZWQgXHUyMDE0IGluIHBhcnRpY3VsYXIsIGEgc2VlZGVkIHByb21wdCBpcyBOT1QgYXBwZW5kZWQgdG8gYSB0ZW1wbGF0ZVxuICogdGhhdCBvbWl0cyBge3Byb21wdH1gIChhIGNvbW1hbmQgc3VjaCBhcyBgb3BlbiAtYSBpVGVybSB7ZGlyfWAgbXVzdCBub3QgcmVjZWl2ZVxuICogdGhlIHByb21wdCBhcyBhIHN0cmF5IGFyZ3VtZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVMbG1Db21tYW5kID0gKHRlbXBsYXRlOiBzdHJpbmcsIHsgcHJvbXB0LCBkaXIgfTogUmVzb2x2ZUxsbUNvbW1hbmRPcHRpb25zID0ge30pOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzb2x2ZWQgPSBzdWJzdGl0dXRlKHRlbXBsYXRlLCBkaXJQbGFjZWhvbGRlciwgZGlyKTtcblxuICByZXNvbHZlZCA9IHN1YnN0aXR1dGUocmVzb2x2ZWQsIHByb21wdFBsYWNlaG9sZGVyLCBwcm9tcHQpO1xuXG4gIHJldHVybiByZXNvbHZlZDtcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGlubmVyIGNvbW1hbmQgdG8gcnVuLCBpbnNlcnRlZCAqKnJhdyoqIChpdCBpcyBhIGZ1bGwgY29tbWFuZFxuICAgKiBsaW5lLCBub3QgYW4gYXJndW1lbnQpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZSBjb21tYW5kIHJ1bnMgaW4uIEJ1aWxkZXJzIHF1b3RlIGl0LCBzbyBhIHBhdGggd2l0aCBzcGFjZXMgaXMgc2FmZS4gKi9cbiAgcmVhZG9ubHkgZGlyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItbGF1bmNoIGVudmlyb25tZW50IHRvIGFwcGx5LiBBIGZyZXNobHktb3BlbmVkIGV4dGVybmFsIHRlcm1pbmFsIHJ1bnMgaXRzXG4gICAqIG93biBzaGVsbCB0aGF0IGRvZXMgbm90IGluaGVyaXQgdGhlIGxhdW5jaGVyJ3MgZW52LCBzbyBhIGJ1aWxkZXIgaGFzIHRvIGNhcnJ5XG4gICAqIHRoZXNlIGludG8gdGhlIGxhdW5jaGVkIGNvbW1hbmQgaXRzZWxmIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIGFtYmllbnRcbiAgICogZW52aXJvbm1lbnQuIFJlYWxpc3RpY2FsbHkgc21hbGwgKGUuZy4ganVzdCBgS1VCRUNPTkZJR2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyLWNvbmZpZ3VyZWQgc2hlbGwgKHRoZSBzYW1lIFwiU2hlbGwgUGF0aFwiIHRoZSBpbi1hcHAgdGVybWluYWwgdXNlcyksIHNvXG4gICAqIHRoZSBleHRlcm5hbCB0ZXJtaW5hbCBydW5zIHRoZSBjb21tYW5kIGluIFx1MjAxNCBhbmQgZHJvcHMgdGhlIHVzZXIgaW50byBcdTIwMTQgdGhhdFxuICAgKiBzaGVsbCByYXRoZXIgdGhhbiB0aGUgT1MvdGVybWluYWwgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsOiBzdHJpbmc7XG59XG5cbi8qKiBCdWlsZHMgdGhlIGZ1bGwgaG9zdCBjb21tYW5kIHRoYXQgb3BlbnMgYGNvbW1hbmRgIGluIGEgZnJlc2ggZXh0ZXJuYWwgdGVybWluYWwgd2luZG93IGZvciBvbmUgT1MuICovXG5leHBvcnQgdHlwZSBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEJ1aWxkZXIgPSAob3B0aW9uczogRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRPcHRpb25zKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGhvc3QgT1MncyB7QGxpbmsgRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVyfS4gUmVnaXN0ZXJlZCBwZXItT1MgdmlhXG4gKiBgZ2V0SW5qZWN0YWJsZUZvck9wZXJhdGluZ1N5c3RlbXNgIChob3N0LW9ubHkgYCotb25seWAgdGFncyksIHNvIGluamVjdGluZyB0aGVcbiAqIHRva2VuIHlpZWxkcyB0aGUgYnVpbGRlciBmb3IgdGhlIGN1cnJlbnQgT1MgXHUyMDE0IG5vIHJ1bnRpbWUgcGxhdGZvcm0gc3dpdGNoLlxuICovXG5leHBvcnQgY29uc3QgZXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVySW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEJ1aWxkZXI7XG59Pih7XG4gIGlkOiBcImV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmQtYnVpbGRlclwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yLCB0eXBlIE1hbnlGYWN0b3J5IH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgU2hlbGxTY29wZWQgfSBmcm9tIFwiQGs4c2xlbnMvcGxhdGZvcm0tc3BlY2lmaWMtaW5qZWN0YWJsZXNcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCwgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKipcbiAqIFBlci1raW5kIGJ1aWxkZXIgZm9yIHRoZSBob3N0IGNvbW1hbmQgdGhhdCBvcGVucyBhbiBBSSB0b29sIGluIGEgZnJlc2ggZXh0ZXJuYWxcbiAqIHRlcm1pbmFsIHdpbmRvdy4gQ29udHJpYnV0ZWQgcGVyIHRvb2wgYnkgYGdldEFpVG9vbEluamVjdGFibGVCdW5jaGAgKHJlc29sdmVkXG4gKiB0byB0aGUgaG9zdCBPUydzIHZhcmlhbnQgZnJvbSB0aGUgdG9vbCdzIGBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmRgXG4gKiBwYXJhbSkuIENvbnN1bWVkIHZpYSB0aGUgZGVyaXZlZCBgc2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEluamVjdGlvblRva2VuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwib3Blbi10b29sLWluLWV4dGVybmFsLXRlcm1pbmFsLWZvci10b29sXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7XG4gICAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPjtcbiAgICBtYW55RmFjdG9yeTogTWFueUZhY3Rvcnk8KCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPj47XG4gIH0+KHtcbiAgICBpZDogYG9wZW4tdG9vbC1pbi1leHRlcm5hbC10ZXJtaW5hbC1mb3ItdG9vbC0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIsIHR5cGUgTWFueUZhY3RvcnkgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBTaGVsbFNjb3BlZCB9IGZyb20gXCJAazhzbGVucy9wbGF0Zm9ybS1zcGVjaWZpYy1pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kLCBHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCBkZXRlY3RzIHdoZXRoZXIgYW4gQUkgdG9vbCBpcyBpbnN0YWxsZWRcbiAqIChlLmcuIGBjb21tYW5kIC12IGNsYXVkZWAgLyBgd2hlcmUgY2xhdWRlYCkuIENvbnRyaWJ1dGVkIHBlciB0b29sIGJ5XG4gKiBgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoYCAodGhlIGhvc3QgT1MncyB2YXJpYW50IHdoZW4gdGhlIHRvb2wnc1xuICogYGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZGAgaXMgb3BlcmF0aW5nLXN5c3RlbSBzcGVjaWZpYykuIFRoZSBkZXRlY3RlZFxuICogdG9vbHMgbGlzdCBydW5zIGl0IHZpYSBgYWlUb29sSW5zdGFsbGVkVmlhQ2xpQ29tbWFuZEluamVjdGlvblRva2VuYCAoZXhpdCBjb2RlXG4gKiAwIFx1MjFEMiBpbnN0YWxsZWQpLiBOb3QgY29udHJpYnV0ZWQgZm9yIGFsd2F5cy1hdmFpbGFibGUgdG9vbHMgKGUuZy4gQ3VzdG9tKSxcbiAqIHdoaWNoIGFyZSB0aGVuIHJlcG9ydGVkIGFzIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmRcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+O1xuICAgIG1hbnlGYWN0b3J5OiBNYW55RmFjdG9yeTwoKSA9PiBTaGVsbFNjb3BlZDxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+PjtcbiAgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmQtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSU9ic2VydmFibGVWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5cbi8qKlxuICogVGhlIGdsb2JhbCBcIm9wZW4gQUkgdG9vbHMgaW4gYW4gZXh0ZXJuYWwgdGVybWluYWxcIiB0b2dnbGUuIFdoZW4gYHRydWVgLCB0aGVcbiAqIHNlbGVjdGVkIEFJIHRvb2wgbGF1bmNoZXMgaW4gYSBmcmVzaCBleHRlcm5hbCB0ZXJtaW5hbCB3aW5kb3cgXHUyMDE0IGJ1aWx0IGJ5IHRoZVxuICogaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgZXh0ZXJuYWwtdGVybWluYWwgY29tbWFuZCBidWlsZGVyIChyZXNvbHZlZCB2aWFcbiAqIGBzZWxlY3RlZEFpVG9vbEV4dGVybmFsVGVybWluYWxDb21tYW5kSW5qZWN0aW9uVG9rZW5gKSBhbmQgc3Bhd25lZCBkZXRhY2hlZCBvblxuICogdGhlIGhvc3QgXHUyMDE0IGluc3RlYWQgb2YgYSBMZW5zIHRlcm1pbmFsIHRhYi4gQXBwbGllcyB0byBldmVyeSB0b29sIChDdXN0b21cbiAqIGluY2x1ZGVkKSwgcmVwbGFjaW5nIHRoZSBmb3JtZXIgcGVyLXRvb2wgcnVucy1leHRlcm5hbGx5IGNhbGxiYWNrcy5cbiAqXG4gKiBQZXJzaXN0ZWQ7IHRoZSBib3ggbG9hZHMgYXN5bmNocm9ub3VzbHksIHNvIHRoZSB0b2tlbiByZXNvbHZlcyB0byBhIHByb21pc2VcbiAqIG9mIHRoZSBvYnNlcnZhYmxlLiBTdXBwb3J0ZWQgb24gbWFjT1MgKFRlcm1pbmFsKSwgV2luZG93cyAoV2luZG93cyBUZXJtaW5hbCksIGFuZFxuICogTGludXggKHRoZSBmaXJzdCBhdmFpbGFibGUgdGVybWluYWwgZW11bGF0b3IpLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sc09wZW5FeHRlcm5hbGx5SW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBQcm9taXNlPElPYnNlcnZhYmxlVmFsdWU8Ym9vbGVhbj4+O1xufT4oe1xuICBpZDogXCJhaS10b29scy1vcGVuLWV4dGVybmFsbHlcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyLCBnZXRJbmplY3RhYmxlQnVuY2ggfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZHJvcERvd25NZW51SXRlbUluamVjdGlvblRva2VuLCB0eXBlIERyb3BEb3duTWVudUl0ZW0gfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgdHlwZSBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFN2Z1Byb3BzIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBBaVRvb2xLaW5kLFxuICBBaVRvb2xMaXN0RW50cnksXG4gIEdldENsaUNvbW1hbmQsXG4gIEdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZCxcbiAgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kLFxufSBmcm9tIFwiLi9haS10b29sXCI7XG5pbXBvcnQgeyBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlLCB0eXBlIE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYyB9IGZyb20gXCIuL29zLWFuZC1zaGVsbC1zcGVjaWZpY1wiO1xuaW1wb3J0IHsgYWlUb29sSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLWluamVjdGlvbi10b2tlblwiO1xuaW1wb3J0IHsgZ2V0QWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2dldC1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiO1xuaW1wb3J0IHsgZ2V0UmVzdW1lQWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2dldC1yZXN1bWUtYWktY29tbWFuZC1mb3ItdGVybWluYWxcIjtcbmltcG9ydCB7IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vZ2V0LW9wZW4tdG9vbC1pbi1leHRlcm5hbC10ZXJtaW5hbC1mb3ItdG9vbFwiO1xuaW1wb3J0IHsgZ2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9nZXQtYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmRcIjtcbmltcG9ydCB7IGFpVG9vbE5hbWVJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtbmFtZVwiO1xuaW1wb3J0IHsgYWlUb29sRGlzcGxheU5hbWVJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtZGlzcGxheS1uYW1lXCI7XG5pbXBvcnQgeyBhaVRvb2xEZXNjcmlwdGlvbkluamVjdGlvblRva2VuLCB0eXBlIEFpVG9vbERlc2NyaXB0aW9uUHJvcHMgfSBmcm9tIFwiLi9haS10b29sLWRlc2NyaXB0aW9uXCI7XG5pbXBvcnQgeyBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLWljb25cIjtcbmltcG9ydCB7IGFpVG9vbE9yZGVyTnVtYmVySW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLW9yZGVyLW51bWJlclwiO1xuaW1wb3J0IHsgYWlUb29sU2V0dGluZ3NJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtc2V0dGluZ3NcIjtcbmltcG9ydCB7IGFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0luamVjdGlvblRva2VuIH0gZnJvbSBcIi4vYWktdG9vbC1pbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zXCI7XG5pbXBvcnQgeyBhaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZUluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWVcIjtcbmltcG9ydCB7IEFpVG9vbFNlbGVjdGlvblJvdyB9IGZyb20gXCIuL2FpLXRvb2wtc2VsZWN0aW9uLXJvd1wiO1xuaW1wb3J0IHsgYWlUb29sVG9wQmFyTWVudUtpbmQsIGFpVG9vbFRvcEJhck1lbnVPcmRlck51bWJlcnMgfSBmcm9tIFwiLi9haS10b29sLXRvcC1iYXItbWVudVwiO1xuaW1wb3J0IHsgZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9kZXRlY3RlZC1haS10b29sc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEFpVG9vbEljb24gfSBmcm9tIFwiLi9kZWZhdWx0LWFpLXRvb2wtaWNvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbEJ1bmNoUGFyYW1zIHtcbiAgcmVhZG9ubHkga2luZDogQWlUb29sS2luZDtcbiAgLyoqIExvd2VyIGNvbWVzIGZpcnN0OyB0aGUgbG93ZXN0LW51bWJlcmVkIGluc3RhbGxlZCB0b29sIGlzIHRoZSBkZWZhdWx0LiAqL1xuICByZWFkb25seSBvcmRlck51bWJlcjogbnVtYmVyO1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBpbi1hcHAgbGF1bmNoIGNvbW1hbmQgKGtub3dzIGhvdyB0byBwYXNzIGB7cHJvbXB0fWApLiBBIHNpbmdsZVxuICAgKiBPUy1hZ25vc3RpYyBidWlsZGVyLCBvciBvbmUgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRDbGlDb21tYW5kOiBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8R2V0Q2xpQ29tbWFuZD47XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNvbW1hbmQgdGhhdCAqcmVzdW1lcyogdGhlIHRvb2wgd2hlbiBpdHMgdGFiJ3Mgc2Vzc2lvbiBpc1xuICAgKiByZS1lc3RhYmxpc2hlZCAoZS5nLiBhZnRlciBhbiBhcHAgcmVzdGFydCkgcmF0aGVyIHRoYW4gZmlyc3Qgb3BlbmVkIFx1MjAxNCBlLmcuXG4gICAqIGBjbGF1ZGUgLS1jb250aW51ZSB8fCBjbGF1ZGVgLCB3aGljaCBjb250aW51ZXMgdGhlIHByaW9yIHNlc3Npb24gYW5kIGZhbGxzXG4gICAqIGJhY2sgdG8gYSBmcmVzaCBsYXVuY2ggd2hlbiB0aGVyZSBpcyBub25lLiBBIHRvb2wgd2l0aCBubyBkZWRpY2F0ZWQgcmVzdW1lXG4gICAqIGludm9jYXRpb24gcGFzc2VzIGl0cyBsYXVuY2ggY29tbWFuZC4gVXN1YWxseSBpZ25vcmVzIGBwcm9tcHRgLiBPUy1hZ25vc3RpYyxcbiAgICogb3Igb25lIGJ1aWxkZXIgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRSZXN1bWVDbGlDb21tYW5kOiBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8R2V0Q2xpQ29tbWFuZD47XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNvbW1hbmQgdGhhdCBjaGVja3Mgd2hldGhlciB0aGUgdG9vbCBpcyBpbnN0YWxsZWQgKGUuZy5cbiAgICogYGNvbW1hbmQgLXYgY2xhdWRlYCAvIGB3aGVyZSBjbGF1ZGVgKSwgcnVuIG9uIHRoZSBob3N0IHdpdGggZXhpdCBjb2RlIDBcbiAgICogbWVhbmluZyBpbnN0YWxsZWQuIE9TLWFnbm9zdGljLCBvciBvbmUgYnVpbGRlciBwZXIgb3BlcmF0aW5nIHN5c3RlbS4gT21pdCBmb3JcbiAgICogYW4gYWx3YXlzLWF2YWlsYWJsZSB0b29sIChlLmcuIHRoZSBmcmVlLXRleHQgQ3VzdG9tIGNvbW1hbmQpLCB3aGljaCBpcyB0aGVuXG4gICAqIHJlcG9ydGVkIGFzIGluc3RhbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZD86IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+O1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBjb21tYW5kIHRoYXQgb3BlbnMgdGhlIHRvb2wgaW4gYSBmcmVzaCBleHRlcm5hbCB0ZXJtaW5hbCB3aW5kb3cgXHUyMDE0XG4gICAqIHR5cGljYWxseSB3cmFwcGluZyB0aGUgdG9vbCdzIGludm9jYXRpb24gd2l0aCBhIGBidWlsZHtNYWMsV2luZG93cyxMaW51eH1FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZGBcbiAgICogaGVscGVyLiBPUy1hZ25vc3RpYywgb3Igb25lIGJ1aWxkZXIgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQ6IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxHZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQ+O1xuICAvKiogQ2Fub25pY2FsIHBsYWluLXRleHQgZGlzcGxheSBuYW1lLCBlLmcuIGBcIkNsYXVkZSBDb2RlXCJgLiBEcml2ZXMgc3RyaW5nLW9ubHkgc2xvdHMgYW5kIHRoZSBkZWZhdWx0IG5hbWUgY29tcG9uZW50LiBEZWZhdWx0cyB0byBga2luZGAuICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCByaWNoIGRpc3BsYXktbmFtZSBjb21wb25lbnQ7IGRlZmF1bHRzIHRvIGEgZnJhZ21lbnQgb2YgdGhlIGRpc3BsYXkgbmFtZS4gKi9cbiAgcmVhZG9ubHkgTmFtZT86IFJlYWN0LkNvbXBvbmVudFR5cGU7XG4gIC8qKiBTaG9ydCBibHVyYiBpbnRyb2R1Y2luZyB0aGUgdG9vbCAoZS5nLiBgXCJUaGUgY29kaW5nIGFzc2lzdGFudCBieSBBbnRocm9waWNcImApLCBzaG93biBhcyB0aGUgc2VsZWN0b3IncyBzZWNvbmRhcnkgbGluZS4gUmVjZWl2ZXMgdGhlIHRvb2wncyBgaXNJbnN0YWxsZWRgIHN0YXRlIHNvIGl0IG1heSBvcHQgdG8gc2hvdyBhIFwiTm90IGZvdW5kIGluIFBBVEhcIiBtZXNzYWdlIGluc3RlYWQuIEEgY29tcG9uZW50IHNvIGl0IG1heSBpbmNsdWRlIG1hcmt1cC9saW5rcy4gRGVmYXVsdHMgdG8gbm90aGluZy4gKi9cbiAgcmVhZG9ubHkgRGVzY3JpcHRpb24/OiBSZWFjdC5Db21wb25lbnRUeXBlPEFpVG9vbERlc2NyaXB0aW9uUHJvcHM+O1xuICAvKiogSWNvbiBjb21wb25lbnQgKGRlZmF1bHRzIHRvIGEgZ2VuZXJpYyB0ZXJtaW5hbCBnbHlwaCkuIEFjY2VwdHMgYFN2Z1Byb3BzYCBzbyBjYWxsIHNpdGVzIGNhbiBzaXplIGl0LiAqL1xuICByZWFkb25seSBJY29uPzogUmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz47XG4gIC8qKiBTZXR0aW5ncyBjb21wb25lbnQgc2hvd24gYmVsb3cgdGhlIHNlbGVjdG9yIHdoZW4gdGhpcyBraW5kIGlzIHNlbGVjdGVkIChlLmcuIHRoZSBjdXN0b20gY29tbWFuZCBpbnB1dCkuICovXG4gIHJlYWRvbmx5IFNldHRpbmdzPzogUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgLyoqIEluc3RydWN0aW9ucyBzaG93biBiZWxvdyB0aGUgc2VsZWN0b3Igd2hlbiB0aGlzIGtpbmQgaXMgbm90IGluc3RhbGxlZCwgc28gaXQgYXBwZWFycyBkaXNhYmxlZCB3aXRoIGd1aWRhbmNlIGluc3RlYWQgb2YgaGlkZGVuLiBNYXkgY29udGFpbiBsaW5rcy4gKi9cbiAgcmVhZG9ubHkgSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zPzogUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgLyoqIEZpbGVuYW1lIHRoZSB0b29sIGF1dG8tZGlzY292ZXJzIGluIGl0cyB3b3JraW5nIGRpcmVjdG9yeSAoZS5nLiBgXCJDTEFVREUubWRcImApLiBPbWl0IHdoZW4gdGhlIHRvb2wgcmVhZHMgbm8gc3VjaCBmaWxlOyB0aGUgbGF1bmNoZXIgYWx3YXlzIHdyaXRlcyB0aGUgY2Fub25pY2FsIGBBR0VOVFMubWRgLiAqL1xuICByZWFkb25seSBpbnN0cnVjdGlvbnNGaWxlbmFtZT86IHN0cmluZztcbn1cblxuLy8gVGhlIHRvb2wncyBpbnN0YWxsIHN0YXRlIGFzIHRoZSBsYXN0IHNjYW4gc2F3IGl0OiB0cnVlL2ZhbHNlIG9uY2Ugc2Nhbm5lZCxcbi8vIHVuZGVmaW5lZCB3aGlsZSBubyBzY2FuIGhhcyBkZXRlcm1pbmVkIGl0IHlldC5cbmNvbnN0IGRldGVjdGVkSW5zdGFsbFN0YXRlID0gKFxuICBkZXRlY3RlZEFpVG9vbHM6IElDb21wdXRlZFZhbHVlPEFpVG9vbExpc3RFbnRyeVtdPixcbiAga2luZDogQWlUb29sS2luZCxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4gZGV0ZWN0ZWRBaVRvb2xzLmdldCgpLmZpbmQoKHRvb2wpID0+IHRvb2wua2luZCA9PT0ga2luZCk/LmlzSW5zdGFsbGVkO1xuXG4vLyBBIHRvb2wncyBvd24gb3JkZXIgbnVtYmVyIG9ubHkgcGxhY2VzIGl0IHdpdGhpbiBpdHMgYmFuZDogQ3VzdG9tIGRlY2xhcmVzXG4vLyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB0byBzb3J0IGxhc3QsIHdoaWNoIG11c3Qgbm90IGxlYWsgaW50byBsYXRlciBiYW5kcy5cbmNvbnN0IGluU2VsZWN0aW9uQmFuZCA9IChiYW5kOiBudW1iZXIsIHRvb2xPcmRlck51bWJlcjogbnVtYmVyKSA9PlxuICBiYW5kICsgTWF0aC5tYXgoMCwgTWF0aC5taW4odG9vbE9yZGVyTnVtYmVyLCBhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzLmJhbmRXaWR0aCAtIDEpKTtcblxuLyoqXG4gKiBSZWdpc3RlciBhIHR5cGljYWwgTExNIENMSSB0b29sOiBpdHMga2luZCwgb3JkZXIsIHRoZSBjb21tYW5kcyAobGF1bmNoLCByZXN1bWUsXG4gKiBpbnN0YWxsLWNoZWNrLCBvcGVuLWV4dGVybmFsbHkpLCBkaXNwbGF5IG5hbWUsIGFuZCBpY29uLiBFYWNoIGNvbW1hbmQgbWF5IGJlIGFcbiAqIHNpbmdsZSBhZ25vc3RpYyBidWlsZGVyLCBvciB2YXJ5IHBlciBvcGVyYXRpbmcgc3lzdGVtIGFuZC9vciBzaGVsbCBcdTIwMTQgcmVnaXN0ZXJlZFxuICogdmlhIGBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlYDogdGhlIE9TIGlzIGZpbHRlcmVkIGF0IHJlZ2lzdHJhdGlvbiAoaG9zdC1vbmx5XG4gKiBgKi1vbmx5YCB0YWdzKSBhbmQgdGhlIHNoZWxsIGlzIHNlbGVjdGVkIGF0IHJ1bnRpbWUgKGByZXNvbHZlRm9yU2hlbGxgKSwgc2luY2VcbiAqIHRoZSBjb25maWd1cmVkIHNoZWxsIGlzIGFzeW5jLiBUaGUgZGV0ZWN0ZWQgdG9vbHMgbGlzdCBydW5zIHRoZSBpbnN0YWxsLWNoZWNrXG4gKiBjb21tYW5kIHZpYVxuICogYGFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmRJbmplY3Rpb25Ub2tlbmAgKG9taXQgdGhlIGNvbW1hbmQgZm9yIGFuXG4gKiBhbHdheXMtYXZhaWxhYmxlIHRvb2wpLiBCdW5kbGUgc2V2ZXJhbCB3aXRoXG4gKiBgZ2V0SW5qZWN0YWJsZUJ1bmNoKFsgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoKC4uLiksIC4uLiBdKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBaVRvb2xJbmplY3RhYmxlQnVuY2ggPSAocGFyYW1zOiBBaVRvb2xCdW5jaFBhcmFtcykgPT4ge1xuICAvLyBCdWlsdCBvbmNlIHBlciB0b29sIHNvIHRoZSBjb21wb25lbnQgcmVmcyBhcmUgc3RhYmxlIFx1MjAxNCBhIGZyZXNoIHJlZiBvbiBlYWNoXG4gIC8vIGluamVjdGlvbiB3b3VsZCByZW1vdW50IFJlYWN0IGFuZCBsb3NlIHN0YXRlLlxuICBjb25zdCBkaXNwbGF5TmFtZSA9IHBhcmFtcy5uYW1lID8/IHBhcmFtcy5raW5kO1xuICBjb25zdCBOYW1lQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlID1cbiAgICBwYXJhbXMuTmFtZSA/PyAoKCkgPT4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZGlzcGxheU5hbWUpKTtcbiAgY29uc3QgRGVzY3JpcHRpb25Db21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGU8QWlUb29sRGVzY3JpcHRpb25Qcm9wcz4gPSBwYXJhbXMuRGVzY3JpcHRpb24gPz8gKCgpID0+IG51bGwpO1xuICBjb25zdCBJY29uQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlPFN2Z1Byb3BzPiA9IHBhcmFtcy5JY29uID8/IERlZmF1bHRBaVRvb2xJY29uO1xuICBjb25zdCBTZWxlY3Rpb25Sb3dDb21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGUgPSAoKSA9PlxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQWlUb29sU2VsZWN0aW9uUm93LCB7IGtpbmQ6IHBhcmFtcy5raW5kIH0pO1xuICBjb25zdCBTZXR0aW5nc0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50VHlwZSA9IHBhcmFtcy5TZXR0aW5ncyA/PyAoKCkgPT4gbnVsbCk7XG4gIGNvbnN0IEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50VHlwZSA9IHBhcmFtcy5JbnN0YWxsYXRpb25JbnN0cnVjdGlvbnMgPz8gKCgpID0+IG51bGwpO1xuXG4gIHJldHVybiBnZXRJbmplY3RhYmxlQnVuY2goe1xuICAgIGFpVG9vbDogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKTogQWlUb29sS2luZCA9PiBwYXJhbXMua2luZCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJbmplY3Rpb25Ub2tlbixcbiAgICB9KSxcblxuICAgIG9yZGVyTnVtYmVyOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtb3JkZXItbnVtYmVyLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKTogbnVtYmVyID0+IHBhcmFtcy5vcmRlck51bWJlcixcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xPcmRlck51bWJlckluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBnZXRDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluamVjdGlvblRva2VuOiBnZXRBaUNvbW1hbmRGb3JUZXJtaW5hbEluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgICB2YWx1ZTogcGFyYW1zLmdldENsaUNvbW1hbmQsXG4gICAgfSksXG5cbiAgICBnZXRSZXN1bWVDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbC0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZ2V0UmVzdW1lQWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgICAgdmFsdWU6IHBhcmFtcy5nZXRSZXN1bWVDbGlDb21tYW5kLFxuICAgIH0pLFxuXG4gICAgZ2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgb3Blbi10b29sLWluLWV4dGVybmFsLXRlcm1pbmFsLWZvci10b29sLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluamVjdGlvblRva2VuOiBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbEZvclRvb2xJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgICAgdmFsdWU6IHBhcmFtcy5nZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQsXG4gICAgfSksXG5cbiAgICBuYW1lOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtbmFtZS0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gTmFtZUNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIGRpc3BsYXlOYW1lOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtZGlzcGxheS1uYW1lLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKSA9PiBkaXNwbGF5TmFtZSxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xEaXNwbGF5TmFtZUluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLWRlc2NyaXB0aW9uLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKSA9PiBEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xEZXNjcmlwdGlvbkluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBpY29uOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtaWNvbi0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gSWNvbkNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIHNldHRpbmdzOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtc2V0dGluZ3MtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBSZWFjdC5Db21wb25lbnRUeXBlID0+IFNldHRpbmdzQ29tcG9uZW50LFxuICAgICAgaW5qZWN0aW9uVG9rZW46IGFpVG9vbFNldHRpbmdzSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIGluc3RhbGxhdGlvbkluc3RydWN0aW9uczogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBSZWFjdC5Db21wb25lbnRUeXBlID0+IEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0NvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnNJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgIH0pLFxuXG4gICAgaW5zdHJ1Y3Rpb25zRmlsZW5hbWU6IGdldEluamVjdGFibGUyKHtcbiAgICAgIGlkOiBgYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWUtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gcGFyYW1zLmluc3RydWN0aW9uc0ZpbGVuYW1lLFxuICAgICAgaW5qZWN0aW9uVG9rZW46IGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIC8vIFRoZSB0b29sJ3Mgcm93cyBpbiB0aGUgQUkgdG9vbCBidXR0b24ncyBkcm9wLWRvd24gbWVudTogb25lIHBlciBiYW5kLCB0aGVcbiAgICAvLyB2aXNpYmlsaXR5IHN3aXRjaGluZyBvbiB0aGUgZGV0ZWN0ZWQgaW5zdGFsbCBzdGF0ZSBzbyB0aGUgdG9vbCBzaXRzIGluXG4gICAgLy8gd2hpY2hldmVyIGJhbmQgbWF0Y2hlcyBcdTIwMTQgYW5kIGluIG5laXRoZXIgd2hpbGUgbm8gc2NhbiBoYXMgZGV0ZXJtaW5lZCBpdC5cbiAgICAvLyBXaGF0IGEgcm93IGxvb2tzIGxpa2UgYW5kIGRvZXMgaXMgdGhlIEFpVG9vbFNlbGVjdGlvblJvdyBpbXBsZW1lbnRhdGlvbidzXG4gICAgLy8gYnVzaW5lc3MuXG4gICAgaW5zdGFsbGVkU2VsZWN0aW9uUm93OiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtc2VsZWN0aW9uLXJvdy1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgY29uc3VtcHRpb25zOiBbZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW5dLFxuXG4gICAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkQWlUb29scyA9IGRpLmluamVjdChkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbikoKTtcblxuICAgICAgICBjb25zdCBpdGVtOiBEcm9wRG93bk1lbnVJdGVtID0ge1xuICAgICAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LWluc3RhbGxlZC0ke3BhcmFtcy5raW5kfWAsXG4gICAgICAgICAgb3JkZXJOdW1iZXI6IGluU2VsZWN0aW9uQmFuZChhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzLmluc3RhbGxlZEFpVG9vbEJhbmQsIHBhcmFtcy5vcmRlck51bWJlciksXG4gICAgICAgICAgaXNWaXNpYmxlOiBjb21wdXRlZCgoKSA9PiBkZXRlY3RlZEluc3RhbGxTdGF0ZShkZXRlY3RlZEFpVG9vbHMsIHBhcmFtcy5raW5kKSA9PT0gdHJ1ZSksXG4gICAgICAgICAgQ29tcG9uZW50OiBTZWxlY3Rpb25Sb3dDb21wb25lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuICgpID0+IGl0ZW07XG4gICAgICB9LFxuXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZHJvcERvd25NZW51SXRlbUluamVjdGlvblRva2VuLmZvcihhaVRvb2xUb3BCYXJNZW51S2luZCksXG4gICAgfSksXG5cbiAgICBub3RJbnN0YWxsZWRTZWxlY3Rpb25Sb3c6IGdldEluamVjdGFibGUyKHtcbiAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LW5vdC1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgY29uc3VtcHRpb25zOiBbZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW5dLFxuXG4gICAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkQWlUb29scyA9IGRpLmluamVjdChkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbikoKTtcblxuICAgICAgICBjb25zdCBpdGVtOiBEcm9wRG93bk1lbnVJdGVtID0ge1xuICAgICAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LW5vdC1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgICAgIG9yZGVyTnVtYmVyOiBpblNlbGVjdGlvbkJhbmQoYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVycy5ub3RJbnN0YWxsZWRBaVRvb2xCYW5kLCBwYXJhbXMub3JkZXJOdW1iZXIpLFxuICAgICAgICAgIGlzVmlzaWJsZTogY29tcHV0ZWQoKCkgPT4gZGV0ZWN0ZWRJbnN0YWxsU3RhdGUoZGV0ZWN0ZWRBaVRvb2xzLCBwYXJhbXMua2luZCkgPT09IGZhbHNlKSxcbiAgICAgICAgICBDb21wb25lbnQ6IFNlbGVjdGlvblJvd0NvbXBvbmVudCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gKCkgPT4gaXRlbTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdGlvblRva2VuOiBkcm9wRG93bk1lbnVJdGVtSW5qZWN0aW9uVG9rZW4uZm9yKGFpVG9vbFRvcEJhck1lbnVLaW5kKSxcbiAgICB9KSxcblxuICAgIC8vIFRoZSBpbnN0YWxsLWRldGVjdGlvbiBjb21tYW5kLCByZWdpc3RlcmVkIG9ubHkgd2hlbiB0aGUgdG9vbCBkZWNsYXJlcyBvbmU7XG4gICAgLy8gdGhlIGRldGVjdGVkLXRvb2xzIGxpc3QgcnVucyBpdCAoZXhpdCAwIFx1MjFEMiBpbnN0YWxsZWQpLiBBIHRvb2wgdGhhdCBkZWNsYXJlc1xuICAgIC8vIG5vbmUgKGUuZy4gQ3VzdG9tKSBpcyByZXBvcnRlZCBhcyBpbnN0YWxsZWQuXG4gICAgLi4uKHBhcmFtcy5nZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7XG4gICAgICAgICAgYWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgICAgICAgIGlkOiBgYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgICAgICAgaW5qZWN0aW9uVG9rZW46IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgICAgICAgICB2YWx1ZTogcGFyYW1zLmdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufTtcbiIsICJpbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuQ29tcG9uZW50MiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlLXJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWlUb29sU2VsZWN0aW9uUm93UHJvcHMge1xuICAvKiogVGhlIHRvb2wgdGhlIHJvdyByZXByZXNlbnRzLiAqL1xuICByZWFkb25seSBraW5kOiBBaVRvb2xLaW5kO1xufVxuXG4vKipcbiAqIE9uZSBBSSB0b29sJ3Mgcm93IGluIHRoZSB0b3AgYmFyIG1lbnUncyBzZWxlY3Rpb24gc2VjdGlvbjogaG93IHRoZSByb3cgbG9va3MgYW5kIHdoYXRcbiAqIGNsaWNraW5nIGl0IGRvZXMgKHNlbGVjdGluZyBhbiBpbnN0YWxsZWQgdG9vbCwgZ3VpZGluZyB0aGUgaW5zdGFsbGF0aW9uIG9mIGEgbWlzc2luZ1xuICogb25lKS4gUmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBtZW51IGF1dG9tYXRpY2FsbHksIHBlciB0b29sLCBieVxuICoge0BsaW5rIGdldEFpVG9vbEluamVjdGFibGVCdW5jaH07IHRoZSBmZWF0dXJlIG93bmluZyB0aGUgQUkgdG9vbCBidXR0b24gcHJvdmlkZXMgdGhlXG4gKiBpbXBsZW1lbnRhdGlvbiwgc28gdGhpcyBnZW5lcmljIHBhY2thZ2Ugc3RheXMgZnJlZSBvZiBpdHMgdGVsZW1ldHJ5IGFuZCBlbnRpdGxlbWVudFxuICogY29uY2VybnMuXG4gKi9cbmV4cG9ydCBjb25zdCBBaVRvb2xTZWxlY3Rpb25Sb3cgPSBnZXRJbmplY3Rpb25Ub2tlbkNvbXBvbmVudDI8UmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8QWlUb29sU2VsZWN0aW9uUm93UHJvcHM+Pih7XG4gIGlkOiBcImFpLXRvb2wtc2VsZWN0aW9uLXJvd1wiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBnZXREcm9wRG93bk1lbnVLaW5kIH0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c1wiO1xuXG4vKipcbiAqIFRoZSBkcm9wLWRvd24gbWVudSBvZiB0aGUgdG9wIGJhcidzIEFJIHRvb2wgYnV0dG9uLiBUaGUgQUkgdG9vbCBzZWxlY3Rpb24gcm93cyBhcmVcbiAqIGNvbnRyaWJ1dGVkIGF1dG9tYXRpY2FsbHksIG9uZSBwZXIgcmVnaXN0ZXJlZCB0b29sLCBieSBgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoYCBvZlxuICogYEBrOHNsZW5zL2FpLXRvb2xzLWNvbnRyYWN0c2A7IGFueW9uZSBlbHNlIGNvbnRyaWJ1dGVzIHRoZWlyIG93biBpdGVtcyB3aXRoXG4gKiBgZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaGAgb2YgYEBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c2AgYWdhaW5zdFxuICogdGhpcyBraW5kLCBwbGFjZWQgd2l0aCB7QGxpbmsgYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVyc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZXhwb3J0IGRlZmF1bHQgZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gKiAgIGlkOiBcIm15LWFpLW1lbnUtaXRlbVwiLFxuICogICBraW5kOiBhaVRvb2xUb3BCYXJNZW51S2luZCxcbiAqICAgb3JkZXJOdW1iZXI6IGFpVG9vbFRvcEJhck1lbnVPcmRlck51bWJlcnMuc2VjdGlvbkVuZCArIDEwMCxcbiAqICAgQ29tcG9uZW50OiBNeU1lbnVJdGVtLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbFRvcEJhck1lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZCgpKFwiYWktdG9vbC10b3AtYmFyLW1lbnVcIik7XG5cbi8qKlxuICogV2hlcmUgdGhlIEFJIHRvb2wgc2VsZWN0aW9uIHNlY3Rpb24ncyBvd24gaXRlbXMgc2l0IGluIHRoZSBidXR0b24ncyBtZW51LCBhcyB0aGVcbiAqIGJvdW5kYXJpZXMgdGhleSBhcmUgbGFpZCBvdXQgYWdhaW5zdC4gVGhlIHNlbGVjdGlvbiByb3dzIG9jY3VweSB0d28gYmFuZHMsIGVhY2hcbiAqIGBiYW5kV2lkdGhgIHdpZGUsIHNvIHRoYXQgZXZlcnkgaW5zdGFsbGVkIHRvb2wgY29tZXMgYmVmb3JlIGV2ZXJ5IG5vdC15ZXQtaW5zdGFsbGVkXG4gKiBvbmUgd2hpbGUgZWFjaCBiYW5kIHN0YXlzIHNvcnRlZCBieSB0aGUgdG9vbHMnIG93biBvcmRlciBudW1iZXJzLlxuICpcbiAqIEEgY29udHJpYnV0b3IgcGxhY2VzIGl0c2VsZiByZWxhdGl2ZSB0byB0aGVzZSByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgZ3Vlc3NlZCBudW1iZXIuXG4gKiBUaGUgc2VjdGlvbiBlbmRzIGF0IHtAbGluayBzZWN0aW9uRW5kfTogaXRlbXMgY29udHJpYnV0ZWQgYWZ0ZXIgaXQgcGljayB0aGVpciBvcmRlclxuICogbnVtYmVycyBmcm9tIHRoZXJlIHVwLCBmcmFtaW5nIHRoZWlyIG93biBzZWN0aW9ucyB3aXRoIHNlcGFyYXRvcnMgdGhleSBjb250cmlidXRlXG4gKiB0aGVtc2VsdmVzLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVycyA9IHtcbiAgLyoqIFRoZSBoZWFkaW5nIGFib3ZlIHRoZSBzZWxlY3Rpb24gcm93cy4gKi9cbiAgYWlUb29sc0hlYWRlcjogMTAwLFxuICAvKiogVGhlIHNjYW5uaW5nIGluZGljYXRvciBzaG93biB3aGlsZSB0aGUgZmlyc3QgZGV0ZWN0aW9uIGhhcyBub3Qgc2V0dGxlZC4gKi9cbiAgZGV0ZWN0aW9uUGVuZGluZzogMjAwLFxuICAvKiogVGhlIGZpcnN0IG9yZGVyIG51bWJlciBvZiB0aGUgYmFuZCBob2xkaW5nIHRoZSByb3dzIG9mIGluc3RhbGxlZCB0b29scy4gKi9cbiAgaW5zdGFsbGVkQWlUb29sQmFuZDogMzAwLFxuICAvKiogVGhlIGZpcnN0IG9yZGVyIG51bWJlciBvZiB0aGUgYmFuZCBob2xkaW5nIHRoZSByb3dzIG9mIG5vdC1pbnN0YWxsZWQgdG9vbHMuICovXG4gIG5vdEluc3RhbGxlZEFpVG9vbEJhbmQ6IDQwMCxcbiAgLyoqIEhvdyB3aWRlIGVhY2ggc2VsZWN0aW9uIGJhbmQgaXMsIGFuZCBzbyBob3cgZmFyIGEgdG9vbCdzIG93biBudW1iZXIgbWF5IHJlYWNoLiAqL1xuICBiYW5kV2lkdGg6IDEwMCxcbiAgLyoqIFRoZSBmaXJzdCBvcmRlciBudW1iZXIgcGFzdCB0aGUgd2hvbGUgc2VsZWN0aW9uIHNlY3Rpb24uICovXG4gIHNlY3Rpb25FbmQ6IDUwMCxcbn0gYXMgY29uc3Q7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xMaXN0RW50cnkgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgc3luY2hyb25vdXNseSByZWFkYWJsZSBkZXRlY3RlZC10b29scyBsaXN0LiAqL1xuZXhwb3J0IHR5cGUgRGV0ZWN0ZWRBaVRvb2xzID0gKCkgPT4gSUNvbXB1dGVkVmFsdWU8QWlUb29sTGlzdEVudHJ5W10+O1xuXG4vKipcbiAqIFRoZSBBSSB0b29scyB3aXRoIHRoZWlyIGRldGVjdGVkIGluc3RhbGwgc3RhdGUsIGFzIGEgc3luY2hyb25vdXNseSByZWFkYWJsZSByZWFjdGl2ZVxuICogbGlzdCBcdTIwMTQgdGhlIHNhbWUgc3RhdGUgYGFpVG9vbHNJbmplY3Rpb25Ub2tlbmAgZXhwb3NlcyBiZWhpbmQgYSBwcm9taXNlLCBmb3IgY29uc3VtZXJzXG4gKiB0aGF0IG5lZWQgc3luYyByZWFjdGl2aXR5IChlLmcuIHRoZSBgaXNWaXNpYmxlYCBjb21wdXRlZHMgb2YgbWVudSBpdGVtcykuIEVtcHR5IHVudGlsXG4gKiB0aGUgZmlyc3QgZXhwbGljaXQgc2NhbiAoYHJlZnJlc2hBaVRvb2xEZXRlY3Rpb25JbmplY3Rpb25Ub2tlbmApIGhhcyBydW47IGEga2luZFxuICogbWlzc2luZyBmcm9tIHRoZSBsaXN0IGhhcyBub3QgYmVlbiBzY2FubmVkIHlldC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdGVkQWlUb29sc0luamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogRGV0ZWN0ZWRBaVRvb2xzIH0+KHtcbiAgaWQ6IFwiZGV0ZWN0ZWQtYWktdG9vbHNcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sTGlzdEVudHJ5IH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHJlYWN0aXZlIGxpc3Qgb2YgYWxsIGNvbnRyaWJ1dGVkIEFJIHRvb2xzIHdpdGggaW5zdGFsbCBzdGF0ZS4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHMgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEFpVG9vbExpc3RFbnRyeVtdPj47XG5cbi8qKlxuICogQWxsIGNvbnRyaWJ1dGVkIEFJIHRvb2wga2luZHMgdG9nZXRoZXIgd2l0aCB0aGVpciBkZXRlY3RlZCBpbnN0YWxsYXRpb25cbiAqIHN0YXRlLCBzb3J0ZWQgYnkgb3JkZXIgbnVtYmVyLiBDb25zdW1lZCBieSB0aGUgcHJlZmVyZW5jZXMgc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xzIH0+KHtcbiAgaWQ6IFwiYWktdG9vbHNcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYXliZVJlc3VsdEZhY3RvcnkgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZ2V0RHJvcERvd25NZW51S2luZCB9IGZyb20gXCJAazhzbGVucy9kcm9wLWRvd24tbWVudS1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKipcbiAqIFRoZSBtZW51IGEgdG9vbCdzIG93biBjb25maWd1cmF0aW9uIGlzIG9mZmVyZWQgaW4sIG9wZW5lZCBmcm9tIHRoZSB0b29sJ3Mgcm93IGluXG4gKiB0aGUgQUkgdG9vbCBidXR0b24ncyBtZW51LiBPbmUga2luZCBmb3IgZXZlcnkgdG9vbDogdGhlIHJvdyBzYXlzIHdoaWNoIHRvb2wgaXRcbiAqIG9wZW5lZCB0aGUgbWVudSBmb3IsIGFuZCB0aGUgaXRlbSByZW5kZXJzIHRoYXQgdG9vbCdzIGBTZXR0aW5nc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xDb25maWd1cmF0aW9uTWVudUtpbmQgPSBnZXREcm9wRG93bk1lbnVLaW5kPHsgcmVhZG9ubHkga2luZDogQWlUb29sS2luZCB9PigpKFxuICBcImFpLXRvb2wtY29uZmlndXJhdGlvbi1tZW51XCIsXG4pO1xuXG4vKiogUmVzb2x2ZXMgd2hldGhlciB0aGUgdG9vbCBoYXMgdGhlIGNvbmZpZ3VyYXRpb24gaXQgbmVlZHMgdG8gcnVuLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sSXNDb25maWd1cmVkID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxib29sZWFuPj47XG5cbi8qKlxuICogV2hldGhlciBhIHRvb2wgaGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IG5lZWRzIHRvIHJ1biBcdTIwMTQgdGhlIEN1c3RvbSBraW5kJ3NcbiAqIGZyZWUtdGV4dCBjb21tYW5kLCBmb3IgaW5zdGFuY2UsIGlzIG5vdGhpbmcgdW50aWwgdGhlIHVzZXIgd3JpdGVzIG9uZS5cbiAqXG4gKiBSZWdpc3RlcmVkIG9ubHkgYnkgdGhlIHRvb2xzIHRoYXQgbmVlZCBjb25maWd1cmluZzsgYSB0b29sIHdpdGggbm8gcmVnaXN0cmF0aW9uXG4gKiBuZWVkcyBub25lIGFuZCBpcyBhbHdheXMgcmVhZHkuIFJlZ2lzdGVyaW5nIG9uZSBpcyBhbHNvIHdoYXQgbWFrZXMgYSBzdXJmYWNlXG4gKiBvZmZlciB0aGUgdG9vbCdzIG93biBgU2V0dGluZ3NgLCBzbyBhIHRvb2wgY2FuIGJlIGNvbmZpZ3VyZWQgd2hlcmUgaXQgaXMgcGlja2VkXG4gKiByYXRoZXIgdGhhbiBpbiBvbmUgcGxhY2UgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJc0NvbmZpZ3VyZWQgfT4oe1xuICBpZDogXCJhaS10b29sLWlzLWNvbmZpZ3VyZWQtZm9yLWtpbmRcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1vbmVcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJc0NvbmZpZ3VyZWQ7IG1heWJlRmFjdG9yeTogTWF5YmVSZXN1bHRGYWN0b3J5PEFpVG9vbElzQ29uZmlndXJlZD4gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pcy1jb25maWd1cmVkLWZvci1raW5kLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwiemVyby1vci1vbmVcIixcbiAgfSkoKSxcbik7XG5cbi8qKiBXaGF0IG9uZSB0b29sIHNheXMgYWJvdXQgY29uZmlndXJhdGlvbiBvZiBpdHMgb3duLCBhcyB0aGUgc3VyZmFjZXMgdGhhdCBnYXRlIG9uIGl0IG5lZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZSB7XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIGhhcyBjb25maWd1cmF0aW9uIHRvIGZpbGwgaW4gYXQgYWxsLiAqL1xuICByZWFkb25seSBpc0NvbmZpZ3VyYWJsZTogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGVyZSB5ZXQuICovXG4gIHJlYWRvbmx5IGlzQ29uZmlndXJlZDogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIG1heSBiZSBwaWNrZWQ6IGl0IGVpdGhlciBuZWVkcyBubyBjb25maWd1cmF0aW9uLCBvciBoYXMgaXQuICovXG4gIHJlYWRvbmx5IGlzUmVhZHlUb1NlbGVjdDogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG59XG5cbi8qKiBSZXNvbHZlcyBvbmUgdG9vbCdzIGNvbmZpZ3VyYXRpb24gc3RhdGUuICovXG5leHBvcnQgdHlwZSBBaVRvb2xDb25maWd1cmF0aW9uU3RhdGVGb3IgPSAoKSA9PiAoa2luZDogQWlUb29sS2luZCkgPT4gQWlUb29sQ29uZmlndXJhdGlvblN0YXRlO1xuXG4vKipcbiAqIFJlYWRzIHtAbGluayBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW59IG9uIGJlaGFsZiBvZiBldmVyeSBzdXJmYWNlXG4gKiB0aGF0IGdhdGVzIG9uIGl0IFx1MjAxNCB0aGUgQUkgdG9vbCBidXR0b24ncyBtZW51IGFuZCB0aGUgcHJlZmVyZW5jZXMgc2VsZWN0b3IgXHUyMDE0IHNvXG4gKiBvbmUgcnVsZSBpcyBub3QgZW5mb3JjZWQgaW4gb25lIHBsYWNlIGFuZCBtaXNzZWQgaW4gYW5vdGhlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogQWlUb29sQ29uZmlndXJhdGlvblN0YXRlRm9yO1xufT4oe1xuICBpZDogXCJhaS10b29sLWNvbmZpZ3VyYXRpb24tc3RhdGVcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlLCBJT2JzZXJ2YWJsZVZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBTdmdQcm9wcyB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCwgR2V0Q2xpQ29tbWFuZCwgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCByYXcgc2VsZWN0aW9uOiBhIHRvb2wga2luZCwgYGN1c3RvbUFpVG9vbEtpbmRgLCBgbm9BaVRvb2xLaW5kYCwgb3IgYHVuZGVmaW5lZGAgKHVuc2V0KS4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdGVkQWlUb29sS2luZCA9ICgpID0+IFByb21pc2U8SU9ic2VydmFibGVWYWx1ZTxBaVRvb2xLaW5kIHwgdW5kZWZpbmVkPj47XG5cbi8qKlxuICogVGhlIHVzZXIncyBwZXJzaXN0ZWQgQUkgdG9vbCBzZWxlY3Rpb24uIEhvbGRzIGEgY29udHJpYnV0ZWQgdG9vbCBraW5kLCB0aGVcbiAqIGBjdXN0b21BaVRvb2xLaW5kYCBzZW50aW5lbCwgdGhlIGBub0FpVG9vbEtpbmRgIG9wdC1vdXQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmV2ZXJcbiAqIHNldC4gUmVhZC93cml0ZSBcdTIwMTQgdGhlIHByZWZlcmVuY2VzIHNlbGVjdG9yIGJpbmRzIHRvIGl0LlxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRBaVRvb2xLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBTZWxlY3RlZEFpVG9vbEtpbmQgfT4oe1xuICBpZDogXCJzZWxlY3RlZC1haS10b29sLWtpbmRcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGVmZmVjdGl2ZSBzZWxlY3Rpb246IHRoZSByYXcgc2VsZWN0aW9uIGlmIGluc3RhbGxlZCwgZWxzZSBgbm9BaVRvb2xLaW5kYC4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbEtpbmQgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEFpVG9vbEtpbmQ+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIEFJIHRvb2wga2luZDogdGhlIHJhdyBzZWxlY3Rpb24gd2hlbiBpdCBpcyBhbiBpbnN0YWxsZWQga2luZCAoYVxuICogcmVhbCB0b29sIG9yIGBjdXN0b21BaVRvb2xLaW5kYCksIG90aGVyd2lzZSBgbm9BaVRvb2xLaW5kYC4gU28gYW4gdW5zZXRcbiAqIHNlbGVjdGlvbiwgYW4gZXhwbGljaXQgXCJObyBBSSB0b29sXCIsIGFuZCBhIHNlbGVjdGVkLWJ1dC11bmluc3RhbGxlZCB0b29sIGFsbFxuICogcmVzb2x2ZSB0byBgbm9BaVRvb2xLaW5kYCBcdTIwMTQgdGhlIGRlZmF1bHQgYW5kIHRoZSBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGVmZmVjdGl2ZUFpVG9vbEtpbmRJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEVmZmVjdGl2ZUFpVG9vbEtpbmQgfT4oe1xuICBpZDogXCJlZmZlY3RpdmUtYWktdG9vbC1raW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgY29tbWFuZCBidWlsZGVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIEN1c3RvbSBvciBcIk5vIEFJIHRvb2xcIiBpcyBlZmZlY3RpdmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RlZEFpVG9vbENvbW1hbmQgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEdldENsaUNvbW1hbmQgfCB1bmRlZmluZWQ+PjtcblxuLyoqXG4gKiBUaGUgY29tbWFuZCBidWlsZGVyIGZvciB0aGUgZWZmZWN0aXZlIHNlbGVjdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIGVmZmVjdGl2ZSBzZWxlY3Rpb24gaXMgYGN1c3RvbUFpVG9vbEtpbmRgICh0aGUgY29uc3VtZXIgdGhlbiB1c2VzIGl0cyBvd25cbiAqIGZyZWUtdGV4dCBjb21tYW5kKSBvciBgbm9BaVRvb2xLaW5kYCAobm90aGluZyB0byBsYXVuY2gpLiBDb25zdW1lZCB3aGVuXG4gKiBsYXVuY2hpbmcgYW4gQUkgdG9vbC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdGVkQWlUb29sQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xDb21tYW5kIH0+KHtcbiAgaWQ6IFwic2VsZWN0ZWQtYWktdG9vbC1jb21tYW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIHJlc3VtZSBjb21tYW5kIGJ1aWxkZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaGFzIG5vIHJlc3VtZSBpbnZvY2F0aW9uLiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxHZXRDbGlDb21tYW5kIHwgdW5kZWZpbmVkPj47XG5cbi8qKlxuICogVGhlIGNvbW1hbmQgYnVpbGRlciB0aGF0ICpyZXN1bWVzKiB0aGUgZWZmZWN0aXZlIHNlbGVjdGlvbiAoZS5nLiBidWlsZGluZ1xuICogYGNsYXVkZSAtLWNvbnRpbnVlIHx8IGNsYXVkZWApLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlZmZlY3RpdmUgdG9vbCBkZWNsYXJlcyBub1xuICogcmVzdW1lIGludm9jYXRpb24uIENvbnN1bWVkIHdoZW4gcmUtZXN0YWJsaXNoaW5nIGFuIEFJIHRvb2wncyBzZXNzaW9uIFx1MjAxNCBhXG4gKiB0ZXJtaW5hbCB0YWIgcnVucyB0aGlzIGluc3RlYWQgb2YgdGhlIGxhdW5jaCBjb21tYW5kIGFmdGVyIGEgcmVzdGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdGVkQWlUb29sUmVzdW1lQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kO1xufT4oe1xuICBpZDogXCJzZWxlY3RlZC1haS10b29sLXJlc3VtZS1jb21tYW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIFwib3BlbiBpbiBleHRlcm5hbCB0ZXJtaW5hbFwiIGNvbW1hbmQgYnVpbGRlciBmb3IgdGhlIGhvc3QgT1MuICovXG5leHBvcnQgdHlwZSBTZWxlY3RlZEFpVG9vbE9wZW5JbkV4dGVybmFsVGVybWluYWxDb21tYW5kID0gKCkgPT4gUHJvbWlzZTxcbiAgSUNvbXB1dGVkVmFsdWU8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIHwgdW5kZWZpbmVkPlxuPjtcblxuLyoqXG4gKiBUaGUgY29tbWFuZCBidWlsZGVyIHRoYXQgb3BlbnMgdGhlIGVmZmVjdGl2ZSBzZWxlY3RlZCB0b29sIGluIGEgZnJlc2ggZXh0ZXJuYWxcbiAqIHRlcm1pbmFsIHdpbmRvdywgZm9yIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uIENvbnN1bWVkIHdoZW4gdGhlIGdsb2JhbCBcIm9wZW5cbiAqIEFJIHRvb2xzIGluIGFuIGV4dGVybmFsIHRlcm1pbmFsXCIgdG9nZ2xlIGlzIG9uIFx1MjAxNCB0aGUgY29uc3VtZXIgY2FsbHMgaXQgd2l0aFxuICogYHsgcHJvbXB0LCBkaXIsIGVudiB9YCBhbmQgc3Bhd25zIHRoZSByZXN1bHQgZGV0YWNoZWQuIFJlc29sdmVzIHRoZSB0b29sJ3NcbiAqIGhvc3QtT1MgdmFyaWFudCAobWFjT1MgVGVybWluYWwsIFdpbmRvd3MgVGVybWluYWwsIG9yIGEgTGludXggZmFsbGJhY2sgY2hhaW4pIHZpYVxuICogdGhlIHBlci1raW5kIGBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbEZvclRvb2xgIHRva2VuLlxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZDtcbn0+KHtcbiAgaWQ6IFwic2VsZWN0ZWQtYWktdG9vbC1vcGVuLWluLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmRcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGVmZmVjdGl2ZSB0b29sJ3MgZGlzcGxheS1uYW1lIFJlYWN0IGNvbXBvbmVudC4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbE5hbWUgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPFJlYWN0LkNvbXBvbmVudFR5cGU+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBkaXNwbGF5LW5hbWUgY29tcG9uZW50IChlLmcuIHJlbmRlcnMgXCJDbGF1ZGVcbiAqIENvZGVcIikuIERyaXZlcyB0aGUgUmVhY3Qgc3VyZmFjZXMgdGhhdCBuYW1lIHRoZSBBSSB0b29sIFx1MjAxNCBcIkFzayA8bmFtZT5cIlxuICogYnV0dG9ucyBhbmQgdGhlIHRvcC1iYXIgbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBlZmZlY3RpdmVBaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xOYW1lIH0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtbmFtZVwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG5cbi8qKiBSZXNvbHZlcyB0aGUgZWZmZWN0aXZlIHRvb2wncyBwbGFpbi10ZXh0IGRpc3BsYXkgbmFtZS4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxzdHJpbmc+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBwbGFpbi10ZXh0IG5hbWUsIGZvciBzdHJpbmctb25seSBzbG90cyB0aGF0XG4gKiBjYW5ub3QgcmVuZGVyIHRoZSBSZWFjdCBuYW1lIGNvbXBvbmVudCAoZS5nLiB0aGUgY29tbWFuZC1wYWxldHRlIGVudHJ5IHRpdGxlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xEaXNwbGF5TmFtZTtcbn0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtZGlzcGxheS1uYW1lXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIGljb24gY29tcG9uZW50LiAqL1xuZXhwb3J0IHR5cGUgRWZmZWN0aXZlQWlUb29sSWNvbiA9ICgpID0+IFByb21pc2U8SUNvbXB1dGVkVmFsdWU8UmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz4+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBpY29uIGNvbXBvbmVudCwgc2hvd24gd2hlcmV2ZXIgdGhlIHRvb2wgaXMgb2ZmZXJlZFxuICogKHRoZSBcIkFzayA8bmFtZT5cIiBidXR0b25zIGFuZCB0aGUgdG9wLWJhciBidXR0b24pIGluIHBsYWNlIG9mIGEgZml4ZWQgYnJhbmRcbiAqIGljb24uXG4gKi9cbmV4cG9ydCBjb25zdCBlZmZlY3RpdmVBaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xJY29uIH0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtaWNvblwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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QUNmLENBQUMsRUFBRTtBQVdJLElBQU0sd0NBQW9DLHdDQUEyRDtBQUFBLEVBQzFHLElBQUk7QUFBQSxFQUNKLGFBQWE7QUFDZixDQUFDLEVBQUU7QUFXSSxJQUFNLDBDQUFzQyx3Q0FBNkQ7QUFBQSxFQUM5RyxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBV0ksSUFBTSxnREFBNEMsd0NBRXREO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBZUksSUFBTSxnRUFBNEQsd0NBRXRFO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBVUksSUFBTSx3Q0FBb0Msd0NBQTJEO0FBQUEsRUFDMUcsSUFBSTtBQUFBLEVBQ0osYUFBYTtBQUNmLENBQUMsRUFBRTtBQVNJLElBQU0sK0NBQTJDLHdDQUVyRDtBQUFBLEVBQ0QsSUFBSTtBQUFBLEVBQ0osYUFBYTtBQUNmLENBQUMsRUFBRTtBQVVJLElBQU0sd0NBQW9DLHdDQUEyRDtBQUFBLEVBQzFHLElBQUk7QUFBQSxFQUNKLGFBQWE7QUFDZixDQUFDLEVBQUU7IiwKICAibmFtZXMiOiBbImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9wdWJsaWNfdXRpbGl0aWVzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9kcm9wX2Rvd25fbWVudV9jb250cmFjdHMiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiUmVhY3QiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X2Ryb3BfZG93bl9tZW51X2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSJdCn0K