@dbx-tools/appkit-mastra 0.9.5 → 0.9.6

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 (49) hide show
  1. package/README.md +16 -18
  2. package/index.ts +1 -3
  3. package/lib/index.d.ts +1 -3
  4. package/lib/index.js +2 -3
  5. package/lib/src/agents.d.ts +2 -2
  6. package/lib/src/agents.js +6 -6
  7. package/lib/src/chart.js +23 -23
  8. package/lib/src/evaluation.js +3 -3
  9. package/lib/src/genie.d.ts +2 -2
  10. package/lib/src/genie.js +20 -20
  11. package/lib/src/memory.js +9 -26
  12. package/lib/src/mlflow.js +4 -4
  13. package/lib/src/model.js +4 -4
  14. package/lib/src/monty-sandbox.js +6 -6
  15. package/lib/src/observability.js +3 -3
  16. package/lib/src/plugin.js +26 -21
  17. package/lib/src/remote-skills.js +20 -30
  18. package/lib/src/sandbox.js +10 -10
  19. package/lib/src/server.js +5 -5
  20. package/lib/src/serving-sanitize.js +12 -9
  21. package/lib/src/serving.js +8 -8
  22. package/lib/src/storage-schema.js +4 -4
  23. package/lib/src/summarize.js +3 -3
  24. package/lib/src/workspaces.js +9 -9
  25. package/lib/src/writer.js +3 -3
  26. package/lib/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +17 -17
  28. package/src/agents.ts +8 -8
  29. package/src/chart.ts +24 -24
  30. package/src/evaluation.ts +2 -2
  31. package/src/genie.ts +20 -20
  32. package/src/memory.ts +11 -27
  33. package/src/mlflow.ts +3 -3
  34. package/src/model.ts +3 -3
  35. package/src/monty-sandbox.ts +5 -5
  36. package/src/observability.ts +2 -2
  37. package/src/plugin.ts +30 -20
  38. package/src/remote-skills.ts +36 -38
  39. package/src/sandbox.ts +9 -9
  40. package/src/server.ts +4 -4
  41. package/src/serving-sanitize.ts +11 -13
  42. package/src/serving.ts +7 -7
  43. package/src/storage-schema.ts +3 -3
  44. package/src/summarize.ts +2 -2
  45. package/src/workspaces.ts +8 -8
  46. package/src/writer.ts +2 -2
  47. package/lib/src/pagination.d.ts +0 -33
  48. package/lib/src/pagination.js +0 -36
  49. package/src/pagination.ts +0 -47
package/lib/src/chart.js CHANGED
@@ -27,8 +27,8 @@
27
27
  * @module
28
28
  */
29
29
  import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
30
- import { async, error, hash, json, log, object, string, } from "@dbx-tools/shared-core";
31
- import { marker, wire } from "@dbx-tools/shared-mastra";
30
+ import { asyncUtils, errorUtils, hash, json, log, object, stringUtils, } from "@dbx-tools/shared-core";
31
+ import { markers, wire } from "@dbx-tools/shared-mastra";
32
32
  import { model } from "@dbx-tools/shared-model";
33
33
  import { Agent } from "@mastra/core/agent";
34
34
  import { createTool } from "@mastra/core/tools";
@@ -143,7 +143,7 @@ export const chartPlanSchema = z.object({
143
143
  .string()
144
144
  .nullable()
145
145
  .default(null)
146
- .describe(string.toDescription(`
146
+ .describe(stringUtils.toDescription(`
147
147
  Short title shown above the chart. Use null to fall back to the
148
148
  \`title\` argument the caller passed in.
149
149
  `)),
@@ -151,7 +151,7 @@ export const chartPlanSchema = z.object({
151
151
  .string()
152
152
  .nullable()
153
153
  .default(null)
154
- .describe(string.toDescription(`
154
+ .describe(stringUtils.toDescription(`
155
155
  Axis label for the primary (usually bottom / value) axis.
156
156
  Used for bar / horizontalBar / line / area / combo / waterfall
157
157
  / scatter / heatmap; use null for pie / funnel / treemap / radar.
@@ -160,7 +160,7 @@ export const chartPlanSchema = z.object({
160
160
  .string()
161
161
  .nullable()
162
162
  .default(null)
163
- .describe(string.toDescription(`
163
+ .describe(stringUtils.toDescription(`
164
164
  Axis label for the secondary (usually left) axis. Used for
165
165
  bar / horizontalBar / line / area / combo / waterfall /
166
166
  scatter / heatmap; use null for pie / funnel / treemap / radar.
@@ -169,7 +169,7 @@ export const chartPlanSchema = z.object({
169
169
  .array(z.string())
170
170
  .nullable()
171
171
  .default(null)
172
- .describe(string.toDescription(`
172
+ .describe(stringUtils.toDescription(`
173
173
  Primary category labels. For \`bar\` / \`horizontalBar\` /
174
174
  \`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
175
175
  data point. For \`heatmap\`: x-axis categories. For \`radar\`:
@@ -181,14 +181,14 @@ export const chartPlanSchema = z.object({
181
181
  .array(z.string())
182
182
  .nullable()
183
183
  .default(null)
184
- .describe(string.toDescription(`
184
+ .describe(stringUtils.toDescription(`
185
185
  Y-axis (row) labels for \`heatmap\`. Use null when the
186
186
  row labels come from the series names, which is the preferred
187
187
  way to build a heatmap. Use null for every other chart type.
188
188
  `)),
189
189
  series: z
190
190
  .array(z.object({
191
- name: z.string().describe(string.toDescription(`
191
+ name: z.string().describe(stringUtils.toDescription(`
192
192
  Legend name for this series.
193
193
  `)),
194
194
  type: seriesMarkTypeSchema.nullable().default(null),
@@ -197,7 +197,7 @@ export const chartPlanSchema = z.object({
197
197
  .nullable()
198
198
  .default(null)
199
199
  .describe("Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales; use null otherwise."),
200
- data: z.array(chartDataPointSchema).describe(string.toDescription(`
200
+ data: z.array(chartDataPointSchema).describe(stringUtils.toDescription(`
201
201
  Data points. For category charts (\`bar\` / \`horizontalBar\`
202
202
  / \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
203
203
  an array of numbers aligned to \`categories\`; for
@@ -210,7 +210,7 @@ export const chartPlanSchema = z.object({
210
210
  `)),
211
211
  }))
212
212
  .default([])
213
- .describe(string.toDescription(`
213
+ .describe(stringUtils.toDescription(`
214
214
  One or more series to plot. Required for every chart type
215
215
  except \`custom\`, which carries its series inside \`option\`.
216
216
  Slice charts (\`pie\` / \`funnel\` / \`treemap\`) and
@@ -222,7 +222,7 @@ export const chartPlanSchema = z.object({
222
222
  .string()
223
223
  .nullable()
224
224
  .default(null)
225
- .describe(string.toDescription(`
225
+ .describe(stringUtils.toDescription(`
226
226
  Required for \`custom\`; use null for every other chart type. A
227
227
  COMPLETE Echarts option, as a JSON object encoded in a string:
228
228
  \`series\` (each with its own \`type\` and that series' own data
@@ -242,13 +242,13 @@ export const chartPlanSchema = z.object({
242
242
  * sees a planner request, only the resolved {@link Chart}.
243
243
  */
244
244
  export const chartPlannerRequestSchema = z.object({
245
- title: z.string().describe(string.toDescription(`
245
+ title: z.string().describe(stringUtils.toDescription(`
246
246
  Concise title shown above the chart (e.g. "Top 10 SKUs by Revenue").
247
247
  `)),
248
248
  description: z
249
249
  .string()
250
250
  .optional()
251
- .describe(string.toDescription(`
251
+ .describe(stringUtils.toDescription(`
252
252
  One-line intent the chart-planner uses when picking a chart type
253
253
  and axis encodings (e.g. "compare quarterly revenue across
254
254
  regions", "highlight the steep drop after position 5"). Not shown
@@ -258,7 +258,7 @@ export const chartPlannerRequestSchema = z.object({
258
258
  .array(z.record(z.string(), z.unknown()))
259
259
  .nonempty("Data must contain at least one row")
260
260
  .readonly()
261
- .describe(string.toDescription(`
261
+ .describe(stringUtils.toDescription(`
262
262
  Tabular dataset to chart. One object per row, keyed by column
263
263
  name. Values may be strings, numbers, booleans, or null. The
264
264
  chart-planner decides which columns are categories vs. numeric
@@ -295,7 +295,7 @@ function formatChartTypePicker() {
295
295
  * System prompt for the inner chart-planning agent. Tuned for a
296
296
  * fast-tier model (Haiku, GPT-5-mini, Gemini Flash Lite).
297
297
  */
298
- const CHART_PLANNER_INSTRUCTIONS = string.toDescription(`
298
+ const CHART_PLANNER_INSTRUCTIONS = stringUtils.toDescription(`
299
299
  You design Apache Echarts visualizations. The user gives you a
300
300
  tabular dataset (rows of objects) plus a title and an optional
301
301
  description of the intent. You produce a small chart plan (chart
@@ -394,7 +394,7 @@ function getPlannerAgent(config) {
394
394
  async function runChartPlanner(config, request, options = {}) {
395
395
  const { title, description, data } = request;
396
396
  const { requestContext, abortSignal } = options;
397
- const prompt = string.toDescription({
397
+ const prompt = stringUtils.toDescription({
398
398
  Title: title,
399
399
  ...(description ? { Description: description } : {}),
400
400
  "Dataset (JSON, one row per object)": JSON.stringify(data, null, 2),
@@ -436,7 +436,7 @@ async function writeChart(entry, userKey) {
436
436
  catch (err) {
437
437
  logger.warn("write-error", {
438
438
  chartId: entry.chartId,
439
- error: error.errorMessage(err),
439
+ error: errorUtils.errorMessage(err),
440
440
  });
441
441
  }
442
442
  }
@@ -454,7 +454,7 @@ async function readChart(chartId, userKey) {
454
454
  catch (err) {
455
455
  logger.warn("read-error", {
456
456
  chartId,
457
- error: error.errorMessage(err),
457
+ error: errorUtils.errorMessage(err),
458
458
  });
459
459
  return undefined;
460
460
  }
@@ -481,7 +481,7 @@ export async function prepareChart(opts) {
481
481
  // Fire-and-forget. Failures land in the cache as `error` entries;
482
482
  // never escape into an unhandled rejection.
483
483
  void runPrepareChart(chartId, opts);
484
- return { chartId, marker: marker.formatMarker("chart", chartId) };
484
+ return { chartId, marker: markers.formatMarker("chart", chartId) };
485
485
  }
486
486
  async function runPrepareChart(chartId, opts) {
487
487
  const startedAt = Date.now();
@@ -506,7 +506,7 @@ async function runPrepareChart(chartId, opts) {
506
506
  });
507
507
  }
508
508
  catch (err) {
509
- logger.warn("error", { chartId, error: error.errorMessage(err) });
509
+ logger.warn("error", { chartId, error: errorUtils.errorMessage(err) });
510
510
  // The entry's `error` is rendered in the chat, so only an AppKitError's
511
511
  // own message travels; anything else could carry upstream provider detail.
512
512
  const errText = err instanceof AppKitError ? err.message : CHART_FAILED_MESSAGE;
@@ -544,7 +544,7 @@ export async function fetchChart(chartId, options) {
544
544
  const remaining = deadline - Date.now();
545
545
  if (remaining <= 0)
546
546
  return last;
547
- await async.sleep(Math.min(intervalMs, remaining), options.signal);
547
+ await asyncUtils.sleep(Math.min(intervalMs, remaining), options.signal);
548
548
  }
549
549
  }
550
550
  /**
@@ -981,7 +981,7 @@ export function planToEchartsOption(input, fallbackTitle, brand) {
981
981
  export function buildRenderDataTool(config) {
982
982
  return createTool({
983
983
  id: "render_data",
984
- description: string.toDescription([
984
+ description: stringUtils.toDescription([
985
985
  `
986
986
  Submit a tabular dataset for inline rendering as a chart in
987
987
  the user's view. Pass a title, the raw rows (array of objects
@@ -1025,4 +1025,4 @@ export function buildRenderDataTool(config) {
1025
1025
  },
1026
1026
  });
1027
1027
  }
1028
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixNQUFNLEdBRVAsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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QUM7WUFDaEM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jLFxuICBlcnJvcixcbiAgaGFzaCxcbiAganNvbixcbiAgbG9nLFxuICBvYmplY3QsXG4gIHN0cmluZyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXIsIHdpcmUsIHR5cGUgQ2hhcnQsIHR5cGUgQ2hhcnRSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyByZXNvbHZlVXNlcktleSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2NoYXJ0XCIpO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRUTCBmb3IgY2FjaGVkIGNoYXJ0IGVudHJpZXMuIE9uZSBob3VyIGJhbGFuY2VzIFwibG9uZyBlbm91Z2ggZm9yXG4gKiB0aGUgaG9zdCBVSSB0byBmZXRjaCB0aGUgY2hhcnQgd2VsbCBhZnRlciB0aGUgbW9kZWwgZmluaXNoZWRcbiAqIHRhbGtpbmdcIiBhZ2FpbnN0IFwic2hvcnQgZW5vdWdoIHRoYXQgYWJhbmRvbmVkIGNoYXJ0IGlkcyBkb24ndFxuICogcGluIHN0b3JhZ2VcIi4gTWF0Y2hlcyB0aGUgdHlwaWNhbCBEYXRhYnJpY2tzIE9CTyB0b2tlbiBsaWZldGltZVxuICogc28gYW55IGRhdGEgcmUtcmVzb2x1dGlvbiBzdGF5cyBpbnNpZGUgdGhlIG9yaWdpbmFsIGF1dGggd2luZG93LlxuICovXG5jb25zdCBDSEFSVF9DQUNIRV9UVExfU0VDID0gNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZTsga2VlcHMgdGhlIGNoYXJ0IGtleXNwYWNlIHRpZHkuICovXG5jb25zdCBDSEFSVF9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpjaGFydFwiO1xuXG4vKiogRGVmYXVsdCBzZXJ2ZXItc2lkZSBsb25nLXBvbGwgYnVkZ2V0IGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5cbi8qKiBEZWZhdWx0IGludGVyLXBvbGwgc2xlZXAgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVMgPSAyNTA7XG5cbi8qKiBTdGFibGUgdGV4dCBzdG9yZWQgb24gYSBjaGFydCBlbnRyeSB3aG9zZSBwbGFubmVyIHJ1biBmYWlsZWQuICovXG5jb25zdCBDSEFSVF9GQUlMRURfTUVTU0FHRSA9IFwiQ2hhcnQgZ2VuZXJhdGlvbiBmYWlsZWRcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2hlbWFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgc2VyaWVzIGRhdGEgcG9pbnQuIFdpZGUgdmFyaWFudCBzZXQgc28gdGhlIHBsYW5uZXIgYWdlbnQgY2FuXG4gKiBmYWl0aGZ1bGx5IHBhc3MgdGhyb3VnaCB3aGF0ZXZlciB0aGUgU1FMIHJvdyBzZXQgY29udGFpbmVkXG4gKiAobnVtYmVycywgc3RyaW5naWZpZWQgbnVtYmVycywgbnVsbHMgZm9yIG1pc3NpbmcgbWVhc3VyZW1lbnRzLFxuICogYFt4LCB5XWAgdHVwbGVzIGZvciBzY2F0dGVyLCBgW3gsIHksIHZhbHVlXWAgdHJpcGxlcyBmb3IgaGVhdG1hcCxcbiAqIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXApIHdpdGhvdXQgdGhlXG4gKiBzdHJ1Y3R1cmVkLW91dHB1dCBndWFyZCByZWplY3RpbmcgdGhlIHdob2xlIHBsYW4uXG4gKlxuICogVGhyZWUgbGF5ZXJzIG9mIHRvbGVyYW5jZTpcbiAqXG4gKiAgIDEuIHtAbGluayB6LnByZXByb2Nlc3N9IG5vcm1hbGl6ZXMgd2lyZSBzaGFwZXMgQkVGT1JFIHVuaW9uXG4gKiAgICAgIGRpc3BhdGNoOiBzdHJpbmdpZmllZCBudW1iZXJzIHBhcnNlIHRvIG51bWJlcnMsIGZpbml0ZVxuICogICAgICBjaGVja3MgcmVqZWN0IGBOYU5gIC8gYEluZmluaXR5YCwgMi0vMy1lbGVtZW50IGFycmF5cyBjb2VyY2VcbiAqICAgICAgdHVwbGUgY29tcG9uZW50cywgYW5kIGB7dmFsdWV9YCBvYmplY3RzIHdpdGggbWlzc2luZyAvXG4gKiAgICAgIHN0cmluZ2lmaWVkIGB2YWx1ZWAgZ2V0IGNvZXJjZWQgb3IgcmVqZWN0ZWQgdW5pZm9ybWx5LlxuICogICAgICBBbnl0aGluZyBub3QgaGFuZGxlYWJsZSBiZWNvbWVzIGBudWxsYC5cbiAqICAgMi4gVGhlIHVuaW9uIGFjY2VwdHMgYG51bGxgIGFzIGEgZmlyc3QtY2xhc3MgdmFyaWFudC4gRWNoYXJ0c1xuICogICAgICByZW5kZXJzIG51bGwgYXMgYSBnYXAgb24gYmFyIC8gbGluZSAvIGFyZWEgKHdoaWNoIGlzIHRoZVxuICogICAgICByaWdodCB2aXN1YWwgc2lnbmFsIGZvciBcIm1pc3NpbmcgcmVhZGluZ1wiKS4gU2NhdHRlciwgaGVhdG1hcCxcbiAqICAgICAgYW5kIHNsaWNlIGNoYXJ0cyBmaWx0ZXIgbnVsbHMgaW4ge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259XG4gKiAgICAgIGJlY2F1c2UgRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgdHVwbGVzIC8gc2xpY2VzLlxuICogICAzLiB7QGxpbmsgei51bmlvbiNjYXRjaH0gYmFja3N0b3BzIHRoZSB3aG9sZSB0aGluZzogaWZcbiAqICAgICAgcHJlcHJvY2VzcyBzb21laG93IHByb2R1Y2VzIGEgc2hhcGUgdGhhdCBzdGlsbCBkb2Vzbid0XG4gKiAgICAgIG1hdGNoIGFueSB2YXJpYW50LCB0aGUgYmFkIGl0ZW0gYmVjb21lcyBgbnVsbGAgaW5zdGVhZCBvZlxuICogICAgICB0YWtpbmcgZG93biB0aGUgZW50aXJlIGNoYXJ0IHdpdGggYVxuICogICAgICBgU3RydWN0dXJlZCBvdXRwdXQgdmFsaWRhdGlvbiBmYWlsZWRgIGVycm9yLlxuICovXG5jb25zdCBjaGFydERhdGFQb2ludFNjaGVtYSA9IHpcbiAgLnByZXByb2Nlc3MoXG4gICAgKHYpID0+IHtcbiAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gb2JqZWN0LnRvTnVtYmVyKHYpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBTY2F0dGVyIGBbeCwgeV1gIG9yIGhlYXRtYXAgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYC4gQ29lcmNlXG4gICAgICAvLyBzdHJpbmdpZmllZCBjb21wb25lbnRzOyByZWplY3QgaWYgYW55IGNvbXBvbmVudCBpcyBub24tZmluaXRlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgKHYubGVuZ3RoID09PSAyIHx8IHYubGVuZ3RoID09PSAzKSkge1xuICAgICAgICBjb25zdCBudW1zID0gdi5tYXAoKGMpID0+IG9iamVjdC50b051bWJlcihjKSk7XG4gICAgICAgIHJldHVybiBudW1zLmV2ZXJ5KChuKSA9PiBuICE9PSB1bmRlZmluZWQpID8gbnVtcyA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiBcInZhbHVlXCIgaW4gdikge1xuICAgICAgICBjb25zdCBvYmogPSB2IGFzIHsgbmFtZT86IHVua25vd247IHZhbHVlOiB1bmtub3duIH07XG4gICAgICAgIGNvbnN0IHZhbCA9IG9iamVjdC50b051bWJlcihvYmoudmFsdWUpO1xuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBvciBgW3gsIHksIHZhbHVlXWAgaGVhdG1hcCBjZWxsLiBNb2RlbGxlZCBhcyBhXG4gICAgICAvLyBsZW5ndGgtY29uc3RyYWluZWQgaG9tb2dlbmVvdXMgYXJyYXkgcmF0aGVyIHRoYW4gYHoudHVwbGVgOlxuICAgICAgLy8gWm9kIGVtaXRzIGEgdHVwbGUgYXMgSlNPTiBTY2hlbWEgMjAyMC0xMiBgcHJlZml4SXRlbXNgLCBhbmRcbiAgICAgIC8vIERhdGFicmlja3MnIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IGEgYHJlc3BvbnNlX2pzb25fc2NoZW1hYFxuICAgICAgLy8gY29udGFpbmluZyBpdCAoXCJtdXN0IGJlIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIiwgc2luY2VcbiAgICAgIC8vIGBpdGVtc2AgaXMgYWJzZW50KS4gYG1pbkl0ZW1zYCAvIGBtYXhJdGVtc2AgKyBgaXRlbXNgIGlzIHdoYXRcbiAgICAgIC8vIGV2ZXJ5IHByb3ZpZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgei5hcnJheSh6Lm51bWJlcigpKS5taW4oMikubWF4KDMpLFxuICAgICAgei5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLCB2YWx1ZTogei5udW1iZXIoKSB9KSxcbiAgICBdKSxcbiAgKVxuICAuY2F0Y2gobnVsbCk7XG5cbi8qKiBQZXItc2VyaWVzIG1hcmsgdHlwZSB1c2VkIGJ5IGBjb21ib2AgY2hhcnRzIChiYXIgKyBsaW5lIG92ZXJsYXkpLiAqL1xuY29uc3Qgc2VyaWVzTWFya1R5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbei5saXRlcmFsKFwiYmFyXCIpLCB6LmxpdGVyYWwoXCJsaW5lXCIpLCB6LmxpdGVyYWwoXCJhcmVhXCIpXSlcbiAgLmRlc2NyaWJlKFxuICAgIFwiTWFyayB0eXBlIGZvciB0aGlzIHNlcmllcy4gUmVxdWlyZWQgZm9yIGBjb21ib2AgKG1peCBiYXIgYW5kIGxpbmUvYXJlYSk7IHVzZSBudWxsIGZvciBvdGhlciBjaGFydCB0eXBlcy5cIixcbiAgKTtcblxuLyoqXG4gKiBDb21wYWN0LCBtb2RlbC1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiBhbiBFY2hhcnRzIHNwZWMuIFRoZVxuICogcGxhbm5lciBhZ2VudCBlbWl0cyB0aGlzOyB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0gZXhwYW5kcyBpdFxuICogaW50byBhIHJlYWwgYEVDaGFydHNPcHRpb25gIEpTT04uIFR3byBsYXllcnMgYmVjYXVzZSBsZXR0aW5nIHRoZVxuICogbW9kZWwgZmlsbCBpbiBhIGZ1bGx5LXR5cGVkIGBFQ2hhcnRzT3B0aW9uYCBpcyBicml0dGxlIChodW5kcmVkc1xuICogb2Ygb3B0aW9uYWwgZmllbGRzLCBkZWVwIHVuaW9ucywgdmVyc2lvbi1kZXBlbmRlbnQgc2hhcGVzKS4gQVxuICogc21hbGwgXCJjaGFydCBwbGFuXCIgc2NoZW1hIGlzIG11Y2ggbW9yZSByZWxpYWJsZSBmb3IgYSBmYXN0IG1vZGVsXG4gKiBhbmQga2VlcHMgYW5pbWF0aW9uIC8gdG9vbHRpcCAvIHN0eWxpbmcgZGVmYXVsdHMgY29uc2lzdGVudFxuICogYWNyb3NzIGNoYXJ0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY2hhcnRUeXBlOiB3aXJlLkNoYXJ0VHlwZVNjaGVtYSxcbiAgdGl0bGU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCBmb3IgdGhlIHByaW1hcnkgKHVzdWFsbHkgYm90dG9tIC8gdmFsdWUpIGF4aXMuXG4gICAgICAgIFVzZWQgZm9yIGJhciAvIGhvcml6b250YWxCYXIgLyBsaW5lIC8gYXJlYSAvIGNvbWJvIC8gd2F0ZXJmYWxsXG4gICAgICAgIC8gc2NhdHRlciAvIGhlYXRtYXA7IHVzZSBudWxsIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwIC8gcmFkYXIuXG4gICAgICBgKSxcbiAgICApLFxuICB5QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCBmb3IgdGhlIHNlY29uZGFyeSAodXN1YWxseSBsZWZ0KSBheGlzLiBVc2VkIGZvclxuICAgICAgICBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbCAvXG4gICAgICAgIHNjYXR0ZXIgLyBoZWF0bWFwOyB1c2UgbnVsbCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBZLWF4aXMgKHJvdykgbGFiZWxzIGZvciBcXGBoZWF0bWFwXFxgLiBVc2UgbnVsbCB3aGVuIHRoZVxuICAgICAgICByb3cgbGFiZWxzIGNvbWUgZnJvbSB0aGUgc2VyaWVzIG5hbWVzLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkXG4gICAgICAgIHdheSB0byBidWlsZCBhIGhlYXRtYXAuIFVzZSBudWxsIGZvciBldmVyeSBvdGhlciBjaGFydCB0eXBlLlxuICAgICAgYCksXG4gICAgKSxcbiAgc2VyaWVzOiB6XG4gICAgLmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIExlZ2VuZCBuYW1lIGZvciB0aGlzIHNlcmllcy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogc2VyaWVzTWFya1R5cGVTY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICAgICAgICB5QXhpc0luZGV4OiB6XG4gICAgICAgICAgLnVuaW9uKFt6LmxpdGVyYWwoMCksIHoubGl0ZXJhbCgxKV0pXG4gICAgICAgICAgLm51bGxhYmxlKClcbiAgICAgICAgICAuZGVmYXVsdChudWxsKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXM7IHVzZSBudWxsIG90aGVyd2lzZS5cIixcbiAgICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZSBvciBtb3JlIHNlcmllcyB0byBwbG90LiBSZXF1aXJlZCBmb3IgZXZlcnkgY2hhcnQgdHlwZVxuICAgICAgICBleGNlcHQgXFxgY3VzdG9tXFxgLCB3aGljaCBjYXJyaWVzIGl0cyBzZXJpZXMgaW5zaWRlIFxcYG9wdGlvblxcYC5cbiAgICAgICAgU2xpY2UgY2hhcnRzIChcXGBwaWVcXGAgLyBcXGBmdW5uZWxcXGAgLyBcXGB0cmVlbWFwXFxgKSBhbmRcbiAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIC8gXFxgaGVhdG1hcFxcYCB1c2UgZXhhY3RseSBvbmUgc2VyaWVzOyBcXGBiYXJcXGAgL1xuICAgICAgICBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgcmFkYXJcXGAgLyBcXGBzY2F0dGVyXFxgIGNhblxuICAgICAgICBjYXJyeSBtdWx0aXBsZSBzZXJpZXMuXG4gICAgICBgKSxcbiAgICApLFxuICBvcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBSZXF1aXJlZCBmb3IgXFxgY3VzdG9tXFxgOyB1c2UgbnVsbCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS4gQVxuICAgICAgICBDT01QTEVURSBFY2hhcnRzIG9wdGlvbiwgYXMgYSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc3RyaW5nOlxuICAgICAgICBcXGBzZXJpZXNcXGAgKGVhY2ggd2l0aCBpdHMgb3duIFxcYHR5cGVcXGAgYW5kIHRoYXQgc2VyaWVzJyBvd24gZGF0YVxuICAgICAgICBzaGFwZSkgcGx1cyB3aGF0ZXZlciBlbHNlIHRoZSBjaGFydCBuZWVkcyAtIGEgY29vcmRpbmF0ZSBzeXN0ZW0sXG4gICAgICAgIFxcYHZpc3VhbE1hcFxcYCwgYXhlcy4gUGxhaW4gSlNPTiB2YWx1ZXMgb25seSwgbmV2ZXIgYSBKYXZhU2NyaXB0XG4gICAgICAgIGZ1bmN0aW9uLiBBIGNlbnRlcmVkIHRpdGxlIGlzIGZpbGxlZCBpbiB3aGVuIHRoZSBvYmplY3Qgb21pdHNcbiAgICAgICAgb25lLlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG50eXBlIENoYXJ0UGxhbiA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG50eXBlIENoYXJ0UGxhbklucHV0ID0gei5pbnB1dDx0eXBlb2YgY2hhcnRQbGFuU2NoZW1hPjtcblxuLyoqXG4gKiBDYW5vbmljYWwgcGxhbm5lciBpbnB1dCBzaGFwZS4gVG9vbHMgdGhhdCBzb3VyY2Ugcm93cyBmcm9tIGFuXG4gKiBpbmxpbmUgZGF0YXNldCAoYHJlbmRlcl9kYXRhYCkgdXNlIGl0IGFzIHRoZWlyIGBpbnB1dFNjaGVtYWBcbiAqIHZlcmJhdGltOyB0b29scyB0aGF0IHJlc29sdmUgcm93cyBmcm9tIGEgcmVtb3RlIChgcHJlcGFyZV9jaGFydGBcbiAqIG92ZXIgYSBHZW5pZSBzdGF0ZW1lbnQpIGBvbWl0KHsgZGF0YSB9KWAgYW5kIGBleHRlbmRgIHdpdGggdGhlaXJcbiAqIG93biBpZGVudGlmaWVyIGZpZWxkLCBzbyB0aGUgZmllbGQtbGV2ZWwgYC5kZXNjcmliZSgpYCB0ZXh0XG4gKiBzdGF5cyBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFNlcnZlci1vbmx5IC0gdGhlIFVJIG5ldmVyXG4gKiBzZWVzIGEgcGxhbm5lciByZXF1ZXN0LCBvbmx5IHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9LlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lLWxpbmUgaW50ZW50IHRoZSBjaGFydC1wbGFubmVyIHVzZXMgd2hlbiBwaWNraW5nIGEgY2hhcnQgdHlwZVxuICAgICAgICBhbmQgYXhpcyBlbmNvZGluZ3MgKGUuZy4gXCJjb21wYXJlIHF1YXJ0ZXJseSByZXZlbnVlIGFjcm9zc1xuICAgICAgICByZWdpb25zXCIsIFwiaGlnaGxpZ2h0IHRoZSBzdGVlcCBkcm9wIGFmdGVyIHBvc2l0aW9uIDVcIikuIE5vdCBzaG93blxuICAgICAgICB0byB0aGUgdXNlci5cbiAgICAgIGApLFxuICAgICksXG4gIGRhdGE6IHpcbiAgICAuYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKVxuICAgIC5ub25lbXB0eShcIkRhdGEgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSByb3dcIilcbiAgICAucmVhZG9ubHkoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgVGFidWxhciBkYXRhc2V0IHRvIGNoYXJ0LiBPbmUgb2JqZWN0IHBlciByb3csIGtleWVkIGJ5IGNvbHVtblxuICAgICAgICBuYW1lLiBWYWx1ZXMgbWF5IGJlIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBudWxsLiBUaGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciBkZWNpZGVzIHdoaWNoIGNvbHVtbnMgYXJlIGNhdGVnb3JpZXMgdnMuIG51bWVyaWNcbiAgICAgICAgc2VyaWVzLiBDYXAgYXQgYSBmZXcgaHVuZHJlZCByb3dzIGZvciBsZWdpYmlsaXR5OyBzYW1wbGUgL1xuICAgICAgICBhZ2dyZWdhdGUgbGFyZ2VyIGRhdGFzZXRzIGZpcnN0LlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBDaGFydFBsYW5uZXJSZXF1ZXN0ID0gei5pbmZlcjx0eXBlb2YgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYT47XG5cbi8qKlxuICogQWdlbnQtZmFjaW5nIHJlc3VsdCBvZiBlaXRoZXIgY2hhcnQtcHJvZHVjaW5nIHRvb2wuXG4gKlxuICogYG1hcmtlcmAgaXMgZGVsaWJlcmF0ZWx5IHJlZHVuZGFudCB3aXRoIGBjaGFydElkYDogdGhlIGhvc3Qgc3RpbGwga2V5cyB0aGVcbiAqIGNhY2hlIGJ5IGlkLCB3aGlsZSB0aGUgbW9kZWwgZ2V0cyB0aGUgZXhhY3Qgb3BhcXVlIHRva2VuIHRvIGNvcHkgaW50byBwcm9zZVxuICogYW5kIGhhcyBubyByZWFzb24gdG8gaW52ZW50IG9yIHJldHlwZSBhIFVVSUQuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgPSB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLmV4dGVuZCh7XG4gIG1hcmtlcjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRXhhY3QgZW1iZWQgbWFya2VyLiBDb3B5IHRoaXMgY29tcGxldGUgdmFsdWUgdmVyYmF0aW0gb250byBpdHMgb3duIGxpbmU7IG5ldmVyIGNvbnN0cnVjdCBhIG1hcmtlciBmcm9tIGNoYXJ0SWQuXCIsXG4gICAgKSxcbn0pO1xuXG4vKiogUmVzdWx0IHJldHVybmVkIHN5bmNocm9ub3VzbHkgd2hpbGUgY2hhcnQgcGxhbm5pbmcgY29udGludWVzIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuZXhwb3J0IHR5cGUgQ2hhcnRUb29sT3V0cHV0ID0gei5pbmZlcjx0eXBlb2YgY2hhcnRUb29sT3V0cHV0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEZvcm1hdCB7QGxpbmsgd2lyZS5DaGFydFR5cGVTY2hlbWF9J3MgdmFyaWFudHMgYXMgYSBzaW5nbGVcbiAqIGh1bWFuLWZyaWVuZGx5IHN0cmluZyBvZiBgYCBgPHZhbHVlPmAgZm9yIDxkZXNjcmlwdGlvbj4gYGBcbiAqIGNsYXVzZXMgam9pbmVkIGJ5IHNlbWljb2xvbnMsIGRyYXduIGZyb20gZWFjaCB2YXJpYW50J3Mgb3duXG4gKiBgLmRlc2NyaWJlKClgIHNvIHRoZSBwbGFubmVyIHByb21wdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aFxuICogdGhlIHNjaGVtYSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VHlwZVBpY2tlcigpOiBzdHJpbmcge1xuICByZXR1cm4gd2lyZS5DaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIFByZWZlciBcXGBob3Jpem9udGFsQmFyXFxgIHdoZW4gY2F0ZWdvcnkgbGFiZWxzIGFyZSBsb25nLiBQcmVmZXJcbiAgXFxgY29tYm9cXGAgd2hlbiBvbmUgbWVhc3VyZSBpcyBhIGNvdW50L3ZvbHVtZSBhbmQgYW5vdGhlciBpcyBhXG4gIHJhdGUvdHJlbmQuIFByZWZlciBcXGB3YXRlcmZhbGxcXGAgZm9yIGJyaWRnZXMgb2Ygc2lnbmVkIGRlbHRhcy5cbiAgUHJlZmVyIFxcYHNjYXR0ZXJcXGAgd2hlbiBjb3JyZWxhdGluZyB0d28gbnVtZXJpYyBmaWVsZHMgKG5vXG4gIGNhdGVnb3J5IGF4aXMpLiBQcmVmZXIgXFxgaGVhdG1hcFxcYCBmb3IgYSBjYXRlZ29yeSB4IGNhdGVnb3J5XG4gIG1hdHJpeC4gUHJlZmVyIFxcYHJhZGFyXFxgIGZvciBzY29yaW5nIHRoZSBzYW1lIGVudGl0aWVzIGFjcm9zcyBhXG4gIGZpeGVkIHNldCBvZiBkaW1lbnNpb25zLiBOZXZlciBwaWNrIHBpZSBmb3IgbW9yZSB0aGFuIDcgc2xpY2VzXG4gICh1c2UgXFxgdHJlZW1hcFxcYCBpbnN0ZWFkKS4gUHJlZmVyIFxcYGZ1bm5lbFxcYCBmb3Igb3JkZXJlZCBjb252ZXJzaW9uXG4gIHN0YWdlcy5cblxuICBGb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGw6IHBpY2sgb25lXG4gIGNvbHVtbiBhcyB0aGUgY2F0ZWdvcnkgYXhpcyAodXN1YWxseSB0aGUgb25seSBzdHJpbmctdmFsdWVkIGNvbHVtbilcbiAgYW5kIG9uZSBvciBtb3JlIG51bWVyaWMgY29sdW1ucyBhcyBzZXJpZXMuIFNvcnQgY2F0ZWdvcmllcyBieSB0aGVcbiAgcHJpbWFyeSBzZXJpZXMgdmFsdWUgZGVzY2VuZGluZyB1bmxlc3MgdGhlIGRhdGEgaXMgbmF0dXJhbGx5IG9yZGVyZWRcbiAgKGRhdGVzLCByYW5rcywgZnVubmVsIHN0YWdlcywgd2F0ZXJmYWxsIHN0ZXBzKS4gRm9yIFxcYGNvbWJvXFxgLCBzZXRcbiAgZWFjaCBzZXJpZXMnIFxcYHR5cGVcXGAgdG8gXFxgYmFyXFxgLCBcXGBsaW5lXFxgLCBvciBcXGBhcmVhXFxgLCBhbmQgdXNlXG4gIFxcYHlBeGlzSW5kZXg6IDFcXGAgd2hlbiBhIHNlcmllcyBuZWVkcyBhIHNlY29uZCBzY2FsZS5cblxuICBGb3Igd2F0ZXJmYWxsLCBlbWl0IGV4YWN0bHkgT05FIHNlcmllcyBob2xkaW5nIHRoZSBzaWduZWQgc3RlcCB2YWx1ZXNcbiAgKGRlbHRhcyksIG9uZSBwZXIgY2F0ZWdvcnksIGluIG9yZGVyIC0gcG9zaXRpdmUgZm9yIGEgcmlzZSwgbmVnYXRpdmVcbiAgZm9yIGEgZHJvcC4gRG8gTk9UIGFkZCBhIGN1bXVsYXRpdmUgLyBydW5uaW5nLXRvdGFsIC8gYmFzZSBzZXJpZXMgYW5kXG4gIGRvIE5PVCBjb252ZXJ0IHRoZSBkZWx0YXMgaW50byBydW5uaW5nIHRvdGFscyB5b3Vyc2VsZjsgdGhlIHJ1bm5pbmdcbiAgdG90YWwgaXMgY29tcHV0ZWQgZm9yIHlvdSwgYW5kIGEgaGFuZC1idWlsdCBiYXNlIHNlcmllcyByZW5kZXJzIGFzIGFcbiAgcGxhaW4gYmFyIGNoYXJ0IGluc3RlYWQgb2YgYSBicmlkZ2UuXG5cbiAgRm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXA6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXNcbiAgYW5kIG9uZSBudW1lcmljIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcyBvZlxuICBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG5cbiAgRm9yIHNjYXR0ZXI6IHBpY2sgdHdvIG51bWVyaWMgY29sdW1ucyBhbmQgZW1pdCBcXGBbeCwgeV1cXGAgdHVwbGVzIGluXG4gIG9uZSBvciBtb3JlIHNlcmllcyAob25lIHNlcmllcyBwZXIgZ3JvdXAgaWYgYSBncm91cGluZyBjb2x1bW4gZXhpc3RzKS5cblxuICBGb3IgaGVhdG1hcDogcGljayB0d28gY2F0ZWdvcnkgY29sdW1ucyBhbmQgb25lIG51bWVyaWMgbWVhc3VyZS4gUHV0XG4gIHRoZSB4LWF4aXMgY2F0ZWdvcmllcyBpbiBcXGBjYXRlZ29yaWVzXFxgLCB0aGVuIGVtaXQgT05FIFNFUklFUyBQRVIgUk9XXG4gIG9mIHRoZSBtYXRyaXggLSB0aGUgc2VyaWVzIFxcYG5hbWVcXGAgaXMgdGhlIHJvdyBsYWJlbCBhbmQgXFxgZGF0YVxcYCBpc1xuICB0aGUgcm93J3MgbnVtYmVycywgb25lIHBlciBlbnRyeSBpbiBcXGBjYXRlZ29yaWVzXFxgLCBpbiB0aGUgc2FtZSBvcmRlci5cbiAgRG8gbm90IGNvbXB1dGUgY2VsbCBpbmRpY2VzLlxuXG4gIEZvciByYWRhcjogXFxgY2F0ZWdvcmllc1xcYCBhcmUgdGhlIGluZGljYXRvciBuYW1lczsgZWFjaCBzZXJpZXMgaXMgYW5cbiAgYXJyYXkgb2YgbnVtYmVycyAob25lIHZhbHVlIHBlciBpbmRpY2F0b3IpLlxuXG4gIEZvciBhbnl0aGluZyB0aGUgdHlwZXMgYWJvdmUgY2Fubm90IGV4cHJlc3MgLSBhIHNhbmtleSwgYm94cGxvdCxcbiAgY2FuZGxlc3RpY2ssIHN1bmJ1cnN0LCBnYXVnZSwgbmV0d29yayBncmFwaCwgY2FsZW5kYXIsIHBhcmFsbGVsLVxuICBjb29yZGluYXRlcyBwbG90LCBvciBhbnkgb3RoZXIgRWNoYXJ0cyBzZXJpZXMgLSB1c2UgXFxgY3VzdG9tXFxgIGFuZFxuICBoYW5kLXdyaXRlIHRoZSB3aG9sZSBFY2hhcnRzIG9wdGlvbiBpbnRvIFxcYG9wdGlvblxcYCBhcyBhIEpTT04gc3RyaW5nLlxuICBJbmNsdWRlIGV2ZXJ5IHBhcnQgdGhhdCBjaGFydCBuZWVkczogdGhlIHNlcmllcyB3aXRoIHRoZWlyIG93blxuICBcXGB0eXBlXFxgIGFuZCBkYXRhIHNoYXBlLCBwbHVzIGFueSBjb29yZGluYXRlIHN5c3RlbSwgXFxgdmlzdWFsTWFwXFxgLFxuICBvciBheGVzLiBMZWF2ZSBcXGBzZXJpZXNcXGAsIFxcYGNhdGVnb3JpZXNcXGAsIGFuZCB0aGUgYXhpcyBsYWJlbHMgb3V0O1xuICB0aGV5IGFyZSBpZ25vcmVkIGZvciBcXGBjdXN0b21cXGAuIFByZWZlciBhIGxpc3RlZCB0eXBlIHdoZW5ldmVyIG9uZVxuICBnZW51aW5lbHkgZml0cyAtIFxcYGN1c3RvbVxcYCBnaXZlcyB1cCB0aGUgc2hhcmVkIHRvb2x0aXAsIGxlZ2VuZCwgYW5kXG4gIGdyaWQgZGVmYXVsdHMsIHNvIGl0IGlzIHRoZSBhbnN3ZXIgZm9yIGFuIHVuc3VwcG9ydGVkIGNoYXJ0IHNoYXBlLFxuICBub3QgYSB3YXkgdG8gcmVzdHlsZSBhIHN1cHBvcnRlZCBvbmUuXG5cbiAgS2VlcCBzZXJpZXMgbmFtZXMgaHVtYW4tcmVhZGFibGUgKHVzZSB0aGUgY29sdW1uIG5hbWU7IHRpdGxlIGNhc2UgaXRcbiAgbGlnaHRseSBpZiBuZWVkZWQpLiBLZWVwIHRpdGxlcyBjb25jaXNlOyBkbyBub3QgcmVwZWF0IHRoZSB1c2VyJ3NcbiAgdGl0bGUgaW4geEF4aXNMYWJlbCAvIHlBeGlzTGFiZWwuXG5gKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBhZ2VudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBwbGFubmVyIGBBZ2VudGAgcGVyIHBsdWdpbiBjb25maWcuIENhY2hlZCBvbiBjb25maWcgb2JqZWN0XG4gKiBpZGVudGl0eSBzbyBjYWxsZXJzIGNhbiBgcHJlcGFyZUNoYXJ0KHsgY29uZmlnLCAuLi4gfSlgIGZyb20gYVxuICogaG90IHBhdGggd2l0aG91dCBwYXlpbmcgdGhlIEFnZW50LWNvbnN0cnVjdG9yIGNvc3QgZXZlcnkgY2FsbC5cbiAqIGBXZWFrTWFwYCBsZXRzIHJldGlyZWQgY29uZmlncyAoZS5nLiB0ZXN0IHJlY29uZmlndXJhdGlvbnMpXG4gKiByZWxlYXNlIHRoZWlyIGFnZW50IHdpdGhvdXQgbWFudWFsIGV2aWN0aW9uLlxuICovXG5jb25zdCBwbGFubmVyQWdlbnRzID0gbmV3IFdlYWtNYXA8TWFzdHJhUGx1Z2luQ29uZmlnLCBBZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0UGxhbm5lckFnZW50KGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQWdlbnQge1xuICBsZXQgYWdlbnQgPSBwbGFubmVyQWdlbnRzLmdldChjb25maWcpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQ6IFwiY2hhcnRfcGxhbm5lclwiLFxuICAgICAgbmFtZTogXCJDaGFydCBQbGFubmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQaWNrcyBjaGFydCB0eXBlIGFuZCBheGlzIGVuY29kaW5ncyBmb3IgYSBkYXRhc2V0LlwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyxcbiAgICAgIG1vZGVsOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxDbGFzczogbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdCB9KSxcbiAgICB9KTtcbiAgICBwbGFubmVyQWdlbnRzLnNldChjb25maWcsIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKlxuICogUnVuIHRoZSBwbGFubmVyIGFnYWluc3QgYHJlcXVlc3RgIGFuZCByZXR1cm4gdGhlIHJlc29sdmVkXG4gKiBFY2hhcnRzIHNwZWMuIFRocm93cyBvbiBwbGFubmVyIGZhaWx1cmUgLSB7QGxpbmsgcHJlcGFyZUNoYXJ0fVxuICogY2F0Y2hlcyBhbmQgc3Rhc2hlcyB0aGUgZXJyb3IgaW4gdGhlIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5DaGFydFBsYW5uZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0OiBDaGFydFBsYW5uZXJSZXF1ZXN0LFxuICBvcHRpb25zOiB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuKTogUHJvbWlzZTxDaGFydFJlc3VsdD4ge1xuICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gcmVxdWVzdDtcbiAgY29uc3QgeyByZXF1ZXN0Q29udGV4dCwgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb21wdCA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKHtcbiAgICBUaXRsZTogdGl0bGUsXG4gICAgLi4uKGRlc2NyaXB0aW9uID8geyBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICBcIkRhdGFzZXQgKEpTT04sIG9uZSByb3cgcGVyIG9iamVjdClcIjogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRQbGFubmVyQWdlbnQoY29uZmlnKS5nZW5lcmF0ZShwcm9tcHQsIHtcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB7IHNjaGVtYTogY2hhcnRQbGFuU2NoZW1hIH0sXG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UocmVzdWx0Lm9iamVjdCk7XG4gIGNvbnN0IG9wdGlvbiA9IHBsYW5Ub0VjaGFydHNPcHRpb24ocGxhbiwgdGl0bGUsIGNvbmZpZy5icmFuZCk7XG4gIHJldHVybiB7IGNoYXJ0VHlwZTogcGxhbi5jaGFydFR5cGUsIG9wdGlvbiB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgY2hhcnRJZGAgb3duZWQgYnkgYHVzZXJLZXlgLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXksIG5vdCBhIGZpbHRlciBhcHBsaWVkIGFmdGVyIHRoZSByZWFkLCBzbyBhXG4gKiBjaGFydCBpZCBndWVzc2VkIG9yIGNvcGllZCBmcm9tIGFub3RoZXIgdXNlcidzIHRyYW5zY3JpcHQgcmVzb2x2ZXMgdG8gYVxuICogZGlmZmVyZW50IGtleSBhbmQgc2ltcGx5IG1pc3Nlcy4gVGhhdCBtaXNzIGlzIHdoYXQgdGhlIEhUVFAgcm91dGUgdHVybnMgaW50b1xuICogYSA0MDQsIHdoaWNoIGlzIGFsc28gdGhlIGFuc3dlciB0aGF0IGxlYWtzIHRoZSBsZWFzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hhcnRDYWNoZUtleShjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFtDSEFSVF9DQUNIRV9OQU1FU1BBQ0UsIGNoYXJ0SWRdLCB1c2VyS2V5KTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEge0BsaW5rIENoYXJ0fSBlbnRyeSB1bmRlciBpdHMgYGNoYXJ0SWRgLCBvd25lZCBieSBgdXNlcktleWAuXG4gKiBSZWZyZXNoZXMgdGhlIFRUTCBvbiBldmVyeSB3cml0ZS4gQ2FjaGUtbGF5ZXIgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhbmRcbiAqIHN3YWxsb3dlZCBzbyBiYWNrZ3JvdW5kIHJ1bm5lcnMgbmV2ZXIgdGhyb3cgaW50byB0aGVcbiAqIHVuaGFuZGxlZC1yZWplY3Rpb24gc3RyZWFtLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KGVudHJ5OiBDaGFydCwgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShlbnRyeS5jaGFydElkLCB1c2VyS2V5KTtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGtleSwgZW50cnksIHtcbiAgICAgIHR0bDogQ0hBUlRfQ0FDSEVfVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJ3cml0ZS1lcnJvclwiLCB7XG4gICAgICBjaGFydElkOiBlbnRyeS5jaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTG9vayB1cCBhIGNoYXJ0IGB1c2VyS2V5YCBvd25zLiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uXG4gKiBleHBpcnksIHdoZW4gYW5vdGhlciBpZGVudGl0eSBvd25zIHRoZSBpZCwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXIgaXNcbiAqIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZCwgdXNlcktleSk7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8Q2hhcnQ+KGtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcInJlYWQtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGhhc2guaWQoKTtcbiAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQgfSwgb3B0cy51c2VyS2V5KTtcbiAgbG9nZ2VyLmRlYnVnKFwicXVldWVkXCIsIHsgY2hhcnRJZCB9KTtcbiAgLy8gRmlyZS1hbmQtZm9yZ2V0LiBGYWlsdXJlcyBsYW5kIGluIHRoZSBjYWNoZSBhcyBgZXJyb3JgIGVudHJpZXM7XG4gIC8vIG5ldmVyIGVzY2FwZSBpbnRvIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gIHZvaWQgcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQsIG9wdHMpO1xuICByZXR1cm4geyBjaGFydElkLCBtYXJrZXI6IG1hcmtlci5mb3JtYXRNYXJrZXIoXCJjaGFydFwiLCBjaGFydElkKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCBvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG9wdHMucmVzb2x2ZURhdGEob3B0cy5zaWduYWwpO1xuICAgIGlmIChkYXRhLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJEYXRhc2V0IGhhcyBubyByb3dzOyBub3RoaW5nIHRvIGNoYXJ0XCIpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5DaGFydFBsYW5uZXIoXG4gICAgICBvcHRzLmNvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6IG9wdHMudGl0bGUgPz8gXCJDaGFydFwiLFxuICAgICAgICAuLi4ob3B0cy5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgZGF0YTogZGF0YS5yb3dzIGFzIENoYXJ0UGxhbm5lclJlcXVlc3RbXCJkYXRhXCJdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uKG9wdHMucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBvcHRzLnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIHJlc3VsdCB9LCBvcHRzLnVzZXJLZXkpO1xuICAgIGxvZ2dlci5pbmZvKFwiZG9uZVwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgY2hhcnRUeXBlOiByZXN1bHQuY2hhcnRUeXBlLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImVycm9yXCIsIHsgY2hhcnRJZCwgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIC8vIFRoZSBlbnRyeSdzIGBlcnJvcmAgaXMgcmVuZGVyZWQgaW4gdGhlIGNoYXQsIHNvIG9ubHkgYW4gQXBwS2l0RXJyb3Inc1xuICAgIC8vIG93biBtZXNzYWdlIHRyYXZlbHM7IGFueXRoaW5nIGVsc2UgY291bGQgY2FycnkgdXBzdHJlYW0gcHJvdmlkZXIgZGV0YWlsLlxuICAgIGNvbnN0IGVyclRleHQgPSBlcnIgaW5zdGFuY2VvZiBBcHBLaXRFcnJvciA/IGVyci5tZXNzYWdlIDogQ0hBUlRfRkFJTEVEX01FU1NBR0U7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIGVycm9yOiBlcnJUZXh0IH0sIG9wdHMudXNlcktleSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nLXBvbGwgZmV0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hDaGFydE9wdGlvbnMge1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhlIGNoYXJ0IG11c3QgYmVsb25nIHRvLiBBIGNoYXJ0IG1pbnRlZCB1bmRlciBhIGRpZmZlcmVudCBrZXlcbiAgICogaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiB1bmtub3duIGlkLiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIHBvbGxpbmcgYnVkZ2V0IGluIG1zLiBXaGVuIHRoZSBlbnRyeSBzdGF5cyBpblxuICAgKiB0aGUgcHJvY2Vzc2luZyBzdGF0ZSBwYXN0IHRoaXMgd2luZG93LCB0aGUgaGVscGVyIHJldHVybnMgdGhlXG4gICAqIGxhc3Qgc2VlbiB2YWx1ZSAoc3RpbGwgcHJvY2Vzc2luZykgc28gdGhlIGNsaWVudCBjYW4gcmUtcG9sbC5cbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NU30gKDYwcykuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQb2xsIGludGVydmFsIGluIG1zLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NU30gKDI1MG1zKS5cbiAgICovXG4gIGludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24gaGFuZGxlIChlLmcuIHJlcXVlc3QgYHJlcS5zaWduYWxgKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTG9uZy1wb2xsIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnkgc2V0dGxlcyAoYHJlc3VsdGAgb3JcbiAqIGBlcnJvcmAgc2V0KSwgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIG9yIHRoZSBzZXJ2ZXItc2lkZSB0aW1lb3V0XG4gKiBlbGFwc2VzLlxuICpcbiAqIFJldHVybnM6XG4gKiAgIC0gdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0gd2hlbiBpdCBzZXR0bGVkLCBlcnJvcmVkLCBvclxuICogICAgIHN0YXllZCBpbiBwcm9jZXNzaW5nIHBhc3QgYHRpbWVvdXRNc2AgKHNvIHRoZSBjbGllbnQgY2FuXG4gKiAgICAgcmUtcG9sbCk7XG4gKiAgIC0gYHVuZGVmaW5lZGAgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZywgZXhwaXJlZCwgb3Igb3duZWQgYnlcbiAqICAgICBhbm90aGVyIGlkZW50aXR5ICh0aGUgY29uc3VtZXIgc2hvdWxkIHRyZWF0IGFzIDQwNCkuXG4gKlxuICogYHNpZ25hbGAgbGV0cyB0aGUgY2FsbGVyIGNhbmNlbCBhaGVhZCBvZiB0aW1lb3V0IChlLmcuIHRoZSBIVFRQXG4gKiByZXF1ZXN0IGNsb3NlZCkuIENhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBpbnRlci1wb2xsIHNsZWVwXG4gKiBzbyB0aGUgaGVscGVyIHJldHVybnMgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENoYXJ0KFxuICBjaGFydElkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEZldGNoQ2hhcnRPcHRpb25zLFxuKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVM7XG4gIGNvbnN0IGludGVydmFsTXMgPSBvcHRpb25zLmludGVydmFsTXMgPz8gREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUztcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuXG4gIGxldCBsYXN0OiBDaGFydCB8IHVuZGVmaW5lZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBsYXN0ID0gYXdhaXQgcmVhZENoYXJ0KGNoYXJ0SWQsIG9wdGlvbnMudXNlcktleSk7XG4gICAgaWYgKCFsYXN0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChsYXN0LnJlc3VsdCAhPT0gdW5kZWZpbmVkIHx8IGxhc3QuZXJyb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGxhc3Q7XG4gICAgY29uc3QgcmVtYWluaW5nID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpO1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCkgcmV0dXJuIGxhc3Q7XG4gICAgYXdhaXQgYXN5bmMuc2xlZXAoTWF0aC5taW4oaW50ZXJ2YWxNcywgcmVtYWluaW5nKSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgdGhlbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYW4gRWNoYXJ0cyBvcHRpb24gdGhhdCBjYXJyaWVzIGJyYW5kIGlkZW50aXR5OiB0aGUgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgdGhlIGJhc2UgZm9udCBzdGFjay4gRGVyaXZlZCBmcm9tIGEge0BsaW5rIEJyYW5kQ29udGV4dH1cbiAqIGJ5IHtAbGluayBicmFuZENoYXJ0VGhlbWV9IGFuZCBtZXJnZWQgaW50byBldmVyeSBzcGVjIGJ5XG4gKiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gdGV4dCBDT0xPUi4gQSBzcGVjIGlzIHBsYW5uZWQgaGVyZSwgb24gdGhlXG4gKiBzZXJ2ZXIsIGFuZCByZWFkIGxhdGVyIGluIGEgYnJvd3NlciB3aG9zZSBsaWdodC9kYXJrIHRoZW1lIHRoaXMgY29kZVxuICogY2Fubm90IGtub3c7IGJha2luZyBpbiB0aGUgYnJhbmQncyBzaW5nbGUgKGxpZ2h0KSBmb3JlZ3JvdW5kIHByb2R1Y2VkXG4gKiBuZWFyLWJsYWNrIGxhYmVscyB0aGF0IGRpc2FwcGVhcmVkIGFnYWluc3QgYSBkYXJrIGNoYXQgc3VyZmFjZS4gVGhlXG4gKiByZW5kZXJlciByZXNvbHZlcyBjaHJvbWUgY29sb3JzIGZyb20gQXBwS2l0J3MgbGl2ZSBDU1MgdG9rZW5zIGluc3RlYWRcbiAqIChgQGRieC10b29scy91aS1tYXN0cmFgJ3MgYGNoYXJ0LXRoZW1lYCArIGBub3JtYWxpemVDaGFydE9wdGlvbmApLFxuICogbGVhdmluZyB0aGlzIHRoZW1lIHRoZSBwYXJ0cyB0aGF0IHJlYWQgdGhlIHNhbWUgaW4gZWl0aGVyIG1vZGUuXG4gKi9cbmludGVyZmFjZSBDaGFydFRoZW1lIHtcbiAgY29sb3I6IHN0cmluZ1tdO1xuICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwS2l0J3MgY2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSAoYC0tY2hhcnQtY2F0LTFgIC4uIGAtLWNoYXJ0LWNhdC04YCBmcm9tXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0LXVpYCksIGFzIGhleC4gU2VydmVyLXJlbmRlcmVkIGNoYXJ0IHNwZWNzIGNhbm5vdCByZWFkIHRoZVxuICogYnJvd3NlcidzIENTUyBjdXN0b20gcHJvcGVydGllcywgc28gdGhlIHZhbHVlcyBhcmUgbWlycm9yZWQgaGVyZSB0byBrZWVwIGFcbiAqIGdlbmVyYXRlZCBjaGFydCB2aXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIEFwcEtpdC1zdHlsZWQgVUkgYXJvdW5kIGl0LlxuICogS2VlcCBpbiBzeW5jIHdpdGggQXBwS2l0J3Mgc3R5bGVzaGVldCBpZiBpdCBjaGFuZ2VzLlxuICovXG5jb25zdCBBUFBLSVRfQ0hBUlRfUEFMRVRURSA9IFtcbiAgXCIjMjQ2M0VCXCIsIC8vIGJsdWVcbiAgXCIjMkVCODhBXCIsIC8vIHRlYWxcbiAgXCIjQUI0N0JEXCIsIC8vIHB1cnBsZVxuICBcIiNGNjlFMjNcIiwgLy8gYW1iZXJcbiAgXCIjREQyQzREXCIsIC8vIHJvc2VcbiAgXCIjMUJBM0JCXCIsIC8vIGN5YW5cbiAgXCIjOUI2MUQxXCIsIC8vIGxhdmVuZGVyXG4gIFwiIzM0QjI2MlwiLCAvLyBlbWVyYWxkXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEV4cGFuZCB0d28gYnJhbmQgaGV4IGNvbG9ycyBpbnRvIGEgbGVnaWJsZSBjYXRlZ29yaWNhbCBjeWNsZS4gRWNoYXJ0c1xuICogcmVwZWF0cyB0aGUgYGNvbG9yYCBhcnJheSBhY3Jvc3Mgc2VyaWVzIC8gY2F0ZWdvcmllcywgc28gYSBnb29kIGRlZmF1bHRcbiAqIG5lZWRzIHNldmVyYWwgZGlzdGluY3QgaHVlcywgbm90IHR3by4gV2Ugc2VlZCB3aXRoIHRoZSBicmFuZCBwcmltYXJ5IGFuZFxuICogYWNjZW50ICh0aGUgaWRlbnRpdHkgY29sb3JzKSBhbmQgZm9sbG93IHdpdGggQXBwS2l0J3Mgb3duIGNhdGVnb3JpY2FsIGNoYXJ0XG4gKiBwYWxldHRlLCBzbyBtdWx0aS1zZXJpZXMgLyBtYW55LXNsaWNlIGNoYXJ0cyBzdGF5IHJlYWRhYmxlIGFuZCBtYXRjaCB0aGVcbiAqIHN1cnJvdW5kaW5nIEFwcEtpdCBVSSB3aGlsZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBtYXJrcyBsYW5kIG9uLWJyYW5kLlxuICovXG5mdW5jdGlvbiBicmFuZENvbG9yQ3ljbGUocHJpbWFyeTogc3RyaW5nLCBhY2NlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3ByZWFkID0gQVBQS0lUX0NIQVJUX1BBTEVUVEU7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIFtwcmltYXJ5LCBhY2NlbnQsIC4uLnNwcmVhZF0uZmlsdGVyKChjKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIEVjaGFydHMge0BsaW5rIENoYXJ0VGhlbWV9IGZyb20gYSBicmFuZCBjb250ZXh0OiB0aGUgcHJpbWFyeSArXG4gKiBhY2NlbnQgY29sb3JzIHNlZWQgdGhlIHNlcmllcyBjeWNsZSBhbmQgdGhlIHNhbnMgc3RhY2sgYmVjb21lcyB0aGUgYmFzZVxuICogZm9udC4gVGV4dCBjb2xvcnMgYXJlIHRoZSByZW5kZXJlcidzIGpvYiAtIHNlZSB7QGxpbmsgQ2hhcnRUaGVtZX0uXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucyB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIGV4cGFuc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG50eXBlIE5hbWVkU2xpY2UgPSB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBTY2F0dGVyUG9pbnQgPSBbbnVtYmVyLCBudW1iZXJdO1xudHlwZSBIZWF0bWFwQ2VsbCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIEtlZXAgb25seSBge25hbWUsIHZhbHVlfWAgc2xpY2VzOyBkcm9wIG51bGxzIC8gYmFyZSBudW1iZXJzIC8gdHVwbGVzLiAqL1xuZnVuY3Rpb24gbmFtZWRTbGljZXMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogTmFtZWRTbGljZVtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBOYW1lZFNsaWNlID0+IGQgIT09IG51bGwgJiYgdHlwZW9mIGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZCksXG4gICk7XG59XG5cbi8qKiBLZWVwIG9ubHkgZmluaXRlIG51bWJlcnMgKGNhdGVnb3J5IC8gcmFkYXIgLyB3YXRlcmZhbGwgc2VyaWVzKS4gKi9cbmZ1bmN0aW9uIG51bWVyaWNQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogbnVtYmVyW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIG51bWJlciA9PiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeCwgeV1gIHNjYXR0ZXIgdHVwbGVzLiAqL1xuZnVuY3Rpb24gc2NhdHRlclBvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBTY2F0dGVyUG9pbnRbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgU2NhdHRlclBvaW50ID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIsXG4gICkgYXMgU2NhdHRlclBvaW50W107XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYCBoZWF0bWFwIGNlbGxzLiAqL1xuZnVuY3Rpb24gaGVhdG1hcENlbGxzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IEhlYXRtYXBDZWxsW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIEhlYXRtYXBDZWxsID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDMpIGFzIEhlYXRtYXBDZWxsW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGhlYXRtYXAncyBjZWxscyBhbmQgcm93IGxhYmVscyBmcm9tIGVpdGhlciBzaGFwZSB0aGVcbiAqIHBsYW5uZXIgbWF5IHByb2R1Y2UuXG4gKlxuICogVGhlIGRvY3VtZW50ZWQgc2hhcGUgaXMgT05FIHNlcmllcyBvZiBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gXG4gKiB0cmlwbGVzLCBidXQgaW5kZXggYXJpdGhtZXRpYyBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGJvb2trZWVwaW5nIGFcbiAqIGZhc3QgbW9kZWwgZ2V0cyB3cm9uZywgYW5kIHRoZSBmYWlsdXJlIGlzIHNpbGVudCAoZXZlcnkgY2VsbCBpc1xuICogZHJvcHBlZCBhbmQgdGhlIGdyaWQgcmVuZGVycyBlbXB0eSkuIFNvIHRoZSByb3ctcGVyLXNlcmllcyBzaGFwZSBpdFxuICogYWxyZWFkeSBwcm9kdWNlcyByZWxpYWJseSBmb3IgYmFyIGNoYXJ0cyAtIG9uZSBzZXJpZXMgcGVyIG1hdHJpeFxuICogcm93LCBudW1iZXJzIGFsaWduZWQgdG8gYGNhdGVnb3JpZXNgIC0gaXMgYWNjZXB0ZWQgdG9vIGFuZCB0dXJuZWRcbiAqIGludG8gdHJpcGxlcyBoZXJlLlxuICpcbiAqIFJvdyBvcmRlciByZWFkcyB0b3AtdG8tYm90dG9tOiBFY2hhcnRzJyBjYXRlZ29yeSB5LWF4aXMgY291bnRzIGluZGV4XG4gKiAwIGZyb20gdGhlIEJPVFRPTSwgc28gYSByb3ctZGVyaXZlZCBtYXRyaXggcmV2ZXJzZXMgYm90aCB0aGUgYXhpc1xuICogbGFiZWxzIGFuZCB0aGUgcm93IGluZGljZXMsIHB1dHRpbmcgdGhlIGZpcnN0IHNlcmllcyBhdCB0aGUgdG9wIHRoZVxuICogd2F5IHRoZSBtb2RlbCBsaXN0ZWQgaXQuXG4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBNYXRyaXgocGxhbjogQ2hhcnRQbGFuKTogeyBjZWxsczogSGVhdG1hcENlbGxbXTsgeUNhdGVnb3JpZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB0cmlwbGVzID0gaGVhdG1hcENlbGxzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGNlbGxzOiB0cmlwbGVzLCB5Q2F0ZWdvcmllczogcGxhbi55Q2F0ZWdvcmllcyA/PyBbXSB9O1xuICB9XG4gIGNvbnN0IHJvd3MgPSBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7IG5hbWU6IHMubmFtZSwgdmFsdWVzOiBudW1lcmljUG9pbnRzKHMuZGF0YSkgfSkpO1xuICBjb25zdCBsYWJlbHMgPSBwbGFuLnlDYXRlZ29yaWVzID8/IHJvd3MubWFwKChyKSA9PiByLm5hbWUpO1xuICBjb25zdCBsYXN0Um93ID0gcm93cy5sZW5ndGggLSAxO1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiByb3dzLmZsYXRNYXAoKHJvdywgcm93SW5kZXgpID0+XG4gICAgICByb3cudmFsdWVzLm1hcCgodmFsdWUsIGNvbHVtbkluZGV4KTogSGVhdG1hcENlbGwgPT4gW2NvbHVtbkluZGV4LCBsYXN0Um93IC0gcm93SW5kZXgsIHZhbHVlXSksXG4gICAgKSxcbiAgICB5Q2F0ZWdvcmllczogWy4uLmxhYmVsc10ucmV2ZXJzZSgpLFxuICB9O1xufVxuXG4vKiogU2VxdWVudGlhbCBsaWdodC10by1icmFuZCByYW1wIGZvciBoZWF0bWFwIGludGVuc2l0eS4gKi9cbmNvbnN0IEhFQVRNQVBfUkFNUCA9IFtcIiNFQUYxRkVcIiwgXCIjOUNCREY3XCIsIFwiIzRDODZFRVwiLCBcIiMyNDYzRUJcIiwgXCIjMTQzODdGXCJdO1xuXG4vKiogQWJvdmUgdGhpcyBtYW55IGNlbGxzLCBwcmludGVkIHZhbHVlcyBvdmVybGFwIGFuZCBhcmUgc3VwcHJlc3NlZC4gKi9cbmNvbnN0IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTID0gNjA7XG5cbi8qKiBSaXNpbmcgc3RlcCBmaWxsIChlbWVyYWxkKSBhbmQgZmFsbGluZyBzdGVwIGZpbGwgKHJvc2UpLiAqL1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SID0gXCIjMkVCODhBXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgPSBcIiNERDJDNERcIjtcblxuLyoqIFNlcmllcyBuYW1lcyB0aGUgd2F0ZXJmYWxsIGV4cGFuc2lvbiBlbWl0cy4gKi9cbmNvbnN0IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSA9IFwiUnVubmluZyB0b3RhbFwiO1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUgPSBcIkluY3JlYXNlXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSA9IFwiRGVjcmVhc2VcIjtcblxuLyoqXG4gKiBBIG1vZGVsIGFza2VkIGZvciBhIGJyaWRnZSBvZnRlbiBidWlsZHMgdGhlIHJ1bm5pbmcgdG90YWwgaXRzZWxmIGFuZFxuICogaGFuZHMgYmFjayBhIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgYWxvbmdzaWRlIHRoZSBkZWx0YXMgLSB3aGljaFxuICogcmVuZGVycyBhcyB0d28gcGxhaW4gYmFyIHNlcmllcywgbm90IGEgd2F0ZXJmYWxsICh0aGUgYmFzZSBiYXJzIGFyZVxuICogdGhlIHRhbGwgb25lcykuIFRoZSBiYXNlIGlzIHJlY29nbml6YWJsZSBieSBuYW1lLCBzbyBpdCBpcyBkcm9wcGVkXG4gKiBoZXJlIGFuZCB0aGUgcnVubmluZyB0b3RhbCByZWNvbXB1dGVkIGZyb20gdGhlIGRlbHRhcy5cbiAqL1xuY29uc3QgV0FURVJGQUxMX0JBU0VfTkFNRSA9IC9cXGIoYmFzZXxjdW11bGF0aXZlfHJ1bm5pbmd8aGVscGVyfHRvdGFsfHN0YXJ0KGluZyk/KVxcYi9pO1xuXG4vKipcbiAqIFBpY2sgdGhlIHNpZ25lZC1kZWx0YSBzZXJpZXMgb3V0IG9mIGEgd2F0ZXJmYWxsIHBsYW4sIGlnbm9yaW5nIGFueVxuICogY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyB0aGUgcGxhbm5lciBidWlsdCBieSBoYW5kXG4gKiAoe0BsaW5rIFdBVEVSRkFMTF9CQVNFX05BTUV9KS4gRmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgc2VyaWVzIHdoZW5cbiAqIGV2ZXJ5IG5hbWUgbG9va3MgbGlrZSBhIGJhc2UsIHNpbmNlIGRyb3BwaW5nIHRoZW0gYWxsIHdvdWxkIGxlYXZlXG4gKiBub3RoaW5nIHRvIHBsb3QuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbERlbHRhU2VyaWVzKFxuICBzZXJpZXM6IENoYXJ0UGxhbltcInNlcmllc1wiXSxcbik6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlcmllcy5maW5kKChzKSA9PiAhV0FURVJGQUxMX0JBU0VfTkFNRS50ZXN0KHMubmFtZSkpID8/IHNlcmllc1swXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc3RhY2tlZCB0cmFuc3BhcmVudC1iYXNlICsgaW5jcmVhc2UgKyBkZWNyZWFzZSBzZXJpZXMgdGhhdFxuICogRWNoYXJ0cyB1c2VzIGZvciBhIHdhdGVyZmFsbCAoaXQgaGFzIG5vIG5hdGl2ZSB3YXRlcmZhbGwgdHlwZSkuXG4gKiBWYWx1ZXMgYXJlIHNpZ25lZCBkZWx0YXM7IHRoZSB0cmFuc3BhcmVudCBoZWxwZXIgY2FycmllcyB0aGUgcnVubmluZ1xuICogdG90YWwgc28gZWFjaCB2aXNpYmxlIGJhciBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC5cbiAqXG4gKiBUaGUgaGVscGVyIGlzIGBzaWxlbnRgLCBzbyB3aXRoIGFuIGl0ZW0tdHJpZ2dlcmVkIHRvb2x0aXAgaXQgaXNcbiAqIGludmlzaWJsZSB0byBib3RoIHRoZSBleWUgYW5kIHRoZSBwb2ludGVyIC0gdGhlIGFsdGVybmF0aXZlLCBhbiBheGlzXG4gKiB0b29sdGlwIHRoYXQgaGlkZXMgdGhlIGhlbHBlciByb3csIG5lZWRzIGEgZnVuY3Rpb24gZm9ybWF0dGVyLCBhbmRcbiAqIHRoaXMgc3BlYyBoYXMgdG8gc3Vydml2ZSBKU09OIHNlcmlhbGl6YXRpb24gdG8gdGhlIGJyb3dzZXIuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh2YWx1ZXM6IG51bWJlcltdKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaGVscGVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5jcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgY29uc3QgZGVjcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgbGV0IGN1bXVsYXRpdmUgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICBkZWNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlICsgdmFsdWUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2goXCItXCIpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goLXZhbHVlKTtcbiAgICB9XG4gICAgY3VtdWxhdGl2ZSArPSB2YWx1ZTtcbiAgfVxuICBjb25zdCB0cmFuc3BhcmVudCA9IHsgYm9yZGVyQ29sb3I6IFwidHJhbnNwYXJlbnRcIiwgY29sb3I6IFwidHJhbnNwYXJlbnRcIiB9O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCxcbiAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQgfSxcbiAgICAgIGRhdGE6IGhlbHBlcnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGluY3JlYXNlcyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogZGVjcmVhc2VzLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblRvRWNoYXJ0c09wdGlvbihcbiAgaW5wdXQ6IENoYXJ0UGxhbklucHV0LFxuICBmYWxsYmFja1RpdGxlOiBzdHJpbmcsXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgY29uc3QgYmFzZVRpdGxlID0gcGxhbi50aXRsZSA/PyBmYWxsYmFja1RpdGxlO1xuICBjb25zdCBncmlkID0geyBsZWZ0OiA0OCwgcmlnaHQ6IDI0LCB0b3A6IDU2LCBib3R0b206IDQ4LCBjb250YWluTGFiZWw6IHRydWUgfTtcbiAgY29uc3QgdGhlbWUgPSBicmFuZCA/IGJyYW5kQ2hhcnRUaGVtZShicmFuZCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRoZW1lZCA9IChvcHRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICB0aGVtZSA/IHsgLi4udGhlbWUsIC4uLm9wdGlvbiB9IDogb3B0aW9uO1xuICBjb25zdCB0aXRsZSA9IHsgdGV4dDogYmFzZVRpdGxlLCBsZWZ0OiBcImNlbnRlclwiIH07XG4gIGNvbnN0IGxlZ2VuZCA9IHsgYm90dG9tOiAwIH07XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgLy8gVGhlIG9wdGlvbiBhcnJpdmVzIGFzIGEgSlNPTiBTVFJJTkcsIG5vdCBhIG5lc3RlZCBvYmplY3Q6IHRoaXMgcGxhbiBpc1xuICAgIC8vIHRoZSBwbGFubmVyJ3MgcHJvdmlkZXItZW5mb3JjZWQgc3RydWN0dXJlZCBvdXRwdXQsIGFuZCBhIGZyZWUtZm9ybVxuICAgIC8vIG9iamVjdCBiZWNvbWVzIGFuIHVuY29uc3RyYWluZWQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzY2hlbWEgdGhhdFxuICAgIC8vIHN0cmljdCBPcGVuQUkgYW5kIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IC0gd2hpY2ggd291bGQgYnJlYWsgRVZFUllcbiAgICAvLyBjaGFydCwgbm90IGp1c3QgdGhpcyBvbmUgKHNhbWUgY2xhc3Mgb2YgaGF6YXJkIGFzIHRoZSBgcHJlZml4SXRlbXNgXG4gICAgLy8gbm90ZSBvbiBgY2hhcnREYXRhUG9pbnRTY2hlbWFgKS4gQSBtYWxmb3JtZWQgc3RyaW5nIGNvc3RzIG9uZSBjaGFydC5cbiAgICAvLyBOb3RoaW5nIGhlcmUgaXMgZXZhbCdkOyBhIHN0cmluZy12YWx1ZWQgRWNoYXJ0cyBmb3JtYXR0ZXIgaXMgYVxuICAgIC8vIHRlbXBsYXRlLCBub3QgY29kZS5cbiAgICBjb25zdCBvcHRpb24gPSBqc29uLnBhcnNlUmVjb3JkKHBsYW4ub3B0aW9uKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFydFR5cGUgXCJjdXN0b21cIiBuZWVkcyBhbiBgb3B0aW9uYCBob2xkaW5nIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgLy8gVGl0bGUgaXMgdGhlIG9uZSBkZWZhdWx0IHdvcnRoIGZpbGxpbmc6IGV2ZXJ5IG90aGVyIGJyYW5jaCBndWFyYW50ZWVzXG4gICAgLy8gb25lIGFuZCB0aGUgcmVuZGVyZXIgcmVzZXJ2ZXMgZ3JpZCBzcGFjZSBmb3IgaXQuIEEgdGl0bGUgdGhlIG1vZGVsIHNldFxuICAgIC8vIHdpbnMsIGFzIGRvZXMgZXZlcnkgb3RoZXIgZmllbGQgaXQgZGVjbGFyZWQuXG4gICAgcmV0dXJuIHRoZW1lZCh7IHRpdGxlLCAuLi5vcHRpb24gfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwiZnVubmVsXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwidHJlZW1hcFwiKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gbmFtZWRTbGljZXMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICAgIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiBzZXJpZXNUeXBlID09PSBcInRyZWVtYXBcIiA/IHVuZGVmaW5lZCA6IGxlZ2VuZCxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwicGllXCIgPyB7IHJhZGl1czogW1wiMzUlXCIsIFwiNjUlXCJdIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwiZnVubmVsXCIgPyB7IHNvcnQ6IFwiZGVzY2VuZGluZ1wiIH0gOiB7fSksXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHNjYXR0ZXJQb2ludHMocy5kYXRhKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJoZWF0bWFwXCIpIHtcbiAgICBjb25zdCB7IGNlbGxzLCB5Q2F0ZWdvcmllcyB9ID0gaGVhdG1hcE1hdHJpeChwbGFuKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjZWxscy5tYXAoKGMpID0+IGNbMl0pO1xuICAgIGNvbnN0IG1pbiA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4udmFsdWVzKSA6IDA7XG4gICAgY29uc3QgbWF4ID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi52YWx1ZXMpIDogMTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyBwb3NpdGlvbjogXCJ0b3BcIiB9LFxuICAgICAgLy8gVGhlIHZpc3VhbE1hcCByYW1wIHNpdHMgYmVsb3cgdGhlIHBsb3QsIHNvIHRoZSBncmlkIGdpdmVzIHVwXG4gICAgICAvLyBtb3JlIGJvdHRvbSByb29tIHRoYW4gYW4gYXhpcy1vbmx5IGNoYXJ0IG5lZWRzLlxuICAgICAgZ3JpZDogeyAuLi5ncmlkLCBib3R0b206IDcyIH0sXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogeUNhdGVnb3JpZXMsXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB2aXN1YWxNYXA6IHtcbiAgICAgICAgLy8gRWNoYXJ0cyBoaWRlcyBldmVyeSBjZWxsIHdoZW4gbWluID09PSBtYXggKGEgdW5pZm9ybSBtYXRyaXgpLFxuICAgICAgICAvLyBzbyBhIGRlZ2VuZXJhdGUgcmFuZ2UgaXMgd2lkZW5lZCBieSBvbmUuXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4OiBtYXggPiBtaW4gPyBtYXggOiBtaW4gKyAxLFxuICAgICAgICBjYWxjdWxhYmxlOiB0cnVlLFxuICAgICAgICBvcmllbnQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBsZWZ0OiBcImNlbnRlclwiLFxuICAgICAgICBib3R0b206IDgsXG4gICAgICAgIGluUmFuZ2U6IHsgY29sb3I6IEhFQVRNQVBfUkFNUCB9LFxuICAgICAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICAgIGRhdGE6IGNlbGxzLFxuICAgICAgICAgIC8vIFByaW50ZWQgY2VsbCB2YWx1ZXMgYXJlIHVucmVhZGFibGUgb25jZSB0aGUgZ3JpZCBpcyBkZW5zZS5cbiAgICAgICAgICBsYWJlbDogeyBzaG93OiBjZWxscy5sZW5ndGggPD0gSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgfSxcbiAgICAgICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHsgc2hhZG93Qmx1cjogMTAsIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC4zKVwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicmFkYXJcIikge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSAocGxhbi5jYXRlZ29yaWVzID8/IFtdKS5tYXAoKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwZWFrID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIC4uLnBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bXMgPSBudW1lcmljUG9pbnRzKHMuZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIG51bXNbaW5kZXhdID8/IDA7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIG1heDogcGVhayA+IDAgPyBwZWFrIDogMSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICByYWRhcjogeyBpbmRpY2F0b3I6IGluZGljYXRvcnMgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICAgIGRhdGE6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1lcmljUG9pbnRzKHMuZGF0YSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ3YXRlcmZhbGxcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IG51bWVyaWNQb2ludHMod2F0ZXJmYWxsRGVsdGFTZXJpZXMocGxhbi5zZXJpZXMpPy5kYXRhID8/IFtdKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgLy8gSXRlbS10cmlnZ2VyZWQgc28gdGhlIHRyYW5zcGFyZW50IGBzaWxlbnRgIG9mZnNldCBiYXJzIG5ldmVyXG4gICAgICAvLyBzdXJmYWNlIGluIGEgdG9vbHRpcCAoc2VlIGB3YXRlcmZhbGxTZXJpZXNgKS5cbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIC8vIE9ubHkgdGhlIHR3byB2aXNpYmxlIHN0ZXBzIGJlbG9uZyBpbiB0aGUgbGVnZW5kLlxuICAgICAgbGVnZW5kOiB7IC4uLmxlZ2VuZCwgZGF0YTogW1dBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRV0gfSxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHdhdGVyZmFsbFNlcmllcyh2YWx1ZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhvcml6b250YWxCYXJcIikge1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiLCBheGlzUG9pbnRlcjogeyB0eXBlOiBcInNoYWRvd1wiIH0gfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY29tYm9cIikge1xuICAgIGNvbnN0IHVzZXNSaWdodEF4aXMgPSBwbGFuLnNlcmllcy5zb21lKChzKSA9PiBzLnlBeGlzSW5kZXggPT09IDEpO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogdXNlc1JpZ2h0QXhpc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHMudHlwZSA/PyBcImJhclwiO1xuICAgICAgICBjb25zdCBzZXJpZXNUeXBlID0gbWFyayA9PT0gXCJhcmVhXCIgPyBcImxpbmVcIiA6IG1hcms7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgICAgIHlBeGlzSW5kZXg6IHMueUF4aXNJbmRleCA/PyAwLFxuICAgICAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAgICAgLi4uKG1hcmsgPT09IFwiYXJlYVwiID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJhciAvIGxpbmUgLyBhcmVhIHNoYXJlIHRoZSBzYW1lIGF4aXMgbGF5b3V0LlxuICBjb25zdCBpc0FyZWEgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJhcmVhXCI7XG4gIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIiA/IFwiYmFyXCIgOiBcImxpbmVcIjtcbiAgcmV0dXJuIHRoZW1lZCh7XG4gICAgdGl0bGUsXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgIGxlZ2VuZCxcbiAgICBncmlkLFxuICAgIHhBeGlzOiB7XG4gICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgfSxcbiAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAuLi4oaXNBcmVhID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgfSkpLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZGVyX2RhdGEgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcmVuZGVyX2RhdGFgIE1hc3RyYSB0b29sIGJvdW5kIHRvIHRoZSBnaXZlbiBwbHVnaW5cbiAqIGNvbmZpZy4gQXV0by13aXJlZCBhcyBhIHN5c3RlbSB0b29sIG9uIGV2ZXJ5IGFnZW50IChzZWVcbiAqIGBhZ2VudHMudHNgKTsgcGVyLWFnZW50IHRvb2xzIGNhbiBzaGFkb3cgaXQgYnkgcmVnaXN0ZXJpbmcgYVxuICogc2FtZS1uYW1lZCBlbnRyeS5cbiAqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciB7QGxpbmsgcHJlcGFyZUNoYXJ0fSBmb3IgY2FsbGVycyB0aGF0IGFscmVhZHlcbiAqIGhhdmUgYSBkYXRhc2V0IGluIGhhbmQuIE1pbnRzIGEgYGNoYXJ0SWRgIHN5bmNocm9ub3VzbHksIGNhY2hlc1xuICogYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlIGNoYXJ0LXBsYW5uZXIgaW4gdGhlXG4gKiBiYWNrZ3JvdW5kLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgcGx1cyBpdHMgcmVhZHktdG8tY29weSBgbWFya2VyYDsgdGhlIGhvc3RcbiAqIFVJIHJlc29sdmVzIHRoYXQgbWFya2VyIHRocm91Z2ggdGhlIHBsdWdpbidzIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgU3VibWl0IGEgdGFidWxhciBkYXRhc2V0IGZvciBpbmxpbmUgcmVuZGVyaW5nIGFzIGEgY2hhcnQgaW5cbiAgICAgICAgdGhlIHVzZXIncyB2aWV3LiBQYXNzIGEgdGl0bGUsIHRoZSByYXcgcm93cyAoYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICBrZXllZCBieSBjb2x1bW4gbmFtZSksIGFuZCBhbiBvcHRpb25hbCBvbmUtbGluZSBkZXNjcmlwdGlvblxuICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBoaWdobGlnaHQuIFJldHVybnMgXFxgY2hhcnRJZFxcYCBwbHVzIHRoZVxuICAgICAgICBjb21wbGV0ZSBcXGBtYXJrZXJcXGA7IGNvcHkgdGhlIHJldHVybmVkIG1hcmtlciBWRVJCQVRJTSBvbnRvXG4gICAgICAgIGl0cyBvd24gbGluZSB3aGVyZSB0aGUgY2hhcnQgc2hvdWxkIHJlbmRlci4gTmV2ZXIgY29uc3RydWN0LFxuICAgICAgICBhbHRlciwgb3IgaW52ZW50IGEgY2hhcnQgbWFya2VyIHlvdXJzZWxmLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgUGxhY2VtZW50IGNvbnRyYWN0OiBlbWJlZCB0aGUgcmV0dXJuZWQgXFxgbWFya2VyXFxgIG9uIGl0cyBvd25cbiAgICAgICAgbGluZSAoYmxhbmsgbGluZXMgYWJvdmUgYW5kIGJlbG93KSB3aGVyZXZlciB5b3Ugd2FudCB0aGUgY2hhcnRcbiAgICAgICAgdG8gYXBwZWFyIGluIHlvdXIgcmVwbHkuIFRoZSBjaGFydCByZXNvbHZlc1xuICAgICAgICBhc3luY2hyb25vdXNseSAtIHRoZSB0b29sIHJldHVybnMgdGhlIGlkIGltbWVkaWF0ZWx5IGFuZCB0aGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjaGFydCBmcm9tIHRoZSBjYWNoZSBvbmNlIHRoZSBwbGFubmVyXG4gICAgICAgIGxhbmRzLiBZb3UgY2FuIGNhbGwgXFxgcmVuZGVyX2RhdGFcXGAgbXVsdGlwbGUgdGltZXMgaW4gdGhlXG4gICAgICAgIHNhbWUgdHVybiAodGhlIHRvb2wgaXMgcGFyYWxsZWwtc2FmZSkgYW5kIGludGVybGVhdmUgdGhlXG4gICAgICAgIG1hcmtlcnMgd2l0aCBwcm9zZSBzbyBlYWNoIGNoYXJ0IHNpdHMgbmV4dCB0byBpdHNcbiAgICAgICAgY29tbWVudGFyeS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB3aGVuZXZlciBhIFNRTCByb3cgc2V0LCBBUEkgcmVzcG9uc2UsIG9yIGhhbmQtYnVpbHRcbiAgICAgICAgZGF0YXNldCB3b3VsZCBsYW5kIGJldHRlciBhcyBhIHBpY3R1cmUgdGhhbiBhcyBhIGxpc3Qgb3JcbiAgICAgICAgdGFibGUuIENhcCBpbnB1dCBhdCBhIGZldyBodW5kcmVkIHJvd3M7IHNhbXBsZSBvciBhZ2dyZWdhdGVcbiAgICAgICAgbGFyZ2VyIGRhdGFzZXRzIGZpcnN0LlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IGlucHV0IGFzIENoYXJ0UGxhbm5lclJlcXVlc3Q7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0IH0gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcHJlcGFyZUNoYXJ0KHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShjdHg/LnJlcXVlc3RDb250ZXh0KSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IHJvd3M6IGRhdGEgfSksXG4gICAgICAgIC4uLihjdHg/LnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogY3R4LnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLHlCQUF5QixDQUFDO0FBRXZELDZFQUE2RTtBQUU3RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLENBQUM7S0FDM0IsVUFBVSxDQUNULENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDSixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hFLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBQ0QsZ0VBQWdFO0lBQ2hFLGlFQUFpRTtJQUNqRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxRCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsQ0FBdUMsQ0FBQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLEdBQUcsS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCx5REFBeUQ7UUFDekQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUYsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxFQUNELENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDTixDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ1YsQ0FBQyxDQUFDLElBQUksRUFBRTtJQUNSLGtFQUFrRTtJQUNsRSw4REFBOEQ7SUFDOUQsOERBQThEO0lBQzlELCtEQUErRDtJQUMvRCx5REFBeUQ7SUFDekQsZ0VBQWdFO0lBQ2hFLDhCQUE4QjtJQUM5QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztDQUNsRCxDQUFDLENBQ0g7S0FDQSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFZix3RUFBd0U7QUFDeEUsTUFBTSxvQkFBb0IsR0FBRyxDQUFDO0tBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDL0QsUUFBUSxDQUNQLDBHQUEwRyxDQUMzRyxDQUFDO0FBRUo7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO0lBQy9CLEtBQUssRUFBRSxDQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsUUFBUSxFQUFFO1NBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQztTQUNiLFFBQVEsQ0FDUCxXQUFXLENBQUMsYUFBYSxDQUFDOzs7T0FHekIsQ0FBQyxDQUNIO0lBQ0gsVUFBVSxFQUFFLENBQUM7U0FDVixNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7U0FDVixPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2IsUUFBUSxDQUNQLFdBQVcsQ0FBQyxhQUFhLENBQUM7Ozs7T0FJekIsQ0FBQyxDQUNIO0lBQ0gsVUFBVSxFQUFFLENBQUM7U0FDVixNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7U0FDVixPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2IsUUFBUSxDQUNQLFdBQVcsQ0FBQyxhQUFhLENBQUM7Ozs7T0FJekIsQ0FBQyxDQUNIO0lBQ0gsVUFBVSxFQUFFLENBQUM7U0FDVixLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2pCLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDYixRQUFRLENBQ1AsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7OztPQU96QixDQUFDLENBQ0g7SUFDSCxXQUFXLEVBQUUsQ0FBQztTQUNYLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakIsUUFBUSxFQUFFO1NBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQztTQUNiLFFBQVEsQ0FDUCxXQUFXLENBQUMsYUFBYSxDQUFDOzs7O09BSXpCLENBQUMsQ0FDSDtJQUNILE1BQU0sRUFBRSxDQUFDO1NBQ04sS0FBSyxDQUNKLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FDdkIsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7V0FFekIsQ0FBQyxDQUNIO1FBQ0QsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDbkQsVUFBVSxFQUFFLENBQUM7YUFDVixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQyxRQUFRLEVBQUU7YUFDVixPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsUUFBUSxDQUNQLDRIQUE0SCxDQUM3SDtRQUNILElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsUUFBUSxDQUMxQyxXQUFXLENBQUMsYUFBYSxDQUFDOzs7Ozs7Ozs7O1dBVXpCLENBQUMsQ0FDSDtLQUNGLENBQUMsQ0FDSDtTQUNBLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDWCxRQUFRLENBQ1AsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7OztPQU96QixDQUFDLENBQ0g7SUFDSCxNQUFNLEVBQUUsQ0FBQztTQUNOLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDYixRQUFRLENBQ1AsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7T0FRekIsQ0FBQyxDQUNIO0NBQ0osQ0FBQyxDQUFDO0FBS0g7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hELEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUN4QixXQUFXLENBQUMsYUFBYSxDQUFDOztPQUV2QixDQUFDLENBQ0w7SUFDRCxXQUFXLEVBQUUsQ0FBQztTQUNYLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FDUCxXQUFXLENBQUMsYUFBYSxDQUFDOzs7OztPQUt6QixDQUFDLENBQ0g7SUFDSCxJQUFJLEVBQUUsQ0FBQztTQUNKLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUN4QyxRQUFRLENBQUMsb0NBQW9DLENBQUM7U0FDOUMsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLFdBQVcsQ0FBQyxhQUFhLENBQUM7Ozs7OztPQU16QixDQUFDLENBQ0g7Q0FDSixDQUFDLENBQUM7QUFJSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuRixNQUFNLEVBQUUsQ0FBQztTQUNOLE1BQU0sRUFBRTtTQUNSLFFBQVEsQ0FDUCxpSEFBaUgsQ0FDbEg7Q0FDSixDQUFDLENBQUM7QUFLSCxrRkFBa0Y7QUFFbEY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUI7SUFDNUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU87U0FDaEMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLFVBQVUsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztTQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7OzttQ0FPMUIscUJBQXFCLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTREekQsQ0FBQyxDQUFDO0FBRUgsK0VBQStFO0FBRS9FOzs7Ozs7R0FNRztBQUNILE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUE2QixDQUFDO0FBRS9ELFNBQVMsZUFBZSxDQUFDLE1BQTBCO0lBQ2pELElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDO1lBQ2hCLEVBQUUsRUFBRSxlQUFlO1lBQ25CLElBQUksRUFBRSxlQUFlO1lBQ3JCLFdBQVcsRUFBRSxvREFBb0Q7WUFDakUsWUFBWSxFQUFFLDBCQUEwQjtZQUN4QyxLQUFLLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FDNUIsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoRixDQUFDLENBQUM7UUFDSCxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxlQUFlLENBQzVCLE1BQTBCLEVBQzFCLE9BQTRCLEVBQzVCLFVBQTBFLEVBQUU7SUFFNUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzdDLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDdkMsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELG9DQUFvQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7S0FDcEUsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUM1RCxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUU7UUFDN0MsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4QyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVELGlGQUFpRjtBQUVqRjs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FBQyxPQUFlLEVBQUUsT0FBZTtJQUMzRCxPQUFPLENBQUMsTUFBTSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUFDLEtBQVksRUFBRSxPQUFlO0lBQ3JELElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsTUFBTSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDbkQsR0FBRyxFQUFFLG1CQUFtQjtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3pCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUFlLEVBQUUsT0FBZTtJQUN2RCxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3hCLE9BQU87WUFDUCxLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUF3Q0Q7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxJQUF5QjtJQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDMUIsTUFBTSxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLGtFQUFrRTtJQUNsRSw0Q0FBNEM7SUFDNUMsS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVELEtBQUssVUFBVSxlQUFlLENBQUMsT0FBZSxFQUFFLElBQXlCO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLGNBQWMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FDbEMsSUFBSSxDQUFDLE1BQU0sRUFDWDtZQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU87WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELElBQUksRUFBRSxJQUFJLENBQUMsSUFBbUM7U0FDL0MsRUFDRDtZQUNFLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDckQsQ0FDRixDQUFDO1FBQ0YsTUFBTSxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2xCLE9BQU87WUFDUCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsTUFBTSxPQUFPLEdBQUcsR0FBRyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUM7UUFDaEYsTUFBTSxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDO0FBQ0gsQ0FBQztBQTJCRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FDOUIsT0FBZSxFQUNmLE9BQTBCO0lBRTFCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksd0JBQXdCLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSx5QkFBeUIsQ0FBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRXhDLElBQUksSUFBdUIsQ0FBQztJQUM1QixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFNBQVMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRSxDQUFDO0FBQ0gsQ0FBQztBQXVCRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxVQUFVO0NBQ2IsQ0FBQztBQUVYOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFlLEVBQUUsTUFBYztJQUN0RCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQztJQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBbUI7SUFDMUMsT0FBTztRQUNMLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakUsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBUUQsNEVBQTRFO0FBQzVFLFNBQVMsV0FBVyxDQUFDLElBQXlDO0lBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDaEIsQ0FBQyxDQUFDLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2pGLENBQUM7QUFDSixDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsYUFBYSxDQUFDLElBQXlDO0lBQzlELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLFNBQVMsYUFBYSxDQUFDLElBQXlDO0lBQzlELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDaEIsQ0FBQyxDQUFDLEVBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUMzQyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsU0FBUyxZQUFZLENBQUMsSUFBeUM7SUFDN0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBa0IsQ0FBQztBQUNuRyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFlO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEMsT0FBTztRQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBZSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxHQUFHLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUM5RjtRQUNELFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFO0tBQ25DLENBQUM7QUFDSixDQUFDO0FBRUQsNERBQTREO0FBQzVELE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRTdFLHdFQUF3RTtBQUN4RSxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSx3QkFBd0IsR0FBRyxTQUFTLENBQUM7QUFDM0MsTUFBTSx3QkFBd0IsR0FBRyxTQUFTLENBQUM7QUFFM0Msa0RBQWtEO0FBQ2xELE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDO0FBRTNDOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcseURBQXlELENBQUM7QUFFdEY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBMkI7SUFFM0IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFnQjtJQUN2QyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO0lBQzFDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsVUFBVSxJQUFJLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUN6RSxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsSUFBSTtZQUNaLFNBQVMsRUFBRSxXQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUU7WUFDcEMsSUFBSSxFQUFFLE9BQU87U0FDZDtRQUNEO1lBQ0UsSUFBSSxFQUFFLHVCQUF1QjtZQUM3QixJQUFJLEVBQUUsS0FBSztZQUNYLEtBQUssRUFBRSxPQUFPO1lBQ2QsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFO1lBQzlDLElBQUksRUFBRSxTQUFTO1NBQ2hCO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsdUJBQXVCO1lBQzdCLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLE9BQU87WUFDZCxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUU7WUFDOUMsSUFBSSxFQUFFLFNBQVM7U0FDaEI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLEtBQW9CO0lBRXBCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM5RSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBK0IsRUFBMkIsRUFBRSxDQUMxRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLGlFQUFpRTtRQUNqRSxzQkFBc0I7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLCtDQUErQztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1RixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztZQUNaLEtBQUs7WUFDTCxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO1lBQzVCLE1BQU0sRUFBRSxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDckQsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxTQUFTO29CQUN2QyxJQUFJLEVBQUUsVUFBVTtvQkFDaEIsR0FBRyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDM0QsR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFELElBQUksRUFBRSxNQUFNO2lCQUNiO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLDJEQUEyRDtRQUMzRCx5REFBeUQ7UUFDekQsd0NBQXdDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDO1lBQ1osS0FBSztZQUNMLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFDNUIsTUFBTTtZQUNOLElBQUk7WUFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9DLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDL0MsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQzVCLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQztZQUNaLEtBQUs7WUFDTCxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzVCLCtEQUErRDtZQUMvRCxrREFBa0Q7WUFDbEQsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtZQUM3QixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDckIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTthQUMxQjtZQUNELEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDckIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTthQUMxQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxnRUFBZ0U7Z0JBQ2hFLDJDQUEyQztnQkFDM0MsR0FBRztnQkFDSCxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDOUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2FBQ2pDO1lBQ0QsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxTQUFTO29CQUN2QyxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUUsS0FBSztvQkFDWCw2REFBNkQ7b0JBQzdELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLHVCQUF1QixFQUFFO29CQUN4RCxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxFQUFFO2lCQUMvRTthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzdELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ25CLENBQUMsRUFDRCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO1lBQ1osS0FBSztZQUNMLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFDNUIsTUFBTTtZQUNOLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7WUFDaEMsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxPQUFPO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO3dCQUNaLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztxQkFDN0IsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sTUFBTSxDQUFDO1lBQ1osS0FBSztZQUNMLCtEQUErRDtZQUMvRCxnREFBZ0Q7WUFDaEQsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtZQUM1QixtREFBbUQ7WUFDbkQsTUFBTSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCLENBQUMsRUFBRTtZQUMvRSxJQUFJO1lBQ0osS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDdEI7WUFDRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9DLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDO1NBQ2hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7WUFDWixLQUFLO1lBQ0wsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDN0QsTUFBTTtZQUNOLElBQUk7WUFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9DLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtnQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQ3RCO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2FBQ2IsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLE1BQU0sQ0FBQztZQUNaLEtBQUs7WUFDTCxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO1lBQzVCLE1BQU07WUFDTixJQUFJO1lBQ0osS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDdEI7WUFDRCxLQUFLLEVBQUUsYUFBYTtnQkFDbEIsQ0FBQyxDQUFDO29CQUNFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDeEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7aUJBQ25DO2dCQUNILENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDNUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO2dCQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkQsT0FBTztvQkFDTCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDO29CQUM3QixNQUFNLEVBQUUsVUFBVSxLQUFLLE1BQU07b0JBQzdCLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUM5QyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQztJQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0QsT0FBTyxNQUFNLENBQUM7UUFDWixLQUFLO1FBQ0wsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtRQUM1QixNQUFNO1FBQ04sSUFBSTtRQUNKLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxVQUFVO1lBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUU7WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3RCO1FBQ0QsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUMvQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLFVBQVU7WUFDaEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osTUFBTSxFQUFFLFVBQVUsS0FBSyxNQUFNO1lBQzdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDckMsQ0FBQyxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGtGQUFrRjtBQUVsRjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBMEI7SUFDNUQsT0FBTyxVQUFVLENBQUM7UUFDaEIsRUFBRSxFQUFFLGFBQWE7UUFDakIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDckM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXJzLCB3aXJlLCB0eXBlIENoYXJ0LCB0eXBlIENoYXJ0UmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVVzZXJLZXksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGFydFwiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUVEwgZm9yIGNhY2hlZCBjaGFydCBlbnRyaWVzLiBPbmUgaG91ciBiYWxhbmNlcyBcImxvbmcgZW5vdWdoIGZvclxuICogdGhlIGhvc3QgVUkgdG8gZmV0Y2ggdGhlIGNoYXJ0IHdlbGwgYWZ0ZXIgdGhlIG1vZGVsIGZpbmlzaGVkXG4gKiB0YWxraW5nXCIgYWdhaW5zdCBcInNob3J0IGVub3VnaCB0aGF0IGFiYW5kb25lZCBjaGFydCBpZHMgZG9uJ3RcbiAqIHBpbiBzdG9yYWdlXCIuIE1hdGNoZXMgdGhlIHR5cGljYWwgRGF0YWJyaWNrcyBPQk8gdG9rZW4gbGlmZXRpbWVcbiAqIHNvIGFueSBkYXRhIHJlLXJlc29sdXRpb24gc3RheXMgaW5zaWRlIHRoZSBvcmlnaW5hbCBhdXRoIHdpbmRvdy5cbiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfVFRMX1NFQyA9IDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2U7IGtlZXBzIHRoZSBjaGFydCBrZXlzcGFjZSB0aWR5LiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Y2hhcnRcIjtcblxuLyoqIERlZmF1bHQgc2VydmVyLXNpZGUgbG9uZy1wb2xsIGJ1ZGdldCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogRGVmYXVsdCBpbnRlci1wb2xsIHNsZWVwIGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TID0gMjUwO1xuXG4vKiogU3RhYmxlIHRleHQgc3RvcmVkIG9uIGEgY2hhcnQgZW50cnkgd2hvc2UgcGxhbm5lciBydW4gZmFpbGVkLiAqL1xuY29uc3QgQ0hBUlRfRkFJTEVEX01FU1NBR0UgPSBcIkNoYXJ0IGdlbmVyYXRpb24gZmFpbGVkXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NoZW1hcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHNlcmllcyBkYXRhIHBvaW50LiBXaWRlIHZhcmlhbnQgc2V0IHNvIHRoZSBwbGFubmVyIGFnZW50IGNhblxuICogZmFpdGhmdWxseSBwYXNzIHRocm91Z2ggd2hhdGV2ZXIgdGhlIFNRTCByb3cgc2V0IGNvbnRhaW5lZFxuICogKG51bWJlcnMsIHN0cmluZ2lmaWVkIG51bWJlcnMsIG51bGxzIGZvciBtaXNzaW5nIG1lYXN1cmVtZW50cyxcbiAqIGBbeCwgeV1gIHR1cGxlcyBmb3Igc2NhdHRlciwgYFt4LCB5LCB2YWx1ZV1gIHRyaXBsZXMgZm9yIGhlYXRtYXAsXG4gKiBge25hbWUsIHZhbHVlfWAgc2xpY2VzIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwKSB3aXRob3V0IHRoZVxuICogc3RydWN0dXJlZC1vdXRwdXQgZ3VhcmQgcmVqZWN0aW5nIHRoZSB3aG9sZSBwbGFuLlxuICpcbiAqIFRocmVlIGxheWVycyBvZiB0b2xlcmFuY2U6XG4gKlxuICogICAxLiB7QGxpbmsgei5wcmVwcm9jZXNzfSBub3JtYWxpemVzIHdpcmUgc2hhcGVzIEJFRk9SRSB1bmlvblxuICogICAgICBkaXNwYXRjaDogc3RyaW5naWZpZWQgbnVtYmVycyBwYXJzZSB0byBudW1iZXJzLCBmaW5pdGVcbiAqICAgICAgY2hlY2tzIHJlamVjdCBgTmFOYCAvIGBJbmZpbml0eWAsIDItLzMtZWxlbWVudCBhcnJheXMgY29lcmNlXG4gKiAgICAgIHR1cGxlIGNvbXBvbmVudHMsIGFuZCBge3ZhbHVlfWAgb2JqZWN0cyB3aXRoIG1pc3NpbmcgL1xuICogICAgICBzdHJpbmdpZmllZCBgdmFsdWVgIGdldCBjb2VyY2VkIG9yIHJlamVjdGVkIHVuaWZvcm1seS5cbiAqICAgICAgQW55dGhpbmcgbm90IGhhbmRsZWFibGUgYmVjb21lcyBgbnVsbGAuXG4gKiAgIDIuIFRoZSB1bmlvbiBhY2NlcHRzIGBudWxsYCBhcyBhIGZpcnN0LWNsYXNzIHZhcmlhbnQuIEVjaGFydHNcbiAqICAgICAgcmVuZGVycyBudWxsIGFzIGEgZ2FwIG9uIGJhciAvIGxpbmUgLyBhcmVhICh3aGljaCBpcyB0aGVcbiAqICAgICAgcmlnaHQgdmlzdWFsIHNpZ25hbCBmb3IgXCJtaXNzaW5nIHJlYWRpbmdcIikuIFNjYXR0ZXIsIGhlYXRtYXAsXG4gKiAgICAgIGFuZCBzbGljZSBjaGFydHMgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufVxuICogICAgICBiZWNhdXNlIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b051bWJlcih2KSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgLy8gU2NhdHRlciBgW3gsIHldYCBvciBoZWF0bWFwIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAuIENvZXJjZVxuICAgICAgLy8gc3RyaW5naWZpZWQgY29tcG9uZW50czsgcmVqZWN0IGlmIGFueSBjb21wb25lbnQgaXMgbm9uLWZpbml0ZS5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmICh2Lmxlbmd0aCA9PT0gMiB8fCB2Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgY29uc3QgbnVtcyA9IHYubWFwKChjKSA9PiBvYmplY3QudG9OdW1iZXIoYykpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gbiAhPT0gdW5kZWZpbmVkKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSBvYmplY3QudG9OdW1iZXIob2JqLnZhbHVlKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ29lcmNlIG51bWVyaWMgLyBib29sZWFuIC8gbnVsbGlzaCBuYW1lcyB0byBzdHJpbmdzIHNvIGFcbiAgICAgICAgLy8gcGllIHNsaWNlIGtleWVkIG9uIGEgeWVhciAoYDIwMjRgKSBvciBjYXRlZ29yeSBpZCBpc1xuICAgICAgICAvLyBhY2NlcHRlZCB3aXRob3V0IHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIGNhdGNoIGFybS5cbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IG9iai5uYW1lO1xuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIHJhd05hbWUgPT09IFwic3RyaW5nXCIgPyByYXdOYW1lIDogcmF3TmFtZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhyYXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgdmFsdWU6IHZhbCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICB6LnVuaW9uKFtcbiAgICAgIHoubnVtYmVyKCksXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIC8vIGBbeCwgeV1gIHNjYXR0ZXIgb3IgYFt4LCB5LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbC4gTW9kZWxsZWQgYXMgYVxuICAgICAgLy8gbGVuZ3RoLWNvbnN0cmFpbmVkIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDpcbiAgICAgIC8vIFpvZCBlbWl0cyBhIHR1cGxlIGFzIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kXG4gICAgICAvLyBEYXRhYnJpY2tzJyBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWBcbiAgICAgIC8vIGNvbnRhaW5pbmcgaXQgKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlXG4gICAgICAvLyBgaXRlbXNgIGlzIGFic2VudCkuIGBtaW5JdGVtc2AgLyBgbWF4SXRlbXNgICsgYGl0ZW1zYCBpcyB3aGF0XG4gICAgICAvLyBldmVyeSBwcm92aWRlciB1bmRlcnN0YW5kcy5cbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkubWluKDIpLm1heCgzKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKiogUGVyLXNlcmllcyBtYXJrIHR5cGUgdXNlZCBieSBgY29tYm9gIGNoYXJ0cyAoYmFyICsgbGluZSBvdmVybGF5KS4gKi9cbmNvbnN0IHNlcmllc01hcmtUeXBlU2NoZW1hID0gelxuICAudW5pb24oW3oubGl0ZXJhbChcImJhclwiKSwgei5saXRlcmFsKFwibGluZVwiKSwgei5saXRlcmFsKFwiYXJlYVwiKV0pXG4gIC5kZXNjcmliZShcbiAgICBcIk1hcmsgdHlwZSBmb3IgdGhpcyBzZXJpZXMuIFJlcXVpcmVkIGZvciBgY29tYm9gIChtaXggYmFyIGFuZCBsaW5lL2FyZWEpOyB1c2UgbnVsbCBmb3Igb3RoZXIgY2hhcnQgdHlwZXMuXCIsXG4gICk7XG5cbi8qKlxuICogQ29tcGFjdCwgbW9kZWwtZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgYW4gRWNoYXJ0cyBzcGVjLiBUaGVcbiAqIHBsYW5uZXIgYWdlbnQgZW1pdHMgdGhpczsge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259IGV4cGFuZHMgaXRcbiAqIGludG8gYSByZWFsIGBFQ2hhcnRzT3B0aW9uYCBKU09OLiBUd28gbGF5ZXJzIGJlY2F1c2UgbGV0dGluZyB0aGVcbiAqIG1vZGVsIGZpbGwgaW4gYSBmdWxseS10eXBlZCBgRUNoYXJ0c09wdGlvbmAgaXMgYnJpdHRsZSAoaHVuZHJlZHNcbiAqIG9mIG9wdGlvbmFsIGZpZWxkcywgZGVlcCB1bmlvbnMsIHZlcnNpb24tZGVwZW5kZW50IHNoYXBlcykuIEFcbiAqIHNtYWxsIFwiY2hhcnQgcGxhblwiIHNjaGVtYSBpcyBtdWNoIG1vcmUgcmVsaWFibGUgZm9yIGEgZmFzdCBtb2RlbFxuICogYW5kIGtlZXBzIGFuaW1hdGlvbiAvIHRvb2x0aXAgLyBzdHlsaW5nIGRlZmF1bHRzIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBjaGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNoYXJ0VHlwZTogd2lyZS5DaGFydFR5cGVTY2hlbWEsXG4gIHRpdGxlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBBeGlzIGxhYmVsIGZvciB0aGUgcHJpbWFyeSAodXN1YWxseSBib3R0b20gLyB2YWx1ZSkgYXhpcy5cbiAgICAgICAgVXNlZCBmb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGxcbiAgICAgICAgLyBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIGNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFktYXhpcyAocm93KSBsYWJlbHMgZm9yIFxcYGhlYXRtYXBcXGAuIFVzZSBudWxsIHdoZW4gdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gVXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgICAgICAgeUF4aXNJbmRleDogelxuICAgICAgICAgIC51bmlvbihbei5saXRlcmFsKDApLCB6LmxpdGVyYWwoMSldKVxuICAgICAgICAgIC5udWxsYWJsZSgpXG4gICAgICAgICAgLmRlZmF1bHQobnVsbClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBcIldoaWNoIHktYXhpcyB0byBiaW5kICgwID0gbGVmdCwgMSA9IHJpZ2h0KS4gVXNlIG9uIGBjb21ib2Agd2hlbiBzZXJpZXMgaGF2ZSBkaWZmZXJlbnQgdW5pdHMgb3Igc2NhbGVzOyB1c2UgbnVsbCBvdGhlcndpc2UuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lIG9yIG1vcmUgc2VyaWVzIHRvIHBsb3QuIFJlcXVpcmVkIGZvciBldmVyeSBjaGFydCB0eXBlXG4gICAgICAgIGV4Y2VwdCBcXGBjdXN0b21cXGAsIHdoaWNoIGNhcnJpZXMgaXRzIHNlcmllcyBpbnNpZGUgXFxgb3B0aW9uXFxgLlxuICAgICAgICBTbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGApIGFuZFxuICAgICAgICBcXGB3YXRlcmZhbGxcXGAgLyBcXGBoZWF0bWFwXFxgIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7IFxcYGJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGByYWRhclxcYCAvIFxcYHNjYXR0ZXJcXGAgY2FuXG4gICAgICAgIGNhcnJ5IG11bHRpcGxlIHNlcmllcy5cbiAgICAgIGApLFxuICAgICksXG4gIG9wdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgUmVxdWlyZWQgZm9yIFxcYGN1c3RvbVxcYDsgdXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xudHlwZSBDaGFydFBsYW5JbnB1dCA9IHouaW5wdXQ8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG5cbi8qKlxuICogQ2Fub25pY2FsIHBsYW5uZXIgaW5wdXQgc2hhcGUuIFRvb2xzIHRoYXQgc291cmNlIHJvd3MgZnJvbSBhblxuICogaW5saW5lIGRhdGFzZXQgKGByZW5kZXJfZGF0YWApIHVzZSBpdCBhcyB0aGVpciBgaW5wdXRTY2hlbWFgXG4gKiB2ZXJiYXRpbTsgdG9vbHMgdGhhdCByZXNvbHZlIHJvd3MgZnJvbSBhIHJlbW90ZSAoYHByZXBhcmVfY2hhcnRgXG4gKiBvdmVyIGEgR2VuaWUgc3RhdGVtZW50KSBgb21pdCh7IGRhdGEgfSlgIGFuZCBgZXh0ZW5kYCB3aXRoIHRoZWlyXG4gKiBvd24gaWRlbnRpZmllciBmaWVsZCwgc28gdGhlIGZpZWxkLWxldmVsIGAuZGVzY3JpYmUoKWAgdGV4dFxuICogc3RheXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBTZXJ2ZXItb25seSAtIHRoZSBVSSBuZXZlclxuICogc2VlcyBhIHBsYW5uZXIgcmVxdWVzdCwgb25seSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFRhYnVsYXIgZGF0YXNldCB0byBjaGFydC4gT25lIG9iamVjdCBwZXIgcm93LCBrZXllZCBieSBjb2x1bW5cbiAgICAgICAgbmFtZS4gVmFsdWVzIG1heSBiZSBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgbnVsbC4gVGhlXG4gICAgICAgIGNoYXJ0LXBsYW5uZXIgZGVjaWRlcyB3aGljaCBjb2x1bW5zIGFyZSBjYXRlZ29yaWVzIHZzLiBudW1lcmljXG4gICAgICAgIHNlcmllcy4gQ2FwIGF0IGEgZmV3IGh1bmRyZWQgcm93cyBmb3IgbGVnaWJpbGl0eTsgc2FtcGxlIC9cbiAgICAgICAgYWdncmVnYXRlIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxuZXhwb3J0IHR5cGUgQ2hhcnRQbGFubmVyUmVxdWVzdCA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWE+O1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyByZXN1bHQgb2YgZWl0aGVyIGNoYXJ0LXByb2R1Y2luZyB0b29sLlxuICpcbiAqIGBtYXJrZXJgIGlzIGRlbGliZXJhdGVseSByZWR1bmRhbnQgd2l0aCBgY2hhcnRJZGA6IHRoZSBob3N0IHN0aWxsIGtleXMgdGhlXG4gKiBjYWNoZSBieSBpZCwgd2hpbGUgdGhlIG1vZGVsIGdldHMgdGhlIGV4YWN0IG9wYXF1ZSB0b2tlbiB0byBjb3B5IGludG8gcHJvc2VcbiAqIGFuZCBoYXMgbm8gcmVhc29uIHRvIGludmVudCBvciByZXR5cGUgYSBVVUlELlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRUb29sT3V0cHV0U2NoZW1hID0gd2lyZS5DaGFydFNjaGVtYS5waWNrKHsgY2hhcnRJZDogdHJ1ZSB9KS5leHRlbmQoe1xuICBtYXJrZXI6IHpcbiAgICAuc3RyaW5nKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkV4YWN0IGVtYmVkIG1hcmtlci4gQ29weSB0aGlzIGNvbXBsZXRlIHZhbHVlIHZlcmJhdGltIG9udG8gaXRzIG93biBsaW5lOyBuZXZlciBjb25zdHJ1Y3QgYSBtYXJrZXIgZnJvbSBjaGFydElkLlwiLFxuICAgICksXG59KTtcblxuLyoqIFJlc3VsdCByZXR1cm5lZCBzeW5jaHJvbm91c2x5IHdoaWxlIGNoYXJ0IHBsYW5uaW5nIGNvbnRpbnVlcyBpbiB0aGUgYmFja2dyb3VuZC4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0VG9vbE91dHB1dCA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0VG9vbE91dHB1dFNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbGFubmVyIGluc3RydWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBGb3JtYXQge0BsaW5rIHdpcmUuQ2hhcnRUeXBlU2NoZW1hfSdzIHZhcmlhbnRzIGFzIGEgc2luZ2xlXG4gKiBodW1hbi1mcmllbmRseSBzdHJpbmcgb2YgYGAgYDx2YWx1ZT5gIGZvciA8ZGVzY3JpcHRpb24+IGBgXG4gKiBjbGF1c2VzIGpvaW5lZCBieSBzZW1pY29sb25zLCBkcmF3biBmcm9tIGVhY2ggdmFyaWFudCdzIG93blxuICogYC5kZXNjcmliZSgpYCBzbyB0aGUgcGxhbm5lciBwcm9tcHQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGhcbiAqIHRoZSBzY2hlbWEgYnkgY29uc3RydWN0aW9uLlxuICovXG5mdW5jdGlvbiBmb3JtYXRDaGFydFR5cGVQaWNrZXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHdpcmUuQ2hhcnRUeXBlU2NoZW1hLm9wdGlvbnNcbiAgICAubWFwKChvcHQpID0+IGBcXGAke29wdC52YWx1ZX1cXGAgZm9yICR7b3B0LmRlc2NyaXB0aW9uID8/IFwiXCJ9YClcbiAgICAuam9pbihcIjsgXCIpO1xufVxuXG4vKipcbiAqIFN5c3RlbSBwcm9tcHQgZm9yIHRoZSBpbm5lciBjaGFydC1wbGFubmluZyBhZ2VudC4gVHVuZWQgZm9yIGFcbiAqIGZhc3QtdGllciBtb2RlbCAoSGFpa3UsIEdQVC01LW1pbmksIEdlbWluaSBGbGFzaCBMaXRlKS5cbiAqL1xuY29uc3QgQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMgPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIFByZWZlciBcXGBob3Jpem9udGFsQmFyXFxgIHdoZW4gY2F0ZWdvcnkgbGFiZWxzIGFyZSBsb25nLiBQcmVmZXJcbiAgXFxgY29tYm9cXGAgd2hlbiBvbmUgbWVhc3VyZSBpcyBhIGNvdW50L3ZvbHVtZSBhbmQgYW5vdGhlciBpcyBhXG4gIHJhdGUvdHJlbmQuIFByZWZlciBcXGB3YXRlcmZhbGxcXGAgZm9yIGJyaWRnZXMgb2Ygc2lnbmVkIGRlbHRhcy5cbiAgUHJlZmVyIFxcYHNjYXR0ZXJcXGAgd2hlbiBjb3JyZWxhdGluZyB0d28gbnVtZXJpYyBmaWVsZHMgKG5vXG4gIGNhdGVnb3J5IGF4aXMpLiBQcmVmZXIgXFxgaGVhdG1hcFxcYCBmb3IgYSBjYXRlZ29yeSB4IGNhdGVnb3J5XG4gIG1hdHJpeC4gUHJlZmVyIFxcYHJhZGFyXFxgIGZvciBzY29yaW5nIHRoZSBzYW1lIGVudGl0aWVzIGFjcm9zcyBhXG4gIGZpeGVkIHNldCBvZiBkaW1lbnNpb25zLiBOZXZlciBwaWNrIHBpZSBmb3IgbW9yZSB0aGFuIDcgc2xpY2VzXG4gICh1c2UgXFxgdHJlZW1hcFxcYCBpbnN0ZWFkKS4gUHJlZmVyIFxcYGZ1bm5lbFxcYCBmb3Igb3JkZXJlZCBjb252ZXJzaW9uXG4gIHN0YWdlcy5cblxuICBGb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGw6IHBpY2sgb25lXG4gIGNvbHVtbiBhcyB0aGUgY2F0ZWdvcnkgYXhpcyAodXN1YWxseSB0aGUgb25seSBzdHJpbmctdmFsdWVkIGNvbHVtbilcbiAgYW5kIG9uZSBvciBtb3JlIG51bWVyaWMgY29sdW1ucyBhcyBzZXJpZXMuIFNvcnQgY2F0ZWdvcmllcyBieSB0aGVcbiAgcHJpbWFyeSBzZXJpZXMgdmFsdWUgZGVzY2VuZGluZyB1bmxlc3MgdGhlIGRhdGEgaXMgbmF0dXJhbGx5IG9yZGVyZWRcbiAgKGRhdGVzLCByYW5rcywgZnVubmVsIHN0YWdlcywgd2F0ZXJmYWxsIHN0ZXBzKS4gRm9yIFxcYGNvbWJvXFxgLCBzZXRcbiAgZWFjaCBzZXJpZXMnIFxcYHR5cGVcXGAgdG8gXFxgYmFyXFxgLCBcXGBsaW5lXFxgLCBvciBcXGBhcmVhXFxgLCBhbmQgdXNlXG4gIFxcYHlBeGlzSW5kZXg6IDFcXGAgd2hlbiBhIHNlcmllcyBuZWVkcyBhIHNlY29uZCBzY2FsZS5cblxuICBGb3Igd2F0ZXJmYWxsLCBlbWl0IGV4YWN0bHkgT05FIHNlcmllcyBob2xkaW5nIHRoZSBzaWduZWQgc3RlcCB2YWx1ZXNcbiAgKGRlbHRhcyksIG9uZSBwZXIgY2F0ZWdvcnksIGluIG9yZGVyIC0gcG9zaXRpdmUgZm9yIGEgcmlzZSwgbmVnYXRpdmVcbiAgZm9yIGEgZHJvcC4gRG8gTk9UIGFkZCBhIGN1bXVsYXRpdmUgLyBydW5uaW5nLXRvdGFsIC8gYmFzZSBzZXJpZXMgYW5kXG4gIGRvIE5PVCBjb252ZXJ0IHRoZSBkZWx0YXMgaW50byBydW5uaW5nIHRvdGFscyB5b3Vyc2VsZjsgdGhlIHJ1bm5pbmdcbiAgdG90YWwgaXMgY29tcHV0ZWQgZm9yIHlvdSwgYW5kIGEgaGFuZC1idWlsdCBiYXNlIHNlcmllcyByZW5kZXJzIGFzIGFcbiAgcGxhaW4gYmFyIGNoYXJ0IGluc3RlYWQgb2YgYSBicmlkZ2UuXG5cbiAgRm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXA6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXNcbiAgYW5kIG9uZSBudW1lcmljIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcyBvZlxuICBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG5cbiAgRm9yIHNjYXR0ZXI6IHBpY2sgdHdvIG51bWVyaWMgY29sdW1ucyBhbmQgZW1pdCBcXGBbeCwgeV1cXGAgdHVwbGVzIGluXG4gIG9uZSBvciBtb3JlIHNlcmllcyAob25lIHNlcmllcyBwZXIgZ3JvdXAgaWYgYSBncm91cGluZyBjb2x1bW4gZXhpc3RzKS5cblxuICBGb3IgaGVhdG1hcDogcGljayB0d28gY2F0ZWdvcnkgY29sdW1ucyBhbmQgb25lIG51bWVyaWMgbWVhc3VyZS4gUHV0XG4gIHRoZSB4LWF4aXMgY2F0ZWdvcmllcyBpbiBcXGBjYXRlZ29yaWVzXFxgLCB0aGVuIGVtaXQgT05FIFNFUklFUyBQRVIgUk9XXG4gIG9mIHRoZSBtYXRyaXggLSB0aGUgc2VyaWVzIFxcYG5hbWVcXGAgaXMgdGhlIHJvdyBsYWJlbCBhbmQgXFxgZGF0YVxcYCBpc1xuICB0aGUgcm93J3MgbnVtYmVycywgb25lIHBlciBlbnRyeSBpbiBcXGBjYXRlZ29yaWVzXFxgLCBpbiB0aGUgc2FtZSBvcmRlci5cbiAgRG8gbm90IGNvbXB1dGUgY2VsbCBpbmRpY2VzLlxuXG4gIEZvciByYWRhcjogXFxgY2F0ZWdvcmllc1xcYCBhcmUgdGhlIGluZGljYXRvciBuYW1lczsgZWFjaCBzZXJpZXMgaXMgYW5cbiAgYXJyYXkgb2YgbnVtYmVycyAob25lIHZhbHVlIHBlciBpbmRpY2F0b3IpLlxuXG4gIEZvciBhbnl0aGluZyB0aGUgdHlwZXMgYWJvdmUgY2Fubm90IGV4cHJlc3MgLSBhIHNhbmtleSwgYm94cGxvdCxcbiAgY2FuZGxlc3RpY2ssIHN1bmJ1cnN0LCBnYXVnZSwgbmV0d29yayBncmFwaCwgY2FsZW5kYXIsIHBhcmFsbGVsLVxuICBjb29yZGluYXRlcyBwbG90LCBvciBhbnkgb3RoZXIgRWNoYXJ0cyBzZXJpZXMgLSB1c2UgXFxgY3VzdG9tXFxgIGFuZFxuICBoYW5kLXdyaXRlIHRoZSB3aG9sZSBFY2hhcnRzIG9wdGlvbiBpbnRvIFxcYG9wdGlvblxcYCBhcyBhIEpTT04gc3RyaW5nLlxuICBJbmNsdWRlIGV2ZXJ5IHBhcnQgdGhhdCBjaGFydCBuZWVkczogdGhlIHNlcmllcyB3aXRoIHRoZWlyIG93blxuICBcXGB0eXBlXFxgIGFuZCBkYXRhIHNoYXBlLCBwbHVzIGFueSBjb29yZGluYXRlIHN5c3RlbSwgXFxgdmlzdWFsTWFwXFxgLFxuICBvciBheGVzLiBMZWF2ZSBcXGBzZXJpZXNcXGAsIFxcYGNhdGVnb3JpZXNcXGAsIGFuZCB0aGUgYXhpcyBsYWJlbHMgb3V0O1xuICB0aGV5IGFyZSBpZ25vcmVkIGZvciBcXGBjdXN0b21cXGAuIFByZWZlciBhIGxpc3RlZCB0eXBlIHdoZW5ldmVyIG9uZVxuICBnZW51aW5lbHkgZml0cyAtIFxcYGN1c3RvbVxcYCBnaXZlcyB1cCB0aGUgc2hhcmVkIHRvb2x0aXAsIGxlZ2VuZCwgYW5kXG4gIGdyaWQgZGVmYXVsdHMsIHNvIGl0IGlzIHRoZSBhbnN3ZXIgZm9yIGFuIHVuc3VwcG9ydGVkIGNoYXJ0IHNoYXBlLFxuICBub3QgYSB3YXkgdG8gcmVzdHlsZSBhIHN1cHBvcnRlZCBvbmUuXG5cbiAgS2VlcCBzZXJpZXMgbmFtZXMgaHVtYW4tcmVhZGFibGUgKHVzZSB0aGUgY29sdW1uIG5hbWU7IHRpdGxlIGNhc2UgaXRcbiAgbGlnaHRseSBpZiBuZWVkZWQpLiBLZWVwIHRpdGxlcyBjb25jaXNlOyBkbyBub3QgcmVwZWF0IHRoZSB1c2VyJ3NcbiAgdGl0bGUgaW4geEF4aXNMYWJlbCAvIHlBeGlzTGFiZWwuXG5gKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBhZ2VudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBwbGFubmVyIGBBZ2VudGAgcGVyIHBsdWdpbiBjb25maWcuIENhY2hlZCBvbiBjb25maWcgb2JqZWN0XG4gKiBpZGVudGl0eSBzbyBjYWxsZXJzIGNhbiBgcHJlcGFyZUNoYXJ0KHsgY29uZmlnLCAuLi4gfSlgIGZyb20gYVxuICogaG90IHBhdGggd2l0aG91dCBwYXlpbmcgdGhlIEFnZW50LWNvbnN0cnVjdG9yIGNvc3QgZXZlcnkgY2FsbC5cbiAqIGBXZWFrTWFwYCBsZXRzIHJldGlyZWQgY29uZmlncyAoZS5nLiB0ZXN0IHJlY29uZmlndXJhdGlvbnMpXG4gKiByZWxlYXNlIHRoZWlyIGFnZW50IHdpdGhvdXQgbWFudWFsIGV2aWN0aW9uLlxuICovXG5jb25zdCBwbGFubmVyQWdlbnRzID0gbmV3IFdlYWtNYXA8TWFzdHJhUGx1Z2luQ29uZmlnLCBBZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0UGxhbm5lckFnZW50KGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQWdlbnQge1xuICBsZXQgYWdlbnQgPSBwbGFubmVyQWdlbnRzLmdldChjb25maWcpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQ6IFwiY2hhcnRfcGxhbm5lclwiLFxuICAgICAgbmFtZTogXCJDaGFydCBQbGFubmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQaWNrcyBjaGFydCB0eXBlIGFuZCBheGlzIGVuY29kaW5ncyBmb3IgYSBkYXRhc2V0LlwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyxcbiAgICAgIG1vZGVsOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxDbGFzczogbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdCB9KSxcbiAgICB9KTtcbiAgICBwbGFubmVyQWdlbnRzLnNldChjb25maWcsIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKlxuICogUnVuIHRoZSBwbGFubmVyIGFnYWluc3QgYHJlcXVlc3RgIGFuZCByZXR1cm4gdGhlIHJlc29sdmVkXG4gKiBFY2hhcnRzIHNwZWMuIFRocm93cyBvbiBwbGFubmVyIGZhaWx1cmUgLSB7QGxpbmsgcHJlcGFyZUNoYXJ0fVxuICogY2F0Y2hlcyBhbmQgc3Rhc2hlcyB0aGUgZXJyb3IgaW4gdGhlIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5DaGFydFBsYW5uZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0OiBDaGFydFBsYW5uZXJSZXF1ZXN0LFxuICBvcHRpb25zOiB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuKTogUHJvbWlzZTxDaGFydFJlc3VsdD4ge1xuICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gcmVxdWVzdDtcbiAgY29uc3QgeyByZXF1ZXN0Q29udGV4dCwgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb21wdCA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oe1xuICAgIFRpdGxlOiB0aXRsZSxcbiAgICAuLi4oZGVzY3JpcHRpb24gPyB7IERlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIFwiRGF0YXNldCAoSlNPTiwgb25lIHJvdyBwZXIgb2JqZWN0KVwiOiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFBsYW5uZXJBZ2VudChjb25maWcpLmdlbmVyYXRlKHByb21wdCwge1xuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHsgc2NoZW1hOiBjaGFydFBsYW5TY2hlbWEgfSxcbiAgICAuLi4ocmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgLi4uKGFib3J0U2lnbmFsID8geyBhYm9ydFNpZ25hbCB9IDoge30pLFxuICB9KTtcbiAgY29uc3QgcGxhbiA9IGNoYXJ0UGxhblNjaGVtYS5wYXJzZShyZXN1bHQub2JqZWN0KTtcbiAgY29uc3Qgb3B0aW9uID0gcGxhblRvRWNoYXJ0c09wdGlvbihwbGFuLCB0aXRsZSwgY29uZmlnLmJyYW5kKTtcbiAgcmV0dXJuIHsgY2hhcnRUeXBlOiBwbGFuLmNoYXJ0VHlwZSwgb3B0aW9uIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYW5vbmljYWwgY2FjaGUga2V5IGZvciBhIGBjaGFydElkYCBvd25lZCBieSBgdXNlcktleWAuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSwgbm90IGEgZmlsdGVyIGFwcGxpZWQgYWZ0ZXIgdGhlIHJlYWQsIHNvIGFcbiAqIGNoYXJ0IGlkIGd1ZXNzZWQgb3IgY29waWVkIGZyb20gYW5vdGhlciB1c2VyJ3MgdHJhbnNjcmlwdCByZXNvbHZlcyB0byBhXG4gKiBkaWZmZXJlbnQga2V5IGFuZCBzaW1wbHkgbWlzc2VzLiBUaGF0IG1pc3MgaXMgd2hhdCB0aGUgSFRUUCByb3V0ZSB0dXJucyBpbnRvXG4gKiBhIDQwNCwgd2hpY2ggaXMgYWxzbyB0aGUgYW5zd2VyIHRoYXQgbGVha3MgdGhlIGxlYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGFydENhY2hlS2V5KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIChhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSkuZ2VuZXJhdGVLZXkoW0NIQVJUX0NBQ0hFX05BTUVTUEFDRSwgY2hhcnRJZF0sIHVzZXJLZXkpO1xufVxuXG4vKipcbiAqIFBlcnNpc3QgYSB7QGxpbmsgQ2hhcnR9IGVudHJ5IHVuZGVyIGl0cyBgY2hhcnRJZGAsIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqIFJlZnJlc2hlcyB0aGUgVFRMIG9uIGV2ZXJ5IHdyaXRlLiBDYWNoZS1sYXllciBmYWlsdXJlcyBhcmUgbG9nZ2VkIGFuZFxuICogc3dhbGxvd2VkIHNvIGJhY2tncm91bmQgcnVubmVycyBuZXZlciB0aHJvdyBpbnRvIHRoZVxuICogdW5oYW5kbGVkLXJlamVjdGlvbiBzdHJlYW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhcnQoZW50cnk6IENoYXJ0LCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGVudHJ5LmNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoa2V5LCBlbnRyeSwge1xuICAgICAgdHRsOiBDSEFSVF9DQUNIRV9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcIndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQ6IGVudHJ5LmNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExvb2sgdXAgYSBjaGFydCBgdXNlcktleWAgb3ducy4gUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvblxuICogZXhwaXJ5LCB3aGVuIGFub3RoZXIgaWRlbnRpdHkgb3ducyB0aGUgaWQsIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyIGlzXG4gKiB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDaGFydChjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGNvbnN0IHYgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0PENoYXJ0PihrZXkpO1xuICAgIHJldHVybiB2ID8/IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJyZWFkLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGhhc2guaWQoKTtcbiAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQgfSwgb3B0cy51c2VyS2V5KTtcbiAgbG9nZ2VyLmRlYnVnKFwicXVldWVkXCIsIHsgY2hhcnRJZCB9KTtcbiAgLy8gRmlyZS1hbmQtZm9yZ2V0LiBGYWlsdXJlcyBsYW5kIGluIHRoZSBjYWNoZSBhcyBgZXJyb3JgIGVudHJpZXM7XG4gIC8vIG5ldmVyIGVzY2FwZSBpbnRvIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gIHZvaWQgcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQsIG9wdHMpO1xuICByZXR1cm4geyBjaGFydElkLCBtYXJrZXI6IG1hcmtlcnMuZm9ybWF0TWFya2VyKFwiY2hhcnRcIiwgY2hhcnRJZCkgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIC8vIFRoZSBlbnRyeSdzIGBlcnJvcmAgaXMgcmVuZGVyZWQgaW4gdGhlIGNoYXQsIHNvIG9ubHkgYW4gQXBwS2l0RXJyb3Inc1xuICAgIC8vIG93biBtZXNzYWdlIHRyYXZlbHM7IGFueXRoaW5nIGVsc2UgY291bGQgY2FycnkgdXBzdHJlYW0gcHJvdmlkZXIgZGV0YWlsLlxuICAgIGNvbnN0IGVyclRleHQgPSBlcnIgaW5zdGFuY2VvZiBBcHBLaXRFcnJvciA/IGVyci5tZXNzYWdlIDogQ0hBUlRfRkFJTEVEX01FU1NBR0U7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIGVycm9yOiBlcnJUZXh0IH0sIG9wdHMudXNlcktleSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nLXBvbGwgZmV0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hDaGFydE9wdGlvbnMge1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhlIGNoYXJ0IG11c3QgYmVsb25nIHRvLiBBIGNoYXJ0IG1pbnRlZCB1bmRlciBhIGRpZmZlcmVudCBrZXlcbiAgICogaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiB1bmtub3duIGlkLiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIHBvbGxpbmcgYnVkZ2V0IGluIG1zLiBXaGVuIHRoZSBlbnRyeSBzdGF5cyBpblxuICAgKiB0aGUgcHJvY2Vzc2luZyBzdGF0ZSBwYXN0IHRoaXMgd2luZG93LCB0aGUgaGVscGVyIHJldHVybnMgdGhlXG4gICAqIGxhc3Qgc2VlbiB2YWx1ZSAoc3RpbGwgcHJvY2Vzc2luZykgc28gdGhlIGNsaWVudCBjYW4gcmUtcG9sbC5cbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NU30gKDYwcykuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQb2xsIGludGVydmFsIGluIG1zLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NU30gKDI1MG1zKS5cbiAgICovXG4gIGludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24gaGFuZGxlIChlLmcuIHJlcXVlc3QgYHJlcS5zaWduYWxgKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTG9uZy1wb2xsIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnkgc2V0dGxlcyAoYHJlc3VsdGAgb3JcbiAqIGBlcnJvcmAgc2V0KSwgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIG9yIHRoZSBzZXJ2ZXItc2lkZSB0aW1lb3V0XG4gKiBlbGFwc2VzLlxuICpcbiAqIFJldHVybnM6XG4gKiAgIC0gdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0gd2hlbiBpdCBzZXR0bGVkLCBlcnJvcmVkLCBvclxuICogICAgIHN0YXllZCBpbiBwcm9jZXNzaW5nIHBhc3QgYHRpbWVvdXRNc2AgKHNvIHRoZSBjbGllbnQgY2FuXG4gKiAgICAgcmUtcG9sbCk7XG4gKiAgIC0gYHVuZGVmaW5lZGAgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZywgZXhwaXJlZCwgb3Igb3duZWQgYnlcbiAqICAgICBhbm90aGVyIGlkZW50aXR5ICh0aGUgY29uc3VtZXIgc2hvdWxkIHRyZWF0IGFzIDQwNCkuXG4gKlxuICogYHNpZ25hbGAgbGV0cyB0aGUgY2FsbGVyIGNhbmNlbCBhaGVhZCBvZiB0aW1lb3V0IChlLmcuIHRoZSBIVFRQXG4gKiByZXF1ZXN0IGNsb3NlZCkuIENhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBpbnRlci1wb2xsIHNsZWVwXG4gKiBzbyB0aGUgaGVscGVyIHJldHVybnMgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENoYXJ0KFxuICBjaGFydElkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEZldGNoQ2hhcnRPcHRpb25zLFxuKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVM7XG4gIGNvbnN0IGludGVydmFsTXMgPSBvcHRpb25zLmludGVydmFsTXMgPz8gREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUztcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuXG4gIGxldCBsYXN0OiBDaGFydCB8IHVuZGVmaW5lZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBsYXN0ID0gYXdhaXQgcmVhZENoYXJ0KGNoYXJ0SWQsIG9wdGlvbnMudXNlcktleSk7XG4gICAgaWYgKCFsYXN0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChsYXN0LnJlc3VsdCAhPT0gdW5kZWZpbmVkIHx8IGxhc3QuZXJyb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGxhc3Q7XG4gICAgY29uc3QgcmVtYWluaW5nID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpO1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCkgcmV0dXJuIGxhc3Q7XG4gICAgYXdhaXQgYXN5bmNVdGlscy5zbGVlcChNYXRoLm1pbihpbnRlcnZhbE1zLCByZW1haW5pbmcpLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZWNoYXJ0cyB0aGVtZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBzbGljZSBvZiBhbiBFY2hhcnRzIG9wdGlvbiB0aGF0IGNhcnJpZXMgYnJhbmQgaWRlbnRpdHk6IHRoZSBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCB0aGUgYmFzZSBmb250IHN0YWNrLiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fVxuICogYnkge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0gYW5kIG1lcmdlZCBpbnRvIGV2ZXJ5IHNwZWMgYnlcbiAqIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyB0ZXh0IENPTE9SLiBBIHNwZWMgaXMgcGxhbm5lZCBoZXJlLCBvbiB0aGVcbiAqIHNlcnZlciwgYW5kIHJlYWQgbGF0ZXIgaW4gYSBicm93c2VyIHdob3NlIGxpZ2h0L2RhcmsgdGhlbWUgdGhpcyBjb2RlXG4gKiBjYW5ub3Qga25vdzsgYmFraW5nIGluIHRoZSBicmFuZCdzIHNpbmdsZSAobGlnaHQpIGZvcmVncm91bmQgcHJvZHVjZWRcbiAqIG5lYXItYmxhY2sgbGFiZWxzIHRoYXQgZGlzYXBwZWFyZWQgYWdhaW5zdCBhIGRhcmsgY2hhdCBzdXJmYWNlLiBUaGVcbiAqIHJlbmRlcmVyIHJlc29sdmVzIGNocm9tZSBjb2xvcnMgZnJvbSBBcHBLaXQncyBsaXZlIENTUyB0b2tlbnMgaW5zdGVhZFxuICogKGBAZGJ4LXRvb2xzL3VpLW1hc3RyYWAncyBgY2hhcnQtdGhlbWVgICsgYG5vcm1hbGl6ZUNoYXJ0T3B0aW9uYCksXG4gKiBsZWF2aW5nIHRoaXMgdGhlbWUgdGhlIHBhcnRzIHRoYXQgcmVhZCB0aGUgc2FtZSBpbiBlaXRoZXIgbW9kZS5cbiAqL1xuaW50ZXJmYWNlIENoYXJ0VGhlbWUge1xuICBjb2xvcjogc3RyaW5nW107XG4gIHRleHRTdHlsZTogeyBmb250RmFtaWx5OiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBcHBLaXQncyBjYXRlZ29yaWNhbCBjaGFydCBwYWxldHRlIChgLS1jaGFydC1jYXQtMWAgLi4gYC0tY2hhcnQtY2F0LThgIGZyb21cbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQtdWlgKSwgYXMgaGV4LiBTZXJ2ZXItcmVuZGVyZWQgY2hhcnQgc3BlY3MgY2Fubm90IHJlYWQgdGhlXG4gKiBicm93c2VyJ3MgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBzbyB0aGUgdmFsdWVzIGFyZSBtaXJyb3JlZCBoZXJlIHRvIGtlZXAgYVxuICogZ2VuZXJhdGVkIGNoYXJ0IHZpc3VhbGx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgQXBwS2l0LXN0eWxlZCBVSSBhcm91bmQgaXQuXG4gKiBLZWVwIGluIHN5bmMgd2l0aCBBcHBLaXQncyBzdHlsZXNoZWV0IGlmIGl0IGNoYW5nZXMuXG4gKi9cbmNvbnN0IEFQUEtJVF9DSEFSVF9QQUxFVFRFID0gW1xuICBcIiMyNDYzRUJcIiwgLy8gYmx1ZVxuICBcIiMyRUI4OEFcIiwgLy8gdGVhbFxuICBcIiNBQjQ3QkRcIiwgLy8gcHVycGxlXG4gIFwiI0Y2OUUyM1wiLCAvLyBhbWJlclxuICBcIiNERDJDNERcIiwgLy8gcm9zZVxuICBcIiMxQkEzQkJcIiwgLy8gY3lhblxuICBcIiM5QjYxRDFcIiwgLy8gbGF2ZW5kZXJcbiAgXCIjMzRCMjYyXCIsIC8vIGVtZXJhbGRcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXhwYW5kIHR3byBicmFuZCBoZXggY29sb3JzIGludG8gYSBsZWdpYmxlIGNhdGVnb3JpY2FsIGN5Y2xlLiBFY2hhcnRzXG4gKiByZXBlYXRzIHRoZSBgY29sb3JgIGFycmF5IGFjcm9zcyBzZXJpZXMgLyBjYXRlZ29yaWVzLCBzbyBhIGdvb2QgZGVmYXVsdFxuICogbmVlZHMgc2V2ZXJhbCBkaXN0aW5jdCBodWVzLCBub3QgdHdvLiBXZSBzZWVkIHdpdGggdGhlIGJyYW5kIHByaW1hcnkgYW5kXG4gKiBhY2NlbnQgKHRoZSBpZGVudGl0eSBjb2xvcnMpIGFuZCBmb2xsb3cgd2l0aCBBcHBLaXQncyBvd24gY2F0ZWdvcmljYWwgY2hhcnRcbiAqIHBhbGV0dGUsIHNvIG11bHRpLXNlcmllcyAvIG1hbnktc2xpY2UgY2hhcnRzIHN0YXkgcmVhZGFibGUgYW5kIG1hdGNoIHRoZVxuICogc3Vycm91bmRpbmcgQXBwS2l0IFVJIHdoaWxlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIG1hcmtzIGxhbmQgb24tYnJhbmQuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ29sb3JDeWNsZShwcmltYXJ5OiBzdHJpbmcsIGFjY2VudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcHJlYWQgPSBBUFBLSVRfQ0hBUlRfUEFMRVRURTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gW3ByaW1hcnksIGFjY2VudCwgLi4uc3ByZWFkXS5maWx0ZXIoKGMpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gRWNoYXJ0cyB7QGxpbmsgQ2hhcnRUaGVtZX0gZnJvbSBhIGJyYW5kIGNvbnRleHQ6IHRoZSBwcmltYXJ5ICtcbiAqIGFjY2VudCBjb2xvcnMgc2VlZCB0aGUgc2VyaWVzIGN5Y2xlIGFuZCB0aGUgc2FucyBzdGFjayBiZWNvbWVzIHRoZSBiYXNlXG4gKiBmb250LiBUZXh0IGNvbG9ycyBhcmUgdGhlIHJlbmRlcmVyJ3Mgam9iIC0gc2VlIHtAbGluayBDaGFydFRoZW1lfS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDaGFydFRoZW1lKGJyYW5kOiBCcmFuZENvbnRleHQpOiBDaGFydFRoZW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb2xvcjogYnJhbmRDb2xvckN5Y2xlKGJyYW5kLmNvbG9ycy5wcmltYXJ5LCBicmFuZC5jb2xvcnMuYWNjZW50KSxcbiAgICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogYnJhbmQudHlwb2dyYXBoeS5zYW5zIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTmFtZWRTbGljZSA9IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH07XG50eXBlIFNjYXR0ZXJQb2ludCA9IFtudW1iZXIsIG51bWJlcl07XG50eXBlIEhlYXRtYXBDZWxsID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogS2VlcCBvbmx5IGB7bmFtZSwgdmFsdWV9YCBzbGljZXM7IGRyb3AgbnVsbHMgLyBiYXJlIG51bWJlcnMgLyB0dXBsZXMuICovXG5mdW5jdGlvbiBuYW1lZFNsaWNlcyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBOYW1lZFNsaWNlW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIE5hbWVkU2xpY2UgPT4gZCAhPT0gbnVsbCAmJiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkKSxcbiAgKTtcbn1cblxuLyoqIEtlZXAgb25seSBmaW5pdGUgbnVtYmVycyAoY2F0ZWdvcnkgLyByYWRhciAvIHdhdGVyZmFsbCBzZXJpZXMpLiAqL1xuZnVuY3Rpb24gbnVtZXJpY1BvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBudW1iZXJbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgbnVtYmVyID0+IHR5cGVvZiBkID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShkKSk7XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4LCB5XWAgc2NhdHRlciB0dXBsZXMuICovXG5mdW5jdGlvbiBzY2F0dGVyUG9pbnRzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IFNjYXR0ZXJQb2ludFtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBTY2F0dGVyUG9pbnQgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMixcbiAgKSBhcyBTY2F0dGVyUG9pbnRbXTtcbn1cblxuLyoqIEtlZXAgb25seSBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbHMuICovXG5mdW5jdGlvbiBoZWF0bWFwQ2VsbHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogSGVhdG1hcENlbGxbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgSGVhdG1hcENlbGwgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMykgYXMgSGVhdG1hcENlbGxbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgaGVhdG1hcCdzIGNlbGxzIGFuZCByb3cgbGFiZWxzIGZyb20gZWl0aGVyIHNoYXBlIHRoZVxuICogcGxhbm5lciBtYXkgcHJvZHVjZS5cbiAqXG4gKiBUaGUgZG9jdW1lbnRlZCBzaGFwZSBpcyBPTkUgc2VyaWVzIG9mIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWBcbiAqIHRyaXBsZXMsIGJ1dCBpbmRleCBhcml0aG1ldGljIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgYm9va2tlZXBpbmcgYVxuICogZmFzdCBtb2RlbCBnZXRzIHdyb25nLCBhbmQgdGhlIGZhaWx1cmUgaXMgc2lsZW50IChldmVyeSBjZWxsIGlzXG4gKiBkcm9wcGVkIGFuZCB0aGUgZ3JpZCByZW5kZXJzIGVtcHR5KS4gU28gdGhlIHJvdy1wZXItc2VyaWVzIHNoYXBlIGl0XG4gKiBhbHJlYWR5IHByb2R1Y2VzIHJlbGlhYmx5IGZvciBiYXIgY2hhcnRzIC0gb25lIHNlcmllcyBwZXIgbWF0cml4XG4gKiByb3csIG51bWJlcnMgYWxpZ25lZCB0byBgY2F0ZWdvcmllc2AgLSBpcyBhY2NlcHRlZCB0b28gYW5kIHR1cm5lZFxuICogaW50byB0cmlwbGVzIGhlcmUuXG4gKlxuICogUm93IG9yZGVyIHJlYWRzIHRvcC10by1ib3R0b206IEVjaGFydHMnIGNhdGVnb3J5IHktYXhpcyBjb3VudHMgaW5kZXhcbiAqIDAgZnJvbSB0aGUgQk9UVE9NLCBzbyBhIHJvdy1kZXJpdmVkIG1hdHJpeCByZXZlcnNlcyBib3RoIHRoZSBheGlzXG4gKiBsYWJlbHMgYW5kIHRoZSByb3cgaW5kaWNlcywgcHV0dGluZyB0aGUgZmlyc3Qgc2VyaWVzIGF0IHRoZSB0b3AgdGhlXG4gKiB3YXkgdGhlIG1vZGVsIGxpc3RlZCBpdC5cbiAqL1xuZnVuY3Rpb24gaGVhdG1hcE1hdHJpeChwbGFuOiBDaGFydFBsYW4pOiB7IGNlbGxzOiBIZWF0bWFwQ2VsbFtdOyB5Q2F0ZWdvcmllczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHRyaXBsZXMgPSBoZWF0bWFwQ2VsbHMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICBpZiAodHJpcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgY2VsbHM6IHRyaXBsZXMsIHlDYXRlZ29yaWVzOiBwbGFuLnlDYXRlZ29yaWVzID8/IFtdIH07XG4gIH1cbiAgY29uc3Qgcm93cyA9IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHsgbmFtZTogcy5uYW1lLCB2YWx1ZXM6IG51bWVyaWNQb2ludHMocy5kYXRhKSB9KSk7XG4gIGNvbnN0IGxhYmVscyA9IHBsYW4ueUNhdGVnb3JpZXMgPz8gcm93cy5tYXAoKHIpID0+IHIubmFtZSk7XG4gIGNvbnN0IGxhc3RSb3cgPSByb3dzLmxlbmd0aCAtIDE7XG4gIHJldHVybiB7XG4gICAgY2VsbHM6IHJvd3MuZmxhdE1hcCgocm93LCByb3dJbmRleCkgPT5cbiAgICAgIHJvdy52YWx1ZXMubWFwKCh2YWx1ZSwgY29sdW1uSW5kZXgpOiBIZWF0bWFwQ2VsbCA9PiBbY29sdW1uSW5kZXgsIGxhc3RSb3cgLSByb3dJbmRleCwgdmFsdWVdKSxcbiAgICApLFxuICAgIHlDYXRlZ29yaWVzOiBbLi4ubGFiZWxzXS5yZXZlcnNlKCksXG4gIH07XG59XG5cbi8qKiBTZXF1ZW50aWFsIGxpZ2h0LXRvLWJyYW5kIHJhbXAgZm9yIGhlYXRtYXAgaW50ZW5zaXR5LiAqL1xuY29uc3QgSEVBVE1BUF9SQU1QID0gW1wiI0VBRjFGRVwiLCBcIiM5Q0JERjdcIiwgXCIjNEM4NkVFXCIsIFwiIzI0NjNFQlwiLCBcIiMxNDM4N0ZcIl07XG5cbi8qKiBBYm92ZSB0aGlzIG1hbnkgY2VsbHMsIHByaW50ZWQgdmFsdWVzIG92ZXJsYXAgYW5kIGFyZSBzdXBwcmVzc2VkLiAqL1xuY29uc3QgSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgPSA2MDtcblxuLyoqIFJpc2luZyBzdGVwIGZpbGwgKGVtZXJhbGQpIGFuZCBmYWxsaW5nIHN0ZXAgZmlsbCAocm9zZSkuICovXG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgPSBcIiMyRUI4OEFcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiA9IFwiI0REMkM0RFwiO1xuXG4vKiogU2VyaWVzIG5hbWVzIHRoZSB3YXRlcmZhbGwgZXhwYW5zaW9uIGVtaXRzLiAqL1xuY29uc3QgV0FURVJGQUxMX0hFTFBFUl9OQU1FID0gXCJSdW5uaW5nIHRvdGFsXCI7XG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSA9IFwiSW5jcmVhc2VcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FID0gXCJEZWNyZWFzZVwiO1xuXG4vKipcbiAqIEEgbW9kZWwgYXNrZWQgZm9yIGEgYnJpZGdlIG9mdGVuIGJ1aWxkcyB0aGUgcnVubmluZyB0b3RhbCBpdHNlbGYgYW5kXG4gKiBoYW5kcyBiYWNrIGEgY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyBhbG9uZ3NpZGUgdGhlIGRlbHRhcyAtIHdoaWNoXG4gKiByZW5kZXJzIGFzIHR3byBwbGFpbiBiYXIgc2VyaWVzLCBub3QgYSB3YXRlcmZhbGwgKHRoZSBiYXNlIGJhcnMgYXJlXG4gKiB0aGUgdGFsbCBvbmVzKS4gVGhlIGJhc2UgaXMgcmVjb2duaXphYmxlIGJ5IG5hbWUsIHNvIGl0IGlzIGRyb3BwZWRcbiAqIGhlcmUgYW5kIHRoZSBydW5uaW5nIHRvdGFsIHJlY29tcHV0ZWQgZnJvbSB0aGUgZGVsdGFzLlxuICovXG5jb25zdCBXQVRFUkZBTExfQkFTRV9OQU1FID0gL1xcYihiYXNlfGN1bXVsYXRpdmV8cnVubmluZ3xoZWxwZXJ8dG90YWx8c3RhcnQoaW5nKT8pXFxiL2k7XG5cbi8qKlxuICogUGljayB0aGUgc2lnbmVkLWRlbHRhIHNlcmllcyBvdXQgb2YgYSB3YXRlcmZhbGwgcGxhbiwgaWdub3JpbmcgYW55XG4gKiBjdW11bGF0aXZlLWJhc2Ugc2VyaWVzIHRoZSBwbGFubmVyIGJ1aWx0IGJ5IGhhbmRcbiAqICh7QGxpbmsgV0FURVJGQUxMX0JBU0VfTkFNRX0pLiBGYWxscyBiYWNrIHRvIHRoZSBmaXJzdCBzZXJpZXMgd2hlblxuICogZXZlcnkgbmFtZSBsb29rcyBsaWtlIGEgYmFzZSwgc2luY2UgZHJvcHBpbmcgdGhlbSBhbGwgd291bGQgbGVhdmVcbiAqIG5vdGhpbmcgdG8gcGxvdC5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsRGVsdGFTZXJpZXMoXG4gIHNlcmllczogQ2hhcnRQbGFuW1wic2VyaWVzXCJdLFxuKTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2VyaWVzLmZpbmQoKHMpID0+ICFXQVRFUkZBTExfQkFTRV9OQU1FLnRlc3Qocy5uYW1lKSkgPz8gc2VyaWVzWzBdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzdGFja2VkIHRyYW5zcGFyZW50LWJhc2UgKyBpbmNyZWFzZSArIGRlY3JlYXNlIHNlcmllcyB0aGF0XG4gKiBFY2hhcnRzIHVzZXMgZm9yIGEgd2F0ZXJmYWxsIChpdCBoYXMgbm8gbmF0aXZlIHdhdGVyZmFsbCB0eXBlKS5cbiAqIFZhbHVlcyBhcmUgc2lnbmVkIGRlbHRhczsgdGhlIHRyYW5zcGFyZW50IGhlbHBlciBjYXJyaWVzIHRoZSBydW5uaW5nXG4gKiB0b3RhbCBzbyBlYWNoIHZpc2libGUgYmFyIHN0YXJ0cyB3aGVyZSB0aGUgcHJldmlvdXMgb25lIGVuZGVkLlxuICpcbiAqIFRoZSBoZWxwZXIgaXMgYHNpbGVudGAsIHNvIHdpdGggYW4gaXRlbS10cmlnZ2VyZWQgdG9vbHRpcCBpdCBpc1xuICogaW52aXNpYmxlIHRvIGJvdGggdGhlIGV5ZSBhbmQgdGhlIHBvaW50ZXIgLSB0aGUgYWx0ZXJuYXRpdmUsIGFuIGF4aXNcbiAqIHRvb2x0aXAgdGhhdCBoaWRlcyB0aGUgaGVscGVyIHJvdywgbmVlZHMgYSBmdW5jdGlvbiBmb3JtYXR0ZXIsIGFuZFxuICogdGhpcyBzcGVjIGhhcyB0byBzdXJ2aXZlIEpTT04gc2VyaWFsaXphdGlvbiB0byB0aGUgYnJvd3Nlci5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsU2VyaWVzKHZhbHVlczogbnVtYmVyW10pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBoZWxwZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBjb25zdCBkZWNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBsZXQgY3VtdWxhdGl2ZSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlKTtcbiAgICAgIGluY3JlYXNlcy5wdXNoKHZhbHVlKTtcbiAgICAgIGRlY3JlYXNlcy5wdXNoKFwiLVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVycy5wdXNoKGN1bXVsYXRpdmUgKyB2YWx1ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgICBkZWNyZWFzZXMucHVzaCgtdmFsdWUpO1xuICAgIH1cbiAgICBjdW11bGF0aXZlICs9IHZhbHVlO1xuICB9XG4gIGNvbnN0IHRyYW5zcGFyZW50ID0geyBib3JkZXJDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCBjb2xvcjogXCJ0cmFuc3BhcmVudFwiIH07XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0hFTFBFUl9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICBpdGVtU3R5bGU6IHRyYW5zcGFyZW50LFxuICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCB9LFxuICAgICAgZGF0YTogaGVscGVycyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9JTkNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogaW5jcmVhc2VzLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0RFQ1JFQVNFX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogV0FURVJGQUxMX0RFQ1JFQVNFX0NPTE9SIH0sXG4gICAgICBkYXRhOiBkZWNyZWFzZXMsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYSB7QGxpbmsgQ2hhcnRQbGFufSBpbnRvIGEgZnVsbCBFY2hhcnRzIGBFQ2hhcnRzT3B0aW9uYFxuICogSlNPTi4gQ2VudHJhbGl6ZWQgaGVyZSBzbyB0aGUgcGxhbm5lciBhZ2VudCBvbmx5IGZpbGxzIGluIHRoZVxuICogY29tcGFjdCBwbGFuIHNoYXBlOyB0b29sdGlwIC8gYW5pbWF0aW9uIC8gY29sb3IgLyBncmlkIGRlZmF1bHRzXG4gKiBzdGF5IGNvbnNpc3RlbnQgYWNyb3NzIGNoYXJ0cyBhbmQgYXJlIGVhc3kgdG8gdHVuZSB3aXRob3V0XG4gKiByZXRyYWluaW5nIG1vZGVsIGJlaGF2aW91ci5cbiAqXG4gKiBXaGVuIGBicmFuZGAgaXMgc2V0LCB0aGUgcmVzb2x2ZWQgc3BlYyBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCBiYXNlIHRleHQgc3R5bGUgKHNlZSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSk7IG90aGVyd2lzZVxuICogRWNoYXJ0cycgZGVmYXVsdHMgYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBpbnB1dDogQ2hhcnRQbGFuSW5wdXQsXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UoaW5wdXQpO1xuICBjb25zdCBiYXNlVGl0bGUgPSBwbGFuLnRpdGxlID8/IGZhbGxiYWNrVGl0bGU7XG4gIGNvbnN0IGdyaWQgPSB7IGxlZnQ6IDQ4LCByaWdodDogMjQsIHRvcDogNTYsIGJvdHRvbTogNDgsIGNvbnRhaW5MYWJlbDogdHJ1ZSB9O1xuICBjb25zdCB0aGVtZSA9IGJyYW5kID8gYnJhbmRDaGFydFRoZW1lKGJyYW5kKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGhlbWVkID0gKG9wdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgIHRoZW1lID8geyAuLi50aGVtZSwgLi4ub3B0aW9uIH0gOiBvcHRpb247XG4gIGNvbnN0IHRpdGxlID0geyB0ZXh0OiBiYXNlVGl0bGUsIGxlZnQ6IFwiY2VudGVyXCIgfTtcbiAgY29uc3QgbGVnZW5kID0geyBib3R0b206IDAgfTtcblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICAvLyBUaGUgb3B0aW9uIGFycml2ZXMgYXMgYSBKU09OIFNUUklORywgbm90IGEgbmVzdGVkIG9iamVjdDogdGhpcyBwbGFuIGlzXG4gICAgLy8gdGhlIHBsYW5uZXIncyBwcm92aWRlci1lbmZvcmNlZCBzdHJ1Y3R1cmVkIG91dHB1dCwgYW5kIGEgZnJlZS1mb3JtXG4gICAgLy8gb2JqZWN0IGJlY29tZXMgYW4gdW5jb25zdHJhaW5lZCBgYWRkaXRpb25hbFByb3BlcnRpZXNgIHNjaGVtYSB0aGF0XG4gICAgLy8gc3RyaWN0IE9wZW5BSSBhbmQgR2VtaW5pIGVuZHBvaW50cyByZWplY3QgLSB3aGljaCB3b3VsZCBicmVhayBFVkVSWVxuICAgIC8vIGNoYXJ0LCBub3QganVzdCB0aGlzIG9uZSAoc2FtZSBjbGFzcyBvZiBoYXphcmQgYXMgdGhlIGBwcmVmaXhJdGVtc2BcbiAgICAvLyBub3RlIG9uIGBjaGFydERhdGFQb2ludFNjaGVtYWApLiBBIG1hbGZvcm1lZCBzdHJpbmcgY29zdHMgb25lIGNoYXJ0LlxuICAgIC8vIE5vdGhpbmcgaGVyZSBpcyBldmFsJ2Q7IGEgc3RyaW5nLXZhbHVlZCBFY2hhcnRzIGZvcm1hdHRlciBpcyBhXG4gICAgLy8gdGVtcGxhdGUsIG5vdCBjb2RlLlxuICAgIGNvbnN0IG9wdGlvbiA9IGpzb24ucGFyc2VSZWNvcmQocGxhbi5vcHRpb24pO1xuICAgIGlmICghb3B0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYXJ0VHlwZSBcImN1c3RvbVwiIG5lZWRzIGFuIGBvcHRpb25gIGhvbGRpbmcgYSBKU09OIG9iamVjdCcpO1xuICAgIH1cbiAgICAvLyBUaXRsZSBpcyB0aGUgb25lIGRlZmF1bHQgd29ydGggZmlsbGluZzogZXZlcnkgb3RoZXIgYnJhbmNoIGd1YXJhbnRlZXNcbiAgICAvLyBvbmUgYW5kIHRoZSByZW5kZXJlciByZXNlcnZlcyBncmlkIHNwYWNlIGZvciBpdC4gQSB0aXRsZSB0aGUgbW9kZWwgc2V0XG4gICAgLy8gd2lucywgYXMgZG9lcyBldmVyeSBvdGhlciBmaWVsZCBpdCBkZWNsYXJlZC5cbiAgICByZXR1cm4gdGhlbWVkKHsgdGl0bGUsIC4uLm9wdGlvbiB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJwaWVcIiB8fCBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJmdW5uZWxcIiB8fCBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ0cmVlbWFwXCIpIHtcbiAgICBjb25zdCBzbGljZXMgPSBuYW1lZFNsaWNlcyhwbGFuLnNlcmllc1swXT8uZGF0YSA/PyBbXSk7XG4gICAgY29uc3Qgc2VyaWVzVHlwZSA9IHBsYW4uY2hhcnRUeXBlO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQ6IHNlcmllc1R5cGUgPT09IFwidHJlZW1hcFwiID8gdW5kZWZpbmVkIDogbGVnZW5kLFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBwbGFuLnNlcmllc1swXT8ubmFtZSA/PyBiYXNlVGl0bGUsXG4gICAgICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgICAgICAuLi4oc2VyaWVzVHlwZSA9PT0gXCJwaWVcIiA/IHsgcmFkaXVzOiBbXCIzNSVcIiwgXCI2NSVcIl0gfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2VyaWVzVHlwZSA9PT0gXCJmdW5uZWxcIiA/IHsgc29ydDogXCJkZXNjZW5kaW5nXCIgfSA6IHt9KSxcbiAgICAgICAgICBkYXRhOiBzbGljZXMsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInNjYXR0ZXJcIikge1xuICAgIC8vIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHNjYXR0ZXIgcG9pbnRzIC0ga2VlcCBvbmx5IHZhbGlkXG4gICAgLy8gYFt4LCB5XWAgdHVwbGVzLiBCYXJlIG51bWJlcnMgLyBvYmplY3RzIC8gbnVsbHMgZnJvbSBhXG4gICAgLy8gbWlzbWF0Y2hlZCBwbGFuIGdldCBkcm9wcGVkIHNpbGVudGx5LlxuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnhBeGlzTGFiZWwgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcInNjYXR0ZXJcIixcbiAgICAgICAgZGF0YTogc2NhdHRlclBvaW50cyhzLmRhdGEpLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhlYXRtYXBcIikge1xuICAgIGNvbnN0IHsgY2VsbHMsIHlDYXRlZ29yaWVzIH0gPSBoZWF0bWFwTWF0cml4KHBsYW4pO1xuICAgIGNvbnN0IHZhbHVlcyA9IGNlbGxzLm1hcCgoYykgPT4gY1syXSk7XG4gICAgY29uc3QgbWluID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi52YWx1ZXMpIDogMDtcbiAgICBjb25zdCBtYXggPSB2YWx1ZXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnZhbHVlcykgOiAxO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHBvc2l0aW9uOiBcInRvcFwiIH0sXG4gICAgICAvLyBUaGUgdmlzdWFsTWFwIHJhbXAgc2l0cyBiZWxvdyB0aGUgcGxvdCwgc28gdGhlIGdyaWQgZ2l2ZXMgdXBcbiAgICAgIC8vIG1vcmUgYm90dG9tIHJvb20gdGhhbiBhbiBheGlzLW9ubHkgY2hhcnQgbmVlZHMuXG4gICAgICBncmlkOiB7IC4uLmdyaWQsIGJvdHRvbTogNzIgfSxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICAgIHNwbGl0QXJlYTogeyBzaG93OiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiB5Q2F0ZWdvcmllcyxcbiAgICAgICAgbmFtZTogcGxhbi55QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHZpc3VhbE1hcDoge1xuICAgICAgICAvLyBFY2hhcnRzIGhpZGVzIGV2ZXJ5IGNlbGwgd2hlbiBtaW4gPT09IG1heCAoYSB1bmlmb3JtIG1hdHJpeCksXG4gICAgICAgIC8vIHNvIGEgZGVnZW5lcmF0ZSByYW5nZSBpcyB3aWRlbmVkIGJ5IG9uZS5cbiAgICAgICAgbWluLFxuICAgICAgICBtYXg6IG1heCA+IG1pbiA/IG1heCA6IG1pbiArIDEsXG4gICAgICAgIGNhbGN1bGFibGU6IHRydWUsXG4gICAgICAgIG9yaWVudDogXCJob3Jpem9udGFsXCIsXG4gICAgICAgIGxlZnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIGJvdHRvbTogOCxcbiAgICAgICAgaW5SYW5nZTogeyBjb2xvcjogSEVBVE1BUF9SQU1QIH0sXG4gICAgICB9LFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBwbGFuLnNlcmllc1swXT8ubmFtZSA/PyBiYXNlVGl0bGUsXG4gICAgICAgICAgdHlwZTogXCJoZWF0bWFwXCIsXG4gICAgICAgICAgZGF0YTogY2VsbHMsXG4gICAgICAgICAgLy8gUHJpbnRlZCBjZWxsIHZhbHVlcyBhcmUgdW5yZWFkYWJsZSBvbmNlIHRoZSBncmlkIGlzIGRlbnNlLlxuICAgICAgICAgIGxhYmVsOiB7IHNob3c6IGNlbGxzLmxlbmd0aCA8PSBIRUFUTUFQX0xBQkVMX01BWF9DRUxMUyB9LFxuICAgICAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogeyBzaGFkb3dCbHVyOiAxMCwgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAwLCAwLCAwLjMpXCIgfSB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJyYWRhclwiKSB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IChwbGFuLmNhdGVnb3JpZXMgPz8gW10pLm1hcCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBlYWsgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgLi4ucGxhbi5zZXJpZXMubWFwKChzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbnVtcyA9IG51bWVyaWNQb2ludHMocy5kYXRhKTtcbiAgICAgICAgICByZXR1cm4gbnVtc1tpbmRleF0gPz8gMDtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgbWF4OiBwZWFrID4gMCA/IHBlYWsgOiAxIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIHJhZGFyOiB7IGluZGljYXRvcjogaW5kaWNhdG9ycyB9LFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInJhZGFyXCIsXG4gICAgICAgICAgZGF0YTogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IG51bWVyaWNQb2ludHMocy5kYXRhKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcIndhdGVyZmFsbFwiKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbnVtZXJpY1BvaW50cyh3YXRlcmZhbGxEZWx0YVNlcmllcyhwbGFuLnNlcmllcyk/LmRhdGEgPz8gW10pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICAvLyBJdGVtLXRyaWdnZXJlZCBzbyB0aGUgdHJhbnNwYXJlbnQgYHNpbGVudGAgb2Zmc2V0IGJhcnMgbmV2ZXJcbiAgICAgIC8vIHN1cmZhY2UgaW4gYSB0b29sdGlwIChzZWUgYHdhdGVyZmFsbFNlcmllc2ApLlxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgLy8gT25seSB0aGUgdHdvIHZpc2libGUgc3RlcHMgYmVsb25nIGluIHRoZSBsZWdlbmQuXG4gICAgICBsZWdlbmQ6IHsgLi4ubGVnZW5kLCBkYXRhOiBbV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUsIFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FXSB9LFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogd2F0ZXJmYWxsU2VyaWVzKHZhbHVlcyksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiaG9yaXpvbnRhbEJhclwiKSB7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIsIGF4aXNQb2ludGVyOiB7IHR5cGU6IFwic2hhZG93XCIgfSB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi55QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjb21ib1wiKSB7XG4gICAgY29uc3QgdXNlc1JpZ2h0QXhpcyA9IHBsYW4uc2VyaWVzLnNvbWUoKHMpID0+IHMueUF4aXNJbmRleCA9PT0gMSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB1c2VzUmlnaHRBeGlzXG4gICAgICAgID8gW1xuICAgICAgICAgICAgeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIF1cbiAgICAgICAgOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0gcy50eXBlID8/IFwiYmFyXCI7XG4gICAgICAgIGNvbnN0IHNlcmllc1R5cGUgPSBtYXJrID09PSBcImFyZWFcIiA/IFwibGluZVwiIDogbWFyaztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICAgICAgeUF4aXNJbmRleDogcy55QXhpc0luZGV4ID8/IDAsXG4gICAgICAgICAgc21vb3RoOiBzZXJpZXNUeXBlID09PSBcImxpbmVcIixcbiAgICAgICAgICAuLi4obWFyayA9PT0gXCJhcmVhXCIgPyB7IGFyZWFTdHlsZToge30gfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gYmFyIC8gbGluZSAvIGFyZWEgc2hhcmUgdGhlIHNhbWUgYXhpcyBsYXlvdXQuXG4gIGNvbnN0IGlzQXJlYSA9IHBsYW4uY2hhcnRUeXBlID09PSBcImFyZWFcIjtcbiAgY29uc3Qgc2VyaWVzVHlwZSA9IHBsYW4uY2hhcnRUeXBlID09PSBcImJhclwiID8gXCJiYXJcIiA6IFwibGluZVwiO1xuICByZXR1cm4gdGhlbWVkKHtcbiAgICB0aXRsZSxcbiAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgbGVnZW5kLFxuICAgIGdyaWQsXG4gICAgeEF4aXM6IHtcbiAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICB9LFxuICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgc21vb3RoOiBzZXJpZXNUeXBlID09PSBcImxpbmVcIixcbiAgICAgIC4uLihpc0FyZWEgPyB7IGFyZWFTdHlsZToge30gfSA6IHt9KSxcbiAgICB9KSksXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZW5kZXJfZGF0YSB0b29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGByZW5kZXJfZGF0YWAgTWFzdHJhIHRvb2wgYm91bmQgdG8gdGhlIGdpdmVuIHBsdWdpblxuICogY29uZmlnLiBBdXRvLXdpcmVkIGFzIGEgc3lzdGVtIHRvb2wgb24gZXZlcnkgYWdlbnQgKHNlZVxuICogYGFnZW50cy50c2ApOyBwZXItYWdlbnQgdG9vbHMgY2FuIHNoYWRvdyBpdCBieSByZWdpc3RlcmluZyBhXG4gKiBzYW1lLW5hbWVkIGVudHJ5LlxuICpcbiAqIFRoaW4gd3JhcHBlciBvdmVyIHtAbGluayBwcmVwYXJlQ2hhcnR9IGZvciBjYWxsZXJzIHRoYXQgYWxyZWFkeVxuICogaGF2ZSBhIGRhdGFzZXQgaW4gaGFuZC4gTWludHMgYSBgY2hhcnRJZGAgc3luY2hyb25vdXNseSwgY2FjaGVzXG4gKiBhbiBlbXB0eSBwbGFjZWhvbGRlciwgYW5kIGtpY2tzIG9mZiB0aGUgY2hhcnQtcGxhbm5lciBpbiB0aGVcbiAqIGJhY2tncm91bmQuIFJldHVybnMgdGhlIGBjaGFydElkYCBwbHVzIGl0cyByZWFkeS10by1jb3B5IGBtYXJrZXJgOyB0aGUgaG9zdFxuICogVUkgcmVzb2x2ZXMgdGhhdCBtYXJrZXIgdGhyb3VnaCB0aGUgcGx1Z2luJ3MgYC9lbWJlZC9jaGFydC86aWRgIHJvdXRlLlxuICpcbiAqIEZvciBHZW5pZSBzdGF0ZW1lbnQgcmVzdWx0cywgcHJlZmVyIHRoZSBHZW5pZSBhZ2VudCdzXG4gKiBgcHJlcGFyZV9jaGFydGAgdG9vbCwgd2hpY2ggYWNjZXB0cyBhIGBzdGF0ZW1lbnRfaWRgIGFuZFxuICogcmVzb2x2ZXMgdGhlIHJvd3MgbGF6aWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IFwicmVuZGVyX2RhdGFcIixcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFN1Ym1pdCBhIHRhYnVsYXIgZGF0YXNldCBmb3IgaW5saW5lIHJlbmRlcmluZyBhcyBhIGNoYXJ0IGluXG4gICAgICAgIHRoZSB1c2VyJ3Mgdmlldy4gUGFzcyBhIHRpdGxlLCB0aGUgcmF3IHJvd3MgKGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAga2V5ZWQgYnkgY29sdW1uIG5hbWUpLCBhbmQgYW4gb3B0aW9uYWwgb25lLWxpbmUgZGVzY3JpcHRpb25cbiAgICAgICAgb2YgdGhlIGluc2lnaHQgdG8gaGlnaGxpZ2h0LiBSZXR1cm5zIFxcYGNoYXJ0SWRcXGAgcGx1cyB0aGVcbiAgICAgICAgY29tcGxldGUgXFxgbWFya2VyXFxgOyBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIgVkVSQkFUSU0gb250b1xuICAgICAgICBpdHMgb3duIGxpbmUgd2hlcmUgdGhlIGNoYXJ0IHNob3VsZCByZW5kZXIuIE5ldmVyIGNvbnN0cnVjdCxcbiAgICAgICAgYWx0ZXIsIG9yIGludmVudCBhIGNoYXJ0IG1hcmtlciB5b3Vyc2VsZi5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFBsYWNlbWVudCBjb250cmFjdDogZW1iZWQgdGhlIHJldHVybmVkIFxcYG1hcmtlclxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlIGNoYXJ0XG4gICAgICAgIHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBjaGFydFRvb2xPdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSBpbnB1dCBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0O1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkoY3R4Py5yZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyByb3dzOiBkYXRhIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=