@pipeline-builder/api-server 4.4.1 → 4.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/metrics.d.ts +13 -6
- package/lib/api/metrics.js +92 -12
- package/lib/api/write-pin.js +29 -5
- package/package.json +4 -4
package/lib/api/metrics.d.ts
CHANGED
|
@@ -45,12 +45,19 @@ export declare function createMetricHelpers(registry: Registry | (() => Registry
|
|
|
45
45
|
/**
|
|
46
46
|
* Increment a business counter, creating it on first use.
|
|
47
47
|
*
|
|
48
|
+
* Every example below is a call that EXISTS, with the labels it really passes. That is
|
|
49
|
+
* deliberate: an invented example reads as an inventory of what the system measures, and
|
|
50
|
+
* a metrics survey later counted three names from this block — `pipelines_generated_total`,
|
|
51
|
+
* `quota_threshold_crossed_total`, `compliance_violations_found_total` — as live metrics
|
|
52
|
+
* missing a dashboard panel. Nothing emitted any of them. Illustrative names in a docstring
|
|
53
|
+
* about metric naming are indistinguishable from real ones, so there are none here.
|
|
54
|
+
*
|
|
48
55
|
* @example
|
|
49
56
|
* ```typescript
|
|
50
|
-
* incCounter('
|
|
51
|
-
* incCounter('
|
|
52
|
-
* incCounter('
|
|
53
|
-
* incCounter('
|
|
57
|
+
* incCounter('plugin_builds_total', { status: 'success', org_id: orgId });
|
|
58
|
+
* incCounter('compliance_scans_total', { outcome: 'started' });
|
|
59
|
+
* incCounter('plugin_vuln_findings_total', { trigger, severity }, count);
|
|
60
|
+
* incCounter('ai_tokens_total', { route: 'agent', kind: 'input' }, inputTokens);
|
|
54
61
|
* ```
|
|
55
62
|
*/
|
|
56
63
|
export declare function incCounter(name: string, labels?: Record<string, string>, value?: number): void;
|
|
@@ -60,8 +67,8 @@ export declare function incCounter(name: string, labels?: Record<string, string>
|
|
|
60
67
|
*
|
|
61
68
|
* @example
|
|
62
69
|
* ```typescript
|
|
63
|
-
* observe('ai_generation_duration_seconds', {
|
|
64
|
-
* observe('plugin_build_duration_seconds', {
|
|
70
|
+
* observe('ai_generation_duration_seconds', { route, provider: providerLabel }, durationSec);
|
|
71
|
+
* observe('plugin_build_duration_seconds', { org_id: orgId }, durationSec);
|
|
65
72
|
* ```
|
|
66
73
|
*/
|
|
67
74
|
export declare function observe(name: string, labels: Record<string, string>, value: number): void;
|
package/lib/api/metrics.js
CHANGED
|
@@ -155,6 +155,77 @@ export function metricsHandler() {
|
|
|
155
155
|
res.end(await register.metrics());
|
|
156
156
|
};
|
|
157
157
|
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// Business / domain metrics
|
|
160
|
+
//
|
|
161
|
+
// Services should emit counters for the things operators actually care about
|
|
162
|
+
// (pipelines generated, plugin builds completed, compliance violations,
|
|
163
|
+
// AI tokens consumed) — not just HTTP traffic. The helpers below register
|
|
164
|
+
// counters lazily on the shared registry so multiple services can call
|
|
165
|
+
// `incCounter('plugin_builds_total', { status: 'completed' })` without
|
|
166
|
+
// worrying about double-registration.
|
|
167
|
+
//
|
|
168
|
+
// Naming convention: `<domain>_<noun>_total` for counters, `_seconds` for
|
|
169
|
+
// histograms — matches Prometheus best-practice.
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* Bucket distributions for histograms whose observations are nowhere near the
|
|
173
|
+
* sub-second-to-minutes default.
|
|
174
|
+
*
|
|
175
|
+
* THIS TABLE EXISTS BECAUSE THE DEFAULT SILENTLY BREAKS ALERTS. The default set
|
|
176
|
+
* below ends at a 300-second bucket, and `histogram_quantile` cannot interpolate
|
|
177
|
+
* past the last FINITE boundary — everything above it lands in `+Inf` and the
|
|
178
|
+
* quantile reads back as 300 forever. An alert of the form `> 300` on such a
|
|
179
|
+
* histogram can therefore never fire, and a p90 panel flat-lines at five
|
|
180
|
+
* minutes however bad things get. Nothing errors, nothing is missing from the
|
|
181
|
+
* scrape, and the dashboard looks healthy: the only symptom is an alert that
|
|
182
|
+
* stays quiet through an outage. `support_first_response_seconds` measures hours
|
|
183
|
+
* to days and had a threshold of twelve hours sitting above a ceiling of five
|
|
184
|
+
* minutes.
|
|
185
|
+
*
|
|
186
|
+
* So a histogram whose natural range is minutes-to-days declares its buckets
|
|
187
|
+
* here, and ALERT THRESHOLDS ARE PUT ON BOUNDARIES: a threshold inside a wide
|
|
188
|
+
* bucket is served by linear interpolation across that bucket, which is a guess,
|
|
189
|
+
* while a threshold ON a boundary is exact. For support that means 6h (the alert)
|
|
190
|
+
* and 8h (the sold target) are both boundaries, 24h is the operational guard
|
|
191
|
+
* from the standard/priority rule, and 96h covers the longest legitimate wait a
|
|
192
|
+
* business-day target allows — a priority case raised at 17:01 on a Friday.
|
|
193
|
+
*
|
|
194
|
+
* Add a metric here when its observations can exceed five minutes. The table is
|
|
195
|
+
* read on FIRST USE of each name by `createMetricHelpers`, so both registries
|
|
196
|
+
* (api-server's and platform's own) get the same distribution, which is the
|
|
197
|
+
* drift the factory exists to prevent.
|
|
198
|
+
*/
|
|
199
|
+
const HISTOGRAM_BUCKETS = {
|
|
200
|
+
// 15m, 1h, 2h, 4h, 6h, 8h, 12h, 24h, 48h, 96h.
|
|
201
|
+
support_first_response_seconds: [900, 3600, 7200, 14400, 21600, 28800, 43200, 86400, 172800, 345600],
|
|
202
|
+
// Submission-to-decision latency is a human review queue: hours to days.
|
|
203
|
+
// 15m, 1h, 4h, 12h, 1d, 2d, 4d, 7d, 14d.
|
|
204
|
+
ecosystem_decision_latency_seconds: [900, 3600, 14400, 43200, 86400, 172800, 345600, 604800, 1209600],
|
|
205
|
+
// Queue wait. `PluginQueueProcessingSlow` asserts p95 > 300, which the default
|
|
206
|
+
// ceiling of 300 made unfireable; 300 is a boundary here so the comparison is
|
|
207
|
+
// exact rather than interpolated.
|
|
208
|
+
plugin_job_wait_seconds: [1, 5, 15, 30, 60, 120, 300, 600, 1800, 3600],
|
|
209
|
+
// A container build. Minutes normally, far longer for a cold base image.
|
|
210
|
+
plugin_build_duration_seconds: [10, 30, 60, 120, 300, 600, 1200, 1800, 3600],
|
|
211
|
+
// A full image scan, which routinely passes five minutes on a large image.
|
|
212
|
+
plugin_vuln_scan_duration_seconds: [1, 5, 15, 30, 60, 120, 300, 600, 1200],
|
|
213
|
+
// Time from an incident being raised to a human acknowledging it. The default
|
|
214
|
+
// buckets end at 300s, and `histogram_quantile` cannot interpolate past the
|
|
215
|
+
// last finite boundary — so with them, any threshold above five minutes could
|
|
216
|
+
// never fire, which is every threshold worth setting here. Boundaries at 1m,
|
|
217
|
+
// 2m, 5m, 10m, 15m, 30m, 1h, 2h, 4h: 15m is exact because that is the
|
|
218
|
+
// escalation delay the alert compares against, and the range reaches 4h so a
|
|
219
|
+
// page nobody ever picked up is still counted rather than clipped.
|
|
220
|
+
oncall_page_ack_seconds: [60, 120, 300, 600, 900, 1800, 3600, 7200, 14400],
|
|
221
|
+
// CSAT, 1-5. Not a duration at all, and listed here for the same reason as
|
|
222
|
+
// the others: the default buckets are sub-second, so every rating would land
|
|
223
|
+
// in the same bucket and the quantile would be meaningless. One boundary per
|
|
224
|
+
// possible score makes `_sum / _count` an exact average and each bucket a
|
|
225
|
+
// real count. It rides the histogram rather than a counter-per-score so the
|
|
226
|
+
// average needs no PromQL arithmetic over five series.
|
|
227
|
+
support_satisfaction: [1, 2, 3, 4, 5],
|
|
228
|
+
};
|
|
158
229
|
/**
|
|
159
230
|
* Build `incCounter` / `observe` / `setGauge` over a caller-supplied registry.
|
|
160
231
|
*
|
|
@@ -197,10 +268,12 @@ export function createMetricHelpers(registry) {
|
|
|
197
268
|
name,
|
|
198
269
|
help: humanizeName(name),
|
|
199
270
|
labelNames: Object.keys(labels),
|
|
200
|
-
// Default buckets target sub-second through several-minute
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
|
|
271
|
+
// Default buckets target sub-second through several-minute
|
|
272
|
+
// observations. Anything that can exceed five minutes MUST declare its
|
|
273
|
+
// own distribution in `HISTOGRAM_BUCKETS` above — past the last finite
|
|
274
|
+
// boundary a quantile reads back as that boundary, so a threshold
|
|
275
|
+
// beyond it never fires.
|
|
276
|
+
buckets: [...(HISTOGRAM_BUCKETS[name] ?? [0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60, 120, 300])],
|
|
204
277
|
registers: [registryOf()],
|
|
205
278
|
});
|
|
206
279
|
histograms.set(name, hist);
|
|
@@ -227,12 +300,19 @@ const businessMetrics = createMetricHelpers(register);
|
|
|
227
300
|
/**
|
|
228
301
|
* Increment a business counter, creating it on first use.
|
|
229
302
|
*
|
|
303
|
+
* Every example below is a call that EXISTS, with the labels it really passes. That is
|
|
304
|
+
* deliberate: an invented example reads as an inventory of what the system measures, and
|
|
305
|
+
* a metrics survey later counted three names from this block — `pipelines_generated_total`,
|
|
306
|
+
* `quota_threshold_crossed_total`, `compliance_violations_found_total` — as live metrics
|
|
307
|
+
* missing a dashboard panel. Nothing emitted any of them. Illustrative names in a docstring
|
|
308
|
+
* about metric naming are indistinguishable from real ones, so there are none here.
|
|
309
|
+
*
|
|
230
310
|
* @example
|
|
231
311
|
* ```typescript
|
|
232
|
-
* incCounter('
|
|
233
|
-
* incCounter('
|
|
234
|
-
* incCounter('
|
|
235
|
-
* incCounter('
|
|
312
|
+
* incCounter('plugin_builds_total', { status: 'success', org_id: orgId });
|
|
313
|
+
* incCounter('compliance_scans_total', { outcome: 'started' });
|
|
314
|
+
* incCounter('plugin_vuln_findings_total', { trigger, severity }, count);
|
|
315
|
+
* incCounter('ai_tokens_total', { route: 'agent', kind: 'input' }, inputTokens);
|
|
236
316
|
* ```
|
|
237
317
|
*/
|
|
238
318
|
export function incCounter(name, labels = {}, value = 1) {
|
|
@@ -244,8 +324,8 @@ export function incCounter(name, labels = {}, value = 1) {
|
|
|
244
324
|
*
|
|
245
325
|
* @example
|
|
246
326
|
* ```typescript
|
|
247
|
-
* observe('ai_generation_duration_seconds', {
|
|
248
|
-
* observe('plugin_build_duration_seconds', {
|
|
327
|
+
* observe('ai_generation_duration_seconds', { route, provider: providerLabel }, durationSec);
|
|
328
|
+
* observe('plugin_build_duration_seconds', { org_id: orgId }, durationSec);
|
|
249
329
|
* ```
|
|
250
330
|
*/
|
|
251
331
|
export function observe(name, labels, value) {
|
|
@@ -266,9 +346,9 @@ export function setGauge(name, labels, value) {
|
|
|
266
346
|
businessMetrics.setGauge(name, labels, value);
|
|
267
347
|
}
|
|
268
348
|
function humanizeName(metricName) {
|
|
269
|
-
// `
|
|
349
|
+
// `plugin_builds_total` → "Plugin builds total"
|
|
270
350
|
return metricName
|
|
271
351
|
.replace(/_/g, ' ')
|
|
272
352
|
.replace(/^./, (c) => c.toUpperCase());
|
|
273
353
|
}
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXRDLGdEQUFnRDtBQUNoRCxNQUFNLG1CQUFtQixHQUFHLElBQUksU0FBUyxDQUFDO0lBQ3hDLElBQUksRUFBRSwrQkFBK0I7SUFDckMsSUFBSSxFQUFFLHNDQUFzQztJQUM1QyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBVTtJQUN2RCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ2xFLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztDQUN0QixDQUFDLENBQUM7QUFFSCwyQkFBMkI7QUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQztJQUNwQyxJQUFJLEVBQUUscUJBQXFCO0lBQzNCLElBQUksRUFBRSwrQkFBK0I7SUFDckMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQVU7SUFDdkQsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO0NBQ3RCLENBQUMsQ0FBQztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDekMsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxJQUFJLEVBQUUsbUZBQW1GO0lBQ3pGLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBVTtJQUNqRSxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Q0FDdEIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzVCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7SUFDckQsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBWTtJQUNsQyx1Q0FBdUM7SUFDdkMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELE9BQU8sR0FBRyxDQUFDLElBQUk7U0FDWixPQUFPLENBQUMsZ0VBQWdFLEVBQUUsS0FBSyxDQUFDO1NBQ2hGLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE9BQU8sQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQVEsRUFBRTtRQUMvRCxxRUFBcUU7UUFDckUsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxnQkFBZ0I7UUFDaEIsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFN0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3BCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLE1BQU0sR0FBRztnQkFDYixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07Z0JBQ2xCLEtBQUs7Z0JBQ0wsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ3BDLENBQUM7WUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDWixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUIsc0NBQXNDO1lBQ3RDLG1FQUFtRTtZQUNuRSxrQ0FBa0M7WUFDbEMsc0JBQXNCO1lBQ3RCLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsMkRBQTJEO1lBQzNELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDO1lBQ3ZDLElBQUksS0FBSyxJQUFJLGVBQWUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDO2dCQUNwRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzVCLE9BQU8sS0FBSyxFQUFFLElBQWEsRUFBRSxHQUFhLEVBQWlCLEVBQUU7UUFDM0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBdUJEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxRQUFxQztJQUN2RSxNQUFNLFVBQVUsR0FBRyxHQUFhLEVBQUUsQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRWhELE9BQU87UUFDTCxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUM7WUFDckMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDO29CQUNwQixJQUFJO29CQUNKLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQy9CLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUMxQixDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLO1lBQ3pCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQztvQkFDbkIsSUFBSTtvQkFDSixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDeEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMvQix5RUFBeUU7b0JBQ3pFLHFFQUFxRTtvQkFDckUsK0NBQStDO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztvQkFDaEUsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQzFCLENBQUMsQ0FBQztnQkFDSCxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUs7WUFDMUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDO29CQUNoQixJQUFJO29CQUNKLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQy9CLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUMxQixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUV0RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBTSxHQUEyQixFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDckYsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLElBQVksRUFBRSxNQUE4QixFQUFFLEtBQWE7SUFDakYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFZLEVBQUUsTUFBOEIsRUFBRSxLQUFhO0lBQ2xGLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsNERBQTREO0lBQzVELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJldmlvdXNTZWNyZXRTdGF0ZXMsIFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgY29sbGVjdERlZmF1bHRNZXRyaWNzLCBDb3VudGVyLCBIaXN0b2dyYW0sIEdhdWdlIH0gZnJvbSAncHJvbS1jbGllbnQnO1xuXG5jb25zdCBTRVJWSUNFX05BTUUgPSAoQ29uZmlnLmdldEFueSgnb2JzZXJ2YWJpbGl0eScpIGFzIHsgc2VydmljZU5hbWU6IHN0cmluZyB9KS5zZXJ2aWNlTmFtZTtcblxuLyoqIFNoYXJlZCBQcm9tZXRoZXVzIHJlZ2lzdHJ5ICovXG5jb25zdCByZWdpc3RlciA9IG5ldyBSZWdpc3RyeSgpO1xuXG4vLyBTZXQgZGVmYXVsdCBsYWJlbHMgZm9yIGFsbCBtZXRyaWNzXG5yZWdpc3Rlci5zZXREZWZhdWx0TGFiZWxzKHsgc2VydmljZTogU0VSVklDRV9OQU1FIH0pO1xuXG4vLyBDb2xsZWN0IGRlZmF1bHQgTm9kZS5qcyBwcm9jZXNzIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBoZWFwLCBldmVudCBsb29wIGxhZywgR0MpXG5jb2xsZWN0RGVmYXVsdE1ldHJpY3MoeyByZWdpc3RlciB9KTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0fWAgZ2F1Z2Ugb24gYHJlZ2lzdHJ5YDogMVxuICogd2hpbGUgYSBzZWNyZXQncyBgKl9QUkVWSU9VU2Agcm90YXRpb24gdmFsdWUgaXMgc3RpbGwgc2V0LCAwIG90aGVyd2lzZS4gVGhlXG4gKiB2YWx1ZSBpcyByZWFkIGZyb20gYXBpLWNvcmUncyBwcm9iZSByZWdpc3RyeSBhdCBzY3JhcGUgdGltZSwgc28gaXQgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgbGl2ZSBwcm9jZXNzLiBFeHBvcnRlZCBzbyBwbGF0Zm9ybSAob3duIHJlZ2lzdHJ5KSBleHBvc2VzIHRoZVxuICogaWRlbnRpY2FsIHNlcmllczsgdGhlIGBTZWNyZXRSb3RhdGlvblByZXZpb3VzTGluZ2VyaW5nYCBhbGVydCBrZXlzIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdHJ5OiBSZWdpc3RyeSk6IEdhdWdlPCdzZWNyZXQnPiB7XG4gIHJldHVybiBuZXcgR2F1Z2Uoe1xuICAgIG5hbWU6IFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSxcbiAgICBoZWxwOiAnMSB3aGlsZSBhIHNlY3JldCByb3RhdGlvbiBwcmV2aW91cyB2YWx1ZSAoZS5nLiBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMpIG9yIGEgcmV0aXJpbmcgc2lnbmluZyBrZXkgaXMgc3RpbGwgYWNjZXB0ZWQ7IHNlZSBkb2NzL3J1bmJvb2tzL3NlY3JldC1yb3RhdGlvbi5tZCcsXG4gICAgbGFiZWxOYW1lczogWydzZWNyZXQnXSBhcyBjb25zdCxcbiAgICByZWdpc3RlcnM6IFtyZWdpc3RyeV0sXG4gICAgY29sbGVjdCgpIHtcbiAgICAgIGZvciAoY29uc3QgeyBzZWNyZXQsIHByZXZpb3VzU2V0IH0gb2YgcHJldmlvdXNTZWNyZXRTdGF0ZXMoKSkge1xuICAgICAgICB0aGlzLnNldCh7IHNlY3JldCB9LCBwcmV2aW91c1NldCA/IDEgOiAwKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxucmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdGVyKTtcblxuLyoqIEhUVFAgcmVxdWVzdCBkdXJhdGlvbiBoaXN0b2dyYW0gKHNlY29uZHMpICovXG5jb25zdCBodHRwUmVxdWVzdER1cmF0aW9uID0gbmV3IEhpc3RvZ3JhbSh7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RfZHVyYXRpb25fc2Vjb25kcycsXG4gIGhlbHA6ICdEdXJhdGlvbiBvZiBIVFRQIHJlcXVlc3RzIGluIHNlY29uZHMnLFxuICBsYWJlbE5hbWVzOiBbJ21ldGhvZCcsICdyb3V0ZScsICdzdGF0dXNfY29kZSddIGFzIGNvbnN0LFxuICBidWNrZXRzOiBbMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMF0sXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGNvdW50ZXIgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0c1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c190b3RhbCcsXG4gIGhlbHA6ICdUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFBlci1vcmcgSFRUUCByZXF1ZXN0IGNvdW50ZXIg4oCUIFNBTVBMRUQgdG8ga2VlcCBQcm9tZXRoZXVzIGNhcmRpbmFsaXR5XG4gKiB1bmRlciBjb250cm9sLiBDYXJkaW5hbGl0eSBvZiBgb3JnX2lkICogbWV0aG9kICogcm91dGUgKiBzdGF0dXNfY29kZWBcbiAqIGdyb3dzIG11bHRpcGxpY2F0aXZlbHk7IHdpdGggTiBvcmdzICogNTAgcm91dGVzICogNSBzdGF0dXNfY29kZXMgdGhhdCdzXG4gKiAyNTDDl04gc2VyaWVzLiBXZSBzYW1wbGUgMS1pbi1OIHJlcXVlc3RzIChjb25maWd1cmFibGUgdmlhXG4gKiBgSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURWAsIGRlZmF1bHQgMCA9IG9mZikuXG4gKlxuICogT3BlcmF0b3JzIGFuc3dlciBcIndoYXQncyBvcmcgWCdzIHA5OT9cIiB2aWEgc2VwYXJhdGUgcGVyLW9yZyBoaXN0b2dyYW1zXG4gKiBzY3JhcGVkIGF0IGEgbG93ZXIgcmF0ZSwgT1IgdmlhIExva2kgTG9nUUwgcXVlcmllcyBhZ2FpbnN0IHRoZVxuICogdW5zYW1wbGVkIGFjY2Vzcy1sb2cgc3RyZWFtLiBUaGlzIGNvdW50ZXIgaXMgdGhlIGZhc3QtcGF0aCBcIm5vaXN5XG4gKiBuZWlnaGJvciBkZXRlY3Rpb25cIiDigJQgb3BlcmF0b3JzIGFsZXJ0IHdoZW4gb25lIG9yZydzIHJlcXVlc3QgcmF0ZVxuICogZGV2aWF0ZXMgZnJvbSB0aGUgZmxlZXQgbWVkaWFuLlxuICpcbiAqIE5PVCBhIGhpc3RvZ3JhbTogaGlzdG9ncmFtIGxhYmVsIGNhcmRpbmFsaXR5IGlzIGV2ZW4gbW9yZSBzZW5zaXRpdmVcbiAqIChlYWNoIGJ1Y2tldCBpcyBhIHNlcGFyYXRlIHNlcmllcykuIElmIHBlci1vcmcgbGF0ZW5jeSBwZXJjZW50aWxlcyBhcmVcbiAqIG5lZWRlZCBsYXRlciwgYWRkIGEgc2VwYXJhdGUgaGlzdG9ncmFtIHdpdGggYSBjb2Fyc2VyIGJ1Y2tldCBzZXQgYW5kXG4gKiBsb3dlciBzYW1wbGUgcmF0ZS5cbiAqL1xuY29uc3QgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbCA9IG5ldyBDb3VudGVyKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdHNfYnlfb3JnX3RvdGFsJyxcbiAgaGVscDogJ1NhbXBsZWQgcGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnQgKHNhbXBsZSByYXRlIHZpYSBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFKScsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJywgJ29yZ19pZCddIGFzIGNvbnN0LFxuICByZWdpc3RlcnM6IFtyZWdpc3Rlcl0sXG59KTtcblxuLyoqXG4gKiBTYW1wbGUgcmF0ZSBmb3IgdGhlIHBlci1vcmcgY291bnRlci4gMS4wID0gZXZlcnkgcmVxdWVzdCwgMC4wID0gZGlzYWJsZWQuXG4gKiBQYXJzZWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJQgb3BlcmF0b3JzIHR1bmUgYnkgcmVzdGFydGluZyB0aGUgc2VydmljZS5cbiAqXG4gKiBEZWZhdWx0cyB0byAwIChPRkYpLiBgb3JnX2lkYCBpcyBhbiBVTkJPVU5ERUQsIHRlbmFudC1pZGVudGlmeWluZyBsYWJlbCBhbmRcbiAqIHByb20tY2xpZW50IGNvdW50ZXJzIG5ldmVyIGV4cGlyZSwgc28gYXQgMS4wIGV2ZXJ5IHNlcnZpY2UgYWNjdW11bGF0ZXMgYVxuICogc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmQgYC9tZXRyaWNzYCDigJRcbiAqIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVzIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoIGl0cyByZXF1ZXN0XG4gKiB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjYW4gcmVhY2ggdGhlIHBvcnQuXG4gKlxuICogVHVybiBpdCBvbiBkZWxpYmVyYXRlbHkgKGFuZCBpZGVhbGx5IHdpdGggYSBzYW1wbGUgcmF0ZSB3ZWxsIHVuZGVyIDEuMCwgcGx1c1xuICogYE1FVFJJQ1NfU0NSQVBFX1RPS0VOYCBzZXQpIHdoZW4geW91IGFjdHVhbGx5IHdhbnQgcGVyLW9yZyBub2lzeS1uZWlnaGJvdXJcbiAqIGRldGVjdGlvbiBmcm9tIG1ldHJpY3MgcmF0aGVyIHRoYW4gZnJvbSB0aGUgYWNjZXNzLWxvZyBzdHJlYW0uXG4gKi9cbmNvbnN0IE9SR19TQU1QTEVfUkFURSA9ICgoKSA9PiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LkhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEU7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gMDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZCkgfHwgcGFyc2VkIDwgMCB8fCBwYXJzZWQgPiAxKSByZXR1cm4gMDtcbiAgcmV0dXJuIHBhcnNlZDtcbn0pKCk7XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIEV4cHJlc3Mgcm91dGUgcGF0aCB0byBwcmV2ZW50IGxhYmVsIGNhcmRpbmFsaXR5IGV4cGxvc2lvbi5cbiAqXG4gKiBVc2VzIEV4cHJlc3MncyBtYXRjaGVkIHJvdXRlIHBhdHRlcm4gKGUuZy4gYC9wbHVnaW5zLzppZGApIHdoZW4gYXZhaWxhYmxlLFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBwYXRoIHdpdGggVVVJRC9udW1lcmljIHNlZ21lbnRzIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSb3V0ZShyZXE6IFJlcXVlc3QpOiBzdHJpbmcge1xuICAvLyBQcmVmZXIgRXhwcmVzcyBtYXRjaGVkIHJvdXRlIHBhdHRlcm5cbiAgaWYgKHJlcS5yb3V0ZT8ucGF0aCkge1xuICAgIHJldHVybiByZXEuYmFzZVVybCArIHJlcS5yb3V0ZS5wYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHJlcGxhY2UgVVVJRHMgYW5kIG51bWVyaWMgSURzIHdpdGggOmlkXG4gIHJldHVybiByZXEucGF0aFxuICAgIC5yZXBsYWNlKC9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0vZ2ksICc6aWQnKVxuICAgIC5yZXBsYWNlKC9cXC9cXGQrKD89XFwvfCQpL2csICcvOmlkJyk7XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudC5cbiAqXG4gKiBNdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHJvdXRlIGhhbmRsZXJzIHNvIGByZXMub24oJ2ZpbmlzaCcpYCBmaXJlc1xuICogYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzTWlkZGxld2FyZSgpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIC8vIE5PVEU6IG5vIC9tZXRyaWNzIG9yIC9oZWFsdGggc2tpcCBuZWVkZWQgaGVyZSDigJQgYm90aCBlbmRwb2ludHMgYXJlXG4gICAgLy8gcmVnaXN0ZXJlZCBpbiBhcHAtZmFjdG9yeSBCRUZPUkUgdGhpcyBtaWRkbGV3YXJlIChjcmVhdGVIZWFsdGhSb3V0ZXIgYW5kXG4gICAgLy8gYXBwLmdldCgnL21ldHJpY3MnKSBib3RoIHRlcm1pbmF0ZSB0aGUgcmVzcG9uc2UpLCBzbyBuZWl0aGVyIGV2ZXIgcmVhY2hlc1xuICAgIC8vIHRoaXMgaGFuZGxlci5cbiAgICBjb25zdCBlbmQgPSBodHRwUmVxdWVzdER1cmF0aW9uLnN0YXJ0VGltZXIoKTtcblxuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGUgPSBub3JtYWxpemVSb3V0ZShyZXEpO1xuICAgICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0dXNfY29kZTogU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSxcbiAgICAgIH07XG5cbiAgICAgIGVuZChsYWJlbHMpO1xuICAgICAgaHR0cFJlcXVlc3RzVG90YWwuaW5jKGxhYmVscyk7XG5cbiAgICAgIC8vIFBlci1vcmcgc2FtcGxlZCBjb3VudGVyLiBTa2lwIHdoZW46XG4gICAgICAvLyAgIC0gbm8gb3JnIGNvbnRleHQgb24gdGhlIHJlcXVlc3QgKGFub255bW91cyAvIGhlYWx0aCBlbmRwb2ludHMpXG4gICAgICAvLyAgIC0gc2FtcGxlIHJhdGUgaXMgMCAoZGlzYWJsZWQpXG4gICAgICAvLyAgIC0gZGljZSByb2xsIGZhaWxzXG4gICAgICAvLyBVc2luZyBNYXRoLnJhbmRvbSBmb3IgdGhlIHNhbXBsZXIg4oCUIGZvciB1bmJpYXNlZCBsb3ctcmF0ZSBzYW1wbGluZ1xuICAgICAgLy8gYSBkZXRlcm1pbmlzdGljIHBlci1yZXF1ZXN0IGhhc2ggd291bGQgYmUgbW9yZSB1bmlmb3JtLCBidXQgYXQgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJhdGUgb2YgMS4wIGV2ZXJ5IHJlcXVlc3QgbGFuZHMgc28gdGhpcyBpcyBmaW5lLlxuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICBpZiAob3JnSWQgJiYgT1JHX1NBTVBMRV9SQVRFID4gMCAmJiBNYXRoLnJhbmRvbSgpIDwgT1JHX1NBTVBMRV9SQVRFKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0c0J5T3JnVG90YWwuaW5jKHsgLi4ubGFiZWxzLCBvcmdfaWQ6IG9yZ0lkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgaGFuZGxlciB0aGF0IHJldHVybnMgUHJvbWV0aGV1cyBtZXRyaWNzIGluIHRleHQgZXhwb3NpdGlvbiBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzSGFuZGxlcigpIHtcbiAgcmV0dXJuIGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgcmVnaXN0ZXIuY29udGVudFR5cGUpO1xuICAgIHJlcy5lbmQoYXdhaXQgcmVnaXN0ZXIubWV0cmljcygpKTtcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdXNpbmVzcyAvIGRvbWFpbiBtZXRyaWNzXG4vL1xuLy8gU2VydmljZXMgc2hvdWxkIGVtaXQgY291bnRlcnMgZm9yIHRoZSB0aGluZ3Mgb3BlcmF0b3JzIGFjdHVhbGx5IGNhcmUgYWJvdXRcbi8vIChwaXBlbGluZXMgZ2VuZXJhdGVkLCBwbHVnaW4gYnVpbGRzIGNvbXBsZXRlZCwgY29tcGxpYW5jZSB2aW9sYXRpb25zLFxuLy8gQUkgdG9rZW5zIGNvbnN1bWVkKSDigJQgbm90IGp1c3QgSFRUUCB0cmFmZmljLiBUaGUgaGVscGVycyBiZWxvdyByZWdpc3RlclxuLy8gY291bnRlcnMgbGF6aWx5IG9uIHRoZSBzaGFyZWQgcmVnaXN0cnkgc28gbXVsdGlwbGUgc2VydmljZXMgY2FuIGNhbGxcbi8vIGBpbmNDb3VudGVyKCdwbHVnaW5fYnVpbGRzX3RvdGFsJywgeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0pYCB3aXRob3V0XG4vLyB3b3JyeWluZyBhYm91dCBkb3VibGUtcmVnaXN0cmF0aW9uLlxuLy9cbi8vIE5hbWluZyBjb252ZW50aW9uOiBgPGRvbWFpbj5fPG5vdW4+X3RvdGFsYCBmb3IgY291bnRlcnMsIGBfc2Vjb25kc2AgZm9yXG4vLyBoaXN0b2dyYW1zIOKAlCBtYXRjaGVzIFByb21ldGhldXMgYmVzdC1wcmFjdGljZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIGxhenkgYnVzaW5lc3MtbWV0cmljIGhlbHBlcnMsIGJvdW5kIHRvIG9uZSByZWdpc3RyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGVscGVycyB7XG4gIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZT86IG51bWJlcik6IHZvaWQ7XG4gIG9ic2VydmUobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlOiBudW1iZXIpOiB2b2lkO1xuICBzZXRHYXVnZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogQnVpbGQgYGluY0NvdW50ZXJgIC8gYG9ic2VydmVgIC8gYHNldEdhdWdlYCBvdmVyIGEgY2FsbGVyLXN1cHBsaWVkIHJlZ2lzdHJ5LlxuICpcbiAqIFRIRSBvbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxhenkgY291bnRlci9oaXN0b2dyYW0vZ2F1Z2UgbWFwcy4gYXBpLXNlcnZlcidzXG4gKiBvd24gZXhwb3J0cyBiZWxvdyBhcmUgdGhpcyBmYWN0b3J5IG92ZXIgaXRzIG1vZHVsZS1sZXZlbCBgcmVnaXN0ZXJgOyB0aGVcbiAqIHBsYXRmb3JtIHNlcnZpY2Ug4oCUIHdoaWNoIHJ1bnMgaXRzIG93biBFeHByZXNzIHNldHVwIGluc3RlYWQgb2YgYGNyZWF0ZUFwcGAsXG4gKiBhbmQgdGhlcmVmb3JlIG93bnMgYSBkaWZmZXJlbnQgcmVnaXN0cnkg4oCUIGJ1aWxkcyB0aGUgaWRlbnRpY2FsIGhlbHBlcnMgb3ZlclxuICogaXRzIG93bi4gV2l0aG91dCB0aGUgZmFjdG9yeSB0aGUgdHdvIGRyaWZ0OiB0aGV5IGRpZmZlciB0b2RheSBvbmx5IGluIHRoZVxuICogaGlzdG9ncmFtIGJ1Y2tldHMsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgZGlmZmVyZW5jZSBub2JvZHkgbm90aWNlc1xuICogdW50aWwgYSBkYXNoYm9hcmQgcmVhZHMgd3Jvbmcgb24gb25lIHNlcnZpY2UuXG4gKlxuICogYHJlZ2lzdHJ5YCBtYXkgYmUgYSB0aHVuaywgZm9yIGEgcmVnaXN0cnkgdGhhdCBpcyBpbmplY3RlZCBhZnRlciBtb2R1bGUgbG9hZFxuICogKHBsYXRmb3JtIHdpcmVzIGl0cyBvd24gb24gYXBwIGJvb3QpLiBUaGUgdGh1bmsgaXMgY2FsbGVkIG9uIHRoZSBGSVJTVCB1c2Ugb2ZcbiAqIGVhY2ggbWV0cmljIG5hbWUsIG5ldmVyIGF0IGltcG9ydCB0aW1lLCBzbyBidWlsZGluZyB0aGUgaGVscGVycyBoYXMgbm8gc2lkZVxuICogZWZmZWN0IG9mIGl0cyBvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRyaWNIZWxwZXJzKHJlZ2lzdHJ5OiBSZWdpc3RyeSB8ICgoKSA9PiBSZWdpc3RyeSkpOiBNZXRyaWNIZWxwZXJzIHtcbiAgY29uc3QgcmVnaXN0cnlPZiA9ICgpOiBSZWdpc3RyeSA9PiAodHlwZW9mIHJlZ2lzdHJ5ID09PSAnZnVuY3Rpb24nID8gcmVnaXN0cnkoKSA6IHJlZ2lzdHJ5KTtcbiAgY29uc3QgY291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgQ291bnRlcjxzdHJpbmc+PigpO1xuICBjb25zdCBoaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIEhpc3RvZ3JhbTxzdHJpbmc+PigpO1xuICBjb25zdCBnYXVnZXMgPSBuZXcgTWFwPHN0cmluZywgR2F1Z2U8c3RyaW5nPj4oKTtcblxuICByZXR1cm4ge1xuICAgIGluY0NvdW50ZXIobmFtZSwgbGFiZWxzID0ge30sIHZhbHVlID0gMSkge1xuICAgICAgbGV0IGNvdW50ZXIgPSBjb3VudGVycy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgICAgY291bnRlciA9IG5ldyBDb3VudGVyKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGhlbHA6IGh1bWFuaXplTmFtZShuYW1lKSxcbiAgICAgICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdHJ5T2YoKV0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb3VudGVycy5zZXQobmFtZSwgY291bnRlcik7XG4gICAgICB9XG4gICAgICBjb3VudGVyLmluYyhsYWJlbHMsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgb2JzZXJ2ZShuYW1lLCBsYWJlbHMsIHZhbHVlKSB7XG4gICAgICBsZXQgaGlzdCA9IGhpc3RvZ3JhbXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFoaXN0KSB7XG4gICAgICAgIGhpc3QgPSBuZXcgSGlzdG9ncmFtKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGhlbHA6IGh1bWFuaXplTmFtZShuYW1lKSxcbiAgICAgICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgICAgIC8vIERlZmF1bHQgYnVja2V0cyB0YXJnZXQgc3ViLXNlY29uZCB0aHJvdWdoIHNldmVyYWwtbWludXRlIG9ic2VydmF0aW9ucy5cbiAgICAgICAgICAvLyBPdmVycmlkZSBieSByZWdpc3RlcmluZyB0aGUgaGlzdG9ncmFtIGV4cGxpY2l0bHkgYmVmb3JlIGZpcnN0IGNhbGxcbiAgICAgICAgICAvLyBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBidWNrZXQgZGlzdHJpYnV0aW9uLlxuICAgICAgICAgIGJ1Y2tldHM6IFswLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMCwgMzAsIDYwLCAxMjAsIDMwMF0sXG4gICAgICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0cnlPZigpXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGhpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICAgICAgfVxuICAgICAgaGlzdC5vYnNlcnZlKGxhYmVscywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBzZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKSB7XG4gICAgICBsZXQgZ2F1Z2UgPSBnYXVnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFnYXVnZSkge1xuICAgICAgICBnYXVnZSA9IG5ldyBHYXVnZSh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgICAgICByZWdpc3RlcnM6IFtyZWdpc3RyeU9mKCldLFxuICAgICAgICB9KTtcbiAgICAgICAgZ2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gICAgICB9XG4gICAgICBnYXVnZS5zZXQobGFiZWxzLCB2YWx1ZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFRoaXMgc2VydmljZSdzIG93biBoZWxwZXJzLCBvdmVyIHRoZSBzaGFyZWQgbW9kdWxlLWxldmVsIHJlZ2lzdHJ5LiAqL1xuY29uc3QgYnVzaW5lc3NNZXRyaWNzID0gY3JlYXRlTWV0cmljSGVscGVycyhyZWdpc3Rlcik7XG5cbi8qKlxuICogSW5jcmVtZW50IGEgYnVzaW5lc3MgY291bnRlciwgY3JlYXRpbmcgaXQgb24gZmlyc3QgdXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbmNDb3VudGVyKCdwaXBlbGluZXNfZ2VuZXJhdGVkX3RvdGFsJywgeyBwcm92aWRlcjogJ2FudGhyb3BpYycgfSk7XG4gKiBpbmNDb3VudGVyKCdwbHVnaW5fYnVpbGRzX3RvdGFsJywgeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0pO1xuICogaW5jQ291bnRlcigncXVvdGFfdGhyZXNob2xkX2Nyb3NzZWRfdG90YWwnLCB7IHR5cGU6ICdhaUNhbGxzJywgdGllcjogJ3BybycgfSk7XG4gKiBpbmNDb3VudGVyKCdjb21wbGlhbmNlX3Zpb2xhdGlvbnNfZm91bmRfdG90YWwnLCB7IHNldmVyaXR5OiAnY3JpdGljYWwnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNDb3VudGVyKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sIHZhbHVlID0gMSk6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3MuaW5jQ291bnRlcihuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgbW9kZWw6ICdzb25uZXQnIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBidWlsZFR5cGU6ICdkb2NrZXInIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3Mub2JzZXJ2ZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5zZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaHVtYW5pemVOYW1lKG1ldHJpY05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBwaXBlbGluZXNfZ2VuZXJhdGVkX3RvdGFsYCDihpIgXCJQaXBlbGluZXMgZ2VuZXJhdGVkIHRvdGFsXCJcbiAgcmV0dXJuIG1ldHJpY05hbWVcbiAgICAucmVwbGFjZSgvXy9nLCAnICcpXG4gICAgLnJlcGxhY2UoL14uLywgKGMpID0+IGMudG9VcHBlckNhc2UoKSk7XG59XG4iXX0=
|
|
354
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxD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UyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsZ0RBQWdEO0lBQ2hELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJldmlvdXNTZWNyZXRTdGF0ZXMsIFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgY29sbGVjdERlZmF1bHRNZXRyaWNzLCBDb3VudGVyLCBIaXN0b2dyYW0sIEdhdWdlIH0gZnJvbSAncHJvbS1jbGllbnQnO1xuXG5jb25zdCBTRVJWSUNFX05BTUUgPSAoQ29uZmlnLmdldEFueSgnb2JzZXJ2YWJpbGl0eScpIGFzIHsgc2VydmljZU5hbWU6IHN0cmluZyB9KS5zZXJ2aWNlTmFtZTtcblxuLyoqIFNoYXJlZCBQcm9tZXRoZXVzIHJlZ2lzdHJ5ICovXG5jb25zdCByZWdpc3RlciA9IG5ldyBSZWdpc3RyeSgpO1xuXG4vLyBTZXQgZGVmYXVsdCBsYWJlbHMgZm9yIGFsbCBtZXRyaWNzXG5yZWdpc3Rlci5zZXREZWZhdWx0TGFiZWxzKHsgc2VydmljZTogU0VSVklDRV9OQU1FIH0pO1xuXG4vLyBDb2xsZWN0IGRlZmF1bHQgTm9kZS5qcyBwcm9jZXNzIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBoZWFwLCBldmVudCBsb29wIGxhZywgR0MpXG5jb2xsZWN0RGVmYXVsdE1ldHJpY3MoeyByZWdpc3RlciB9KTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0fWAgZ2F1Z2Ugb24gYHJlZ2lzdHJ5YDogMVxuICogd2hpbGUgYSBzZWNyZXQncyBgKl9QUkVWSU9VU2Agcm90YXRpb24gdmFsdWUgaXMgc3RpbGwgc2V0LCAwIG90aGVyd2lzZS4gVGhlXG4gKiB2YWx1ZSBpcyByZWFkIGZyb20gYXBpLWNvcmUncyBwcm9iZSByZWdpc3RyeSBhdCBzY3JhcGUgdGltZSwgc28gaXQgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgbGl2ZSBwcm9jZXNzLiBFeHBvcnRlZCBzbyBwbGF0Zm9ybSAob3duIHJlZ2lzdHJ5KSBleHBvc2VzIHRoZVxuICogaWRlbnRpY2FsIHNlcmllczsgdGhlIGBTZWNyZXRSb3RhdGlvblByZXZpb3VzTGluZ2VyaW5nYCBhbGVydCBrZXlzIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdHJ5OiBSZWdpc3RyeSk6IEdhdWdlPCdzZWNyZXQnPiB7XG4gIHJldHVybiBuZXcgR2F1Z2Uoe1xuICAgIG5hbWU6IFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSxcbiAgICBoZWxwOiAnMSB3aGlsZSBhIHNlY3JldCByb3RhdGlvbiBwcmV2aW91cyB2YWx1ZSAoZS5nLiBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMpIG9yIGEgcmV0aXJpbmcgc2lnbmluZyBrZXkgaXMgc3RpbGwgYWNjZXB0ZWQ7IHNlZSBkb2NzL3J1bmJvb2tzL3NlY3JldC1yb3RhdGlvbi5tZCcsXG4gICAgbGFiZWxOYW1lczogWydzZWNyZXQnXSBhcyBjb25zdCxcbiAgICByZWdpc3RlcnM6IFtyZWdpc3RyeV0sXG4gICAgY29sbGVjdCgpIHtcbiAgICAgIGZvciAoY29uc3QgeyBzZWNyZXQsIHByZXZpb3VzU2V0IH0gb2YgcHJldmlvdXNTZWNyZXRTdGF0ZXMoKSkge1xuICAgICAgICB0aGlzLnNldCh7IHNlY3JldCB9LCBwcmV2aW91c1NldCA/IDEgOiAwKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxucmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdGVyKTtcblxuLyoqIEhUVFAgcmVxdWVzdCBkdXJhdGlvbiBoaXN0b2dyYW0gKHNlY29uZHMpICovXG5jb25zdCBodHRwUmVxdWVzdER1cmF0aW9uID0gbmV3IEhpc3RvZ3JhbSh7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RfZHVyYXRpb25fc2Vjb25kcycsXG4gIGhlbHA6ICdEdXJhdGlvbiBvZiBIVFRQIHJlcXVlc3RzIGluIHNlY29uZHMnLFxuICBsYWJlbE5hbWVzOiBbJ21ldGhvZCcsICdyb3V0ZScsICdzdGF0dXNfY29kZSddIGFzIGNvbnN0LFxuICBidWNrZXRzOiBbMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMF0sXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGNvdW50ZXIgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0c1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c190b3RhbCcsXG4gIGhlbHA6ICdUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFBlci1vcmcgSFRUUCByZXF1ZXN0IGNvdW50ZXIg4oCUIFNBTVBMRUQgdG8ga2VlcCBQcm9tZXRoZXVzIGNhcmRpbmFsaXR5XG4gKiB1bmRlciBjb250cm9sLiBDYXJkaW5hbGl0eSBvZiBgb3JnX2lkICogbWV0aG9kICogcm91dGUgKiBzdGF0dXNfY29kZWBcbiAqIGdyb3dzIG11bHRpcGxpY2F0aXZlbHk7IHdpdGggTiBvcmdzICogNTAgcm91dGVzICogNSBzdGF0dXNfY29kZXMgdGhhdCdzXG4gKiAyNTDDl04gc2VyaWVzLiBXZSBzYW1wbGUgMS1pbi1OIHJlcXVlc3RzIChjb25maWd1cmFibGUgdmlhXG4gKiBgSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURWAsIGRlZmF1bHQgMCA9IG9mZikuXG4gKlxuICogT3BlcmF0b3JzIGFuc3dlciBcIndoYXQncyBvcmcgWCdzIHA5OT9cIiB2aWEgc2VwYXJhdGUgcGVyLW9yZyBoaXN0b2dyYW1zXG4gKiBzY3JhcGVkIGF0IGEgbG93ZXIgcmF0ZSwgT1IgdmlhIExva2kgTG9nUUwgcXVlcmllcyBhZ2FpbnN0IHRoZVxuICogdW5zYW1wbGVkIGFjY2Vzcy1sb2cgc3RyZWFtLiBUaGlzIGNvdW50ZXIgaXMgdGhlIGZhc3QtcGF0aCBcIm5vaXN5XG4gKiBuZWlnaGJvciBkZXRlY3Rpb25cIiDigJQgb3BlcmF0b3JzIGFsZXJ0IHdoZW4gb25lIG9yZydzIHJlcXVlc3QgcmF0ZVxuICogZGV2aWF0ZXMgZnJvbSB0aGUgZmxlZXQgbWVkaWFuLlxuICpcbiAqIE5PVCBhIGhpc3RvZ3JhbTogaGlzdG9ncmFtIGxhYmVsIGNhcmRpbmFsaXR5IGlzIGV2ZW4gbW9yZSBzZW5zaXRpdmVcbiAqIChlYWNoIGJ1Y2tldCBpcyBhIHNlcGFyYXRlIHNlcmllcykuIElmIHBlci1vcmcgbGF0ZW5jeSBwZXJjZW50aWxlcyBhcmVcbiAqIG5lZWRlZCBsYXRlciwgYWRkIGEgc2VwYXJhdGUgaGlzdG9ncmFtIHdpdGggYSBjb2Fyc2VyIGJ1Y2tldCBzZXQgYW5kXG4gKiBsb3dlciBzYW1wbGUgcmF0ZS5cbiAqL1xuY29uc3QgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbCA9IG5ldyBDb3VudGVyKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdHNfYnlfb3JnX3RvdGFsJyxcbiAgaGVscDogJ1NhbXBsZWQgcGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnQgKHNhbXBsZSByYXRlIHZpYSBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFKScsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJywgJ29yZ19pZCddIGFzIGNvbnN0LFxuICByZWdpc3RlcnM6IFtyZWdpc3Rlcl0sXG59KTtcblxuLyoqXG4gKiBTYW1wbGUgcmF0ZSBmb3IgdGhlIHBlci1vcmcgY291bnRlci4gMS4wID0gZXZlcnkgcmVxdWVzdCwgMC4wID0gZGlzYWJsZWQuXG4gKiBQYXJzZWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJQgb3BlcmF0b3JzIHR1bmUgYnkgcmVzdGFydGluZyB0aGUgc2VydmljZS5cbiAqXG4gKiBEZWZhdWx0cyB0byAwIChPRkYpLiBgb3JnX2lkYCBpcyBhbiBVTkJPVU5ERUQsIHRlbmFudC1pZGVudGlmeWluZyBsYWJlbCBhbmRcbiAqIHByb20tY2xpZW50IGNvdW50ZXJzIG5ldmVyIGV4cGlyZSwgc28gYXQgMS4wIGV2ZXJ5IHNlcnZpY2UgYWNjdW11bGF0ZXMgYVxuICogc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmQgYC9tZXRyaWNzYCDigJRcbiAqIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVzIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoIGl0cyByZXF1ZXN0XG4gKiB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjYW4gcmVhY2ggdGhlIHBvcnQuXG4gKlxuICogVHVybiBpdCBvbiBkZWxpYmVyYXRlbHkgKGFuZCBpZGVhbGx5IHdpdGggYSBzYW1wbGUgcmF0ZSB3ZWxsIHVuZGVyIDEuMCwgcGx1c1xuICogYE1FVFJJQ1NfU0NSQVBFX1RPS0VOYCBzZXQpIHdoZW4geW91IGFjdHVhbGx5IHdhbnQgcGVyLW9yZyBub2lzeS1uZWlnaGJvdXJcbiAqIGRldGVjdGlvbiBmcm9tIG1ldHJpY3MgcmF0aGVyIHRoYW4gZnJvbSB0aGUgYWNjZXNzLWxvZyBzdHJlYW0uXG4gKi9cbmNvbnN0IE9SR19TQU1QTEVfUkFURSA9ICgoKSA9PiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LkhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEU7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gMDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZCkgfHwgcGFyc2VkIDwgMCB8fCBwYXJzZWQgPiAxKSByZXR1cm4gMDtcbiAgcmV0dXJuIHBhcnNlZDtcbn0pKCk7XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIEV4cHJlc3Mgcm91dGUgcGF0aCB0byBwcmV2ZW50IGxhYmVsIGNhcmRpbmFsaXR5IGV4cGxvc2lvbi5cbiAqXG4gKiBVc2VzIEV4cHJlc3MncyBtYXRjaGVkIHJvdXRlIHBhdHRlcm4gKGUuZy4gYC9wbHVnaW5zLzppZGApIHdoZW4gYXZhaWxhYmxlLFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBwYXRoIHdpdGggVVVJRC9udW1lcmljIHNlZ21lbnRzIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSb3V0ZShyZXE6IFJlcXVlc3QpOiBzdHJpbmcge1xuICAvLyBQcmVmZXIgRXhwcmVzcyBtYXRjaGVkIHJvdXRlIHBhdHRlcm5cbiAgaWYgKHJlcS5yb3V0ZT8ucGF0aCkge1xuICAgIHJldHVybiByZXEuYmFzZVVybCArIHJlcS5yb3V0ZS5wYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHJlcGxhY2UgVVVJRHMgYW5kIG51bWVyaWMgSURzIHdpdGggOmlkXG4gIHJldHVybiByZXEucGF0aFxuICAgIC5yZXBsYWNlKC9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0vZ2ksICc6aWQnKVxuICAgIC5yZXBsYWNlKC9cXC9cXGQrKD89XFwvfCQpL2csICcvOmlkJyk7XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudC5cbiAqXG4gKiBNdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHJvdXRlIGhhbmRsZXJzIHNvIGByZXMub24oJ2ZpbmlzaCcpYCBmaXJlc1xuICogYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzTWlkZGxld2FyZSgpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIC8vIE5PVEU6IG5vIC9tZXRyaWNzIG9yIC9oZWFsdGggc2tpcCBuZWVkZWQgaGVyZSDigJQgYm90aCBlbmRwb2ludHMgYXJlXG4gICAgLy8gcmVnaXN0ZXJlZCBpbiBhcHAtZmFjdG9yeSBCRUZPUkUgdGhpcyBtaWRkbGV3YXJlIChjcmVhdGVIZWFsdGhSb3V0ZXIgYW5kXG4gICAgLy8gYXBwLmdldCgnL21ldHJpY3MnKSBib3RoIHRlcm1pbmF0ZSB0aGUgcmVzcG9uc2UpLCBzbyBuZWl0aGVyIGV2ZXIgcmVhY2hlc1xuICAgIC8vIHRoaXMgaGFuZGxlci5cbiAgICBjb25zdCBlbmQgPSBodHRwUmVxdWVzdER1cmF0aW9uLnN0YXJ0VGltZXIoKTtcblxuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGUgPSBub3JtYWxpemVSb3V0ZShyZXEpO1xuICAgICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0dXNfY29kZTogU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSxcbiAgICAgIH07XG5cbiAgICAgIGVuZChsYWJlbHMpO1xuICAgICAgaHR0cFJlcXVlc3RzVG90YWwuaW5jKGxhYmVscyk7XG5cbiAgICAgIC8vIFBlci1vcmcgc2FtcGxlZCBjb3VudGVyLiBTa2lwIHdoZW46XG4gICAgICAvLyAgIC0gbm8gb3JnIGNvbnRleHQgb24gdGhlIHJlcXVlc3QgKGFub255bW91cyAvIGhlYWx0aCBlbmRwb2ludHMpXG4gICAgICAvLyAgIC0gc2FtcGxlIHJhdGUgaXMgMCAoZGlzYWJsZWQpXG4gICAgICAvLyAgIC0gZGljZSByb2xsIGZhaWxzXG4gICAgICAvLyBVc2luZyBNYXRoLnJhbmRvbSBmb3IgdGhlIHNhbXBsZXIg4oCUIGZvciB1bmJpYXNlZCBsb3ctcmF0ZSBzYW1wbGluZ1xuICAgICAgLy8gYSBkZXRlcm1pbmlzdGljIHBlci1yZXF1ZXN0IGhhc2ggd291bGQgYmUgbW9yZSB1bmlmb3JtLCBidXQgYXQgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJhdGUgb2YgMS4wIGV2ZXJ5IHJlcXVlc3QgbGFuZHMgc28gdGhpcyBpcyBmaW5lLlxuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICBpZiAob3JnSWQgJiYgT1JHX1NBTVBMRV9SQVRFID4gMCAmJiBNYXRoLnJhbmRvbSgpIDwgT1JHX1NBTVBMRV9SQVRFKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0c0J5T3JnVG90YWwuaW5jKHsgLi4ubGFiZWxzLCBvcmdfaWQ6IG9yZ0lkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgaGFuZGxlciB0aGF0IHJldHVybnMgUHJvbWV0aGV1cyBtZXRyaWNzIGluIHRleHQgZXhwb3NpdGlvbiBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzSGFuZGxlcigpIHtcbiAgcmV0dXJuIGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgcmVnaXN0ZXIuY29udGVudFR5cGUpO1xuICAgIHJlcy5lbmQoYXdhaXQgcmVnaXN0ZXIubWV0cmljcygpKTtcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdXNpbmVzcyAvIGRvbWFpbiBtZXRyaWNzXG4vL1xuLy8gU2VydmljZXMgc2hvdWxkIGVtaXQgY291bnRlcnMgZm9yIHRoZSB0aGluZ3Mgb3BlcmF0b3JzIGFjdHVhbGx5IGNhcmUgYWJvdXRcbi8vIChwaXBlbGluZXMgZ2VuZXJhdGVkLCBwbHVnaW4gYnVpbGRzIGNvbXBsZXRlZCwgY29tcGxpYW5jZSB2aW9sYXRpb25zLFxuLy8gQUkgdG9rZW5zIGNvbnN1bWVkKSDigJQgbm90IGp1c3QgSFRUUCB0cmFmZmljLiBUaGUgaGVscGVycyBiZWxvdyByZWdpc3RlclxuLy8gY291bnRlcnMgbGF6aWx5IG9uIHRoZSBzaGFyZWQgcmVnaXN0cnkgc28gbXVsdGlwbGUgc2VydmljZXMgY2FuIGNhbGxcbi8vIGBpbmNDb3VudGVyKCdwbHVnaW5fYnVpbGRzX3RvdGFsJywgeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0pYCB3aXRob3V0XG4vLyB3b3JyeWluZyBhYm91dCBkb3VibGUtcmVnaXN0cmF0aW9uLlxuLy9cbi8vIE5hbWluZyBjb252ZW50aW9uOiBgPGRvbWFpbj5fPG5vdW4+X3RvdGFsYCBmb3IgY291bnRlcnMsIGBfc2Vjb25kc2AgZm9yXG4vLyBoaXN0b2dyYW1zIOKAlCBtYXRjaGVzIFByb21ldGhldXMgYmVzdC1wcmFjdGljZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1Y2tldCBkaXN0cmlidXRpb25zIGZvciBoaXN0b2dyYW1zIHdob3NlIG9ic2VydmF0aW9ucyBhcmUgbm93aGVyZSBuZWFyIHRoZVxuICogc3ViLXNlY29uZC10by1taW51dGVzIGRlZmF1bHQuXG4gKlxuICogVEhJUyBUQUJMRSBFWElTVFMgQkVDQVVTRSBUSEUgREVGQVVMVCBTSUxFTlRMWSBCUkVBS1MgQUxFUlRTLiBUaGUgZGVmYXVsdCBzZXRcbiAqIGJlbG93IGVuZHMgYXQgYSAzMDAtc2Vjb25kIGJ1Y2tldCwgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZVxuICogcGFzdCB0aGUgbGFzdCBGSU5JVEUgYm91bmRhcnkg4oCUIGV2ZXJ5dGhpbmcgYWJvdmUgaXQgbGFuZHMgaW4gYCtJbmZgIGFuZCB0aGVcbiAqIHF1YW50aWxlIHJlYWRzIGJhY2sgYXMgMzAwIGZvcmV2ZXIuIEFuIGFsZXJ0IG9mIHRoZSBmb3JtIGA+IDMwMGAgb24gc3VjaCBhXG4gKiBoaXN0b2dyYW0gY2FuIHRoZXJlZm9yZSBuZXZlciBmaXJlLCBhbmQgYSBwOTAgcGFuZWwgZmxhdC1saW5lcyBhdCBmaXZlXG4gKiBtaW51dGVzIGhvd2V2ZXIgYmFkIHRoaW5ncyBnZXQuIE5vdGhpbmcgZXJyb3JzLCBub3RoaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGVcbiAqIHNjcmFwZSwgYW5kIHRoZSBkYXNoYm9hcmQgbG9va3MgaGVhbHRoeTogdGhlIG9ubHkgc3ltcHRvbSBpcyBhbiBhbGVydCB0aGF0XG4gKiBzdGF5cyBxdWlldCB0aHJvdWdoIGFuIG91dGFnZS4gYHN1cHBvcnRfZmlyc3RfcmVzcG9uc2Vfc2Vjb25kc2AgbWVhc3VyZXMgaG91cnNcbiAqIHRvIGRheXMgYW5kIGhhZCBhIHRocmVzaG9sZCBvZiB0d2VsdmUgaG91cnMgc2l0dGluZyBhYm92ZSBhIGNlaWxpbmcgb2YgZml2ZVxuICogbWludXRlcy5cbiAqXG4gKiBTbyBhIGhpc3RvZ3JhbSB3aG9zZSBuYXR1cmFsIHJhbmdlIGlzIG1pbnV0ZXMtdG8tZGF5cyBkZWNsYXJlcyBpdHMgYnVja2V0c1xuICogaGVyZSwgYW5kIEFMRVJUIFRIUkVTSE9MRFMgQVJFIFBVVCBPTiBCT1VOREFSSUVTOiBhIHRocmVzaG9sZCBpbnNpZGUgYSB3aWRlXG4gKiBidWNrZXQgaXMgc2VydmVkIGJ5IGxpbmVhciBpbnRlcnBvbGF0aW9uIGFjcm9zcyB0aGF0IGJ1Y2tldCwgd2hpY2ggaXMgYSBndWVzcyxcbiAqIHdoaWxlIGEgdGhyZXNob2xkIE9OIGEgYm91bmRhcnkgaXMgZXhhY3QuIEZvciBzdXBwb3J0IHRoYXQgbWVhbnMgNmggKHRoZSBhbGVydClcbiAqIGFuZCA4aCAodGhlIHNvbGQgdGFyZ2V0KSBhcmUgYm90aCBib3VuZGFyaWVzLCAyNGggaXMgdGhlIG9wZXJhdGlvbmFsIGd1YXJkXG4gKiBmcm9tIHRoZSBzdGFuZGFyZC9wcmlvcml0eSBydWxlLCBhbmQgOTZoIGNvdmVycyB0aGUgbG9uZ2VzdCBsZWdpdGltYXRlIHdhaXQgYVxuICogYnVzaW5lc3MtZGF5IHRhcmdldCBhbGxvd3Mg4oCUIGEgcHJpb3JpdHkgY2FzZSByYWlzZWQgYXQgMTc6MDEgb24gYSBGcmlkYXkuXG4gKlxuICogQWRkIGEgbWV0cmljIGhlcmUgd2hlbiBpdHMgb2JzZXJ2YXRpb25zIGNhbiBleGNlZWQgZml2ZSBtaW51dGVzLiBUaGUgdGFibGUgaXNcbiAqIHJlYWQgb24gRklSU1QgVVNFIG9mIGVhY2ggbmFtZSBieSBgY3JlYXRlTWV0cmljSGVscGVyc2AsIHNvIGJvdGggcmVnaXN0cmllc1xuICogKGFwaS1zZXJ2ZXIncyBhbmQgcGxhdGZvcm0ncyBvd24pIGdldCB0aGUgc2FtZSBkaXN0cmlidXRpb24sIHdoaWNoIGlzIHRoZVxuICogZHJpZnQgdGhlIGZhY3RvcnkgZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmNvbnN0IEhJU1RPR1JBTV9CVUNLRVRTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBudW1iZXJbXT4+ID0ge1xuICAvLyAxNW0sIDFoLCAyaCwgNGgsIDZoLCA4aCwgMTJoLCAyNGgsIDQ4aCwgOTZoLlxuICBzdXBwb3J0X2ZpcnN0X3Jlc3BvbnNlX3NlY29uZHM6IFs5MDAsIDM2MDAsIDcyMDAsIDE0NDAwLCAyMTYwMCwgMjg4MDAsIDQzMjAwLCA4NjQwMCwgMTcyODAwLCAzNDU2MDBdLFxuICAvLyBTdWJtaXNzaW9uLXRvLWRlY2lzaW9uIGxhdGVuY3kgaXMgYSBodW1hbiByZXZpZXcgcXVldWU6IGhvdXJzIHRvIGRheXMuXG4gIC8vIDE1bSwgMWgsIDRoLCAxMmgsIDFkLCAyZCwgNGQsIDdkLCAxNGQuXG4gIGVjb3N5c3RlbV9kZWNpc2lvbl9sYXRlbmN5X3NlY29uZHM6IFs5MDAsIDM2MDAsIDE0NDAwLCA0MzIwMCwgODY0MDAsIDE3MjgwMCwgMzQ1NjAwLCA2MDQ4MDAsIDEyMDk2MDBdLFxuICAvLyBRdWV1ZSB3YWl0LiBgUGx1Z2luUXVldWVQcm9jZXNzaW5nU2xvd2AgYXNzZXJ0cyBwOTUgPiAzMDAsIHdoaWNoIHRoZSBkZWZhdWx0XG4gIC8vIGNlaWxpbmcgb2YgMzAwIG1hZGUgdW5maXJlYWJsZTsgMzAwIGlzIGEgYm91bmRhcnkgaGVyZSBzbyB0aGUgY29tcGFyaXNvbiBpc1xuICAvLyBleGFjdCByYXRoZXIgdGhhbiBpbnRlcnBvbGF0ZWQuXG4gIHBsdWdpbl9qb2Jfd2FpdF9zZWNvbmRzOiBbMSwgNSwgMTUsIDMwLCA2MCwgMTIwLCAzMDAsIDYwMCwgMTgwMCwgMzYwMF0sXG4gIC8vIEEgY29udGFpbmVyIGJ1aWxkLiBNaW51dGVzIG5vcm1hbGx5LCBmYXIgbG9uZ2VyIGZvciBhIGNvbGQgYmFzZSBpbWFnZS5cbiAgcGx1Z2luX2J1aWxkX2R1cmF0aW9uX3NlY29uZHM6IFsxMCwgMzAsIDYwLCAxMjAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAzNjAwXSxcbiAgLy8gQSBmdWxsIGltYWdlIHNjYW4sIHdoaWNoIHJvdXRpbmVseSBwYXNzZXMgZml2ZSBtaW51dGVzIG9uIGEgbGFyZ2UgaW1hZ2UuXG4gIHBsdWdpbl92dWxuX3NjYW5fZHVyYXRpb25fc2Vjb25kczogWzEsIDUsIDE1LCAzMCwgNjAsIDEyMCwgMzAwLCA2MDAsIDEyMDBdLFxuICAvLyBUaW1lIGZyb20gYW4gaW5jaWRlbnQgYmVpbmcgcmFpc2VkIHRvIGEgaHVtYW4gYWNrbm93bGVkZ2luZyBpdC4gVGhlIGRlZmF1bHRcbiAgLy8gYnVja2V0cyBlbmQgYXQgMzAwcywgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZSBwYXN0IHRoZVxuICAvLyBsYXN0IGZpbml0ZSBib3VuZGFyeSDigJQgc28gd2l0aCB0aGVtLCBhbnkgdGhyZXNob2xkIGFib3ZlIGZpdmUgbWludXRlcyBjb3VsZFxuICAvLyBuZXZlciBmaXJlLCB3aGljaCBpcyBldmVyeSB0aHJlc2hvbGQgd29ydGggc2V0dGluZyBoZXJlLiBCb3VuZGFyaWVzIGF0IDFtLFxuICAvLyAybSwgNW0sIDEwbSwgMTVtLCAzMG0sIDFoLCAyaCwgNGg6IDE1bSBpcyBleGFjdCBiZWNhdXNlIHRoYXQgaXMgdGhlXG4gIC8vIGVzY2FsYXRpb24gZGVsYXkgdGhlIGFsZXJ0IGNvbXBhcmVzIGFnYWluc3QsIGFuZCB0aGUgcmFuZ2UgcmVhY2hlcyA0aCBzbyBhXG4gIC8vIHBhZ2Ugbm9ib2R5IGV2ZXIgcGlja2VkIHVwIGlzIHN0aWxsIGNvdW50ZWQgcmF0aGVyIHRoYW4gY2xpcHBlZC5cbiAgb25jYWxsX3BhZ2VfYWNrX3NlY29uZHM6IFs2MCwgMTIwLCAzMDAsIDYwMCwgOTAwLCAxODAwLCAzNjAwLCA3MjAwLCAxNDQwMF0sXG4gIC8vIENTQVQsIDEtNS4gTm90IGEgZHVyYXRpb24gYXQgYWxsLCBhbmQgbGlzdGVkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbiBhc1xuICAvLyB0aGUgb3RoZXJzOiB0aGUgZGVmYXVsdCBidWNrZXRzIGFyZSBzdWItc2Vjb25kLCBzbyBldmVyeSByYXRpbmcgd291bGQgbGFuZFxuICAvLyBpbiB0aGUgc2FtZSBidWNrZXQgYW5kIHRoZSBxdWFudGlsZSB3b3VsZCBiZSBtZWFuaW5nbGVzcy4gT25lIGJvdW5kYXJ5IHBlclxuICAvLyBwb3NzaWJsZSBzY29yZSBtYWtlcyBgX3N1bSAvIF9jb3VudGAgYW4gZXhhY3QgYXZlcmFnZSBhbmQgZWFjaCBidWNrZXQgYVxuICAvLyByZWFsIGNvdW50LiBJdCByaWRlcyB0aGUgaGlzdG9ncmFtIHJhdGhlciB0aGFuIGEgY291bnRlci1wZXItc2NvcmUgc28gdGhlXG4gIC8vIGF2ZXJhZ2UgbmVlZHMgbm8gUHJvbVFMIGFyaXRobWV0aWMgb3ZlciBmaXZlIHNlcmllcy5cbiAgc3VwcG9ydF9zYXRpc2ZhY3Rpb246IFsxLCAyLCAzLCA0LCA1XSxcbn07XG5cbi8qKiBUaGUgbGF6eSBidXNpbmVzcy1tZXRyaWMgaGVscGVycywgYm91bmQgdG8gb25lIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNIZWxwZXJzIHtcbiAgaW5jQ291bnRlcihuYW1lOiBzdHJpbmcsIGxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlPzogbnVtYmVyKTogdm9pZDtcbiAgb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG4gIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBgaW5jQ291bnRlcmAgLyBgb2JzZXJ2ZWAgLyBgc2V0R2F1Z2VgIG92ZXIgYSBjYWxsZXItc3VwcGxpZWQgcmVnaXN0cnkuXG4gKlxuICogVEhFIG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGF6eSBjb3VudGVyL2hpc3RvZ3JhbS9nYXVnZSBtYXBzLiBhcGktc2VydmVyJ3NcbiAqIG93biBleHBvcnRzIGJlbG93IGFyZSB0aGlzIGZhY3Rvcnkgb3ZlciBpdHMgbW9kdWxlLWxldmVsIGByZWdpc3RlcmA7IHRoZVxuICogcGxhdGZvcm0gc2VydmljZSDigJQgd2hpY2ggcnVucyBpdHMgb3duIEV4cHJlc3Mgc2V0dXAgaW5zdGVhZCBvZiBgY3JlYXRlQXBwYCxcbiAqIGFuZCB0aGVyZWZvcmUgb3ducyBhIGRpZmZlcmVudCByZWdpc3RyeSDigJQgYnVpbGRzIHRoZSBpZGVudGljYWwgaGVscGVycyBvdmVyXG4gKiBpdHMgb3duLiBXaXRob3V0IHRoZSBmYWN0b3J5IHRoZSB0d28gZHJpZnQ6IHRoZXkgZGlmZmVyIHRvZGF5IG9ubHkgaW4gdGhlXG4gKiBoaXN0b2dyYW0gYnVja2V0cywgd2hpY2ggaXMgZXhhY3RseSB0aGUga2luZCBvZiBkaWZmZXJlbmNlIG5vYm9keSBub3RpY2VzXG4gKiB1bnRpbCBhIGRhc2hib2FyZCByZWFkcyB3cm9uZyBvbiBvbmUgc2VydmljZS5cbiAqXG4gKiBgcmVnaXN0cnlgIG1heSBiZSBhIHRodW5rLCBmb3IgYSByZWdpc3RyeSB0aGF0IGlzIGluamVjdGVkIGFmdGVyIG1vZHVsZSBsb2FkXG4gKiAocGxhdGZvcm0gd2lyZXMgaXRzIG93biBvbiBhcHAgYm9vdCkuIFRoZSB0aHVuayBpcyBjYWxsZWQgb24gdGhlIEZJUlNUIHVzZSBvZlxuICogZWFjaCBtZXRyaWMgbmFtZSwgbmV2ZXIgYXQgaW1wb3J0IHRpbWUsIHNvIGJ1aWxkaW5nIHRoZSBoZWxwZXJzIGhhcyBubyBzaWRlXG4gKiBlZmZlY3Qgb2YgaXRzIG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldHJpY0hlbHBlcnMocmVnaXN0cnk6IFJlZ2lzdHJ5IHwgKCgpID0+IFJlZ2lzdHJ5KSk6IE1ldHJpY0hlbHBlcnMge1xuICBjb25zdCByZWdpc3RyeU9mID0gKCk6IFJlZ2lzdHJ5ID0+ICh0eXBlb2YgcmVnaXN0cnkgPT09ICdmdW5jdGlvbicgPyByZWdpc3RyeSgpIDogcmVnaXN0cnkpO1xuICBjb25zdCBjb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCBDb3VudGVyPHN0cmluZz4+KCk7XG4gIGNvbnN0IGhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSGlzdG9ncmFtPHN0cmluZz4+KCk7XG4gIGNvbnN0IGdhdWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBHYXVnZTxzdHJpbmc+PigpO1xuXG4gIHJldHVybiB7XG4gICAgaW5jQ291bnRlcihuYW1lLCBsYWJlbHMgPSB7fSwgdmFsdWUgPSAxKSB7XG4gICAgICBsZXQgY291bnRlciA9IGNvdW50ZXJzLmdldChuYW1lKTtcbiAgICAgIGlmICghY291bnRlcikge1xuICAgICAgICBjb3VudGVyID0gbmV3IENvdW50ZXIoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgICAgIGxhYmVsTmFtZXM6IE9iamVjdC5rZXlzKGxhYmVscyksXG4gICAgICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0cnlPZigpXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIuaW5jKGxhYmVscywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBvYnNlcnZlKG5hbWUsIGxhYmVscywgdmFsdWUpIHtcbiAgICAgIGxldCBoaXN0ID0gaGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWhpc3QpIHtcbiAgICAgICAgaGlzdCA9IG5ldyBIaXN0b2dyYW0oe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgICAgIGxhYmVsTmFtZXM6IE9iamVjdC5rZXlzKGxhYmVscyksXG4gICAgICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGVcbiAgICAgICAgICAvLyBvYnNlcnZhdGlvbnMuIEFueXRoaW5nIHRoYXQgY2FuIGV4Y2VlZCBmaXZlIG1pbnV0ZXMgTVVTVCBkZWNsYXJlIGl0c1xuICAgICAgICAgIC8vIG93biBkaXN0cmlidXRpb24gaW4gYEhJU1RPR1JBTV9CVUNLRVRTYCBhYm92ZSDigJQgcGFzdCB0aGUgbGFzdCBmaW5pdGVcbiAgICAgICAgICAvLyBib3VuZGFyeSBhIHF1YW50aWxlIHJlYWRzIGJhY2sgYXMgdGhhdCBib3VuZGFyeSwgc28gYSB0aHJlc2hvbGRcbiAgICAgICAgICAvLyBiZXlvbmQgaXQgbmV2ZXIgZmlyZXMuXG4gICAgICAgICAgYnVja2V0czogWy4uLihISVNUT0dSQU1fQlVDS0VUU1tuYW1lXSA/PyBbMC4wNSwgMC4xLCAwLjI1LCAwLjUsIDEsIDIuNSwgNSwgMTAsIDMwLCA2MCwgMTIwLCAzMDBdKV0sXG4gICAgICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0cnlPZigpXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGhpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICAgICAgfVxuICAgICAgaGlzdC5vYnNlcnZlKGxhYmVscywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBzZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKSB7XG4gICAgICBsZXQgZ2F1Z2UgPSBnYXVnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFnYXVnZSkge1xuICAgICAgICBnYXVnZSA9IG5ldyBHYXVnZSh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgICAgICByZWdpc3RlcnM6IFtyZWdpc3RyeU9mKCldLFxuICAgICAgICB9KTtcbiAgICAgICAgZ2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gICAgICB9XG4gICAgICBnYXVnZS5zZXQobGFiZWxzLCB2YWx1ZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFRoaXMgc2VydmljZSdzIG93biBoZWxwZXJzLCBvdmVyIHRoZSBzaGFyZWQgbW9kdWxlLWxldmVsIHJlZ2lzdHJ5LiAqL1xuY29uc3QgYnVzaW5lc3NNZXRyaWNzID0gY3JlYXRlTWV0cmljSGVscGVycyhyZWdpc3Rlcik7XG5cbi8qKlxuICogSW5jcmVtZW50IGEgYnVzaW5lc3MgY291bnRlciwgY3JlYXRpbmcgaXQgb24gZmlyc3QgdXNlLlxuICpcbiAqIEV2ZXJ5IGV4YW1wbGUgYmVsb3cgaXMgYSBjYWxsIHRoYXQgRVhJU1RTLCB3aXRoIHRoZSBsYWJlbHMgaXQgcmVhbGx5IHBhc3Nlcy4gVGhhdCBpc1xuICogZGVsaWJlcmF0ZTogYW4gaW52ZW50ZWQgZXhhbXBsZSByZWFkcyBhcyBhbiBpbnZlbnRvcnkgb2Ygd2hhdCB0aGUgc3lzdGVtIG1lYXN1cmVzLCBhbmRcbiAqIGEgbWV0cmljcyBzdXJ2ZXkgbGF0ZXIgY291bnRlZCB0aHJlZSBuYW1lcyBmcm9tIHRoaXMgYmxvY2sg4oCUIGBwaXBlbGluZXNfZ2VuZXJhdGVkX3RvdGFsYCxcbiAqIGBxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbGAsIGBjb21wbGlhbmNlX3Zpb2xhdGlvbnNfZm91bmRfdG90YWxgIOKAlCBhcyBsaXZlIG1ldHJpY3NcbiAqIG1pc3NpbmcgYSBkYXNoYm9hcmQgcGFuZWwuIE5vdGhpbmcgZW1pdHRlZCBhbnkgb2YgdGhlbS4gSWxsdXN0cmF0aXZlIG5hbWVzIGluIGEgZG9jc3RyaW5nXG4gKiBhYm91dCBtZXRyaWMgbmFtaW5nIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHJlYWwgb25lcywgc28gdGhlcmUgYXJlIG5vbmUgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW5jQ291bnRlcigncGx1Z2luX2J1aWxkc190b3RhbCcsIHsgc3RhdHVzOiAnc3VjY2VzcycsIG9yZ19pZDogb3JnSWQgfSk7XG4gKiBpbmNDb3VudGVyKCdjb21wbGlhbmNlX3NjYW5zX3RvdGFsJywgeyBvdXRjb21lOiAnc3RhcnRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdwbHVnaW5fdnVsbl9maW5kaW5nc190b3RhbCcsIHsgdHJpZ2dlciwgc2V2ZXJpdHkgfSwgY291bnQpO1xuICogaW5jQ291bnRlcignYWlfdG9rZW5zX3RvdGFsJywgeyByb3V0ZTogJ2FnZW50Jywga2luZDogJ2lucHV0JyB9LCBpbnB1dFRva2Vucyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5pbmNDb3VudGVyKG5hbWUsIGxhYmVscywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFJlY29yZCBhbiBvYnNlcnZhdGlvbiBvbiBhIGJ1c2luZXNzIGhpc3RvZ3JhbSwgY3JlYXRpbmcgaXQgb24gZmlyc3QgdXNlLlxuICogVXNlIGZvciBkdXJhdGlvbnMsIHNpemVzLCBhbnl0aGluZyB3aGVyZSBwZXJjZW50aWxlcyBtYXR0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG9ic2VydmUoJ2FpX2dlbmVyYXRpb25fZHVyYXRpb25fc2Vjb25kcycsIHsgcm91dGUsIHByb3ZpZGVyOiBwcm92aWRlckxhYmVsIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBvcmdfaWQ6IG9yZ0lkIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3Mub2JzZXJ2ZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5zZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaHVtYW5pemVOYW1lKG1ldHJpY05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBwbHVnaW5fYnVpbGRzX3RvdGFsYCDihpIgXCJQbHVnaW4gYnVpbGRzIHRvdGFsXCJcbiAgcmV0dXJuIG1ldHJpY05hbWVcbiAgICAucmVwbGFjZSgvXy9nLCAnICcpXG4gICAgLnJlcGxhY2UoL14uLywgKGMpID0+IGMudG9VcHBlckNhc2UoKSk7XG59XG4iXX0=
|
package/lib/api/write-pin.js
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
* when no read replica is configured, so a deploy with `DB_READ_HOST` unset —
|
|
51
51
|
* which is how all four targets ship — never touches Redis on the request path.
|
|
52
52
|
*/
|
|
53
|
-
import { createEnvRedisClient, createLogger, createRedisReadyGate, envInt, isReadReplicaConfigured } from '@pipeline-builder/api-core';
|
|
53
|
+
import { createEnvRedisClient, createLogger, createRedisReadyGate, emitCounter, envInt, isReadReplicaConfigured } from '@pipeline-builder/api-core';
|
|
54
54
|
const logger = createLogger('write-pin');
|
|
55
55
|
/**
|
|
56
56
|
* How long a write keeps its org on the primary.
|
|
@@ -115,6 +115,12 @@ export function createEnvRedisWritePinStore() {
|
|
|
115
115
|
return (await redis.exists(key(orgId))) === 1;
|
|
116
116
|
}
|
|
117
117
|
catch (err) {
|
|
118
|
+
// Counted under the same metric with a different `op`: this half is
|
|
119
|
+
// SAFE (it fails closed to the primary) but it runs on every request, so
|
|
120
|
+
// it is the half that actually reports Redis health — and a deployment
|
|
121
|
+
// silently serving every read from the primary has lost the whole
|
|
122
|
+
// benefit of the replica it is paying for.
|
|
123
|
+
emitCounter('postgres_write_pin_errors_total', { op: 'lookup' });
|
|
118
124
|
logger.warn('Write-pin lookup failed; routing reads to the primary', {
|
|
119
125
|
error: err instanceof Error ? err.message : String(err),
|
|
120
126
|
});
|
|
@@ -134,9 +140,27 @@ export function createEnvRedisWritePinStore() {
|
|
|
134
140
|
}
|
|
135
141
|
catch (err) {
|
|
136
142
|
// A failed pin is the dangerous direction — the NEXT request may read a
|
|
137
|
-
// stale replica
|
|
138
|
-
//
|
|
139
|
-
//
|
|
143
|
+
// stale replica and the user loses sight of their own write — but there
|
|
144
|
+
// is nothing useful to do about it here, and throwing would fail a
|
|
145
|
+
// request whose write already COMMITTED.
|
|
146
|
+
//
|
|
147
|
+
// Counted through api-core's `emitCounter` SEAM rather than api-server's
|
|
148
|
+
// own `incCounter`, although this file lives in api-server. Importing
|
|
149
|
+
// `./metrics.js` here puts it in the module graph of every service's
|
|
150
|
+
// request path, and it reads `Config.getAny('observability')` at module
|
|
151
|
+
// load — which broke api/message's index-wiring suite with
|
|
152
|
+
// `Config.getAny is not a function` the moment this import was added.
|
|
153
|
+
// The seam is a no-op until api-server's app factory calls
|
|
154
|
+
// `setCounterEmitter(incCounter)` at startup, so production counts and
|
|
155
|
+
// nothing else has to load the registry to do it.
|
|
156
|
+
//
|
|
157
|
+
// So it is counted as well as logged, and the counter is the point: the
|
|
158
|
+
// symptom is a row that is briefly missing, which no error rate and no
|
|
159
|
+
// log search will attribute back to here. `PostgresWritePinErrors` in
|
|
160
|
+
// the deploy alert rules watches it. The series is absent on every
|
|
161
|
+
// deploy that has not enabled read-splitting, which is correct — with no
|
|
162
|
+
// replica there is nothing to be stale.
|
|
163
|
+
emitCounter('postgres_write_pin_errors_total', { op: 'set' });
|
|
140
164
|
logger.warn('Failed to set the read-after-write pin; a subsequent read may hit a stale replica', {
|
|
141
165
|
orgId,
|
|
142
166
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -190,4 +214,4 @@ export function recordWriteForPin(scope) {
|
|
|
190
214
|
return;
|
|
191
215
|
void getWritePinStore().pin(scope.orgId);
|
|
192
216
|
}
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93cml0ZS1waW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNdkksTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXpDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsK0JBQStCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFckUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUM7QUE4QmpELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCO0lBQ3pDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN0QyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtDQUM3QixDQUFDO0FBRUYsSUFBSSxLQUFnQyxDQUFDO0FBRXJDLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBK0I7SUFDOUQsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLElBQUksQ0FBQyxLQUFLO1FBQUUsS0FBSyxHQUFHLDJCQUEyQixFQUFFLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEy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LEtBQW9CO0lBQ3RELElBQUksQ0FBQyx1QkFBdUIsRUFBRTtRQUFFLE9BQU87SUFDdkMsSUFBSSxLQUFLLENBQUMsY0FBYztRQUFFLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFDbEUsSUFBSSxNQUFNLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFBRSxLQUFLLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBb0I7SUFDcEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1FBQUUsT0FBTztJQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7UUFBRSxPQUFPO0lBQ2xDLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcmVxdWVzdCB3cml0ZSBwaW4g4oCUIHJlYWQtYWZ0ZXItd3JpdGUgZm9yIGEgdXNlcidzIE5FWFQgcmVxdWVzdC5cbiAqXG4gKiBUSEUgUFJPQkxFTSBUSElTIFNPTFZFUywgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlIGFuZCBub3QgYW4gZWRnZSBjYXNlOlxuICogYFBPU1QgL3BpcGVsaW5lc2AgcmV0dXJucywgdGhlIHBhZ2UgcmVsb2FkcywgYEdFVCAvcGlwZWxpbmVzYCBydW5zLiBUaGF0IEdFVFxuICogaXMgYSBkaWZmZXJlbnQgcmVxdWVzdCB3aXRoIG5vIG1lbW9yeSBvZiB0aGUgUE9TVCwgc28gd2l0aG91dCBzb21ldGhpbmdcbiAqIGNhcnJpZWQgYmV0d2VlbiB0aGVtIGl0IHJvdXRlcyB0byBhIHJlcGxpY2EgdGhhdCBtYXkgbm90IGhhdmUgcmVwbGF5ZWQgdGhlXG4gKiBjb21taXQsIGFuZCB0aGUgcGlwZWxpbmUgdGhlIHVzZXIganVzdCBjcmVhdGVkIGlzIHNpbXBseSBtaXNzaW5nLiBObyBlcnJvcixcbiAqIG5vIHJldHJ5LCBhbmQgbm90IHJlcHJvZHVjaWJsZSBvbiBkZW1hbmQuXG4gKlxuICogYHRlbmFuY3kudHNgIGFscmVhZHkgc29sdmVzIHRoZSBXSVRISU4tYS1yZXF1ZXN0IGhhbGY6IGB3aXRoVGVuYW50VHhgIHNldHNcbiAqIGBtYXlIYXZlV3JpdHRlbmAgb24gdGhlIHJlcXVlc3QncyB0ZW5hbnQgY29udGV4dCwgYW5kIHRoZSByZWFkIGhlbHBlciBrZWVwc1xuICogdGhhdCByZXF1ZXN0IG9uIHRoZSBwcmltYXJ5IGFmdGVyd2FyZHMuIFRoaXMgbW9kdWxlIGV4dGVuZHMgdGhlIHNhbWUgZmxhZ1xuICogQUNST1NTIHJlcXVlc3RzIGJ5IHJlbWVtYmVyaW5nLCBpbiBSZWRpcywgdGhhdCBhbiBvcmcgd3JvdGUgcmVjZW50bHkg4oCUIGFuZCBpdFxuICogc2V0cyB0aGUgdmVyeSBzYW1lIGBtYXlIYXZlV3JpdHRlbmAgZmxhZywgc28gdGhlcmUgaXMgb25lIG1lY2hhbmlzbSBhbmQgb25lXG4gKiBjb2RlIHBhdGgsIG5vdCB0d28uXG4gKlxuICogV0hZIFJFRElTIEFORCBOT1QgQU4gTFNOLiBUaGUgYWx0ZXJuYXRpdmUgaXMgZXhhY3Q6IGNhcHR1cmVcbiAqIGBwZ19jdXJyZW50X3dhbF9sc24oKWAgYXQgY29tbWl0LCBjYXJyeSBpdCB3aXRoIHRoZSBjbGllbnQsIGFuZCBoYXZlIHRoZSByZWFkXG4gKiBwYXRoIHdhaXQgZm9yIHRoZSBzdGFuZGJ5IHRvIHJlcGxheSBhdCBsZWFzdCB0aGF0IGZhci4gSXQgd2FzIHJlamVjdGVkIGZvclxuICogcmVhc29ucyB0aGF0IGFyZSBhYm91dCB0aGlzIHN5c3RlbSByYXRoZXIgdGhhbiBhYm91dCBlbGVnYW5jZTpcbiAqXG4gKiAgIDEuIFNoYXJlZCBzdGF0ZSBpcyBtYW5kYXRvcnkgYW55d2F5IOKAlCB0aGUgYXBwIHRpZXIgaXMgMiByZXBsaWNhcyB3aWRlIG9uXG4gKiAgICAgIGVrcywgc28gYW4gaW4tcHJvY2VzcyBtYXAgbWlzc2VzIGV2ZXJ5IHJlcXVlc3QgdGhhdCBsYW5kcyBvbiB0aGUgb3RoZXJcbiAqICAgICAgcG9kLiBMU04gdHJhY2tpbmcgYXZvaWRzIHNoYXJlZCBzdGF0ZSBvbmx5IGJ5IGNhcnJ5aW5nIHRoZSB2YWx1ZSBvbiB0aGVcbiAqICAgICAgQ0xJRU5ULCBhbmQgdGhpcyBwcm9kdWN0J3Mgb3duIHBpdGNoIGlzIGZpdmUgd2F5cyBpbiAoZGFzaGJvYXJkLCBDTEksXG4gKiAgICAgIFJFU1QsIENESywgQUkpLiBBIENMSSBvciBDREsgY2FsbGVyIHdpbGwgbm90IGVjaG8gYW4gTFNOIGJhY2ssIHNvIHRoYXRcbiAqICAgICAgYXBwcm9hY2ggZGVncmFkZXMgdG8gXCJwcmltYXJ5IGZvciBldmVyeSBub24tYnJvd3NlciBjbGllbnRcIiBvciBuZWVkc1xuICogICAgICBzZXJ2ZXItc2lkZSBzdG9yYWdlIOKAlCB3aGljaCBpcyB0aGlzLCB3aXRoIGV4dHJhIHN0ZXBzLlxuICogICAyLiBBIGNsaWVudC1zdXBwbGllZCBMU04gaXMgYXR0YWNrZXItY29udHJvbGxlZCBpbnB1dCwgYW5kIGFuIHVuYm91bmRlZFxuICogICAgICB3YWl0IG9uIGEgcmVwbGljYSB0aGF0IG5ldmVyIGNhdGNoZXMgdXAgdHVybnMgYSBib2d1cyB2YWx1ZSBpbnRvIGEgaGFuZy5cbiAqICAgICAgVGhhdCBpcyBhIGRlbmlhbCBvZiBzZXJ2aWNlIHdlYXJpbmcgYSBjb3JyZWN0bmVzcyBjb3N0dW1lLCBhbmQgYm91bmRpbmdcbiAqICAgICAgaXQgY29ycmVjdGx5IGlzIGEgc2Vjb25kIHNlY3VyaXR5IHN1cmZhY2UgdG8gZ2V0IHJpZ2h0LlxuICpcbiAqIFRoZSBwaW4gaXMgQ09BUlNFIGFuZCB0aGF0IGlzIHRoZSBhY2NlcHRlZCB0cmFkZTogaXQgaXMga2V5ZWQgcGVyIE9SRywgbm90XG4gKiBwZXIgdXNlciwgYmVjYXVzZSBhIHVzZXIgbWF5IHJlYWQgdGhyb3VnaCBhIGRpZmZlcmVudCBzZXNzaW9uIHRoYW4gdGhlIG9uZVxuICogdGhhdCB3cm90ZS4gU28gb25lIG1lbWJlcidzIHdyaXRlIGJyaWVmbHkgc2VuZHMgdGhlIHdob2xlIG9yZydzIHJlYWRzIHRvIHRoZVxuICogcHJpbWFyeS4gVGhhdCBjYW4gb25seSByZW1vdmUgYSBiZW5lZml0LCBuZXZlciBpbnRyb2R1Y2UgYSByZWdyZXNzaW9uIOKAlFxuICogcmVhZGluZyBmcm9tIHRoZSBwcmltYXJ5IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5zIHRvZGF5LlxuICpcbiAqIEZBSUwgQ0xPU0VELiBObyBSZWRpcyBjb25maWd1cmVkLCBhbiB1bnJlYWNoYWJsZSBSZWRpcywgb3IgYSBmYWlsZWQgcmVhZCBhbGxcbiAqIHJlc29sdmUgdG8gXCJhc3N1bWUgdGhpcyBvcmcgd3JvdGVcIiwgd2hpY2ggcm91dGVzIHJlYWRzIHRvIHRoZSBwcmltYXJ5LiBUaGF0XG4gKiBpcyB0aGUgc2FtZSBmYWlsLWNsb3NlZC13aXRob3V0LVJlZGlzIHBvc3R1cmUgdGhlIGxlYWRlciBsb2NrIHRha2VzLCBhbmQgaXRcbiAqIGlzIHRoZSBvbmx5IHNhZmUgZGlyZWN0aW9uOiBndWVzc2luZyBcIm5vIHJlY2VudCB3cml0ZVwiIHdoZW4gdGhlIGFuc3dlciBpc1xuICogdW5rbm93biBpcyBob3cgYSB1c2VyIGxvc2VzIHNpZ2h0IG9mIHRoZWlyIG93biBkYXRhLlxuICpcbiAqIENPU1RTIE5PVEhJTkcgVU5USUwgUkVBRC1TUExJVFRJTkcgSVMgT04uIEV2ZXJ5IGVudHJ5IHBvaW50IHNob3J0LWNpcmN1aXRzXG4gKiB3aGVuIG5vIHJlYWQgcmVwbGljYSBpcyBjb25maWd1cmVkLCBzbyBhIGRlcGxveSB3aXRoIGBEQl9SRUFEX0hPU1RgIHVuc2V0IOKAlFxuICogd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHMgc2hpcCDigJQgbmV2ZXIgdG91Y2hlcyBSZWRpcyBvbiB0aGUgcmVxdWVzdCBwYXRoLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50LCBjcmVhdGVMb2dnZXIsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCBlbnZJbnQsIGlzUmVhZFJlcGxpY2FDb25maWd1cmVkIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuLy8gVFlQRS1PTkxZLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlOiBhIHR5cGUgaW1wb3J0IGlzIGVyYXNlZCBhdCBjb21waWxlIHRpbWUsIHNvXG4vLyBpdCBuZXZlciB0b3VjaGVzIHBpcGVsaW5lLWRhdGEncyBgc3R1Yk1vZHVsZWAgYXQgcnVudGltZS4gQSBWQUxVRSBpbXBvcnQgaGVyZVxuLy8gdHVybmVkIGFsbCA5MSBzdWl0ZXMgdGhhdCBzdHViIHRoYXQgcGFja2FnZSBpbnRvIGEgNTAwLlxuaW1wb3J0IHR5cGUgeyBUZW5hbnRDb250ZXh0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignd3JpdGUtcGluJyk7XG5cbi8qKlxuICogSG93IGxvbmcgYSB3cml0ZSBrZWVwcyBpdHMgb3JnIG9uIHRoZSBwcmltYXJ5LlxuICpcbiAqIFNob3VsZCBzaXQgY29tZm9ydGFibHkgYWJvdmUgb2JzZXJ2ZWQgcDk5IHJlcGxpY2F0aW9uIGxhZy4gVGVuIHNlY29uZHMgaXNcbiAqIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3IgYSBkZWZhdWx0OiB0b28gc2hvcnQgc2lsZW50bHkgcmVpbnRyb2R1Y2VzIHRoZVxuICogbWlzc2luZy1yb3cgYnVnLCB3aGlsZSB0b28gbG9uZyBvbmx5IGNvc3RzIG9mZmxvYWQuIFRoZSBhc3ltbWV0cnkgc2F5cyB3aGljaFxuICogd2F5IHRvIGVyci5cbiAqL1xuY29uc3QgdHRsU2Vjb25kcyA9ICgpID0+IGVudkludCgnREJfUkVBRF9XUklURV9QSU5fVFRMX1NFQ09ORFMnLCAxMCk7XG5cbmNvbnN0IGtleSA9IChvcmdJZDogc3RyaW5nKSA9PiBgcnctcGluOiR7b3JnSWR9YDtcblxuLyoqXG4gKiBUaGUgdHdvIGlvcmVkaXMgY2FsbHMgdGhpcyBuZWVkcywgcGx1cyB0aGUgdGhyZWUgbWVtYmVyc1xuICogYGNyZWF0ZVJlZGlzUmVhZHlHYXRlYCByZWFkcy5cbiAqXG4gKiBEZWNsYXJlZCBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gYnkgZXh0ZW5kaW5nIGFwaS1jb3JlJ3MgYFJlYWR5QXdhcmVSZWRpc2AsXG4gKiB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGF0IHBhY2thZ2UgYW5kIG5vdCBwYXJ0IG9mIGl0cyBwdWJsaWMgc3VyZmFjZS4gVGhlXG4gKiByZWFkaW5lc3MgZ2F0ZSBpcyBub3Qgb3B0aW9uYWw6IHRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLCBzbyBhXG4gKiBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzIGlzIHJlamVjdGVkIG91dHJpZ2h0IOKAlFxuICogd2hpY2ggd291bGQgbWFrZSB0aGUgRklSU1QgcmVhZCBvZiBldmVyeSBwb2QgZmFpbCBjbG9zZWQgdG8gdGhlIHByaW1hcnkuXG4gKi9cbmludGVyZmFjZSBQaW5SZWRpcyB7XG4gIGV4aXN0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtb2RlOiAnRVgnLCB0dGw6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZVBpblN0b3JlIHtcbiAgLyoqXG4gICAqIEhhcyB0aGlzIG9yZyB3cml0dGVuIHJlY2VudGx5PyBSZXR1cm5zIFRSVUUgd2hlbiB0aGUgYW5zd2VyIGlzIHVua25vd25cbiAgICogKG5vIFJlZGlzLCB1bnJlYWNoYWJsZSwgcmVhZCBmYWlsZWQpIOKAlCBzZWUgRkFJTCBDTE9TRUQgYWJvdmUuXG4gICAqL1xuICBpc1Bpbm5lZChvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlY29yZCB0aGF0IHRoaXMgb3JnIGp1c3Qgd3JvdGUuIE5ldmVyIHRocm93cy4gKi9cbiAgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQSBzdG9yZSB0aGF0IHJlcG9ydHMgbm90aGluZyBwaW5uZWQg4oCUIGZvciB0ZXN0cyBhbmQgZm9yIHNpbmdsZS1wcm9jZXNzIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBOT19XUklURV9QSU46IFdyaXRlUGluU3RvcmUgPSB7XG4gIGlzUGlubmVkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpLFxuICBwaW46ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxubGV0IHN0b3JlOiBXcml0ZVBpblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKiogUmVwbGFjZSB0aGUgc3RvcmUuIEZvciB0ZXN0cywgYW5kIGZvciBhIHNlcnZpY2UgdGhhdCBvd25zIGl0cyBvd24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlUGluU3RvcmUobmV4dDogV3JpdGVQaW5TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBzdG9yZSA9IG5leHQ7XG59XG5cbi8qKlxuICogVGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSwgYnVpbHQgb24gZmlyc3QgdXNlIGZyb20gYFJFRElTX1VSTGAgL1xuICogYFJFRElTX1NFTlRJTkVMU2AgZXhhY3RseSBsaWtlIHRoZSBvdGhlciBlbnYtUmVkaXMgY29uc3VtZXJzIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZVBpblN0b3JlKCk6IFdyaXRlUGluU3RvcmUge1xuICBpZiAoIXN0b3JlKSBzdG9yZSA9IGNyZWF0ZUVudlJlZGlzV3JpdGVQaW5TdG9yZSgpO1xuICByZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1dyaXRlUGluU3RvcmUoKTogV3JpdGVQaW5TdG9yZSB7XG4gIC8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkIGFuZCB1bmF2YWlsYWJsZS5cbiAgbGV0IGNhY2hlZDogUGluUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVhZHk6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWVudCgpOiBQcm9taXNlPFBpblJlZGlzIHwgbnVsbD4ge1xuICAgIGlmIChjYWNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVkID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UGluUmVkaXM+KCd3cml0ZS1waW4nKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlZGlzIHdyaXRlLXBpbiBzdG9yZSBpbml0aWFsaXplZCcsIHsgdHRsU2Vjb25kczogdHRsU2Vjb25kcygpIH0pO1xuICAgICAgICByZWFkeSA9IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gT25seSB3b3J0aCBzYXlpbmcgd2hlbiBhIHJlcGxpY2EgYWN0dWFsbHkgZXhpc3RzOiB3aXRob3V0IG9uZSBldmVyeVxuICAgICAgICAvLyByZWFkIGdvZXMgdG8gdGhlIHByaW1hcnkgcmVnYXJkbGVzcyBhbmQgdGhlIHBpbiBpcyBpcnJlbGV2YW50LlxuICAgICAgICBsb2dnZXIud2FybignTm8gUmVkaXMgY29uZmlndXJlZCBmb3IgdGhlIHJlYWQtYWZ0ZXItd3JpdGUgcGluOyBldmVyeSByZWFkIHdpbGwgdXNlIHRoZSBwcmltYXJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSkgYXdhaXQgcmVhZHkoKTtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc1Bpbm5lZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm4gdHJ1ZTsgLy8gbm8gb3JnIHRvIGtleSBvbiAtPiBhc3N1bWUgd3JpdHRlblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIHRydWU7IC8vIGZhaWwgY2xvc2VkXG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVkaXMuZXhpc3RzKGtleShvcmdJZCkpKSA9PT0gMTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignV3JpdGUtcGluIGxvb2t1cCBmYWlsZWQ7IHJvdXRpbmcgcmVhZHMgdG8gdGhlIHByaW1hcnknLCB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBmYWlsIGNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW4ob3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgLy8gTm90aGluZyB0byBrZXkgb24sIHNvIG5vdGhpbmcgdG8gcGluLiBUaGUgcmVhZCBzaWRlIGZhaWxzIGNsb3NlZCBmb3JcbiAgICAgIC8vIHRoZSBzYW1lIHNjb3BlIGFueXdheS5cbiAgICAgIGlmICghb3JnSWQpIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZGlzID0gYXdhaXQgY2xpZW50KCk7XG4gICAgICAgIGlmICghcmVkaXMpIHJldHVybjtcbiAgICAgICAgYXdhaXQgcmVkaXMuc2V0KGtleShvcmdJZCksICcxJywgJ0VYJywgdHRsU2Vjb25kcygpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBIGZhaWxlZCBwaW4gaXMgdGhlIGRhbmdlcm91cyBkaXJlY3Rpb24g4oCUIHRoZSBORVhUIHJlcXVlc3QgbWF5IHJlYWQgYVxuICAgICAgICAvLyBzdGFsZSByZXBsaWNhIOKAlCBidXQgdGhlcmUgaXMgbm90aGluZyB1c2VmdWwgdG8gZG8gYWJvdXQgaXQgaGVyZSwgYW5kXG4gICAgICAgIC8vIHRocm93aW5nIHdvdWxkIGZhaWwgYSByZXF1ZXN0IHdob3NlIHdyaXRlIGFscmVhZHkgY29tbWl0dGVkLiBMb2cgaXRcbiAgICAgICAgLy8gbG91ZGx5OyBgcG9zdGdyZXNfd3JpdGVfcGluX2Vycm9yc190b3RhbGAgaXMgdGhlIHRoaW5nIHRvIGFsZXJ0IG9uLlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHNldCB0aGUgcmVhZC1hZnRlci13cml0ZSBwaW47IGEgc3Vic2VxdWVudCByZWFkIG1heSBoaXQgYSBzdGFsZSByZXBsaWNhJywge1xuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogSXMgdGhlIHBpbiBpbiBwbGF5IGF0IGFsbD9cbiAqXG4gKiBGYWxzZSB3aGVuZXZlciBubyByZWFkIHJlcGxpY2EgaXMgY29uZmlndXJlZCDigJQgd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHNcbiAqIHNoaXAuIFRoZSBtaWRkbGV3YXJlIHVzZXMgdGhpcyBhcyBhIGhhcmQgZ2F0ZSBzbyB0aGF0IHdpdGggbm8gcmVwbGljYSBpdCBkb2VzXG4gKiBub3QgcmVnaXN0ZXIgYSByZXNwb25zZSBsaXN0ZW5lciwgZG9lcyBub3QgdG91Y2ggUmVkaXMsIGFuZCBjYWxscyBgbmV4dCgpYFxuICogU1lOQ0hST05PVVNMWSwgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIGFueSBvZiB0aGlzIGV4aXN0ZWQuIE1ha2luZyB0aGVcbiAqIHJlcXVlc3QgcGF0aCBhc3luY2hyb25vdXMgZm9yIGEgZmVhdHVyZSBub2JvZHkgaGFzIGVuYWJsZWQgd291bGQgYmUgYVxuICogYmVoYXZpb3VyIGNoYW5nZSBwYWlkIGJ5IGV2ZXJ5IHJvdXRlIG9uIGV2ZXJ5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGluQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWFkUmVwbGljYUNvbmZpZ3VyZWQoKTtcbn1cblxuLyoqXG4gKiBCZWZvcmUgdGhlIHJlcXVlc3QgcnVuczogaWYgdGhpcyBvcmcgd3JvdGUgcmVjZW50bHksIHByZS1zZXQgdGhlIHNhbWVcbiAqIGBtYXlIYXZlV3JpdHRlbmAgZmxhZyBgd2l0aFRlbmFudFR4YCB3b3VsZCBoYXZlIHNldCwgc28gdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGUgcmVxdWVzdCBvbiB0aGUgcHJpbWFyeS5cbiAqXG4gKiBOby1vcHMgZW50aXJlbHkgd2hlbiBubyByZXBsaWNhIGlzIGNvbmZpZ3VyZWQg4oCUIHdoaWNoIGtlZXBzIFJlZGlzIG9mZiB0aGVcbiAqIHJlcXVlc3QgcGF0aCBmb3IgZXZlcnkgZGVwbG95IHRoYXQgaGFzIG5vdCBlbmFibGVkIHJlYWQtc3BsaXR0aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlXcml0ZVBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKHNjb3BlLm1heUhhdmVXcml0dGVuKSByZXR1cm47IC8vIGFscmVhZHkga25vd24gdG8gaGF2ZSB3cml0dGVuXG4gIGlmIChhd2FpdCBnZXRXcml0ZVBpblN0b3JlKCkuaXNQaW5uZWQoc2NvcGUub3JnSWQpKSBzY29wZS5tYXlIYXZlV3JpdHRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogQWZ0ZXIgdGhlIHJlc3BvbnNlOiBpZiBhbnl0aGluZyBpbiB0aGlzIHJlcXVlc3Qgb3BlbmVkIGEgcHJpbWFyeSB0cmFuc2FjdGlvbixcbiAqIHBpbiB0aGUgb3JnIHNvIGl0cyBuZXh0IHJlcXVlc3QgcmVhZHMgZnJvbSB0aGUgcHJpbWFyeSB0b28uXG4gKlxuICogUmVhZHMgYG1heUhhdmVXcml0dGVuYCByYXRoZXIgdGhhbiB0aGUgSFRUUCBtZXRob2Qgb24gcHVycG9zZS4gQSBQT1NUIHRoYXRcbiAqIG9ubHkgdmFsaWRhdGVzIGhhcyBub3RoaW5nIHRvIHBpbiBmb3IsIGFuZCDigJQgbW9yZSBpbXBvcnRhbnRseSDigJQgYSBHRVQgdGhhdFxuICogd3JpdGVzIChhIGxhenkgYmFja2ZpbGwsIGEgbGFzdC1zZWVuIHN0YW1wKSBhYnNvbHV0ZWx5IGRvZXMuIFRoZSBmbGFnIGZvbGxvd3NcbiAqIHdoYXQgYWN0dWFsbHkgdG91Y2hlZCB0aGUgcHJpbWFyeSwgd2hpY2ggdGhlIG1ldGhvZCBjYW5ub3QgdGVsbCB5b3UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRXcml0ZUZvclBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IHZvaWQge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKCFzY29wZS5tYXlIYXZlV3JpdHRlbikgcmV0dXJuO1xuICB2b2lkIGdldFdyaXRlUGluU3RvcmUoKS5waW4oc2NvcGUub3JnSWQpO1xufVxuIl19
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93cml0ZS1waW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXBKLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDO0FBOEJqRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFrQjtJQUN6QyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Q0FDN0IsQ0FBQztBQUVGLElBQUksS0FBZ0MsQ0FBQztBQUVyQyxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQStCO0lBQzlELEtBQUssR0FBRyxJQUFJLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixJQUFJLENBQUMsS0FBSztRQUFFLEtBQUssR0FBRywyQkFBMkIsRUFBRSxDQUFDO0lBQ2xELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsbUVBQW1FO0lBQ25FLElBQUksTUFBbUMsQ0FBQztJQUN4QyxJQUFJLEtBQXdDLENBQUM7SUFDN0MsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRW5CLEtBQUssVUFBVSxNQUFNO1FBQ25CLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxvQkFBb0IsQ0FBVyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2Qsc0VBQXNFO2dCQUN0RSxpRUFBaUU7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUZBQW1GLENBQUMsQ0FBQztZQUNuRyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksS0FBSztZQUFFLE1BQU0sS0FBSyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWE7WUFDMUIsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7WUFDOUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsY0FBYztnQkFDdkMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixvRUFBb0U7Z0JBQ3BFLHlFQUF5RTtnQkFDekUsdUVBQXVFO2dCQUN2RSxrRUFBa0U7Z0JBQ2xFLDJDQUEyQztnQkFDM0MsV0FBVyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUU7b0JBQ25FLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxjQUFjO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUF5QjtZQUNqQyx1RUFBdUU7WUFDdkUseUJBQXlCO1lBQ3pCLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU87WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU87Z0JBQ25CLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLHdFQUF3RTtnQkFDeEUsd0VBQXdFO2dCQUN4RSxtRUFBbUU7Z0JBQ25FLHlDQUF5QztnQkFDekMsRUFBRTtnQkFDRix5RUFBeUU7Z0JBQ3pFLHNFQUFzRTtnQkFDdEUscUVBQXFFO2dCQUNyRSx3RUFBd0U7Z0JBQ3hFLDJEQUEyRDtnQkFDM0Qsc0VBQXNFO2dCQUN0RSwyREFBMkQ7Z0JBQzNELHVFQUF1RTtnQkFDdkUsa0RBQWtEO2dCQUNsRCxFQUFFO2dCQUNGLHdFQUF3RTtnQkFDeEUsdUVBQXVFO2dCQUN2RSxzRUFBc0U7Z0JBQ3RFLG1FQUFtRTtnQkFDbkUseUVBQXlFO2dCQUN6RSx3Q0FBd0M7Z0JBQ3hDLFdBQVcsQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1GQUFtRixFQUFFO29CQUMvRixLQUFLO29CQUNMLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyx1QkFBdUIsRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsS0FBb0I7SUFDdEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1FBQUUsT0FBTztJQUN2QyxJQUFJLEtBQUssQ0FBQyxjQUFjO1FBQUUsT0FBTyxDQUFDLGdDQUFnQztJQUNsRSxJQUFJLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUFFLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ2xGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFvQjtJQUNwRCxJQUFJLENBQUMsdUJBQXVCLEVBQUU7UUFBRSxPQUFPO0lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztRQUFFLE9BQU87SUFDbEMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBjcm9zcy1yZXF1ZXN0IHdyaXRlIHBpbiDigJQgcmVhZC1hZnRlci13cml0ZSBmb3IgYSB1c2VyJ3MgTkVYVCByZXF1ZXN0LlxuICpcbiAqIFRIRSBQUk9CTEVNIFRISVMgU09MVkVTLCB3aGljaCBpcyB0aGUgY29tbW9uIGNhc2UgYW5kIG5vdCBhbiBlZGdlIGNhc2U6XG4gKiBgUE9TVCAvcGlwZWxpbmVzYCByZXR1cm5zLCB0aGUgcGFnZSByZWxvYWRzLCBgR0VUIC9waXBlbGluZXNgIHJ1bnMuIFRoYXQgR0VUXG4gKiBpcyBhIGRpZmZlcmVudCByZXF1ZXN0IHdpdGggbm8gbWVtb3J5IG9mIHRoZSBQT1NULCBzbyB3aXRob3V0IHNvbWV0aGluZ1xuICogY2FycmllZCBiZXR3ZWVuIHRoZW0gaXQgcm91dGVzIHRvIGEgcmVwbGljYSB0aGF0IG1heSBub3QgaGF2ZSByZXBsYXllZCB0aGVcbiAqIGNvbW1pdCwgYW5kIHRoZSBwaXBlbGluZSB0aGUgdXNlciBqdXN0IGNyZWF0ZWQgaXMgc2ltcGx5IG1pc3NpbmcuIE5vIGVycm9yLFxuICogbm8gcmV0cnksIGFuZCBub3QgcmVwcm9kdWNpYmxlIG9uIGRlbWFuZC5cbiAqXG4gKiBgdGVuYW5jeS50c2AgYWxyZWFkeSBzb2x2ZXMgdGhlIFdJVEhJTi1hLXJlcXVlc3QgaGFsZjogYHdpdGhUZW5hbnRUeGAgc2V0c1xuICogYG1heUhhdmVXcml0dGVuYCBvbiB0aGUgcmVxdWVzdCdzIHRlbmFudCBjb250ZXh0LCBhbmQgdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGF0IHJlcXVlc3Qgb24gdGhlIHByaW1hcnkgYWZ0ZXJ3YXJkcy4gVGhpcyBtb2R1bGUgZXh0ZW5kcyB0aGUgc2FtZSBmbGFnXG4gKiBBQ1JPU1MgcmVxdWVzdHMgYnkgcmVtZW1iZXJpbmcsIGluIFJlZGlzLCB0aGF0IGFuIG9yZyB3cm90ZSByZWNlbnRseSDigJQgYW5kIGl0XG4gKiBzZXRzIHRoZSB2ZXJ5IHNhbWUgYG1heUhhdmVXcml0dGVuYCBmbGFnLCBzbyB0aGVyZSBpcyBvbmUgbWVjaGFuaXNtIGFuZCBvbmVcbiAqIGNvZGUgcGF0aCwgbm90IHR3by5cbiAqXG4gKiBXSFkgUkVESVMgQU5EIE5PVCBBTiBMU04uIFRoZSBhbHRlcm5hdGl2ZSBpcyBleGFjdDogY2FwdHVyZVxuICogYHBnX2N1cnJlbnRfd2FsX2xzbigpYCBhdCBjb21taXQsIGNhcnJ5IGl0IHdpdGggdGhlIGNsaWVudCwgYW5kIGhhdmUgdGhlIHJlYWRcbiAqIHBhdGggd2FpdCBmb3IgdGhlIHN0YW5kYnkgdG8gcmVwbGF5IGF0IGxlYXN0IHRoYXQgZmFyLiBJdCB3YXMgcmVqZWN0ZWQgZm9yXG4gKiByZWFzb25zIHRoYXQgYXJlIGFib3V0IHRoaXMgc3lzdGVtIHJhdGhlciB0aGFuIGFib3V0IGVsZWdhbmNlOlxuICpcbiAqICAgMS4gU2hhcmVkIHN0YXRlIGlzIG1hbmRhdG9yeSBhbnl3YXkg4oCUIHRoZSBhcHAgdGllciBpcyAyIHJlcGxpY2FzIHdpZGUgb25cbiAqICAgICAgZWtzLCBzbyBhbiBpbi1wcm9jZXNzIG1hcCBtaXNzZXMgZXZlcnkgcmVxdWVzdCB0aGF0IGxhbmRzIG9uIHRoZSBvdGhlclxuICogICAgICBwb2QuIExTTiB0cmFja2luZyBhdm9pZHMgc2hhcmVkIHN0YXRlIG9ubHkgYnkgY2FycnlpbmcgdGhlIHZhbHVlIG9uIHRoZVxuICogICAgICBDTElFTlQsIGFuZCB0aGlzIHByb2R1Y3QncyBvd24gcGl0Y2ggaXMgZml2ZSB3YXlzIGluIChkYXNoYm9hcmQsIENMSSxcbiAqICAgICAgUkVTVCwgQ0RLLCBBSSkuIEEgQ0xJIG9yIENESyBjYWxsZXIgd2lsbCBub3QgZWNobyBhbiBMU04gYmFjaywgc28gdGhhdFxuICogICAgICBhcHByb2FjaCBkZWdyYWRlcyB0byBcInByaW1hcnkgZm9yIGV2ZXJ5IG5vbi1icm93c2VyIGNsaWVudFwiIG9yIG5lZWRzXG4gKiAgICAgIHNlcnZlci1zaWRlIHN0b3JhZ2Ug4oCUIHdoaWNoIGlzIHRoaXMsIHdpdGggZXh0cmEgc3RlcHMuXG4gKiAgIDIuIEEgY2xpZW50LXN1cHBsaWVkIExTTiBpcyBhdHRhY2tlci1jb250cm9sbGVkIGlucHV0LCBhbmQgYW4gdW5ib3VuZGVkXG4gKiAgICAgIHdhaXQgb24gYSByZXBsaWNhIHRoYXQgbmV2ZXIgY2F0Y2hlcyB1cCB0dXJucyBhIGJvZ3VzIHZhbHVlIGludG8gYSBoYW5nLlxuICogICAgICBUaGF0IGlzIGEgZGVuaWFsIG9mIHNlcnZpY2Ugd2VhcmluZyBhIGNvcnJlY3RuZXNzIGNvc3R1bWUsIGFuZCBib3VuZGluZ1xuICogICAgICBpdCBjb3JyZWN0bHkgaXMgYSBzZWNvbmQgc2VjdXJpdHkgc3VyZmFjZSB0byBnZXQgcmlnaHQuXG4gKlxuICogVGhlIHBpbiBpcyBDT0FSU0UgYW5kIHRoYXQgaXMgdGhlIGFjY2VwdGVkIHRyYWRlOiBpdCBpcyBrZXllZCBwZXIgT1JHLCBub3RcbiAqIHBlciB1c2VyLCBiZWNhdXNlIGEgdXNlciBtYXkgcmVhZCB0aHJvdWdoIGEgZGlmZmVyZW50IHNlc3Npb24gdGhhbiB0aGUgb25lXG4gKiB0aGF0IHdyb3RlLiBTbyBvbmUgbWVtYmVyJ3Mgd3JpdGUgYnJpZWZseSBzZW5kcyB0aGUgd2hvbGUgb3JnJ3MgcmVhZHMgdG8gdGhlXG4gKiBwcmltYXJ5LiBUaGF0IGNhbiBvbmx5IHJlbW92ZSBhIGJlbmVmaXQsIG5ldmVyIGludHJvZHVjZSBhIHJlZ3Jlc3Npb24g4oCUXG4gKiByZWFkaW5nIGZyb20gdGhlIHByaW1hcnkgaXMgZXhhY3RseSB3aGF0IGhhcHBlbnMgdG9kYXkuXG4gKlxuICogRkFJTCBDTE9TRUQuIE5vIFJlZGlzIGNvbmZpZ3VyZWQsIGFuIHVucmVhY2hhYmxlIFJlZGlzLCBvciBhIGZhaWxlZCByZWFkIGFsbFxuICogcmVzb2x2ZSB0byBcImFzc3VtZSB0aGlzIG9yZyB3cm90ZVwiLCB3aGljaCByb3V0ZXMgcmVhZHMgdG8gdGhlIHByaW1hcnkuIFRoYXRcbiAqIGlzIHRoZSBzYW1lIGZhaWwtY2xvc2VkLXdpdGhvdXQtUmVkaXMgcG9zdHVyZSB0aGUgbGVhZGVyIGxvY2sgdGFrZXMsIGFuZCBpdFxuICogaXMgdGhlIG9ubHkgc2FmZSBkaXJlY3Rpb246IGd1ZXNzaW5nIFwibm8gcmVjZW50IHdyaXRlXCIgd2hlbiB0aGUgYW5zd2VyIGlzXG4gKiB1bmtub3duIGlzIGhvdyBhIHVzZXIgbG9zZXMgc2lnaHQgb2YgdGhlaXIgb3duIGRhdGEuXG4gKlxuICogQ09TVFMgTk9USElORyBVTlRJTCBSRUFELVNQTElUVElORyBJUyBPTi4gRXZlcnkgZW50cnkgcG9pbnQgc2hvcnQtY2lyY3VpdHNcbiAqIHdoZW4gbm8gcmVhZCByZXBsaWNhIGlzIGNvbmZpZ3VyZWQsIHNvIGEgZGVwbG95IHdpdGggYERCX1JFQURfSE9TVGAgdW5zZXQg4oCUXG4gKiB3aGljaCBpcyBob3cgYWxsIGZvdXIgdGFyZ2V0cyBzaGlwIOKAlCBuZXZlciB0b3VjaGVzIFJlZGlzIG9uIHRoZSByZXF1ZXN0IHBhdGguXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZUxvZ2dlciwgY3JlYXRlUmVkaXNSZWFkeUdhdGUsIGVtaXRDb3VudGVyLCBlbnZJbnQsIGlzUmVhZFJlcGxpY2FDb25maWd1cmVkIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuLy8gVFlQRS1PTkxZLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlOiBhIHR5cGUgaW1wb3J0IGlzIGVyYXNlZCBhdCBjb21waWxlIHRpbWUsIHNvXG4vLyBpdCBuZXZlciB0b3VjaGVzIHBpcGVsaW5lLWRhdGEncyBgc3R1Yk1vZHVsZWAgYXQgcnVudGltZS4gQSBWQUxVRSBpbXBvcnQgaGVyZVxuLy8gdHVybmVkIGFsbCA5MSBzdWl0ZXMgdGhhdCBzdHViIHRoYXQgcGFja2FnZSBpbnRvIGEgNTAwLlxuaW1wb3J0IHR5cGUgeyBUZW5hbnRDb250ZXh0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignd3JpdGUtcGluJyk7XG5cbi8qKlxuICogSG93IGxvbmcgYSB3cml0ZSBrZWVwcyBpdHMgb3JnIG9uIHRoZSBwcmltYXJ5LlxuICpcbiAqIFNob3VsZCBzaXQgY29tZm9ydGFibHkgYWJvdmUgb2JzZXJ2ZWQgcDk5IHJlcGxpY2F0aW9uIGxhZy4gVGVuIHNlY29uZHMgaXNcbiAqIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3IgYSBkZWZhdWx0OiB0b28gc2hvcnQgc2lsZW50bHkgcmVpbnRyb2R1Y2VzIHRoZVxuICogbWlzc2luZy1yb3cgYnVnLCB3aGlsZSB0b28gbG9uZyBvbmx5IGNvc3RzIG9mZmxvYWQuIFRoZSBhc3ltbWV0cnkgc2F5cyB3aGljaFxuICogd2F5IHRvIGVyci5cbiAqL1xuY29uc3QgdHRsU2Vjb25kcyA9ICgpID0+IGVudkludCgnREJfUkVBRF9XUklURV9QSU5fVFRMX1NFQ09ORFMnLCAxMCk7XG5cbmNvbnN0IGtleSA9IChvcmdJZDogc3RyaW5nKSA9PiBgcnctcGluOiR7b3JnSWR9YDtcblxuLyoqXG4gKiBUaGUgdHdvIGlvcmVkaXMgY2FsbHMgdGhpcyBuZWVkcywgcGx1cyB0aGUgdGhyZWUgbWVtYmVyc1xuICogYGNyZWF0ZVJlZGlzUmVhZHlHYXRlYCByZWFkcy5cbiAqXG4gKiBEZWNsYXJlZCBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gYnkgZXh0ZW5kaW5nIGFwaS1jb3JlJ3MgYFJlYWR5QXdhcmVSZWRpc2AsXG4gKiB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGF0IHBhY2thZ2UgYW5kIG5vdCBwYXJ0IG9mIGl0cyBwdWJsaWMgc3VyZmFjZS4gVGhlXG4gKiByZWFkaW5lc3MgZ2F0ZSBpcyBub3Qgb3B0aW9uYWw6IHRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLCBzbyBhXG4gKiBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzIGlzIHJlamVjdGVkIG91dHJpZ2h0IOKAlFxuICogd2hpY2ggd291bGQgbWFrZSB0aGUgRklSU1QgcmVhZCBvZiBldmVyeSBwb2QgZmFpbCBjbG9zZWQgdG8gdGhlIHByaW1hcnkuXG4gKi9cbmludGVyZmFjZSBQaW5SZWRpcyB7XG4gIGV4aXN0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtb2RlOiAnRVgnLCB0dGw6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZVBpblN0b3JlIHtcbiAgLyoqXG4gICAqIEhhcyB0aGlzIG9yZyB3cml0dGVuIHJlY2VudGx5PyBSZXR1cm5zIFRSVUUgd2hlbiB0aGUgYW5zd2VyIGlzIHVua25vd25cbiAgICogKG5vIFJlZGlzLCB1bnJlYWNoYWJsZSwgcmVhZCBmYWlsZWQpIOKAlCBzZWUgRkFJTCBDTE9TRUQgYWJvdmUuXG4gICAqL1xuICBpc1Bpbm5lZChvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlY29yZCB0aGF0IHRoaXMgb3JnIGp1c3Qgd3JvdGUuIE5ldmVyIHRocm93cy4gKi9cbiAgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQSBzdG9yZSB0aGF0IHJlcG9ydHMgbm90aGluZyBwaW5uZWQg4oCUIGZvciB0ZXN0cyBhbmQgZm9yIHNpbmdsZS1wcm9jZXNzIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBOT19XUklURV9QSU46IFdyaXRlUGluU3RvcmUgPSB7XG4gIGlzUGlubmVkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpLFxuICBwaW46ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxubGV0IHN0b3JlOiBXcml0ZVBpblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKiogUmVwbGFjZSB0aGUgc3RvcmUuIEZvciB0ZXN0cywgYW5kIGZvciBhIHNlcnZpY2UgdGhhdCBvd25zIGl0cyBvd24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlUGluU3RvcmUobmV4dDogV3JpdGVQaW5TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBzdG9yZSA9IG5leHQ7XG59XG5cbi8qKlxuICogVGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSwgYnVpbHQgb24gZmlyc3QgdXNlIGZyb20gYFJFRElTX1VSTGAgL1xuICogYFJFRElTX1NFTlRJTkVMU2AgZXhhY3RseSBsaWtlIHRoZSBvdGhlciBlbnYtUmVkaXMgY29uc3VtZXJzIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZVBpblN0b3JlKCk6IFdyaXRlUGluU3RvcmUge1xuICBpZiAoIXN0b3JlKSBzdG9yZSA9IGNyZWF0ZUVudlJlZGlzV3JpdGVQaW5TdG9yZSgpO1xuICByZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1dyaXRlUGluU3RvcmUoKTogV3JpdGVQaW5TdG9yZSB7XG4gIC8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkIGFuZCB1bmF2YWlsYWJsZS5cbiAgbGV0IGNhY2hlZDogUGluUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVhZHk6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWVudCgpOiBQcm9taXNlPFBpblJlZGlzIHwgbnVsbD4ge1xuICAgIGlmIChjYWNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVkID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UGluUmVkaXM+KCd3cml0ZS1waW4nKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlZGlzIHdyaXRlLXBpbiBzdG9yZSBpbml0aWFsaXplZCcsIHsgdHRsU2Vjb25kczogdHRsU2Vjb25kcygpIH0pO1xuICAgICAgICByZWFkeSA9IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gT25seSB3b3J0aCBzYXlpbmcgd2hlbiBhIHJlcGxpY2EgYWN0dWFsbHkgZXhpc3RzOiB3aXRob3V0IG9uZSBldmVyeVxuICAgICAgICAvLyByZWFkIGdvZXMgdG8gdGhlIHByaW1hcnkgcmVnYXJkbGVzcyBhbmQgdGhlIHBpbiBpcyBpcnJlbGV2YW50LlxuICAgICAgICBsb2dnZXIud2FybignTm8gUmVkaXMgY29uZmlndXJlZCBmb3IgdGhlIHJlYWQtYWZ0ZXItd3JpdGUgcGluOyBldmVyeSByZWFkIHdpbGwgdXNlIHRoZSBwcmltYXJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSkgYXdhaXQgcmVhZHkoKTtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc1Bpbm5lZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm4gdHJ1ZTsgLy8gbm8gb3JnIHRvIGtleSBvbiAtPiBhc3N1bWUgd3JpdHRlblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIHRydWU7IC8vIGZhaWwgY2xvc2VkXG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVkaXMuZXhpc3RzKGtleShvcmdJZCkpKSA9PT0gMTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBDb3VudGVkIHVuZGVyIHRoZSBzYW1lIG1ldHJpYyB3aXRoIGEgZGlmZmVyZW50IGBvcGA6IHRoaXMgaGFsZiBpc1xuICAgICAgICAvLyBTQUZFIChpdCBmYWlscyBjbG9zZWQgdG8gdGhlIHByaW1hcnkpIGJ1dCBpdCBydW5zIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvXG4gICAgICAgIC8vIGl0IGlzIHRoZSBoYWxmIHRoYXQgYWN0dWFsbHkgcmVwb3J0cyBSZWRpcyBoZWFsdGgg4oCUIGFuZCBhIGRlcGxveW1lbnRcbiAgICAgICAgLy8gc2lsZW50bHkgc2VydmluZyBldmVyeSByZWFkIGZyb20gdGhlIHByaW1hcnkgaGFzIGxvc3QgdGhlIHdob2xlXG4gICAgICAgIC8vIGJlbmVmaXQgb2YgdGhlIHJlcGxpY2EgaXQgaXMgcGF5aW5nIGZvci5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3Bvc3RncmVzX3dyaXRlX3Bpbl9lcnJvcnNfdG90YWwnLCB7IG9wOiAnbG9va3VwJyB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1dyaXRlLXBpbiBsb29rdXAgZmFpbGVkOyByb3V0aW5nIHJlYWRzIHRvIHRoZSBwcmltYXJ5Jywge1xuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZmFpbCBjbG9zZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIC8vIE5vdGhpbmcgdG8ga2V5IG9uLCBzbyBub3RoaW5nIHRvIHBpbi4gVGhlIHJlYWQgc2lkZSBmYWlscyBjbG9zZWQgZm9yXG4gICAgICAvLyB0aGUgc2FtZSBzY29wZSBhbnl3YXkuXG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWRpcyA9IGF3YWl0IGNsaWVudCgpO1xuICAgICAgICBpZiAoIXJlZGlzKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChrZXkob3JnSWQpLCAnMScsICdFWCcsIHR0bFNlY29uZHMoKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcGluIGlzIHRoZSBkYW5nZXJvdXMgZGlyZWN0aW9uIOKAlCB0aGUgTkVYVCByZXF1ZXN0IG1heSByZWFkIGFcbiAgICAgICAgLy8gc3RhbGUgcmVwbGljYSBhbmQgdGhlIHVzZXIgbG9zZXMgc2lnaHQgb2YgdGhlaXIgb3duIHdyaXRlIOKAlCBidXQgdGhlcmVcbiAgICAgICAgLy8gaXMgbm90aGluZyB1c2VmdWwgdG8gZG8gYWJvdXQgaXQgaGVyZSwgYW5kIHRocm93aW5nIHdvdWxkIGZhaWwgYVxuICAgICAgICAvLyByZXF1ZXN0IHdob3NlIHdyaXRlIGFscmVhZHkgQ09NTUlUVEVELlxuICAgICAgICAvL1xuICAgICAgICAvLyBDb3VudGVkIHRocm91Z2ggYXBpLWNvcmUncyBgZW1pdENvdW50ZXJgIFNFQU0gcmF0aGVyIHRoYW4gYXBpLXNlcnZlcidzXG4gICAgICAgIC8vIG93biBgaW5jQ291bnRlcmAsIGFsdGhvdWdoIHRoaXMgZmlsZSBsaXZlcyBpbiBhcGktc2VydmVyLiBJbXBvcnRpbmdcbiAgICAgICAgLy8gYC4vbWV0cmljcy5qc2AgaGVyZSBwdXRzIGl0IGluIHRoZSBtb2R1bGUgZ3JhcGggb2YgZXZlcnkgc2VydmljZSdzXG4gICAgICAgIC8vIHJlcXVlc3QgcGF0aCwgYW5kIGl0IHJlYWRzIGBDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JylgIGF0IG1vZHVsZVxuICAgICAgICAvLyBsb2FkIOKAlCB3aGljaCBicm9rZSBhcGkvbWVzc2FnZSdzIGluZGV4LXdpcmluZyBzdWl0ZSB3aXRoXG4gICAgICAgIC8vIGBDb25maWcuZ2V0QW55IGlzIG5vdCBhIGZ1bmN0aW9uYCB0aGUgbW9tZW50IHRoaXMgaW1wb3J0IHdhcyBhZGRlZC5cbiAgICAgICAgLy8gVGhlIHNlYW0gaXMgYSBuby1vcCB1bnRpbCBhcGktc2VydmVyJ3MgYXBwIGZhY3RvcnkgY2FsbHNcbiAgICAgICAgLy8gYHNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpYCBhdCBzdGFydHVwLCBzbyBwcm9kdWN0aW9uIGNvdW50cyBhbmRcbiAgICAgICAgLy8gbm90aGluZyBlbHNlIGhhcyB0byBsb2FkIHRoZSByZWdpc3RyeSB0byBkbyBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU28gaXQgaXMgY291bnRlZCBhcyB3ZWxsIGFzIGxvZ2dlZCwgYW5kIHRoZSBjb3VudGVyIGlzIHRoZSBwb2ludDogdGhlXG4gICAgICAgIC8vIHN5bXB0b20gaXMgYSByb3cgdGhhdCBpcyBicmllZmx5IG1pc3NpbmcsIHdoaWNoIG5vIGVycm9yIHJhdGUgYW5kIG5vXG4gICAgICAgIC8vIGxvZyBzZWFyY2ggd2lsbCBhdHRyaWJ1dGUgYmFjayB0byBoZXJlLiBgUG9zdGdyZXNXcml0ZVBpbkVycm9yc2AgaW5cbiAgICAgICAgLy8gdGhlIGRlcGxveSBhbGVydCBydWxlcyB3YXRjaGVzIGl0LiBUaGUgc2VyaWVzIGlzIGFic2VudCBvbiBldmVyeVxuICAgICAgICAvLyBkZXBsb3kgdGhhdCBoYXMgbm90IGVuYWJsZWQgcmVhZC1zcGxpdHRpbmcsIHdoaWNoIGlzIGNvcnJlY3Qg4oCUIHdpdGggbm9cbiAgICAgICAgLy8gcmVwbGljYSB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIHN0YWxlLlxuICAgICAgICBlbWl0Q291bnRlcigncG9zdGdyZXNfd3JpdGVfcGluX2Vycm9yc190b3RhbCcsIHsgb3A6ICdzZXQnIH0pO1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHNldCB0aGUgcmVhZC1hZnRlci13cml0ZSBwaW47IGEgc3Vic2VxdWVudCByZWFkIG1heSBoaXQgYSBzdGFsZSByZXBsaWNhJywge1xuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogSXMgdGhlIHBpbiBpbiBwbGF5IGF0IGFsbD9cbiAqXG4gKiBGYWxzZSB3aGVuZXZlciBubyByZWFkIHJlcGxpY2EgaXMgY29uZmlndXJlZCDigJQgd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHNcbiAqIHNoaXAuIFRoZSBtaWRkbGV3YXJlIHVzZXMgdGhpcyBhcyBhIGhhcmQgZ2F0ZSBzbyB0aGF0IHdpdGggbm8gcmVwbGljYSBpdCBkb2VzXG4gKiBub3QgcmVnaXN0ZXIgYSByZXNwb25zZSBsaXN0ZW5lciwgZG9lcyBub3QgdG91Y2ggUmVkaXMsIGFuZCBjYWxscyBgbmV4dCgpYFxuICogU1lOQ0hST05PVVNMWSwgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIGFueSBvZiB0aGlzIGV4aXN0ZWQuIE1ha2luZyB0aGVcbiAqIHJlcXVlc3QgcGF0aCBhc3luY2hyb25vdXMgZm9yIGEgZmVhdHVyZSBub2JvZHkgaGFzIGVuYWJsZWQgd291bGQgYmUgYVxuICogYmVoYXZpb3VyIGNoYW5nZSBwYWlkIGJ5IGV2ZXJ5IHJvdXRlIG9uIGV2ZXJ5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGluQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWFkUmVwbGljYUNvbmZpZ3VyZWQoKTtcbn1cblxuLyoqXG4gKiBCZWZvcmUgdGhlIHJlcXVlc3QgcnVuczogaWYgdGhpcyBvcmcgd3JvdGUgcmVjZW50bHksIHByZS1zZXQgdGhlIHNhbWVcbiAqIGBtYXlIYXZlV3JpdHRlbmAgZmxhZyBgd2l0aFRlbmFudFR4YCB3b3VsZCBoYXZlIHNldCwgc28gdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGUgcmVxdWVzdCBvbiB0aGUgcHJpbWFyeS5cbiAqXG4gKiBOby1vcHMgZW50aXJlbHkgd2hlbiBubyByZXBsaWNhIGlzIGNvbmZpZ3VyZWQg4oCUIHdoaWNoIGtlZXBzIFJlZGlzIG9mZiB0aGVcbiAqIHJlcXVlc3QgcGF0aCBmb3IgZXZlcnkgZGVwbG95IHRoYXQgaGFzIG5vdCBlbmFibGVkIHJlYWQtc3BsaXR0aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlXcml0ZVBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKHNjb3BlLm1heUhhdmVXcml0dGVuKSByZXR1cm47IC8vIGFscmVhZHkga25vd24gdG8gaGF2ZSB3cml0dGVuXG4gIGlmIChhd2FpdCBnZXRXcml0ZVBpblN0b3JlKCkuaXNQaW5uZWQoc2NvcGUub3JnSWQpKSBzY29wZS5tYXlIYXZlV3JpdHRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogQWZ0ZXIgdGhlIHJlc3BvbnNlOiBpZiBhbnl0aGluZyBpbiB0aGlzIHJlcXVlc3Qgb3BlbmVkIGEgcHJpbWFyeSB0cmFuc2FjdGlvbixcbiAqIHBpbiB0aGUgb3JnIHNvIGl0cyBuZXh0IHJlcXVlc3QgcmVhZHMgZnJvbSB0aGUgcHJpbWFyeSB0b28uXG4gKlxuICogUmVhZHMgYG1heUhhdmVXcml0dGVuYCByYXRoZXIgdGhhbiB0aGUgSFRUUCBtZXRob2Qgb24gcHVycG9zZS4gQSBQT1NUIHRoYXRcbiAqIG9ubHkgdmFsaWRhdGVzIGhhcyBub3RoaW5nIHRvIHBpbiBmb3IsIGFuZCDigJQgbW9yZSBpbXBvcnRhbnRseSDigJQgYSBHRVQgdGhhdFxuICogd3JpdGVzIChhIGxhenkgYmFja2ZpbGwsIGEgbGFzdC1zZWVuIHN0YW1wKSBhYnNvbHV0ZWx5IGRvZXMuIFRoZSBmbGFnIGZvbGxvd3NcbiAqIHdoYXQgYWN0dWFsbHkgdG91Y2hlZCB0aGUgcHJpbWFyeSwgd2hpY2ggdGhlIG1ldGhvZCBjYW5ub3QgdGVsbCB5b3UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRXcml0ZUZvclBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IHZvaWQge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKCFzY29wZS5tYXlIYXZlV3JpdHRlbikgcmV0dXJuO1xuICB2b2lkIGdldFdyaXRlUGluU3RvcmUoKS5waW4oc2NvcGUub3JnSWQpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"@opentelemetry/instrumentation": "0.300.0",
|
|
36
36
|
"@opentelemetry/resources": "3.0.0",
|
|
37
37
|
"@opentelemetry/sdk-node": "0.300.0",
|
|
38
|
-
"@pipeline-builder/api-core": "5.2.
|
|
39
|
-
"@pipeline-builder/pipeline-core": "4.4.
|
|
40
|
-
"@pipeline-builder/pipeline-data": "4.3.
|
|
38
|
+
"@pipeline-builder/api-core": "5.2.3",
|
|
39
|
+
"@pipeline-builder/pipeline-core": "4.4.3",
|
|
40
|
+
"@pipeline-builder/pipeline-data": "4.3.3",
|
|
41
41
|
"compression": "1.8.2",
|
|
42
42
|
"cors": "2.8.6",
|
|
43
43
|
"express": "5.3.0",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"access": "public",
|
|
112
112
|
"registry": "https://registry.npmjs.org/"
|
|
113
113
|
},
|
|
114
|
-
"version": "4.4.
|
|
114
|
+
"version": "4.4.3",
|
|
115
115
|
"bugs": {
|
|
116
116
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
117
117
|
},
|