bways-report 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +276 -21
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4286 -859
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +15 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -4,6 +4,7 @@ import { FormsModule } from '@angular/forms';
4
4
  import { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';
5
5
  import { ReportSessionContextService } from '../../../../core/services/report-session-context.service';
6
6
  import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
7
+ import { sanitizeSqlParamLiteral } from '../../../../core/utils/report-parameter.util';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/forms";
9
10
  export class ParameterBindingEditorComponent {
@@ -150,6 +151,15 @@ export class ParameterBindingEditorComponent {
150
151
  const v = this.currentValue();
151
152
  return v === true || v === 'true' || v === 1 || v === '1';
152
153
  });
154
+ isLongTextInput = computed(() => {
155
+ const val = String(this.currentValue() ?? '');
156
+ const name = this.param().name.toLowerCase();
157
+ return (val.length > 50 ||
158
+ name.includes('columnnames') ||
159
+ name.includes('filter') ||
160
+ name.includes('sql') ||
161
+ name.includes('query'));
162
+ });
153
163
  setMode(mode) {
154
164
  this.internalMode.set(mode);
155
165
  if (mode === 'session') {
@@ -215,7 +225,8 @@ export class ParameterBindingEditorComponent {
215
225
  });
216
226
  }
217
227
  onFixedValueChanged(val) {
218
- this.valueChange.emit(val);
228
+ const cleanVal = sanitizeSqlParamLiteral(val);
229
+ this.valueChange.emit(cleanVal);
219
230
  this.linkedFieldChange.emit({
220
231
  paramName: this.param().name,
221
232
  fieldKey: '',
@@ -236,17 +247,21 @@ export class ParameterBindingEditorComponent {
236
247
  <!-- Card Header: Title, Technical Name, Type, and Badges -->
237
248
  <div class="param-header">
238
249
  <div class="param-title-wrap">
239
- <span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
240
- <span class="param-tech-badge">{{ param().name }}</span>
241
- <span class="param-type-badge">{{ displayType() }}</span>
242
- @if (isAutoSessionDerived()) {
243
- <span class="session-auto-badge">Auto Session</span>
244
- } @else if (param().required && !hasValue()) {
245
- <span class="required-warn-badge">Required</span>
246
- }
250
+ <div class="param-title-left">
251
+ <span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
252
+ <span class="param-tech-badge">{{ param().name }}</span>
253
+ </div>
254
+ <div class="param-title-right">
255
+ <span class="param-type-badge">{{ displayType() }}</span>
256
+ @if (isAutoSessionDerived()) {
257
+ <span class="session-auto-badge">Auto Session</span>
258
+ } @else if (param().required && !hasValue()) {
259
+ <span class="required-warn-badge">Required</span>
260
+ }
261
+ </div>
247
262
  </div>
248
263
 
249
- <!-- Binding Mode Segmented Selector -->
264
+ <!-- Binding Mode Segmented Selector (Ultra-compact, single horizontal track) -->
250
265
  <div class="binding-mode-tabs" role="tablist">
251
266
  @if (sessionMatch()) {
252
267
  <button
@@ -256,7 +271,7 @@ export class ParameterBindingEditorComponent {
256
271
  (click)="setMode('session')"
257
272
  title="Bound to session user/branch context"
258
273
  >
259
- <rpt-icon name="user" [size]="11" />
274
+ <rpt-icon name="user" [size]="10" />
260
275
  <span>Session</span>
261
276
  </button>
262
277
  }
@@ -265,29 +280,29 @@ export class ParameterBindingEditorComponent {
265
280
  class="mode-btn"
266
281
  [class.active]="activeMode() === 'control'"
267
282
  (click)="setMode('control')"
268
- title="Link value to a form field on canvas (e.g. Dropdown, DatePicker)"
283
+ title="Link value to a canvas form field (e.g. Dropdown, DatePicker)"
269
284
  >
270
- <rpt-icon name="link" [size]="11" />
271
- <span>Form Field</span>
285
+ <rpt-icon name="link" [size]="10" />
286
+ <span>Field</span>
272
287
  </button>
273
288
  <button
274
289
  type="button"
275
290
  class="mode-btn"
276
291
  [class.active]="activeMode() === 'fixed'"
277
292
  (click)="setMode('fixed')"
278
- title="Type a manual or fixed value (e.g. 1, 0, 101)"
293
+ title="Type a manual or fixed value (e.g. 101, 'ADMIN')"
279
294
  >
280
- <rpt-icon name="edit" [size]="11" />
281
- <span>Fixed Value</span>
295
+ <rpt-icon name="edit" [size]="10" />
296
+ <span>Fixed</span>
282
297
  </button>
283
298
  <button
284
299
  type="button"
285
300
  class="mode-btn"
286
301
  [class.active]="activeMode() === 'context'"
287
302
  (click)="setMode('context')"
288
- title="Use system date presets (e.g. Today, Month Start)"
303
+ title="Use system date presets (Today, Month Start, etc.)"
289
304
  >
290
- <rpt-icon name="clock" [size]="11" />
305
+ <rpt-icon name="clock" [size]="10" />
291
306
  <span>Preset</span>
292
307
  </button>
293
308
  @if (isAdvancedMode()) {
@@ -298,7 +313,7 @@ export class ParameterBindingEditorComponent {
298
313
  (click)="setMode('custom')"
299
314
  title="Manual template expression"
300
315
  >
301
- <rpt-icon name="code" [size]="11" />
316
+ <rpt-icon name="code" [size]="10" />
302
317
  <span>Expr</span>
303
318
  </button>
304
319
  }
@@ -371,8 +386,11 @@ export class ParameterBindingEditorComponent {
371
386
  <div class="input-wrap">
372
387
  <input
373
388
  type="number"
374
- class="field-input"
389
+ class="field-input monospace-input"
375
390
  placeholder="Enter number (e.g. 1, 0, 11)"
391
+ (wheel)="$any($event.target).blur()"
392
+ (keydown.arrowup)="$event.preventDefault()"
393
+ (keydown.arrowdown)="$event.preventDefault()"
376
394
  [ngModel]="currentValue()"
377
395
  (ngModelChange)="onFixedValueChanged($event)"
378
396
  />
@@ -383,6 +401,7 @@ export class ParameterBindingEditorComponent {
383
401
  <input
384
402
  type="date"
385
403
  class="field-input"
404
+ (wheel)="$any($event.target).blur()"
386
405
  [ngModel]="currentValue()"
387
406
  (ngModelChange)="onFixedValueChanged($event)"
388
407
  />
@@ -390,19 +409,30 @@ export class ParameterBindingEditorComponent {
390
409
  }
391
410
  @default {
392
411
  <div class="input-wrap">
393
- <input
394
- type="text"
395
- class="field-input"
396
- placeholder="Enter value (e.g. 101, text, code)"
397
- [ngModel]="currentValue()"
398
- (ngModelChange)="onFixedValueChanged($event)"
399
- />
412
+ @if (isLongTextInput()) {
413
+ <textarea
414
+ rows="3"
415
+ class="field-input monospace-input textarea-input"
416
+ placeholder="Enter SQL column names or expression..."
417
+ [ngModel]="currentValue()"
418
+ (ngModelChange)="onFixedValueChanged($event)"
419
+ ></textarea>
420
+ } @else {
421
+ <input
422
+ type="text"
423
+ class="field-input monospace-input"
424
+ placeholder="Enter value (e.g. 101, text, code)"
425
+ (wheel)="$any($event.target).blur()"
426
+ [ngModel]="currentValue()"
427
+ (ngModelChange)="onFixedValueChanged($event)"
428
+ />
429
+ }
400
430
  </div>
401
431
  }
402
432
  }
403
433
  @if (paramQuickSuggestions().length > 0) {
404
434
  <div class="quick-chips-row">
405
- <span class="chips-label">Quick:</span>
435
+ <span class="chips-label">Suggestions:</span>
406
436
  @for (chip of paramQuickSuggestions(); track chip.value) {
407
437
  <button
408
438
  type="button"
@@ -455,7 +485,7 @@ export class ParameterBindingEditorComponent {
455
485
  <div class="param-desc">{{ param().description }}</div>
456
486
  }
457
487
  </div>
458
- `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".param-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 3px #00000008;box-sizing:border-box;width:100%;min-width:0;transition:all .12s ease}.param-card:hover{border-color:#94a3b8}.param-card.session-bound{background:#f0fdf4;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:6px;width:100%}.param-label{font-size:.775rem;font-weight:700;color:#0f172a;white-space:nowrap}.param-tech-badge{font-size:.65rem;font-family:monospace;padding:1px 6px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.param-type-badge{font-size:.65rem;padding:1px 6px;border-radius:4px;background:#f1f5f9;color:#475569;text-transform:capitalize}.session-auto-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0}.required-warn-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.binding-mode-tabs{display:flex;flex-wrap:wrap;width:100%;background:#f1f5f9;border-radius:6px;padding:3px;gap:3px;box-sizing:border-box}.mode-btn{flex:1 1 70px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;font-size:.69rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#fff9}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:8px;width:100%;min-width:0;box-sizing:border-box}.linker-icon{color:#2563eb;flex-shrink:0}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #bfdbfe;border-radius:6px;background-color:#eff6ff;font-weight:500;color:#1e40af;padding:6px 10px;font-size:.75rem}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:4px}.chips-label{font-size:.65rem;font-weight:600;color:#64748b;margin-right:2px}.chip-btn{font-size:.65rem;font-weight:500;padding:2px 7px;border-radius:4px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;cursor:pointer;transition:all .12s ease}.chip-btn:hover{background:#e2e8f0;color:#0f172a;border-color:#94a3b8}.chip-btn.active{background:#dbeafe;color:#1e40af;border-color:#60a5fa;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.mode-switch-hint{font-size:.68rem;color:#64748b;margin-top:1px;display:flex;align-items:center;gap:5px;flex-wrap:wrap}.btn-text-switch{background:none;border:none;padding:0;color:#2563eb;font-weight:600;cursor:pointer;text-decoration:underline;font-size:.68rem}.btn-text-switch:hover{color:#1d4ed8}.session-box{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;background:#fff;border:1px solid #bbf7d0;border-radius:6px;padding:6px 10px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.72rem;color:#166534;min-width:0}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.7rem;color:#15803d;background:#dcfce7;padding:2px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:monospace;font-size:.72rem}.param-desc{font-size:.675rem;color:#64748b;line-height:1.35}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
488
+ `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button,.field-input[type=number]::-webkit-inner-spin-button,.field-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number],.field-input[type=number]{-moz-appearance:textfield;appearance:textfield}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", "input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}.param-card{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:8px 10px;display:flex;flex-direction:column;gap:7px;box-shadow:0 1px 2px #0f172a0a;box-sizing:border-box;width:100%;min-width:0;transition:border-color .15s ease,box-shadow .15s ease}.param-card:hover{border-color:#cbd5e1;box-shadow:0 2px 6px -1px #0f172a12}.param-card:focus-within{border-color:#93c5fd;box-shadow:0 0 0 1px #93c5fd,0 2px 6px -1px #2563eb14}.param-card.session-bound{background:#fcfdfa;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:space-between;gap:6px;width:100%;min-width:0}.param-title-left{display:flex;align-items:center;gap:5px;min-width:0;overflow:hidden}.param-label{font-size:.75rem;font-weight:700;color:#0f172a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.param-tech-badge{font-size:.625rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;padding:1px 5px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #dbeafe;white-space:nowrap}.param-title-right{display:flex;align-items:center;gap:4px;flex-shrink:0}.param-type-badge{font-size:.6rem;font-weight:500;padding:1px 5px;border-radius:4px;background:#f8fafc;color:#64748b;border:1px solid #e2e8f0;text-transform:capitalize;white-space:nowrap}.session-auto-badge{font-size:.6rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0;white-space:nowrap}.required-warn-badge{font-size:.6rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca;white-space:nowrap}.binding-mode-tabs{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;width:100%;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:2px;gap:2px;box-sizing:border-box;height:26px}.mode-btn{flex:1 1 0px;min-width:0;height:20px;display:inline-flex;align-items:center;justify-content:center;gap:3px;padding:0 4px;font-size:.65rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap;-webkit-user-select:none;user-select:none}.mode-btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#ffffffb3}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:5px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:6px;width:100%;min-width:0;box-sizing:border-box;position:relative}.linker-icon{color:#2563eb;position:absolute;left:8px;pointer-events:none;z-index:1}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:6px;background-color:#f8fafc;font-size:.75rem;color:#0f172a;padding:5px 8px 5px 26px!important;height:30px;transition:all .12s ease}.linker-select:focus{background-color:#fff;border-color:#2563eb;box-shadow:0 0 0 3px #2563eb26}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:2px}.chips-label{font-size:.6rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.02em}.chip-btn{font-size:.625rem;font-weight:500;padding:2px 8px;border-radius:9999px;background:#f8fafc;color:#334155;border:1px solid #e2e8f0;cursor:pointer;transition:all .12s ease;line-height:1.2}.chip-btn:hover{background:#eff6ff;color:#1d4ed8;border-color:#bfdbfe}.chip-btn.active{background:#2563eb;color:#fff;border-color:#2563eb;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.field-input,.field-select{width:100%;box-sizing:border-box;height:30px;padding:5px 8px;font-size:.75rem;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#0f172a;outline:none;transition:border-color .12s ease,box-shadow .12s ease}.field-input:focus,.field-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1f}.textarea-input{height:auto;min-height:56px;resize:vertical;line-height:1.35;font-size:.72rem;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.session-box{display:flex;align-items:center;justify-content:space-between;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;padding:5px 8px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.7rem;color:#166534;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.65rem;color:#15803d;background:#dcfce7;padding:1px 6px;border-radius:4px;white-space:nowrap}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem}.param-desc{font-size:.65rem;color:#64748b;line-height:1.35}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
459
489
  }
460
490
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ParameterBindingEditorComponent, decorators: [{
461
491
  type: Component,
@@ -464,17 +494,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
464
494
  <!-- Card Header: Title, Technical Name, Type, and Badges -->
465
495
  <div class="param-header">
466
496
  <div class="param-title-wrap">
467
- <span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
468
- <span class="param-tech-badge">{{ param().name }}</span>
469
- <span class="param-type-badge">{{ displayType() }}</span>
470
- @if (isAutoSessionDerived()) {
471
- <span class="session-auto-badge">Auto Session</span>
472
- } @else if (param().required && !hasValue()) {
473
- <span class="required-warn-badge">Required</span>
474
- }
497
+ <div class="param-title-left">
498
+ <span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
499
+ <span class="param-tech-badge">{{ param().name }}</span>
500
+ </div>
501
+ <div class="param-title-right">
502
+ <span class="param-type-badge">{{ displayType() }}</span>
503
+ @if (isAutoSessionDerived()) {
504
+ <span class="session-auto-badge">Auto Session</span>
505
+ } @else if (param().required && !hasValue()) {
506
+ <span class="required-warn-badge">Required</span>
507
+ }
508
+ </div>
475
509
  </div>
476
510
 
477
- <!-- Binding Mode Segmented Selector -->
511
+ <!-- Binding Mode Segmented Selector (Ultra-compact, single horizontal track) -->
478
512
  <div class="binding-mode-tabs" role="tablist">
479
513
  @if (sessionMatch()) {
480
514
  <button
@@ -484,7 +518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
484
518
  (click)="setMode('session')"
485
519
  title="Bound to session user/branch context"
486
520
  >
487
- <rpt-icon name="user" [size]="11" />
521
+ <rpt-icon name="user" [size]="10" />
488
522
  <span>Session</span>
489
523
  </button>
490
524
  }
@@ -493,29 +527,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
493
527
  class="mode-btn"
494
528
  [class.active]="activeMode() === 'control'"
495
529
  (click)="setMode('control')"
496
- title="Link value to a form field on canvas (e.g. Dropdown, DatePicker)"
530
+ title="Link value to a canvas form field (e.g. Dropdown, DatePicker)"
497
531
  >
498
- <rpt-icon name="link" [size]="11" />
499
- <span>Form Field</span>
532
+ <rpt-icon name="link" [size]="10" />
533
+ <span>Field</span>
500
534
  </button>
501
535
  <button
502
536
  type="button"
503
537
  class="mode-btn"
504
538
  [class.active]="activeMode() === 'fixed'"
505
539
  (click)="setMode('fixed')"
506
- title="Type a manual or fixed value (e.g. 1, 0, 101)"
540
+ title="Type a manual or fixed value (e.g. 101, 'ADMIN')"
507
541
  >
508
- <rpt-icon name="edit" [size]="11" />
509
- <span>Fixed Value</span>
542
+ <rpt-icon name="edit" [size]="10" />
543
+ <span>Fixed</span>
510
544
  </button>
511
545
  <button
512
546
  type="button"
513
547
  class="mode-btn"
514
548
  [class.active]="activeMode() === 'context'"
515
549
  (click)="setMode('context')"
516
- title="Use system date presets (e.g. Today, Month Start)"
550
+ title="Use system date presets (Today, Month Start, etc.)"
517
551
  >
518
- <rpt-icon name="clock" [size]="11" />
552
+ <rpt-icon name="clock" [size]="10" />
519
553
  <span>Preset</span>
520
554
  </button>
521
555
  @if (isAdvancedMode()) {
@@ -526,7 +560,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
526
560
  (click)="setMode('custom')"
527
561
  title="Manual template expression"
528
562
  >
529
- <rpt-icon name="code" [size]="11" />
563
+ <rpt-icon name="code" [size]="10" />
530
564
  <span>Expr</span>
531
565
  </button>
532
566
  }
@@ -599,8 +633,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
599
633
  <div class="input-wrap">
600
634
  <input
601
635
  type="number"
602
- class="field-input"
636
+ class="field-input monospace-input"
603
637
  placeholder="Enter number (e.g. 1, 0, 11)"
638
+ (wheel)="$any($event.target).blur()"
639
+ (keydown.arrowup)="$event.preventDefault()"
640
+ (keydown.arrowdown)="$event.preventDefault()"
604
641
  [ngModel]="currentValue()"
605
642
  (ngModelChange)="onFixedValueChanged($event)"
606
643
  />
@@ -611,6 +648,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
611
648
  <input
612
649
  type="date"
613
650
  class="field-input"
651
+ (wheel)="$any($event.target).blur()"
614
652
  [ngModel]="currentValue()"
615
653
  (ngModelChange)="onFixedValueChanged($event)"
616
654
  />
@@ -618,19 +656,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
618
656
  }
619
657
  @default {
620
658
  <div class="input-wrap">
621
- <input
622
- type="text"
623
- class="field-input"
624
- placeholder="Enter value (e.g. 101, text, code)"
625
- [ngModel]="currentValue()"
626
- (ngModelChange)="onFixedValueChanged($event)"
627
- />
659
+ @if (isLongTextInput()) {
660
+ <textarea
661
+ rows="3"
662
+ class="field-input monospace-input textarea-input"
663
+ placeholder="Enter SQL column names or expression..."
664
+ [ngModel]="currentValue()"
665
+ (ngModelChange)="onFixedValueChanged($event)"
666
+ ></textarea>
667
+ } @else {
668
+ <input
669
+ type="text"
670
+ class="field-input monospace-input"
671
+ placeholder="Enter value (e.g. 101, text, code)"
672
+ (wheel)="$any($event.target).blur()"
673
+ [ngModel]="currentValue()"
674
+ (ngModelChange)="onFixedValueChanged($event)"
675
+ />
676
+ }
628
677
  </div>
629
678
  }
630
679
  }
631
680
  @if (paramQuickSuggestions().length > 0) {
632
681
  <div class="quick-chips-row">
633
- <span class="chips-label">Quick:</span>
682
+ <span class="chips-label">Suggestions:</span>
634
683
  @for (chip of paramQuickSuggestions(); track chip.value) {
635
684
  <button
636
685
  type="button"
@@ -683,6 +732,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
683
732
  <div class="param-desc">{{ param().description }}</div>
684
733
  }
685
734
  </div>
686
- `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".param-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 3px #00000008;box-sizing:border-box;width:100%;min-width:0;transition:all .12s ease}.param-card:hover{border-color:#94a3b8}.param-card.session-bound{background:#f0fdf4;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:6px;width:100%}.param-label{font-size:.775rem;font-weight:700;color:#0f172a;white-space:nowrap}.param-tech-badge{font-size:.65rem;font-family:monospace;padding:1px 6px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.param-type-badge{font-size:.65rem;padding:1px 6px;border-radius:4px;background:#f1f5f9;color:#475569;text-transform:capitalize}.session-auto-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0}.required-warn-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.binding-mode-tabs{display:flex;flex-wrap:wrap;width:100%;background:#f1f5f9;border-radius:6px;padding:3px;gap:3px;box-sizing:border-box}.mode-btn{flex:1 1 70px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;font-size:.69rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#fff9}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:8px;width:100%;min-width:0;box-sizing:border-box}.linker-icon{color:#2563eb;flex-shrink:0}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #bfdbfe;border-radius:6px;background-color:#eff6ff;font-weight:500;color:#1e40af;padding:6px 10px;font-size:.75rem}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:4px}.chips-label{font-size:.65rem;font-weight:600;color:#64748b;margin-right:2px}.chip-btn{font-size:.65rem;font-weight:500;padding:2px 7px;border-radius:4px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;cursor:pointer;transition:all .12s ease}.chip-btn:hover{background:#e2e8f0;color:#0f172a;border-color:#94a3b8}.chip-btn.active{background:#dbeafe;color:#1e40af;border-color:#60a5fa;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.mode-switch-hint{font-size:.68rem;color:#64748b;margin-top:1px;display:flex;align-items:center;gap:5px;flex-wrap:wrap}.btn-text-switch{background:none;border:none;padding:0;color:#2563eb;font-weight:600;cursor:pointer;text-decoration:underline;font-size:.68rem}.btn-text-switch:hover{color:#1d4ed8}.session-box{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;background:#fff;border:1px solid #bbf7d0;border-radius:6px;padding:6px 10px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.72rem;color:#166534;min-width:0}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.7rem;color:#15803d;background:#dcfce7;padding:2px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:monospace;font-size:.72rem}.param-desc{font-size:.675rem;color:#64748b;line-height:1.35}\n"] }]
735
+ `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button,.field-input[type=number]::-webkit-inner-spin-button,.field-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number],.field-input[type=number]{-moz-appearance:textfield;appearance:textfield}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", "input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}.param-card{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:8px 10px;display:flex;flex-direction:column;gap:7px;box-shadow:0 1px 2px #0f172a0a;box-sizing:border-box;width:100%;min-width:0;transition:border-color .15s ease,box-shadow .15s ease}.param-card:hover{border-color:#cbd5e1;box-shadow:0 2px 6px -1px #0f172a12}.param-card:focus-within{border-color:#93c5fd;box-shadow:0 0 0 1px #93c5fd,0 2px 6px -1px #2563eb14}.param-card.session-bound{background:#fcfdfa;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:space-between;gap:6px;width:100%;min-width:0}.param-title-left{display:flex;align-items:center;gap:5px;min-width:0;overflow:hidden}.param-label{font-size:.75rem;font-weight:700;color:#0f172a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.param-tech-badge{font-size:.625rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;padding:1px 5px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #dbeafe;white-space:nowrap}.param-title-right{display:flex;align-items:center;gap:4px;flex-shrink:0}.param-type-badge{font-size:.6rem;font-weight:500;padding:1px 5px;border-radius:4px;background:#f8fafc;color:#64748b;border:1px solid #e2e8f0;text-transform:capitalize;white-space:nowrap}.session-auto-badge{font-size:.6rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0;white-space:nowrap}.required-warn-badge{font-size:.6rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca;white-space:nowrap}.binding-mode-tabs{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;width:100%;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:2px;gap:2px;box-sizing:border-box;height:26px}.mode-btn{flex:1 1 0px;min-width:0;height:20px;display:inline-flex;align-items:center;justify-content:center;gap:3px;padding:0 4px;font-size:.65rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap;-webkit-user-select:none;user-select:none}.mode-btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#ffffffb3}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:5px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:6px;width:100%;min-width:0;box-sizing:border-box;position:relative}.linker-icon{color:#2563eb;position:absolute;left:8px;pointer-events:none;z-index:1}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:6px;background-color:#f8fafc;font-size:.75rem;color:#0f172a;padding:5px 8px 5px 26px!important;height:30px;transition:all .12s ease}.linker-select:focus{background-color:#fff;border-color:#2563eb;box-shadow:0 0 0 3px #2563eb26}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:2px}.chips-label{font-size:.6rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.02em}.chip-btn{font-size:.625rem;font-weight:500;padding:2px 8px;border-radius:9999px;background:#f8fafc;color:#334155;border:1px solid #e2e8f0;cursor:pointer;transition:all .12s ease;line-height:1.2}.chip-btn:hover{background:#eff6ff;color:#1d4ed8;border-color:#bfdbfe}.chip-btn.active{background:#2563eb;color:#fff;border-color:#2563eb;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.field-input,.field-select{width:100%;box-sizing:border-box;height:30px;padding:5px 8px;font-size:.75rem;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#0f172a;outline:none;transition:border-color .12s ease,box-shadow .12s ease}.field-input:focus,.field-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1f}.textarea-input{height:auto;min-height:56px;resize:vertical;line-height:1.35;font-size:.72rem;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.session-box{display:flex;align-items:center;justify-content:space-between;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;padding:5px 8px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.7rem;color:#166534;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.65rem;color:#15803d;background:#dcfce7;padding:1px 6px;border-radius:4px;white-space:nowrap}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem}.param-desc{font-size:.65rem;color:#64748b;line-height:1.35}\n"] }]
687
736
  }] });
688
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3BhcmFtZXRlci1iaW5kaW5nLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7QUE0Z0I3RixNQUFNLE9BQU8sK0JBQStCO0lBQ3pCLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUU3RCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBOEIsQ0FBQztJQUNyRCxZQUFZLEdBQUcsS0FBSyxDQUE0QixFQUFFLENBQUMsQ0FBQztJQUNwRCxhQUFhLEdBQUcsS0FBSyxDQUE4QixFQUFFLENBQUMsQ0FBQztJQUN2RCxrQkFBa0IsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkMsY0FBYyxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV2QyxXQUFXLEdBQUcsTUFBTSxFQUE2QixDQUFDO0lBQ2xELGlCQUFpQixH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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ09UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgUGFyYW1ldGVyQmluZGluZ01vZGUgPSAnc2Vzc2lvbicgfCAnY29udHJvbCcgfCAnZml4ZWQnIHwgJ2NvbnRleHQnIHwgJ2N1c3RvbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wYXJhbWV0ZXItYmluZGluZy1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1jYXJkXCIgW2NsYXNzLnNlc3Npb24tYm91bmRdPVwiaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKVwiPlxuICAgICAgPCEtLSBDYXJkIEhlYWRlcjogVGl0bGUsIFRlY2huaWNhbCBOYW1lLCBUeXBlLCBhbmQgQmFkZ2VzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tdGl0bGUtd3JhcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tbGFiZWxcIiBbdGl0bGVdPVwicGFyYW0oKS5uYW1lXCI+e3sgZnJpZW5kbHlMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tdGVjaC1iYWRnZVwiPnt7IHBhcmFtKCkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtLXR5cGUtYmFkZ2VcIj57eyBkaXNwbGF5VHlwZSgpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWF1dG8tYmFkZ2VcIj5BdXRvIFNlc3Npb248L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSBpZiAocGFyYW0oKS5yZXF1aXJlZCAmJiAhaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC13YXJuLWJhZGdlXCI+UmVxdWlyZWQ8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJpbmRpbmcgTW9kZSBTZWdtZW50ZWQgU2VsZWN0b3IgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaW5kaW5nLW1vZGUtdGFic1wiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgQGlmIChzZXNzaW9uTWF0Y2goKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbidcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnc2Vzc2lvbicpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJCb3VuZCB0byBzZXNzaW9uIHVzZXIvYnJhbmNoIGNvbnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlNlc3Npb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnY29udHJvbCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2NvbnRyb2wnKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkxpbmsgdmFsdWUgdG8gYSBmb3JtIGZpZWxkIG9uIGNhbnZhcyAoZS5nLiBEcm9wZG93biwgRGF0ZVBpY2tlcilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlua1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkZvcm0gRmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnZml4ZWQnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdmaXhlZCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVHlwZSBhIG1hbnVhbCBvciBmaXhlZCB2YWx1ZSAoZS5nLiAxLCAwLCAxMDEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5GaXhlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjb250ZXh0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY29udGV4dCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVXNlIHN5c3RlbSBkYXRlIHByZXNldHMgKGUuZy4gVG9kYXksIE1vbnRoIFN0YXJ0KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjbG9ja1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlByZXNldDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGlzQWR2YW5jZWRNb2RlKCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZU1vZGUoKSA9PT0gJ2N1c3RvbSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY3VzdG9tJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIk1hbnVhbCB0ZW1wbGF0ZSBleHByZXNzaW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5FeHByPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGUtc3BlY2lmaWMgSW5wdXQgQ29udHJvbHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tYm9keVwiPlxuICAgICAgICA8IS0tIDAuIEFVVE8gU0VTU0lPTiBERVJJVkVEIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ3Nlc3Npb24nICYmIHNlc3Npb25NYXRjaCgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1ib3gtdGV4dFwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwic2Vzc2lvbi1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgRGVyaXZlZCBmcm9tIDxzdHJvbmc+e3sgc2Vzc2lvbk1hdGNoKCk/LnNlc3Npb25LZXkgfX08L3N0cm9uZz4gKHt7IHNlc3Npb25NYXRjaCgpPy5mcmllbmRseUxhYmVsIH19KVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWJveC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXZhbC10YWdcIj5cbiAgICAgICAgICAgICAgICBDdXJyZW50OiA8c3Ryb25nPnt7IHNlc3Npb25NYXRjaCgpPy52YWx1ZSA/PyAnKG5vbmUpJyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNlc3Npb24tb3ZlcnJpZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdmaXhlZCcpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIk92ZXJyaWRlIHdpdGggbWFudWFsIHZhbHVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE92ZXJyaWRlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDEuIEZPUk0gQ09OVFJPTCBMSU5LRVIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY29udHJvbCcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlua2VyLXJvd1wiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJsaW5rXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImxpbmtlci1pY29uXCIgLz5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zZWxlY3QgbGlua2VyLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQ29udHJvbEtleSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250cm9sU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBDaG9vc2UgRm9ybSBGaWVsZCBvbiBDYW52YXMgLS08L29wdGlvbj5cbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgY29tcGF0aWJsZUNvbnRyb2xzKCk7IHRyYWNrIGZpZWxkLmtleSB8fCBmaWVsZC5pZCkge1xuICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImZpZWxkLmtleSB8fCBmaWVsZC5pZFwiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQua2V5IH19ICh7eyBmaWVsZC50eXBlIH19KVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKCFzZWxlY3RlZENvbnRyb2xLZXkoKSAmJiBjb21wYXRpYmxlQ29udHJvbHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1oaW50XCI+Tm8gaW5wdXQgZmllbGRzIG9uIGNhbnZhcy4gQWRkIGEgZHJvcGRvd24sIGRhdGUgcGlja2VyLCBvciBpbnB1dCBmaXJzdC48L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDIuIEVOVEVSIEZJWEVEIFZBTFVFIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ2ZpeGVkJykge1xuICAgICAgICAgIEBzd2l0Y2ggKHBhcmFtKCkuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIEBjYXNlICgnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImJvb2xlYW5GaXhlZFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Cb29sZWFuQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj57eyBib29sZWFuRml4ZWRWYWx1ZSgpID8gJ0FjdGl2ZSAvIFllcyAoMSknIDogJ0luYWN0aXZlIC8gTm8gKDApJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbnVtYmVyIChlLmcuIDEsIDAsIDExKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHZhbHVlIChlLmcuIDEwMSwgdGV4dCwgY29kZSlcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaXhlZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChwYXJhbVF1aWNrU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stY2hpcHMtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcHMtbGFiZWxcIj5RdWljazo8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGNoaXAgb2YgcGFyYW1RdWlja1N1Z2dlc3Rpb25zKCk7IHRyYWNrIGNoaXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcC1idG5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0N1cnJlbnRWYWx1ZShjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaXhlZFZhbHVlQ2hhbmdlZChjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgY2hpcC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDMuIFNZU1RFTSBEQVRFIFBSRVNFVFMgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY29udGV4dCcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQ29udGV4dEtleSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250ZXh0U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBDaG9vc2UgRGF0ZSAvIENvbnRleHQgUHJlc2V0IC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC50b2RheXt7ICd9fScgfX1cIj5Ub2RheSdzIERhdGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ICd7eycgfX1jb250ZXh0LnN0YXJ0T2ZNb250aHt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBNb250aDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3sgJ3t7JyB9fWNvbnRleHQuZW5kT2ZNb250aHt7ICd9fScgfX1cIj5MYXN0IERheSBvZiBDdXJyZW50IE1vbnRoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5zdGFydE9mWWVhcnt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBZZWFyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC55ZXN0ZXJkYXl7eyAnfX0nIH19XCI+WWVzdGVyZGF5PC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5icmFuY2hJZHt7ICd9fScgfX1cIj5DdXJyZW50IFVzZXIgQnJhbmNoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC51c2VySWR7eyAnfX0nIH19XCI+Q3VycmVudCBVc2VyIElEPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gNC4gQ1VTVE9NIEVYUFJFU1NJT04gLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY3VzdG9tJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG1vbm9zcGFjZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiB7eyAne3snIH19Zm9ybS5kcm9wZG93bkZpZWxkID8/IDF7eyAnfX0nIH19XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAocGFyYW0oKS5kZXNjcmlwdGlvbiAmJiBpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1kZXNjXCI+e3sgcGFyYW0oKS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnBhcmFtLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkOmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzk0YTNiODtcbiAgICB9XG4gICAgLnBhcmFtLWNhcmQuc2Vzc2lvbi1ib3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmJmN2QwO1xuICAgIH1cbiAgICAucGFyYW0taGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5wYXJhbS10aXRsZS13cmFwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnBhcmFtLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAucGFyYW0tdGVjaC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgcGFkZGluZzogMXB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgfVxuICAgIC5wYXJhbS10eXBlLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICB9XG4gICAgLnNlc3Npb24tYXV0by1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJmN2QwO1xuICAgIH1cbiAgICAucmVxdWlyZWQtd2Fybi1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgY29sb3I6ICNiOTFjMWM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgIH1cbiAgICAuYmluZGluZy1tb2RlLXRhYnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGdhcDogM3B4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLm1vZGUtYnRuIHtcbiAgICAgIGZsZXg6IDEgMSA3MHB4O1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIHBhZGRpbmc6IDVweCA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNjlyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLm1vZGUtYnRuOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpO1xuICAgIH1cbiAgICAubW9kZS1idG4uYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICAgIH1cbiAgICAucGFyYW0tYm9keSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGlua2VyLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGlua2VyLWljb24ge1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmxpbmtlci1zZWxlY3Qge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZmNmZmO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMWU0MGFmO1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgfVxuICAgIC5xdWljay1jaGlwcy1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmNoaXBzLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIH1cbiAgICAuY2hpcC1idG4ge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIHBhZGRpbmc6IDJweCA3cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5jaGlwLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuICAgIC5jaGlwLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTtcbiAgICAgIGNvbG9yOiAjMWU0MGFmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjNjBhNWZhO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgLmlucHV0LXdyYXAge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubW9kZS1zd2l0Y2gtaGludCB7XG4gICAgICBmb250LXNpemU6IDAuNjhyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuICAgIC5idG4tdGV4dC1zd2l0Y2gge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgIGZvbnQtc2l6ZTogMC42OHJlbTtcbiAgICB9XG4gICAgLmJ0bi10ZXh0LXN3aXRjaDpob3ZlciB7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1ib3gtdGV4dCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgY29sb3I6ICMxNjY1MzQ7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgfVxuICAgIC5zZXNzaW9uLWljb24ge1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94LWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuc2Vzc2lvbi12YWwtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmJ0bi1zZXNzaW9uLW92ZXJyaWRlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjODZlZmFjO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLXNlc3Npb24tb3ZlcnJpZGU6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICB9XG4gICAgLmVtcHR5LWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjY4cmVtO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgfVxuICAgIC50b2dnbGUtc3dpdGNoIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAubW9ub3NwYWNlLWlucHV0IHtcbiAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgfVxuICAgIC5wYXJhbS1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM1O1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckJpbmRpbmdFZGl0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcGFyYW0gPSBpbnB1dC5yZXF1aXJlZDxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YT4oKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gaW5wdXQ8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4oJycpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gaW5wdXQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRDb21wb25lbnRJZCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc0FkdmFuY2VkTW9kZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG91dHB1dDxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPigpO1xuICByZWFkb25seSBsaW5rZWRGaWVsZENoYW5nZSA9IG91dHB1dDx7IHBhcmFtTmFtZTogc3RyaW5nOyBmaWVsZEtleTogc3RyaW5nOyBpc0xpbmtlZDogYm9vbGVhbiB9PigpO1xuXG4gIHJlYWRvbmx5IGludGVybmFsTW9kZSA9IHNpZ25hbDxQYXJhbWV0ZXJCaW5kaW5nTW9kZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlc3Npb25NYXRjaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2Vzc2lvblNlcnZpY2UubWF0Y2hQYXJhbWV0ZXIodGhpcy5wYXJhbSgpLm5hbWUpKTtcblxuICByZWFkb25seSBmcmllbmRseUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtKCkuZnJpZW5kbHlMYWJlbCB8fCBodW1hbml6ZUlkZW50aWZpZXIodGhpcy5wYXJhbSgpLm5hbWUpO1xuICB9KTtcblxuICByZWFkb25seSBkaXNwbGF5VHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMucGFyYW0oKS5kYXRhVHlwZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAnWWVzIC8gTm8nO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdOdW1iZXInO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNDdXJyZW50VmFsdWUgPSAodmFsOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkpID09PSBTdHJpbmcodmFsKTtcbiAgfTtcblxuICByZWFkb25seSBwYXJhbVF1aWNrU3VnZ2VzdGlvbnMgPSBjb21wdXRlZDx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdPigoKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgaWYgKG5hbWUgPT09ICdpbnR0cmFub3JkdWVkYXRlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IFRyYW5zYWN0aW9uIERhdGUnLCB2YWx1ZTogMCB9LFxuICAgICAgICB7IGxhYmVsOiAnMTogRHVlIERhdGUnLCB2YWx1ZTogMSB9LFxuICAgICAgICB7IGxhYmVsOiAnMjogR0lSIERhdGUnLCB2YWx1ZTogMiB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdpbnRvbmx5ZHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IEFsbCBCaWxscycsIHZhbHVlOiAwIH0sXG4gICAgICAgIHsgbGFiZWw6ICcxOiBPbmx5IER1ZSBCaWxscycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHZhbHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzExOiBDdXN0b21lciBMZWRnZXInLCB2YWx1ZTogMTEgfSxcbiAgICAgICAgeyBsYWJlbDogJzEyOiBTdXBwbGllciBMZWRnZXInLCB2YWx1ZTogMTIgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnY2hyY29tcGFueWlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogRGVmYXVsdCBDbycsIHZhbHVlOiAnMTAxJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJjb21wdW5pdGlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogVW5pdCAxMDEnLCB2YWx1ZTogJzEwMScgfSxcbiAgICAgICAgeyBsYWJlbDogJzEwMSwxMDIsMTAzOiBBbGwgVW5pdHMnLCB2YWx1ZTogJzEwMSwxMDIsMTAzJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJzdWJhY25vbGlzdCcpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsgbGFiZWw6ICcwOiBBbGwgQWNjb3VudHMnLCB2YWx1ZTogJzAnIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHdpdGhjaXR5Jykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IE5vJywgdmFsdWU6IDAgfSxcbiAgICAgICAgeyBsYWJlbDogJzE6IFllcycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNvbXBhdGlibGVDb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxDb21wb25lbnRzKCkuZmlsdGVyKChjKSA9PiBjLmlkICE9PSB0aGlzLmN1cnJlbnRDb21wb25lbnRJZCgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVNb2RlID0gY29tcHV0ZWQ8UGFyYW1ldGVyQmluZGluZ01vZGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pbnRlcm5hbE1vZGUoKSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxNb2RlKCkhO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbCA9IFN0cmluZyh0aGlzLmN1cnJlbnRWYWx1ZSgpID8/ICcnKTtcblxuICAgIC8vIElmIG1hdGNoZXMgc2Vzc2lvbiBjb250ZXh0IGFuZCBoYXMgbm8gZXhwbGljaXQgbWFudWFsIG92ZXJyaWRlLCBkZWZhdWx0IHRvIHNlc3Npb25cbiAgICBpZiAodGhpcy5zZXNzaW9uTWF0Y2goKSAhPT0gbnVsbCAmJiAoIXZhbCB8fCB2YWwuc3RhcnRzV2l0aCgne3tzZXNzaW9uLicpKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7Y29udGV4dC4nKSkge1xuICAgICAgcmV0dXJuICdjb250ZXh0JztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7c2Vzc2lvbi4nKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7JykgJiYgdmFsLmVuZHNXaXRoKCd9fScpKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmNvbXBhdGlibGVDb250cm9scygpLmZpbmQoKGMpID0+IChjLmtleSB8fCBjLmlkKSA9PT0gaW5uZXIpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2N1c3RvbSc7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5NYXRjaCA9IHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkuZmluZCgoYykgPT4gKGMua2V5IHx8IGMuaWQpID09PSB2YWwpO1xuICAgIGlmIChwbGFpbk1hdGNoKSB7XG4gICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgIH1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICAvLyBTbWFydCBkZWZhdWx0OiBudW1lcmljIG9yIGZsYWcgcGFyYW1ldGVycyBkZWZhdWx0IHRvICdmaXhlZCcgKEVudGVyIFZhbHVlKVxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyYW0oKS5kYXRhVHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgbmFtZS5zdGFydHNXaXRoKCdpbnQnKSB8fFxuICAgICAgICBuYW1lLmluY2x1ZGVzKCdmbGFnJykgfHxcbiAgICAgICAgbmFtZS5pbmNsdWRlcygndHlwZScpIHx8XG4gICAgICAgIG5hbWUuaW5jbHVkZXMoJ29ubHknKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGNvbXBhdGlibGUgZm9ybSBmaWVsZHMgb24gY2FudmFzLCBkZWZhdWx0IHRvIGNvbnRyb2wsIG90aGVyd2lzZSBmaXhlZFxuICAgICAgcmV0dXJuIHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkubGVuZ3RoID4gMCA/ICdjb250cm9sJyA6ICdmaXhlZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmaXhlZCc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzQXV0b1Nlc3Npb25EZXJpdmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25NYXRjaCgpICE9PSBudWxsICYmIHRoaXMuYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbic7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29udHJvbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUoKSA/PyAnJyk7XG4gICAgaWYgKHZhbC5zdGFydHNXaXRoKCd7eycpICYmIHZhbC5lbmRzV2l0aCgnfX0nKSkge1xuICAgICAgcmV0dXJuIHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZENvbnRleHRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkgPz8gJycpO1xuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tjb250ZXh0LicpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJvb2xlYW5GaXhlZFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1cnJlbnRWYWx1ZSgpO1xuICAgIHJldHVybiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyB8fCB2ID09PSAxIHx8IHYgPT09ICcxJztcbiAgfSk7XG5cbiAgc2V0TW9kZShtb2RlOiBQYXJhbWV0ZXJCaW5kaW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxNb2RlLnNldChtb2RlKTtcbiAgICBpZiAobW9kZSA9PT0gJ3Nlc3Npb24nKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuc2Vzc2lvbk1hdGNoKCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGB7e3Nlc3Npb24uJHttYXRjaC5zZXNzaW9uS2V5fX19YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleTogJycsXG4gICAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ2ZpeGVkJykge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gJycgJiYgIVN0cmluZyhjdXJyZW50KS5zdGFydHNXaXRoKCd7eycpKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjdXJyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJhbSgpLmRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5wYXJhbSgpLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbih0aGlzLnBhcmFtKCkuZGVmYXVsdFZhbHVlKSA6IHRydWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkZWYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhcmFtKCkuZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMucGFyYW0oKS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IE51bWJlcih0aGlzLnBhcmFtKCkuZGVmYXVsdFZhbHVlKSA6IDA7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Db250cm9sU2VsZWN0ZWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBleHByID0gYHt7JHtrZXl9fX1gO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGV4cHIpO1xuICAgICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgICAgZmllbGRLZXk6IGtleSxcbiAgICAgICAgaXNMaW5rZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCcnKTtcbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Cb29sZWFuQ2hhbmdlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgb25GaXhlZFZhbHVlQ2hhbmdlZCh2YWw6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICBmaWVsZEtleTogJycsXG4gICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBvbkNvbnRleHRTZWxlY3RlZChjdHhLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjdHhLZXkpO1xuICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
737
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3BhcmFtZXRlci1iaW5kaW5nLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7QUErbEJ2RixNQUFNLE9BQU8sK0JBQStCO0lBQ3pCLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUU3RCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBOEIsQ0FBQztJQUNyRCxZQUFZLEdBQUcsS0FBSyxDQUE0QixFQUFFLENBQUMsQ0FBQztJQUNwRCxhQUFhLEdBQUcsS0FBSyxDQUE4QixFQUFFLENBQUMsQ0FBQztJQUN2RCxrQkFBa0IsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkMsY0FBYyxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJ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Qzt3R0F0UVUsK0JBQStCOzRGQUEvQiwrQkFBK0IsMjNCQXJsQmhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtUFQsMHdRQXRQUyxZQUFZLDhCQUFFLFdBQVcsNjFDQUFFLGdCQUFnQjs7NEZBd2xCMUMsK0JBQStCO2tCQTNsQjNDLFNBQVM7K0JBQ0UsOEJBQThCLGNBQzVCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsbUJBQ3JDLHVCQUF1QixDQUFDLE1BQU0sWUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1QVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9zY2hlbWEtZGlzY292ZXJ5LmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IGh1bWFuaXplSWRlbnRpZmllciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvaWRlbnRpZmllci1odW1hbml6ZXInO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzYW5pdGl6ZVNxbFBhcmFtTGl0ZXJhbCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcblxuZXhwb3J0IHR5cGUgUGFyYW1ldGVyQmluZGluZ01vZGUgPSAnc2Vzc2lvbicgfCAnY29udHJvbCcgfCAnZml4ZWQnIHwgJ2NvbnRleHQnIHwgJ2N1c3RvbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wYXJhbWV0ZXItYmluZGluZy1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1jYXJkXCIgW2NsYXNzLnNlc3Npb24tYm91bmRdPVwiaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKVwiPlxuICAgICAgPCEtLSBDYXJkIEhlYWRlcjogVGl0bGUsIFRlY2huaWNhbCBOYW1lLCBUeXBlLCBhbmQgQmFkZ2VzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tdGl0bGUtd3JhcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbS10aXRsZS1sZWZ0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtLWxhYmVsXCIgW3RpdGxlXT1cInBhcmFtKCkubmFtZVwiPnt7IGZyaWVuZGx5TGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tdGVjaC1iYWRnZVwiPnt7IHBhcmFtKCkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tdGl0bGUtcmlnaHRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tdHlwZS1iYWRnZVwiPnt7IGRpc3BsYXlUeXBlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGlzQXV0b1Nlc3Npb25EZXJpdmVkKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWF1dG8tYmFkZ2VcIj5BdXRvIFNlc3Npb248L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChwYXJhbSgpLnJlcXVpcmVkICYmICFoYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtd2Fybi1iYWRnZVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJpbmRpbmcgTW9kZSBTZWdtZW50ZWQgU2VsZWN0b3IgKFVsdHJhLWNvbXBhY3QsIHNpbmdsZSBob3Jpem9udGFsIHRyYWNrKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbmRpbmctbW9kZS10YWJzXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgICBAaWYgKHNlc3Npb25NYXRjaCgpKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdzZXNzaW9uJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdzZXNzaW9uJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkJvdW5kIHRvIHNlc3Npb24gdXNlci9icmFuY2ggY29udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidXNlclwiIFtzaXplXT1cIjEwXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+U2Vzc2lvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjb250cm9sJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY29udHJvbCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiTGluayB2YWx1ZSB0byBhIGNhbnZhcyBmb3JtIGZpZWxkIChlLmcuIERyb3Bkb3duLCBEYXRlUGlja2VyKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJsaW5rXCIgW3NpemVdPVwiMTBcIiAvPlxuICAgICAgICAgICAgPHNwYW4+RmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnZml4ZWQnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdmaXhlZCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVHlwZSBhIG1hbnVhbCBvciBmaXhlZCB2YWx1ZSAoZS5nLiAxMDEsICdBRE1JTicpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxMFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5GaXhlZDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjb250ZXh0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY29udGV4dCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVXNlIHN5c3RlbSBkYXRlIHByZXNldHMgKFRvZGF5LCBNb250aCBTdGFydCwgZXRjLilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvY2tcIiBbc2l6ZV09XCIxMFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5QcmVzZXQ8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgQGlmIChpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjdXN0b20nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2N1c3RvbScpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJNYW51YWwgdGVtcGxhdGUgZXhwcmVzc2lvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEwXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+RXhwcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNb2RlLXNwZWNpZmljIElucHV0IENvbnRyb2xzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWJvZHlcIj5cbiAgICAgICAgPCEtLSAwLiBBVVRPIFNFU1NJT04gREVSSVZFRCAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVNb2RlKCkgPT09ICdzZXNzaW9uJyAmJiBzZXNzaW9uTWF0Y2goKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tYm94LXRleHRcIj5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ1c2VyXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cInNlc3Npb24taWNvblwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIERlcml2ZWQgZnJvbSA8c3Ryb25nPnt7IHNlc3Npb25NYXRjaCgpPy5zZXNzaW9uS2V5IH19PC9zdHJvbmc+ICh7eyBzZXNzaW9uTWF0Y2goKT8uZnJpZW5kbHlMYWJlbCB9fSlcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1ib3gtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi12YWwtdGFnXCI+XG4gICAgICAgICAgICAgICAgQ3VycmVudDogPHN0cm9uZz57eyBzZXNzaW9uTWF0Y2goKT8udmFsdWUgPz8gJyhub25lKScgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1zZXNzaW9uLW92ZXJyaWRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnZml4ZWQnKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJPdmVycmlkZSB3aXRoIG1hbnVhbCB2YWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBPdmVycmlkZVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAxLiBGT1JNIENPTlRST0wgTElOS0VSIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmtlci1yb3dcIj5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlua1wiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJsaW5rZXItaWNvblwiIC8+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0IGxpbmtlci1zZWxlY3RcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZENvbnRyb2xLZXkoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ29udHJvbFNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gQ2hvb3NlIEZvcm0gRmllbGQgb24gQ2FudmFzIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGNvbXBhdGlibGVDb250cm9scygpOyB0cmFjayBmaWVsZC5rZXkgfHwgZmllbGQuaWQpIHtcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmaWVsZC5rZXkgfHwgZmllbGQuaWRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmtleSB9fSAoe3sgZmllbGQudHlwZSB9fSlcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICghc2VsZWN0ZWRDb250cm9sS2V5KCkgJiYgY29tcGF0aWJsZUNvbnRyb2xzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaGludFwiPk5vIGlucHV0IGZpZWxkcyBvbiBjYW52YXMuIEFkZCBhIGRyb3Bkb3duLCBkYXRlIHBpY2tlciwgb3IgaW5wdXQgZmlyc3QuPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBFTlRFUiBGSVhFRCBWQUxVRSAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVNb2RlKCkgPT09ICdmaXhlZCcpIHtcbiAgICAgICAgICBAc3dpdGNoIChwYXJhbSgpLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRvZ2dsZS1zd2l0Y2hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJib29sZWFuRml4ZWRWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQm9vbGVhbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS10ZXh0XCI+e3sgYm9vbGVhbkZpeGVkVmFsdWUoKSA/ICdBY3RpdmUgLyBZZXMgKDEpJyA6ICdJbmFjdGl2ZSAvIE5vICgwKScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dCBtb25vc3BhY2UtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBudW1iZXIgKGUuZy4gMSwgMCwgMTEpXCJcbiAgICAgICAgICAgICAgICAgICh3aGVlbCk9XCIkYW55KCRldmVudC50YXJnZXQpLmJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5hcnJvd3VwKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93ZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAod2hlZWwpPVwiJGFueSgkZXZlbnQudGFyZ2V0KS5ibHVyKClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaXhlZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzTG9uZ1RleHRJbnB1dCgpKSB7XG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG1vbm9zcGFjZS1pbnB1dCB0ZXh0YXJlYS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgU1FMIGNvbHVtbiBuYW1lcyBvciBleHByZXNzaW9uLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG1vbm9zcGFjZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdmFsdWUgKGUuZy4gMTAxLCB0ZXh0LCBjb2RlKVwiXG4gICAgICAgICAgICAgICAgICAgICh3aGVlbCk9XCIkYW55KCRldmVudC50YXJnZXQpLmJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImN1cnJlbnRWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaXhlZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChwYXJhbVF1aWNrU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stY2hpcHMtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcHMtbGFiZWxcIj5TdWdnZXN0aW9uczo8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGNoaXAgb2YgcGFyYW1RdWlja1N1Z2dlc3Rpb25zKCk7IHRyYWNrIGNoaXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcC1idG5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0N1cnJlbnRWYWx1ZShjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaXhlZFZhbHVlQ2hhbmdlZChjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgY2hpcC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDMuIFNZU1RFTSBEQVRFIFBSRVNFVFMgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY29udGV4dCcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQ29udGV4dEtleSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250ZXh0U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBDaG9vc2UgRGF0ZSAvIENvbnRleHQgUHJlc2V0IC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC50b2RheXt7ICd9fScgfX1cIj5Ub2RheSdzIERhdGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ICd7eycgfX1jb250ZXh0LnN0YXJ0T2ZNb250aHt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBNb250aDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3sgJ3t7JyB9fWNvbnRleHQuZW5kT2ZNb250aHt7ICd9fScgfX1cIj5MYXN0IERheSBvZiBDdXJyZW50IE1vbnRoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5zdGFydE9mWWVhcnt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBZZWFyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC55ZXN0ZXJkYXl7eyAnfX0nIH19XCI+WWVzdGVyZGF5PC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5icmFuY2hJZHt7ICd9fScgfX1cIj5DdXJyZW50IFVzZXIgQnJhbmNoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC51c2VySWR7eyAnfX0nIH19XCI+Q3VycmVudCBVc2VyIElEPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gNC4gQ1VTVE9NIEVYUFJFU1NJT04gLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY3VzdG9tJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG1vbm9zcGFjZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiB7eyAne3snIH19Zm9ybS5kcm9wZG93bkZpZWxkID8/IDF7eyAnfX0nIH19XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAocGFyYW0oKS5kZXNjcmlwdGlvbiAmJiBpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1kZXNjXCI+e3sgcGFyYW0oKS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgaW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAgIGlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9bnVtYmVyXSB7XG4gICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgICAgIGFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgICB9XG4gICAgLnBhcmFtLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA3cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgxNSwgMjMsIDQyLCAwLjA0KTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAxNTBtcyBlYXNlLCBib3gtc2hhZG93IDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkOmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDZweCAtMXB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wNyk7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkOmZvY3VzLXdpdGhpbiB7XG4gICAgICBib3JkZXItY29sb3I6ICM5M2M1ZmQ7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzkzYzVmZCwgMCAycHggNnB4IC0xcHggcmdiYSgzNywgOTksIDIzNSwgMC4wOCk7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkLnNlc3Npb24tYm91bmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZjZmRmYTtcbiAgICAgIGJvcmRlci1jb2xvcjogI2JiZjdkMDtcbiAgICB9XG4gICAgLnBhcmFtLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAucGFyYW0tdGl0bGUtd3JhcCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgfVxuICAgIC5wYXJhbS10aXRsZS1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAucGFyYW0tbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB9XG4gICAgLnBhcmFtLXRlY2gtYmFkZ2Uge1xuICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTtcbiAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgbW9ub3NwYWNlO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkYmVhZmU7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAucGFyYW0tdGl0bGUtcmlnaHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAucGFyYW0tdHlwZS1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLnNlc3Npb24tYXV0by1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIGNvbG9yOiAjMTU4MDNkO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JiZjdkMDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuICAgIC5yZXF1aXJlZC13YXJuLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgY29sb3I6ICNiOTFjMWM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLmJpbmRpbmctbW9kZS10YWJzIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgIGdhcDogMnB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICB9XG4gICAgLm1vZGUtYnRuIHtcbiAgICAgIGZsZXg6IDEgMSAwcHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogM3B4O1xuICAgICAgcGFkZGluZzogMCA0cHg7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICAubW9kZS1idG4gc3BhbiB7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAubW9kZS1idG46aG92ZXIge1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgfVxuICAgIC5tb2RlLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgfVxuICAgIC5wYXJhbS1ib2R5IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5saW5rZXItcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC5saW5rZXItaWNvbiB7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGxlZnQ6IDhweDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgei1pbmRleDogMTtcbiAgICB9XG4gICAgLmxpbmtlci1zZWxlY3Qge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmYWZjO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBwYWRkaW5nOiA1cHggOHB4IDVweCAyNnB4ICFpbXBvcnRhbnQ7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLmxpbmtlci1zZWxlY3Q6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE1KTtcbiAgICB9XG4gICAgLnF1aWNrLWNoaXBzLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgIH1cbiAgICAuY2hpcHMtbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjZyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgICB9XG4gICAgLmNoaXAtYnRuIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgfVxuICAgIC5jaGlwLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBib3JkZXItY29sb3I6ICNiZmRiZmU7XG4gICAgfVxuICAgIC5jaGlwLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogIzI1NjNlYjtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMjU2M2ViO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgLmlucHV0LXdyYXAge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAuZmllbGQtaW5wdXQsIC5maWVsZC1zZWxlY3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgcGFkZGluZzogNXB4IDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsIGJveC1zaGFkb3cgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLmZpZWxkLWlucHV0OmZvY3VzLCAuZmllbGQtc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjEyKTtcbiAgICB9XG4gICAgLnRleHRhcmVhLWlucHV0IHtcbiAgICAgIGhlaWdodDogYXV0bztcbiAgICAgIG1pbi1oZWlnaHQ6IDU2cHg7XG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMzU7XG4gICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7XG4gICAgfVxuICAgIC5zZXNzaW9uLWJveCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGZkZjQ7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJmN2QwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgcGFkZGluZzogNXB4IDhweDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1ib3gtdGV4dCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogIzE2NjUzNDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuICAgIC5zZXNzaW9uLWljb24ge1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94LWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuc2Vzc2lvbi12YWwtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGNvbG9yOiAjMTU4MDNkO1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAuYnRuLXNlc3Npb24tb3ZlcnJpZGUge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NmVmYWM7XG4gICAgICBjb2xvcjogIzE1ODAzZDtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLXNlc3Npb24tb3ZlcnJpZGU6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICB9XG4gICAgLmVtcHR5LWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjY4cmVtO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgfVxuICAgIC50b2dnbGUtc3dpdGNoIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAubW9ub3NwYWNlLWlucHV0IHtcbiAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgbW9ub3NwYWNlO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgIH1cbiAgICAucGFyYW0tZGVzYyB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM1O1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckJpbmRpbmdFZGl0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcGFyYW0gPSBpbnB1dC5yZXF1aXJlZDxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YT4oKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gaW5wdXQ8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4oJycpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gaW5wdXQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRDb21wb25lbnRJZCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc0FkdmFuY2VkTW9kZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG91dHB1dDxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPigpO1xuICByZWFkb25seSBsaW5rZWRGaWVsZENoYW5nZSA9IG91dHB1dDx7IHBhcmFtTmFtZTogc3RyaW5nOyBmaWVsZEtleTogc3RyaW5nOyBpc0xpbmtlZDogYm9vbGVhbiB9PigpO1xuXG4gIHJlYWRvbmx5IGludGVybmFsTW9kZSA9IHNpZ25hbDxQYXJhbWV0ZXJCaW5kaW5nTW9kZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlc3Npb25NYXRjaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2Vzc2lvblNlcnZpY2UubWF0Y2hQYXJhbWV0ZXIodGhpcy5wYXJhbSgpLm5hbWUpKTtcblxuICByZWFkb25seSBmcmllbmRseUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtKCkuZnJpZW5kbHlMYWJlbCB8fCBodW1hbml6ZUlkZW50aWZpZXIodGhpcy5wYXJhbSgpLm5hbWUpO1xuICB9KTtcblxuICByZWFkb25seSBkaXNwbGF5VHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMucGFyYW0oKS5kYXRhVHlwZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAnWWVzIC8gTm8nO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdOdW1iZXInO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNDdXJyZW50VmFsdWUgPSAodmFsOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkpID09PSBTdHJpbmcodmFsKTtcbiAgfTtcblxuICByZWFkb25seSBwYXJhbVF1aWNrU3VnZ2VzdGlvbnMgPSBjb21wdXRlZDx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdPigoKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgaWYgKG5hbWUgPT09ICdpbnR0cmFub3JkdWVkYXRlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IFRyYW5zYWN0aW9uIERhdGUnLCB2YWx1ZTogMCB9LFxuICAgICAgICB7IGxhYmVsOiAnMTogRHVlIERhdGUnLCB2YWx1ZTogMSB9LFxuICAgICAgICB7IGxhYmVsOiAnMjogR0lSIERhdGUnLCB2YWx1ZTogMiB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdpbnRvbmx5ZHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IEFsbCBCaWxscycsIHZhbHVlOiAwIH0sXG4gICAgICAgIHsgbGFiZWw6ICcxOiBPbmx5IER1ZSBCaWxscycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHZhbHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzExOiBDdXN0b21lciBMZWRnZXInLCB2YWx1ZTogMTEgfSxcbiAgICAgICAgeyBsYWJlbDogJzEyOiBTdXBwbGllciBMZWRnZXInLCB2YWx1ZTogMTIgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnY2hyY29tcGFueWlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogRGVmYXVsdCBDbycsIHZhbHVlOiAnMTAxJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJjb21wdW5pdGlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogVW5pdCAxMDEnLCB2YWx1ZTogJzEwMScgfSxcbiAgICAgICAgeyBsYWJlbDogJzEwMSwxMDIsMTAzOiBBbGwgVW5pdHMnLCB2YWx1ZTogJzEwMSwxMDIsMTAzJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJzdWJhY25vbGlzdCcpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsgbGFiZWw6ICcwOiBBbGwgQWNjb3VudHMnLCB2YWx1ZTogJzAnIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHdpdGhjaXR5Jykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IE5vJywgdmFsdWU6IDAgfSxcbiAgICAgICAgeyBsYWJlbDogJzE6IFllcycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNvbXBhdGlibGVDb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxDb21wb25lbnRzKCkuZmlsdGVyKChjKSA9PiBjLmlkICE9PSB0aGlzLmN1cnJlbnRDb21wb25lbnRJZCgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVNb2RlID0gY29tcHV0ZWQ8UGFyYW1ldGVyQmluZGluZ01vZGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pbnRlcm5hbE1vZGUoKSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxNb2RlKCkhO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbCA9IFN0cmluZyh0aGlzLmN1cnJlbnRWYWx1ZSgpID8/ICcnKTtcblxuICAgIC8vIElmIG1hdGNoZXMgc2Vzc2lvbiBjb250ZXh0IGFuZCBoYXMgbm8gZXhwbGljaXQgbWFudWFsIG92ZXJyaWRlLCBkZWZhdWx0IHRvIHNlc3Npb25cbiAgICBpZiAodGhpcy5zZXNzaW9uTWF0Y2goKSAhPT0gbnVsbCAmJiAoIXZhbCB8fCB2YWwuc3RhcnRzV2l0aCgne3tzZXNzaW9uLicpKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7Y29udGV4dC4nKSkge1xuICAgICAgcmV0dXJuICdjb250ZXh0JztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7c2Vzc2lvbi4nKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7JykgJiYgdmFsLmVuZHNXaXRoKCd9fScpKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmNvbXBhdGlibGVDb250cm9scygpLmZpbmQoKGMpID0+IChjLmtleSB8fCBjLmlkKSA9PT0gaW5uZXIpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2N1c3RvbSc7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5NYXRjaCA9IHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkuZmluZCgoYykgPT4gKGMua2V5IHx8IGMuaWQpID09PSB2YWwpO1xuICAgIGlmIChwbGFpbk1hdGNoKSB7XG4gICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgIH1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICAvLyBTbWFydCBkZWZhdWx0OiBudW1lcmljIG9yIGZsYWcgcGFyYW1ldGVycyBkZWZhdWx0IHRvICdmaXhlZCcgKEVudGVyIFZhbHVlKVxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyYW0oKS5kYXRhVHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgbmFtZS5zdGFydHNXaXRoKCdpbnQnKSB8fFxuICAgICAgICBuYW1lLmluY2x1ZGVzKCdmbGFnJykgfHxcbiAgICAgICAgbmFtZS5pbmNsdWRlcygndHlwZScpIHx8XG4gICAgICAgIG5hbWUuaW5jbHVkZXMoJ29ubHknKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGNvbXBhdGlibGUgZm9ybSBmaWVsZHMgb24gY2FudmFzLCBkZWZhdWx0IHRvIGNvbnRyb2wsIG90aGVyd2lzZSBmaXhlZFxuICAgICAgcmV0dXJuIHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkubGVuZ3RoID4gMCA/ICdjb250cm9sJyA6ICdmaXhlZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmaXhlZCc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzQXV0b1Nlc3Npb25EZXJpdmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25NYXRjaCgpICE9PSBudWxsICYmIHRoaXMuYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbic7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29udHJvbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUoKSA/PyAnJyk7XG4gICAgaWYgKHZhbC5zdGFydHNXaXRoKCd7eycpICYmIHZhbC5lbmRzV2l0aCgnfX0nKSkge1xuICAgICAgcmV0dXJuIHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZENvbnRleHRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkgPz8gJycpO1xuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tjb250ZXh0LicpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJvb2xlYW5GaXhlZFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1cnJlbnRWYWx1ZSgpO1xuICAgIHJldHVybiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyB8fCB2ID09PSAxIHx8IHYgPT09ICcxJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNMb25nVGV4dElucHV0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IFN0cmluZyh0aGlzLmN1cnJlbnRWYWx1ZSgpID8/ICcnKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYXJhbSgpLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsLmxlbmd0aCA+IDUwIHx8XG4gICAgICBuYW1lLmluY2x1ZGVzKCdjb2x1bW5uYW1lcycpIHx8XG4gICAgICBuYW1lLmluY2x1ZGVzKCdmaWx0ZXInKSB8fFxuICAgICAgbmFtZS5pbmNsdWRlcygnc3FsJykgfHxcbiAgICAgIG5hbWUuaW5jbHVkZXMoJ3F1ZXJ5JylcbiAgICApO1xuICB9KTtcblxuICBzZXRNb2RlKG1vZGU6IFBhcmFtZXRlckJpbmRpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbE1vZGUuc2V0KG1vZGUpO1xuICAgIGlmIChtb2RlID09PSAnc2Vzc2lvbicpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5zZXNzaW9uTWF0Y2goKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoYHt7c2Vzc2lvbi4ke21hdGNoLnNlc3Npb25LZXl9fX1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAnZml4ZWQnKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VmFsdWUoKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQgJiYgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50ICE9PSAnJyAmJiAhU3RyaW5nKGN1cnJlbnQpLnN0YXJ0c1dpdGgoJ3t7JykpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGN1cnJlbnQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhcmFtKCkuZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLnBhcmFtKCkuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgPyBCb29sZWFuKHRoaXMucGFyYW0oKS5kZWZhdWx0VmFsdWUpIDogdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRlZik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW0oKS5kYXRhVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5wYXJhbSgpLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gTnVtYmVyKHRoaXMucGFyYW0oKS5kZWZhdWx0VmFsdWUpIDogMDtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuICAgICAgfVxuICAgICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNvbnRyb2xTZWxlY3RlZChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGNvbnN0IGV4cHIgPSBge3ske2tleX19fWA7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZXhwcik7XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleToga2V5LFxuICAgICAgICBpc0xpbmtlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuICAgICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkJvb2xlYW5DaGFuZ2VkKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICBmaWVsZEtleTogJycsXG4gICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBvbkZpeGVkVmFsdWVDaGFuZ2VkKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNsZWFuVmFsID0gc2FuaXRpemVTcWxQYXJhbUxpdGVyYWwodmFsKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xlYW5WYWwgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29udGV4dFNlbGVjdGVkKGN0eEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGN0eEtleSk7XG4gICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICBmaWVsZEtleTogJycsXG4gICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==