@uengage.io/platform-sdk 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
3
+ exports.SettlementNotFoundError = exports.CreditIdempotencyConflictError = exports.CreditLineHasOutstandingError = exports.CreditLineNotFoundError = exports.CreditTopUpRefusedError = exports.CreditCurrencyMismatchError = exports.CreditCurrencyConflictError = exports.CreditCorrectionReasonRequiredError = exports.CreditOverrideRefusedError = exports.CreditBreakupRequiredError = exports.CreditLimitReachedError = exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
4
4
  exports.createWalletClient = createWalletClient;
5
5
  const config_1 = require("../config");
6
6
  const http_1 = require("../http");
@@ -78,6 +78,197 @@ class WalletNotFoundError extends WalletApiError {
78
78
  }
79
79
  }
80
80
  exports.WalletNotFoundError = WalletNotFoundError;
81
+ /**
82
+ * The charge would exceed the merchant's credit limit; nothing was moved
83
+ * (HTTP 409).
84
+ *
85
+ * Distinct from `InsufficientBalanceError` because the merchant's next
86
+ * step is different — settle an invoice or talk to their account
87
+ * manager, not top up. The figures also separate two cases that share
88
+ * this error and need different copy:
89
+ *
90
+ * - `availableMinor === 0` — the limit is used up.
91
+ * - `availableMinor > 0` — this one charge is larger than what is
92
+ * left, which can happen at any utilisation. Telling that merchant
93
+ * their "credit limit is reached" would be wrong.
94
+ * - `availableMinor === undefined` — the response carried no figures
95
+ * (a trimmed or proxied body). Fall back to generic copy; do not
96
+ * read it as zero, which is the sentinel above.
97
+ *
98
+ * And a third the fields cannot distinguish on their own: consumption
99
+ * spans months, so a merchant can be at their ceiling purely because
100
+ * older invoices are unpaid. `getCreditLine()` tells you which.
101
+ */
102
+ class CreditLimitReachedError extends WalletApiError {
103
+ limitMinor;
104
+ consumedMinor;
105
+ availableMinor;
106
+ requestedMinor;
107
+ constructor(figures, body) {
108
+ super(409, body);
109
+ this.name = 'CreditLimitReachedError';
110
+ this.limitMinor = figures.limitMinor;
111
+ this.consumedMinor = figures.consumedMinor;
112
+ this.availableMinor = figures.availableMinor;
113
+ this.requestedMinor = figures.requestedMinor;
114
+ }
115
+ }
116
+ exports.CreditLimitReachedError = CreditLimitReachedError;
117
+ /**
118
+ * A charge on a credit-line merchant arrived without its GST split
119
+ * (HTTP 400).
120
+ *
121
+ * Consumption is tracked net of GST, so `breakup` is required rather
122
+ * than a rate being inferred. If you hit this, the caller is sending
123
+ * gross-only amounts and needs to send `breakup` — the same split it
124
+ * almost certainly already computes.
125
+ */
126
+ class CreditBreakupRequiredError extends WalletApiError {
127
+ constructor(body) {
128
+ super(400, body);
129
+ this.name = 'CreditBreakupRequiredError';
130
+ }
131
+ }
132
+ exports.CreditBreakupRequiredError = CreditBreakupRequiredError;
133
+ /** `allowNegative` was passed for a credit-line merchant (HTTP 400). */
134
+ class CreditOverrideRefusedError extends WalletApiError {
135
+ constructor(body) {
136
+ super(400, body);
137
+ this.name = 'CreditOverrideRefusedError';
138
+ }
139
+ }
140
+ exports.CreditOverrideRefusedError = CreditOverrideRefusedError;
141
+ /**
142
+ * A re-settlement changed an invoice's figures without saying why
143
+ * (HTTP 400).
144
+ *
145
+ * Re-settling a REVERSED invoice with different figures is how a settled
146
+ * amount is corrected, so the service does not refuse it the way it
147
+ * refuses a conflicting first settlement. But it releases against the
148
+ * merchant's whole outstanding consumption rather than the invoice's own
149
+ * amount, so a mistyped figure can hand back far more than the invoice
150
+ * held — and a deliberate correction can say what it is correcting where
151
+ * a replayed webhook cannot. Pass `reason` and retry. Re-settling with
152
+ * the SAME figures needs none.
153
+ */
154
+ class CreditCorrectionReasonRequiredError extends WalletApiError {
155
+ previousNetMinor;
156
+ constructor(
157
+ /** What the invoice was previously settled for, in minor units. */
158
+ previousNetMinor, body) {
159
+ super(400, body);
160
+ this.previousNetMinor = previousNetMinor;
161
+ this.name = 'CreditCorrectionReasonRequiredError';
162
+ }
163
+ }
164
+ exports.CreditCorrectionReasonRequiredError = CreditCorrectionReasonRequiredError;
165
+ /**
166
+ * A limit change named a currency the credit line is not denominated in
167
+ * (HTTP 409).
168
+ *
169
+ * The line's currency is fixed when it is created, because it sets the
170
+ * exponent every stored figure is already scaled by — changing it would
171
+ * re-denominate the limit and the consumption without touching either
172
+ * number. Re-denominating a live line is a migration, not a field
173
+ * update, so this is not something a caller can retry past: send the
174
+ * currency the line already carries.
175
+ */
176
+ class CreditCurrencyConflictError extends WalletApiError {
177
+ storedCurrency;
178
+ requestedCurrency;
179
+ constructor(storedCurrency, requestedCurrency, body) {
180
+ super(409, body);
181
+ this.storedCurrency = storedCurrency;
182
+ this.requestedCurrency = requestedCurrency;
183
+ this.name = 'CreditCurrencyConflictError';
184
+ }
185
+ }
186
+ exports.CreditCurrencyConflictError = CreditCurrencyConflictError;
187
+ /**
188
+ * The merchant's credit line and the wallet the charge routed to are in
189
+ * different currencies (HTTP 409).
190
+ *
191
+ * `amountMinor` and `breakup` carry no currency of their own — they are
192
+ * read with the exponent of the resolved wallet — so when the two
193
+ * disagree there is no reading of them that is right for both, and the
194
+ * service refuses rather than mis-scaling by a factor of ten or a
195
+ * hundred. Not caller-fixable: it means the merchant's routing and their
196
+ * credit line disagree, which is an ops/data problem.
197
+ */
198
+ class CreditCurrencyMismatchError extends WalletApiError {
199
+ constructor(body) {
200
+ super(409, body);
201
+ this.name = 'CreditCurrencyMismatchError';
202
+ }
203
+ }
204
+ exports.CreditCurrencyMismatchError = CreditCurrencyMismatchError;
205
+ /**
206
+ * A plain top-up was sent for a credit-line merchant (HTTP 400).
207
+ *
208
+ * These merchants have no balance to top up: `wallet_balance` is the
209
+ * fiction the credit line replaces and is deliberately frozen, so the
210
+ * write would move nothing while appearing to succeed. Credit is handed
211
+ * back by settling an invoice (`settleInvoice`), never by crediting the
212
+ * wallet. A genuine refund is accepted — send it as `reversalOf` or
213
+ * `isRefund` and it releases the credit the original charge consumed.
214
+ */
215
+ class CreditTopUpRefusedError extends WalletApiError {
216
+ constructor(body) {
217
+ super(400, body);
218
+ this.name = 'CreditTopUpRefusedError';
219
+ }
220
+ }
221
+ exports.CreditTopUpRefusedError = CreditTopUpRefusedError;
222
+ /**
223
+ * The merchant is not on the credit line (HTTP 404).
224
+ *
225
+ * The normal state for a prepaid merchant, so a widget should treat it
226
+ * as "show the wallet balance instead", not as an error.
227
+ */
228
+ class CreditLineNotFoundError extends WalletApiError {
229
+ constructor(body) {
230
+ super(404, body);
231
+ this.name = 'CreditLineNotFoundError';
232
+ }
233
+ }
234
+ exports.CreditLineNotFoundError = CreditLineNotFoundError;
235
+ /**
236
+ * `enabled: false` was refused because the merchant still owes for the
237
+ * credit line (HTTP 409).
238
+ *
239
+ * Disabling moves a merchant back to a wallet balance, and doing that
240
+ * with consumption outstanding abandons it. Show `consumedMinor` and
241
+ * tell the operator to settle first — or, if the intent was to stop the
242
+ * merchant trading rather than to move them off the model, set
243
+ * `limitMinor: 0`, which blocks every charge and keeps the balance.
244
+ */
245
+ class CreditLineHasOutstandingError extends WalletApiError {
246
+ consumedMinor;
247
+ gstAccruedMinor;
248
+ constructor(consumedMinor, gstAccruedMinor, body) {
249
+ super(409, body);
250
+ this.name = 'CreditLineHasOutstandingError';
251
+ this.consumedMinor = consumedMinor;
252
+ this.gstAccruedMinor = gstAccruedMinor;
253
+ }
254
+ }
255
+ exports.CreditLineHasOutstandingError = CreditLineHasOutstandingError;
256
+ /** A limit `referenceId` or an invoice was reused for different figures (HTTP 409). */
257
+ class CreditIdempotencyConflictError extends WalletApiError {
258
+ constructor(body) {
259
+ super(409, body);
260
+ this.name = 'CreditIdempotencyConflictError';
261
+ }
262
+ }
263
+ exports.CreditIdempotencyConflictError = CreditIdempotencyConflictError;
264
+ /** No settlement to reverse for that invoice (HTTP 404). */
265
+ class SettlementNotFoundError extends WalletApiError {
266
+ constructor(body) {
267
+ super(404, body);
268
+ this.name = 'SettlementNotFoundError';
269
+ }
270
+ }
271
+ exports.SettlementNotFoundError = SettlementNotFoundError;
81
272
  const BUSINESS_ID_RE = /^business:(\d+)$/;
82
273
  /** Parse a typed wallet id (`"business:8841"`) into the numeric business id. */
83
274
  function parseBusinessId(id) {
@@ -91,10 +282,16 @@ function parseBusinessId(id) {
91
282
  function walletError(status, body) {
92
283
  let code;
93
284
  let balanceMinor;
285
+ let credit = {};
286
+ let outstanding = {};
287
+ let correction = {};
94
288
  try {
95
289
  const parsed = JSON.parse(body);
96
290
  code = parsed.error;
97
291
  balanceMinor = parsed.balanceMinor;
292
+ credit = parsed;
293
+ outstanding = parsed;
294
+ correction = parsed;
98
295
  }
99
296
  catch {
100
297
  // non-JSON body — fall through to a generic error
@@ -102,6 +299,48 @@ function walletError(status, body) {
102
299
  if (status === 409 && code === 'insufficient_balance') {
103
300
  return new InsufficientBalanceError(balanceMinor ?? 0, body);
104
301
  }
302
+ if (status === 409 && code === 'credit_limit_reached') {
303
+ // NOT `?? 0`. `availableMinor === 0` is the documented sentinel for
304
+ // "the limit is used up", and defaulting to it made a trimmed or
305
+ // proxied body indistinguishable from that — producing exactly the
306
+ // wrong merchant copy in the one place this error type exists to get
307
+ // right. Absent stays absent, which also matches PHP's
308
+ // `creditFigures()`, so the two SDKs agree on the rule.
309
+ return new CreditLimitReachedError({
310
+ limitMinor: credit.limitMinor,
311
+ consumedMinor: credit.consumedMinor,
312
+ availableMinor: credit.availableMinor,
313
+ requestedMinor: credit.requestedMinor,
314
+ }, body);
315
+ }
316
+ if (status === 400 && code === 'credit_breakup_required') {
317
+ return new CreditBreakupRequiredError(body);
318
+ }
319
+ if (status === 400 && code === 'credit_override_refused') {
320
+ return new CreditOverrideRefusedError(body);
321
+ }
322
+ if (status === 400 && code === 'credit_top_up_refused') {
323
+ return new CreditTopUpRefusedError(body);
324
+ }
325
+ if (status === 400 && code === 'credit_correction_reason_required') {
326
+ return new CreditCorrectionReasonRequiredError(correction.previousNetMinor, body);
327
+ }
328
+ if (status === 409 && code === 'credit_currency_conflict') {
329
+ return new CreditCurrencyConflictError(correction.storedCurrency, correction.requestedCurrency, body);
330
+ }
331
+ if (status === 409 && code === 'credit_currency_mismatch') {
332
+ return new CreditCurrencyMismatchError(body);
333
+ }
334
+ if (status === 409 && code === 'credit_line_has_outstanding') {
335
+ return new CreditLineHasOutstandingError(outstanding.consumedMinor ?? 0, outstanding.gstAccruedMinor ?? 0, body);
336
+ }
337
+ if (status === 409 && code === 'credit_idempotency_conflict') {
338
+ return new CreditIdempotencyConflictError(body);
339
+ }
340
+ if (status === 404 && code === 'credit_line_not_found')
341
+ return new CreditLineNotFoundError(body);
342
+ if (status === 404 && code === 'settlement_not_found')
343
+ return new SettlementNotFoundError(body);
105
344
  if (status === 409 && code === 'over_refund')
106
345
  return new OverRefundError(body);
107
346
  if (status === 409 && code === 'idempotency_conflict')
@@ -129,6 +368,29 @@ function createWalletClient(input = {}) {
129
368
  state.setAuth(opts);
130
369
  return client;
131
370
  },
371
+ async getCreditUtilisation(filter = {}) {
372
+ const p = new URLSearchParams();
373
+ if (filter.minUtilisationBps !== undefined) {
374
+ p.set('minUtilisationBps', String(filter.minUtilisationBps));
375
+ }
376
+ if (filter.band)
377
+ p.set('band', filter.band);
378
+ if (filter.offset !== undefined)
379
+ p.set('offset', String(filter.offset));
380
+ if (filter.limit !== undefined)
381
+ p.set('limit', String(filter.limit));
382
+ const path = '/v1/wallet/credit/utilisation';
383
+ const config = state.resolve();
384
+ const query = p.toString();
385
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
386
+ method: 'GET',
387
+ path,
388
+ url: `${config.baseUrl}${path}${query ? `?${query}` : ''}`,
389
+ });
390
+ if (!res.ok)
391
+ throw walletError(res.status, await res.text());
392
+ return (await res.json());
393
+ },
132
394
  getWallet(opts) {
133
395
  // Parse eagerly so a malformed id fails fast at the call site,
134
396
  // but do NOT resolve the wallet here — that happens on the first
@@ -141,6 +403,29 @@ function createWalletClient(input = {}) {
141
403
  p.set('forceChildWallet', 'true');
142
404
  return p;
143
405
  };
406
+ const getJson = async (path, params) => {
407
+ const config = state.resolve();
408
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
409
+ method: 'GET',
410
+ path,
411
+ url: `${config.baseUrl}${path}?${params.toString()}`,
412
+ });
413
+ if (!res.ok)
414
+ throw walletError(res.status, await res.text());
415
+ return (await res.json());
416
+ };
417
+ const sendJson = async (method, path, payload) => {
418
+ const config = state.resolve();
419
+ const res = await (0, http_1.sendWithAuthRetry)(config, {
420
+ method,
421
+ path,
422
+ url: `${config.baseUrl}${path}`,
423
+ body: JSON.stringify(payload),
424
+ });
425
+ if (!res.ok)
426
+ throw walletError(res.status, await res.text());
427
+ return (await res.json());
428
+ };
144
429
  const postTransaction = async (type, body) => {
145
430
  const path = '/v1/wallet/transactions';
146
431
  // The wallet identity is exactly-one-of server-side, so an explicit
@@ -159,6 +444,63 @@ function createWalletClient(input = {}) {
159
444
  return (await res.json());
160
445
  };
161
446
  const wallet = {
447
+ /**
448
+ * BALANCE FIRST, deliberately, and the order is the whole design.
449
+ *
450
+ * `getBalance()` carries `source`, so for any merchant who has a
451
+ * wallet at all it settles prepaid-vs-credit without an
452
+ * exception. The alternative — call `getCreditLine()` and catch
453
+ * its 404 — makes the *normal* state of a prepaid merchant an
454
+ * error: a 404 in the network tab and a throw in the logs on
455
+ * every dashboard load, for nothing being wrong.
456
+ *
457
+ * It also costs less where it matters. Most merchants are
458
+ * prepaid, and for them this is ONE request: the balance is both
459
+ * the answer and the data. Only a credit merchant pays a second
460
+ * round trip, and only because they have figures a balance cannot
461
+ * carry.
462
+ *
463
+ * `source` absent means a wallet service older than the credit
464
+ * line, which is prepaid by definition — so an old service reads
465
+ * as prepaid rather than throwing.
466
+ *
467
+ * WHAT THIS DOES NOT SWALLOW. `getBalance()` is not a guaranteed
468
+ * 200: it answers `WalletNotFoundError` when no wallet document
469
+ * exists for the resolved identity, and `UnresolvableWalletError`
470
+ * when routing cannot name one. Both propagate, because both mean
471
+ * there is genuinely nothing to render — reporting `prepaid` with
472
+ * a zero balance would invent a wallet.
473
+ *
474
+ * CAPABILITIES. `wallet.balance:read` covers a prepaid merchant.
475
+ * A credit merchant needs `wallet.credit:read` as well, and a
476
+ * token holding only the former gets a `WalletApiError` with
477
+ * `status === 403` from the second call — every wallet method
478
+ * throws from that one hierarchy, so branch on `.status` rather
479
+ * than looking for the SDK's `AuthorizationError`, which this
480
+ * namespace does not raise. It is deliberately not caught:
481
+ * falling back to `prepaid` would hand the dashboard a
482
+ * `wallet_balance` that is frozen for exactly these merchants, so
483
+ * it would render a confident, stale, wrong number instead of an
484
+ * error someone can fix by widening the grant.
485
+ */
486
+ async getOverview() {
487
+ const balance = await wallet.getBalance();
488
+ if (balance.source !== 'credit_line') {
489
+ return { mode: 'prepaid', balance };
490
+ }
491
+ try {
492
+ return { mode: 'credit', balance, creditLine: await wallet.getCreditLine() };
493
+ }
494
+ catch (err) {
495
+ // Ops can disable a credit line between the two calls. Rare,
496
+ // but the honest answer is then "prepaid" rather than an
497
+ // error a dashboard cannot act on.
498
+ if (err instanceof CreditLineNotFoundError) {
499
+ return { mode: 'prepaid', balance };
500
+ }
501
+ throw err;
502
+ }
503
+ },
162
504
  async getBalance() {
163
505
  const path = '/v1/wallet/balance';
164
506
  const config = state.resolve();
@@ -233,10 +575,56 @@ function createWalletClient(input = {}) {
233
575
  throw walletError(res.status, await res.text());
234
576
  return (await res.json());
235
577
  },
578
+ // ── Credit line ──
579
+ //
580
+ // These send `businessId` alone, never `forceChildWallet`: the
581
+ // credit line is resolved to the merchant that owns the business,
582
+ // and which wallet would have paid is not part of that question.
583
+ //
584
+ // `businessId` is spread LAST so the handle's merchant wins. A
585
+ // caller who passes their own `businessId` is naming a different
586
+ // merchant, and honouring it would move a limit or settle an
587
+ // invoice against that one while every log line and error still
588
+ // named this handle's.
589
+ async getCreditLine() {
590
+ return getJson('/v1/wallet/credit', new URLSearchParams({ businessId: String(businessId) }));
591
+ },
592
+ async listCreditEvents(filter = {}) {
593
+ const p = new URLSearchParams({ businessId: String(businessId) });
594
+ if (filter.limit !== undefined)
595
+ p.set('limit', String(filter.limit));
596
+ const page = await getJson('/v1/wallet/credit/events', p);
597
+ // `?? []` rather than a bare `page.events`: the declared type
598
+ // says the key is always there, but the type describes what the
599
+ // service intends to send, not what a proxy, an older
600
+ // deployment or a truncated body actually delivered. Returning
601
+ // `undefined` from a method typed `CreditEvent[]` puts a lie in
602
+ // the caller's hands, and it surfaces as `.map of undefined`
603
+ // inside their render — far from the request that caused it.
604
+ return page.events ?? [];
605
+ },
606
+ setCreditLimit(input) {
607
+ return sendJson('PUT', '/v1/wallet/credit/limit', {
608
+ ...input,
609
+ businessId,
610
+ });
611
+ },
612
+ settleInvoice(input) {
613
+ return sendJson('POST', '/v1/wallet/credit/settlements', {
614
+ ...input,
615
+ businessId,
616
+ });
617
+ },
618
+ reverseSettlement(input) {
619
+ return sendJson('POST', '/v1/wallet/credit/settlements/reversal', {
620
+ ...input,
621
+ businessId,
622
+ });
623
+ },
236
624
  };
237
625
  return wallet;
238
626
  },
239
627
  };
240
628
  return client;
241
629
  }
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0tBLGdEQXFIQztBQXBTRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBd0Q1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBYSx3QkFBeUIsU0FBUSxjQUFjO0lBQ2pELFlBQVksQ0FBUztJQUM5QixZQUFZLFlBQW9CLEVBQUUsSUFBWTtRQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCw4RUFBOEU7QUFDOUUsTUFBYSxlQUFnQixTQUFRLGNBQWM7SUFDakQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLG9CQUFxQixTQUFRLGNBQWM7SUFDdEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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TSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzdELE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBc0IsQ0FBQztnQkFDakQsQ0FBQzthQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNlbmRXaXRoQXV0aFJldHJ5IH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWRpdElucHV0LFxuICBDdXJyZW5jeSxcbiAgRGViaXRJbnB1dCxcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcixcbiAgVHJhbnNhY3Rpb25QYWdlLFxuICBUcmFuc2FjdGlvblJlc3VsdCxcbiAgV2FsbGV0QmFsYW5jZSxcbiAgV2FsbGV0SW5zdGFuY2UsXG4gIFdhbGxldFRyYW5zYWN0aW9uLFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gb25lIGJ1c2luZXNzIHdhbGxldC4gQ2hlYXAgdG8gY3JlYXRlIOKAlCBgZ2V0V2FsbGV0KC4uLilgXG4gKiBkb2VzIG5vIEkvTy4gVGhlIHdhbGxldCBpcyByZXNvbHZlZCBzZXJ2ZXItc2lkZSBvbiB0aGUgZmlyc3RcbiAqIG9wZXJhdGlvbiwgc28gYFVucmVzb2x2YWJsZVdhbGxldEVycm9yYCAvIGBXYWxsZXROb3RGb3VuZEVycm9yYFxuICogc3VyZmFjZSBmcm9tIHRoZSBvcGVyYXRpb24sIG5vdCBmcm9tIGBnZXRXYWxsZXQoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0IHtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2JhbGFuY2Ug4oCUIHJlc29sdmVzIHRoZSB3YWxsZXQgYW5kIHJldHVybnMgaXRzIGJhbGFuY2UgKyBjdXJyZW5jeS4gKi9cbiAgZ2V0QmFsYW5jZSgpOiBQcm9taXNlPFdhbGxldEJhbGFuY2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvaW5zdGFuY2Ug4oCUIHdhbGxldCBpZGVudGl0eSArIGN1cnJlbmN5LCB3aXRob3V0IHRoZSBiYWxhbmNlLiAqL1xuICBnZXRJbnN0YW5jZSgpOiBQcm9taXNlPFdhbGxldEluc3RhbmNlPjtcbiAgLyoqIFRoZSB3YWxsZXQncyBjdXJyZW5jeSBge2NvZGUsIHN5bWJvbH1gIChhIHNsaWNlIG9mIGdldEluc3RhbmNlKCkpLiAqL1xuICBnZXRDdXJyZW5jeSgpOiBQcm9taXNlPEN1cnJlbmN5PjtcbiAgLyoqXG4gICAqIFBPU1QgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMgKHR5cGU9ZGViaXQpLiBJZGVtcG90ZW50IG9uXG4gICAqIGByZWZlcmVuY2VJZGAuIFBhc3MgYHdhbGxldGAgdG8gY2hhcmdlIGEgd2FsbGV0IG90aGVyIHRoYW4gdGhlIG9uZVxuICAgKiB0aGlzIGhhbmRsZSByb3V0ZXMgdG8uXG4gICAqL1xuICBkZWJpdChpbnB1dDogRGViaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKipcbiAgICogUE9TVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyAodHlwZT1jcmVkaXQpLiBQYXNzIGByZXZlcnNhbE9mYCBmb3IgYVxuICAgKiByZWZ1bmQgY2FwcGVkIGJ5IHRoZSBvcmlnaW5hbCBkZWJpdCwgb3IgYGlzUmVmdW5kYCBmb3Igb25lIGNvbXB1dGVkXG4gICAqIGluZGVwZW5kZW50bHkgb2YgaXQuXG4gICAqL1xuICBjcmVkaXQoaW5wdXQ6IENyZWRpdElucHV0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMg4oCUIG5ld2VzdC1maXJzdCwga2V5c2V0LXBhZ2luYXRlZC4gKi9cbiAgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXI/OiBMaXN0VHJhbnNhY3Rpb25zRmlsdGVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblBhZ2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zLzppZCDigJQgc2NvcGVkIHRvIHRoaXMgd2FsbGV0LiAqL1xuICBnZXRUcmFuc2FjdGlvbihpZDogc3RyaW5nKTogUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogV2FsbGV0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFdhbGxldENsaWVudDtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFuZGxlIHRvIGEgYnVzaW5lc3Mgd2FsbGV0LiBTeW5jaHJvbm91cyBhbmQgSS9PLWZyZWUg4oCUIGl0XG4gICAqIG9ubHkgcGFyc2VzIGBpZGAuIFJlcXVpcmVzIGEgc2VydmljZSB0b2tlbiBjYXJyeWluZyB0aGUgcmVsZXZhbnRcbiAgICogYHdhbGxldC4qYCBzY29wZSBmb3IgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHJldHVybmVkIGhhbmRsZS5cbiAgICovXG4gIGdldFdhbGxldChvcHRzOiBHZXRXYWxsZXRPcHRpb25zKTogV2FsbGV0O1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0QXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB3YWxsZXQgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdXYWxsZXRBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG4vKiogQSBkZWJpdCB3b3VsZCBvdmVyZHJhdyB0aGUgd2FsbGV0OyBub3RoaW5nIHdhcyBtb3ZlZCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudEJhbGFuY2VFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGJhbGFuY2VNaW5vcjogbnVtYmVyLCBib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3InO1xuICAgIHRoaXMuYmFsYW5jZU1pbm9yID0gYmFsYW5jZU1pbm9yO1xuICB9XG59XG5cbi8qKiBBIHJlZnVuZCB3b3VsZCBwdXNoIHRvdGFsIHJldmVyc2FscyBwYXN0IHRoZSBvcmlnaW5hbCBkZWJpdCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJSZWZ1bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnT3ZlclJlZnVuZEVycm9yJztcbiAgfVxufVxuXG4vKiogYHJldmVyc2FsT2ZgIGRvZXNuJ3QgcmVmZXJlbmNlIGEgdmFsaWQgZGViaXQgb24gdGhpcyB3YWxsZXQgKEhUVFAgNDIyKS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmV2ZXJzYWxFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDIyLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldmVyc2FsRXJyb3InO1xuICB9XG59XG5cbi8qKiBBIGByZWZlcmVuY2VJZGAgd2FzIHJldXNlZCB3aXRoIGEgZGlmZmVyZW50IGFtb3VudC90eXBlL3NlcnZpY2UgKEhUVFAgNDA5KS4gKi9cbmV4cG9ydCBjbGFzcyBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0lkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGB3YWxsZXRgIG92ZXJyaWRlIG5hbWVkIGEgYHBhcmVudEJ1c2luZXNzSWRgIHRoZSB3YWxsZXQgZG9jdW1lbnRcbiAqIGNvbnRyYWRpY3RzIChIVFRQIDQwOSkuIE5vdGhpbmcgd2FzIG1vdmVkIOKAlCB0aGUgd3JpdGUgaXMgcmVmdXNlZCByYXRoZXJcbiAqIHRoYW4gY2hhcmdpbmcgdGhlIHJpZ2h0IHdhbGxldCB1bmRlciB0aGUgd3JvbmcgaWRlbnRpdHksIHdoaWNoIHdvdWxkXG4gKiBtaXNhdHRyaWJ1dGUgdGhlIGxlZGdlciByb3cgYW5kIHNwbGl0IGl0cyBpZGVtcG90ZW5jeSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0SWRlbnRpdHlNaXNtYXRjaEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShib2R5KSBhcyB7IGVycm9yPzogc3RyaW5nOyBiYWxhbmNlTWlub3I/OiBudW1iZXIgfTtcbiAgICBjb2RlID0gcGFyc2VkLmVycm9yO1xuICAgIGJhbGFuY2VNaW5vciA9IHBhcnNlZC5iYWxhbmNlTWlub3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vbi1KU09OIGJvZHkg4oCUIGZhbGwgdGhyb3VnaCB0byBhIGdlbmVyaWMgZXJyb3JcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ2luc3VmZmljaWVudF9iYWxhbmNlJykge1xuICAgIHJldHVybiBuZXcgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yKGJhbGFuY2VNaW5vciA/PyAwLCBib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ292ZXJfcmVmdW5kJykgcmV0dXJuIG5ldyBPdmVyUmVmdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaWRlbXBvdGVuY3lfY29uZmxpY3QnKSByZXR1cm4gbmV3IElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICd3YWxsZXRfaWRlbnRpdHlfbWlzbWF0Y2gnKSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXRJZGVudGl0eU1pc21hdGNoRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICdpbnZhbGlkX3JldmVyc2FsJykgcmV0dXJuIG5ldyBJbnZhbGlkUmV2ZXJzYWxFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICd1bnJlc29sdmFibGVfd2FsbGV0JykgcmV0dXJuIG5ldyBVbnJlc29sdmFibGVXYWxsZXRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbmV3IFdhbGxldE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIHJldHVybiBuZXcgV2FsbGV0QXBpRXJyb3Ioc3RhdHVzLCBib2R5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhbGxldENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogV2FsbGV0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGNvbnN0IGNsaWVudDogV2FsbGV0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgZ2V0V2FsbGV0KG9wdHMpIHtcbiAgICAgIC8vIFBhcnNlIGVhZ2VybHkgc28gYSBtYWxmb3JtZWQgaWQgZmFpbHMgZmFzdCBhdCB0aGUgY2FsbCBzaXRlLFxuICAgICAgLy8gYnV0IGRvIE5PVCByZXNvbHZlIHRoZSB3YWxsZXQgaGVyZSDigJQgdGhhdCBoYXBwZW5zIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gb3BlcmF0aW9uIGFnYWluc3QgdGhlIGhhbmRsZS5cbiAgICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBwYXJzZUJ1c2luZXNzSWQob3B0cy5pZCk7XG4gICAgICBjb25zdCBmb3JjZUNoaWxkV2FsbGV0ID0gb3B0cy5mb3JjZUNoaWxkV2FsbGV0ID09PSB0cnVlO1xuXG4gICAgICBjb25zdCBiYXNlUGFyYW1zID0gKCk6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgICBpZiAoZm9yY2VDaGlsZFdhbGxldCkgcC5zZXQoJ2ZvcmNlQ2hpbGRXYWxsZXQnLCAndHJ1ZScpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBvc3RUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnLFxuICAgICAgICBib2R5OiBEZWJpdElucHV0IHwgQ3JlZGl0SW5wdXQsXG4gICAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC90cmFuc2FjdGlvbnMnO1xuICAgICAgICAvLyBUaGUgd2FsbGV0IGlkZW50aXR5IGlzIGV4YWN0bHktb25lLW9mIHNlcnZlci1zaWRlLCBzbyBhbiBleHBsaWNpdFxuICAgICAgICAvLyBgd2FsbGV0YCBvdmVycmlkZSBSRVBMQUNFUyB0aGlzIGhhbmRsZSdzIGJ1c2luZXNzSWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gdHJhdmVsbGluZyBhbG9uZ3NpZGUgaXQg4oCUIHNlbmRpbmcgYm90aCBpcyBhIDQwMC5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGJvZHkud2FsbGV0ID8geyB0eXBlLCAuLi5ib2R5IH0gOiB7IGJ1c2luZXNzSWQsIGZvcmNlQ2hpbGRXYWxsZXQsIHR5cGUsIC4uLmJvZHkgfSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofWAsXG4gICAgICAgICAgYm9keTogcGF5bG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdhbGxldDogV2FsbGV0ID0ge1xuICAgICAgICBhc3luYyBnZXRCYWxhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9iYWxhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2luc3RhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0SW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldEN1cnJlbmN5KCkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LmdldEluc3RhbmNlKCkpLmN1cnJlbmN5O1xuICAgICAgICB9LFxuICAgICAgICBkZWJpdChib2R5KSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3RUcmFuc2FjdGlvbignZGViaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdjcmVkaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXIgPSB7fSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBiYXNlUGFyYW1zKCk7XG4gICAgICAgICAgaWYgKGZpbHRlci50eXBlKSBwLnNldCgndHlwZScsIGZpbHRlci50eXBlKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmZyb20pIHAuc2V0KCdmcm9tJywgZmlsdGVyLmZyb20pO1xuICAgICAgICAgIGlmIChmaWx0ZXIudG8pIHAuc2V0KCd0bycsIGZpbHRlci50byk7XG4gICAgICAgICAgaWYgKGZpbHRlci5zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHAuc2V0KCdzZXJ2aWNlJywgU3RyaW5nKGZpbHRlci5zZXJ2aWNlKSk7XG4gICAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2VJZCkgcC5zZXQoJ3JlZmVyZW5jZUlkJywgZmlsdGVyLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnRhZykgcC5zZXQoJ3RhZycsIGZpbHRlci50YWcpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuY3Vyc29yKSBwLnNldCgnY3Vyc29yJywgZmlsdGVyLmN1cnNvcik7XG4gICAgICAgICAgaWYgKGZpbHRlci5saW1pdCAhPT0gdW5kZWZpbmVkKSBwLnNldCgnbGltaXQnLCBTdHJpbmcoZmlsdGVyLmxpbWl0KSk7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyc7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblBhZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKGlkKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy8ke2lkfWA7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtiYXNlUGFyYW1zKCkudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFdhbGxldFRyYW5zYWN0aW9uO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuIl19
630
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaWhCQSxnREE2UUM7QUE5eEJELHNDQUttQjtBQUNuQixrQ0FBNEM7QUFzSTVDLE1BQWEsY0FBZSxTQUFRLEtBQUs7SUFDOUIsTUFBTSxDQUFTO0lBQ2YsSUFBSSxDQUFTO0lBRXRCLFlBQVksTUFBYyxFQUFFLElBQVk7UUFDdEMsS0FBSyxDQUFDLGNBQWMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFWRCx3Q0FVQztBQUVELHVFQUF1RTtBQUN2RSxNQUFhLHdCQUF5QixTQUFRLGNBQWM7SUFDakQsWUFBWSxDQUFTO0lBQzlCLFlBQVksWUFBb0IsRUFBRSxJQUFZO1FBQzVDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFQRCw0REFPQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLGVBQWdCLFNBQVEsY0FBYztJQUNqRCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUxELDBDQUtDO0FBRUQsOEVBQThFO0FBQzlFLE1BQWEsb0JBQXFCLFNBQVEsY0FBYztJQUN0RCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJ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QUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDckUsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQTZCLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN0Riw4REFBOEQ7b0JBQzlELGdFQUFnRTtvQkFDaEUsc0RBQXNEO29CQUN0RCwrREFBK0Q7b0JBQy9ELGdFQUFnRTtvQkFDaEUsNkRBQTZEO29CQUM3RCw2REFBNkQ7b0JBQzdELE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLEtBQUs7b0JBQ2xCLE9BQU8sUUFBUSxDQUF1QixLQUFLLEVBQUUseUJBQXlCLEVBQUU7d0JBQ3RFLEdBQUcsS0FBSzt3QkFDUixVQUFVO3FCQUNYLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELGFBQWEsQ0FBQyxLQUFLO29CQUNqQixPQUFPLFFBQVEsQ0FBc0IsTUFBTSxFQUFFLCtCQUErQixFQUFFO3dCQUM1RSxHQUFHLEtBQUs7d0JBQ1IsVUFBVTtxQkFDWCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxpQkFBaUIsQ0FBQyxLQUFLO29CQUNyQixPQUFPLFFBQVEsQ0FBc0IsTUFBTSxFQUFFLHdDQUF3QyxFQUFFO3dCQUNyRixHQUFHLEtBQUs7d0JBQ1IsVUFBVTtxQkFDWCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQzthQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNlbmRXaXRoQXV0aFJldHJ5IH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWRpdEV2ZW50LFxuICBDcmVkaXRJbnB1dCxcbiAgQ3JlZGl0TGluZSxcbiAgQ3JlZGl0VXRpbGlzYXRpb25GaWx0ZXIsXG4gIENyZWRpdFV0aWxpc2F0aW9uUGFnZSxcbiAgQ3VycmVuY3ksXG4gIERlYml0SW5wdXQsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIExpc3RDcmVkaXRFdmVudHNGaWx0ZXIsXG4gIExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIsXG4gIFJldmVyc2VTZXR0bGVtZW50SW5wdXQsXG4gIFNldENyZWRpdExpbWl0SW5wdXQsXG4gIFNldENyZWRpdExpbWl0UmVzdWx0LFxuICBTZXR0bGVJbnZvaWNlSW5wdXQsXG4gIFNldHRsZUludm9pY2VSZXN1bHQsXG4gIFRyYW5zYWN0aW9uUGFnZSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFdhbGxldEJhbGFuY2UsXG4gIFdhbGxldEluc3RhbmNlLFxuICBXYWxsZXRPdmVydmlldyxcbiAgV2FsbGV0VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vc2NoZW1hJztcblxuLyoqXG4gKiBBIGhhbmRsZSB0byBvbmUgYnVzaW5lc3Mgd2FsbGV0LiBDaGVhcCB0byBjcmVhdGUg4oCUIGBnZXRXYWxsZXQoLi4uKWBcbiAqIGRvZXMgbm8gSS9PLiBUaGUgd2FsbGV0IGlzIHJlc29sdmVkIHNlcnZlci1zaWRlIG9uIHRoZSBmaXJzdFxuICogb3BlcmF0aW9uLCBzbyBgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3JgIC8gYFdhbGxldE5vdEZvdW5kRXJyb3JgXG4gKiBzdXJmYWNlIGZyb20gdGhlIG9wZXJhdGlvbiwgbm90IGZyb20gYGdldFdhbGxldCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAvKipcbiAgICogV0hJQ0ggTU9ERUwgSVMgVEhJUyBNRVJDSEFOVCBPTiDigJQgY2FsbCB0aGlzIGZpcnN0LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvbiBgbW9kZWAsIHNvIGEgZGFzaGJvYXJkIHNldHRsZXNcbiAgICogXCJ3YWxsZXQgYmFsYW5jZSBvciBjcmVkaXQgbGluZT9cIiBmcm9tIGEgdmFsdWUgcmF0aGVyIHRoYW4gYnlcbiAgICogY2F0Y2hpbmcgYSA0MDQsIGFuZCBUeXBlU2NyaXB0IG5hcnJvd3MgdGhlIHJlc3QgZm9yIHlvdTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbyA9IGF3YWl0IHdhbGxldC5nZXRPdmVydmlldygpO1xuICAgKiBpZiAoby5tb2RlID09PSAnY3JlZGl0JykgcmVuZGVyQ3JlZGl0V2lkZ2V0KG8uY3JlZGl0TGluZSk7XG4gICAqIGVsc2UgcmVuZGVyV2FsbGV0UGFuZWwoby5iYWxhbmNlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIE9uZSByZXF1ZXN0IGZvciBhIHByZXBhaWQgbWVyY2hhbnQsIHR3byBmb3IgYSBjcmVkaXQgb25lLCBhbmQgbmV2ZXJcbiAgICogYSA0MDQgb24gdGhlIGhhcHB5IHBhdGgg4oCUIHNlZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHdoeSB0aGF0IG9yZGVyLlxuICAgKi9cbiAgZ2V0T3ZlcnZpZXcoKTogUHJvbWlzZTxXYWxsZXRPdmVydmlldz47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC9iYWxhbmNlIOKAlCByZXNvbHZlcyB0aGUgd2FsbGV0IGFuZCByZXR1cm5zIGl0cyBiYWxhbmNlICsgY3VycmVuY3kuICovXG4gIGdldEJhbGFuY2UoKTogUHJvbWlzZTxXYWxsZXRCYWxhbmNlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2luc3RhbmNlIOKAlCB3YWxsZXQgaWRlbnRpdHkgKyBjdXJyZW5jeSwgd2l0aG91dCB0aGUgYmFsYW5jZS4gKi9cbiAgZ2V0SW5zdGFuY2UoKTogUHJvbWlzZTxXYWxsZXRJbnN0YW5jZT47XG4gIC8qKiBUaGUgd2FsbGV0J3MgY3VycmVuY3kgYHtjb2RlLCBzeW1ib2x9YCAoYSBzbGljZSBvZiBnZXRJbnN0YW5jZSgpKS4gKi9cbiAgZ2V0Q3VycmVuY3koKTogUHJvbWlzZTxDdXJyZW5jeT47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zICh0eXBlPWRlYml0KS4gSWRlbXBvdGVudCBvblxuICAgKiBgcmVmZXJlbmNlSWRgLiBQYXNzIGB3YWxsZXRgIHRvIGNoYXJnZSBhIHdhbGxldCBvdGhlciB0aGFuIHRoZSBvbmVcbiAgICogdGhpcyBoYW5kbGUgcm91dGVzIHRvLlxuICAgKi9cbiAgZGViaXQoaW5wdXQ6IERlYml0SW5wdXQpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PjtcbiAgLyoqXG4gICAqIFBPU1QgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMgKHR5cGU9Y3JlZGl0KS4gUGFzcyBgcmV2ZXJzYWxPZmAgZm9yIGFcbiAgICogcmVmdW5kIGNhcHBlZCBieSB0aGUgb3JpZ2luYWwgZGViaXQsIG9yIGBpc1JlZnVuZGAgZm9yIG9uZSBjb21wdXRlZFxuICAgKiBpbmRlcGVuZGVudGx5IG9mIGl0LlxuICAgKi9cbiAgY3JlZGl0KGlucHV0OiBDcmVkaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKiogR0VUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zIOKAlCBuZXdlc3QtZmlyc3QsIGtleXNldC1wYWdpbmF0ZWQuICovXG4gIGxpc3RUcmFuc2FjdGlvbnMoZmlsdGVyPzogTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcik6IFByb21pc2U8VHJhbnNhY3Rpb25QYWdlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy86aWQg4oCUIHNjb3BlZCB0byB0aGlzIHdhbGxldC4gKi9cbiAgZ2V0VHJhbnNhY3Rpb24oaWQ6IHN0cmluZyk6IFByb21pc2U8V2FsbGV0VHJhbnNhY3Rpb24+O1xuXG4gIC8vIOKUgOKUgCBDcmVkaXQgbGluZSDilIDilIBcbiAgLy9cbiAgLy8gUmVzb2x2ZWQgdG8gdGhlIE1FUkNIQU5UIHRoaXMgd2FsbGV0IGJlbG9uZ3MgdG8sIG5vdCB0byB0aGUgd2FsbGV0OlxuICAvLyBhbGwgb2YgYSBtZXJjaGFudCdzIG91dGxldHMgc2hhcmUgb25lIGNyZWRpdCBsaW5lLCBzbyBjYWxsaW5nIHRoZXNlXG4gIC8vIG9uIGFuIG91dGxldCBoYW5kbGUgYW5kIG9uIGl0cyBwYXJlbnQncyBoYW5kbGUgaXMgdGhlIHNhbWUgcmVxdWVzdC5cblxuICAvKipcbiAgICogR0VUIC92MS93YWxsZXQvY3JlZGl0IOKAlCBldmVyeXRoaW5nIHRoZSBtZXJjaGFudCB3aWRnZXQgcmVuZGVycy5cbiAgICogVGhyb3dzIGBDcmVkaXRMaW5lTm90Rm91bmRFcnJvcmAgKDQwNCkgd2hlbiB0aGUgbWVyY2hhbnQgaXMgbm90IG9uXG4gICAqIHRoZSBjcmVkaXQgbGluZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBwcmVwYWlkIG1lcmNoYW50LlxuICAgKiBSZXF1aXJlcyBgd2FsbGV0LmNyZWRpdDpyZWFkYC5cbiAgICovXG4gIGdldENyZWRpdExpbmUoKTogUHJvbWlzZTxDcmVkaXRMaW5lPjtcbiAgLyoqXG4gICAqIEdFVCAvdjEvd2FsbGV0L2NyZWRpdC9ldmVudHMg4oCUIHRoZSBsaW1pdC1jaGFuZ2UgYW5kIHNldHRsZW1lbnRcbiAgICogdHJhaWwsIG5ld2VzdCBmaXJzdC4gUmVxdWlyZXMgYHdhbGxldC5jcmVkaXQ6cmVhZGAuXG4gICAqXG4gICAqIFBhc3MgYSBgbGltaXRgIHRvIHdpZGVuIHRoZSBwYWdlOiB0aGUgc2VydmljZSBkZWZhdWx0cyB0byA1MCwgd2hpY2hcbiAgICogYSBtZXJjaGFudCBvbiB0aGUgbGluZSBmb3IgYSB5ZWFyIHdpbGwgaGF2ZSBvdXRncm93bi5cbiAgICovXG4gIGxpc3RDcmVkaXRFdmVudHMoZmlsdGVyPzogTGlzdENyZWRpdEV2ZW50c0ZpbHRlcik6IFByb21pc2U8Q3JlZGl0RXZlbnRbXT47XG4gIC8qKlxuICAgKiBQVVQgL3YxL3dhbGxldC9jcmVkaXQvbGltaXQg4oCUIHNldCB0aGUgbGltaXQsIGNyZWF0aW5nIHRoZSBjcmVkaXRcbiAgICogbGluZSBvbiBmaXJzdCB1c2UuIENvbnN1bXB0aW9uIGlzIG5ldmVyIHRvdWNoZWQsIHNvIHJhaXNpbmcgYSBsaW1pdFxuICAgKiBoYW5kcyBiYWNrIGV4YWN0bHkgdGhlIGRpZmZlcmVuY2UuIFJlcXVpcmVzIGB3YWxsZXQuY3JlZGl0OndyaXRlYC5cbiAgICovXG4gIHNldENyZWRpdExpbWl0KGlucHV0OiBTZXRDcmVkaXRMaW1pdElucHV0KTogUHJvbWlzZTxTZXRDcmVkaXRMaW1pdFJlc3VsdD47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvY3JlZGl0L3NldHRsZW1lbnRzIOKAlCByZWxlYXNlIHRoZSBjcmVkaXQgYW4gaW52b2ljZVxuICAgKiB3YXMgaG9sZGluZywgb24gcGF5bWVudCBJTiBGVUxMLiBSZWxlYXNlcyB0aGUgaW52b2ljZSdzIG5ldCBmaWd1cmU7XG4gICAqIHNlZSBgU2V0dGxlSW52b2ljZUlucHV0Lm5ldE1pbm9yYC4gUmVxdWlyZXMgYHdhbGxldC5jcmVkaXQ6c2V0dGxlYC5cbiAgICovXG4gIHNldHRsZUludm9pY2UoaW5wdXQ6IFNldHRsZUludm9pY2VJbnB1dCk6IFByb21pc2U8U2V0dGxlSW52b2ljZVJlc3VsdD47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvY3JlZGl0L3NldHRsZW1lbnRzL3JldmVyc2FsIOKAlCB1bmRvIGEgc2V0dGxlbWVudFxuICAgKiByZWNvcmRlZCBpbiBlcnJvciwgcmUtaG9sZGluZyBleGFjdGx5IHdoYXQgaXQgcmVsZWFzZWQuIFJlcXVpcmVzXG4gICAqIGB3YWxsZXQuY3JlZGl0OnNldHRsZWAuXG4gICAqL1xuICByZXZlcnNlU2V0dGxlbWVudChpbnB1dDogUmV2ZXJzZVNldHRsZW1lbnRJbnB1dCk6IFByb21pc2U8U2V0dGxlSW52b2ljZVJlc3VsdD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogV2FsbGV0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFdhbGxldENsaWVudDtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFuZGxlIHRvIGEgYnVzaW5lc3Mgd2FsbGV0LiBTeW5jaHJvbm91cyBhbmQgSS9PLWZyZWUg4oCUIGl0XG4gICAqIG9ubHkgcGFyc2VzIGBpZGAuIFJlcXVpcmVzIGEgc2VydmljZSB0b2tlbiBjYXJyeWluZyB0aGUgcmVsZXZhbnRcbiAgICogYHdhbGxldC4qYCBzY29wZSBmb3IgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHJldHVybmVkIGhhbmRsZS5cbiAgICovXG4gIGdldFdhbGxldChvcHRzOiBHZXRXYWxsZXRPcHRpb25zKTogV2FsbGV0O1xuICAvKipcbiAgICogR0VUIC92MS93YWxsZXQvY3JlZGl0L3V0aWxpc2F0aW9uIOKAlCBldmVyeSBtZXJjaGFudCBvbiB0aGUgY3JlZGl0XG4gICAqIGxpbmUsIG1vc3QtdXRpbGlzZWQgZmlyc3QuXG4gICAqXG4gICAqIE9uIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gb24gYSB3YWxsZXQgaGFuZGxlIGJlY2F1c2UgaXQgaXMgdGhlIG9uZVxuICAgKiB3YWxsZXQgb3BlcmF0aW9uIHRoYXQgaXMgbm90IHNjb3BlZCB0byBhIGJ1c2luZXNzLCBhbmQgaXQgY2Fycmllc1xuICAgKiBpdHMgb3duIGNhcGFiaWxpdHkgKGB3YWxsZXQuY3JlZGl0Omxpc3RgKSBmb3IgdGhlIHNhbWUgcmVhc29uOiBpdCBpc1xuICAgKiBhIG1hdGVyaWFsbHkgYnJvYWRlciBncmFudCB0aGFuIHJlYWRpbmcgb25lIG1lcmNoYW50J3MgbGluZS5cbiAgICovXG4gIGdldENyZWRpdFV0aWxpc2F0aW9uKGZpbHRlcj86IENyZWRpdFV0aWxpc2F0aW9uRmlsdGVyKTogUHJvbWlzZTxDcmVkaXRVdGlsaXNhdGlvblBhZ2U+O1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0QXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB3YWxsZXQgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdXYWxsZXRBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG4vKiogQSBkZWJpdCB3b3VsZCBvdmVyZHJhdyB0aGUgd2FsbGV0OyBub3RoaW5nIHdhcyBtb3ZlZCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudEJhbGFuY2VFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGJhbGFuY2VNaW5vcjogbnVtYmVyLCBib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3InO1xuICAgIHRoaXMuYmFsYW5jZU1pbm9yID0gYmFsYW5jZU1pbm9yO1xuICB9XG59XG5cbi8qKiBBIHJlZnVuZCB3b3VsZCBwdXNoIHRvdGFsIHJldmVyc2FscyBwYXN0IHRoZSBvcmlnaW5hbCBkZWJpdCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJSZWZ1bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnT3ZlclJlZnVuZEVycm9yJztcbiAgfVxufVxuXG4vKiogYHJldmVyc2FsT2ZgIGRvZXNuJ3QgcmVmZXJlbmNlIGEgdmFsaWQgZGViaXQgb24gdGhpcyB3YWxsZXQgKEhUVFAgNDIyKS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmV2ZXJzYWxFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDIyLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldmVyc2FsRXJyb3InO1xuICB9XG59XG5cbi8qKiBBIGByZWZlcmVuY2VJZGAgd2FzIHJldXNlZCB3aXRoIGEgZGlmZmVyZW50IGFtb3VudC90eXBlL3NlcnZpY2UgKEhUVFAgNDA5KS4gKi9cbmV4cG9ydCBjbGFzcyBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0lkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGB3YWxsZXRgIG92ZXJyaWRlIG5hbWVkIGEgYHBhcmVudEJ1c2luZXNzSWRgIHRoZSB3YWxsZXQgZG9jdW1lbnRcbiAqIGNvbnRyYWRpY3RzIChIVFRQIDQwOSkuIE5vdGhpbmcgd2FzIG1vdmVkIOKAlCB0aGUgd3JpdGUgaXMgcmVmdXNlZCByYXRoZXJcbiAqIHRoYW4gY2hhcmdpbmcgdGhlIHJpZ2h0IHdhbGxldCB1bmRlciB0aGUgd3JvbmcgaWRlbnRpdHksIHdoaWNoIHdvdWxkXG4gKiBtaXNhdHRyaWJ1dGUgdGhlIGxlZGdlciByb3cgYW5kIHNwbGl0IGl0cyBpZGVtcG90ZW5jeSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0SWRlbnRpdHlNaXNtYXRjaEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2hhcmdlIHdvdWxkIGV4Y2VlZCB0aGUgbWVyY2hhbnQncyBjcmVkaXQgbGltaXQ7IG5vdGhpbmcgd2FzIG1vdmVkXG4gKiAoSFRUUCA0MDkpLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYEluc3VmZmljaWVudEJhbGFuY2VFcnJvcmAgYmVjYXVzZSB0aGUgbWVyY2hhbnQncyBuZXh0XG4gKiBzdGVwIGlzIGRpZmZlcmVudCDigJQgc2V0dGxlIGFuIGludm9pY2Ugb3IgdGFsayB0byB0aGVpciBhY2NvdW50XG4gKiBtYW5hZ2VyLCBub3QgdG9wIHVwLiBUaGUgZmlndXJlcyBhbHNvIHNlcGFyYXRlIHR3byBjYXNlcyB0aGF0IHNoYXJlXG4gKiB0aGlzIGVycm9yIGFuZCBuZWVkIGRpZmZlcmVudCBjb3B5OlxuICpcbiAqICAgLSBgYXZhaWxhYmxlTWlub3IgPT09IDBgIOKAlCB0aGUgbGltaXQgaXMgdXNlZCB1cC5cbiAqICAgLSBgYXZhaWxhYmxlTWlub3IgPiAwYCDigJQgdGhpcyBvbmUgY2hhcmdlIGlzIGxhcmdlciB0aGFuIHdoYXQgaXNcbiAqICAgICBsZWZ0LCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB1dGlsaXNhdGlvbi4gVGVsbGluZyB0aGF0IG1lcmNoYW50XG4gKiAgICAgdGhlaXIgXCJjcmVkaXQgbGltaXQgaXMgcmVhY2hlZFwiIHdvdWxkIGJlIHdyb25nLlxuICogICAtIGBhdmFpbGFibGVNaW5vciA9PT0gdW5kZWZpbmVkYCDigJQgdGhlIHJlc3BvbnNlIGNhcnJpZWQgbm8gZmlndXJlc1xuICogICAgIChhIHRyaW1tZWQgb3IgcHJveGllZCBib2R5KS4gRmFsbCBiYWNrIHRvIGdlbmVyaWMgY29weTsgZG8gbm90XG4gKiAgICAgcmVhZCBpdCBhcyB6ZXJvLCB3aGljaCBpcyB0aGUgc2VudGluZWwgYWJvdmUuXG4gKlxuICogQW5kIGEgdGhpcmQgdGhlIGZpZWxkcyBjYW5ub3QgZGlzdGluZ3Vpc2ggb24gdGhlaXIgb3duOiBjb25zdW1wdGlvblxuICogc3BhbnMgbW9udGhzLCBzbyBhIG1lcmNoYW50IGNhbiBiZSBhdCB0aGVpciBjZWlsaW5nIHB1cmVseSBiZWNhdXNlXG4gKiBvbGRlciBpbnZvaWNlcyBhcmUgdW5wYWlkLiBgZ2V0Q3JlZGl0TGluZSgpYCB0ZWxscyB5b3Ugd2hpY2guXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRMaW1pdFJlYWNoZWRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgbGltaXRNaW5vcj86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlTWlub3I/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJlcXVlc3RlZE1pbm9yPzogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihcbiAgICBmaWd1cmVzOiB7XG4gICAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgICAgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgICAgIGF2YWlsYWJsZU1pbm9yPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gICAgfSxcbiAgICBib2R5OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0NyZWRpdExpbWl0UmVhY2hlZEVycm9yJztcbiAgICB0aGlzLmxpbWl0TWlub3IgPSBmaWd1cmVzLmxpbWl0TWlub3I7XG4gICAgdGhpcy5jb25zdW1lZE1pbm9yID0gZmlndXJlcy5jb25zdW1lZE1pbm9yO1xuICAgIHRoaXMuYXZhaWxhYmxlTWlub3IgPSBmaWd1cmVzLmF2YWlsYWJsZU1pbm9yO1xuICAgIHRoaXMucmVxdWVzdGVkTWlub3IgPSBmaWd1cmVzLnJlcXVlc3RlZE1pbm9yO1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFyZ2Ugb24gYSBjcmVkaXQtbGluZSBtZXJjaGFudCBhcnJpdmVkIHdpdGhvdXQgaXRzIEdTVCBzcGxpdFxuICogKEhUVFAgNDAwKS5cbiAqXG4gKiBDb25zdW1wdGlvbiBpcyB0cmFja2VkIG5ldCBvZiBHU1QsIHNvIGBicmVha3VwYCBpcyByZXF1aXJlZCByYXRoZXJcbiAqIHRoYW4gYSByYXRlIGJlaW5nIGluZmVycmVkLiBJZiB5b3UgaGl0IHRoaXMsIHRoZSBjYWxsZXIgaXMgc2VuZGluZ1xuICogZ3Jvc3Mtb25seSBhbW91bnRzIGFuZCBuZWVkcyB0byBzZW5kIGBicmVha3VwYCDigJQgdGhlIHNhbWUgc3BsaXQgaXRcbiAqIGFsbW9zdCBjZXJ0YWlubHkgYWxyZWFkeSBjb21wdXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdEJyZWFrdXBSZXF1aXJlZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDAsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRCcmVha3VwUmVxdWlyZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqIGBhbGxvd05lZ2F0aXZlYCB3YXMgcGFzc2VkIGZvciBhIGNyZWRpdC1saW5lIG1lcmNoYW50IChIVFRQIDQwMCkuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0T3ZlcnJpZGVSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwMCwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0NyZWRpdE92ZXJyaWRlUmVmdXNlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgcmUtc2V0dGxlbWVudCBjaGFuZ2VkIGFuIGludm9pY2UncyBmaWd1cmVzIHdpdGhvdXQgc2F5aW5nIHdoeVxuICogKEhUVFAgNDAwKS5cbiAqXG4gKiBSZS1zZXR0bGluZyBhIFJFVkVSU0VEIGludm9pY2Ugd2l0aCBkaWZmZXJlbnQgZmlndXJlcyBpcyBob3cgYSBzZXR0bGVkXG4gKiBhbW91bnQgaXMgY29ycmVjdGVkLCBzbyB0aGUgc2VydmljZSBkb2VzIG5vdCByZWZ1c2UgaXQgdGhlIHdheSBpdFxuICogcmVmdXNlcyBhIGNvbmZsaWN0aW5nIGZpcnN0IHNldHRsZW1lbnQuIEJ1dCBpdCByZWxlYXNlcyBhZ2FpbnN0IHRoZVxuICogbWVyY2hhbnQncyB3aG9sZSBvdXRzdGFuZGluZyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiB0aGUgaW52b2ljZSdzIG93blxuICogYW1vdW50LCBzbyBhIG1pc3R5cGVkIGZpZ3VyZSBjYW4gaGFuZCBiYWNrIGZhciBtb3JlIHRoYW4gdGhlIGludm9pY2VcbiAqIGhlbGQg4oCUIGFuZCBhIGRlbGliZXJhdGUgY29ycmVjdGlvbiBjYW4gc2F5IHdoYXQgaXQgaXMgY29ycmVjdGluZyB3aGVyZVxuICogYSByZXBsYXllZCB3ZWJob29rIGNhbm5vdC4gUGFzcyBgcmVhc29uYCBhbmQgcmV0cnkuIFJlLXNldHRsaW5nIHdpdGhcbiAqIHRoZSBTQU1FIGZpZ3VyZXMgbmVlZHMgbm9uZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdENvcnJlY3Rpb25SZWFzb25SZXF1aXJlZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogV2hhdCB0aGUgaW52b2ljZSB3YXMgcHJldmlvdXNseSBzZXR0bGVkIGZvciwgaW4gbWlub3IgdW5pdHMuICovXG4gICAgcmVhZG9ubHkgcHJldmlvdXNOZXRNaW5vcjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoNDAwLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0Q29ycmVjdGlvblJlYXNvblJlcXVpcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQSBsaW1pdCBjaGFuZ2UgbmFtZWQgYSBjdXJyZW5jeSB0aGUgY3JlZGl0IGxpbmUgaXMgbm90IGRlbm9taW5hdGVkIGluXG4gKiAoSFRUUCA0MDkpLlxuICpcbiAqIFRoZSBsaW5lJ3MgY3VycmVuY3kgaXMgZml4ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLCBiZWNhdXNlIGl0IHNldHMgdGhlXG4gKiBleHBvbmVudCBldmVyeSBzdG9yZWQgZmlndXJlIGlzIGFscmVhZHkgc2NhbGVkIGJ5IOKAlCBjaGFuZ2luZyBpdCB3b3VsZFxuICogcmUtZGVub21pbmF0ZSB0aGUgbGltaXQgYW5kIHRoZSBjb25zdW1wdGlvbiB3aXRob3V0IHRvdWNoaW5nIGVpdGhlclxuICogbnVtYmVyLiBSZS1kZW5vbWluYXRpbmcgYSBsaXZlIGxpbmUgaXMgYSBtaWdyYXRpb24sIG5vdCBhIGZpZWxkXG4gKiB1cGRhdGUsIHNvIHRoaXMgaXMgbm90IHNvbWV0aGluZyBhIGNhbGxlciBjYW4gcmV0cnkgcGFzdDogc2VuZCB0aGVcbiAqIGN1cnJlbmN5IHRoZSBsaW5lIGFscmVhZHkgY2Fycmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdEN1cnJlbmN5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RvcmVkQ3VycmVuY3k6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZWFkb25seSByZXF1ZXN0ZWRDdXJyZW5jeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0Q3VycmVuY3lDb25mbGljdEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtZXJjaGFudCdzIGNyZWRpdCBsaW5lIGFuZCB0aGUgd2FsbGV0IHRoZSBjaGFyZ2Ugcm91dGVkIHRvIGFyZSBpblxuICogZGlmZmVyZW50IGN1cnJlbmNpZXMgKEhUVFAgNDA5KS5cbiAqXG4gKiBgYW1vdW50TWlub3JgIGFuZCBgYnJlYWt1cGAgY2Fycnkgbm8gY3VycmVuY3kgb2YgdGhlaXIgb3duIOKAlCB0aGV5IGFyZVxuICogcmVhZCB3aXRoIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzb2x2ZWQgd2FsbGV0IOKAlCBzbyB3aGVuIHRoZSB0d29cbiAqIGRpc2FncmVlIHRoZXJlIGlzIG5vIHJlYWRpbmcgb2YgdGhlbSB0aGF0IGlzIHJpZ2h0IGZvciBib3RoLCBhbmQgdGhlXG4gKiBzZXJ2aWNlIHJlZnVzZXMgcmF0aGVyIHRoYW4gbWlzLXNjYWxpbmcgYnkgYSBmYWN0b3Igb2YgdGVuIG9yIGFcbiAqIGh1bmRyZWQuIE5vdCBjYWxsZXItZml4YWJsZTogaXQgbWVhbnMgdGhlIG1lcmNoYW50J3Mgcm91dGluZyBhbmQgdGhlaXJcbiAqIGNyZWRpdCBsaW5lIGRpc2FncmVlLCB3aGljaCBpcyBhbiBvcHMvZGF0YSBwcm9ibGVtLlxuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0Q3VycmVuY3lNaXNtYXRjaEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRDdXJyZW5jeU1pc21hdGNoRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQSBwbGFpbiB0b3AtdXAgd2FzIHNlbnQgZm9yIGEgY3JlZGl0LWxpbmUgbWVyY2hhbnQgKEhUVFAgNDAwKS5cbiAqXG4gKiBUaGVzZSBtZXJjaGFudHMgaGF2ZSBubyBiYWxhbmNlIHRvIHRvcCB1cDogYHdhbGxldF9iYWxhbmNlYCBpcyB0aGVcbiAqIGZpY3Rpb24gdGhlIGNyZWRpdCBsaW5lIHJlcGxhY2VzIGFuZCBpcyBkZWxpYmVyYXRlbHkgZnJvemVuLCBzbyB0aGVcbiAqIHdyaXRlIHdvdWxkIG1vdmUgbm90aGluZyB3aGlsZSBhcHBlYXJpbmcgdG8gc3VjY2VlZC4gQ3JlZGl0IGlzIGhhbmRlZFxuICogYmFjayBieSBzZXR0bGluZyBhbiBpbnZvaWNlIChgc2V0dGxlSW52b2ljZWApLCBuZXZlciBieSBjcmVkaXRpbmcgdGhlXG4gKiB3YWxsZXQuIEEgZ2VudWluZSByZWZ1bmQgaXMgYWNjZXB0ZWQg4oCUIHNlbmQgaXQgYXMgYHJldmVyc2FsT2ZgIG9yXG4gKiBgaXNSZWZ1bmRgIGFuZCBpdCByZWxlYXNlcyB0aGUgY3JlZGl0IHRoZSBvcmlnaW5hbCBjaGFyZ2UgY29uc3VtZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRUb3BVcFJlZnVzZWRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDAwLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0VG9wVXBSZWZ1c2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG1lcmNoYW50IGlzIG5vdCBvbiB0aGUgY3JlZGl0IGxpbmUgKEhUVFAgNDA0KS5cbiAqXG4gKiBUaGUgbm9ybWFsIHN0YXRlIGZvciBhIHByZXBhaWQgbWVyY2hhbnQsIHNvIGEgd2lkZ2V0IHNob3VsZCB0cmVhdCBpdFxuICogYXMgXCJzaG93IHRoZSB3YWxsZXQgYmFsYW5jZSBpbnN0ZWFkXCIsIG5vdCBhcyBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdExpbmVOb3RGb3VuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDQsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRMaW5lTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBgZW5hYmxlZDogZmFsc2VgIHdhcyByZWZ1c2VkIGJlY2F1c2UgdGhlIG1lcmNoYW50IHN0aWxsIG93ZXMgZm9yIHRoZVxuICogY3JlZGl0IGxpbmUgKEhUVFAgNDA5KS5cbiAqXG4gKiBEaXNhYmxpbmcgbW92ZXMgYSBtZXJjaGFudCBiYWNrIHRvIGEgd2FsbGV0IGJhbGFuY2UsIGFuZCBkb2luZyB0aGF0XG4gKiB3aXRoIGNvbnN1bXB0aW9uIG91dHN0YW5kaW5nIGFiYW5kb25zIGl0LiBTaG93IGBjb25zdW1lZE1pbm9yYCBhbmRcbiAqIHRlbGwgdGhlIG9wZXJhdG9yIHRvIHNldHRsZSBmaXJzdCDigJQgb3IsIGlmIHRoZSBpbnRlbnQgd2FzIHRvIHN0b3AgdGhlXG4gKiBtZXJjaGFudCB0cmFkaW5nIHJhdGhlciB0aGFuIHRvIG1vdmUgdGhlbSBvZmYgdGhlIG1vZGVsLCBzZXRcbiAqIGBsaW1pdE1pbm9yOiAwYCwgd2hpY2ggYmxvY2tzIGV2ZXJ5IGNoYXJnZSBhbmQga2VlcHMgdGhlIGJhbGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRMaW5lSGFzT3V0c3RhbmRpbmdFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgY29uc3VtZWRNaW5vcjogbnVtYmVyO1xuICByZWFkb25seSBnc3RBY2NydWVkTWlub3I6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoY29uc3VtZWRNaW5vcjogbnVtYmVyLCBnc3RBY2NydWVkTWlub3I6IG51bWJlciwgYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0TGluZUhhc091dHN0YW5kaW5nRXJyb3InO1xuICAgIHRoaXMuY29uc3VtZWRNaW5vciA9IGNvbnN1bWVkTWlub3I7XG4gICAgdGhpcy5nc3RBY2NydWVkTWlub3IgPSBnc3RBY2NydWVkTWlub3I7XG4gIH1cbn1cblxuLyoqIEEgbGltaXQgYHJlZmVyZW5jZUlkYCBvciBhbiBpbnZvaWNlIHdhcyByZXVzZWQgZm9yIGRpZmZlcmVudCBmaWd1cmVzIChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0SWRlbXBvdGVuY3lDb25mbGljdEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3InO1xuICB9XG59XG5cbi8qKiBObyBzZXR0bGVtZW50IHRvIHJldmVyc2UgZm9yIHRoYXQgaW52b2ljZSAoSFRUUCA0MDQpLiAqL1xuZXhwb3J0IGNsYXNzIFNldHRsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDQsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdTZXR0bGVtZW50Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjcmVkaXQ6IHtcbiAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgIGNvbnN1bWVkTWlub3I/OiBudW1iZXI7XG4gICAgYXZhaWxhYmxlTWlub3I/OiBudW1iZXI7XG4gICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gIH0gPSB7fTtcbiAgbGV0IG91dHN0YW5kaW5nOiB7IGNvbnN1bWVkTWlub3I/OiBudW1iZXI7IGdzdEFjY3J1ZWRNaW5vcj86IG51bWJlciB9ID0ge307XG4gIGxldCBjb3JyZWN0aW9uOiB7XG4gICAgcHJldmlvdXNOZXRNaW5vcj86IG51bWJlcjtcbiAgICBzdG9yZWRDdXJyZW5jeT86IHN0cmluZztcbiAgICByZXF1ZXN0ZWRDdXJyZW5jeT86IHN0cmluZztcbiAgfSA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYm9keSkgYXMge1xuICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICBiYWxhbmNlTWlub3I/OiBudW1iZXI7XG4gICAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgICAgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgICAgIGF2YWlsYWJsZU1pbm9yPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gICAgICBnc3RBY2NydWVkTWlub3I/OiBudW1iZXI7XG4gICAgICBwcmV2aW91c05ldE1pbm9yPzogbnVtYmVyO1xuICAgICAgc3RvcmVkQ3VycmVuY3k/OiBzdHJpbmc7XG4gICAgICByZXF1ZXN0ZWRDdXJyZW5jeT86IHN0cmluZztcbiAgICB9O1xuICAgIGNvZGUgPSBwYXJzZWQuZXJyb3I7XG4gICAgYmFsYW5jZU1pbm9yID0gcGFyc2VkLmJhbGFuY2VNaW5vcjtcbiAgICBjcmVkaXQgPSBwYXJzZWQ7XG4gICAgb3V0c3RhbmRpbmcgPSBwYXJzZWQ7XG4gICAgY29ycmVjdGlvbiA9IHBhcnNlZDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9uLUpTT04gYm9keSDigJQgZmFsbCB0aHJvdWdoIHRvIGEgZ2VuZXJpYyBlcnJvclxuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaW5zdWZmaWNpZW50X2JhbGFuY2UnKSB7XG4gICAgcmV0dXJuIG5ldyBJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3IoYmFsYW5jZU1pbm9yID8/IDAsIGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2xpbWl0X3JlYWNoZWQnKSB7XG4gICAgLy8gTk9UIGA/PyAwYC4gYGF2YWlsYWJsZU1pbm9yID09PSAwYCBpcyB0aGUgZG9jdW1lbnRlZCBzZW50aW5lbCBmb3JcbiAgICAvLyBcInRoZSBsaW1pdCBpcyB1c2VkIHVwXCIsIGFuZCBkZWZhdWx0aW5nIHRvIGl0IG1hZGUgYSB0cmltbWVkIG9yXG4gICAgLy8gcHJveGllZCBib2R5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhhdCDigJQgcHJvZHVjaW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gd3JvbmcgbWVyY2hhbnQgY29weSBpbiB0aGUgb25lIHBsYWNlIHRoaXMgZXJyb3IgdHlwZSBleGlzdHMgdG8gZ2V0XG4gICAgLy8gcmlnaHQuIEFic2VudCBzdGF5cyBhYnNlbnQsIHdoaWNoIGFsc28gbWF0Y2hlcyBQSFAnc1xuICAgIC8vIGBjcmVkaXRGaWd1cmVzKClgLCBzbyB0aGUgdHdvIFNES3MgYWdyZWUgb24gdGhlIHJ1bGUuXG4gICAgcmV0dXJuIG5ldyBDcmVkaXRMaW1pdFJlYWNoZWRFcnJvcihcbiAgICAgIHtcbiAgICAgICAgbGltaXRNaW5vcjogY3JlZGl0LmxpbWl0TWlub3IsXG4gICAgICAgIGNvbnN1bWVkTWlub3I6IGNyZWRpdC5jb25zdW1lZE1pbm9yLFxuICAgICAgICBhdmFpbGFibGVNaW5vcjogY3JlZGl0LmF2YWlsYWJsZU1pbm9yLFxuICAgICAgICByZXF1ZXN0ZWRNaW5vcjogY3JlZGl0LnJlcXVlc3RlZE1pbm9yLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgKTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDAgJiYgY29kZSA9PT0gJ2NyZWRpdF9icmVha3VwX3JlcXVpcmVkJykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0QnJlYWt1cFJlcXVpcmVkRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIGNvZGUgPT09ICdjcmVkaXRfb3ZlcnJpZGVfcmVmdXNlZCcpIHtcbiAgICByZXR1cm4gbmV3IENyZWRpdE92ZXJyaWRlUmVmdXNlZEVycm9yKGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwMCAmJiBjb2RlID09PSAnY3JlZGl0X3RvcF91cF9yZWZ1c2VkJykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0VG9wVXBSZWZ1c2VkRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIGNvZGUgPT09ICdjcmVkaXRfY29ycmVjdGlvbl9yZWFzb25fcmVxdWlyZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRDb3JyZWN0aW9uUmVhc29uUmVxdWlyZWRFcnJvcihjb3JyZWN0aW9uLnByZXZpb3VzTmV0TWlub3IsIGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2N1cnJlbmN5X2NvbmZsaWN0Jykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0Q3VycmVuY3lDb25mbGljdEVycm9yKFxuICAgICAgY29ycmVjdGlvbi5zdG9yZWRDdXJyZW5jeSxcbiAgICAgIGNvcnJlY3Rpb24ucmVxdWVzdGVkQ3VycmVuY3ksXG4gICAgICBib2R5LFxuICAgICk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdjcmVkaXRfY3VycmVuY3lfbWlzbWF0Y2gnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRDdXJyZW5jeU1pc21hdGNoRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdjcmVkaXRfbGluZV9oYXNfb3V0c3RhbmRpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRMaW5lSGFzT3V0c3RhbmRpbmdFcnJvcihcbiAgICAgIG91dHN0YW5kaW5nLmNvbnN1bWVkTWlub3IgPz8gMCxcbiAgICAgIG91dHN0YW5kaW5nLmdzdEFjY3J1ZWRNaW5vciA/PyAwLFxuICAgICAgYm9keSxcbiAgICApO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2lkZW1wb3RlbmN5X2NvbmZsaWN0Jykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0SWRlbXBvdGVuY3lDb25mbGljdEVycm9yKGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwNCAmJiBjb2RlID09PSAnY3JlZGl0X2xpbmVfbm90X2ZvdW5kJykgcmV0dXJuIG5ldyBDcmVkaXRMaW5lTm90Rm91bmRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0ICYmIGNvZGUgPT09ICdzZXR0bGVtZW50X25vdF9mb3VuZCcpIHJldHVybiBuZXcgU2V0dGxlbWVudE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnb3Zlcl9yZWZ1bmQnKSByZXR1cm4gbmV3IE92ZXJSZWZ1bmRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdpZGVtcG90ZW5jeV9jb25mbGljdCcpIHJldHVybiBuZXcgSWRlbXBvdGVuY3lDb25mbGljdEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ3dhbGxldF9pZGVudGl0eV9taXNtYXRjaCcpIHtcbiAgICByZXR1cm4gbmV3IFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvcihib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MjIgJiYgY29kZSA9PT0gJ2ludmFsaWRfcmV2ZXJzYWwnKSByZXR1cm4gbmV3IEludmFsaWRSZXZlcnNhbEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MjIgJiYgY29kZSA9PT0gJ3VucmVzb2x2YWJsZV93YWxsZXQnKSByZXR1cm4gbmV3IFVucmVzb2x2YWJsZVdhbGxldEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MDQpIHJldHVybiBuZXcgV2FsbGV0Tm90Rm91bmRFcnJvcihib2R5KTtcbiAgcmV0dXJuIG5ldyBXYWxsZXRBcGlFcnJvcihzdGF0dXMsIGJvZHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2FsbGV0Q2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBXYWxsZXRDbGllbnQge1xuICBjb25zdCBzdGF0ZSA9IG5ldyBDb25maWdTdGF0ZSgpO1xuICBzdGF0ZS5hcHBseShpbnB1dCk7XG5cbiAgY29uc3QgY2xpZW50OiBXYWxsZXRDbGllbnQgPSB7XG4gICAgY29uZmlnKG9wdHMpIHtcbiAgICAgIHN0YXRlLmFwcGx5KG9wdHMpO1xuICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9LFxuICAgIGF1dGgob3B0cykge1xuICAgICAgc3RhdGUuc2V0QXV0aChvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhc3luYyBnZXRDcmVkaXRVdGlsaXNhdGlvbihmaWx0ZXIgPSB7fSkge1xuICAgICAgY29uc3QgcCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIGlmIChmaWx0ZXIubWluVXRpbGlzYXRpb25CcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwLnNldCgnbWluVXRpbGlzYXRpb25CcHMnLCBTdHJpbmcoZmlsdGVyLm1pblV0aWxpc2F0aW9uQnBzKSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyLmJhbmQpIHAuc2V0KCdiYW5kJywgZmlsdGVyLmJhbmQpO1xuICAgICAgaWYgKGZpbHRlci5vZmZzZXQgIT09IHVuZGVmaW5lZCkgcC5zZXQoJ29mZnNldCcsIFN0cmluZyhmaWx0ZXIub2Zmc2V0KSk7XG4gICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9jcmVkaXQvdXRpbGlzYXRpb24nO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBwLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBDcmVkaXRVdGlsaXNhdGlvblBhZ2U7XG4gICAgfSxcbiAgICBnZXRXYWxsZXQob3B0cykge1xuICAgICAgLy8gUGFyc2UgZWFnZXJseSBzbyBhIG1hbGZvcm1lZCBpZCBmYWlscyBmYXN0IGF0IHRoZSBjYWxsIHNpdGUsXG4gICAgICAvLyBidXQgZG8gTk9UIHJlc29sdmUgdGhlIHdhbGxldCBoZXJlIOKAlCB0aGF0IGhhcHBlbnMgb24gdGhlIGZpcnN0XG4gICAgICAvLyBvcGVyYXRpb24gYWdhaW5zdCB0aGUgaGFuZGxlLlxuICAgICAgY29uc3QgYnVzaW5lc3NJZCA9IHBhcnNlQnVzaW5lc3NJZChvcHRzLmlkKTtcbiAgICAgIGNvbnN0IGZvcmNlQ2hpbGRXYWxsZXQgPSBvcHRzLmZvcmNlQ2hpbGRXYWxsZXQgPT09IHRydWU7XG5cbiAgICAgIGNvbnN0IGJhc2VQYXJhbXMgPSAoKTogVVJMU2VhcmNoUGFyYW1zID0+IHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBidXNpbmVzc0lkOiBTdHJpbmcoYnVzaW5lc3NJZCkgfSk7XG4gICAgICAgIGlmIChmb3JjZUNoaWxkV2FsbGV0KSBwLnNldCgnZm9yY2VDaGlsZFdhbGxldCcsICd0cnVlJyk7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0SnNvbiA9IGFzeW5jIDxUPihwYXRoOiBzdHJpbmcsIHBhcmFtczogVVJMU2VhcmNoUGFyYW1zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke3BhcmFtcy50b1N0cmluZygpfWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlbmRKc29uID0gYXN5bmMgPFQ+KFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyB8ICdQVVQnLFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIHBheWxvYWQ6IHVua25vd24sXG4gICAgICApOiBQcm9taXNlPFQ+ID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH1gLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwb3N0VHJhbnNhY3Rpb24gPSBhc3luYyAoXG4gICAgICAgIHR5cGU6ICdkZWJpdCcgfCAnY3JlZGl0JyxcbiAgICAgICAgYm9keTogRGViaXRJbnB1dCB8IENyZWRpdElucHV0LFxuICAgICAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4gPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvdHJhbnNhY3Rpb25zJztcbiAgICAgICAgLy8gVGhlIHdhbGxldCBpZGVudGl0eSBpcyBleGFjdGx5LW9uZS1vZiBzZXJ2ZXItc2lkZSwgc28gYW4gZXhwbGljaXRcbiAgICAgICAgLy8gYHdhbGxldGAgb3ZlcnJpZGUgUkVQTEFDRVMgdGhpcyBoYW5kbGUncyBidXNpbmVzc0lkIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIHRyYXZlbGxpbmcgYWxvbmdzaWRlIGl0IOKAlCBzZW5kaW5nIGJvdGggaXMgYSA0MDAuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBib2R5LndhbGxldCA/IHsgdHlwZSwgLi4uYm9keSB9IDogeyBidXNpbmVzc0lkLCBmb3JjZUNoaWxkV2FsbGV0LCB0eXBlLCAuLi5ib2R5IH0sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH1gLFxuICAgICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVHJhbnNhY3Rpb25SZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3YWxsZXQ6IFdhbGxldCA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJBTEFOQ0UgRklSU1QsIGRlbGliZXJhdGVseSwgYW5kIHRoZSBvcmRlciBpcyB0aGUgd2hvbGUgZGVzaWduLlxuICAgICAgICAgKlxuICAgICAgICAgKiBgZ2V0QmFsYW5jZSgpYCBjYXJyaWVzIGBzb3VyY2VgLCBzbyBmb3IgYW55IG1lcmNoYW50IHdobyBoYXMgYVxuICAgICAgICAgKiB3YWxsZXQgYXQgYWxsIGl0IHNldHRsZXMgcHJlcGFpZC12cy1jcmVkaXQgd2l0aG91dCBhblxuICAgICAgICAgKiBleGNlcHRpb24uIFRoZSBhbHRlcm5hdGl2ZSDigJQgY2FsbCBgZ2V0Q3JlZGl0TGluZSgpYCBhbmQgY2F0Y2hcbiAgICAgICAgICogaXRzIDQwNCDigJQgbWFrZXMgdGhlICpub3JtYWwqIHN0YXRlIG9mIGEgcHJlcGFpZCBtZXJjaGFudCBhblxuICAgICAgICAgKiBlcnJvcjogYSA0MDQgaW4gdGhlIG5ldHdvcmsgdGFiIGFuZCBhIHRocm93IGluIHRoZSBsb2dzIG9uXG4gICAgICAgICAqIGV2ZXJ5IGRhc2hib2FyZCBsb2FkLCBmb3Igbm90aGluZyBiZWluZyB3cm9uZy5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgYWxzbyBjb3N0cyBsZXNzIHdoZXJlIGl0IG1hdHRlcnMuIE1vc3QgbWVyY2hhbnRzIGFyZVxuICAgICAgICAgKiBwcmVwYWlkLCBhbmQgZm9yIHRoZW0gdGhpcyBpcyBPTkUgcmVxdWVzdDogdGhlIGJhbGFuY2UgaXMgYm90aFxuICAgICAgICAgKiB0aGUgYW5zd2VyIGFuZCB0aGUgZGF0YS4gT25seSBhIGNyZWRpdCBtZXJjaGFudCBwYXlzIGEgc2Vjb25kXG4gICAgICAgICAqIHJvdW5kIHRyaXAsIGFuZCBvbmx5IGJlY2F1c2UgdGhleSBoYXZlIGZpZ3VyZXMgYSBiYWxhbmNlIGNhbm5vdFxuICAgICAgICAgKiBjYXJyeS5cbiAgICAgICAgICpcbiAgICAgICAgICogYHNvdXJjZWAgYWJzZW50IG1lYW5zIGEgd2FsbGV0IHNlcnZpY2Ugb2xkZXIgdGhhbiB0aGUgY3JlZGl0XG4gICAgICAgICAqIGxpbmUsIHdoaWNoIGlzIHByZXBhaWQgYnkgZGVmaW5pdGlvbiDigJQgc28gYW4gb2xkIHNlcnZpY2UgcmVhZHNcbiAgICAgICAgICogYXMgcHJlcGFpZCByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICAgICAgICpcbiAgICAgICAgICogV0hBVCBUSElTIERPRVMgTk9UIFNXQUxMT1cuIGBnZXRCYWxhbmNlKClgIGlzIG5vdCBhIGd1YXJhbnRlZWRcbiAgICAgICAgICogMjAwOiBpdCBhbnN3ZXJzIGBXYWxsZXROb3RGb3VuZEVycm9yYCB3aGVuIG5vIHdhbGxldCBkb2N1bWVudFxuICAgICAgICAgKiBleGlzdHMgZm9yIHRoZSByZXNvbHZlZCBpZGVudGl0eSwgYW5kIGBVbnJlc29sdmFibGVXYWxsZXRFcnJvcmBcbiAgICAgICAgICogd2hlbiByb3V0aW5nIGNhbm5vdCBuYW1lIG9uZS4gQm90aCBwcm9wYWdhdGUsIGJlY2F1c2UgYm90aCBtZWFuXG4gICAgICAgICAqIHRoZXJlIGlzIGdlbnVpbmVseSBub3RoaW5nIHRvIHJlbmRlciDigJQgcmVwb3J0aW5nIGBwcmVwYWlkYCB3aXRoXG4gICAgICAgICAqIGEgemVybyBiYWxhbmNlIHdvdWxkIGludmVudCBhIHdhbGxldC5cbiAgICAgICAgICpcbiAgICAgICAgICogQ0FQQUJJTElUSUVTLiBgd2FsbGV0LmJhbGFuY2U6cmVhZGAgY292ZXJzIGEgcHJlcGFpZCBtZXJjaGFudC5cbiAgICAgICAgICogQSBjcmVkaXQgbWVyY2hhbnQgbmVlZHMgYHdhbGxldC5jcmVkaXQ6cmVhZGAgYXMgd2VsbCwgYW5kIGFcbiAgICAgICAgICogdG9rZW4gaG9sZGluZyBvbmx5IHRoZSBmb3JtZXIgZ2V0cyBhIGBXYWxsZXRBcGlFcnJvcmAgd2l0aFxuICAgICAgICAgKiBgc3RhdHVzID09PSA0MDNgIGZyb20gdGhlIHNlY29uZCBjYWxsIOKAlCBldmVyeSB3YWxsZXQgbWV0aG9kXG4gICAgICAgICAqIHRocm93cyBmcm9tIHRoYXQgb25lIGhpZXJhcmNoeSwgc28gYnJhbmNoIG9uIGAuc3RhdHVzYCByYXRoZXJcbiAgICAgICAgICogdGhhbiBsb29raW5nIGZvciB0aGUgU0RLJ3MgYEF1dGhvcml6YXRpb25FcnJvcmAsIHdoaWNoIHRoaXNcbiAgICAgICAgICogbmFtZXNwYWNlIGRvZXMgbm90IHJhaXNlLiBJdCBpcyBkZWxpYmVyYXRlbHkgbm90IGNhdWdodDpcbiAgICAgICAgICogZmFsbGluZyBiYWNrIHRvIGBwcmVwYWlkYCB3b3VsZCBoYW5kIHRoZSBkYXNoYm9hcmQgYVxuICAgICAgICAgKiBgd2FsbGV0X2JhbGFuY2VgIHRoYXQgaXMgZnJvemVuIGZvciBleGFjdGx5IHRoZXNlIG1lcmNoYW50cywgc29cbiAgICAgICAgICogaXQgd291bGQgcmVuZGVyIGEgY29uZmlkZW50LCBzdGFsZSwgd3JvbmcgbnVtYmVyIGluc3RlYWQgb2YgYW5cbiAgICAgICAgICogZXJyb3Igc29tZW9uZSBjYW4gZml4IGJ5IHdpZGVuaW5nIHRoZSBncmFudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldE92ZXJ2aWV3KCkge1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB3YWxsZXQuZ2V0QmFsYW5jZSgpO1xuICAgICAgICAgIGlmIChiYWxhbmNlLnNvdXJjZSAhPT0gJ2NyZWRpdF9saW5lJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogJ3ByZXBhaWQnLCBiYWxhbmNlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiAnY3JlZGl0JywgYmFsYW5jZSwgY3JlZGl0TGluZTogYXdhaXQgd2FsbGV0LmdldENyZWRpdExpbmUoKSB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gT3BzIGNhbiBkaXNhYmxlIGEgY3JlZGl0IGxpbmUgYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiBSYXJlLFxuICAgICAgICAgICAgLy8gYnV0IHRoZSBob25lc3QgYW5zd2VyIGlzIHRoZW4gXCJwcmVwYWlkXCIgcmF0aGVyIHRoYW4gYW5cbiAgICAgICAgICAgIC8vIGVycm9yIGEgZGFzaGJvYXJkIGNhbm5vdCBhY3Qgb24uXG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ3JlZGl0TGluZU5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogJ3ByZXBhaWQnLCBiYWxhbmNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRCYWxhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9iYWxhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2luc3RhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0SW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldEN1cnJlbmN5KCkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LmdldEluc3RhbmNlKCkpLmN1cnJlbmN5O1xuICAgICAgICB9LFxuICAgICAgICBkZWJpdChib2R5KSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3RUcmFuc2FjdGlvbignZGViaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdjcmVkaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXIgPSB7fSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBiYXNlUGFyYW1zKCk7XG4gICAgICAgICAgaWYgKGZpbHRlci50eXBlKSBwLnNldCgndHlwZScsIGZpbHRlci50eXBlKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmZyb20pIHAuc2V0KCdmcm9tJywgZmlsdGVyLmZyb20pO1xuICAgICAgICAgIGlmIChmaWx0ZXIudG8pIHAuc2V0KCd0bycsIGZpbHRlci50byk7XG4gICAgICAgICAgaWYgKGZpbHRlci5zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHAuc2V0KCdzZXJ2aWNlJywgU3RyaW5nKGZpbHRlci5zZXJ2aWNlKSk7XG4gICAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2VJZCkgcC5zZXQoJ3JlZmVyZW5jZUlkJywgZmlsdGVyLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnRhZykgcC5zZXQoJ3RhZycsIGZpbHRlci50YWcpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuY3Vyc29yKSBwLnNldCgnY3Vyc29yJywgZmlsdGVyLmN1cnNvcik7XG4gICAgICAgICAgaWYgKGZpbHRlci5saW1pdCAhPT0gdW5kZWZpbmVkKSBwLnNldCgnbGltaXQnLCBTdHJpbmcoZmlsdGVyLmxpbWl0KSk7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyc7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblBhZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKGlkKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy8ke2lkfWA7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtiYXNlUGFyYW1zKCkudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFdhbGxldFRyYW5zYWN0aW9uO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIOKUgOKUgCBDcmVkaXQgbGluZSDilIDilIBcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlc2Ugc2VuZCBgYnVzaW5lc3NJZGAgYWxvbmUsIG5ldmVyIGBmb3JjZUNoaWxkV2FsbGV0YDogdGhlXG4gICAgICAgIC8vIGNyZWRpdCBsaW5lIGlzIHJlc29sdmVkIHRvIHRoZSBtZXJjaGFudCB0aGF0IG93bnMgdGhlIGJ1c2luZXNzLFxuICAgICAgICAvLyBhbmQgd2hpY2ggd2FsbGV0IHdvdWxkIGhhdmUgcGFpZCBpcyBub3QgcGFydCBvZiB0aGF0IHF1ZXN0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgYnVzaW5lc3NJZGAgaXMgc3ByZWFkIExBU1Qgc28gdGhlIGhhbmRsZSdzIG1lcmNoYW50IHdpbnMuIEFcbiAgICAgICAgLy8gY2FsbGVyIHdobyBwYXNzZXMgdGhlaXIgb3duIGBidXNpbmVzc0lkYCBpcyBuYW1pbmcgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gbWVyY2hhbnQsIGFuZCBob25vdXJpbmcgaXQgd291bGQgbW92ZSBhIGxpbWl0IG9yIHNldHRsZSBhblxuICAgICAgICAvLyBpbnZvaWNlIGFnYWluc3QgdGhhdCBvbmUgd2hpbGUgZXZlcnkgbG9nIGxpbmUgYW5kIGVycm9yIHN0aWxsXG4gICAgICAgIC8vIG5hbWVkIHRoaXMgaGFuZGxlJ3MuXG5cbiAgICAgICAgYXN5bmMgZ2V0Q3JlZGl0TGluZSgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0SnNvbjxDcmVkaXRMaW5lPihcbiAgICAgICAgICAgICcvdjEvd2FsbGV0L2NyZWRpdCcsXG4gICAgICAgICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGxpc3RDcmVkaXRFdmVudHMoZmlsdGVyID0ge30pIHtcbiAgICAgICAgICBjb25zdCBwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGJ1c2luZXNzSWQ6IFN0cmluZyhidXNpbmVzc0lkKSB9KTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgZ2V0SnNvbjx7IGV2ZW50cz86IENyZWRpdEV2ZW50W10gfT4oJy92MS93YWxsZXQvY3JlZGl0L2V2ZW50cycsIHApO1xuICAgICAgICAgIC8vIGA/PyBbXWAgcmF0aGVyIHRoYW4gYSBiYXJlIGBwYWdlLmV2ZW50c2A6IHRoZSBkZWNsYXJlZCB0eXBlXG4gICAgICAgICAgLy8gc2F5cyB0aGUga2V5IGlzIGFsd2F5cyB0aGVyZSwgYnV0IHRoZSB0eXBlIGRlc2NyaWJlcyB3aGF0IHRoZVxuICAgICAgICAgIC8vIHNlcnZpY2UgaW50ZW5kcyB0byBzZW5kLCBub3Qgd2hhdCBhIHByb3h5LCBhbiBvbGRlclxuICAgICAgICAgIC8vIGRlcGxveW1lbnQgb3IgYSB0cnVuY2F0ZWQgYm9keSBhY3R1YWxseSBkZWxpdmVyZWQuIFJldHVybmluZ1xuICAgICAgICAgIC8vIGB1bmRlZmluZWRgIGZyb20gYSBtZXRob2QgdHlwZWQgYENyZWRpdEV2ZW50W11gIHB1dHMgYSBsaWUgaW5cbiAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgaGFuZHMsIGFuZCBpdCBzdXJmYWNlcyBhcyBgLm1hcCBvZiB1bmRlZmluZWRgXG4gICAgICAgICAgLy8gaW5zaWRlIHRoZWlyIHJlbmRlciDigJQgZmFyIGZyb20gdGhlIHJlcXVlc3QgdGhhdCBjYXVzZWQgaXQuXG4gICAgICAgICAgcmV0dXJuIHBhZ2UuZXZlbnRzID8/IFtdO1xuICAgICAgICB9LFxuICAgICAgICBzZXRDcmVkaXRMaW1pdChpbnB1dCkge1xuICAgICAgICAgIHJldHVybiBzZW5kSnNvbjxTZXRDcmVkaXRMaW1pdFJlc3VsdD4oJ1BVVCcsICcvdjEvd2FsbGV0L2NyZWRpdC9saW1pdCcsIHtcbiAgICAgICAgICAgIC4uLmlucHV0LFxuICAgICAgICAgICAgYnVzaW5lc3NJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0dGxlSW52b2ljZShpbnB1dCkge1xuICAgICAgICAgIHJldHVybiBzZW5kSnNvbjxTZXR0bGVJbnZvaWNlUmVzdWx0PignUE9TVCcsICcvdjEvd2FsbGV0L2NyZWRpdC9zZXR0bGVtZW50cycsIHtcbiAgICAgICAgICAgIC4uLmlucHV0LFxuICAgICAgICAgICAgYnVzaW5lc3NJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZVNldHRsZW1lbnQoaW5wdXQpIHtcbiAgICAgICAgICByZXR1cm4gc2VuZEpzb248U2V0dGxlSW52b2ljZVJlc3VsdD4oJ1BPU1QnLCAnL3YxL3dhbGxldC9jcmVkaXQvc2V0dGxlbWVudHMvcmV2ZXJzYWwnLCB7XG4gICAgICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgICAgIGJ1c2luZXNzSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=