@pipeline-builder/api-core 5.2.2 → 5.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/lib/constants/ai-providers.d.ts +3 -22
  2. package/lib/constants/ai-providers.js +6 -56
  3. package/lib/errors/app-errors.d.ts +14 -0
  4. package/lib/errors/app-errors.js +21 -1
  5. package/lib/helpers/index.d.ts +1 -0
  6. package/lib/helpers/index.js +2 -1
  7. package/lib/helpers/sse-helpers.d.ts +33 -3
  8. package/lib/helpers/sse-helpers.js +91 -19
  9. package/lib/helpers/support-calendar.d.ts +69 -0
  10. package/lib/helpers/support-calendar.js +179 -0
  11. package/lib/middleware/auth.js +6 -3
  12. package/lib/middleware/deferred-quota-check.d.ts +5 -0
  13. package/lib/middleware/deferred-quota-check.js +33 -0
  14. package/lib/middleware/ecosystem-guard.d.ts +3 -3
  15. package/lib/middleware/ecosystem-guard.js +5 -5
  16. package/lib/middleware/index.d.ts +5 -2
  17. package/lib/middleware/index.js +6 -3
  18. package/lib/middleware/on-behalf.d.ts +37 -0
  19. package/lib/middleware/on-behalf.js +143 -0
  20. package/lib/middleware/permission-gates.d.ts +11 -0
  21. package/lib/middleware/permission-gates.js +7 -1
  22. package/lib/middleware/quota-exempt-routes.d.ts +36 -0
  23. package/lib/middleware/quota-exempt-routes.js +47 -0
  24. package/lib/middleware/route-table.d.ts +104 -0
  25. package/lib/middleware/route-table.js +72 -2
  26. package/lib/middleware/service-tokens.d.ts +8 -0
  27. package/lib/middleware/service-tokens.js +5 -3
  28. package/lib/middleware/step-up.js +11 -1
  29. package/lib/services/ai-call-weight.d.ts +24 -0
  30. package/lib/services/ai-call-weight.js +77 -0
  31. package/lib/services/alert-delivery.d.ts +99 -0
  32. package/lib/services/alert-delivery.js +132 -0
  33. package/lib/services/audit-context.d.ts +105 -0
  34. package/lib/services/audit-context.js +134 -0
  35. package/lib/services/index.d.ts +10 -2
  36. package/lib/services/index.js +10 -2
  37. package/lib/services/org-ai-client.d.ts +61 -0
  38. package/lib/services/org-ai-client.js +112 -0
  39. package/lib/services/pagerduty-inbound.d.ts +101 -0
  40. package/lib/services/pagerduty-inbound.js +195 -0
  41. package/lib/services/pagerduty.d.ts +109 -0
  42. package/lib/services/pagerduty.js +186 -0
  43. package/lib/services/quota-increment-batcher.d.ts +81 -0
  44. package/lib/services/quota-increment-batcher.js +166 -0
  45. package/lib/services/quota.d.ts +158 -14
  46. package/lib/services/quota.js +252 -22
  47. package/lib/services/remote-audit-client.d.ts +44 -1
  48. package/lib/services/remote-audit-client.js +106 -20
  49. package/lib/services/version-vuln-policy.d.ts +174 -0
  50. package/lib/services/version-vuln-policy.js +242 -0
  51. package/lib/types/ai-catalog.d.ts +63 -0
  52. package/lib/types/ai-catalog.js +82 -0
  53. package/lib/types/ask-proposals.js +6 -6
  54. package/lib/types/build-catalog.d.ts +154 -0
  55. package/lib/types/build-catalog.js +158 -0
  56. package/lib/types/common.d.ts +37 -3
  57. package/lib/types/common.js +20 -2
  58. package/lib/types/ecosystem-notifications.d.ts +5 -5
  59. package/lib/types/ecosystem-notifications.js +9 -3
  60. package/lib/types/error-codes.d.ts +13 -6
  61. package/lib/types/error-codes.js +18 -8
  62. package/lib/types/feature-flags.d.ts +71 -1
  63. package/lib/types/feature-flags.js +131 -11
  64. package/lib/types/index.d.ts +6 -4
  65. package/lib/types/index.js +12 -5
  66. package/lib/types/metadata-keys.d.ts +6 -0
  67. package/lib/types/metadata-keys.js +4 -1
  68. package/lib/types/permissions.d.ts +351 -3
  69. package/lib/types/permissions.js +610 -21
  70. package/lib/types/pipeline.d.ts +39 -0
  71. package/lib/types/pipeline.js +57 -1
  72. package/lib/types/plugin-health.d.ts +0 -2
  73. package/lib/types/plugin-health.js +1 -11
  74. package/lib/types/plugin-scan.d.ts +192 -42
  75. package/lib/types/plugin-scan.js +159 -43
  76. package/lib/types/quota-catalog.d.ts +247 -0
  77. package/lib/types/quota-catalog.js +122 -0
  78. package/lib/types/quota-tiers.d.ts +150 -0
  79. package/lib/types/quota-tiers.js +167 -2
  80. package/lib/types/remote-audit-actions.d.ts +1 -1
  81. package/lib/types/remote-audit-actions.js +217 -4
  82. package/lib/types/wire-vocabulary.js +8 -1
  83. package/lib/utils/index.d.ts +1 -1
  84. package/lib/utils/index.js +2 -2
  85. package/lib/utils/response.d.ts +35 -2
  86. package/lib/utils/response.js +42 -3
  87. package/lib/validation/ai-schemas.d.ts +27 -0
  88. package/lib/validation/ai-schemas.js +31 -5
  89. package/lib/validation/plugin-schemas.d.ts +15 -0
  90. package/lib/validation/plugin-schemas.js +28 -1
  91. package/package.json +31 -2
@@ -9,23 +9,108 @@
9
9
  *
10
10
  * A finding is FIXABLE when grype reports a fixed version for it
11
11
  * (`vulnerability.fix.state == "fixed"` with at least one version): the gates
12
- * count fixable Critical findings only, because an unfixable one can't be
13
- * acted on by rebuilding or upgrading.
12
+ * count fixable Critical findings, because an unfixable one can't be acted on
13
+ * by rebuilding or upgrading — with ONE exception. A Critical that CISA lists
14
+ * as KNOWN EXPLOITED (KEV) is gated even with no fix (`PLUGIN_VULN_GATE_KEV`):
15
+ * "nothing to upgrade to" is a reason to not ship the image, not a reason to
16
+ * ship it, when the vulnerability is being exploited in the wild.
14
17
  */
15
18
  import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
16
- import { envBool, envInt } from '../utils/env.js';
19
+ import { envBool, envInt, envStr } from '../utils/env.js';
20
+ /** Findings a summary itemizes. Counts are never capped; this bounds the jsonb. */
21
+ export const SCAN_SUMMARY_MAX_FINDINGS = 500;
22
+ /** Uncatalogued binaries a summary lists. */
23
+ export const SCAN_SUMMARY_MAX_BINARIES = 200;
24
+ /**
25
+ * A finding's identity: the advisory in a specific package version. The same
26
+ * CVE in two packages is two findings; the same CVE reported again after a
27
+ * rescan is the same one.
28
+ */
29
+ export function scanFindingKey(f) {
30
+ return `${f.id}|${f.packageName}|${f.packageVersion}`;
31
+ }
32
+ /**
33
+ * The Critical/High findings in `after` that the previous summary did not
34
+ * carry — what N31 and an advisory draft are about.
35
+ *
36
+ * No previous summary means no baseline: every finding is new. A TRUNCATED
37
+ * baseline knows only its first {@link SCAN_SUMMARY_MAX_FINDINGS} findings
38
+ * (Criticals first), so a finding missing from it is new only if the baseline
39
+ * provably listed every finding of that severity — otherwise it may simply have
40
+ * been cut, and reporting it as new would be a false alarm on every pass.
41
+ */
42
+ export function newScanFindings(before, after) {
43
+ if (!before)
44
+ return [...after];
45
+ const known = new Set(before.findings.map(scanFindingKey));
46
+ const listedCritical = before.findings.filter((f) => f.severity === 'critical').length;
47
+ const complete = {
48
+ critical: !before.truncated || listedCritical >= before.critical,
49
+ high: !before.truncated,
50
+ };
51
+ return after.filter((f) => complete[f.severity] && !known.has(scanFindingKey(f)));
52
+ }
17
53
  /** Findings a flag / gate message carries. */
18
54
  export const SCAN_FLAG_TOP_FINDINGS = 10;
19
55
  /** Lookup / resolution warning code for a flagged version. */
20
56
  export const VULN_FLAGGED_WARNING = 'VULN_FLAGGED';
21
57
  /**
22
- * `PLUGIN_VULN_MAX_CRITICAL`: the platform floor — a version with MORE fixable
23
- * Critical findings than this fails its build (`PLUGIN_VULN_GATE`) and is
58
+ * `PLUGIN_VULN_MAX_FINDINGS`: the platform floor — a version with MORE gated
59
+ * findings (fixable, or KEV-listed, at or above `PLUGIN_VULN_FAIL_ON`) than
60
+ * this fails its build (`PLUGIN_VULN_GATE`) and is
24
61
  * flagged by the rescan. Default `0`; `-1` disables the floor (and the flag).
25
62
  */
26
- export function pluginVulnMaxCritical() {
27
- return envInt('PLUGIN_VULN_MAX_CRITICAL', 0, { min: -1 });
63
+ export function pluginVulnMaxFindings() {
64
+ return envInt('PLUGIN_VULN_MAX_FINDINGS', 0, { min: -1 });
65
+ }
66
+ /**
67
+ * `PLUGIN_VULN_FAIL_ON` (default `critical`): the severity at and above which a
68
+ * fixable (or KEV-listed) finding counts against `PLUGIN_VULN_MAX_FINDINGS`.
69
+ * `high` gates Critical AND High. Any other value resolves to `high`, the
70
+ * STRICTER setting: the failure mode of a typo must be "the gate blocks more",
71
+ * never "the gate blocks less".
72
+ */
73
+ export function pluginVulnFailOn() {
74
+ return envStr('PLUGIN_VULN_FAIL_ON', 'critical').trim().toLowerCase() === 'critical' ? 'critical' : 'high';
75
+ }
76
+ /** Whether a severity is at or above the gating threshold. */
77
+ export function atOrAboveFailOn(severity, failOn = pluginVulnFailOn()) {
78
+ return severity === 'critical' || failOn === 'high';
79
+ }
80
+ /**
81
+ * The scanner's fixable count at or above the threshold — what the floor reads
82
+ * when a scan recorded counts but no findings to derive it from.
83
+ */
84
+ export function gatedFixableCount(counts, failOn = pluginVulnFailOn()) {
85
+ return (counts.vulnCriticalFixable ?? 0) + (failOn === 'high' ? counts.vulnHighFixable ?? 0 : 0);
86
+ }
87
+ /** `Critical` / `Critical or High` — the gated severities, for messages. */
88
+ export function failOnLabel(failOn = pluginVulnFailOn()) {
89
+ return failOn === 'critical' ? 'Critical' : 'Critical or High';
90
+ }
91
+ /**
92
+ * `PLUGIN_VULN_GATE_KEV` (default true): a Critical CISA lists as known
93
+ * exploited counts against the floor even when it has NO fix. Off, KEV findings
94
+ * are gated exactly like any other Critical (fixable only).
95
+ */
96
+ export function pluginVulnGateKev() {
97
+ return envBool('PLUGIN_VULN_GATE_KEV', true);
28
98
  }
99
+ /**
100
+ * Whether a finding counts against the floor: a fixable finding at or above
101
+ * `PLUGIN_VULN_FAIL_ON` (default Critical), or — under `PLUGIN_VULN_GATE_KEV`
102
+ * — a KEV-listed one at or above it with or without a fix.
103
+ */
104
+ export function isGatedFinding(f, kevGate = pluginVulnGateKev(), failOn = pluginVulnFailOn()) {
105
+ return atOrAboveFailOn(f.severity, failOn) && (f.fixedIn.length > 0 || (kevGate && f.kev === true));
106
+ }
107
+ /** The `plugin` of a fleet-wide waiver. Advisory ids only — see VulnWaiver. */
108
+ export const WAIVE_ALL_PLUGINS = '*';
109
+ /**
110
+ * An advisory id as scanners report it (CVE, GHSA, Go vulndb, PyPA, RustSec).
111
+ * Anything else is a package name, which a fleet-wide waiver may not use.
112
+ */
113
+ const ADVISORY_ID = /^(CVE-\d{4}-\d{4,}|GHSA(-[0-9a-z]{4}){3}|GO-\d{4}-\d{4,}|PYSEC-\d{4}-\d+|RUSTSEC-\d{4}-\d{4,})$/i;
29
114
  /**
30
115
  * Parse `PLUGIN_VULN_WAIVERS`, REPORTING what was dropped.
31
116
  *
@@ -65,6 +150,10 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
65
150
  reject(entry, "'@' with no version — omit it to cover every version");
66
151
  continue;
67
152
  }
153
+ if (plugin === WAIVE_ALL_PLUGINS && version !== null) {
154
+ reject(entry, "'*' covers every plugin, so it cannot pin a version");
155
+ continue;
156
+ }
68
157
  if (!/^\d{4}-\d{2}-\d{2}$/.test(expires)) {
69
158
  reject(entry, `expiry '${expires}' is not YYYY-MM-DD`);
70
159
  continue;
@@ -79,6 +168,13 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
79
168
  reject(entry, 'no package names');
80
169
  continue;
81
170
  }
171
+ if (plugin === WAIVE_ALL_PLUGINS) {
172
+ const packageNames = names.filter((n) => !ADVISORY_ID.test(n));
173
+ if (packageNames.length > 0) {
174
+ reject(entry, `'*' takes advisory ids only (CVE-…, GHSA-…, GO-…); '${packageNames.join(', ')}' would waive a package in every plugin`);
175
+ continue;
176
+ }
177
+ }
82
178
  waivers.push({ plugin, version, expires: when, packages: names });
83
179
  }
84
180
  return { waivers, problems };
@@ -87,12 +183,23 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
87
183
  export function parseVulnWaivers(raw = process.env.PLUGIN_VULN_WAIVERS) {
88
184
  return parseVulnWaiversVerbose(raw).waivers;
89
185
  }
186
+ /** One waiver entry's identity: the plugin it names (with its pin) and its targets. */
187
+ export function vulnWaiverLabels(w) {
188
+ return { plugin: w.version ? `${w.plugin}@${w.version}` : w.plugin, targets: w.packages.join(',') };
189
+ }
90
190
  /**
91
191
  * Split findings into what still counts and what an unexpired waiver exempts.
92
192
  *
93
- * Matching is on the package name a waiver names, case-insensitively, and only
94
- * for findings that are FIXABLE — an unfixable finding never counted toward the
95
- * floor, so "waiving" it would overstate what the waiver does.
193
+ * Matching is on the package name or advisory id a waiver names,
194
+ * case-insensitively, and only for findings that are GATED
195
+ * ({@link isGatedFinding}) — an ungated finding never counted toward the floor,
196
+ * so "waiving" it would overstate what the waiver does.
197
+ *
198
+ * A KEV-listed finding is exempted by an ADVISORY-ID target only, never by a
199
+ * package name. `artillery:…:chromium` is a judgement about Chromium's ordinary
200
+ * churn; it was not written about, and must not silently cover, the one
201
+ * Chromium CVE that is being exploited today. Naming that CVE is the deliberate
202
+ * act an exemption for it requires.
96
203
  */
97
204
  export function applyVulnWaivers(pluginName, findings, waivers = parseVulnWaivers(), now = new Date(), orgId, pluginVersion) {
98
205
  // SYSTEM ORG ONLY. Plugin names are unique per (name, version, orgId), NOT
@@ -103,38 +210,38 @@ export function applyVulnWaivers(pluginName, findings, waivers = parseVulnWaiver
103
210
  // Official catalog the operator curates, which lives in the system org; a
104
211
  // caller that cannot say which org this build belongs to gets no waiver.
105
212
  if (orgId === undefined || orgId.toLowerCase() !== SYSTEM_ORG_ID)
106
- return { counted: [...findings], waived: [] };
107
- const active = waivers.filter((w) => w.plugin === pluginName
213
+ return { counted: [...findings], waived: [], matched: [] };
214
+ const active = waivers.filter((w) => (w.plugin === pluginName || w.plugin === WAIVE_ALL_PLUGINS)
108
215
  && w.expires.getTime() >= now.getTime()
109
216
  // A version-pinned waiver covers that version only. An unpinned one covers
110
217
  // every version, which is why the pin is worth writing.
111
218
  && (w.version === null || w.version === pluginVersion));
112
219
  if (active.length === 0)
113
- return { counted: [...findings], waived: [] };
114
- const exempt = new Set(active.flatMap((w) => w.packages.map((n) => n.toLowerCase())));
220
+ return { counted: [...findings], waived: [], matched: [] };
221
+ const kevGate = pluginVulnGateKev();
222
+ const targets = active.map((w) => ({ w, names: new Set(w.packages.map((n) => n.toLowerCase())) }));
115
223
  const counted = [];
116
224
  const waived = [];
225
+ const matched = new Set();
117
226
  for (const f of findings) {
118
- if (f.fixedIn.length > 0 && exempt.has(f.packageName.toLowerCase()))
119
- waived.push(f);
120
- else
227
+ const id = f.id.toLowerCase();
228
+ const pkg = f.packageName.toLowerCase();
229
+ const by = isGatedFinding(f, kevGate)
230
+ ? targets.filter((t) => t.names.has(id) || (f.kev !== true && t.names.has(pkg)))
231
+ : [];
232
+ if (by.length === 0) {
121
233
  counted.push(f);
234
+ continue;
235
+ }
236
+ waived.push(f);
237
+ for (const t of by)
238
+ matched.add(t.w);
122
239
  }
123
- return { counted, waived };
124
- }
125
- /** Whether `fixableCritical` breaks the platform floor (never, when disabled). */
126
- export function exceedsVulnFloor(fixableCritical, max = pluginVulnMaxCritical()) {
127
- return max >= 0 && (fixableCritical ?? 0) > max;
240
+ return { counted, waived, matched: [...matched] };
128
241
  }
129
- /**
130
- * `PLUGIN_BLOCK_ON_NEW_CRITICAL` (default false): resolution SKIPS flagged
131
- * versions for ranges and the default (falling back to the newest unflagged
132
- * one), and an exact pin to a flagged version is refused 409
133
- * `PLUGIN_VERSION_VULN_BLOCKED`. Off: flagged versions resolve with a
134
- * `VULN_FLAGGED` warning.
135
- */
136
- export function blockOnNewCritical() {
137
- return envBool('PLUGIN_BLOCK_ON_NEW_CRITICAL', false);
242
+ /** Whether `gatedCritical` breaks the platform floor (never, when disabled). */
243
+ export function exceedsVulnFloor(gated, max = pluginVulnMaxFindings()) {
244
+ return max >= 0 && (gated ?? 0) > max;
138
245
  }
139
246
  /** `pkg@1.2.3 → 1.2.4` / `pkg@1.2.3 (no fix)`. */
140
247
  export function describeFix(f) {
@@ -147,41 +254,50 @@ export function describeFindings(findings, limit = 5) {
147
254
  const more = findings.length > limit ? `; +${findings.length - limit} more` : '';
148
255
  return `${shown}${more}`;
149
256
  }
257
+ /**
258
+ * `N fixable Critical findings`, or — when any gated finding is KEV-listed, so
259
+ * "fixable" alone would misdescribe the count — `N Critical findings that are
260
+ * fixable or known exploited (M on CISA KEV)`.
261
+ */
262
+ function gatedPhrase(flag) {
263
+ const s = flag.gated === 1 ? '' : 's';
264
+ const label = failOnLabel(flag.failOn ?? 'critical');
265
+ return flag.kev
266
+ ? `${flag.gated} ${label} finding${s} that ${flag.gated === 1 ? 'is' : 'are'} fixable or known exploited (${flag.kev} on CISA KEV)`
267
+ : `${flag.gated} fixable ${label} finding${s}`;
268
+ }
150
269
  /** The warning text for a flagged version: `x@v has N fixable Critical findings — rebuild or upgrade`. */
151
270
  export function vulnFlaggedMessage(ref, flag) {
152
- return `${ref} has ${flag.critical} fixable Critical finding${flag.critical === 1 ? '' : 's'} — rebuild or upgrade`;
271
+ return `${ref} has ${gatedPhrase(flag)} — rebuild or upgrade`;
153
272
  }
154
273
  /** Build the `VULN_FLAGGED` warning for `plugin@version`. */
155
274
  export function vulnFlaggedWarning(plugin, version, flag) {
156
275
  return {
157
276
  code: VULN_FLAGGED_WARNING,
277
+ severity: flag.kev ? 'critical' : 'error',
158
278
  plugin,
159
279
  version,
160
- critical: flag.critical,
280
+ gated: flag.gated,
161
281
  high: flag.high,
162
282
  message: vulnFlaggedMessage(`${plugin}@${version}`, flag),
163
283
  findings: flag.findings.slice(0, SCAN_FLAG_TOP_FINDINGS),
164
284
  };
165
285
  }
166
- /** The 409 message for an exact pin to a flagged version while blocking. */
167
- export function vulnBlockedMessage(plugin, version, flag) {
168
- const fixes = flag.findings.length > 0 ? ` Fix: ${describeFindings(flag.findings)}.` : '';
169
- return `${plugin}@${version} is blocked: a rescan found ${flag.critical} fixable Critical finding${flag.critical === 1 ? '' : 's'} `
170
- + `(PLUGIN_BLOCK_ON_NEW_CRITICAL). Rebuild it on patched packages or move to a newer version.${fixes}`;
171
- }
172
286
  /** Narrow an unknown `scan_flag` jsonb value. */
173
287
  export function asScanFlag(value) {
174
288
  if (!value || typeof value !== 'object' || Array.isArray(value))
175
289
  return null;
176
290
  const v = value;
177
- if (typeof v.critical !== 'number' || typeof v.high !== 'number')
291
+ if (typeof v.gated !== 'number' || typeof v.high !== 'number')
178
292
  return null;
179
293
  const findings = Array.isArray(v.findings) ? v.findings.filter((f) => f && typeof f.id === 'string') : [];
180
294
  return {
181
- critical: v.critical,
295
+ gated: v.gated,
182
296
  high: v.high,
183
- maxCritical: typeof v.maxCritical === 'number' ? v.maxCritical : 0,
297
+ maxFindings: typeof v.maxFindings === 'number' ? v.maxFindings : 0,
298
+ ...(typeof v.kev === 'number' && v.kev > 0 ? { kev: v.kev } : {}),
299
+ ...(v.failOn === 'high' ? { failOn: 'high' } : {}),
184
300
  findings: findings.map((f) => ({ ...f, fixedIn: Array.isArray(f.fixedIn) ? f.fixedIn : [] })),
185
301
  };
186
302
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBeURsRCw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRXpDLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxjQUFjLENBQUM7QUFFbkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBbUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsR0FBRyxHQUF1QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtJQUMvRixNQUFNLE9BQU8sR0FBaUIsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sUUFBUSxHQUF3QixFQUFFLENBQUM7SUFDekMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0RyxLQUFLLE1BQU0sS0FB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LE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25JLE9BQU87UUFDTCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDcEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQbHVnaW4gaW1hZ2Ugc2NhbiBnYXRlcyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCBcIlNjYW4gZ2F0ZXNcIik6IHRoZSBzaGFyZWRcbiAqIHZvY2FidWxhcnkgb2YgdGhlIGJ1aWxkLXRpbWUgZ2F0ZSwgdGhlIG5pZ2h0bHkgcmVzY2FuJ3MgZmxhZywgYW5kIHRoZVxuICogcmVzb2x1dGlvbiB3YXJuaW5nIC8gYmxvY2sg4oCUIHVzZWQgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlICh3aGljaCBzdG9yZXMgYW5kXG4gKiBlbmZvcmNlcyB0aGVtKSwgdGhlIHJlc29sdmVyIGluIHBpcGVsaW5lLWRhdGEgKHdoaWNoIHNraXBzIG9yIHdhcm5zKSwgYW5kIHRoZVxuICogZGFzaGJvYXJkICh3aGljaCBzaG93cyB0aGVtKS5cbiAqXG4gKiBBIGZpbmRpbmcgaXMgRklYQUJMRSB3aGVuIGdyeXBlIHJlcG9ydHMgYSBmaXhlZCB2ZXJzaW9uIGZvciBpdFxuICogKGB2dWxuZXJhYmlsaXR5LmZpeC5zdGF0ZSA9PSBcImZpeGVkXCJgIHdpdGggYXQgbGVhc3Qgb25lIHZlcnNpb24pOiB0aGUgZ2F0ZXNcbiAqIGNvdW50IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3Mgb25seSwgYmVjYXVzZSBhbiB1bmZpeGFibGUgb25lIGNhbid0IGJlXG4gKiBhY3RlZCBvbiBieSByZWJ1aWxkaW5nIG9yIHVwZ3JhZGluZy5cbiAqL1xuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5cbi8qKiBPbmUgQ3JpdGljYWwvSGlnaCBmaW5kaW5nIGFzIHRoZSBmbGFnIGFuZCB0aGUgZ2F0ZSBtZXNzYWdlcyBjYXJyeSBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhbkZpbmRpbmcge1xuICAvKiogVGhlIHZ1bG5lcmFiaWxpdHkgaWQgKENWRS3igKYsIEdIU0Et4oCmKS4gKi9cbiAgaWQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfCAnaGlnaCc7XG4gIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBWZXJzaW9ucyB0aGF0IGZpeCBpdDsgZW1wdHkgPSBubyBmaXggYXZhaWxhYmxlIChub3QgZml4YWJsZSkuICovXG4gIGZpeGVkSW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX2ZsYWdgIG9uIGEgdmVyc2lvbiB0aGUgbmlnaHRseSByZXNjYW4gZmxhZ2dlZDogaXRzIGZpeGFibGVcbiAqIENyaXRpY2FsL0hpZ2ggY291bnRzIGF0IHRoYXQgcmVzY2FuIGFuZCB0aGUgdG9wIGZpeGFibGUgZmluZGluZ3MuIFNldCB3aGlsZVxuICogZml4YWJsZSBDcml0aWNhbHMgZXhjZWVkIGBQTFVHSU5fVlVMTl9NQVhfQ1JJVElDQUxgLCBjbGVhcmVkIHdoZW4gYSByZXNjYW5cbiAqIGZpbmRzIHRoZW0gcmVzb2x2ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhbkZsYWcge1xuICAvKiogRml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncy4gKi9cbiAgY3JpdGljYWw6IG51bWJlcjtcbiAgLyoqIEZpeGFibGUgSGlnaCBmaW5kaW5ncy4gKi9cbiAgaGlnaDogbnVtYmVyO1xuICAvKiogVGhlIGZsb29yIGl0IHdhcyBjb21wYXJlZCBhZ2FpbnN0IChgUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMYCkuICovXG4gIG1heENyaXRpY2FsOiBudW1iZXI7XG4gIC8qKiBBdCBtb3N0IHtAbGluayBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTfSBmaXhhYmxlIGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX3N1bW1hcnlgIG9uIGV2ZXJ5IGluLXVzZSB2ZXJzaW9uOiB0aGUgTEFTVCByZXNjYW4ncyBmaW5kaW5ncywgd3JpdHRlblxuICogd2hldGhlciBvciBub3QgdGhlIGdhdGUgdHJpcHBlZC5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBQbHVnaW5TY2FuRmxhZ30sIHdoaWNoIGV4aXN0cyBvbmx5IHdoaWxlIGEgdmVyc2lvbiBpcyBvdmVyXG4gKiB0aGUgZmxvb3IuIEEgdmVyc2lvbiBjYXJyeWluZyBub3RoaW5nIGJ1dCBIaWdoIGZpbmRpbmdzIGlzIG5ldmVyIGZsYWdnZWQg4oCUIHNvIGFcbiAqIHJlcG9ydCB3aG9zZSBqb2IgaXMgdG8gc2hvdyBDcml0aWNhbCBBTkQgSGlnaCBleHBvc3VyZSBoYWQgbm8gc291cmNlIHRvIHJlYWQuXG4gKiBXaGF0IGEgcmVwb3J0IFNIT1dTIGFuZCB3aGF0IGEgYnVpbGQgUkVGVVNFUyBhcmUgZGlmZmVyZW50IHF1ZXN0aW9ucywgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gbWVhbnQgdGhlIGFuc3dlciB0byB0aGUgZmlyc3Qgd2FzIFwibm90aGluZ1wiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5TdW1tYXJ5IHtcbiAgLyoqIEZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MgYXQgdGhlIGxhc3QgcmVzY2FuLiAqL1xuICBjcml0aWNhbEZpeGFibGU6IG51bWJlcjtcbiAgLyoqIEZpeGFibGUgSGlnaCBmaW5kaW5ncyBhdCB0aGUgbGFzdCByZXNjYW4uICovXG4gIGhpZ2hGaXhhYmxlOiBudW1iZXI7XG4gIC8qKiBUb3RhbHMgaW5jbHVkaW5nIHVuZml4YWJsZSBmaW5kaW5ncywgZm9yIGNvbnRleHQuICovXG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgLyoqIEF0IG1vc3Qge0BsaW5rIFNDQU5fRkxBR19UT1BfRklORElOR1N9IGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogV2hlbiB0aGUgcmVzY2FuIHRoYXQgcHJvZHVjZWQgdGhpcyByYW4gKElTTykuICovXG4gIHNjYW5uZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGltYWdlIHRoaXMgZGVzY3JpYmVzLiBBIHZlcnNpb24gcmVidWlsdCBvbiBhIHBhdGNoZWQgYmFzZSBpcyBhXG4gICAqICBkaWZmZXJlbnQgYXJ0aWZhY3QsIHNvIGEgc3VtbWFyeSB3aXRob3V0IGl0cyBkaWdlc3QgY2Fubm90IGJlIHRydXN0ZWQuICovXG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nO1xufVxuXG4vKiogRmluZGluZ3MgYSBmbGFnIC8gZ2F0ZSBtZXNzYWdlIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKiogTG9va3VwIC8gcmVzb2x1dGlvbiB3YXJuaW5nIGNvZGUgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fRkxBR0dFRF9XQVJOSU5HID0gJ1ZVTE5fRkxBR0dFRCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX01BWF9DUklUSUNBTGA6IHRoZSBwbGF0Zm9ybSBmbG9vciDigJQgYSB2ZXJzaW9uIHdpdGggTU9SRSBmaXhhYmxlXG4gKiBDcml0aWNhbCBmaW5kaW5ncyB0aGFuIHRoaXMgZmFpbHMgaXRzIGJ1aWxkIChgUExVR0lOX1ZVTE5fR0FURWApIGFuZCBpc1xuICogZmxhZ2dlZCBieSB0aGUgcmVzY2FuLiBEZWZhdWx0IGAwYDsgYC0xYCBkaXNhYmxlcyB0aGUgZmxvb3IgKGFuZCB0aGUgZmxhZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuTWF4Q3JpdGljYWwoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudkludCgnUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMJywgMCwgeyBtaW46IC0xIH0pO1xufVxuXG4vKipcbiAqIEEgc2NvcGVkLCBFWFBJUklORyBleGVtcHRpb24gZnJvbSB0aGUgdnVsbmVyYWJpbGl0eSBmbG9vciBmb3Igb25lIHBsdWdpbi5cbiAqXG4gKiBgUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMYCBpcyB0aGUgb25seSBvdGhlciBsZXZlciBhbmQgaXQgaXMgZmFyIHRvbyBibHVudDpcbiAqIHJhaXNpbmcgaXQgYWJvdmUgMCBleGVtcHRzIGV2ZXJ5IHBsdWdpbiBmcm9tIGV2ZXJ5IENyaXRpY2FsLiBTb21lIGltYWdlc1xuICogZ2VudWluZWx5IGNhbm5vdCByZWFjaCB6ZXJvIOKAlCBhIGJyb3dzZXItYnVuZGxpbmcgdGVzdCBydW5uZXIgKGFydGlsbGVyeSBzaGlwc1xuICogQ2hyb21pdW0gdGhyb3VnaCBpdHMgb3duIEBwbGF5d3JpZ2h0L2Jyb3dzZXItY2hyb21pdW0gZGVwZW5kZW5jeSwgcGxheXdyaWdodFxuICogZG93bmxvYWRzIEZpcmVmb3gpIGlzIGF0IHVwc3RyZWFtJ3MgbGF0ZXN0IGFuZCBzdGlsbCBjYXJyaWVzIGZpeGFibGUgZmluZGluZ3MsXG4gKiBiZWNhdXNlIGJyb3dzZXJzIHNoaXAgQ1ZFIGZpeGVzIHdlZWtseSB3aGlsZSBwaW5uZWQgYnVpbGRzIGxhZyBieSBkZXNpZ24uXG4gKiBXaXRob3V0IGEgbmFycm93IGV4ZW1wdGlvbiB0aGUgb25seSBvcHRpb25zIGFyZSBcImJsb2NrIHRoZSBwbHVnaW4gZm9yZXZlclwiIG9yXG4gKiBcImRpc2FibGUgdGhlIGZsb29yIGZvciBldmVyeXRoaW5nXCIuXG4gKlxuICogVGhyZWUgcHJvcGVydGllcyBtYWtlIHRoaXMgYW4gZXhlbXB0aW9uIHJhdGhlciB0aGFuIGEgaG9sZSwgYW5kIGFsbCB0aHJlZSBhcmVcbiAqIGVuZm9yY2VkIGJlbG93IHJhdGhlciB0aGFuIGRvY3VtZW50ZWQgYW5kIGhvcGVkIGZvcjpcbiAqXG4gKiAgIFNDT1BFRCAgICB0byBvbmUgcGx1Z2luLCB0byBuYW1lZCBwYWNrYWdlcywgQU5EIHRvIHRoZSBzeXN0ZW0gb3JnLiBBIG5ld1xuICogICAgICAgICAgICAgQ3JpdGljYWwgaW4gYW55IG90aGVyIHBhY2thZ2Ugc3RpbGwgZmFpbHMgdGhlIGdhdGUsIHNvIGEgd2FpdmVyXG4gKiAgICAgICAgICAgICBjYW5ub3QgZ3JvdyBzaWxlbnRseSBpbnRvIFwidGhpcyBwbHVnaW4gaXMgZXhlbXB0XCIuIFRoZSBvcmcgYm91bmRcbiAqICAgICAgICAgICAgIG1hdHRlcnMgYmVjYXVzZSBwbHVnaW4gbmFtZXMgYXJlIHVuaXF1ZSBwZXIgKG5hbWUsIHZlcnNpb24sXG4gKiAgICAgICAgICAgICBvcmdJZCkgYW5kIE5PVCBnbG9iYWxseTogd2l0aG91dCBpdCwgYW55IHRlbmFudCBjb3VsZCBpbmhlcml0IGFuXG4gKiAgICAgICAgICAgICBleGVtcHRpb24gYnkgbmFtaW5nIHRoZWlyIHBsdWdpbiBgYXJ0aWxsZXJ5YC5cbiAqICAgRVhQSVJJTkcgIGV2ZXJ5IGVudHJ5IGNhcnJpZXMgYSBkYXRlIGFuZCBzdG9wcyBhcHBseWluZyBhZnRlciBpdC4gQSB3YWl2ZXJcbiAqICAgICAgICAgICAgIG5vYm9keSByZXZpc2l0cyBiZWNvbWVzIHBlcm1hbmVudDsgdGhpcyBvbmUgbGFwc2VzIG9uIGl0cyBvd24gYW5kXG4gKiAgICAgICAgICAgICB0aGUgcGx1Z2luIHN0YXJ0cyBmYWlsaW5nIGFnYWluLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgcHJvbXB0LlxuICogICBWSVNJQkxFICAgd2hhdCB3YXMgd2FpdmVkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvIGl0IHJlYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICBtZXRyaWMsIHRoZSBhdWRpdCByZWNvcmQgYW5kIHRoZSBidWlsZCBtZXNzYWdlIGluc3RlYWQgb2ZcbiAqICAgICAgICAgICAgIHZhbmlzaGluZyBmcm9tIHRoZSBjb3VudC5cbiAqXG4gKiBGb3JtYXQg4oCUIGVudHJpZXMgYDtgLXNlcGFyYXRlZCwgZmllbGRzIGA6YC1zZXBhcmF0ZWQsIHBhY2thZ2VzIGAsYC1zZXBhcmF0ZWQ6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPWFydGlsbGVyeToyMDI2LTEyLTMxOmNocm9taXVtLGNocm9tZTtwbGF5d3JpZ2h0OjIwMjYtMTItMzE6ZmlyZWZveFxuICpcbiAqIEEgbWFsZm9ybWVkIGVudHJ5IGlzIERST1BQRUQsIG5ldmVyIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZDogdGhlIGZhaWx1cmUgbW9kZVxuICogb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBzdGlsbCBibG9ja3NcIiwgbm90IFwiZXZlcnl0aGluZyBpcyB3YWl2ZWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyIHtcbiAgLyoqIFBsdWdpbiBuYW1lIHRoZSB3YWl2ZXIgYXBwbGllcyB0byAoZXhhY3QgbWF0Y2gpLiAqL1xuICBwbHVnaW46IHN0cmluZztcbiAgLyoqXG4gICAqIFBsdWdpbiB2ZXJzaW9uIHRoZSB3YWl2ZXIgaXMgbGltaXRlZCB0bywgb3IgbnVsbCBmb3IgZXZlcnkgdmVyc2lvbi5cbiAgICpcbiAgICogQSB3YWl2ZXIgaXMgYSBqdWRnZW1lbnQgYWJvdXQgYSBTUEVDSUZJQyBpbWFnZSDigJQgXCJ0aGlzIHJlbGVhc2Ugb2YgYXJ0aWxsZXJ5XG4gICAqIGJ1bmRsZXMgYSBDaHJvbWl1bSB3ZSBjYW5ub3QgcGF0Y2hcIi4gTGVmdCB1bnBpbm5lZCBpdCBzaWxlbnRseSBjYXJyaWVzIHRvXG4gICAqIGV2ZXJ5IGZ1dHVyZSB2ZXJzaW9uLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBmaW5kaW5ncyBub2JvZHkgaGFzIGxvb2tlZCBhdCxcbiAgICogd2hpY2ggaXMgaG93IGEgbmFycm93IGV4ZW1wdGlvbiBiZWNvbWVzIGEgc3RhbmRpbmcgb25lLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEluY2x1c2l2ZSBleHBpcnkgKFVUQyBkYXRlKS4gQWZ0ZXIgaXQgdGhlIGVudHJ5IGhhcyBubyBlZmZlY3QuICovXG4gIGV4cGlyZXM6IERhdGU7XG4gIC8qKiBQYWNrYWdlIG5hbWVzIHdob3NlIGZpbmRpbmdzIGFyZSBleGVtcHQuIE5ldmVyIGVtcHR5IOKAlCBzZWUgcGFyc2VWdWxuV2FpdmVycy4gKi9cbiAgcGFja2FnZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogQSBkcm9wcGVkIGVudHJ5IGFuZCB3aHksIHNvIHRoZSBvcGVyYXRvciBjYW4gYmUgdG9sZCBpbnN0ZWFkIG9mIGd1ZXNzaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyUHJvYmxlbSB7XG4gIGVudHJ5OiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xufVxuXG4vKiogUGFyc2VkIHdhaXZlcnMgcGx1cyB0aGUgZW50cmllcyB0aGF0IHdlcmUgcmVqZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXJQYXJzZSB7XG4gIHdhaXZlcnM6IFZ1bG5XYWl2ZXJbXTtcbiAgcHJvYmxlbXM6IFZ1bG5XYWl2ZXJQcm9ibGVtW107XG59XG5cbi8qKlxuICogUGFyc2UgYFBMVUdJTl9WVUxOX1dBSVZFUlNgLCBSRVBPUlRJTkcgd2hhdCB3YXMgZHJvcHBlZC5cbiAqXG4gKiBEcm9wcGluZyBhIG1hbGZvcm1lZCBlbnRyeSBpcyB0aGUgc2FmZSBkaXJlY3Rpb24g4oCUIGEgdHlwbyBtdXN0IG5vdCBiZWNvbWUgYVxuICogd2lsZGNhcmQg4oCUIGJ1dCBzaWxlbnRseSBkcm9wcGluZyBpdCBpcyBhIHVzYWJpbGl0eSB0cmFwOiB0aGUgb3BlcmF0b3Igc2V0cyBhXG4gKiB3YWl2ZXIsIHRoZSBnYXRlIGtlZXBzIGJsb2NraW5nLCBhbmQgbm90aGluZyBhbnl3aGVyZSBzYXlzIHdoeS4gQ2FsbGVycyB0aGF0XG4gKiBjYW4gc3VyZmFjZSBpdCAoc2VydmljZSBib290KSB1c2UgdGhpczsgYHBhcnNlVnVsbldhaXZlcnNgIGlzIHRoZSBzaG9ydGhhbmRcbiAqIGZvciB0aGUgb25lcyB0aGF0IGNhbm5vdC5cbiAqXG4gKiBFbnRyeSBncmFtbWFyOiBgPHBsdWdpbj5bQDx2ZXJzaW9uPl06PFlZWVktTU0tREQ+Ojxwa2c+Wyw8cGtnPuKApl1gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZ1bG5XYWl2ZXJzVmVyYm9zZShyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52LlBMVUdJTl9WVUxOX1dBSVZFUlMpOiBWdWxuV2FpdmVyUGFyc2Uge1xuICBjb25zdCB3YWl2ZXJzOiBWdWxuV2FpdmVyW10gPSBbXTtcbiAgY29uc3QgcHJvYmxlbXM6IFZ1bG5XYWl2ZXJQcm9ibGVtW10gPSBbXTtcbiAgaWYgKCFyYXc/LnRyaW0oKSkgcmV0dXJuIHsgd2FpdmVycywgcHJvYmxlbXMgfTtcbiAgY29uc3QgcmVqZWN0ID0gKGVudHJ5OiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKSA9PiB7IHByb2JsZW1zLnB1c2goeyBlbnRyeTogZW50cnkudHJpbSgpLCByZWFzb24gfSk7IH07XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiByYXcuc3BsaXQoJzsnKSkge1xuICAgIGlmICghZW50cnkudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBbdGFyZ2V0LCBleHBpcmVzLCBwYWNrYWdlc10gPSBlbnRyeS5zcGxpdCgnOicpLm1hcCgoZikgPT4gZj8udHJpbSgpID8/ICcnKTtcbiAgICAvLyBFdmVyeSBmaWVsZCBpcyBSRVFVSVJFRC4gQW4gZW50cnkgbWlzc2luZyBpdHMgcGFja2FnZSBsaXN0IHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHJlYWQgYXMgXCJ3YWl2ZSB0aGlzIHBsdWdpbiBlbnRpcmVseVwiLCB3aGljaCBpcyB0aGUgb25lIHRoaW5nXG4gICAgLy8gdGhpcyBtdXN0IG5vdCBiZSBhYmxlIHRvIGV4cHJlc3MuXG4gICAgaWYgKCF0YXJnZXQgfHwgIWV4cGlyZXMgfHwgIXBhY2thZ2VzKSB7XG4gICAgICByZWplY3QoZW50cnksICdleHBlY3RlZCA8cGx1Z2luPltAPHZlcnNpb24+XTo8WVlZWS1NTS1ERD46PHBhY2thZ2U+Wyw8cGFja2FnZT7igKZdJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYXQgPSB0YXJnZXQuaW5kZXhPZignQCcpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF0ID09PSAtMSA/IHRhcmdldCA6IHRhcmdldC5zbGljZSgwLCBhdCkudHJpbSgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBhdCA9PT0gLTEgPyBudWxsIDogdGFyZ2V0LnNsaWNlKGF0ICsgMSkudHJpbSgpO1xuICAgIGlmICghcGx1Z2luKSB7IHJlamVjdChlbnRyeSwgJ25vIHBsdWdpbiBuYW1lJyk7IGNvbnRpbnVlOyB9XG4gICAgaWYgKGF0ICE9PSAtMSAmJiAhdmVyc2lvbikgeyByZWplY3QoZW50cnksIFwiJ0AnIHdpdGggbm8gdmVyc2lvbiDigJQgb21pdCBpdCB0byBjb3ZlciBldmVyeSB2ZXJzaW9uXCIpOyBjb250aW51ZTsgfVxuICAgIGlmICghL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoZXhwaXJlcykpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgWVlZWS1NTS1ERGApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IHdoZW4gPSBuZXcgRGF0ZShgJHtleHBpcmVzfVQyMzo1OTo1OS45OTlaYCk7XG4gICAgaWYgKE51bWJlci5pc05hTih3aGVuLmdldFRpbWUoKSkpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgYSByZWFsIGRhdGVgKTsgY29udGludWU7IH1cbiAgICBjb25zdCBuYW1lcyA9IHBhY2thZ2VzLnNwbGl0KCcsJykubWFwKChuKSA9PiBuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHsgcmVqZWN0KGVudHJ5LCAnbm8gcGFja2FnZSBuYW1lcycpOyBjb250aW51ZTsgfVxuICAgIHdhaXZlcnMucHVzaCh7IHBsdWdpbiwgdmVyc2lvbiwgZXhwaXJlczogd2hlbiwgcGFja2FnZXM6IG5hbWVzIH0pO1xuICB9XG4gIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG59XG5cbi8qKiBQYXJzZSBgUExVR0lOX1ZVTE5fV0FJVkVSU2AuIE1hbGZvcm1lZCBvciBpbmNvbXBsZXRlIGVudHJpZXMgYXJlIGRyb3BwZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVycyhyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52LlBMVUdJTl9WVUxOX1dBSVZFUlMpOiBWdWxuV2FpdmVyW10ge1xuICByZXR1cm4gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3KS53YWl2ZXJzO1xufVxuXG4vKiogV2hhdCBhIHdhaXZlciByZW1vdmVkIGZyb20gdGhlIGNvdW50LCBhbmQgd2hhdCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXZlck91dGNvbWUge1xuICAvKiogRmluZGluZ3MgdGhlIGZsb29yIHN0aWxsIGNvdW50cy4gKi9cbiAgY291bnRlZDogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgLyoqIEZpbmRpbmdzIGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0ZWQgKGVtcHR5IHdoZW4gbm9uZSBhcHBsaWVkKS4gKi9cbiAgd2FpdmVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIFNwbGl0IGZpbmRpbmdzIGludG8gd2hhdCBzdGlsbCBjb3VudHMgYW5kIHdoYXQgYW4gdW5leHBpcmVkIHdhaXZlciBleGVtcHRzLlxuICpcbiAqIE1hdGNoaW5nIGlzIG9uIHRoZSBwYWNrYWdlIG5hbWUgYSB3YWl2ZXIgbmFtZXMsIGNhc2UtaW5zZW5zaXRpdmVseSwgYW5kIG9ubHlcbiAqIGZvciBmaW5kaW5ncyB0aGF0IGFyZSBGSVhBQkxFIOKAlCBhbiB1bmZpeGFibGUgZmluZGluZyBuZXZlciBjb3VudGVkIHRvd2FyZCB0aGVcbiAqIGZsb29yLCBzbyBcIndhaXZpbmdcIiBpdCB3b3VsZCBvdmVyc3RhdGUgd2hhdCB0aGUgd2FpdmVyIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZ1bG5XYWl2ZXJzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLFxuICB3YWl2ZXJzOiByZWFkb25seSBWdWxuV2FpdmVyW10gPSBwYXJzZVZ1bG5XYWl2ZXJzKCksXG4gIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCksXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwbHVnaW5WZXJzaW9uPzogc3RyaW5nLFxuKTogV2FpdmVyT3V0Y29tZSB7XG4gIC8vIFNZU1RFTSBPUkcgT05MWS4gUGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLCBvcmdJZCksIE5PVFxuICAvLyBnbG9iYWxseSDigJQgYW55IHRlbmFudCBjYW4gY3JlYXRlIGEgcGx1Z2luIGNhbGxlZCBgYXJ0aWxsZXJ5YC4gTWF0Y2hpbmcgb25cbiAgLy8gdGhlIG5hbWUgYWxvbmUgd291bGQgaGFuZCBldmVyeSBvbmUgb2YgdGhlbSB0aGUgb3BlcmF0b3IncyBleGVtcHRpb24sIHNvIGFcbiAgLy8gdGVuYW50IGNvdWxkIGluaGVyaXQgYSB3YWl2ZXIgc2ltcGx5IGJ5IGNob29zaW5nIHRoZSBuYW1lLCBhbmQgc2hpcCBhblxuICAvLyBpbWFnZSB3aG9zZSBDcml0aWNhbHMgdGhlIGdhdGUgdGhlbiB3YXZlZCB0aHJvdWdoLiBUaGUgd2FpdmVycyBleGlzdCBmb3IgdGhlXG4gIC8vIE9mZmljaWFsIGNhdGFsb2cgdGhlIG9wZXJhdG9yIGN1cmF0ZXMsIHdoaWNoIGxpdmVzIGluIHRoZSBzeXN0ZW0gb3JnOyBhXG4gIC8vIGNhbGxlciB0aGF0IGNhbm5vdCBzYXkgd2hpY2ggb3JnIHRoaXMgYnVpbGQgYmVsb25ncyB0byBnZXRzIG5vIHdhaXZlci5cbiAgaWYgKG9yZ0lkID09PSB1bmRlZmluZWQgfHwgb3JnSWQudG9Mb3dlckNhc2UoKSAhPT0gU1lTVEVNX09SR19JRCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSB9O1xuICBjb25zdCBhY3RpdmUgPSB3YWl2ZXJzLmZpbHRlcigodykgPT4gdy5wbHVnaW4gPT09IHBsdWdpbk5hbWVcbiAgICAmJiB3LmV4cGlyZXMuZ2V0VGltZSgpID49IG5vdy5nZXRUaW1lKClcbiAgICAvLyBBIHZlcnNpb24tcGlubmVkIHdhaXZlciBjb3ZlcnMgdGhhdCB2ZXJzaW9uIG9ubHkuIEFuIHVucGlubmVkIG9uZSBjb3ZlcnNcbiAgICAvLyBldmVyeSB2ZXJzaW9uLCB3aGljaCBpcyB3aHkgdGhlIHBpbiBpcyB3b3J0aCB3cml0aW5nLlxuICAgICYmICh3LnZlcnNpb24gPT09IG51bGwgfHwgdy52ZXJzaW9uID09PSBwbHVnaW5WZXJzaW9uKSk7XG4gIGlmIChhY3RpdmUubGVuZ3RoID09PSAwKSByZXR1cm4geyBjb3VudGVkOiBbLi4uZmluZGluZ3NdLCB3YWl2ZWQ6IFtdIH07XG4gIGNvbnN0IGV4ZW1wdCA9IG5ldyBTZXQoYWN0aXZlLmZsYXRNYXAoKHcpID0+IHcucGFja2FnZXMubWFwKChuKSA9PiBuLnRvTG93ZXJDYXNlKCkpKSk7XG4gIGNvbnN0IGNvdW50ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW10gPSBbXTtcbiAgY29uc3Qgd2FpdmVkOiBQbHVnaW5TY2FuRmluZGluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZiBvZiBmaW5kaW5ncykge1xuICAgIGlmIChmLmZpeGVkSW4ubGVuZ3RoID4gMCAmJiBleGVtcHQuaGFzKGYucGFja2FnZU5hbWUudG9Mb3dlckNhc2UoKSkpIHdhaXZlZC5wdXNoKGYpO1xuICAgIGVsc2UgY291bnRlZC5wdXNoKGYpO1xuICB9XG4gIHJldHVybiB7IGNvdW50ZWQsIHdhaXZlZCB9O1xufVxuXG4vKiogV2hldGhlciBgZml4YWJsZUNyaXRpY2FsYCBicmVha3MgdGhlIHBsYXRmb3JtIGZsb29yIChuZXZlciwgd2hlbiBkaXNhYmxlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkc1Z1bG5GbG9vcihmaXhhYmxlQ3JpdGljYWw6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyID0gcGx1Z2luVnVsbk1heENyaXRpY2FsKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heCA+PSAwICYmIChmaXhhYmxlQ3JpdGljYWwgPz8gMCkgPiBtYXg7XG59XG5cbi8qKlxuICogYFBMVUdJTl9CTE9DS19PTl9ORVdfQ1JJVElDQUxgIChkZWZhdWx0IGZhbHNlKTogcmVzb2x1dGlvbiBTS0lQUyBmbGFnZ2VkXG4gKiB2ZXJzaW9ucyBmb3IgcmFuZ2VzIGFuZCB0aGUgZGVmYXVsdCAoZmFsbGluZyBiYWNrIHRvIHRoZSBuZXdlc3QgdW5mbGFnZ2VkXG4gKiBvbmUpLCBhbmQgYW4gZXhhY3QgcGluIHRvIGEgZmxhZ2dlZCB2ZXJzaW9uIGlzIHJlZnVzZWQgNDA5XG4gKiBgUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEYC4gT2ZmOiBmbGFnZ2VkIHZlcnNpb25zIHJlc29sdmUgd2l0aCBhXG4gKiBgVlVMTl9GTEFHR0VEYCB3YXJuaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tPbk5ld0NyaXRpY2FsKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnUExVR0lOX0JMT0NLX09OX05FV19DUklUSUNBTCcsIGZhbHNlKTtcbn1cblxuLyoqIGBwa2dAMS4yLjMg4oaSIDEuMi40YCAvIGBwa2dAMS4yLjMgKG5vIGZpeClgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRml4KGY6IFBpY2s8UGx1Z2luU2NhbkZpbmRpbmcsICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nIHwgJ2ZpeGVkSW4nPik6IHN0cmluZyB7XG4gIGNvbnN0IGF0ID0gYCR7Zi5wYWNrYWdlTmFtZX0ke2YucGFja2FnZVZlcnNpb24gPyBgQCR7Zi5wYWNrYWdlVmVyc2lvbn1gIDogJyd9YDtcbiAgcmV0dXJuIGYuZml4ZWRJbi5sZW5ndGggPiAwID8gYCR7YXR9IOKGkiAke2YuZml4ZWRJbi5qb2luKCcsICcpfWAgOiBgJHthdH0gKG5vIGZpeClgO1xufVxuXG4vKiogYENWRS0xIChvcGVuc3NsQDMuMC4xIOKGkiAzLjAuMik7IENWRS0yICjigKYpYCBmb3IgdGhlIGZpcnN0IGBsaW1pdGAgZmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSwgbGltaXQgPSA1KTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvd24gPSBmaW5kaW5ncy5zbGljZSgwLCBsaW1pdCkubWFwKChmKSA9PiBgJHtmLmlkfSAoJHtkZXNjcmliZUZpeChmKX0pYCkuam9pbignOyAnKTtcbiAgY29uc3QgbW9yZSA9IGZpbmRpbmdzLmxlbmd0aCA+IGxpbWl0ID8gYDsgKyR7ZmluZGluZ3MubGVuZ3RoIC0gbGltaXR9IG1vcmVgIDogJyc7XG4gIHJldHVybiBgJHtzaG93bn0ke21vcmV9YDtcbn1cblxuLyoqIFRoZSB3YXJuaW5nIHRleHQgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uOiBgeEB2IGhhcyBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3Mg4oCUIHJlYnVpbGQgb3IgdXBncmFkZWAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRNZXNzYWdlKHJlZjogc3RyaW5nLCBmbGFnOiBQaWNrPFBsdWdpblNjYW5GbGFnLCAnY3JpdGljYWwnPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyZWZ9IGhhcyAke2ZsYWcuY3JpdGljYWx9IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZyR7ZmxhZy5jcml0aWNhbCA9PT0gMSA/ICcnIDogJ3MnfSDigJQgcmVidWlsZCBvciB1cGdyYWRlYDtcbn1cblxuLyoqIEEgYFZVTE5fRkxBR0dFRGAgbG9va3VwIHdhcm5pbmcgKHRoZSBsb29rdXAgZW52ZWxvcGUncyBgd2FybmluZ3NbXWAgZW50cnkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICBjb2RlOiB0eXBlb2YgVlVMTl9GTEFHR0VEX1dBUk5JTkc7XG4gIHBsdWdpbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVG9wIGZpeGFibGUgZmluZGluZ3Mgd2l0aCB0aGVpciBmaXhlZCB2ZXJzaW9ucy4gKi9cbiAgZmluZGluZ3M6IFBsdWdpblNjYW5GaW5kaW5nW107XG59XG5cbi8qKiBCdWlsZCB0aGUgYFZVTE5fRkxBR0dFRGAgd2FybmluZyBmb3IgYHBsdWdpbkB2ZXJzaW9uYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuRmxhZ2dlZFdhcm5pbmcocGx1Z2luOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgZmxhZzogUGx1Z2luU2NhbkZsYWcpOiBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IFZVTE5fRkxBR0dFRF9XQVJOSU5HLFxuICAgIHBsdWdpbixcbiAgICB2ZXJzaW9uLFxuICAgIGNyaXRpY2FsOiBmbGFnLmNyaXRpY2FsLFxuICAgIGhpZ2g6IGZsYWcuaGlnaCxcbiAgICBtZXNzYWdlOiB2dWxuRmxhZ2dlZE1lc3NhZ2UoYCR7cGx1Z2lufUAke3ZlcnNpb259YCwgZmxhZyksXG4gICAgZmluZGluZ3M6IGZsYWcuZmluZGluZ3Muc2xpY2UoMCwgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyksXG4gIH07XG59XG5cbi8qKiBUaGUgNDA5IG1lc3NhZ2UgZm9yIGFuIGV4YWN0IHBpbiB0byBhIGZsYWdnZWQgdmVyc2lvbiB3aGlsZSBibG9ja2luZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuQmxvY2tlZE1lc3NhZ2UocGx1Z2luOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgZmxhZzogUGx1Z2luU2NhbkZsYWcpOiBzdHJpbmcge1xuICBjb25zdCBmaXhlcyA9IGZsYWcuZmluZGluZ3MubGVuZ3RoID4gMCA/IGAgRml4OiAke2Rlc2NyaWJlRmluZGluZ3MoZmxhZy5maW5kaW5ncyl9LmAgOiAnJztcbiAgcmV0dXJuIGAke3BsdWdpbn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkOiBhIHJlc2NhbiBmb3VuZCAke2ZsYWcuY3JpdGljYWx9IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZyR7ZmxhZy5jcml0aWNhbCA9PT0gMSA/ICcnIDogJ3MnfSBgXG4gICAgKyBgKFBMVUdJTl9CTE9DS19PTl9ORVdfQ1JJVElDQUwpLiBSZWJ1aWxkIGl0IG9uIHBhdGNoZWQgcGFja2FnZXMgb3IgbW92ZSB0byBhIG5ld2VyIHZlcnNpb24uJHtmaXhlc31gO1xufVxuXG4vKiogTmFycm93IGFuIHVua25vd24gYHNjYW5fZmxhZ2AganNvbmIgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTY2FuRmxhZyh2YWx1ZTogdW5rbm93bik6IFBsdWdpblNjYW5GbGFnIHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHR5cGVvZiB2LmNyaXRpY2FsICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5oaWdoICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheSh2LmZpbmRpbmdzKSA/ICh2LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10pLmZpbHRlcigoZikgPT4gZiAmJiB0eXBlb2YgZi5pZCA9PT0gJ3N0cmluZycpIDogW107XG4gIHJldHVybiB7XG4gICAgY3JpdGljYWw6IHYuY3JpdGljYWwsXG4gICAgaGlnaDogdi5oaWdoLFxuICAgIG1heENyaXRpY2FsOiB0eXBlb2Ygdi5tYXhDcml0aWNhbCA9PT0gJ251bWJlcicgPyB2Lm1heENyaXRpY2FsIDogMCxcbiAgICBmaW5kaW5nczogZmluZGluZ3MubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSksXG4gIH07XG59XG4iXX0=
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXlIMUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUU3Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRTdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQW1FO0lBQ2hHLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUF5RixFQUN6RixLQUFtQztJQUVuQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFD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QUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGltYWdlIHNjYW4gZ2F0ZXMgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQgXCJTY2FuIGdhdGVzXCIpOiB0aGUgc2hhcmVkXG4gKiB2b2NhYnVsYXJ5IG9mIHRoZSBidWlsZC10aW1lIGdhdGUsIHRoZSBuaWdodGx5IHJlc2NhbidzIGZsYWcsIGFuZCB0aGVcbiAqIHJlc29sdXRpb24gd2FybmluZyAvIGJsb2NrIOKAlCB1c2VkIGJ5IHRoZSBwbHVnaW4gc2VydmljZSAod2hpY2ggc3RvcmVzIGFuZFxuICogZW5mb3JjZXMgdGhlbSksIHRoZSByZXNvbHZlciBpbiBwaXBlbGluZS1kYXRhICh3aGljaCBza2lwcyBvciB3YXJucyksIGFuZCB0aGVcbiAqIGRhc2hib2FyZCAod2hpY2ggc2hvd3MgdGhlbSkuXG4gKlxuICogQSBmaW5kaW5nIGlzIEZJWEFCTEUgd2hlbiBncnlwZSByZXBvcnRzIGEgZml4ZWQgdmVyc2lvbiBmb3IgaXRcbiAqIChgdnVsbmVyYWJpbGl0eS5maXguc3RhdGUgPT0gXCJmaXhlZFwiYCB3aXRoIGF0IGxlYXN0IG9uZSB2ZXJzaW9uKTogdGhlIGdhdGVzXG4gKiBjb3VudCBmaXhhYmxlIENyaXRpY2FsIGZpbmRpbmdzLCBiZWNhdXNlIGFuIHVuZml4YWJsZSBvbmUgY2FuJ3QgYmUgYWN0ZWQgb25cbiAqIGJ5IHJlYnVpbGRpbmcgb3IgdXBncmFkaW5nIOKAlCB3aXRoIE9ORSBleGNlcHRpb24uIEEgQ3JpdGljYWwgdGhhdCBDSVNBIGxpc3RzXG4gKiBhcyBLTk9XTiBFWFBMT0lURUQgKEtFVikgaXMgZ2F0ZWQgZXZlbiB3aXRoIG5vIGZpeCAoYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCk6XG4gKiBcIm5vdGhpbmcgdG8gdXBncmFkZSB0b1wiIGlzIGEgcmVhc29uIHRvIG5vdCBzaGlwIHRoZSBpbWFnZSwgbm90IGEgcmVhc29uIHRvXG4gKiBzaGlwIGl0LCB3aGVuIHRoZSB2dWxuZXJhYmlsaXR5IGlzIGJlaW5nIGV4cGxvaXRlZCBpbiB0aGUgd2lsZC5cbiAqL1xuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqIE9uZSBDcml0aWNhbC9IaWdoIGZpbmRpbmcgYXMgdGhlIGZsYWcgYW5kIHRoZSBnYXRlIG1lc3NhZ2VzIGNhcnJ5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TY2FuRmluZGluZyB7XG4gIC8qKiBUaGUgdnVsbmVyYWJpbGl0eSBpZCAoQ1ZFLeKApiwgR0hTQS3igKYpLiAqL1xuICBpZDogc3RyaW5nO1xuICBzZXZlcml0eTogJ2NyaXRpY2FsJyB8ICdoaWdoJztcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgcGFja2FnZVZlcnNpb246IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIHRoYXQgZml4IGl0OyBlbXB0eSA9IG5vIGZpeCBhdmFpbGFibGUgKG5vdCBmaXhhYmxlKS4gKi9cbiAgZml4ZWRJbjogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDSVNBIGxpc3RzIGl0IGFzIEtOT1dOIEVYUExPSVRFRCAoZ3J5cGUncyBga25vd25FeHBsb2l0ZWRgKS4gQWJzZW50ID1cbiAgICogbm90IGxpc3RlZC4gQSBLRVYgQ3JpdGljYWwgaXMgZ2F0ZWQgZXZlbiB3aGVuIHVuZml4YWJsZSwgYW5kIG9ubHkgYW5cbiAgICogQURWSVNPUlktSUQgd2FpdmVyIGNhbiBleGVtcHQgaXQg4oCUIHNlZSB7QGxpbmsgYXBwbHlWdWxuV2FpdmVyc30uXG4gICAqL1xuICBrZXY/OiBib29sZWFuO1xuICAvKipcbiAgICogRVBTUyBwcm9iYWJpbGl0eSAoMOKAkzEpIHRoYXQgaXQgaXMgZXhwbG9pdGVkIGluIHRoZSBuZXh0IDMwIGRheXMsIGFzIGdyeXBlXG4gICAqIHJlcG9ydHMgaXQ7IGFic2VudCB3aGVuIHRoZSBEQiBjYXJyaWVzIG5vIHNjb3JlLiBDb250ZXh0IGZvciBhIHJlYWRlclxuICAgKiByYW5raW5nIGZpbmRpbmdzLCBuZXZlciBhIGdhdGUgaW5wdXQg4oCUIGEgcHJvYmFiaWxpdHkgaXMgbm90IGEgdmVyZGljdC5cbiAgICovXG4gIGVwc3M/OiBudW1iZXI7XG59XG5cbi8qKlxuICogYHNjYW5fZmxhZ2Agb24gYSB2ZXJzaW9uIHRoZSBuaWdodGx5IHJlc2NhbiBmbGFnZ2VkOiBpdHMgR0FURUQgQ3JpdGljYWxcbiAqIGNvdW50IGFuZCBmaXhhYmxlIEhpZ2ggY291bnQgYXQgdGhhdCByZXNjYW4sIGFuZCB0aGUgdG9wIGdhdGVkIGZpbmRpbmdzLiBTZXRcbiAqIHdoaWxlIGdhdGVkIGZpbmRpbmdzIGV4Y2VlZCBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCwgY2xlYXJlZCB3aGVuIGFcbiAqIHJlc2NhbiBmaW5kcyB0aGVtIHJlc29sdmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5GbGFnIHtcbiAgLyoqXG4gICAqIEdhdGVkIGZpbmRpbmdzIOKAlCBhdCBvciBhYm92ZSBgZmFpbE9uYCAoZGVmYXVsdCBDcml0aWNhbCk6IGZpeGFibGUgb25lcyxcbiAgICogcGx1cyB1bmZpeGFibGUgS0VWLWxpc3RlZCBvbmVzIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmAuXG4gICAqL1xuICBnYXRlZDogbnVtYmVyO1xuICAvKiogT2YgYGdhdGVkYCwgdGhlIEtFVi1saXN0ZWQgb25lcyAoQ0lTQSBrbm93biBleHBsb2l0ZWQpLiBBYnNlbnQgPSBub25lLiAqL1xuICBrZXY/OiBudW1iZXI7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MuICovXG4gIGhpZ2g6IG51bWJlcjtcbiAgLyoqIFRoZSBmbG9vciBpdCB3YXMgY29tcGFyZWQgYWdhaW5zdCAoYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2ApLiAqL1xuICBtYXhGaW5kaW5nczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCBpdCB3YXMgZ2F0ZWQgYXQsIHdoZW4gdGhhdCB3YXMgYGhpZ2hgICh0aGVuXG4gICAqIGBnYXRlZGAgY291bnRzIENyaXRpY2FsIEFORCBIaWdoIGZpbmRpbmdzKS4gQWJzZW50ID0gYGNyaXRpY2FsYC5cbiAgICogQ2FycmllZCBvbiB0aGUgZmxhZyBiZWNhdXNlIHRoZSBzZXJ2aWNlcyB0aGF0IFJFTkRFUiBpdCAodGhlIHJlc29sdmVyLFxuICAgKiB0aGUgZGFzaGJvYXJkKSBkbyBub3Qgc2hhcmUgdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZW52aXJvbm1lbnQuXG4gICAqL1xuICBmYWlsT24/OiAnaGlnaCc7XG4gIC8qKiBBdCBtb3N0IHtAbGluayBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTfSBmaXhhYmxlIGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX3N1bW1hcnlgIG9uIGV2ZXJ5IHNjYW5uZWQgdmVyc2lvbjogdGhlIExBVEVTVCBzY2FuJ3MgZmluZGluZ3Mg4oCUIHdyaXR0ZW5cbiAqIGJ5IHRoZSBidWlsZCB0aGF0IGVzdGFibGlzaGVkIHRoZSB2ZXJzaW9uIGFuZCByZXdyaXR0ZW4gYnkgZXZlcnkgcmVzY2FuIOKAlFxuICogd2hldGhlciBvciBub3QgdGhlIGdhdGUgdHJpcHBlZC5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBQbHVnaW5TY2FuRmxhZ30sIHdoaWNoIGV4aXN0cyBvbmx5IHdoaWxlIGEgdmVyc2lvbiBpcyBvdmVyXG4gKiB0aGUgZmxvb3IuIEEgdmVyc2lvbiBjYXJyeWluZyBub3RoaW5nIGJ1dCBIaWdoIGZpbmRpbmdzIGlzIG5ldmVyIGZsYWdnZWQg4oCUIHNvIGFcbiAqIHJlcG9ydCB3aG9zZSBqb2IgaXMgdG8gc2hvdyBDcml0aWNhbCBBTkQgSGlnaCBleHBvc3VyZSBoYWQgbm8gc291cmNlIHRvIHJlYWQuXG4gKiBXaGF0IGEgcmVwb3J0IFNIT1dTIGFuZCB3aGF0IGEgYnVpbGQgUkVGVVNFUyBhcmUgZGlmZmVyZW50IHF1ZXN0aW9ucywgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gbWVhbnQgdGhlIGFuc3dlciB0byB0aGUgZmlyc3Qgd2FzIFwibm90aGluZ1wiLlxuICpcbiAqIEl0IGlzIGFsc28gdGhlIHJlc2NhbidzIEJBU0VMSU5FLiBcIklzIGFueXRoaW5nIG5ldz9cIiBpcyBhbnN3ZXJlZCBieSBkaWZmaW5nXG4gKiBmaW5kaW5nIGlkZW50aXRpZXMgYWdhaW5zdCB0aGUgcHJldmlvdXMgc3VtbWFyeSAoe0BsaW5rIG5ld1NjYW5GaW5kaW5nc30pLFxuICogbm90IGJ5IGNvbXBhcmluZyBjb3VudHM6IG9uZSBDVkUgZml4ZWQgYW5kIGEgZGlmZmVyZW50IG9uZSBwdWJsaXNoZWQgbGVhdmVzXG4gKiB0aGUgY291bnQgdW5jaGFuZ2VkIGFuZCBoaWRlcyBhIGJyYW5kLW5ldyBDcml0aWNhbC5cbiAqXG4gKiBDT05UUkFDVCDigJQgcmVhZCBieSB0aGUgcmVwb3J0aW5nIC8gZXhwb3N1cmUgY29kZSBpbiBwaXBlbGluZS1kYXRhLiBGaWVsZHMgYXJlXG4gKiBvbmx5IGV2ZXIgYWRkZWQ7IGV2ZXJ5IGZpZWxkIGJlbG93IGlzIHByZXNlbnQgb24gZXZlcnkgc3VtbWFyeSB3cml0dGVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5TdW1tYXJ5IHtcbiAgLyoqIEZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsRml4YWJsZTogbnVtYmVyO1xuICAvKiogRml4YWJsZSBIaWdoIGZpbmRpbmdzLiAqL1xuICBoaWdoRml4YWJsZTogbnVtYmVyO1xuICAvKiogVG90YWxzIGluY2x1ZGluZyB1bmZpeGFibGUgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgbWVkaXVtOiBudW1iZXI7XG4gIGxvdzogbnVtYmVyO1xuICAvKiogS0VWLWxpc3RlZCAoQ0lTQSBrbm93biBleHBsb2l0ZWQpIENyaXRpY2FsICsgSGlnaCBmaW5kaW5ncy4gKi9cbiAga2V2OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFVkVSWSBDcml0aWNhbCBhbmQgSGlnaCBmaW5kaW5nIOKAlCBmaXhhYmxlIEFORCB1bmZpeGFibGUg4oCUIENyaXRpY2FscyBmaXJzdCxcbiAgICogY2FwcGVkIGF0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfS4gYHRydW5jYXRlZGAgc2F5cyB3aGV0aGVyIHRoZVxuICAgKiBjYXAgY3V0IGl0OyB0aGUgY291bnRzIGFib3ZlIGFyZSBuZXZlciBjYXBwZWQuXG4gICAqL1xuICBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgdHJ1bmNhdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogS2V5cyAoe0BsaW5rIHNjYW5GaW5kaW5nS2V5fSkgb2YgdGhlIGZpbmRpbmdzIGEgYFBMVUdJTl9WVUxOX1dBSVZFUlNgIGVudHJ5XG4gICAqIGV4ZW1wdGVkIGZyb20gdGhlIGZsb29yIGF0IHRoaXMgc2Nhbi4gVGhleSBhcmUgc3RpbGwgaW4gYGZpbmRpbmdzYCDigJQgYVxuICAgKiB3YWl2ZXIgY2hhbmdlcyB0aGUgdmVyZGljdCwgbm90IHdoYXQgdGhlIGltYWdlIGNvbnRhaW5zLlxuICAgKi9cbiAgd2FpdmVkOiBzdHJpbmdbXTtcbiAgLyoqIFdoZW4gdGhpcyBzY2FuIHJhbiAoSVNPKS4gKi9cbiAgc2Nhbm5lZEF0OiBzdHJpbmc7XG4gIC8qKiBXaGljaCBwYXRoIHdyb3RlIGl0LiAqL1xuICB0cmlnZ2VyOiAnYnVpbGQnIHwgJ3Jlc2NhbicgfCAncHJvbW90ZSc7XG4gIC8qKiBUaGUgaW1hZ2UgdGhpcyBkZXNjcmliZXMuIEEgdmVyc2lvbiByZWJ1aWx0IG9uIGEgcGF0Y2hlZCBiYXNlIGlzIGFcbiAgICogIGRpZmZlcmVudCBhcnRpZmFjdCwgc28gYSBzdW1tYXJ5IHdpdGhvdXQgaXRzIGRpZ2VzdCBjYW5ub3QgYmUgdHJ1c3RlZC4gKi9cbiAgaW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIHZ1bG5lcmFiaWxpdHkgREIgdGhlIHNjYW4gbWF0Y2hlZCBhZ2FpbnN0IHdhcyBCVUlMVCAoSVNPKSwgb3IgbnVsbFxuICAgKiB3aGVuIGl0IGNvdWxkIG5vdCBiZSByZWFkLiBBIHNjYW4gaXMgb25seSBhcyBjdXJyZW50IGFzIGl0cyBEQjogYSBjbGVhblxuICAgKiByZXN1bHQgZnJvbSBhIHdlZWstb2xkIERCIHNheXMgbm90aGluZyBhYm91dCB0aGlzIHdlZWsncyBDVkVzLlxuICAgKi9cbiAgZGJCdWlsdEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogRXhlY3V0YWJsZXMgaW4gdGhlIGltYWdlIHRoYXQgTk8gU0JPTSBwYWNrYWdlIGFjY291bnRzIGZvciDigJQgVVBYLXBhY2tlZCBvclxuICAgKiBzdHJpcHBlZCBHbywgSGFza2VsbCwgR3JhYWxWTSBuYXRpdmUgaW1hZ2VzLCBOb2RlIFNFQSBidW5kbGVzLCB2ZW5kb3JlZFxuICAgKiBicm93c2Vycy4gVGhlIHNjYW5uZXIgY2Fubm90IHNlZSBpbnNpZGUgdGhlbSwgc28gdGhlaXIgQ1ZFcyBhcmUgaW52aXNpYmxlIHRvXG4gICAqIGV2ZXJ5IGNvdW50IGFib3ZlLiBQYXRocywgc29ydGVkLCBjYXBwZWQgYXQge0BsaW5rIFNDQU5fU1VNTUFSWV9NQVhfQklOQVJJRVN9LlxuICAgKiBJbmZvcm1hdGlvbmFsOiBuZXZlciBhIGdhdGUuXG4gICAqL1xuICB1bmNhdGFsb2d1ZWRCaW5hcmllczogc3RyaW5nW107XG59XG5cbi8qKiBGaW5kaW5ncyBhIHN1bW1hcnkgaXRlbWl6ZXMuIENvdW50cyBhcmUgbmV2ZXIgY2FwcGVkOyB0aGlzIGJvdW5kcyB0aGUganNvbmIuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9GSU5ESU5HUyA9IDUwMDtcblxuLyoqIFVuY2F0YWxvZ3VlZCBiaW5hcmllcyBhIHN1bW1hcnkgbGlzdHMuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9CSU5BUklFUyA9IDIwMDtcblxuLyoqXG4gKiBBIGZpbmRpbmcncyBpZGVudGl0eTogdGhlIGFkdmlzb3J5IGluIGEgc3BlY2lmaWMgcGFja2FnZSB2ZXJzaW9uLiBUaGUgc2FtZVxuICogQ1ZFIGluIHR3byBwYWNrYWdlcyBpcyB0d28gZmluZGluZ3M7IHRoZSBzYW1lIENWRSByZXBvcnRlZCBhZ2FpbiBhZnRlciBhXG4gKiByZXNjYW4gaXMgdGhlIHNhbWUgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbkZpbmRpbmdLZXkoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ2lkJyB8ICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmLmlkfXwke2YucGFja2FnZU5hbWV9fCR7Zi5wYWNrYWdlVmVyc2lvbn1gO1xufVxuXG4vKipcbiAqIFRoZSBDcml0aWNhbC9IaWdoIGZpbmRpbmdzIGluIGBhZnRlcmAgdGhhdCB0aGUgcHJldmlvdXMgc3VtbWFyeSBkaWQgbm90XG4gKiBjYXJyeSDigJQgd2hhdCBOMzEgYW5kIGFuIGFkdmlzb3J5IGRyYWZ0IGFyZSBhYm91dC5cbiAqXG4gKiBObyBwcmV2aW91cyBzdW1tYXJ5IG1lYW5zIG5vIGJhc2VsaW5lOiBldmVyeSBmaW5kaW5nIGlzIG5ldy4gQSBUUlVOQ0FURURcbiAqIGJhc2VsaW5lIGtub3dzIG9ubHkgaXRzIGZpcnN0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfSBmaW5kaW5nc1xuICogKENyaXRpY2FscyBmaXJzdCksIHNvIGEgZmluZGluZyBtaXNzaW5nIGZyb20gaXQgaXMgbmV3IG9ubHkgaWYgdGhlIGJhc2VsaW5lXG4gKiBwcm92YWJseSBsaXN0ZWQgZXZlcnkgZmluZGluZyBvZiB0aGF0IHNldmVyaXR5IOKAlCBvdGhlcndpc2UgaXQgbWF5IHNpbXBseSBoYXZlXG4gKiBiZWVuIGN1dCwgYW5kIHJlcG9ydGluZyBpdCBhcyBuZXcgd291bGQgYmUgYSBmYWxzZSBhbGFybSBvbiBldmVyeSBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3U2NhbkZpbmRpbmdzKFxuICBiZWZvcmU6IFBpY2s8UGx1Z2luU2NhblN1bW1hcnksICdmaW5kaW5ncycgfCAndHJ1bmNhdGVkJyB8ICdjcml0aWNhbCc+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYWZ0ZXI6IHJlYWRvbmx5IFBsdWdpblNjYW5GaW5kaW5nW10sXG4pOiBQbHVnaW5TY2FuRmluZGluZ1tdIHtcbiAgaWYgKCFiZWZvcmUpIHJldHVybiBbLi4uYWZ0ZXJdO1xuICBjb25zdCBrbm93biA9IG5ldyBTZXQoYmVmb3JlLmZpbmRpbmdzLm1hcChzY2FuRmluZGluZ0tleSkpO1xuICBjb25zdCBsaXN0ZWRDcml0aWNhbCA9IGJlZm9yZS5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpLmxlbmd0aDtcbiAgY29uc3QgY29tcGxldGUgPSB7XG4gICAgY3JpdGljYWw6ICFiZWZvcmUudHJ1bmNhdGVkIHx8IGxpc3RlZENyaXRpY2FsID49IGJlZm9yZS5jcml0aWNhbCxcbiAgICBoaWdoOiAhYmVmb3JlLnRydW5jYXRlZCxcbiAgfTtcbiAgcmV0dXJuIGFmdGVyLmZpbHRlcigoZikgPT4gY29tcGxldGVbZi5zZXZlcml0eV0gJiYgIWtub3duLmhhcyhzY2FuRmluZGluZ0tleShmKSkpO1xufVxuXG4vKiogRmluZGluZ3MgYSBmbGFnIC8gZ2F0ZSBtZXNzYWdlIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKiogTG9va3VwIC8gcmVzb2x1dGlvbiB3YXJuaW5nIGNvZGUgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fRkxBR0dFRF9XQVJOSU5HID0gJ1ZVTE5fRkxBR0dFRCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2A6IHRoZSBwbGF0Zm9ybSBmbG9vciDigJQgYSB2ZXJzaW9uIHdpdGggTU9SRSBnYXRlZFxuICogZmluZGluZ3MgKGZpeGFibGUsIG9yIEtFVi1saXN0ZWQsIGF0IG9yIGFib3ZlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCkgdGhhblxuICogdGhpcyBmYWlscyBpdHMgYnVpbGQgKGBQTFVHSU5fVlVMTl9HQVRFYCkgYW5kIGlzXG4gKiBmbGFnZ2VkIGJ5IHRoZSByZXNjYW4uIERlZmF1bHQgYDBgOyBgLTFgIGRpc2FibGVzIHRoZSBmbG9vciAoYW5kIHRoZSBmbGFnKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblZ1bG5NYXhGaW5kaW5ncygpOiBudW1iZXIge1xuICByZXR1cm4gZW52SW50KCdQTFVHSU5fVlVMTl9NQVhfRklORElOR1MnLCAwLCB7IG1pbjogLTEgfSk7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBzZXZlcml0eSB0aGUgZmxvb3IgZ2F0ZXMgb24g4oCUIHRoZSBwbHVnaW4gc2VydmljZSdzIGAtLWZhaWwtb25gLlxuICogT25seSBgY3JpdGljYWxgIGFuZCBgaGlnaGAgYXJlIHBvc3NpYmxlOiB0aG9zZSBhcmUgdGhlIHNldmVyaXRpZXMgYSBzY2FuXG4gKiBpdGVtaXplcyAoTWVkaXVtL0xvdyBhcmUgY291bnRlZCwgbmV2ZXIgbGlzdGVkKSwgYW5kIGEgZmxvb3IgY2FuIG9ubHkgZ2F0ZSBvblxuICogZmluZGluZ3MgaXQgY2FuIG5hbWUsIHdhaXZlIGFuZCByZXBvcnQuXG4gKi9cbmV4cG9ydCB0eXBlIFBsdWdpblZ1bG5GYWlsT24gPSAnY3JpdGljYWwnIHwgJ2hpZ2gnO1xuXG4vKipcbiAqIGBQTFVHSU5fVlVMTl9GQUlMX09OYCAoZGVmYXVsdCBgY3JpdGljYWxgKTogdGhlIHNldmVyaXR5IGF0IGFuZCBhYm92ZSB3aGljaCBhXG4gKiBmaXhhYmxlIChvciBLRVYtbGlzdGVkKSBmaW5kaW5nIGNvdW50cyBhZ2FpbnN0IGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgLlxuICogYGhpZ2hgIGdhdGVzIENyaXRpY2FsIEFORCBIaWdoLiBBbnkgb3RoZXIgdmFsdWUgcmVzb2x2ZXMgdG8gYGhpZ2hgLCB0aGVcbiAqIFNUUklDVEVSIHNldHRpbmc6IHRoZSBmYWlsdXJlIG1vZGUgb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBibG9ja3MgbW9yZVwiLFxuICogbmV2ZXIgXCJ0aGUgZ2F0ZSBibG9ja3MgbGVzc1wiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luVnVsbkZhaWxPbigpOiBQbHVnaW5WdWxuRmFpbE9uIHtcbiAgcmV0dXJuIGVudlN0cignUExVR0lOX1ZVTE5fRkFJTF9PTicsICdjcml0aWNhbCcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnY3JpdGljYWwnID8gJ2NyaXRpY2FsJyA6ICdoaWdoJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzZXZlcml0eSBpcyBhdCBvciBhYm92ZSB0aGUgZ2F0aW5nIHRocmVzaG9sZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdE9yQWJvdmVGYWlsT24oc2V2ZXJpdHk6IFBsdWdpblNjYW5GaW5kaW5nWydzZXZlcml0eSddLCBmYWlsT246IFBsdWdpblZ1bG5GYWlsT24gPSBwbHVnaW5WdWxuRmFpbE9uKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IGZhaWxPbiA9PT0gJ2hpZ2gnO1xufVxuXG4vKipcbiAqIFRoZSBzY2FubmVyJ3MgZml4YWJsZSBjb3VudCBhdCBvciBhYm92ZSB0aGUgdGhyZXNob2xkIOKAlCB3aGF0IHRoZSBmbG9vciByZWFkc1xuICogd2hlbiBhIHNjYW4gcmVjb3JkZWQgY291bnRzIGJ1dCBubyBmaW5kaW5ncyB0byBkZXJpdmUgaXQgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGVkRml4YWJsZUNvdW50KFxuICBjb3VudHM6IHsgdnVsbkNyaXRpY2FsRml4YWJsZTogbnVtYmVyIHwgbnVsbDsgdnVsbkhpZ2hGaXhhYmxlOiBudW1iZXIgfCBudWxsIH0sXG4gIGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSxcbik6IG51bWJlciB7XG4gIHJldHVybiAoY291bnRzLnZ1bG5Dcml0aWNhbEZpeGFibGUgPz8gMCkgKyAoZmFpbE9uID09PSAnaGlnaCcgPyBjb3VudHMudnVsbkhpZ2hGaXhhYmxlID8/IDAgOiAwKTtcbn1cblxuLyoqIGBDcml0aWNhbGAgLyBgQ3JpdGljYWwgb3IgSGlnaGAg4oCUIHRoZSBnYXRlZCBzZXZlcml0aWVzLCBmb3IgbWVzc2FnZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbE9uTGFiZWwoZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZhaWxPbiA9PT0gJ2NyaXRpY2FsJyA/ICdDcml0aWNhbCcgOiAnQ3JpdGljYWwgb3IgSGlnaCc7XG59XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCAoZGVmYXVsdCB0cnVlKTogYSBDcml0aWNhbCBDSVNBIGxpc3RzIGFzIGtub3duXG4gKiBleHBsb2l0ZWQgY291bnRzIGFnYWluc3QgdGhlIGZsb29yIGV2ZW4gd2hlbiBpdCBoYXMgTk8gZml4LiBPZmYsIEtFViBmaW5kaW5nc1xuICogYXJlIGdhdGVkIGV4YWN0bHkgbGlrZSBhbnkgb3RoZXIgQ3JpdGljYWwgKGZpeGFibGUgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuR2F0ZUtldigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudkJvb2woJ1BMVUdJTl9WVUxOX0dBVEVfS0VWJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZpbmRpbmcgY291bnRzIGFnYWluc3QgdGhlIGZsb29yOiBhIGZpeGFibGUgZmluZGluZyBhdCBvciBhYm92ZVxuICogYFBMVUdJTl9WVUxOX0ZBSUxfT05gIChkZWZhdWx0IENyaXRpY2FsKSwgb3Ig4oCUIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmBcbiAqIOKAlCBhIEtFVi1saXN0ZWQgb25lIGF0IG9yIGFib3ZlIGl0IHdpdGggb3Igd2l0aG91dCBhIGZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2F0ZWRGaW5kaW5nKFxuICBmOiBQaWNrPFBsdWdpblNjYW5GaW5kaW5nLCAnc2V2ZXJpdHknIHwgJ2ZpeGVkSW4nIHwgJ2tldic+LFxuICBrZXZHYXRlOiBib29sZWFuID0gcGx1Z2luVnVsbkdhdGVLZXYoKSxcbiAgZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdE9yQWJvdmVGYWlsT24oZi5zZXZlcml0eSwgZmFpbE9uKSAmJiAoZi5maXhlZEluLmxlbmd0aCA+IDAgfHwgKGtldkdhdGUgJiYgZi5rZXYgPT09IHRydWUpKTtcbn1cblxuLyoqXG4gKiBBIHNjb3BlZCwgRVhQSVJJTkcgZXhlbXB0aW9uIGZyb20gdGhlIHZ1bG5lcmFiaWxpdHkgZmxvb3IgZm9yIG9uZSBwbHVnaW4uXG4gKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2AgaXMgdGhlIG9ubHkgb3RoZXIgbGV2ZXIgYW5kIGl0IGlzIGZhciB0b28gYmx1bnQ6XG4gKiByYWlzaW5nIGl0IGFib3ZlIDAgZXhlbXB0cyBldmVyeSBwbHVnaW4gZnJvbSBldmVyeSBDcml0aWNhbC4gU29tZSBpbWFnZXNcbiAqIGdlbnVpbmVseSBjYW5ub3QgcmVhY2ggemVybyDigJQgYSBicm93c2VyLWJ1bmRsaW5nIHRlc3QgcnVubmVyIChhcnRpbGxlcnkgc2hpcHNcbiAqIENocm9taXVtIHRocm91Z2ggaXRzIG93biBAcGxheXdyaWdodC9icm93c2VyLWNocm9taXVtIGRlcGVuZGVuY3ksIHBsYXl3cmlnaHRcbiAqIGRvd25sb2FkcyBGaXJlZm94KSBpcyBhdCB1cHN0cmVhbSdzIGxhdGVzdCBhbmQgc3RpbGwgY2FycmllcyBmaXhhYmxlIGZpbmRpbmdzLFxuICogYmVjYXVzZSBicm93c2VycyBzaGlwIENWRSBmaXhlcyB3ZWVrbHkgd2hpbGUgcGlubmVkIGJ1aWxkcyBsYWcgYnkgZGVzaWduLlxuICogV2l0aG91dCBhIG5hcnJvdyBleGVtcHRpb24gdGhlIG9ubHkgb3B0aW9ucyBhcmUgXCJibG9jayB0aGUgcGx1Z2luIGZvcmV2ZXJcIiBvclxuICogXCJkaXNhYmxlIHRoZSBmbG9vciBmb3IgZXZlcnl0aGluZ1wiLlxuICpcbiAqIFRocmVlIHByb3BlcnRpZXMgbWFrZSB0aGlzIGFuIGV4ZW1wdGlvbiByYXRoZXIgdGhhbiBhIGhvbGUsIGFuZCBhbGwgdGhyZWUgYXJlXG4gKiBlbmZvcmNlZCBiZWxvdyByYXRoZXIgdGhhbiBkb2N1bWVudGVkIGFuZCBob3BlZCBmb3I6XG4gKlxuICogICBTQ09QRUQgICAgdG8gb25lIHBsdWdpbiAob3IsIGZsZWV0LXdpZGUsIHRvIG5hbWVkIGFkdmlzb3JpZXMgb25seSksIHRvXG4gKiAgICAgICAgICAgICBuYW1lZCBwYWNrYWdlcy9hZHZpc29yaWVzLCBBTkQgdG8gdGhlIHN5c3RlbSBvcmcuIEEgbmV3IENyaXRpY2FsXG4gKiAgICAgICAgICAgICBpbiBhbnl0aGluZyBub3QgbmFtZWQgc3RpbGwgZmFpbHMgdGhlIGdhdGUsIHNvIGEgd2FpdmVyIGNhbm5vdFxuICogICAgICAgICAgICAgZ3JvdyBzaWxlbnRseSBpbnRvIFwidGhpcyBwbHVnaW4gaXMgZXhlbXB0XCIuIFRoZSBvcmcgYm91bmRcbiAqICAgICAgICAgICAgIG1hdHRlcnMgYmVjYXVzZSBwbHVnaW4gbmFtZXMgYXJlIHVuaXF1ZSBwZXIgKG5hbWUsIHZlcnNpb24sXG4gKiAgICAgICAgICAgICBvcmdJZCkgYW5kIE5PVCBnbG9iYWxseTogd2l0aG91dCBpdCwgYW55IHRlbmFudCBjb3VsZCBpbmhlcml0IGFuXG4gKiAgICAgICAgICAgICBleGVtcHRpb24gYnkgbmFtaW5nIHRoZWlyIHBsdWdpbiBgYXJ0aWxsZXJ5YC5cbiAqICAgRVhQSVJJTkcgIGV2ZXJ5IGVudHJ5IGNhcnJpZXMgYSBkYXRlIGFuZCBzdG9wcyBhcHBseWluZyBhZnRlciBpdC4gQSB3YWl2ZXJcbiAqICAgICAgICAgICAgIG5vYm9keSByZXZpc2l0cyBiZWNvbWVzIHBlcm1hbmVudDsgdGhpcyBvbmUgbGFwc2VzIG9uIGl0cyBvd24gYW5kXG4gKiAgICAgICAgICAgICB0aGUgcGx1Z2luIHN0YXJ0cyBmYWlsaW5nIGFnYWluLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgcHJvbXB0LlxuICogICBWSVNJQkxFICAgd2hhdCB3YXMgd2FpdmVkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvIGl0IHJlYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICBtZXRyaWMsIHRoZSBhdWRpdCByZWNvcmQgYW5kIHRoZSBidWlsZCBtZXNzYWdlIGluc3RlYWQgb2ZcbiAqICAgICAgICAgICAgIHZhbmlzaGluZyBmcm9tIHRoZSBjb3VudC5cbiAqXG4gKiBGb3JtYXQg4oCUIGVudHJpZXMgYDtgLXNlcGFyYXRlZCwgZmllbGRzIGA6YC1zZXBhcmF0ZWQsIHRhcmdldHMgYCxgLXNlcGFyYXRlZC5cbiAqIEEgdGFyZ2V0IGlzIGEgcGFja2FnZSBuYW1lIChgY2hyb21pdW1gKSBvciBhbiBhZHZpc29yeSBpZCAoYEdPLTIwMjYtNjYxMmApLFxuICogbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaW5kaW5nJ3MgcGFja2FnZSBvciBpZCByZXNwZWN0aXZlbHk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPWFydGlsbGVyeToyMDI2LTEyLTMxOmNocm9taXVtLGNocm9tZTtwbGF5d3JpZ2h0OjIwMjYtMTItMzE6ZmlyZWZveFxuICpcbiAqIEZMRUVULVdJREUgKGAqYCBhcyB0aGUgcGx1Z2luKSBpcyBmb3Igb25lIGFkdmlzb3J5IHRoYXQgZXZlcnkgYnVuZGxlciBvZiBhXG4gKiB0b29sY2hhaW4gaW5oZXJpdHMg4oCUIGEgR28gc3RkbGliIENWRSByZWFjaGVzIGV2ZXJ5IHByZWJ1aWx0IEdvIGJpbmFyeSBhdCBvbmNlLFxuICogYW5kIGxpc3RpbmcgZWFjaCBwbHVnaW4gaGlkZXMgdGhhdCBpdCBpcyBvbmUgZGVjaXNpb24uIEl0IG1heSBuYW1lIEFEVklTT1JZXG4gKiBJRFMgT05MWTogYCo6MjAyNi0xMi0zMTpzdGRsaWJgIHdvdWxkIHdhaXZlIGV2ZXJ5IHByZXNlbnQgYW5kIGZ1dHVyZSBzdGRsaWJcbiAqIENyaXRpY2FsIGluIGV2ZXJ5IHBsdWdpbiwgaW5jbHVkaW5nIG9uZXMgYSByZWJ1aWxkIGNvdWxkIGNsZWFyLCBzbyBhIHBhY2thZ2VcbiAqIG5hbWUgdW5kZXIgYCpgIGlzIHJlamVjdGVkLiBgKmAgdGFrZXMgbm8gYEB2ZXJzaW9uYCAodmVyc2lvbnMgYXJlIHBlciBwbHVnaW4pXG4gKiBhbmQga2VlcHMgdGhlIHN5c3RlbS1vcmcgYm91bmQgYW5kIHRoZSBleHBpcnk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPSo6MjAyNi0xMi0zMTpHTy0yMDI2LTY2MTIsR08tMjAyNi02NjA0XG4gKlxuICogQSBtYWxmb3JtZWQgZW50cnkgaXMgRFJPUFBFRCwgbmV2ZXIgdHJlYXRlZCBhcyBhIHdpbGRjYXJkOiB0aGUgZmFpbHVyZSBtb2RlXG4gKiBvZiBhIHR5cG8gbXVzdCBiZSBcInRoZSBnYXRlIHN0aWxsIGJsb2Nrc1wiLCBub3QgXCJldmVyeXRoaW5nIGlzIHdhaXZlZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXIge1xuICAvKiogUGx1Z2luIG5hbWUgdGhlIHdhaXZlciBhcHBsaWVzIHRvIChleGFjdCBtYXRjaCksIG9yIHtAbGluayBXQUlWRV9BTExfUExVR0lOU30uICovXG4gIHBsdWdpbjogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdGhlIHdhaXZlciBpcyBsaW1pdGVkIHRvLCBvciBudWxsIGZvciBldmVyeSB2ZXJzaW9uLlxuICAgKlxuICAgKiBBIHdhaXZlciBpcyBhIGp1ZGdlbWVudCBhYm91dCBhIFNQRUNJRklDIGltYWdlIOKAlCBcInRoaXMgcmVsZWFzZSBvZiBhcnRpbGxlcnlcbiAgICogYnVuZGxlcyBhIENocm9taXVtIHdlIGNhbm5vdCBwYXRjaFwiLiBMZWZ0IHVucGlubmVkIGl0IHNpbGVudGx5IGNhcnJpZXMgdG9cbiAgICogZXZlcnkgZnV0dXJlIHZlcnNpb24sIGluY2x1ZGluZyBvbmVzIHdob3NlIGZpbmRpbmdzIG5vYm9keSBoYXMgbG9va2VkIGF0LFxuICAgKiB3aGljaCBpcyBob3cgYSBuYXJyb3cgZXhlbXB0aW9uIGJlY29tZXMgYSBzdGFuZGluZyBvbmUuXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAvKiogSW5jbHVzaXZlIGV4cGlyeSAoVVRDIGRhdGUpLiBBZnRlciBpdCB0aGUgZW50cnkgaGFzIG5vIGVmZmVjdC4gKi9cbiAgZXhwaXJlczogRGF0ZTtcbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgYW5kL29yIGFkdmlzb3J5IGlkcyB3aG9zZSBmaW5kaW5ncyBhcmUgZXhlbXB0LiBOZXZlciBlbXB0eSDigJRcbiAgICogc2VlIHBhcnNlVnVsbldhaXZlcnMuIEFkdmlzb3J5IGlkcyBvbmx5IHdoZW4gYHBsdWdpbmAgaXMgYCpgLlxuICAgKi9cbiAgcGFja2FnZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogVGhlIGBwbHVnaW5gIG9mIGEgZmxlZXQtd2lkZSB3YWl2ZXIuIEFkdmlzb3J5IGlkcyBvbmx5IOKAlCBzZWUgVnVsbldhaXZlci4gKi9cbmV4cG9ydCBjb25zdCBXQUlWRV9BTExfUExVR0lOUyA9ICcqJztcblxuLyoqXG4gKiBBbiBhZHZpc29yeSBpZCBhcyBzY2FubmVycyByZXBvcnQgaXQgKENWRSwgR0hTQSwgR28gdnVsbmRiLCBQeVBBLCBSdXN0U2VjKS5cbiAqIEFueXRoaW5nIGVsc2UgaXMgYSBwYWNrYWdlIG5hbWUsIHdoaWNoIGEgZmxlZXQtd2lkZSB3YWl2ZXIgbWF5IG5vdCB1c2UuXG4gKi9cbmNvbnN0IEFEVklTT1JZX0lEID0gL14oQ1ZFLVxcZHs0fS1cXGR7NCx9fEdIU0EoLVswLTlhLXpdezR9KXszfXxHTy1cXGR7NH0tXFxkezQsfXxQWVNFQy1cXGR7NH0tXFxkK3xSVVNUU0VDLVxcZHs0fS1cXGR7NCx9KSQvaTtcblxuLyoqIEEgZHJvcHBlZCBlbnRyeSBhbmQgd2h5LCBzbyB0aGUgb3BlcmF0b3IgY2FuIGJlIHRvbGQgaW5zdGVhZCBvZiBndWVzc2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbldhaXZlclByb2JsZW0ge1xuICBlbnRyeTogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbn1cblxuLyoqIFBhcnNlZCB3YWl2ZXJzIHBsdXMgdGhlIGVudHJpZXMgdGhhdCB3ZXJlIHJlamVjdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyUGFyc2Uge1xuICB3YWl2ZXJzOiBWdWxuV2FpdmVyW107XG4gIHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdO1xufVxuXG4vKipcbiAqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYCwgUkVQT1JUSU5HIHdoYXQgd2FzIGRyb3BwZWQuXG4gKlxuICogRHJvcHBpbmcgYSBtYWxmb3JtZWQgZW50cnkgaXMgdGhlIHNhZmUgZGlyZWN0aW9uIOKAlCBhIHR5cG8gbXVzdCBub3QgYmVjb21lIGFcbiAqIHdpbGRjYXJkIOKAlCBidXQgc2lsZW50bHkgZHJvcHBpbmcgaXQgaXMgYSB1c2FiaWxpdHkgdHJhcDogdGhlIG9wZXJhdG9yIHNldHMgYVxuICogd2FpdmVyLCB0aGUgZ2F0ZSBrZWVwcyBibG9ja2luZywgYW5kIG5vdGhpbmcgYW55d2hlcmUgc2F5cyB3aHkuIENhbGxlcnMgdGhhdFxuICogY2FuIHN1cmZhY2UgaXQgKHNlcnZpY2UgYm9vdCkgdXNlIHRoaXM7IGBwYXJzZVZ1bG5XYWl2ZXJzYCBpcyB0aGUgc2hvcnRoYW5kXG4gKiBmb3IgdGhlIG9uZXMgdGhhdCBjYW5ub3QuXG4gKlxuICogRW50cnkgZ3JhbW1hcjogYDxwbHVnaW4+W0A8dmVyc2lvbj5dOjxZWVlZLU1NLUREPjo8cGtnPlssPHBrZz7igKZdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudi5QTFVHSU5fVlVMTl9XQUlWRVJTKTogVnVsbldhaXZlclBhcnNlIHtcbiAgY29uc3Qgd2FpdmVyczogVnVsbldhaXZlcltdID0gW107XG4gIGNvbnN0IHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdID0gW107XG4gIGlmICghcmF3Py50cmltKCkpIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG4gIGNvbnN0IHJlamVjdCA9IChlbnRyeTogc3RyaW5nLCByZWFzb246IHN0cmluZykgPT4geyBwcm9ibGVtcy5wdXNoKHsgZW50cnk6IGVudHJ5LnRyaW0oKSwgcmVhc29uIH0pOyB9O1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmF3LnNwbGl0KCc7JykpIHtcbiAgICBpZiAoIWVudHJ5LnRyaW0oKSkgY29udGludWU7XG4gICAgY29uc3QgW3RhcmdldCwgZXhwaXJlcywgcGFja2FnZXNdID0gZW50cnkuc3BsaXQoJzonKS5tYXAoKGYpID0+IGY/LnRyaW0oKSA/PyAnJyk7XG4gICAgLy8gRXZlcnkgZmllbGQgaXMgUkVRVUlSRUQuIEFuIGVudHJ5IG1pc3NpbmcgaXRzIHBhY2thZ2UgbGlzdCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSByZWFkIGFzIFwid2FpdmUgdGhpcyBwbHVnaW4gZW50aXJlbHlcIiwgd2hpY2ggaXMgdGhlIG9uZSB0aGluZ1xuICAgIC8vIHRoaXMgbXVzdCBub3QgYmUgYWJsZSB0byBleHByZXNzLlxuICAgIGlmICghdGFyZ2V0IHx8ICFleHBpcmVzIHx8ICFwYWNrYWdlcykge1xuICAgICAgcmVqZWN0KGVudHJ5LCAnZXhwZWN0ZWQgPHBsdWdpbj5bQDx2ZXJzaW9uPl06PFlZWVktTU0tREQ+OjxwYWNrYWdlPlssPHBhY2thZ2U+4oCmXScpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gdGFyZ2V0LmluZGV4T2YoJ0AnKTtcbiAgICBjb25zdCBwbHVnaW4gPSBhdCA9PT0gLTEgPyB0YXJnZXQgOiB0YXJnZXQuc2xpY2UoMCwgYXQpLnRyaW0oKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXQgPT09IC0xID8gbnVsbCA6IHRhcmdldC5zbGljZShhdCArIDEpLnRyaW0oKTtcbiAgICBpZiAoIXBsdWdpbikgeyByZWplY3QoZW50cnksICdubyBwbHVnaW4gbmFtZScpOyBjb250aW51ZTsgfVxuICAgIGlmIChhdCAhPT0gLTEgJiYgIXZlcnNpb24pIHsgcmVqZWN0KGVudHJ5LCBcIidAJyB3aXRoIG5vIHZlcnNpb24g4oCUIG9taXQgaXQgdG8gY292ZXIgZXZlcnkgdmVyc2lvblwiKTsgY29udGludWU7IH1cbiAgICBpZiAocGx1Z2luID09PSBXQUlWRV9BTExfUExVR0lOUyAmJiB2ZXJzaW9uICE9PSBudWxsKSB7IHJlamVjdChlbnRyeSwgXCInKicgY292ZXJzIGV2ZXJ5IHBsdWdpbiwgc28gaXQgY2Fubm90IHBpbiBhIHZlcnNpb25cIik7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCEvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChleHBpcmVzKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBZWVlZLU1NLUREYCk7IGNvbnRpbnVlOyB9XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKGAke2V4cGlyZXN9VDIzOjU5OjU5Ljk5OVpgKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHdoZW4uZ2V0VGltZSgpKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBhIHJlYWwgZGF0ZWApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IG5hbWVzID0gcGFja2FnZXMuc3BsaXQoJywnKS5tYXAoKG4pID0+IG4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkgeyByZWplY3QoZW50cnksICdubyBwYWNrYWdlIG5hbWVzJyk7IGNvbnRpbnVlOyB9XG4gICAgaWYgKHBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5hbWVzLmZpbHRlcigobikgPT4gIUFEVklTT1JZX0lELnRlc3QobikpO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlamVjdChlbnRyeSwgYCcqJyB0YWtlcyBhZHZpc29yeSBpZHMgb25seSAoQ1ZFLeKApiwgR0hTQS3igKYsIEdPLeKApik7ICcke3BhY2thZ2VOYW1lcy5qb2luKCcsICcpfScgd291bGQgd2FpdmUgYSBwYWNrYWdlIGluIGV2ZXJ5IHBsdWdpbmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FpdmVycy5wdXNoKHsgcGx1Z2luLCB2ZXJzaW9uLCBleHBpcmVzOiB3aGVuLCBwYWNrYWdlczogbmFtZXMgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FpdmVycywgcHJvYmxlbXMgfTtcbn1cblxuLyoqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYC4gTWFsZm9ybWVkIG9yIGluY29tcGxldGUgZW50cmllcyBhcmUgZHJvcHBlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZ1bG5XYWl2ZXJzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZVTE5fV0FJVkVSUyk6IFZ1bG5XYWl2ZXJbXSB7XG4gIHJldHVybiBwYXJzZVZ1bG5XYWl2ZXJzVmVyYm9zZShyYXcpLndhaXZlcnM7XG59XG5cbi8qKiBXaGF0IGEgd2FpdmVyIHJlbW92ZWQgZnJvbSB0aGUgY291bnQsIGFuZCB3aGF0IHN0aWxsIGNvdW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdmVyT3V0Y29tZSB7XG4gIC8qKiBGaW5kaW5ncyB0aGUgZmxvb3Igc3RpbGwgY291bnRzLiAqL1xuICBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogRmluZGluZ3MgYW4gdW5leHBpcmVkIHdhaXZlciBleGVtcHRlZCAoZW1wdHkgd2hlbiBub25lIGFwcGxpZWQpLiAqL1xuICB3YWl2ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW107XG4gIC8qKiBUaGUgZW50cmllcyB0aGF0IGV4ZW1wdGVkIGF0IGxlYXN0IG9uZSBmaW5kaW5nIOKAlCB3aGF0IFwidGhpcyB3YWl2ZXIgaXMgc3RpbGwgZG9pbmcgc29tZXRoaW5nXCIgaXMgbWVhc3VyZWQgYnkuICovXG4gIG1hdGNoZWQ6IFZ1bG5XYWl2ZXJbXTtcbn1cblxuLyoqIE9uZSB3YWl2ZXIgZW50cnkncyBpZGVudGl0eTogdGhlIHBsdWdpbiBpdCBuYW1lcyAod2l0aCBpdHMgcGluKSBhbmQgaXRzIHRhcmdldHMuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbldhaXZlckxhYmVscyh3OiBQaWNrPFZ1bG5XYWl2ZXIsICdwbHVnaW4nIHwgJ3ZlcnNpb24nIHwgJ3BhY2thZ2VzJz4pOiB7IHBsdWdpbjogc3RyaW5nOyB0YXJnZXRzOiBzdHJpbmcgfSB7XG4gIHJldHVybiB7IHBsdWdpbjogdy52ZXJzaW9uID8gYCR7dy5wbHVnaW59QCR7dy52ZXJzaW9ufWAgOiB3LnBsdWdpbiwgdGFyZ2V0czogdy5wYWNrYWdlcy5qb2luKCcsJykgfTtcbn1cblxuLyoqXG4gKiBTcGxpdCBmaW5kaW5ncyBpbnRvIHdoYXQgc3RpbGwgY291bnRzIGFuZCB3aGF0IGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0cy5cbiAqXG4gKiBNYXRjaGluZyBpcyBvbiB0aGUgcGFja2FnZSBuYW1lIG9yIGFkdmlzb3J5IGlkIGEgd2FpdmVyIG5hbWVzLFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5LCBhbmQgb25seSBmb3IgZmluZGluZ3MgdGhhdCBhcmUgR0FURURcbiAqICh7QGxpbmsgaXNHYXRlZEZpbmRpbmd9KSDigJQgYW4gdW5nYXRlZCBmaW5kaW5nIG5ldmVyIGNvdW50ZWQgdG93YXJkIHRoZSBmbG9vcixcbiAqIHNvIFwid2FpdmluZ1wiIGl0IHdvdWxkIG92ZXJzdGF0ZSB3aGF0IHRoZSB3YWl2ZXIgZG9lcy5cbiAqXG4gKiBBIEtFVi1saXN0ZWQgZmluZGluZyBpcyBleGVtcHRlZCBieSBhbiBBRFZJU09SWS1JRCB0YXJnZXQgb25seSwgbmV2ZXIgYnkgYVxuICogcGFja2FnZSBuYW1lLiBgYXJ0aWxsZXJ5OuKApjpjaHJvbWl1bWAgaXMgYSBqdWRnZW1lbnQgYWJvdXQgQ2hyb21pdW0ncyBvcmRpbmFyeVxuICogY2h1cm47IGl0IHdhcyBub3Qgd3JpdHRlbiBhYm91dCwgYW5kIG11c3Qgbm90IHNpbGVudGx5IGNvdmVyLCB0aGUgb25lXG4gKiBDaHJvbWl1bSBDVkUgdGhhdCBpcyBiZWluZyBleHBsb2l0ZWQgdG9kYXkuIE5hbWluZyB0aGF0IENWRSBpcyB0aGUgZGVsaWJlcmF0ZVxuICogYWN0IGFuIGV4ZW1wdGlvbiBmb3IgaXQgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZ1bG5XYWl2ZXJzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLFxuICB3YWl2ZXJzOiByZWFkb25seSBWdWxuV2FpdmVyW10gPSBwYXJzZVZ1bG5XYWl2ZXJzKCksXG4gIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCksXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwbHVnaW5WZXJzaW9uPzogc3RyaW5nLFxuKTogV2FpdmVyT3V0Y29tZSB7XG4gIC8vIFNZU1RFTSBPUkcgT05MWS4gUGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLCBvcmdJZCksIE5PVFxuICAvLyBnbG9iYWxseSDigJQgYW55IHRlbmFudCBjYW4gY3JlYXRlIGEgcGx1Z2luIGNhbGxlZCBgYXJ0aWxsZXJ5YC4gTWF0Y2hpbmcgb25cbiAgLy8gdGhlIG5hbWUgYWxvbmUgd291bGQgaGFuZCBldmVyeSBvbmUgb2YgdGhlbSB0aGUgb3BlcmF0b3IncyBleGVtcHRpb24sIHNvIGFcbiAgLy8gdGVuYW50IGNvdWxkIGluaGVyaXQgYSB3YWl2ZXIgc2ltcGx5IGJ5IGNob29zaW5nIHRoZSBuYW1lLCBhbmQgc2hpcCBhblxuICAvLyBpbWFnZSB3aG9zZSBDcml0aWNhbHMgdGhlIGdhdGUgdGhlbiB3YXZlZCB0aHJvdWdoLiBUaGUgd2FpdmVycyBleGlzdCBmb3IgdGhlXG4gIC8vIE9mZmljaWFsIGNhdGFsb2cgdGhlIG9wZXJhdG9yIGN1cmF0ZXMsIHdoaWNoIGxpdmVzIGluIHRoZSBzeXN0ZW0gb3JnOyBhXG4gIC8vIGNhbGxlciB0aGF0IGNhbm5vdCBzYXkgd2hpY2ggb3JnIHRoaXMgYnVpbGQgYmVsb25ncyB0byBnZXRzIG5vIHdhaXZlci5cbiAgaWYgKG9yZ0lkID09PSB1bmRlZmluZWQgfHwgb3JnSWQudG9Mb3dlckNhc2UoKSAhPT0gU1lTVEVNX09SR19JRCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3QgYWN0aXZlID0gd2FpdmVycy5maWx0ZXIoKHcpID0+ICh3LnBsdWdpbiA9PT0gcGx1Z2luTmFtZSB8fCB3LnBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpXG4gICAgJiYgdy5leHBpcmVzLmdldFRpbWUoKSA+PSBub3cuZ2V0VGltZSgpXG4gICAgLy8gQSB2ZXJzaW9uLXBpbm5lZCB3YWl2ZXIgY292ZXJzIHRoYXQgdmVyc2lvbiBvbmx5LiBBbiB1bnBpbm5lZCBvbmUgY292ZXJzXG4gICAgLy8gZXZlcnkgdmVyc2lvbiwgd2hpY2ggaXMgd2h5IHRoZSBwaW4gaXMgd29ydGggd3JpdGluZy5cbiAgICAmJiAody52ZXJzaW9uID09PSBudWxsIHx8IHcudmVyc2lvbiA9PT0gcGx1Z2luVmVyc2lvbikpO1xuICBpZiAoYWN0aXZlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3Qga2V2R2F0ZSA9IHBsdWdpblZ1bG5HYXRlS2V2KCk7XG4gIGNvbnN0IHRhcmdldHMgPSBhY3RpdmUubWFwKCh3KSA9PiAoeyB3LCBuYW1lczogbmV3IFNldCh3LnBhY2thZ2VzLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKSkgfSkpO1xuICBjb25zdCBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdID0gW107XG4gIGNvbnN0IHdhaXZlZDogUGx1Z2luU2NhbkZpbmRpbmdbXSA9IFtdO1xuICBjb25zdCBtYXRjaGVkID0gbmV3IFNldDxWdWxuV2FpdmVyPigpO1xuICBmb3IgKGNvbnN0IGYgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBpZCA9IGYuaWQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwa2cgPSBmLnBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYnkgPSBpc0dhdGVkRmluZGluZyhmLCBrZXZHYXRlKVxuICAgICAgPyB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC5uYW1lcy5oYXMoaWQpIHx8IChmLmtldiAhPT0gdHJ1ZSAmJiB0Lm5hbWVzLmhhcyhwa2cpKSlcbiAgICAgIDogW107XG4gICAgaWYgKGJ5Lmxlbmd0aCA9PT0gMCkgeyBjb3VudGVkLnB1c2goZik7IGNvbnRpbnVlOyB9XG4gICAgd2FpdmVkLnB1c2goZik7XG4gICAgZm9yIChjb25zdCB0IG9mIGJ5KSBtYXRjaGVkLmFkZCh0LncpO1xuICB9XG4gIHJldHVybiB7IGNvdW50ZWQsIHdhaXZlZCwgbWF0Y2hlZDogWy4uLm1hdGNoZWRdIH07XG59XG5cbi8qKiBXaGV0aGVyIGBnYXRlZENyaXRpY2FsYCBicmVha3MgdGhlIHBsYXRmb3JtIGZsb29yIChuZXZlciwgd2hlbiBkaXNhYmxlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkc1Z1bG5GbG9vcihnYXRlZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWF4OiBudW1iZXIgPSBwbHVnaW5WdWxuTWF4RmluZGluZ3MoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF4ID49IDAgJiYgKGdhdGVkID8/IDApID4gbWF4O1xufVxuXG4vKiogYHBrZ0AxLjIuMyDihpIgMS4yLjRgIC8gYHBrZ0AxLjIuMyAobm8gZml4KWAuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaXgoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ3BhY2thZ2VOYW1lJyB8ICdwYWNrYWdlVmVyc2lvbicgfCAnZml4ZWRJbic+KTogc3RyaW5nIHtcbiAgY29uc3QgYXQgPSBgJHtmLnBhY2thZ2VOYW1lfSR7Zi5wYWNrYWdlVmVyc2lvbiA/IGBAJHtmLnBhY2thZ2VWZXJzaW9ufWAgOiAnJ31gO1xuICByZXR1cm4gZi5maXhlZEluLmxlbmd0aCA+IDAgPyBgJHthdH0g4oaSICR7Zi5maXhlZEluLmpvaW4oJywgJyl9YCA6IGAke2F0fSAobm8gZml4KWA7XG59XG5cbi8qKiBgQ1ZFLTEgKG9wZW5zc2xAMy4wLjEg4oaSIDMuMC4yKTsgQ1ZFLTIgKOKApilgIGZvciB0aGUgZmlyc3QgYGxpbWl0YCBmaW5kaW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLCBsaW1pdCA9IDUpOiBzdHJpbmcge1xuICBjb25zdCBzaG93biA9IGZpbmRpbmdzLnNsaWNlKDAsIGxpbWl0KS5tYXAoKGYpID0+IGAke2YuaWR9ICgke2Rlc2NyaWJlRml4KGYpfSlgKS5qb2luKCc7ICcpO1xuICBjb25zdCBtb3JlID0gZmluZGluZ3MubGVuZ3RoID4gbGltaXQgPyBgOyArJHtmaW5kaW5ncy5sZW5ndGggLSBsaW1pdH0gbW9yZWAgOiAnJztcbiAgcmV0dXJuIGAke3Nob3dufSR7bW9yZX1gO1xufVxuXG4vKipcbiAqIGBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3NgLCBvciDigJQgd2hlbiBhbnkgZ2F0ZWQgZmluZGluZyBpcyBLRVYtbGlzdGVkLCBzb1xuICogXCJmaXhhYmxlXCIgYWxvbmUgd291bGQgbWlzZGVzY3JpYmUgdGhlIGNvdW50IOKAlCBgTiBDcml0aWNhbCBmaW5kaW5ncyB0aGF0IGFyZVxuICogZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKE0gb24gQ0lTQSBLRVYpYC5cbiAqL1xuZnVuY3Rpb24gZ2F0ZWRQaHJhc2UoZmxhZzogUGljazxQbHVnaW5TY2FuRmxhZywgJ2dhdGVkJyB8ICdrZXYnIHwgJ2ZhaWxPbic+KTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGZsYWcuZ2F0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgY29uc3QgbGFiZWwgPSBmYWlsT25MYWJlbChmbGFnLmZhaWxPbiA/PyAnY3JpdGljYWwnKTtcbiAgcmV0dXJuIGZsYWcua2V2XG4gICAgPyBgJHtmbGFnLmdhdGVkfSAke2xhYmVsfSBmaW5kaW5nJHtzfSB0aGF0ICR7ZmxhZy5nYXRlZCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKCR7ZmxhZy5rZXZ9IG9uIENJU0EgS0VWKWBcbiAgICA6IGAke2ZsYWcuZ2F0ZWR9IGZpeGFibGUgJHtsYWJlbH0gZmluZGluZyR7c31gO1xufVxuXG4vKiogVGhlIHdhcm5pbmcgdGV4dCBmb3IgYSBmbGFnZ2VkIHZlcnNpb246IGB4QHYgaGFzIE4gZml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncyDigJQgcmVidWlsZCBvciB1cGdyYWRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuRmxhZ2dlZE1lc3NhZ2UocmVmOiBzdHJpbmcsIGZsYWc6IFBpY2s8UGx1Z2luU2NhbkZsYWcsICdnYXRlZCcgfCAna2V2JyB8ICdmYWlsT24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyZWZ9IGhhcyAke2dhdGVkUGhyYXNlKGZsYWcpfSDigJQgcmVidWlsZCBvciB1cGdyYWRlYDtcbn1cblxuLyoqIEEgYFZVTE5fRkxBR0dFRGAgbG9va3VwIHdhcm5pbmcgKHRoZSBsb29rdXAgZW52ZWxvcGUncyBgd2FybmluZ3NbXWAgZW50cnkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICBjb2RlOiB0eXBlb2YgVlVMTl9GTEFHR0VEX1dBUk5JTkc7XG4gIC8qKiBgY3JpdGljYWxgIHdoZW4gYSBnYXRlZCBmaW5kaW5nIGlzIG9uIENJU0EgS0VWLCBlbHNlIGBlcnJvcmAgKGEgZmxhZyBuZXZlciByZWZ1c2VzIGFueXRoaW5nKS4gKi9cbiAgc2V2ZXJpdHk6ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuICBwbHVnaW46IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogVGhlIGZsYWcncyBnYXRlZCBjb3VudCAoc2VlIHtAbGluayBQbHVnaW5TY2FuRmxhZy5nYXRlZH0pLiAqL1xuICBnYXRlZDogbnVtYmVyO1xuICBoaWdoOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFRvcCBmaXhhYmxlIGZpbmRpbmdzIHdpdGggdGhlaXIgZml4ZWQgdmVyc2lvbnMuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKiogQnVpbGQgdGhlIGBWVUxOX0ZMQUdHRURgIHdhcm5pbmcgZm9yIGBwbHVnaW5AdmVyc2lvbmAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRXYXJuaW5nKHBsdWdpbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZsYWc6IFBsdWdpblNjYW5GbGFnKTogVnVsbkZsYWdnZWRXYXJuaW5nIHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBWVUxOX0ZMQUdHRURfV0FSTklORyxcbiAgICBzZXZlcml0eTogZmxhZy5rZXYgPyAnY3JpdGljYWwnIDogJ2Vycm9yJyxcbiAgICBwbHVnaW4sXG4gICAgdmVyc2lvbixcbiAgICBnYXRlZDogZmxhZy5nYXRlZCxcbiAgICBoaWdoOiBmbGFnLmhpZ2gsXG4gICAgbWVzc2FnZTogdnVsbkZsYWdnZWRNZXNzYWdlKGAke3BsdWdpbn1AJHt2ZXJzaW9ufWAsIGZsYWcpLFxuICAgIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLnNsaWNlKDAsIFNDQU5fRkxBR19UT1BfRklORElOR1MpLFxuICB9O1xufVxuXG4vKiogTmFycm93IGFuIHVua25vd24gYHNjYW5fZmxhZ2AganNvbmIgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTY2FuRmxhZyh2YWx1ZTogdW5rbm93bik6IFBsdWdpblNjYW5GbGFnIHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHR5cGVvZiB2LmdhdGVkICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5oaWdoICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheSh2LmZpbmRpbmdzKSA/ICh2LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10pLmZpbHRlcigoZikgPT4gZiAmJiB0eXBlb2YgZi5pZCA9PT0gJ3N0cmluZycpIDogW107XG4gIHJldHVybiB7XG4gICAgZ2F0ZWQ6IHYuZ2F0ZWQsXG4gICAgaGlnaDogdi5oaWdoLFxuICAgIG1heEZpbmRpbmdzOiB0eXBlb2Ygdi5tYXhGaW5kaW5ncyA9PT0gJ251bWJlcicgPyB2Lm1heEZpbmRpbmdzIDogMCxcbiAgICAuLi4odHlwZW9mIHYua2V2ID09PSAnbnVtYmVyJyAmJiB2LmtldiA+IDAgPyB7IGtldjogdi5rZXYgfSA6IHt9KSxcbiAgICAuLi4odi5mYWlsT24gPT09ICdoaWdoJyA/IHsgZmFpbE9uOiAnaGlnaCcgYXMgY29uc3QgfSA6IHt9KSxcbiAgICBmaW5kaW5nczogZmluZGluZ3MubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSksXG4gIH07XG59XG4iXX0=