@atlasauth/angular 0.13.0 → 0.15.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atlasauth/angular changelog
2
2
 
3
+ ## 0.15.0 — 2026-11-05
4
+
5
+ - `<SignUp>` second-factor, enrolment and recovery-code steps; new `signInUrl`.
6
+
7
+ ## 0.14.0 — 2026-11-05
8
+
9
+ ### Added
10
+
11
+ - Sign-in offers the emailed proof (code or link) when a password is on hold, even with email code sign-in off, and shows the password field with a confirmation once it is proven.
12
+
13
+ ### Fixed
14
+
15
+ - The first-factor submit sends only the field on screen, so a leftover code can't turn a password submit into a code attempt. `signIn.resendLink` is now in the catalog instead of showing the raw key.
16
+
17
+ ### Also
18
+
19
+ - The existing-account notice after a sign-up reaches an account on hold (`FlowState.existingAccount`), and the `account_deleted` error reason.
20
+
3
21
  ## 0.13.0 — 2026-10-30
4
22
 
5
23
  - `<atlas-sign-in>` offers "Sign in with a passkey" and passkey autofill on the identifier field when the instance enables passkeys.
@@ -38,10 +38,16 @@ export class AttemptFlowComponent {
38
38
  firstFactors = null;
39
39
  /** The first factor already sent (`AtlasFlowController.preparedFactor()`): its code is collected. */
40
40
  preparedFactor = null;
41
+ /** `FlowState.passwordHold`: where the proof went, and whether the password signs in now. */
42
+ passwordHold = null;
43
+ /** `AtlasFlowController.holdProof()`: the emailed proof a password hold still waits on. */
44
+ holdProof = null;
41
45
  /** Emits the collected field values when the form is submitted. */
42
46
  submitFlow = new EventEmitter();
43
47
  /** Emits when the user picks a first factor the server must send first (an emailed code). */
44
48
  chooseFactor = new EventEmitter();
49
+ /** Emits on "Use your password instead", from an emailed factor already sent. */
50
+ usePassword = new EventEmitter();
45
51
  /**
46
52
  * Offer "Email me a code instead" at the second factor (the instance's
47
53
  * `account.emailSecondFactor`); `emailSecondFactor` asks for it and
@@ -102,6 +108,11 @@ export class AttemptFlowComponent {
102
108
  });
103
109
  return;
104
110
  }
111
+ // Only what is on screen: a code typed earlier must not turn a password into a code attempt.
112
+ if (this.step().kind === 'collect_first_factor') {
113
+ this.submitFlow.emit(this.preparedFactor === 'email_code' ? { code: this.values['code'] ?? '' } : { password: this.values['password'] ?? '' });
114
+ return;
115
+ }
105
116
  this.submitFlow.emit(this.values);
106
117
  }
107
118
  /** The shared enrolment step is drawn (a controller was passed and the flow is enrolling). */
@@ -173,7 +184,13 @@ export class AttemptFlowComponent {
173
184
  codeSentText() {
174
185
  if (this.step().kind !== 'collect_first_factor' || this.preparedFactor !== 'email_code')
175
186
  return null;
176
- return this.t('signIn.codeSentTo', { email: this.attempt?.identifier ?? '' });
187
+ return this.t('signIn.codeSentTo', { email: this.passwordHold?.email ?? this.attempt?.identifier ?? '' });
188
+ }
189
+ /** The "we sent a link to …" line, once a link was sent. */
190
+ linkSentText() {
191
+ if (this.step().kind !== 'collect_first_factor' || this.preparedFactor !== 'email_link')
192
+ return null;
193
+ return this.t('signIn.linkSentTo', { email: this.passwordHold?.email ?? this.attempt?.identifier ?? '' });
177
194
  }
178
195
  /** The attempt is `needs_policy_acceptance`. */
179
196
  awaitingPolicies() {
@@ -184,7 +201,7 @@ export class AttemptFlowComponent {
184
201
  // Nothing to submit on a first-factor step that only offers an emailed code
185
202
  // until that code is sent.
186
203
  if (kind === 'collect_first_factor')
187
- return this.fields().length > 0;
204
+ return this.fields().some((f) => f.kind === 'input');
188
205
  if (this.linkOnly())
189
206
  return false;
190
207
  // Enrolment: nothing to submit while choosing a method or fetching the setup.
@@ -202,12 +219,17 @@ export class AttemptFlowComponent {
202
219
  if (this.preparedFactor === 'email_code') {
203
220
  return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];
204
221
  }
222
+ if (this.preparedFactor === 'email_link')
223
+ return [];
205
224
  // The password field unless the only offer is an emailed code (chosen
206
225
  // with the button below the form).
207
226
  const offered = this.offered();
208
227
  return offered.includes('email_code') && !offered.includes('password')
209
228
  ? []
210
- : [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];
229
+ : [
230
+ ...(this.passwordHold?.released ? [released()] : []),
231
+ { kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' },
232
+ ];
211
233
  }
212
234
  case 'collect_second_factor':
213
235
  return [{ kind: 'input', name: 'code', labelKey: 'mfa.codeLabel', type: 'text' }];
@@ -251,7 +273,7 @@ export class AttemptFlowComponent {
251
273
  }
252
274
  }
253
275
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttemptFlowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", sessionKept: "sessionKept", titleKey: "titleKey", captcha: "captcha", firstFactors: "firstFactors", preparedFactor: "preparedFactor", offerEmailSecondFactor: "offerEmailSecondFactor", emailedSecondFactor: "emailedSecondFactor", offerSmsSecondFactor: "offerSmsSecondFactor", textedSecondFactor: "textedSecondFactor", enrollment: "enrollment", enrollmentState: "enrollmentState", emailVerification: "emailVerification" }, outputs: { submitFlow: "submitFlow", chooseFactor: "chooseFactor", emailSecondFactor: "emailSecondFactor", smsSecondFactor: "smsSecondFactor", resend: "resend", policyDeclined: "policyDeclined" }, ngImport: i0, template: `
276
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", sessionKept: "sessionKept", titleKey: "titleKey", captcha: "captcha", firstFactors: "firstFactors", preparedFactor: "preparedFactor", passwordHold: "passwordHold", holdProof: "holdProof", offerEmailSecondFactor: "offerEmailSecondFactor", emailedSecondFactor: "emailedSecondFactor", offerSmsSecondFactor: "offerSmsSecondFactor", textedSecondFactor: "textedSecondFactor", enrollment: "enrollment", enrollmentState: "enrollmentState", emailVerification: "emailVerification" }, outputs: { submitFlow: "submitFlow", chooseFactor: "chooseFactor", usePassword: "usePassword", emailSecondFactor: "emailSecondFactor", smsSecondFactor: "smsSecondFactor", resend: "resend", policyDeclined: "policyDeclined" }, ngImport: i0, template: `
255
277
  <div [class]="cls('card', 'atlas-card')">
256
278
  <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t(titleKey) }}</h1>
257
279
 
@@ -263,6 +285,9 @@ export class AttemptFlowComponent {
263
285
  @if (codeSentText(); as sentText) {
264
286
  <p class="atlas-text" data-atlas-code-sent="">{{ sentText }}</p>
265
287
  }
288
+ @if (linkSentText(); as sentLink) {
289
+ <p class="atlas-text" data-atlas-link-sent="">{{ sentLink }}</p>
290
+ }
266
291
  @if (linkOnly()) {
267
292
  <!-- Nothing to type: the flow polls until the emailed link is opened (anywhere). -->
268
293
  <p class="atlas-text" data-atlas-link-sent="" aria-live="polite">
@@ -371,6 +396,8 @@ export class AttemptFlowComponent {
371
396
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
372
397
  }
373
398
  </label>
399
+ } @else if (f.kind === 'released') {
400
+ <p class="atlas-text" data-atlas-password-released="">{{ t(f.labelKey) }}</p>
374
401
  } @else if (f.kind === 'alert') {
375
402
  <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ t(f.labelKey) }}</p>
376
403
  } @else {
@@ -452,6 +479,31 @@ export class AttemptFlowComponent {
452
479
  {{ t(preparedFactor === 'email_code' ? 'signIn.resendCode' : 'signIn.useEmailCode') }}
453
480
  </button>
454
481
  }
482
+
483
+ @if (holdProof === 'email_link' && step().kind === 'collect_first_factor') {
484
+ <button
485
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
486
+ [disabled]="busy"
487
+ type="button"
488
+ [attr.data-strategy]="preparedFactor === 'email_link' ? null : 'email_link'"
489
+ [attr.data-atlas-resend]="preparedFactor === 'email_link' ? '' : null"
490
+ (click)="chooseFactor.emit('email_link')"
491
+ >
492
+ {{ t(preparedFactor === 'email_link' ? 'signIn.resendLink' : 'signIn.useEmailLink') }}
493
+ </button>
494
+ }
495
+
496
+ @if (preparedFactor && offered().includes('password')) {
497
+ <button
498
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
499
+ [disabled]="busy"
500
+ type="button"
501
+ data-strategy="password"
502
+ (click)="usePassword.emit()"
503
+ >
504
+ {{ t('signIn.passwordOption') }}
505
+ </button>
506
+ }
455
507
  </form>
456
508
  </div>
457
509
  `, isInline: true, dependencies: [{ kind: "directive", type: AtlasCaptchaSlotDirective, selector: "[atlasCaptchaSlot]", inputs: ["atlasCaptchaSlot"] }, { kind: "component", type: PolicyAcceptStepComponent, selector: "atlas-policy-accept-step", inputs: ["attempt", "busy"], outputs: ["submitFlow", "declined"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -475,6 +527,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
475
527
  @if (codeSentText(); as sentText) {
476
528
  <p class="atlas-text" data-atlas-code-sent="">{{ sentText }}</p>
477
529
  }
530
+ @if (linkSentText(); as sentLink) {
531
+ <p class="atlas-text" data-atlas-link-sent="">{{ sentLink }}</p>
532
+ }
478
533
  @if (linkOnly()) {
479
534
  <!-- Nothing to type: the flow polls until the emailed link is opened (anywhere). -->
480
535
  <p class="atlas-text" data-atlas-link-sent="" aria-live="polite">
@@ -583,6 +638,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
583
638
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
584
639
  }
585
640
  </label>
641
+ } @else if (f.kind === 'released') {
642
+ <p class="atlas-text" data-atlas-password-released="">{{ t(f.labelKey) }}</p>
586
643
  } @else if (f.kind === 'alert') {
587
644
  <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ t(f.labelKey) }}</p>
588
645
  } @else {
@@ -664,6 +721,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
664
721
  {{ t(preparedFactor === 'email_code' ? 'signIn.resendCode' : 'signIn.useEmailCode') }}
665
722
  </button>
666
723
  }
724
+
725
+ @if (holdProof === 'email_link' && step().kind === 'collect_first_factor') {
726
+ <button
727
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
728
+ [disabled]="busy"
729
+ type="button"
730
+ [attr.data-strategy]="preparedFactor === 'email_link' ? null : 'email_link'"
731
+ [attr.data-atlas-resend]="preparedFactor === 'email_link' ? '' : null"
732
+ (click)="chooseFactor.emit('email_link')"
733
+ >
734
+ {{ t(preparedFactor === 'email_link' ? 'signIn.resendLink' : 'signIn.useEmailLink') }}
735
+ </button>
736
+ }
737
+
738
+ @if (preparedFactor && offered().includes('password')) {
739
+ <button
740
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
741
+ [disabled]="busy"
742
+ type="button"
743
+ data-strategy="password"
744
+ (click)="usePassword.emit()"
745
+ >
746
+ {{ t('signIn.passwordOption') }}
747
+ </button>
748
+ }
667
749
  </form>
668
750
  </div>
669
751
  `,
@@ -684,10 +766,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
684
766
  type: Input
685
767
  }], preparedFactor: [{
686
768
  type: Input
769
+ }], passwordHold: [{
770
+ type: Input
771
+ }], holdProof: [{
772
+ type: Input
687
773
  }], submitFlow: [{
688
774
  type: Output
689
775
  }], chooseFactor: [{
690
776
  type: Output
777
+ }], usePassword: [{
778
+ type: Output
691
779
  }], offerEmailSecondFactor: [{
692
780
  type: Input
693
781
  }], emailedSecondFactor: [{
@@ -715,4 +803,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
715
803
  function msg(labelKey) {
716
804
  return { kind: 'message', name: '', labelKey, type: 'text' };
717
805
  }
718
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLFFBQVEsR0FPVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBZ0JwQzs7Ozs7Ozs7O0dBU0c7QUFtTkgsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckMsT0FBTyxHQUF1QixJQUFJLENBQUM7SUFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNiLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBQ25DLDBGQUEwRjtJQUNqRixXQUFXLEdBQXdCLFNBQVMsQ0FBQztJQUM3QyxRQUFRLEdBQUcsY0FBYyxDQUFDO0lBQ25DOzs7O09BSUc7SUFDTSxPQUFPLEdBQTZCLElBQUksQ0FBQztJQUNsRDs7OztPQUlHO0lBQ00sWUFBWSxHQUFvQixJQUFJLENBQUM7SUFDOUMscUdBQXFHO0lBQzVGLGNBQWMsR0FBa0IsSUFBSSxD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YW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGF3YWl0aW5nU2lnblVwTGluayxcbiAgZW5yb2xsbWVudFN1Ym1pdEtleSxcbiAgZ3JvdXBTZXR1cEtleSxcbiAgbG9jYWxpemVkRXJyb3JNZXNzYWdlLFxuICBuZXh0U3RlcCxcbiAgdHlwZSBBdHRlbXB0VmlldyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIE1mYUVucm9sbG1lbnRDb250cm9sbGVyLFxuICB0eXBlIE1mYUVucm9sbG1lbnRTdGF0ZSxcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RyYXRlZ3ksXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBvbGljeUFjY2VwdFN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3BvbGljeS1ob3N0JztcbmltcG9ydCB7IGNsYXNzRm9yLCB0eXBlIEVsZW1lbnRLZXkgfSBmcm9tICcuLi9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuXG4vKipcbiAqIE9uZSByZW5kZXJlZCByb3cgb2YgdGhlIGZsb3cuIEEgdW5pZm9ybSBzaGFwZSAocmF0aGVyIHRoYW4gYSBkaXNjcmltaW5hdGVkXG4gKiB1bmlvbikgc28gdGhlIHRlbXBsYXRlIGFjY2Vzc2VzIG9ubHkgZmllbGRzIHRoYXQgYWx3YXlzIGV4aXN0IOKAlCBubyByZWxpYW5jZSBvblxuICogdGVtcGxhdGUgY29udHJvbC1mbG93IG5hcnJvd2luZyBvZiBhIGxvb3AgdmFyaWFibGUsIHdoaWNoIHZhcmllcyBieSBBbmd1bGFyXG4gKiBtaW5vci4gRm9yIGEgYG1lc3NhZ2VgIHJvdywgYGxhYmVsS2V5YCBjYXJyaWVzIHRoZSBtZXNzYWdlJ3MgaTE4biBrZXkuXG4gKi9cbmludGVyZmFjZSBTdGVwRmllbGQge1xuICBraW5kOiAnaW5wdXQnIHwgJ21lc3NhZ2UnIHwgJ2FsZXJ0JztcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbEtleTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGF1dG9jb21wbGV0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLWRyaXZlbiBmbG93IHNoZWxsLCBzaGFyZWQgYnkgYDxhdGxhcy1zaWduLWluPmAgYW5kXG4gKiBgPGF0bGFzLXNpZ24tdXA+YC4gVGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGludGVybmFsIGBBdHRlbXB0Rmxvd2AuXG4gKlxuICogSXQgY29udGFpbnMgTk8gZGVjaXNpb24gYWJvdXQgd2hhdCBjb21lcyBuZXh0OiBpdCByZW5kZXJzIHdoYXRldmVyIGBzdGF0dXNgXG4gKiB0aGUgc2VydmVyIHJldHVybmVkLCBtYXBwZWQgdGhyb3VnaCBgbmV4dFN0ZXBgIGZyb20gYEBhdGxhc2F1dGgvanNgICh0aGUgc2FtZVxuICogZXhoYXVzdGl2ZSBtYXBwaW5nIHRoZSBSZWFjdCBTREsgdXNlcyksIHNvIGFkZGluZyBhIHN0ZXAgaXMgYSBzZXJ2ZXIgY2hhbmdlXG4gKiBhbmQgYW4gb3V0LW9mLWRhdGUgY2xpZW50IGRlZ3JhZGVzIHRvIGEgdmlzaWJsZSBcInBsZWFzZSB1cGRhdGVcIiBtZXNzYWdlIHJhdGhlclxuICogdGhhbiBhIGJsYW5rIHNjcmVlbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtYXR0ZW1wdC1mbG93JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlLCBQb2xpY3lBY2NlcHRTdGVwQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2NhcmQnLCAnYXRsYXMtY2FyZCcpXCI+XG4gICAgICA8aDEgW2NsYXNzXT1cImNscygnaGVhZGVyVGl0bGUnLCAnYXRsYXMtdGl0bGUnKVwiPnt7IHQodGl0bGVLZXkpIH19PC9oMT5cblxuICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUVycm9ycygpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8Zm9ybSAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGlmIChjb2RlU2VudFRleHQoKTsgYXMgc2VudFRleHQpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWNvZGUtc2VudD1cIlwiPnt7IHNlbnRUZXh0IH19PC9wPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGlua09ubHkoKSkge1xuICAgICAgICAgIDwhLS0gTm90aGluZyB0byB0eXBlOiB0aGUgZmxvdyBwb2xscyB1bnRpbCB0aGUgZW1haWxlZCBsaW5rIGlzIG9wZW5lZCAoYW55d2hlcmUpLiAtLT5cbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWxpbmstc2VudD1cIlwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAge3sgdCgnc2lnblVwLmxpbmtTZW50VG8nLCB7IGVtYWlsOiBhdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1hdGxhcy1yZXNlbmQ9XCJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc2VuZC5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5yZXNlbmRMaW5rJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGVucm9sbGluZygpICYmIGVucm9sbG1lbnRTdGF0ZTsgYXMgZW5yb2wpIHtcbiAgICAgICAgICBAaWYgKGVucm9sLm1ldGhvZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCI+e3sgdCgnbWZhLmVucm9sbENob29zZScpIH19PC9wPlxuICAgICAgICAgICAgQGZvciAobSBvZiBlbnJvbC5vcHRpb25zOyB0cmFjayBtKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdGxhcy1tZmEtbWV0aG9kXT1cIm1cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8IGVucm9sLmJ1c3lcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaG9vc2VNZXRob2QobSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdChtID09PSAndG90cCcgPyAnbWZhLmVucm9sbFRvdHBPcHRpb24nIDogJ21mYS5lbnJvbGxTbXNPcHRpb24nKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIGlmIChlbnJvbC5tZXRob2QgPT09ICd0b3RwJykge1xuICAgICAgICAgICAgQGlmIChlbnJvbC5lbnJvbGxtZW50OyBhcyBzZXR1cCkge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIj57eyB0KCdtZmEuZW5yb2xsU2NhbicpIH19PC9wPlxuICAgICAgICAgICAgICBAaWYgKHNldHVwLnFyQ29kZSkge1xuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdGxhcy1tZmEtcXJcIiBkYXRhLWF0bGFzPVwibWZhLXFyXCIgW3NyY109XCJzZXR1cC5xckNvZGVcIiBbYWx0XT1cInQoJ21mYS5lbnJvbGxRckFsdCcpXCIgd2lkdGg9XCIxODBcIiBoZWlnaHQ9XCIxODBcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2V0dXAuc2VjcmV0KSB7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cIm1mYS1zZXR1cC1rZXlcIj57eyB0KCdtZmEuZW5yb2xsU2V0dXBLZXknKSB9fTogPGNvZGU+e3sgc2V0dXBLZXkoc2V0dXAuc2VjcmV0KSB9fTwvY29kZT48L3A+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmEuZW5yb2xsRmlyc3RDb2RlTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIFt2YWx1ZV09XCJ2YWx1ZXNbJ2NvZGUnXSA/PyAnJ1wiIChpbnB1dCk9XCJzZXRWYWx1ZSgnY29kZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgQGlmIChlbnJvbC50b3RwQ29kZXMgPj0gMikge1xuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmEuZW5yb2xsU2Vjb25kQ29kZUxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNlY29uZENvZGVcIiBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIFt2YWx1ZV09XCJ2YWx1ZXNbJ3NlY29uZENvZGUnXSA/PyAnJ1wiIChpbnB1dCk9XCJzZXRWYWx1ZSgnc2Vjb25kQ29kZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgZW5yb2wuYnVzeSA/IHQoJ21mYS5lbnJvbGxQcmVwYXJpbmcnKSA6ICcnIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGlmIChlbnJvbC5lbnJvbGxtZW50OyBhcyB0ZXh0ZWQpIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cIm1mYS1jb2RlLXRleHRlZFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7IHQoJ21mYS5jb2RlVGV4dGVkVG8nLCB7IHBob25lOiB0ZXh0ZWQucGhvbmUgPz8gJycgfSkgfX08L3A+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLmNvZGVMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiY29kZVwiIGF1dG9jb21wbGV0ZT1cIm9uZS10aW1lLWNvZGVcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgW3ZhbHVlXT1cInZhbHVlc1snY29kZSddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdjb2RlJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtYXRsYXMtcmVzZW5kPVwiXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCBlbnJvbC5idXN5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZW5kRW5yb2xsbWVudCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5yZXNlbmRDb2RlJykgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmEucGhvbmVMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCIgdHlwZT1cInRlbFwiIG5hbWU9XCJwaG9uZVwiIGF1dG9jb21wbGV0ZT1cInRlbFwiIFt2YWx1ZV09XCJ2YWx1ZXNbJ3Bob25lJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ3Bob25lJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIj57eyB0KCdtZmEucGhvbmVIaW50JykgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGVucm9sLmVycm9yczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChlbnJvbC5tZXRob2QgIT09IG51bGwgJiYgZW5yb2wub3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBAZm9yIChvdGhlciBvZiBvdGhlck1ldGhvZHMoZW5yb2wpOyB0cmFjayBvdGhlcikge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtbWZhLW1ldGhvZF09XCJvdGhlclwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgZW5yb2wuYnVzeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZU1ldGhvZChvdGhlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdChvdGhlciA9PT0gJ3RvdHAnID8gJ21mYS5lbnJvbGxUb3RwT3B0aW9uJyA6ICdtZmEuZW5yb2xsU21zT3B0aW9uJykgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGYgb2YgZmllbGRzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIEBpZiAoZi5raW5kID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KGYubGFiZWxLZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJmLnR5cGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiZi5hdXRvY29tcGxldGUgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLm5hbWVdID8/ICcnXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5uYW1lLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYubmFtZSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChmLmtpbmQgPT09ICdhbGVydCcpIHtcbiAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHA+e3sgdChmLmxhYmVsS2V5KSB9fTwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGF3YWl0aW5nUG9saWNpZXMoKSkge1xuICAgICAgICAgIDwhLS0gQSByZXF1aXJlZCBwb2xpY3kgY2hhbmdlZDogc2Nyb2xsLW1vZGUgb25lcyBpbiB0aGVpciBkaWFsb2csIHRoZSByZXN0IGFzIGNoZWNrYm94ZXMuIC0tPlxuICAgICAgICAgIDxhdGxhcy1wb2xpY3ktYWNjZXB0LXN0ZXBcbiAgICAgICAgICAgIFthdHRlbXB0XT1cImF0dGVtcHRcIlxuICAgICAgICAgICAgW2J1c3ldPVwiYnVzeVwiXG4gICAgICAgICAgICAoc3VibWl0Rmxvdyk9XCJzdWJtaXRGbG93LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZGVjbGluZWQpPVwicG9saWN5RGVjbGluZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9hdGxhcy1wb2xpY3ktYWNjZXB0LXN0ZXA+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dDYXB0Y2hhKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXRsYXMtY2FwdGNoYVwiIGRhdGEtYXRsYXMtY2FwdGNoYT1cIlwiIFthdGxhc0NhcHRjaGFTbG90XT1cImNhcHRjaGFcIj48L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd1N1Ym1pdCgpKSB7XG4gICAgICAgICAgPGJ1dHRvbiBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uUHJpbWFyeScsICdhdGxhcy1idXR0b24nKVwiIFtkaXNhYmxlZF09XCJidXN5IHx8IChlbnJvbGxpbmcoKSAmJiAhIWVucm9sbG1lbnRTdGF0ZT8uYnVzeSlcIiB0eXBlPVwic3VibWl0XCI+XG4gICAgICAgICAgICB7eyB0KHN1Ym1pdEtleSgpKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93U21zU2Vjb25kRmFjdG9yKCkpIHtcbiAgICAgICAgICBAaWYgKHNtc1NlY29uZEZhY3RvclNlbnRUbygpOyBhcyBzZW50VG8pIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJzbXMtc2Vjb25kLWZhY3Rvci1zZW50XCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICAgIHt7IHQoJ21mYS5jb2RlVGV4dGVkVG8nLCB7IHBob25lOiBzZW50VG8gfSkgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgZGF0YS1hdGxhcz1cInNtcy1zZWNvbmQtZmFjdG9yXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgISF0ZXh0ZWRTZWNvbmRGYWN0b3I/LmJ1c3lcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic21zU2Vjb25kRmFjdG9yLmVtaXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRleHRlZFNlY29uZEZhY3Rvcj8uYnVzeSA/IHQoJ3NpZ25Jbi5zZW5kaW5nJykgOiB0KCdtZmEuc21zQ29kZU9wdGlvbicpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAodGV4dGVkU2Vjb25kRmFjdG9yPy5lcnJvcjsgYXMgbWVzc2FnZSkge1xuICAgICAgICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgbWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dFbWFpbFNlY29uZEZhY3RvcigpKSB7XG4gICAgICAgICAgQGlmIChlbWFpbFNlY29uZEZhY3RvclNlbnRUbygpOyBhcyBzZW50VG8pIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJlbWFpbC1zZWNvbmQtZmFjdG9yLXNlbnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAge3sgdCgnc2lnbkluLmNvZGVTZW50VG8nLCB7IGVtYWlsOiBzZW50VG8gfSkgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgZGF0YS1hdGxhcz1cImVtYWlsLXNlY29uZC1mYWN0b3JcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhIWVtYWlsZWRTZWNvbmRGYWN0b3I/LmJ1c3lcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZW1haWxTZWNvbmRGYWN0b3IuZW1pdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZW1haWxlZFNlY29uZEZhY3Rvcj8uYnVzeSA/IHQoJ3NpZ25Jbi5zZW5kaW5nJykgOiB0KCdzaWduSW4uZW1haWxDb2RlT3B0aW9uJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmIChlbWFpbGVkU2Vjb25kRmFjdG9yPy5lcnJvcjsgYXMgbWVzc2FnZSkge1xuICAgICAgICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgbWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dFbWFpbENvZGVPcHRpb24oKSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zdHJhdGVneV09XCJwcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnID8gbnVsbCA6ICdlbWFpbF9jb2RlJ1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWF0bGFzLXJlc2VuZF09XCJwcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnID8gJycgOiBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjaG9vc2VGYWN0b3IuZW1pdCgnZW1haWxfY29kZScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0KHByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyAnc2lnbkluLnJlc2VuZENvZGUnIDogJ3NpZ25Jbi51c2VFbWFpbENvZGUnKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEF0dGVtcHRGbG93Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdGxhcyA9IGluamVjdChBdGxhc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIGF0dGVtcHQ6IEF0dGVtcHRWaWV3IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3JzOiBGaWVsZEVycm9yW10gPSBbXTtcbiAgLyoqIGBGbG93U3RhdGUuc2Vzc2lvbktlcHRgOiB3aGV0aGVyIHRoaXMgYnJvd3NlciBrZXB0IHRoZSBzZXNzaW9uIHRoZSBzaWduLWluIGNyZWF0ZWQuICovXG4gIEBJbnB1dCgpIHNlc3Npb25LZXB0OiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSB0aXRsZUtleSA9ICdzaWduSW4udGl0bGUnO1xuICAvKipcbiAgICogVGhlIHNpZ24taW4gY2FwdGNoYSwgZHJhd24gYWJvdmUgdGhlIHN1Ym1pdCBidXR0b24gb24gdGhlIGlkZW50aWZpZXIgc3RlcFxuICAgKiAoYW4gYWx3YXlzLW9uIHNpZ24taW4gY2FwdGNoYSkgYW5kIG9uIHRoZSBjaGFsbGVuZ2Ugc3RlcCB0aGUgc2VydmVyIGRlbWFuZHNcbiAgICogd2l0aCBgbmVlZHNfY2FwdGNoYWAuIE51bGwgd2hlbiB0aGUgZmxvdyBkcmF3cyBub25lLlxuICAgKi9cbiAgQElucHV0KCkgY2FwdGNoYTogQ2FwdGNoYUNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3JzIHRvIG9mZmVyIG9uIHRoZSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIOKAlCBwYXNzXG4gICAqIGBBdGxhc0Zsb3dDb250cm9sbGVyLmZpcnN0RmFjdG9ycygpYCwgd2hpY2ggZHJvcHMgZW1haWwgY29kZSAvIGxpbmsgd2hpbGUgdGhlXG4gICAqIGFwcCBjYW5ub3QgZGVsaXZlciBlbWFpbC4gTnVsbCB1c2VzIHRoZSBzZXJ2ZXIncyBsaXN0IGFzLWlzLlxuICAgKi9cbiAgQElucHV0KCkgZmlyc3RGYWN0b3JzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGZpcnN0IGZhY3RvciBhbHJlYWR5IHNlbnQgKGBBdGxhc0Zsb3dDb250cm9sbGVyLnByZXBhcmVkRmFjdG9yKClgKTogaXRzIGNvZGUgaXMgY29sbGVjdGVkLiAqL1xuICBASW5wdXQoKSBwcmVwYXJlZEZhY3Rvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHRoZSBjb2xsZWN0ZWQgZmllbGQgdmFsdWVzIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLiAqL1xuICBAT3V0cHV0KCkgc3VibWl0RmxvdyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHVzZXIgcGlja3MgYSBmaXJzdCBmYWN0b3IgdGhlIHNlcnZlciBtdXN0IHNlbmQgZmlyc3QgKGFuIGVtYWlsZWQgY29kZSkuICovXG4gIEBPdXRwdXQoKSBjaG9vc2VGYWN0b3IgPSBuZXcgRXZlbnRFbWl0dGVyPCdlbWFpbF9jb2RlJz4oKTtcbiAgLyoqXG4gICAqIE9mZmVyIFwiRW1haWwgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAodGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQuZW1haWxTZWNvbmRGYWN0b3JgKTsgYGVtYWlsU2Vjb25kRmFjdG9yYCBhc2tzIGZvciBpdCBhbmRcbiAgICogYGVtYWlsZWRTZWNvbmRGYWN0b3JgIHJlcG9ydHMgaG93IGl0IHdlbnQuXG4gICAqL1xuICBASW5wdXQoKSBvZmZlckVtYWlsU2Vjb25kRmFjdG9yID0gZmFsc2U7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5lbWFpbFNlY29uZEZhY3RvcigpYDogaW4gZmxpZ2h0LCB3aGVyZSBpdCB3ZW50LCBvciB3aHkgbm90LiAqL1xuICBASW5wdXQoKSBlbWFpbGVkU2Vjb25kRmFjdG9yOiB7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIGVtYWlsU2Vjb25kRmFjdG9yID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogT2ZmZXIgXCJUZXh0IG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHdoZXJlIHRoZSBhcHAgb2ZmZXJzXG4gICAqIHRleHRlZCBjb2RlcywgYEF0bGFzRmxvd0NvbnRyb2xsZXIubWZhQ2hvaWNlcygpLnNtc2ApOyBgc21zU2Vjb25kRmFjdG9yYFxuICAgKiBhc2tzIGZvciBpdCBhbmQgYHRleHRlZFNlY29uZEZhY3RvcmAgcmVwb3J0cyBob3cgaXQgd2VudC5cbiAgICovXG4gIEBJbnB1dCgpIG9mZmVyU21zU2Vjb25kRmFjdG9yID0gZmFsc2U7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5zbXNTZWNvbmRGYWN0b3IoKWA6IGluIGZsaWdodCwgd2hlcmUgaXQgd2VudCwgb3Igd2h5IG5vdC4gKi9cbiAgQElucHV0KCkgdGV4dGVkU2Vjb25kRmFjdG9yOiB7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIHNtc1NlY29uZEZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFRoZSBNRkEgZW5yb2xtZW50IHN0ZXAgKGBBdGxhc0Zsb3dDb250cm9sbGVyLmVucm9sbG1lbnRgIGFuZFxuICAgKiBgZW5yb2xsbWVudFN0YXRlKClgKTogdGhlIGF1dGhlbnRpY2F0b3IgYXBwJ3MgUVIgY29kZSBhbmQgc2V0dXAga2V5LCBvciBhXG4gICAqIHRleHRlZCBjb2RlLiBOdWxsOiB0aGUgc3RlcCBhc2tzIGZvciB0d28gYXV0aGVudGljYXRvciBjb2RlcyBvbmx5LlxuICAgKi9cbiAgQElucHV0KCkgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW5yb2xsbWVudFN0YXRlOiBNZmFFbnJvbGxtZW50U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIGBhY2NvdW50LmVtYWlsVmVyaWZpY2F0aW9uYC4gT24gYGxpbmtgIGEgc2lnbi11cCdzXG4gICAqIHZlcmlmaWNhdGlvbiBzdGVwIGhhcyBub3RoaW5nIHRvIHR5cGU6IGl0IHNheXMgdG8gb3BlbiB0aGUgZW1haWxlZCBsaW5rXG4gICAqIHdoaWxlIHRoZSBmbG93IHBvbGxzLCBhbmQgb2ZmZXJzIGEgcmVzZW5kIChgcmVzZW5kYCkuXG4gICAqL1xuICBASW5wdXQoKSBlbWFpbFZlcmlmaWNhdGlvbjogc3RyaW5nID0gJ2NvZGUnO1xuICBAT3V0cHV0KCkgcmVzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogVGhlIHVzZXIgZGVjbGluZWQgYSBwb2xpY3kgdGhlIHNpZ24taW4gd2FzIHdhaXRpbmcgb24gKGBuZWVkc19wb2xpY3lfYWNjZXB0YW5jZWApOiBjYW5jZWwgdGhlIGF0dGVtcHQuICovXG4gIEBPdXRwdXQoKSBwb2xpY3lEZWNsaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICAvKiogQSBzZXJ2ZXIgZXJyb3IgaW4gdGhlIGFwcCdzIGxhbmd1YWdlIChgZXJyb3IuPHJlYXNvbj5gLCBlbHNlIHRoZSBzZXJ2ZXIncyBtZXNzYWdlKS4gKi9cbiAgcHJvdGVjdGVkIGVycm9yVGV4dChlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB7XG4gICAgLy8gYGVycm9yTG9jYWxpemF0aW9uYCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhIHN0YW5kLWluIHNlcnZpY2UgbWF5IGxhY2sgaXQuXG4gICAgY29uc3QgbGF5ZXIgPSAodGhpcy5hdGxhcyBhcyB7IGVycm9yTG9jYWxpemF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KS5lcnJvckxvY2FsaXphdGlvbjtcbiAgICByZXR1cm4gbG9jYWxpemVkRXJyb3JNZXNzYWdlKGVycm9yLCBsYXllciA/PyB0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwgdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIEVucm9sbWVudDogdGV4dCB0aGUgY29kZSB0byB0aGUgdHlwZWQgbnVtYmVyLCBvciBjb25maXJtIHRoZSBmYWN0b3IuXG4gICAgaWYgKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50KSB7XG4gICAgICB2b2lkIHRoaXMuZW5yb2xsbWVudC5zdWJtaXQodGhpcy52YWx1ZXMpLnRoZW4oKG5leHQpID0+IHtcbiAgICAgICAgaWYgKG5leHQpIHRoaXMuc3VibWl0Rmxvdy5lbWl0KG5leHQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3VibWl0Rmxvdy5lbWl0KHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIGVucm9sbWVudCBzdGVwIGlzIGRyYXduIChhIGNvbnRyb2xsZXIgd2FzIHBhc3NlZCBhbmQgdGhlIGZsb3cgaXMgZW5yb2xsaW5nKS4gKi9cbiAgcHJvdGVjdGVkIGVucm9sbGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwKCkua2luZCA9PT0gJ2Vucm9sbF9zZWNvbmRfZmFjdG9yJyAmJiAhIXRoaXMuZW5yb2xsbWVudCAmJiAhIXRoaXMuZW5yb2xsbWVudFN0YXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNob29zZU1ldGhvZChtZXRob2Q6IE1mYUVucm9sbG1lbnRTdHJhdGVneSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdm9pZCB0aGlzLmVucm9sbG1lbnQ/LmNob29zZShtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2VuZEVucm9sbG1lbnQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmVucm9sbG1lbnQ/LnJlc2VuZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG90aGVyTWV0aG9kcyhzdGF0ZTogTWZhRW5yb2xsbWVudFN0YXRlKTogTWZhRW5yb2xsbWVudFN0cmF0ZWd5W10ge1xuICAgIHJldHVybiBzdGF0ZS5vcHRpb25zLmZpbHRlcigobSkgPT4gbSAhPT0gc3RhdGUubWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEtleShzZWNyZXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdyb3VwU2V0dXBLZXkoc2VjcmV0KTtcbiAgfVxuXG4gIC8qKiBUaGUgc3VibWl0IGJ1dHRvbidzIGxhYmVsIGtleSAoZW5yb2xtZW50OiBcIlRleHQgbWUgYSBjb2RlXCIgYmVmb3JlIHRoZSBudW1iZXIgaXMgc2VudCkuICovXG4gIHByb3RlY3RlZCBzdWJtaXRLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50U3RhdGUgJiYgZW5yb2xsbWVudFN1Ym1pdEtleSh0aGlzLmVucm9sbG1lbnRTdGF0ZSkpIHx8ICdzaWduSW4uc3VibWl0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U21zU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyU21zU2Vjb25kRmFjdG9yICYmIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X3NlY29uZF9mYWN0b3InO1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSB0ZXh0ZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBzbXNTZWNvbmRGYWN0b3JTZW50VG8oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VudCA9IHRoaXMudGV4dGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtRXJyb3JzKCk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+ICFlcnJvci5wYXJhbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRFcnJvcnNGb3IobmFtZTogc3RyaW5nKTogRmllbGRFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGFyYW0gPT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLmF0dGVtcHQgPyBuZXh0U3RlcCh0aGlzLmF0dGVtcHQpIDogKHsga2luZDogJ2NvbGxlY3RfaWRlbnRpZmllcicgfSBhcyBjb25zdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcHRjaGEoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgcmV0dXJuICEhdGhpcy5jYXB0Y2hhICYmIChraW5kID09PSAnY29sbGVjdF9pZGVudGlmaWVyJyB8fCBraW5kID09PSAnY29sbGVjdF9jYXB0Y2hhJyk7XG4gIH1cblxuICAvKiogVGhlIGZpcnN0IGZhY3RvcnMgb24gb2ZmZXIgYXQgYSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIChlbXB0eSBvbiBhbnkgb3RoZXIpLiAqL1xuICBwcml2YXRlIG9mZmVyZWQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAoKTtcbiAgICBpZiAoc3RlcC5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RGYWN0b3JzID8/IHN0ZXAuc3RyYXRlZ2llcztcbiAgfVxuXG4gIHByb3RlY3RlZCBsaW5rT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXdhaXRpbmdTaWduVXBMaW5rKHRoaXMuYXR0ZW1wdCwgdGhpcy5lbWFpbFZlcmlmaWNhdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0VtYWlsU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyRW1haWxTZWNvbmRGYWN0b3IgJiYgdGhpcy5zdGVwKCkua2luZCA9PT0gJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGVtYWlsZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBlbWFpbFNlY29uZEZhY3RvclNlbnRUbygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZW50ID0gdGhpcy5lbWFpbGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RW1haWxDb2RlT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJlZm9yZSB0aGUgY29kZSBpcyBzZW50OiB0aGUgY2hvaWNlIChvciB0aGUgcmV0cnkgb2YgYSBmYWlsZWQgYXV0b21hdGljXG4gICAgLy8gc2VuZCkuIEFmdGVyOiBcIlJlc2VuZCBjb2RlXCIuXG4gICAgcmV0dXJuIHRoaXMub2ZmZXJlZCgpLmluY2x1ZGVzKCdlbWFpbF9jb2RlJyk7XG4gIH1cblxuICAvKiogVGhlIFwid2Ugc2VudCBhIGNvZGUgdG8g4oCmXCIgbGluZSBvbiB0aGUgY29kZSBzdGVwLiAqL1xuICBwcm90ZWN0ZWQgY29kZVNlbnRUZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudCgnc2lnbkluLmNvZGVTZW50VG8nLCB7IGVtYWlsOiB0aGlzLmF0dGVtcHQ/LmlkZW50aWZpZXIgPz8gJycgfSk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgaXMgYG5lZWRzX3BvbGljeV9hY2NlcHRhbmNlYC4gKi9cbiAgcHJvdGVjdGVkIGF3YWl0aW5nUG9saWNpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdhY2NlcHRfcG9saWNpZXMnO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dTdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgLy8gTm90aGluZyB0byBzdWJtaXQgb24gYSBmaXJzdC1mYWN0b3Igc3RlcCB0aGF0IG9ubHkgb2ZmZXJzIGFuIGVtYWlsZWQgY29kZVxuICAgIC8vIHVudGlsIHRoYXQgY29kZSBpcyBzZW50LlxuICAgIGlmIChraW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gdGhpcy5maWVsZHMoKS5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLmxpbmtPbmx5KCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFbnJvbG1lbnQ6IG5vdGhpbmcgdG8gc3VibWl0IHdoaWxlIGNob29zaW5nIGEgbWV0aG9kIG9yIGZldGNoaW5nIHRoZSBzZXR1cC5cbiAgICBpZiAodGhpcy5lbnJvbGxpbmcoKSAmJiB0aGlzLmVucm9sbG1lbnRTdGF0ZSAmJiAhZW5yb2xsbWVudFN1Ym1pdEtleSh0aGlzLmVucm9sbG1lbnRTdGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ga2luZCAhPT0gJ2RvbmUnICYmIGtpbmQgIT09ICdhd2FpdF9vYXV0aCcgJiYga2luZCAhPT0gJ2FjY2VwdF9wb2xpY2llcyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFN0ZXBGaWVsZFtdIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwKCk7XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfaWRlbnRpZmllcic6XG4gICAgICAgIC8vIGB3ZWJhdXRobmA6IHNhdmVkIHBhc3NrZXlzIGFwcGVhciBpbiB0aGlzIGZpZWxkJ3MgYXV0b2ZpbGwgd2hpbGUgPGF0bGFzLXNpZ24taW4+IGhvbGRzIGEgY29uZGl0aW9uYWwgcmVxdWVzdC5cbiAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdpZGVudGlmaWVyJywgbGFiZWxLZXk6ICdzaWduSW4uaWRlbnRpZmllckxhYmVsJywgdHlwZTogJ2VtYWlsJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUgd2ViYXV0aG4nIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9maXJzdF9mYWN0b3InOiB7XG4gICAgICAgIGlmICh0aGlzLnByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScpIHtcbiAgICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ3NpZ25Jbi5lbWFpbENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgcGFzc3dvcmQgZmllbGQgdW5sZXNzIHRoZSBvbmx5IG9mZmVyIGlzIGFuIGVtYWlsZWQgY29kZSAoY2hvc2VuXG4gICAgICAgIC8vIHdpdGggdGhlIGJ1dHRvbiBiZWxvdyB0aGUgZm9ybSkuXG4gICAgICAgIGNvbnN0IG9mZmVyZWQgPSB0aGlzLm9mZmVyZWQoKTtcbiAgICAgICAgcmV0dXJuIG9mZmVyZWQuaW5jbHVkZXMoJ2VtYWlsX2NvZGUnKSAmJiAhb2ZmZXJlZC5pbmNsdWRlcygncGFzc3dvcmQnKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdwYXNzd29yZCcsIGxhYmVsS2V5OiAnc2lnbkluLnBhc3N3b3JkTGFiZWwnLCB0eXBlOiAncGFzc3dvcmQnIH1dO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29sbGVjdF9zZWNvbmRfZmFjdG9yJzpcbiAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdtZmEuY29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgY2FzZSAnZW5yb2xsX3NlY29uZF9mYWN0b3InOlxuICAgICAgICAvLyBUaGUgc2hhcmVkIGVucm9sbWVudCBzdGVwIGRyYXdzIGl0cyBvd24gZmllbGRzIChhYm92ZSkuXG4gICAgICAgIGlmICh0aGlzLmVucm9sbGluZygpKSByZXR1cm4gW107XG4gICAgICAgIC8vIFR3byBjb25zZWN1dGl2ZSBjb2RlcyAowqc1LjYpOiBhIHBob25lIHdpdGggYSBmYXN0IGNsb2NrIGZhaWxzIGhlcmVcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gb24gZXZlcnkgc2lnbi1pbiBhZnRlcndhcmRzLlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxGaXJzdENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ3NlY29uZENvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxTZWNvbmRDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfZW1haWxfY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtPbmx5KCkgPyBbXSA6IFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdzaWduSW4uZW1haWxDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICBjYXNlICdjb2xsZWN0X25ld19wYXNzd29yZCc6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3Jlc2V0Lm5ld1Bhc3N3b3JkTGFiZWwnLCB0eXBlOiAncGFzc3dvcmQnIH1dO1xuICAgICAgY2FzZSAnYWNjZXB0X3BvbGljaWVzJzpcbiAgICAgICAgLy8gRHJhd24gYnkgPGF0bGFzLXBvbGljeS1hY2NlcHQtc3RlcD4gYWJvdmUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfY2FwdGNoYSc6XG4gICAgICAgIC8vIMKnNSB0aGUgc2VydmVyIHdpdGhoZWxkIHRoZSBhdHRlbXB0IHVudGlsIGEgY2FwdGNoYSBjbGVhcnMuIFNvbHZpbmcgdGhlXG4gICAgICAgIC8vIHdpZGdldCByZXN1Ym1pdHMgdGhlIGlkZW50aWZpZXIgb24gaXRzIG93bjsgdGhlIGJ1dHRvbiByZXRyaWVzLlxuICAgICAgICByZXR1cm4gW21zZygnY2FwdGNoYS5wcm9tcHQnKV07XG4gICAgICBjYXNlICdhd2FpdF9vYXV0aCc6XG4gICAgICAgIHJldHVybiBbbXNnKCdzaWduSW4ubWFnaWNMaW5rU2VudCcpXTtcbiAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICAvLyBTaWduZWQgaW4gb25seSB3aGVuIHRoaXMgYnJvd3NlciBob2xkcyB0aGUgc2Vzc2lvbjsgYSBibG9ja2VkIGNvb2tpZSBpcyBzYWlkXG4gICAgICAgIC8vIHBsYWlubHkuIFwiQ2hlY2sgdGhlIG90aGVyIHRhYlwiIGlzIGZvciBhIHNpZ24taW4gY29tcGxldGVkIG9uIGFub3RoZXIgZGV2aWNlLlxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uS2VwdCA9PT0gdHJ1ZSkgcmV0dXJuIFttc2coJ3NpZ25Jbi5zaWduZWRJbicpXTtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbktlcHQgPT09IGZhbHNlKSByZXR1cm4gW3sga2luZDogJ2FsZXJ0JywgbmFtZTogJycsIGxhYmVsS2V5OiAnc2lnbkluLnNlc3Npb25Ob3RLZXB0JywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgICByZXR1cm4gW21zZygnc2lnbkluLmNoZWNrT3RoZXJUYWInKV07XG4gICAgICBjYXNlICdyZXN0YXJ0JzpcbiAgICAgICAgcmV0dXJuIFttc2coJ2Vycm9yLmdlbmVyaWMnKV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBBIHN0YXR1cyB0aGlzIFNESyB2ZXJzaW9uIGRvZXMgbm90IGtub3cuIEFuIGhvbmVzdCBtZXNzYWdlIGJlYXRzIGFcbiAgICAgICAgLy8gYmxhbmsgbG9naW4gYm94IHRoZSB1c2VyIGNhbm5vdCBhY3Qgb24uXG4gICAgICAgIHJldHVybiBbbXNnKCdlcnJvci5nZW5lcmljJyldO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQSByZWFkLW9ubHkgbWVzc2FnZSByb3c6IGBsYWJlbEtleWAgaG9sZHMgdGhlIGkxOG4ga2V5IG9mIHRoZSB0ZXh0IHRvIHNob3cuICovXG5mdW5jdGlvbiBtc2cobGFiZWxLZXk6IHN0cmluZyk6IFN0ZXBGaWVsZCB7XG4gIHJldHVybiB7IGtpbmQ6ICdtZXNzYWdlJywgbmFtZTogJycsIGxhYmVsS2V5LCB0eXBlOiAndGV4dCcgfTtcbn1cbiJdfQ==
806
+ function released() {
807
+ return { kind: 'released', name: '', labelKey: 'signIn.passwordHoldReleased', type: 'text' };
808
+ }
809
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLFFBQVEsR0FRVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBZ0JwQzs7Ozs7Ozs7O0dBU0c7QUFpUEgsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckMsT0FBTyxHQUF1QixJQUFJLENBQUM7SUFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNiLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBQ25DLDBGQUEwRjtJQUNqRixXQUFXLEdBQXdCLFNBQVMsQ0FBQztJQUM3QyxRQUFRLEdBQUcsY0FBYyxDQUFDO0lBQ25DOzs7O09BSUc7SUFDTSxPQUFPLEdBQTZCLElBQUksQ0FBQztJQUNsRDs7OztPQUlHO0lBQ00sWUFBWSxHQUFvQixJQUFJLENBQUM7SUFDOUMscUdBQXFHO0lBQzVGLGNBQWMsR0FBa0IsSUFBSSxDQUFDO0lBQzlDLDZGQUE2RjtJQUNwRixZQUFZLEdBQThCLElBQUksQ0FBQztJQUN4RCwyRkFBMkY7SUFDbEYsU0FBUyxHQUF1QyxJQUFJLENBQUM7SUFFOUQsbUVBQW1FO0lBQ3pELFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztJQUNsRSw2RkFBNkY7SUFDbkYsWUFBWSxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO0lBQ3pFLGlGQUFpRjtJQUN2RSxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNqRDs7OztPQUlHO0lBQ00sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ3hDLHVGQUF1RjtJQUM5RSxtQkFBbUIsR0FBK0QsSUFBSSxDQUFDO0lBQ3RGLGlCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDdkQ7Ozs7T0FJRztJQUNNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUN0QyxxRkFBcUY7SUFDNUUsa0JBQWtCLEdBQStELElBQUksQ0FBQztJQUNyRixlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNyRDs7OztPQUlHO0lBQ00sVUFBVSxHQUFtQyxJQUFJLENBQUM7SUFDbEQsZUFBZSxHQUE4QixJQUFJLENBQUM7SUFDM0Q7Ozs7T0FJRztJQUNNLGlCQUFpQixHQUFXLE1BQU0sQ0FBQztJQUNsQyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUM1Qyw2R0FBNkc7SUFDbkcsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFNUMsTUFBTSxHQUEyQixFQUFFLENBQUM7SUFFcEMsQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELDBGQUEwRjtJQUNoRixTQUFTLENBQUMsS0FBaUI7UUFDbkMsMkVBQTJFO1FBQzNFLE1BQU0sS0FBSyxHQUFJLElBQUksQ0FBQyxLQUF3RCxDQUFDLGlCQUFpQixDQUFDO1FBQy9GLE9BQU8scUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFUyxHQUFHLENBQUMsR0FBZSxFQUFFLElBQVk7UUFDekMsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxRQUFRLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFUyxRQUFRLENBQUMsS0FBWTtRQUM3QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsdUVBQXVFO1FBQ3ZFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxJQUFJO29CQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCw2RkFBNkY7UUFDN0YsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLHNCQUFzQixFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvSSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsOEZBQThGO0lBQ3BGLFNBQVM7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLHNCQUFzQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3BHLENBQUM7SUFFUyxZQUFZLENBQUMsTUFBNkI7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRVMsWUFBWSxDQUFDLEtBQXlCO1FBQzlDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVTLFFBQVEsQ0FBQyxNQUFjO1FBQy9CLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCw2RkFBNkY7SUFDbkYsU0FBUztRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQ3BILENBQUM7SUFFUyxtQkFBbUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyx1QkFBdUIsQ0FBQztJQUNuRixDQUFDO0lBRUQsMkVBQTJFO0lBQ2pFLHFCQUFxQjtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDO1FBQzdDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkQsQ0FBQztJQUVTLFVBQVU7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVTLGNBQWMsQ0FBQyxJQUFZO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVTLElBQUk7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFZLENBQUM7SUFDM0YsQ0FBQztJQUVTLFdBQVc7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztRQUM5QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLG9CQUFvQixJQUFJLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxzRkFBc0Y7SUFDNUUsT0FBTztRQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssc0JBQXNCO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDOUMsQ0FBQztJQUVTLFFBQVE7UUFDaEIsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFUyxxQkFBcUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyx1QkFBdUIsQ0FBQztJQUNyRixDQUFDO0lBRUQsNEVBQTRFO0lBQ2xFLHVCQUF1QjtRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO1FBQzlDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkQsQ0FBQztJQUVTLG1CQUFtQjtRQUMzQiwwRUFBMEU7UUFDMUUsK0JBQStCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsdURBQXVEO0lBQzdDLFlBQVk7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLHNCQUFzQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JHLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCw0REFBNEQ7SUFDbEQsWUFBWTtRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGdEQUFnRDtJQUN0QyxnQkFBZ0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDO0lBQ2hELENBQUM7SUFFUyxVQUFVO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDOUIsNEVBQTRFO1FBQzVFLDJCQUEyQjtRQUMzQixJQUFJLElBQUksS0FBSyxzQkFBc0I7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDMUYsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEMsOEVBQThFO1FBQzlFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekcsT0FBTyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLGlCQUFpQixDQUFDO0lBQ2pGLENBQUM7SUFFUyxNQUFNO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssb0JBQW9CO2dCQUN2QixnSEFBZ0g7Z0JBQ2hILE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZJLEtBQUssc0JBQXNCLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzVGLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFlBQVk7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3BELHNFQUFzRTtnQkFDdEUsbUNBQW1DO2dCQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUNwRSxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUM7d0JBQ0UsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEQsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7cUJBQ3hGLENBQUM7WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUI7Z0JBQzFCLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLEtBQUssc0JBQXNCO2dCQUN6QiwwREFBMEQ7Z0JBQzFELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDaEMscUVBQXFFO2dCQUNyRSwyQ0FBMkM7Z0JBQzNDLE9BQU87b0JBQ0wsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7b0JBQ25GLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2lCQUMzRixDQUFDO1lBQ0osS0FBSyxvQkFBb0I7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ25ILEtBQUssc0JBQXNCO2dCQUN6QixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLEtBQUssaUJBQWlCO2dCQUNwQiw2Q0FBNkM7Z0JBQzdDLE9BQU8sRUFBRSxDQUFDO1lBQ1osS0FBSyxpQkFBaUI7Z0JBQ3BCLHlFQUF5RTtnQkFDekUsa0VBQWtFO2dCQUNsRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUNqQyxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssTUFBTTtnQkFDVCwrRUFBK0U7Z0JBQy9FLCtFQUErRTtnQkFDL0UsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUk7b0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLO29CQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3RILE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssU0FBUztnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UscUVBQXFFO2dCQUNyRSwwQ0FBMEM7Z0JBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzt3R0FsUlUsb0JBQW9COzRGQUFwQixvQkFBb0IsdTBCQTNPckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeU9ULDREQTFPUyx5QkFBeUIsNkZBQUUseUJBQXlCOzs0RkE0T25ELG9CQUFvQjtrQkFoUGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUIsQ0FBQztvQkFDL0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlPVDtpQkFDRjs4QkFJVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsT0FBTztzQkFBZixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUUsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUUsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQU1FLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFNRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07O0FBa05ULGtGQUFrRjtBQUNsRixTQUFTLEdBQUcsQ0FBQyxRQUFnQjtJQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQVMsUUFBUTtJQUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMvRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYXdhaXRpbmdTaWduVXBMaW5rLFxuICBlbnJvbGxtZW50U3VibWl0S2V5LFxuICBncm91cFNldHVwS2V5LFxuICBsb2NhbGl6ZWRFcnJvck1lc3NhZ2UsXG4gIG5leHRTdGVwLFxuICB0eXBlIEF0dGVtcHRWaWV3LFxuICB0eXBlIENhcHRjaGFDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkRXJyb3IsXG4gIHR5cGUgRmxvd1N0YXRlLFxuICB0eXBlIE1mYUVucm9sbG1lbnRDb250cm9sbGVyLFxuICB0eXBlIE1mYUVucm9sbG1lbnRTdGF0ZSxcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RyYXRlZ3ksXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBvbGljeUFjY2VwdFN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3BvbGljeS1ob3N0JztcbmltcG9ydCB7IGNsYXNzRm9yLCB0eXBlIEVsZW1lbnRLZXkgfSBmcm9tICcuLi9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuXG4vKipcbiAqIE9uZSByZW5kZXJlZCByb3cgb2YgdGhlIGZsb3cuIEEgdW5pZm9ybSBzaGFwZSAocmF0aGVyIHRoYW4gYSBkaXNjcmltaW5hdGVkXG4gKiB1bmlvbikgc28gdGhlIHRlbXBsYXRlIGFjY2Vzc2VzIG9ubHkgZmllbGRzIHRoYXQgYWx3YXlzIGV4aXN0IOKAlCBubyByZWxpYW5jZSBvblxuICogdGVtcGxhdGUgY29udHJvbC1mbG93IG5hcnJvd2luZyBvZiBhIGxvb3AgdmFyaWFibGUsIHdoaWNoIHZhcmllcyBieSBBbmd1bGFyXG4gKiBtaW5vci4gRm9yIGEgYG1lc3NhZ2VgIHJvdywgYGxhYmVsS2V5YCBjYXJyaWVzIHRoZSBtZXNzYWdlJ3MgaTE4biBrZXkuXG4gKi9cbmludGVyZmFjZSBTdGVwRmllbGQge1xuICBraW5kOiAnaW5wdXQnIHwgJ21lc3NhZ2UnIHwgJ2FsZXJ0JyB8ICdyZWxlYXNlZCc7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWxLZXk6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBhdXRvY29tcGxldGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlci1kcml2ZW4gZmxvdyBzaGVsbCwgc2hhcmVkIGJ5IGA8YXRsYXMtc2lnbi1pbj5gIGFuZFxuICogYDxhdGxhcy1zaWduLXVwPmAuIFRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBpbnRlcm5hbCBgQXR0ZW1wdEZsb3dgLlxuICpcbiAqIEl0IGNvbnRhaW5zIE5PIGRlY2lzaW9uIGFib3V0IHdoYXQgY29tZXMgbmV4dDogaXQgcmVuZGVycyB3aGF0ZXZlciBgc3RhdHVzYFxuICogdGhlIHNlcnZlciByZXR1cm5lZCwgbWFwcGVkIHRocm91Z2ggYG5leHRTdGVwYCBmcm9tIGBAYXRsYXNhdXRoL2pzYCAodGhlIHNhbWVcbiAqIGV4aGF1c3RpdmUgbWFwcGluZyB0aGUgUmVhY3QgU0RLIHVzZXMpLCBzbyBhZGRpbmcgYSBzdGVwIGlzIGEgc2VydmVyIGNoYW5nZVxuICogYW5kIGFuIG91dC1vZi1kYXRlIGNsaWVudCBkZWdyYWRlcyB0byBhIHZpc2libGUgXCJwbGVhc2UgdXBkYXRlXCIgbWVzc2FnZSByYXRoZXJcbiAqIHRoYW4gYSBibGFuayBzY3JlZW4uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0bGFzLWF0dGVtcHQtZmxvdycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQXRsYXNDYXB0Y2hhU2xvdERpcmVjdGl2ZSwgUG9saWN5QWNjZXB0U3RlcENvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY2xzKCdjYXJkJywgJ2F0bGFzLWNhcmQnKVwiPlxuICAgICAgPGgxIFtjbGFzc109XCJjbHMoJ2hlYWRlclRpdGxlJywgJ2F0bGFzLXRpdGxlJylcIj57eyB0KHRpdGxlS2V5KSB9fTwvaDE+XG5cbiAgICAgIEBmb3IgKGVycm9yIG9mIGZvcm1FcnJvcnMoKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvcD5cbiAgICAgIH1cblxuICAgICAgPGZvcm0gKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoY29kZVNlbnRUZXh0KCk7IGFzIHNlbnRUZXh0KSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcy1jb2RlLXNlbnQ9XCJcIj57eyBzZW50VGV4dCB9fTwvcD5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGxpbmtTZW50VGV4dCgpOyBhcyBzZW50TGluaykge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtbGluay1zZW50PVwiXCI+e3sgc2VudExpbmsgfX08L3A+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChsaW5rT25seSgpKSB7XG4gICAgICAgICAgPCEtLSBOb3RoaW5nIHRvIHR5cGU6IHRoZSBmbG93IHBvbGxzIHVudGlsIHRoZSBlbWFpbGVkIGxpbmsgaXMgb3BlbmVkIChhbnl3aGVyZSkuIC0tPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtbGluay1zZW50PVwiXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICB7eyB0KCdzaWduVXAubGlua1NlbnRUbycsIHsgZW1haWw6IGF0dGVtcHQ/LmlkZW50aWZpZXIgPz8gJycgfSkgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLWF0bGFzLXJlc2VuZD1cIlwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzZW5kLmVtaXQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdCgnc2lnbkluLnJlc2VuZExpbmsnKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoZW5yb2xsaW5nKCkgJiYgZW5yb2xsbWVudFN0YXRlOyBhcyBlbnJvbCkge1xuICAgICAgICAgIEBpZiAoZW5yb2wubWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIj57eyB0KCdtZmEuZW5yb2xsQ2hvb3NlJykgfX08L3A+XG4gICAgICAgICAgICBAZm9yIChtIG9mIGVucm9sLm9wdGlvbnM7IHRyYWNrIG0pIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF0bGFzLW1mYS1tZXRob2RdPVwibVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgZW5yb2wuYnVzeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZU1ldGhvZChtKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0KG0gPT09ICd0b3RwJyA/ICdtZmEuZW5yb2xsVG90cE9wdGlvbicgOiAnbWZhLmVucm9sbFNtc09wdGlvbicpIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2UgaWYgKGVucm9sLm1ldGhvZCA9PT0gJ3RvdHAnKSB7XG4gICAgICAgICAgICBAaWYgKGVucm9sLmVucm9sbG1lbnQ7IGFzIHNldHVwKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5lbnJvbGxTY2FuJykgfX08L3A+XG4gICAgICAgICAgICAgIEBpZiAoc2V0dXAucXJDb2RlKSB7XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF0bGFzLW1mYS1xclwiIGRhdGEtYXRsYXM9XCJtZmEtcXJcIiBbc3JjXT1cInNldHVwLnFyQ29kZVwiIFthbHRdPVwidCgnbWZhLmVucm9sbFFyQWx0JylcIiB3aWR0aD1cIjE4MFwiIGhlaWdodD1cIjE4MFwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZXR1cC5zZWNyZXQpIHtcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzPVwibWZhLXNldHVwLWtleVwiPnt7IHQoJ21mYS5lbnJvbGxTZXR1cEtleScpIH19OiA8Y29kZT57eyBzZXR1cEtleShzZXR1cC5zZWNyZXQpIH19PC9jb2RlPjwvcD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYS5lbnJvbGxGaXJzdENvZGVMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiY29kZVwiIGF1dG9jb21wbGV0ZT1cIm9uZS10aW1lLWNvZGVcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgW3ZhbHVlXT1cInZhbHVlc1snY29kZSddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdjb2RlJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICBAaWYgKGVucm9sLnRvdHBDb2RlcyA+PSAyKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYS5lbnJvbGxTZWNvbmRDb2RlTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCIgdHlwZT1cInRleHRcIiBuYW1lPVwic2Vjb25kQ29kZVwiIGF1dG9jb21wbGV0ZT1cIm9uZS10aW1lLWNvZGVcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgW3ZhbHVlXT1cInZhbHVlc1snc2Vjb25kQ29kZSddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdzZWNvbmRDb2RlJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyBlbnJvbC5idXN5ID8gdCgnbWZhLmVucm9sbFByZXBhcmluZycpIDogJycgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKGVucm9sLmVucm9sbG1lbnQ7IGFzIHRleHRlZCkge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzPVwibWZhLWNvZGUtdGV4dGVkXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgdCgnbWZhLmNvZGVUZXh0ZWRUbycsIHsgcGhvbmU6IHRleHRlZC5waG9uZSA/PyAnJyB9KSB9fTwvcD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0KCdtZmEuY29kZUxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib25lLXRpbWUtY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbdmFsdWVdPVwidmFsdWVzWydjb2RlJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ2NvZGUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1hdGxhcy1yZXNlbmQ9XCJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8IGVucm9sLmJ1c3lcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNlbmRFbnJvbGxtZW50KClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdCgnc2lnbkluLnJlc2VuZENvZGUnKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYS5waG9uZUxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGVsXCIgbmFtZT1cInBob25lXCIgYXV0b2NvbXBsZXRlPVwidGVsXCIgW3ZhbHVlXT1cInZhbHVlc1sncGhvbmUnXSA/PyAnJ1wiIChpbnB1dCk9XCJzZXRWYWx1ZSgncGhvbmUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5waG9uZUhpbnQnKSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZW5yb2wuZXJyb3JzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvci5tZXNzYWdlIH19PC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGVucm9sLm1ldGhvZCAhPT0gbnVsbCAmJiBlbnJvbC5vcHRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIEBmb3IgKG90aGVyIG9mIG90aGVyTWV0aG9kcyhlbnJvbCk7IHRyYWNrIG90aGVyKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdGxhcy1tZmEtbWV0aG9kXT1cIm90aGVyXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCBlbnJvbC5idXN5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlTWV0aG9kKG90aGVyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0KG90aGVyID09PSAndG90cCcgPyAnbWZhLmVucm9sbFRvdHBPcHRpb24nIDogJ21mYS5lbnJvbGxTbXNPcHRpb24nKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAoZiBvZiBmaWVsZHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgQGlmIChmLmtpbmQgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHQoZi5sYWJlbEtleSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImYudHlwZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLm5hbWVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmF1dG9jb21wbGV0ZV09XCJmLmF1dG9jb21wbGV0ZSA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzW2YubmFtZV0gPz8gJydcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZShmLm5hbWUsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoZi5uYW1lKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGYua2luZCA9PT0gJ3JlbGVhc2VkJykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcy1wYXNzd29yZC1yZWxlYXNlZD1cIlwiPnt7IHQoZi5sYWJlbEtleSkgfX08L3A+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoZi5raW5kID09PSAnYWxlcnQnKSB7XG4gICAgICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgdChmLmxhYmVsS2V5KSB9fTwvcD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxwPnt7IHQoZi5sYWJlbEtleSkgfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChhd2FpdGluZ1BvbGljaWVzKCkpIHtcbiAgICAgICAgICA8IS0tIEEgcmVxdWlyZWQgcG9saWN5IGNoYW5nZWQ6IHNjcm9sbC1tb2RlIG9uZXMgaW4gdGhlaXIgZGlhbG9nLCB0aGUgcmVzdCBhcyBjaGVja2JveGVzLiAtLT5cbiAgICAgICAgICA8YXRsYXMtcG9saWN5LWFjY2VwdC1zdGVwXG4gICAgICAgICAgICBbYXR0ZW1wdF09XCJhdHRlbXB0XCJcbiAgICAgICAgICAgIFtidXN5XT1cImJ1c3lcIlxuICAgICAgICAgICAgKHN1Ym1pdEZsb3cpPVwic3VibWl0Rmxvdy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGRlY2xpbmVkKT1cInBvbGljeURlY2xpbmVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYXRsYXMtcG9saWN5LWFjY2VwdC1zdGVwPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93Q2FwdGNoYSgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0bGFzLWNhcHRjaGFcIiBkYXRhLWF0bGFzLWNhcHRjaGE9XCJcIiBbYXRsYXNDYXB0Y2hhU2xvdF09XCJjYXB0Y2hhXCI+PC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dTdWJtaXQoKSkge1xuICAgICAgICAgIDxidXR0b24gW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblByaW1hcnknLCAnYXRsYXMtYnV0dG9uJylcIiBbZGlzYWJsZWRdPVwiYnVzeSB8fCAoZW5yb2xsaW5nKCkgJiYgISFlbnJvbGxtZW50U3RhdGU/LmJ1c3kpXCIgdHlwZT1cInN1Ym1pdFwiPlxuICAgICAgICAgICAge3sgdChzdWJtaXRLZXkoKSkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd1Ntc1NlY29uZEZhY3RvcigpKSB7XG4gICAgICAgICAgQGlmIChzbXNTZWNvbmRGYWN0b3JTZW50VG8oKTsgYXMgc2VudFRvKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzPVwic21zLXNlY29uZC1mYWN0b3Itc2VudFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgICB7eyB0KCdtZmEuY29kZVRleHRlZFRvJywgeyBwaG9uZTogc2VudFRvIH0pIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGRhdGEtYXRsYXM9XCJzbXMtc2Vjb25kLWZhY3RvclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8ICEhdGV4dGVkU2Vjb25kRmFjdG9yPy5idXN5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNtc1NlY29uZEZhY3Rvci5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0ZXh0ZWRTZWNvbmRGYWN0b3I/LmJ1c3kgPyB0KCdzaWduSW4uc2VuZGluZycpIDogdCgnbWZhLnNtc0NvZGVPcHRpb24nKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKHRleHRlZFNlY29uZEZhY3Rvcj8uZXJyb3I7IGFzIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IG1lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93RW1haWxTZWNvbmRGYWN0b3IoKSkge1xuICAgICAgICAgIEBpZiAoZW1haWxTZWNvbmRGYWN0b3JTZW50VG8oKTsgYXMgc2VudFRvKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzPVwiZW1haWwtc2Vjb25kLWZhY3Rvci1zZW50XCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5jb2RlU2VudFRvJywgeyBlbWFpbDogc2VudFRvIH0pIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGRhdGEtYXRsYXM9XCJlbWFpbC1zZWNvbmQtZmFjdG9yXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgISFlbWFpbGVkU2Vjb25kRmFjdG9yPy5idXN5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVtYWlsU2Vjb25kRmFjdG9yLmVtaXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGVtYWlsZWRTZWNvbmRGYWN0b3I/LmJ1c3kgPyB0KCdzaWduSW4uc2VuZGluZycpIDogdCgnc2lnbkluLmVtYWlsQ29kZU9wdGlvbicpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAoZW1haWxlZFNlY29uZEZhY3Rvcj8uZXJyb3I7IGFzIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IG1lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93RW1haWxDb2RlT3B0aW9uKCkpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtc3RyYXRlZ3ldPVwicHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9jb2RlJyA/IG51bGwgOiAnZW1haWxfY29kZSdcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1hdGxhcy1yZXNlbmRdPVwicHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9jb2RlJyA/ICcnIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlRmFjdG9yLmVtaXQoJ2VtYWlsX2NvZGUnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdChwcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnID8gJ3NpZ25Jbi5yZXNlbmRDb2RlJyA6ICdzaWduSW4udXNlRW1haWxDb2RlJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoaG9sZFByb29mID09PSAnZW1haWxfbGluaycgJiYgc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtc3RyYXRlZ3ldPVwicHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJyA/IG51bGwgOiAnZW1haWxfbGluaydcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1hdGxhcy1yZXNlbmRdPVwicHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJyA/ICcnIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlRmFjdG9yLmVtaXQoJ2VtYWlsX2xpbmsnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdChwcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2xpbmsnID8gJ3NpZ25Jbi5yZXNlbmRMaW5rJyA6ICdzaWduSW4udXNlRW1haWxMaW5rJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAocHJlcGFyZWRGYWN0b3IgJiYgb2ZmZXJlZCgpLmluY2x1ZGVzKCdwYXNzd29yZCcpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLXN0cmF0ZWd5PVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVzZVBhc3N3b3JkLmVtaXQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdCgnc2lnbkluLnBhc3N3b3JkT3B0aW9uJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRlbXB0Rmxvd0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcblxuICBASW5wdXQoKSBhdHRlbXB0OiBBdHRlbXB0VmlldyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBidXN5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVycm9yczogRmllbGRFcnJvcltdID0gW107XG4gIC8qKiBgRmxvd1N0YXRlLnNlc3Npb25LZXB0YDogd2hldGhlciB0aGlzIGJyb3dzZXIga2VwdCB0aGUgc2Vzc2lvbiB0aGUgc2lnbi1pbiBjcmVhdGVkLiAqL1xuICBASW5wdXQoKSBzZXNzaW9uS2VwdDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdGl0bGVLZXkgPSAnc2lnbkluLnRpdGxlJztcbiAgLyoqXG4gICAqIFRoZSBzaWduLWluIGNhcHRjaGEsIGRyYXduIGFib3ZlIHRoZSBzdWJtaXQgYnV0dG9uIG9uIHRoZSBpZGVudGlmaWVyIHN0ZXBcbiAgICogKGFuIGFsd2F5cy1vbiBzaWduLWluIGNhcHRjaGEpIGFuZCBvbiB0aGUgY2hhbGxlbmdlIHN0ZXAgdGhlIHNlcnZlciBkZW1hbmRzXG4gICAqIHdpdGggYG5lZWRzX2NhcHRjaGFgLiBOdWxsIHdoZW4gdGhlIGZsb3cgZHJhd3Mgbm9uZS5cbiAgICovXG4gIEBJbnB1dCgpIGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgZmFjdG9ycyB0byBvZmZlciBvbiB0aGUgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcCDigJQgcGFzc1xuICAgKiBgQXRsYXNGbG93Q29udHJvbGxlci5maXJzdEZhY3RvcnMoKWAsIHdoaWNoIGRyb3BzIGVtYWlsIGNvZGUgLyBsaW5rIHdoaWxlIHRoZVxuICAgKiBhcHAgY2Fubm90IGRlbGl2ZXIgZW1haWwuIE51bGwgdXNlcyB0aGUgc2VydmVyJ3MgbGlzdCBhcy1pcy5cbiAgICovXG4gIEBJbnB1dCgpIGZpcnN0RmFjdG9yczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBmYWN0b3IgYWxyZWFkeSBzZW50IChgQXRsYXNGbG93Q29udHJvbGxlci5wcmVwYXJlZEZhY3RvcigpYCk6IGl0cyBjb2RlIGlzIGNvbGxlY3RlZC4gKi9cbiAgQElucHV0KCkgcHJlcGFyZWRGYWN0b3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogYEZsb3dTdGF0ZS5wYXNzd29yZEhvbGRgOiB3aGVyZSB0aGUgcHJvb2Ygd2VudCwgYW5kIHdoZXRoZXIgdGhlIHBhc3N3b3JkIHNpZ25zIGluIG5vdy4gKi9cbiAgQElucHV0KCkgcGFzc3dvcmRIb2xkOiBGbG93U3RhdGVbJ3Bhc3N3b3JkSG9sZCddID0gbnVsbDtcbiAgLyoqIGBBdGxhc0Zsb3dDb250cm9sbGVyLmhvbGRQcm9vZigpYDogdGhlIGVtYWlsZWQgcHJvb2YgYSBwYXNzd29yZCBob2xkIHN0aWxsIHdhaXRzIG9uLiAqL1xuICBASW5wdXQoKSBob2xkUHJvb2Y6ICdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBFbWl0cyB0aGUgY29sbGVjdGVkIGZpZWxkIHZhbHVlcyB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4gKi9cbiAgQE91dHB1dCgpIHN1Ym1pdEZsb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIHBpY2tzIGEgZmlyc3QgZmFjdG9yIHRoZSBzZXJ2ZXIgbXVzdCBzZW5kIGZpcnN0IChhbiBlbWFpbGVkIGNvZGUpLiAqL1xuICBAT3V0cHV0KCkgY2hvb3NlRmFjdG9yID0gbmV3IEV2ZW50RW1pdHRlcjwnZW1haWxfY29kZScgfCAnZW1haWxfbGluayc+KCk7XG4gIC8qKiBFbWl0cyBvbiBcIlVzZSB5b3VyIHBhc3N3b3JkIGluc3RlYWRcIiwgZnJvbSBhbiBlbWFpbGVkIGZhY3RvciBhbHJlYWR5IHNlbnQuICovXG4gIEBPdXRwdXQoKSB1c2VQYXNzd29yZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIE9mZmVyIFwiRW1haWwgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAodGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQuZW1haWxTZWNvbmRGYWN0b3JgKTsgYGVtYWlsU2Vjb25kRmFjdG9yYCBhc2tzIGZvciBpdCBhbmRcbiAgICogYGVtYWlsZWRTZWNvbmRGYWN0b3JgIHJlcG9ydHMgaG93IGl0IHdlbnQuXG4gICAqL1xuICBASW5wdXQoKSBvZmZlckVtYWlsU2Vjb25kRmFjdG9yID0gZmFsc2U7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5lbWFpbFNlY29uZEZhY3RvcigpYDogaW4gZmxpZ2h0LCB3aGVyZSBpdCB3ZW50LCBvciB3aHkgbm90LiAqL1xuICBASW5wdXQoKSBlbWFpbGVkU2Vjb25kRmFjdG9yOiB7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIGVtYWlsU2Vjb25kRmFjdG9yID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogT2ZmZXIgXCJUZXh0IG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHdoZXJlIHRoZSBhcHAgb2ZmZXJzXG4gICAqIHRleHRlZCBjb2RlcywgYEF0bGFzRmxvd0NvbnRyb2xsZXIubWZhQ2hvaWNlcygpLnNtc2ApOyBgc21zU2Vjb25kRmFjdG9yYFxuICAgKiBhc2tzIGZvciBpdCBhbmQgYHRleHRlZFNlY29uZEZhY3RvcmAgcmVwb3J0cyBob3cgaXQgd2VudC5cbiAgICovXG4gIEBJbnB1dCgpIG9mZmVyU21zU2Vjb25kRmFjdG9yID0gZmFsc2U7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5zbXNTZWNvbmRGYWN0b3IoKWA6IGluIGZsaWdodCwgd2hlcmUgaXQgd2VudCwgb3Igd2h5IG5vdC4gKi9cbiAgQElucHV0KCkgdGV4dGVkU2Vjb25kRmFjdG9yOiB7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIHNtc1NlY29uZEZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFRoZSBNRkEgZW5yb2xtZW50IHN0ZXAgKGBBdGxhc0Zsb3dDb250cm9sbGVyLmVucm9sbG1lbnRgIGFuZFxuICAgKiBgZW5yb2xsbWVudFN0YXRlKClgKTogdGhlIGF1dGhlbnRpY2F0b3IgYXBwJ3MgUVIgY29kZSBhbmQgc2V0dXAga2V5LCBvciBhXG4gICAqIHRleHRlZCBjb2RlLiBOdWxsOiB0aGUgc3RlcCBhc2tzIGZvciB0d28gYXV0aGVudGljYXRvciBjb2RlcyBvbmx5LlxuICAgKi9cbiAgQElucHV0KCkgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW5yb2xsbWVudFN0YXRlOiBNZmFFbnJvbGxtZW50U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIGBhY2NvdW50LmVtYWlsVmVyaWZpY2F0aW9uYC4gT24gYGxpbmtgIGEgc2lnbi11cCdzXG4gICAqIHZlcmlmaWNhdGlvbiBzdGVwIGhhcyBub3RoaW5nIHRvIHR5cGU6IGl0IHNheXMgdG8gb3BlbiB0aGUgZW1haWxlZCBsaW5rXG4gICAqIHdoaWxlIHRoZSBmbG93IHBvbGxzLCBhbmQgb2ZmZXJzIGEgcmVzZW5kIChgcmVzZW5kYCkuXG4gICAqL1xuICBASW5wdXQoKSBlbWFpbFZlcmlmaWNhdGlvbjogc3RyaW5nID0gJ2NvZGUnO1xuICBAT3V0cHV0KCkgcmVzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogVGhlIHVzZXIgZGVjbGluZWQgYSBwb2xpY3kgdGhlIHNpZ24taW4gd2FzIHdhaXRpbmcgb24gKGBuZWVkc19wb2xpY3lfYWNjZXB0YW5jZWApOiBjYW5jZWwgdGhlIGF0dGVtcHQuICovXG4gIEBPdXRwdXQoKSBwb2xpY3lEZWNsaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICAvKiogQSBzZXJ2ZXIgZXJyb3IgaW4gdGhlIGFwcCdzIGxhbmd1YWdlIChgZXJyb3IuPHJlYXNvbj5gLCBlbHNlIHRoZSBzZXJ2ZXIncyBtZXNzYWdlKS4gKi9cbiAgcHJvdGVjdGVkIGVycm9yVGV4dChlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB7XG4gICAgLy8gYGVycm9yTG9jYWxpemF0aW9uYCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhIHN0YW5kLWluIHNlcnZpY2UgbWF5IGxhY2sgaXQuXG4gICAgY29uc3QgbGF5ZXIgPSAodGhpcy5hdGxhcyBhcyB7IGVycm9yTG9jYWxpemF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KS5lcnJvckxvY2FsaXphdGlvbjtcbiAgICByZXR1cm4gbG9jYWxpemVkRXJyb3JNZXNzYWdlKGVycm9yLCBsYXllciA/PyB0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwgdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIEVucm9sbWVudDogdGV4dCB0aGUgY29kZSB0byB0aGUgdHlwZWQgbnVtYmVyLCBvciBjb25maXJtIHRoZSBmYWN0b3IuXG4gICAgaWYgKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50KSB7XG4gICAgICB2b2lkIHRoaXMuZW5yb2xsbWVudC5zdWJtaXQodGhpcy52YWx1ZXMpLnRoZW4oKG5leHQpID0+IHtcbiAgICAgICAgaWYgKG5leHQpIHRoaXMuc3VibWl0Rmxvdy5lbWl0KG5leHQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE9ubHkgd2hhdCBpcyBvbiBzY3JlZW46IGEgY29kZSB0eXBlZCBlYXJsaWVyIG11c3Qgbm90IHR1cm4gYSBwYXNzd29yZCBpbnRvIGEgY29kZSBhdHRlbXB0LlxuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSB7XG4gICAgICB0aGlzLnN1Ym1pdEZsb3cuZW1pdCh0aGlzLnByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyB7IGNvZGU6IHRoaXMudmFsdWVzWydjb2RlJ10gPz8gJycgfSA6IHsgcGFzc3dvcmQ6IHRoaXMudmFsdWVzWydwYXNzd29yZCddID8/ICcnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN1Ym1pdEZsb3cuZW1pdCh0aGlzLnZhbHVlcyk7XG4gIH1cblxuICAvKiogVGhlIHNoYXJlZCBlbnJvbG1lbnQgc3RlcCBpcyBkcmF3biAoYSBjb250cm9sbGVyIHdhcyBwYXNzZWQgYW5kIHRoZSBmbG93IGlzIGVucm9sbGluZykuICovXG4gIHByb3RlY3RlZCBlbnJvbGxpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdlbnJvbGxfc2Vjb25kX2ZhY3RvcicgJiYgISF0aGlzLmVucm9sbG1lbnQgJiYgISF0aGlzLmVucm9sbG1lbnRTdGF0ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaG9vc2VNZXRob2QobWV0aG9kOiBNZmFFbnJvbGxtZW50U3RyYXRlZ3kpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIHZvaWQgdGhpcy5lbnJvbGxtZW50Py5jaG9vc2UobWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNlbmRFbnJvbGxtZW50KCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5lbnJvbGxtZW50Py5yZXNlbmQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdGhlck1ldGhvZHMoc3RhdGU6IE1mYUVucm9sbG1lbnRTdGF0ZSk6IE1mYUVucm9sbG1lbnRTdHJhdGVneVtdIHtcbiAgICByZXR1cm4gc3RhdGUub3B0aW9ucy5maWx0ZXIoKG0pID0+IG0gIT09IHN0YXRlLm1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBLZXkoc2VjcmV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBncm91cFNldHVwS2V5KHNlY3JldCk7XG4gIH1cblxuICAvKiogVGhlIHN1Ym1pdCBidXR0b24ncyBsYWJlbCBrZXkgKGVucm9sbWVudDogXCJUZXh0IG1lIGEgY29kZVwiIGJlZm9yZSB0aGUgbnVtYmVyIGlzIHNlbnQpLiAqL1xuICBwcm90ZWN0ZWQgc3VibWl0S2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmVucm9sbGluZygpICYmIHRoaXMuZW5yb2xsbWVudFN0YXRlICYmIGVucm9sbG1lbnRTdWJtaXRLZXkodGhpcy5lbnJvbGxtZW50U3RhdGUpKSB8fCAnc2lnbkluLnN1Ym1pdCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd1Ntc1NlY29uZEZhY3RvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vZmZlclNtc1NlY29uZEZhY3RvciAmJiB0aGlzLnN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9zZWNvbmRfZmFjdG9yJztcbiAgfVxuXG4gIC8qKiBXaGVyZSB0aGUgdGV4dGVkIHNlY29uZC1mYWN0b3IgY29kZSB3ZW50IChtYXNrZWQpLCBvbmNlIGl0IHdhcyBzZW50LiAqL1xuICBwcm90ZWN0ZWQgc21zU2Vjb25kRmFjdG9yU2VudFRvKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNlbnQgPSB0aGlzLnRleHRlZFNlY29uZEZhY3Rvcj8uc2VudFRvO1xuICAgIHJldHVybiB0eXBlb2Ygc2VudCA9PT0gJ3N0cmluZycgPyBzZW50IHx8ICcgJyA6IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybUVycm9ycygpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiAhZXJyb3IucGFyYW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkRXJyb3JzRm9yKG5hbWU6IHN0cmluZyk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhcmFtID09PSBuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLmF0dGVtcHQgPyBuZXh0U3RlcCh0aGlzLmF0dGVtcHQpIDogKHsga2luZDogJ2NvbGxlY3RfaWRlbnRpZmllcicgfSBhcyBjb25zdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcHRjaGEoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgcmV0dXJuICEhdGhpcy5jYXB0Y2hhICYmIChraW5kID09PSAnY29sbGVjdF9pZGVudGlmaWVyJyB8fCBraW5kID09PSAnY29sbGVjdF9jYXB0Y2hhJyk7XG4gIH1cblxuICAvKiogVGhlIGZpcnN0IGZhY3RvcnMgb24gb2ZmZXIgYXQgYSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIChlbXB0eSBvbiBhbnkgb3RoZXIpLiAqL1xuICBwcm90ZWN0ZWQgb2ZmZXJlZCgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCgpO1xuICAgIGlmIChzdGVwLmtpbmQgIT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5maXJzdEZhY3RvcnMgPz8gc3RlcC5zdHJhdGVnaWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpbmtPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhd2FpdGluZ1NpZ25VcExpbmsodGhpcy5hdHRlbXB0LCB0aGlzLmVtYWlsVmVyaWZpY2F0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RW1haWxTZWNvbmRGYWN0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2ZmZXJFbWFpbFNlY29uZEZhY3RvciAmJiB0aGlzLnN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9zZWNvbmRfZmFjdG9yJztcbiAgfVxuXG4gIC8qKiBXaGVyZSB0aGUgZW1haWxlZCBzZWNvbmQtZmFjdG9yIGNvZGUgd2VudCAobWFza2VkKSwgb25jZSBpdCB3YXMgc2VudC4gKi9cbiAgcHJvdGVjdGVkIGVtYWlsU2Vjb25kRmFjdG9yU2VudFRvKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNlbnQgPSB0aGlzLmVtYWlsZWRTZWNvbmRGYWN0b3I/LnNlbnRUbztcbiAgICByZXR1cm4gdHlwZW9mIHNlbnQgPT09ICdzdHJpbmcnID8gc2VudCB8fCAnICcgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dFbWFpbENvZGVPcHRpb24oKTogYm9vbGVhbiB7XG4gICAgLy8gQmVmb3JlIHRoZSBjb2RlIGlzIHNlbnQ6IHRoZSBjaG9pY2UgKG9yIHRoZSByZXRyeSBvZiBhIGZhaWxlZCBhdXRvbWF0aWNcbiAgICAvLyBzZW5kKS4gQWZ0ZXI6IFwiUmVzZW5kIGNvZGVcIi5cbiAgICByZXR1cm4gdGhpcy5vZmZlcmVkKCkuaW5jbHVkZXMoJ2VtYWlsX2NvZGUnKTtcbiAgfVxuXG4gIC8qKiBUaGUgXCJ3ZSBzZW50IGEgY29kZSB0byDigKZcIiBsaW5lIG9uIHRoZSBjb2RlIHN0ZXAuICovXG4gIHByb3RlY3RlZCBjb2RlU2VudFRleHQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc3RlcCgpLmtpbmQgIT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicgfHwgdGhpcy5wcmVwYXJlZEZhY3RvciAhPT0gJ2VtYWlsX2NvZGUnKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy50KCdzaWduSW4uY29kZVNlbnRUbycsIHsgZW1haWw6IHRoaXMucGFzc3dvcmRIb2xkPy5lbWFpbCA/PyB0aGlzLmF0dGVtcHQ/LmlkZW50aWZpZXIgPz8gJycgfSk7XG4gIH1cblxuICAvKiogVGhlIFwid2Ugc2VudCBhIGxpbmsgdG8g4oCmXCIgbGluZSwgb25jZSBhIGxpbmsgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBsaW5rU2VudFRleHQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc3RlcCgpLmtpbmQgIT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicgfHwgdGhpcy5wcmVwYXJlZEZhY3RvciAhPT0gJ2VtYWlsX2xpbmsnKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy50KCdzaWduSW4ubGlua1NlbnRUbycsIHsgZW1haWw6IHRoaXMucGFzc3dvcmRIb2xkPy5lbWFpbCA/PyB0aGlzLmF0dGVtcHQ/LmlkZW50aWZpZXIgPz8gJycgfSk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgaXMgYG5lZWRzX3BvbGljeV9hY2NlcHRhbmNlYC4gKi9cbiAgcHJvdGVjdGVkIGF3YWl0aW5nUG9saWNpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdhY2NlcHRfcG9saWNpZXMnO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dTdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgLy8gTm90aGluZyB0byBzdWJtaXQgb24gYSBmaXJzdC1mYWN0b3Igc3RlcCB0aGF0IG9ubHkgb2ZmZXJzIGFuIGVtYWlsZWQgY29kZVxuICAgIC8vIHVudGlsIHRoYXQgY29kZSBpcyBzZW50LlxuICAgIGlmIChraW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gdGhpcy5maWVsZHMoKS5zb21lKChmKSA9PiBmLmtpbmQgPT09ICdpbnB1dCcpO1xuICAgIGlmICh0aGlzLmxpbmtPbmx5KCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFbnJvbG1lbnQ6IG5vdGhpbmcgdG8gc3VibWl0IHdoaWxlIGNob29zaW5nIGEgbWV0aG9kIG9yIGZldGNoaW5nIHRoZSBzZXR1cC5cbiAgICBpZiAodGhpcy5lbnJvbGxpbmcoKSAmJiB0aGlzLmVucm9sbG1lbnRTdGF0ZSAmJiAhZW5yb2xsbWVudFN1Ym1pdEtleSh0aGlzLmVucm9sbG1lbnRTdGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ga2luZCAhPT0gJ2RvbmUnICYmIGtpbmQgIT09ICdhd2FpdF9vYXV0aCcgJiYga2luZCAhPT0gJ2FjY2VwdF9wb2xpY2llcyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFN0ZXBGaWVsZFtdIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwKCk7XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfaWRlbnRpZmllcic6XG4gICAgICAgIC8vIGB3ZWJhdXRobmA6IHNhdmVkIHBhc3NrZXlzIGFwcGVhciBpbiB0aGlzIGZpZWxkJ3MgYXV0b2ZpbGwgd2hpbGUgPGF0bGFzLXNpZ24taW4+IGhvbGRzIGEgY29uZGl0aW9uYWwgcmVxdWVzdC5cbiAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdpZGVudGlmaWVyJywgbGFiZWxLZXk6ICdzaWduSW4uaWRlbnRpZmllckxhYmVsJywgdHlwZTogJ2VtYWlsJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUgd2ViYXV0aG4nIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9maXJzdF9mYWN0b3InOiB7XG4gICAgICAgIGlmICh0aGlzLnByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScpIHtcbiAgICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ3NpZ25Jbi5lbWFpbENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2xpbmsnKSByZXR1cm4gW107XG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBmaWVsZCB1bmxlc3MgdGhlIG9ubHkgb2ZmZXIgaXMgYW4gZW1haWxlZCBjb2RlIChjaG9zZW5cbiAgICAgICAgLy8gd2l0aCB0aGUgYnV0dG9uIGJlbG93IHRoZSBmb3JtKS5cbiAgICAgICAgY29uc3Qgb2ZmZXJlZCA9IHRoaXMub2ZmZXJlZCgpO1xuICAgICAgICByZXR1cm4gb2ZmZXJlZC5pbmNsdWRlcygnZW1haWxfY29kZScpICYmICFvZmZlcmVkLmluY2x1ZGVzKCdwYXNzd29yZCcpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAuLi4odGhpcy5wYXNzd29yZEhvbGQ/LnJlbGVhc2VkID8gW3JlbGVhc2VkKCldIDogW10pLFxuICAgICAgICAgICAgICB7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdwYXNzd29yZCcsIGxhYmVsS2V5OiAnc2lnbkluLnBhc3N3b3JkTGFiZWwnLCB0eXBlOiAncGFzc3dvcmQnIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29sbGVjdF9zZWNvbmRfZmFjdG9yJzpcbiAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdtZmEuY29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgY2FzZSAnZW5yb2xsX3NlY29uZF9mYWN0b3InOlxuICAgICAgICAvLyBUaGUgc2hhcmVkIGVucm9sbWVudCBzdGVwIGRyYXdzIGl0cyBvd24gZmllbGRzIChhYm92ZSkuXG4gICAgICAgIGlmICh0aGlzLmVucm9sbGluZygpKSByZXR1cm4gW107XG4gICAgICAgIC8vIFR3byBjb25zZWN1dGl2ZSBjb2RlcyAowqc1LjYpOiBhIHBob25lIHdpdGggYSBmYXN0IGNsb2NrIGZhaWxzIGhlcmVcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gb24gZXZlcnkgc2lnbi1pbiBhZnRlcndhcmRzLlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxGaXJzdENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ3NlY29uZENvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxTZWNvbmRDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfZW1haWxfY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtPbmx5KCkgPyBbXSA6IFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdzaWduSW4uZW1haWxDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICBjYXNlICdjb2xsZWN0X25ld19wYXNzd29yZCc6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3Jlc2V0Lm5ld1Bhc3N3b3JkTGFiZWwnLCB0eXBlOiAncGFzc3dvcmQnIH1dO1xuICAgICAgY2FzZSAnYWNjZXB0X3BvbGljaWVzJzpcbiAgICAgICAgLy8gRHJhd24gYnkgPGF0bGFzLXBvbGljeS1hY2NlcHQtc3RlcD4gYWJvdmUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfY2FwdGNoYSc6XG4gICAgICAgIC8vIMKnNSB0aGUgc2VydmVyIHdpdGhoZWxkIHRoZSBhdHRlbXB0IHVudGlsIGEgY2FwdGNoYSBjbGVhcnMuIFNvbHZpbmcgdGhlXG4gICAgICAgIC8vIHdpZGdldCByZXN1Ym1pdHMgdGhlIGlkZW50aWZpZXIgb24gaXRzIG93bjsgdGhlIGJ1dHRvbiByZXRyaWVzLlxuICAgICAgICByZXR1cm4gW21zZygnY2FwdGNoYS5wcm9tcHQnKV07XG4gICAgICBjYXNlICdhd2FpdF9vYXV0aCc6XG4gICAgICAgIHJldHVybiBbbXNnKCdzaWduSW4ubWFnaWNMaW5rU2VudCcpXTtcbiAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICAvLyBTaWduZWQgaW4gb25seSB3aGVuIHRoaXMgYnJvd3NlciBob2xkcyB0aGUgc2Vzc2lvbjsgYSBibG9ja2VkIGNvb2tpZSBpcyBzYWlkXG4gICAgICAgIC8vIHBsYWlubHkuIFwiQ2hlY2sgdGhlIG90aGVyIHRhYlwiIGlzIGZvciBhIHNpZ24taW4gY29tcGxldGVkIG9uIGFub3RoZXIgZGV2aWNlLlxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uS2VwdCA9PT0gdHJ1ZSkgcmV0dXJuIFttc2coJ3NpZ25Jbi5zaWduZWRJbicpXTtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbktlcHQgPT09IGZhbHNlKSByZXR1cm4gW3sga2luZDogJ2FsZXJ0JywgbmFtZTogJycsIGxhYmVsS2V5OiAnc2lnbkluLnNlc3Npb25Ob3RLZXB0JywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgICByZXR1cm4gW21zZygnc2lnbkluLmNoZWNrT3RoZXJUYWInKV07XG4gICAgICBjYXNlICdyZXN0YXJ0JzpcbiAgICAgICAgcmV0dXJuIFttc2coJ2Vycm9yLmdlbmVyaWMnKV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBBIHN0YXR1cyB0aGlzIFNESyB2ZXJzaW9uIGRvZXMgbm90IGtub3cuIEFuIGhvbmVzdCBtZXNzYWdlIGJlYXRzIGFcbiAgICAgICAgLy8gYmxhbmsgbG9naW4gYm94IHRoZSB1c2VyIGNhbm5vdCBhY3Qgb24uXG4gICAgICAgIHJldHVybiBbbXNnKCdlcnJvci5nZW5lcmljJyldO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQSByZWFkLW9ubHkgbWVzc2FnZSByb3c6IGBsYWJlbEtleWAgaG9sZHMgdGhlIGkxOG4ga2V5IG9mIHRoZSB0ZXh0IHRvIHNob3cuICovXG5mdW5jdGlvbiBtc2cobGFiZWxLZXk6IHN0cmluZyk6IFN0ZXBGaWVsZCB7XG4gIHJldHVybiB7IGtpbmQ6ICdtZXNzYWdlJywgbmFtZTogJycsIGxhYmVsS2V5LCB0eXBlOiAndGV4dCcgfTtcbn1cblxuZnVuY3Rpb24gcmVsZWFzZWQoKTogU3RlcEZpZWxkIHtcbiAgcmV0dXJuIHsga2luZDogJ3JlbGVhc2VkJywgbmFtZTogJycsIGxhYmVsS2V5OiAnc2lnbkluLnBhc3N3b3JkSG9sZFJlbGVhc2VkJywgdHlwZTogJ3RleHQnIH07XG59XG4iXX0=