bways-report 0.2.0 → 0.2.2

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 (41) hide show
  1. package/README.md +64 -0
  2. package/esm2022/lib/core/config/bways-report-config.mjs +1 -1
  3. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  4. package/esm2022/lib/core/services/report-overlay.service.mjs +79 -0
  5. package/esm2022/lib/core/services/report-session-context.service.mjs +1 -44
  6. package/esm2022/lib/core/utils/report-parameter.util.mjs +81 -16
  7. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +10 -2
  8. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +10 -1
  9. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +10 -1
  10. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +10 -1
  11. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +6 -4
  12. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +11 -10
  13. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +93 -7
  14. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +9 -7
  15. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +9 -16
  16. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +5 -3
  17. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +11 -11
  18. package/esm2022/lib/features/designer/designer.component.mjs +12 -7
  19. package/esm2022/lib/features/designer/services/designer-state.service.mjs +5 -3
  20. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +2 -2
  21. package/esm2022/lib/features/runtime/report-execution.service.mjs +35 -4
  22. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +15 -20
  23. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +22 -11
  24. package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +15 -5
  25. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +6 -6
  26. package/fesm2022/bways-report.mjs +414 -165
  27. package/fesm2022/bways-report.mjs.map +1 -1
  28. package/lib/core/config/bways-report-config.d.ts +3 -0
  29. package/lib/core/models/report-grid.model.d.ts +1 -1
  30. package/lib/core/services/report-overlay.service.d.ts +14 -0
  31. package/lib/core/services/report-session-context.service.d.ts +0 -5
  32. package/lib/core/utils/report-parameter.util.d.ts +15 -1
  33. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +12 -0
  34. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +1 -0
  35. package/lib/features/designer/designer.component.d.ts +1 -0
  36. package/lib/features/runtime/report-grid-bridge.component.d.ts +2 -2
  37. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +1 -2
  38. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +0 -1
  39. package/package.json +8 -5
  40. package/styles/theme.css +181 -0
  41. package/third-party-notices/angular-cdk-LICENSE.txt +21 -0
@@ -1,3 +1,4 @@
1
+ import { CdkScrollable } from '@angular/cdk/scrolling';
1
2
  import { DesignerEndpointsService } from '../../services/designer-endpoints.service';
2
3
  import { ChangeDetectionStrategy, Component, computed, effect, inject, output, signal, } from '@angular/core';
3
4
  import { CommonModule } from '@angular/common';
@@ -381,12 +382,13 @@ export class PropertyEditorComponent {
381
382
  return comp.validation?.required ? 'Required' : 'Optional';
382
383
  }
383
384
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
384
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (for Dropdown & Radio) -->\n @if (comp.type === 'dropdown' || comp.type === 'radio') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n [dataSource]=\"gridDataSource()\"\n [availableEntities]=\"availableEntities()\"\n [procedureParameters]=\"gridProcedureParameters()\"\n [allComponents]=\"allComponents()\"\n [isDetecting]=\"isDetectingColumns()\"\n [statusMessage]=\"gridDetectionStatus()?.message ?? null\"\n [statusKind]=\"gridDetectionStatus()?.kind ?? null\"\n (entityChanged)=\"onGridEntityChanged($event)\"\n (updateDataSourceParameters)=\"onGridDataSourceParametersChanged($event)\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid", "dataSource", "availableEntities", "procedureParameters", "allComponents", "isDetecting", "statusMessage", "statusKind"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction", "setDataSource", "updateDataSourceParameters", "entityChanged"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
385
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\" cdkScrollable>\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (for Dropdown & Radio) -->\n @if (comp.type === 'dropdown' || comp.type === 'radio') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n [dataSource]=\"gridDataSource()\"\n [availableEntities]=\"availableEntities()\"\n [procedureParameters]=\"gridProcedureParameters()\"\n [allComponents]=\"allComponents()\"\n [isDetecting]=\"isDetectingColumns()\"\n [statusMessage]=\"gridDetectionStatus()?.message ?? null\"\n [statusKind]=\"gridDetectionStatus()?.kind ?? null\"\n (entityChanged)=\"onGridEntityChanged($event)\"\n (updateDataSourceParameters)=\"onGridDataSourceParametersChanged($event)\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid", "dataSource", "availableEntities", "procedureParameters", "allComponents", "isDetecting", "statusMessage", "statusKind"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction", "setDataSource", "updateDataSourceParameters", "entityChanged"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
385
386
  }
386
387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, decorators: [{
387
388
  type: Component,
388
389
  args: [{ selector: 'rpt-property-editor', standalone: true, imports: [
389
390
  CommonModule,
391
+ CdkScrollable,
390
392
  RptIconComponent,
391
393
  PropertyEditorGeneralComponent,
392
394
  PropertyEditorLayoutComponent,
@@ -395,6 +397,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
395
397
  PropertyEditorReportComponent,
396
398
  PropertyEditorDatasourceComponent,
397
399
  PropertyEditorActionComponent,
398
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (for Dropdown & Radio) -->\n @if (comp.type === 'dropdown' || comp.type === 'radio') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n [dataSource]=\"gridDataSource()\"\n [availableEntities]=\"availableEntities()\"\n [procedureParameters]=\"gridProcedureParameters()\"\n [allComponents]=\"allComponents()\"\n [isDetecting]=\"isDetectingColumns()\"\n [statusMessage]=\"gridDetectionStatus()?.message ?? null\"\n [statusKind]=\"gridDetectionStatus()?.kind ?? null\"\n (entityChanged)=\"onGridEntityChanged($event)\"\n (updateDataSourceParameters)=\"onGridDataSourceParametersChanged($event)\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
400
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\" cdkScrollable>\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (for Dropdown & Radio) -->\n @if (comp.type === 'dropdown' || comp.type === 'radio') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n [dataSource]=\"gridDataSource()\"\n [availableEntities]=\"availableEntities()\"\n [procedureParameters]=\"gridProcedureParameters()\"\n [allComponents]=\"allComponents()\"\n [isDetecting]=\"isDetectingColumns()\"\n [statusMessage]=\"gridDetectionStatus()?.message ?? null\"\n [statusKind]=\"gridDetectionStatus()?.kind ?? null\"\n (entityChanged)=\"onGridEntityChanged($event)\"\n (updateDataSourceParameters)=\"onGridDataSourceParametersChanged($event)\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
399
401
  }], ctorParameters: () => [] });
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Byb3BlcnR5LWVkaXRvci9wcm9wZXJ0eS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFxQixvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBSWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxN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YUFBYSxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQStCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBK0I7UUFDaEQsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDN0QsQ0FBQzt3R0F6WVUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsb0lDakVwQyx5NllBd1JVLHVoSkRyT04sWUFBWSwrQkFDWixnQkFBZ0IsdUdBQ2hCLDhCQUE4QiwrSkFDOUIsNkJBQTZCLHFLQUM3QixpQ0FBaUMsNEhBQ2pDLDJCQUEyQiw4WkFDM0IsNkJBQTZCLDBJQUM3QixpQ0FBaUMsK0pBQ2pDLDZCQUE2Qjs7NEZBTXBCLHVCQUF1QjtrQkFsQm5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsOEJBQThCO3dCQUM5Qiw2QkFBNkI7d0JBQzdCLGlDQUFpQzt3QkFDakMsMkJBQTJCO3dCQUMzQiw2QkFBNkI7d0JBQzdCLGlDQUFpQzt3QkFDakMsNkJBQTZCO3FCQUM5QixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2lnbmVyRW5kcG9pbnRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlc2lnbmVyQWN0aXZlVGFiLCBEZXNpZ25lclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L3Byb3BlcnR5LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRlZmluaXRpb24sIEdyaWRSb3dDbGlja0FjdGlvbiwgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yR2VuZXJhbENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWdlbmVyYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvclZhbGlkYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci12YWxpZGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckdyaWRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvclJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLXJlcG9ydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JEYXRhc291cmNlQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JBY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGFTb3VyY2VEZWZpbml0aW9uLFxuICBEcm9wZG93blNvdXJjZVR5cGUsXG4gIFJlcG9ydENvbXBvbmVudERlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHtcbiAgRGF0YWJhc2VFbnRpdHlNZXRhZGF0YSxcbiAgUHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGEsXG4gIFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIsXG59IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9zY2hlbWEtZGlzY292ZXJ5LmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydExvb2t1cEFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvbG9va3VwLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRhdGFzb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1kYXRhLWRpc2NvdmVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IHJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcbmltcG9ydCB7IGh1bWFuaXplSWRlbnRpZmllciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvaWRlbnRpZmllci1odW1hbml6ZXInO1xuXG4vKipcbiAqIFByb3BlcnR5IEVkaXRvciBjb29yZGluYXRvciBjb21wb25lbnQuXG4gKlxuICogRGVjb21wb3NlZCBpbnRvIGZvY3VzZWQgY2hpbGQgcHJlc2VudGF0aW9uYWwgY29tcG9uZW50cyBwZXIgUnVsZSAxOCAmIDE5IChDb21wb3NpdGlvbiBPdmVyIEdpYW50IENvbXBvbmVudHMpXG4gKiBhbmQgUnVsZSAzMiAoQXZvaWQgR29kIENvbXBvbmVudHMpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBScHRJY29uQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yR2VuZXJhbENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckxheW91dENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvclZhbGlkYXRpb25Db21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yRGF0YXNvdXJjZUNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckFjdGlvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0eS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJTdGF0ZSA9IGluamVjdChEZXNpZ25lclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPSBpbmplY3QoQ29tcG9uZW50UmVnaXN0cnkpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2NvdmVyeUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50U2NvcGUgPSBpbmplY3QoRGVzaWduZXJFbmRwb2ludHNTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFEaXNjb3ZlcnkgPSBpbmplY3QoUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGlzRGV0ZWN0aW5nQ29sdW1ucyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGdyaWREZXRlY3Rpb25TdGF0dXMgPSBzaWduYWw8eyBtZXNzYWdlOiBzdHJpbmc7IGtpbmQ6ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICdlcnJvcicgfSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBhdmFpbGFibGVFbnRpdGllcyA9IHNpZ25hbDxEYXRhYmFzZUVudGl0eU1ldGFkYXRhW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMgPSBzaWduYWw8UHJvY2VkdXJlUGFyYW1ldGVyTWV0YWRhdGFbXT4oW10pO1xuXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSB0aGlzLmRlc2lnbmVyU3RhdGUuZGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gdGhpcy5kZXNpZ25lclN0YXRlLmFjdGl2ZVRhYjtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgcmVhZG9ubHkgY29sbGFwc2VSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBtYXhDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0LmNvbHVtbnMgfHwgMTIpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cyk7XG5cbiAgcmVhZG9ubHkgZ3JpZERhdGFTb3VyY2UgPSBjb21wdXRlZDxSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuZGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGRzSWQgPSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkO1xuICAgIGlmICghZHNJZCkgcmV0dXJuIGRlZi5kYXRhU291cmNlcz8uWzBdO1xuICAgIHJldHVybiBkZWYuZGF0YVNvdXJjZXM/LmZpbmQoKGQpID0+IGQuaWQgPT09IGRzSWQgfHwgZC5uYW1lID09PSBkc0lkKSA/PyBkZWYuZGF0YVNvdXJjZXM/LlswXTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KG9uQ2xlYW51cCA9PiB7XG4gICAgICB0aGlzLmVuZHBvaW50U2NvcGU/LnJldmlzaW9uKCk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFEaXNjb3ZlcnkuZ2V0RW50aXRpZXMoKS5zdWJzY3JpYmUoZW50aXRpZXMgPT4gdGhpcy5hdmFpbGFibGVFbnRpdGllcy5zZXQoZW50aXRpZXMpKTtcbiAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5lbmRwb2ludFNjb3BlPy5yZXZpc2lvbigpO1xuICAgICAgICBjb25zdCBkcyA9IHRoaXMuZ3JpZERhdGFTb3VyY2UoKTtcbiAgICAgICAgaWYgKGRzICYmIGRzLnR5cGUgPT09ICdzdG9yZWRfcHJvY2VkdXJlJyAmJiBkcy5uYW1lKSB7XG4gICAgICAgICAgdGhpcy5kYXRhRGlzY292ZXJ5LmdldFBhcmFtZXRlcnMoZHMubmFtZSwgZHMuc2NoZW1hIHx8ICdkYm8nKS5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkUHJvY2VkdXJlUGFyYW1ldGVycy5zZXQocGFyYW1zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdyaWRQcm9jZWR1cmVQYXJhbWV0ZXJzLnNldChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcmVhZG9ubHkgcHJvcGVydHlTY2hlbWEgPSBjb21wdXRlZDxQcm9wZXJ0eURlZmluaXRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm4gW107XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucmVnaXN0cnkucmVzb2x2ZShjb21wLnR5cGUpO1xuICAgIHJldHVybiBtZXRhPy5wcm9wZXJ0eVNjaGVtYSA/PyBbXTtcbiAgfSk7XG5cbiAgc2V0VGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0QWN0aXZlVGFiKHRhYik7XG4gIH1cblxuICB1cGRhdGVDb21wRGF0YVNvdXJjZShpZDogc3RyaW5nLCBkYXRhU291cmNlOiBDb21wb25lbnREYXRhU291cmNlRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoaWQsIHsgZGF0YVNvdXJjZSB9KTtcbiAgfVxuXG4gIGRlc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gIH1cblxuICBkdXBsaWNhdGVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5kdXBsaWNhdGVDb21wb25lbnQoaWQpO1xuICB9XG5cbiAgZGVsZXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUucmVtb3ZlQ29tcG9uZW50KGlkKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXAoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGNvbXAuaWQsIHsgW2ZpZWxkXTogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUHJvcChpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0KGtleToga2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGNvbXAuaWQsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbXBvbmVudEhlaWdodCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm47XG4gICAgY29uc3QgaGVpZ2h0ID0gIXZhbCB8fCB2YWwgPT09ICdhdXRvJyB8fCAhdmFsLnRyaW0oKSA/IHVuZGVmaW5lZCA6IHZhbC50cmltKCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChjb21wLmlkLCB7XG4gICAgICBoZWlnaHQsXG4gICAgICBtaW5IZWlnaHQ6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0U3BhbiA9IHR5cGUgPT09ICdidXR0b24nID8gMiA6IDQ7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChpZCwge1xuICAgICAgY29sdW1uU3BhbjogZGVmYXVsdFNwYW4sXG4gICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIG1pbkhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVZhbGlkYXRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgbmV4dFZhbGlkYXRpb24gPSB7IC4uLihjb21wLnZhbGlkYXRpb24gPz8ge30pLCBba2V5XTogdmFsdWUgfTtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoY29tcC5pZCwgeyB2YWxpZGF0aW9uOiBuZXh0VmFsaWRhdGlvbiB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVSZXBvcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZVJlcG9ydFNldHRpbmdzKHsgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0UHJvcChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVSZXBvcnRTZXR0aW5ncyh7XG4gICAgICBsYXlvdXQ6IHsgLi4uY3VycmVudExheW91dCwgW2tleV06IHZhbHVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBhZGRSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlc1swXTtcbiAgICBjb25zdCBkZWZhdWx0R3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICBkYXRhU291cmNlSWQ6IGV4aXN0aW5nRHM/LmlkID8/ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ2lkJywgbGFiZWw6ICdJRCcsIGRhdGFUeXBlOiAnbnVtYmVyJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBkYXRhVHlwZTogJ3N0cmluZycsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgICBzaWRlQmFyOiB0cnVlLFxuICAgICAgICBnbG9iYWxTZWFyY2g6IHRydWUsXG4gICAgICAgIHN0YXR1c0JhcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKGRlZmF1bHRHcmlkKTtcbiAgfVxuXG4gIHJlbW92ZVJlc3VsdEdyaWQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh1bmRlZmluZWQpO1xuICB9XG5cbiAgYWRkQ29sdW1uKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkID8/IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW10sXG4gICAgfTtcbiAgICBjb25zdCBjb2xDb3VudCA9IGN1cnJlbnQuY29sdW1ucy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IG5ld0NvbDogR3JpZENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICBmaWVsZDogYGZpZWxkXyR7Y29sQ291bnR9YCxcbiAgICAgIGxhYmVsOiBgQ29sdW1uICR7Y29sQ291bnR9YCxcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IFsuLi5jdXJyZW50LmNvbHVtbnMsIG5ld0NvbF0sXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gWy4uLmN1cnJlbnQuY29sdW1uc107XG4gICAgbmV4dENvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBuZXh0Q29scyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbihpbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gY3VycmVudC5jb2x1bW5zLm1hcCgoYywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5jLCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogbmV4dENvbHMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVHcmlkT3B0aW9uKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQgPz8ge1xuICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IG5leHRPcHRpb25zID0geyAuLi4oY3VycmVudC5vcHRpb25zID8/IHt9KSwgW2ZpZWxkXTogdmFsdWUgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBvcHRpb25zOiBuZXh0T3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbihhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHJvd0NsaWNrQWN0aW9uOiBhY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyaWRFbnRpdHlDaGFuZ2VkKGV2ZW50OiB7IG5hbWU6IHN0cmluZzsgdHlwZTogJ3N0b3JlZF9wcm9jZWR1cmUnIHwgJ3RhYmxlJyB8ICdhcGknIH0pOiB2b2lkIHtcbiAgICBjb25zdCBpc1Byb2NlZHVyZSA9IGV2ZW50LnR5cGUgPT09ICdzdG9yZWRfcHJvY2VkdXJlJztcbiAgICBjb25zdCBpc1RhYmxlID0gZXZlbnQudHlwZSA9PT0gJ3RhYmxlJztcbiAgICBjb25zdCBkc0lkID0gYGRzLSR7ZXZlbnQubmFtZSB8fCAnYXBpJ31gO1xuICAgIGNvbnN0IG5ld0RzOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiA9IHtcbiAgICAgIGlkOiBkc0lkLFxuICAgICAgbmFtZTogZXZlbnQubmFtZSxcbiAgICAgIGVuZHBvaW50OiBldmVudC5uYW1lLFxuICAgICAgc2NoZW1hOiAnZGJvJyxcbiAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICBtZXRob2Q6IGlzVGFibGUgPyAnR0VUJyA6IChpc1Byb2NlZHVyZSA/ICdTVE9SRURfUFJPQ0VEVVJFJyA6ICdHRVQnKSxcbiAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiB7fSxcbiAgICB9O1xuICAgIGlmIChpc1Byb2NlZHVyZSkge1xuICAgICAgdGhpcy5kYXRhRGlzY292ZXJ5LmdldFBhcmFtZXRlcnMoZXZlbnQubmFtZSwgJ2RibycpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChwYXJhbXMpID0+IHRoaXMuZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMuc2V0KHBhcmFtcyB8fCBbXSksXG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmdyaWRQcm9jZWR1cmVQYXJhbWV0ZXJzLnNldChbXSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkUHJvY2VkdXJlUGFyYW1ldGVycy5zZXQoW10pO1xuICAgIH1cbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0R3JpZERhdGFTb3VyY2UobmV3RHMpO1xuICB9XG5cbiAgb25HcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnNDaGFuZ2VkKG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnMobWFwcGluZ3MpO1xuICB9XG5cbiAgYXV0b0RldGVjdEdyaWRDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBjb25zdCBncmlkRHMgPSB0aGlzLmdyaWREYXRhU291cmNlKCk7XG4gICAgbGV0IHRhcmdldEVudGl0eSA9IGdyaWREcz8uZW5kcG9pbnQgfHwgZ3JpZERzPy5uYW1lIHx8ICcnO1xuICAgIGxldCB0YXJnZXRUeXBlOiAndGFibGUnIHwgJ3N0b3JlZF9wcm9jZWR1cmUnIHwgJ2FwaScgPSAoZ3JpZERzPy50eXBlIGFzIGFueSkgfHwgJ3N0b3JlZF9wcm9jZWR1cmUnO1xuICAgIGxldCB0YXJnZXRNYXBwaW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSAoZ3JpZERzPy5wYXJhbWV0ZXJNYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG4gICAgbGV0IHNjaGVtYSA9IGdyaWREcz8uc2NoZW1hIHx8ICdkYm8nO1xuXG4gICAgaWYgKCF0YXJnZXRFbnRpdHkpIHtcbiAgICAgIGNvbnN0IGNvbXBXaXRoRW50aXR5ID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmRhdGFTb3VyY2U/LmVudGl0eU5hbWUpO1xuICAgICAgaWYgKGNvbXBXaXRoRW50aXR5Py5kYXRhU291cmNlPy5lbnRpdHlOYW1lKSB7XG4gICAgICAgIHRhcmdldEVudGl0eSA9IGNvbXBXaXRoRW50aXR5LmRhdGFTb3VyY2UuZW50aXR5TmFtZTtcbiAgICAgICAgdGFyZ2V0TWFwcGluZ3MgPSAoY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5wYXJhbWV0ZXJNYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG4gICAgICAgIGlmIChjb21wV2l0aEVudGl0eS5kYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICB0YXJnZXRUeXBlID0gJ3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBzY2hlbWEgPSBjb21wV2l0aEVudGl0eS5kYXRhU291cmNlLnNjaGVtYSB8fCAnZGJvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldEVudGl0eSkge1xuICAgICAgdGhpcy5ncmlkRGV0ZWN0aW9uU3RhdHVzLnNldCh7XG4gICAgICAgIG1lc3NhZ2U6ICdObyBkYXRhIHNvdXJjZSBjb25maWd1cmVkLiBDaG9vc2UgYSBTdG9yZWQgUHJvY2VkdXJlIG9yIFRhYmxlIGluIHRoZSBHcmlkIERhdGEgU291cmNlIHNlY3Rpb24gYWJvdmUuJyxcbiAgICAgICAga2luZDogJ2Vycm9yJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNEZXRlY3RpbmdDb2x1bW5zLnNldCh0cnVlKTtcbiAgICB0aGlzLmdyaWREZXRlY3Rpb25TdGF0dXMuc2V0KHtcbiAgICAgIG1lc3NhZ2U6IGBEZXRlY3RpbmcgY29sdW1ucyBmb3IgJHt0YXJnZXRFbnRpdHl9Li4uYCxcbiAgICAgIGtpbmQ6ICdpbmZvJyxcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YURpc2NvdmVyeS5hdXRvRGV0ZWN0Q29sdW1ucyh0YXJnZXRFbnRpdHksIHRhcmdldFR5cGUsIHRhcmdldE1hcHBpbmdzLCBzY2hlbWEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobWFwcGVkQ29scykgPT4ge1xuICAgICAgICBpZiAobWFwcGVkQ29scyAmJiBtYXBwZWRDb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IGN1cnJlbnRHcmlkPy5vcHRpb25zID8geyAuLi5jdXJyZW50R3JpZC5vcHRpb25zIH0gOiB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgICAgICAgc2hvd1Jvd051bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnRPcHRpb25zLnJlcG9ydFN0YXRlO1xuXG4gICAgICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAgICAgICAuLi4oY3VycmVudEdyaWQgPz8ge1xuICAgICAgICAgICAgICBkYXRhU291cmNlSWQ6IGdyaWREcz8uaWQgfHwgYGRzLSR7dGFyZ2V0RW50aXR5fWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGN1cnJlbnRPcHRpb25zLFxuICAgICAgICAgICAgY29sdW1uczogbWFwcGVkQ29scyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmlzRGV0ZWN0aW5nQ29sdW1ucy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZ3JpZERldGVjdGlvblN0YXR1cy5zZXQoe1xuICAgICAgICAgICAgbWVzc2FnZTogYFN1Y2Nlc3NmdWxseSBkZXRlY3RlZCAke21hcHBlZENvbHMubGVuZ3RofSBjb2x1bW5zIGZyb20gJHt0YXJnZXRFbnRpdHl9IWAsXG4gICAgICAgICAgICBraW5kOiAnc3VjY2VzcycsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmdyaWREZXRlY3Rpb25TdGF0dXMuc2V0KG51bGwpLCA0MDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzRGV0ZWN0aW5nQ29sdW1ucy5zZXQoZmFsc2UpO1xuICAgICAgICAgIGNvbnN0IGVudGl0eVR5cGVMYWJlbCA9IHRhcmdldFR5cGUgPT09ICd0YWJsZScgPyAnVGFibGUvVmlldycgOiAnU3RvcmVkIHByb2NlZHVyZSc7XG4gICAgICAgICAgdGhpcy5ncmlkRGV0ZWN0aW9uU3RhdHVzLnNldCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgTm8gY29sdW1ucyBkZXRlY3RlZCBmb3IgJHt0YXJnZXRFbnRpdHl9LiAke2VudGl0eVR5cGVMYWJlbH0gcmV0dXJuZWQgMCByb3dzIG9yIGNvbHVtbnMuIFZlcmlmeSBjb25maWd1cmF0aW9uIG9yIGFkZCBjb2x1bW5zIG1hbnVhbGx5LmAsXG4gICAgICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5pc0RldGVjdGluZ0NvbHVtbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ncmlkRGV0ZWN0aW9uU3RhdHVzLnNldCh7XG4gICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBkZXRlY3QgY29sdW1uczogJHtlcnI/Lm1lc3NhZ2UgfHwgJ0RhdGFiYXNlIGVycm9yJ30uIFlvdSBjYW4gYWRkIGNvbHVtbnMgbWFudWFsbHkuYCxcbiAgICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZWFkb25seSBleHBhbmRlZFNlY3Rpb25zID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7XG4gICAgZGF0YXNvdXJjZTogdHJ1ZSxcbiAgICBhY3Rpb246IHRydWUsXG4gICAgZ2VuZXJhbDogdHJ1ZSxcbiAgICBsYXlvdXQ6IGZhbHNlLFxuICAgIHZhbGlkYXRpb246IGZhbHNlLFxuICB9KTtcblxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRTZWN0aW9ucy51cGRhdGUoKHByZXYpID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW3NlY3Rpb25dOiAhcHJldltzZWN0aW9uXSxcbiAgICB9KSk7XG4gIH1cblxuICBpc1NlY3Rpb25FeHBhbmRlZChzZWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmV4cGFuZGVkU2VjdGlvbnMoKVtzZWN0aW9uXTtcbiAgfVxuXG4gIGdldEFjdGlvbkJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFjdCA9IChjb21wLnByb3BlcnRpZXM/LlsnYWN0aW9uJ10gYXMgc3RyaW5nKSB8fCAnZXhlY3V0ZS1yZXBvcnQnO1xuICAgIHN3aXRjaCAoYWN0KSB7XG4gICAgICBjYXNlICdleGVjdXRlLXJlcG9ydCc6XG4gICAgICAgIHJldHVybiAnUnVuIFJlcG9ydCc7XG4gICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgIHJldHVybiAnUmVzZXQgRm9ybSc7XG4gICAgICBjYXNlICdleHBvcnQnOiB7XG4gICAgICAgIGNvbnN0IGZtdCA9ICgoY29tcC5wcm9wZXJ0aWVzPy5bJ2FjdGlvblBhcmFtcyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uWydmb3JtYXQnXSBhcyBzdHJpbmcpIHx8ICdleGNlbCc7XG4gICAgICAgIHJldHVybiBgRXhwb3J0ICgke2ZtdC50b1VwcGVyQ2FzZSgpfSlgO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJpbnQtcmVwb3J0JzpcbiAgICAgICAgcmV0dXJuICdQcmludCAoLlJwdCknO1xuICAgICAgY2FzZSAnbmF2aWdhdGUnOlxuICAgICAgICByZXR1cm4gJ05hdmlnYXRlJztcbiAgICAgIGNhc2UgJ2N1c3RvbS1ldmVudCc6XG4gICAgICAgIHJldHVybiAnQ3VzdG9tIEV2ZW50JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBhY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGF0YXNvdXJjZUJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzID0gY29tcC5kYXRhU291cmNlO1xuICAgIGlmICghZHMgfHwgZHMuc291cmNlVHlwZSA9PT0gJ3N0YXRpYycpIHJldHVybiAnU3RhdGljIExpc3QnO1xuICAgIGlmIChkcy5zb3VyY2VUeXBlID09PSAndGFibGUnIHx8IGRzLmVudGl0eU5hbWUpIHtcbiAgICAgIHJldHVybiBkcy5lbnRpdHlOYW1lID8gYFRhYmxlOiAke2RzLmVudGl0eU5hbWV9YCA6ICdUYWJsZSAvIFZpZXcnO1xuICAgIH1cbiAgICBpZiAoZHMuc291cmNlVHlwZSA9PT0gJ3Byb2NlZHVyZScpIHtcbiAgICAgIHJldHVybiBkcy5lbnRpdHlOYW1lID8gYFNQOiAke2RzLmVudGl0eU5hbWV9YCA6ICdTdG9yZWQgUHJvYyc7XG4gICAgfVxuICAgIHJldHVybiAnU3RhdGljIExpc3QnO1xuICB9XG5cbiAgZ2V0TGF5b3V0QmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhbiA9IGNvbXAubGF5b3V0Py5jb2x1bW5TcGFuIHx8IChjb21wLnR5cGUgPT09ICdidXR0b24nID8gMiA6IDQpO1xuICAgIHJldHVybiBgJHtzcGFufS8ke3RoaXMubWF4Q29sdW1ucygpfSBjb2xzYDtcbiAgfVxuXG4gIGdldFZhbGlkYXRpb25CYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29tcC52YWxpZGF0aW9uPy5yZXF1aXJlZCA/ICdSZXF1aXJlZCcgOiAnT3B0aW9uYWwnO1xuICB9XG59XG4iLCIgICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDwhLS0gRWRpdG9yIEhlYWRlciAmIFRhYnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnRpZXMnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdwcm9wZXJ0aWVzJylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRDb21wb25lbnQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+UHJvcGVydGllczwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBvcnQnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdyZXBvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5MYXlvdXQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnZ3JpZCdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ2dyaWQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPkdyaWQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPjwvZGl2PlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG4gYnRuLWNvbGxhcHNlLWluc3BlY3RvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbGxhcHNlUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJDb2xsYXBzZSBQcm9wZXJ0eSBFZGl0b3JcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb2xsYXBzZSBQcm9wZXJ0eSBFZGl0b3JcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVkaXRvciBCb2R5IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVkaXRvci1ib2R5XCI+XG4gICAgICAgIDwhLS0gMS4gQ09NUE9ORU5UIFBST1BFUlRJRVMgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncHJvcGVydGllcycpIHtcbiAgICAgICAgICBAaWYgKHNlbGVjdGVkQ29tcG9uZW50KCk7IGFzIGNvbXApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc2VjdGlvbnMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8IS0tIENvbXBvbmVudCBJZGVudGlmaWVyIEhlYWRlciAoUGlubmVkIGF0IFRvcCkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wLWJhZGdlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS10eXBlXCI+e3sgY29tcC50eXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1pZFwiPnt7IGNvbXAuaWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlLWhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQ29tcG9uZW50KGNvbXAuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEdXBsaWNhdGUgY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb3B5XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb24gYnRuLWJhZGdlLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb21wb25lbnQoY29tcC5pZClcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkRlbGV0ZSBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kZXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZXNlbGVjdCBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWFjY29yZGlvblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gMS4gT1BUSU9OUyBEQVRBIFNPVVJDRSBBQ0NPUkRJT04gKGZvciBEcm9wZG93biAmIFJhZGlvKSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbXAudHlwZSA9PT0gJ2Ryb3Bkb3duJyB8fCBjb21wLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnZGF0YXNvdXJjZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdkYXRhc291cmNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIE9wdGlvbnMgRGF0YSBTb3VyY2Ugc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGF0YWJhc2VcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPk9wdGlvbnMgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldERhdGFzb3VyY2VCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdkYXRhc291cmNlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxDb21wb25lbnRzXT1cImFsbENvbXBvbmVudHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVEYXRhU291cmNlKT1cInVwZGF0ZUNvbXBEYXRhU291cmNlKGNvbXAuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQlVUVE9OIEFDVElPTiBBQ0NPUkRJT04gKEZJUlNUIGZvciBCdXR0b24pIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29tcC50eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignYWN0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEJ1dHRvbiBBY3Rpb24gc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlnaHRuaW5nXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5CdXR0b24gQWN0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRBY3Rpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gMi4gR0VORVJBTCBQUk9QRVJUSUVTIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2dlbmVyYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2dlbmVyYWwnKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEdlbmVyYWwgUHJvcGVydGllcyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+R2VuZXJhbCBQcm9wZXJ0aWVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29tcC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBjb21wLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdnZW5lcmFsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlTY2hlbWFdPVwicHJvcGVydHlTY2hlbWEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlKT1cInVwZGF0ZUNvbXAoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0KT1cImRlc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSAzLiBMQVlPVVQgJiBHUklEIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2xheW91dCcpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignbGF5b3V0JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBMYXlvdXQgJiBEaW1lbnNpb25zIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkxheW91dCAmIEdyaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRMYXlvdXRCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdsYXlvdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21heENvbHVtbnNdPVwibWF4Q29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVMYXlvdXQpPVwidXBkYXRlTGF5b3V0KCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZUhlaWdodCk9XCJ1cGRhdGVDb21wb25lbnRIZWlnaHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzZXREaW1lbnNpb25zKT1cInJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhjb21wLmlkLCBjb21wLnR5cGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gNC4gVkFMSURBVElPTiBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCd2YWxpZGF0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBWYWxpZGF0aW9uIFJ1bGVzIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+VmFsaWRhdGlvbiBSdWxlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldFZhbGlkYXRpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlVmFsaWRhdGlvbik9XCJ1cGRhdGVWYWxpZGF0aW9uKCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaWNvbi13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjdXJzb3JcIiBbc2l6ZV09XCIyNFwiIGNvbG9yPVwiIzY0NzQ4YlwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5LXRleHRcIj5TZWxlY3QgYSBjb21wb25lbnQgb24gdGhlIGNhbnZhcyB0byBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMuPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBSRVBPUlQgU0VUVElOR1MgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwb3J0Jykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLXJlcG9ydFxuICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvbigpXCJcbiAgICAgICAgICAgICh1cGRhdGVSZXBvcnQpPVwidXBkYXRlUmVwb3J0KCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlTGF5b3V0KT1cInVwZGF0ZUxheW91dFByb3AoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAzLiBSRVNVTFQgR1JJRCBTRVRUSU5HUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdncmlkJykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWdyaWRcbiAgICAgICAgICAgIFtncmlkXT1cImRlZmluaXRpb24oKS5ncmlkXCJcbiAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImdyaWREYXRhU291cmNlKClcIlxuICAgICAgICAgICAgW2F2YWlsYWJsZUVudGl0aWVzXT1cImF2YWlsYWJsZUVudGl0aWVzKClcIlxuICAgICAgICAgICAgW3Byb2NlZHVyZVBhcmFtZXRlcnNdPVwiZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMoKVwiXG4gICAgICAgICAgICBbYWxsQ29tcG9uZW50c109XCJhbGxDb21wb25lbnRzKClcIlxuICAgICAgICAgICAgW2lzRGV0ZWN0aW5nXT1cImlzRGV0ZWN0aW5nQ29sdW1ucygpXCJcbiAgICAgICAgICAgIFtzdGF0dXNNZXNzYWdlXT1cImdyaWREZXRlY3Rpb25TdGF0dXMoKT8ubWVzc2FnZSA/PyBudWxsXCJcbiAgICAgICAgICAgIFtzdGF0dXNLaW5kXT1cImdyaWREZXRlY3Rpb25TdGF0dXMoKT8ua2luZCA/PyBudWxsXCJcbiAgICAgICAgICAgIChlbnRpdHlDaGFuZ2VkKT1cIm9uR3JpZEVudGl0eUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAodXBkYXRlRGF0YVNvdXJjZVBhcmFtZXRlcnMpPVwib25HcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGFkZEdyaWQpPVwiYWRkUmVzdWx0R3JpZCgpXCJcbiAgICAgICAgICAgIChyZW1vdmVHcmlkKT1cInJlbW92ZVJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICAoYWRkQ29sdW1uKT1cImFkZENvbHVtbigpXCJcbiAgICAgICAgICAgIChhdXRvRGV0ZWN0Q29sdW1ucyk9XCJhdXRvRGV0ZWN0R3JpZENvbHVtbnMoKVwiXG4gICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1cInJlbW92ZUNvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgICAgICh1cGRhdGVDb2x1bW4pPVwidXBkYXRlQ29sdW1uKCRldmVudC5pbmRleCwgJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVPcHRpb24pPVwidXBkYXRlR3JpZE9wdGlvbigkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHVwZGF0ZVJvd0NsaWNrQWN0aW9uKT1cInVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4iXX0=
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Byb3BlcnR5LWVkaXRvci9wcm9wZXJ0eS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUlqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFB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QUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUErQjtRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQStCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQzdELENBQUM7d0dBellVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLG9JQ25FcEMsdTdZQXdSVSx1aEpEcE9OLFlBQVksK0JBQ1osYUFBYSw4RUFDYixnQkFBZ0IsdUdBQ2hCLDhCQUE4QiwrSkFDOUIsNkJBQTZCLHFLQUM3QixpQ0FBaUMsNEhBQ2pDLDJCQUEyQiw4WkFDM0IsNkJBQTZCLDBJQUM3QixpQ0FBaUMsK0pBQ2pDLDZCQUE2Qjs7NEZBTXBCLHVCQUF1QjtrQkFuQm5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQiw4QkFBOEI7d0JBQzlCLDZCQUE2Qjt3QkFDN0IsaUNBQWlDO3dCQUNqQywyQkFBMkI7d0JBQzNCLDZCQUE2Qjt3QkFDN0IsaUNBQWlDO3dCQUNqQyw2QkFBNkI7cUJBQzlCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrU2Nyb2xsYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgRGVzaWduZXJFbmRwb2ludHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItZW5kcG9pbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGVzaWduZXJBY3RpdmVUYWIsIERlc2lnbmVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvY29tcG9uZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7IFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvcHJvcGVydHktZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgR3JpZFJvd0NsaWNrQWN0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JHZW5lcmFsQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1sYXlvdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yVmFsaWRhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLXZhbGlkYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yR3JpZENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItcmVwb3J0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1kYXRhc291cmNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24sXG4gIERyb3Bkb3duU291cmNlVHlwZSxcbiAgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBEYXRhYmFzZUVudGl0eU1ldGFkYXRhLFxuICBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YSxcbiAgUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlcixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0TG9va3VwQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9sb29rdXAuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGF0YXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhRGlzY292ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9yZXBvcnQtcGFyYW1ldGVyLnV0aWwnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5cbi8qKlxuICogUHJvcGVydHkgRWRpdG9yIGNvb3JkaW5hdG9yIGNvbXBvbmVudC5cbiAqXG4gKiBEZWNvbXBvc2VkIGludG8gZm9jdXNlZCBjaGlsZCBwcmVzZW50YXRpb25hbCBjb21wb25lbnRzIHBlciBSdWxlIDE4ICYgMTkgKENvbXBvc2l0aW9uIE92ZXIgR2lhbnQgQ29tcG9uZW50cylcbiAqIGFuZCBSdWxlIDMyIChBdm9pZCBHb2QgQ29tcG9uZW50cykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIENka1Njcm9sbGFibGUsXG4gICAgUnB0SWNvbkNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckdlbmVyYWxDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JMYXlvdXRDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JWYWxpZGF0aW9uQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yR3JpZENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvclJlcG9ydENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JBY3Rpb25Db21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc2lnbmVyU3RhdGUgPSBpbmplY3QoRGVzaWduZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KENvbXBvbmVudFJlZ2lzdHJ5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNjb3ZlcnlBZGFwdGVyID0gaW5qZWN0KFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9va3VwQWRhcHRlciA9IGluamVjdChSZXBvcnRMb29rdXBBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludFNjb3BlID0gaW5qZWN0KERlc2lnbmVyRW5kcG9pbnRzU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhRGlzY292ZXJ5ID0gaW5qZWN0KFJlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlKTtcblxuICByZWFkb25seSBpc0RldGVjdGluZ0NvbHVtbnMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBncmlkRGV0ZWN0aW9uU3RhdHVzID0gc2lnbmFsPHsgbWVzc2FnZTogc3RyaW5nOyBraW5kOiAnaW5mbycgfCAnc3VjY2VzcycgfCAnZXJyb3InIH0gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlRW50aXRpZXMgPSBzaWduYWw8RGF0YWJhc2VFbnRpdHlNZXRhZGF0YVtdPihbXSk7XG4gIHJlYWRvbmx5IGdyaWRQcm9jZWR1cmVQYXJhbWV0ZXJzID0gc2lnbmFsPFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhW10+KFtdKTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gdGhpcy5kZXNpZ25lclN0YXRlLmRlZmluaXRpb247XG4gIHJlYWRvbmx5IGFjdGl2ZVRhYiA9IHRoaXMuZGVzaWduZXJTdGF0ZS5hY3RpdmVUYWI7XG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29tcG9uZW50ID0gdGhpcy5kZXNpZ25lclN0YXRlLnNlbGVjdGVkQ29tcG9uZW50O1xuXG4gIHJlYWRvbmx5IGNvbGxhcHNlUmVxdWVzdGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgbWF4Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGVmaW5pdGlvbigpLmxheW91dC5jb2x1bW5zIHx8IDEyKTtcbiAgcmVhZG9ubHkgYWxsQ29tcG9uZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMpO1xuXG4gIHJlYWRvbmx5IGdyaWREYXRhU291cmNlID0gY29tcHV0ZWQ8UmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmRlZmluaXRpb24oKTtcbiAgICBjb25zdCBkc0lkID0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZDtcbiAgICBpZiAoIWRzSWQpIHJldHVybiBkZWYuZGF0YVNvdXJjZXM/LlswXTtcbiAgICByZXR1cm4gZGVmLmRhdGFTb3VyY2VzPy5maW5kKChkKSA9PiBkLmlkID09PSBkc0lkIHx8IGQubmFtZSA9PT0gZHNJZCkgPz8gZGVmLmRhdGFTb3VyY2VzPy5bMF07XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChvbkNsZWFudXAgPT4ge1xuICAgICAgdGhpcy5lbmRwb2ludFNjb3BlPy5yZXZpc2lvbigpO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhRGlzY292ZXJ5LmdldEVudGl0aWVzKCkuc3Vic2NyaWJlKGVudGl0aWVzID0+IHRoaXMuYXZhaWxhYmxlRW50aXRpZXMuc2V0KGVudGl0aWVzKSk7XG4gICAgICBvbkNsZWFudXAoKCkgPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5kcG9pbnRTY29wZT8ucmV2aXNpb24oKTtcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLmdyaWREYXRhU291cmNlKCk7XG4gICAgICAgIGlmIChkcyAmJiBkcy50eXBlID09PSAnc3RvcmVkX3Byb2NlZHVyZScgJiYgZHMubmFtZSkge1xuICAgICAgICAgIHRoaXMuZGF0YURpc2NvdmVyeS5nZXRQYXJhbWV0ZXJzKGRzLm5hbWUsIGRzLnNjaGVtYSB8fCAnZGJvJykuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMuc2V0KHBhcmFtcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ncmlkUHJvY2VkdXJlUGFyYW1ldGVycy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHByb3BlcnR5U2NoZW1hID0gY29tcHV0ZWQ8UHJvcGVydHlEZWZpbml0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmICghY29tcCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoY29tcC50eXBlKTtcbiAgICByZXR1cm4gbWV0YT8ucHJvcGVydHlTY2hlbWEgPz8gW107XG4gIH0pO1xuXG4gIHNldFRhYih0YWI6IERlc2lnbmVyQWN0aXZlVGFiKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYih0YWIpO1xuICB9XG5cbiAgdXBkYXRlQ29tcERhdGFTb3VyY2UoaWQ6IHN0cmluZywgZGF0YVNvdXJjZTogQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGlkLCB7IGRhdGFTb3VyY2UgfSk7XG4gIH1cblxuICBkZXNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0Q29tcG9uZW50KG51bGwpO1xuICB9XG5cbiAgZHVwbGljYXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuZHVwbGljYXRlQ29tcG9uZW50KGlkKTtcbiAgfVxuXG4gIGRlbGV0ZUNvbXBvbmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnJlbW92ZUNvbXBvbmVudChpZCk7XG4gIH1cblxuICB1cGRhdGVDb21wKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudChjb21wLmlkLCB7IFtmaWVsZF06IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVByb3AoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudFByb3BlcnR5KGlkLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHVwZGF0ZUxheW91dChrZXk6IGtleW9mIENvbXBvbmVudExheW91dERlZmluaXRpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChjb21wLmlkLCB7IFtrZXldOiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb21wb25lbnRIZWlnaHQodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmICghY29tcCkgcmV0dXJuO1xuICAgIGNvbnN0IGhlaWdodCA9ICF2YWwgfHwgdmFsID09PSAnYXV0bycgfHwgIXZhbC50cmltKCkgPyB1bmRlZmluZWQgOiB2YWwudHJpbSgpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnRMYXlvdXQoY29tcC5pZCwge1xuICAgICAgaGVpZ2h0LFxuICAgICAgbWluSGVpZ2h0OiBoZWlnaHQsXG4gICAgfSk7XG4gIH1cblxuICByZXNldENvbXBvbmVudERpbWVuc2lvbnMoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFNwYW4gPSB0eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnRMYXlvdXQoaWQsIHtcbiAgICAgIGNvbHVtblNwYW46IGRlZmF1bHRTcGFuLFxuICAgICAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICBtaW5IZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIHdpZHRoOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVWYWxpZGF0aW9uKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IG5leHRWYWxpZGF0aW9uID0geyAuLi4oY29tcC52YWxpZGF0aW9uID8/IHt9KSwgW2tleV06IHZhbHVlIH07XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGNvbXAuaWQsIHsgdmFsaWRhdGlvbjogbmV4dFZhbGlkYXRpb24gfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUmVwb3J0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVSZXBvcnRTZXR0aW5ncyh7IFtrZXldOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIHVwZGF0ZUxheW91dFByb3Aoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuZGVmaW5pdGlvbigpLmxheW91dDtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlUmVwb3J0U2V0dGluZ3Moe1xuICAgICAgbGF5b3V0OiB7IC4uLmN1cnJlbnRMYXlvdXQsIFtrZXldOiB2YWx1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVzdWx0R3JpZCgpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZ0RzID0gdGhpcy5kZWZpbml0aW9uKCkuZGF0YVNvdXJjZXNbMF07XG4gICAgY29uc3QgZGVmYXVsdEdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uID0ge1xuICAgICAgZGF0YVNvdXJjZUlkOiBleGlzdGluZ0RzPy5pZCA/PyAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsgZmllbGQ6ICdpZCcsIGxhYmVsOiAnSUQnLCBkYXRhVHlwZTogJ251bWJlcicsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICAgIHsgZmllbGQ6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgZGF0YVR5cGU6ICdzdHJpbmcnLCB2aXNpYmxlOiB0cnVlLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgICBzaG93Um93TnVtYmVyczogdHJ1ZSxcbiAgICAgICAgc2hvd0Zvb3RlcjogdHJ1ZSxcbiAgICAgICAgc2lkZUJhcjogdHJ1ZSxcbiAgICAgICAgZ2xvYmFsU2VhcmNoOiB0cnVlLFxuICAgICAgICBzdGF0dXNCYXI6IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyhkZWZhdWx0R3JpZCk7XG4gIH1cblxuICByZW1vdmVSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3ModW5kZWZpbmVkKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZCA/PyB7XG4gICAgICBkYXRhU291cmNlSWQ6ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgY29sQ291bnQgPSBjdXJyZW50LmNvbHVtbnMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuZXdDb2w6IEdyaWRDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgZmllbGQ6IGBmaWVsZF8ke2NvbENvdW50fWAsXG4gICAgICBsYWJlbDogYENvbHVtbiAke2NvbENvdW50fWAsXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBbLi4uY3VycmVudC5jb2x1bW5zLCBuZXdDb2xdLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0Q29scyA9IFsuLi5jdXJyZW50LmNvbHVtbnNdO1xuICAgIG5leHRDb2xzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogbmV4dENvbHMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW4oaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0Q29scyA9IGN1cnJlbnQuY29sdW1ucy5tYXAoKGMsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYywgW2ZpZWxkXTogdmFsdWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IG5leHRDb2xzLFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlR3JpZE9wdGlvbihmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkID8/IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW10sXG4gICAgfTtcbiAgICBjb25zdCBuZXh0T3B0aW9ucyA9IHsgLi4uKGN1cnJlbnQub3B0aW9ucyA/PyB7fSksIFtmaWVsZF06IHZhbHVlIH07XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgb3B0aW9uczogbmV4dE9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVHcmlkUm93Q2xpY2tBY3Rpb24oYWN0aW9uOiBHcmlkUm93Q2xpY2tBY3Rpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICByb3dDbGlja0FjdGlvbjogYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgb25HcmlkRW50aXR5Q2hhbmdlZChldmVudDogeyBuYW1lOiBzdHJpbmc7IHR5cGU6ICdzdG9yZWRfcHJvY2VkdXJlJyB8ICd0YWJsZScgfCAnYXBpJyB9KTogdm9pZCB7XG4gICAgY29uc3QgaXNQcm9jZWR1cmUgPSBldmVudC50eXBlID09PSAnc3RvcmVkX3Byb2NlZHVyZSc7XG4gICAgY29uc3QgaXNUYWJsZSA9IGV2ZW50LnR5cGUgPT09ICd0YWJsZSc7XG4gICAgY29uc3QgZHNJZCA9IGBkcy0ke2V2ZW50Lm5hbWUgfHwgJ2FwaSd9YDtcbiAgICBjb25zdCBuZXdEczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gPSB7XG4gICAgICBpZDogZHNJZCxcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBlbmRwb2ludDogZXZlbnQubmFtZSxcbiAgICAgIHNjaGVtYTogJ2RibycsXG4gICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgbWV0aG9kOiBpc1RhYmxlID8gJ0dFVCcgOiAoaXNQcm9jZWR1cmUgPyAnU1RPUkVEX1BST0NFRFVSRScgOiAnR0VUJyksXG4gICAgICBwYXJhbWV0ZXJNYXBwaW5nczoge30sXG4gICAgfTtcbiAgICBpZiAoaXNQcm9jZWR1cmUpIHtcbiAgICAgIHRoaXMuZGF0YURpc2NvdmVyeS5nZXRQYXJhbWV0ZXJzKGV2ZW50Lm5hbWUsICdkYm8nKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocGFyYW1zKSA9PiB0aGlzLmdyaWRQcm9jZWR1cmVQYXJhbWV0ZXJzLnNldChwYXJhbXMgfHwgW10pLFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5ncmlkUHJvY2VkdXJlUGFyYW1ldGVycy5zZXQoW10pLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMuc2V0KFtdKTtcbiAgICB9XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEdyaWREYXRhU291cmNlKG5ld0RzKTtcbiAgfVxuXG4gIG9uR3JpZERhdGFTb3VyY2VQYXJhbWV0ZXJzQ2hhbmdlZChtYXBwaW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZERhdGFTb3VyY2VQYXJhbWV0ZXJzKG1hcHBpbmdzKTtcbiAgfVxuXG4gIGF1dG9EZXRlY3RHcmlkQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50R3JpZCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQ7XG4gICAgY29uc3QgZ3JpZERzID0gdGhpcy5ncmlkRGF0YVNvdXJjZSgpO1xuICAgIGxldCB0YXJnZXRFbnRpdHkgPSBncmlkRHM/LmVuZHBvaW50IHx8IGdyaWREcz8ubmFtZSB8fCAnJztcbiAgICBsZXQgdGFyZ2V0VHlwZTogJ3RhYmxlJyB8ICdzdG9yZWRfcHJvY2VkdXJlJyB8ICdhcGknID0gKGdyaWREcz8udHlwZSBhcyBhbnkpIHx8ICdzdG9yZWRfcHJvY2VkdXJlJztcbiAgICBsZXQgdGFyZ2V0TWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gKGdyaWREcz8ucGFyYW1ldGVyTWFwcGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgIGxldCBzY2hlbWEgPSBncmlkRHM/LnNjaGVtYSB8fCAnZGJvJztcblxuICAgIGlmICghdGFyZ2V0RW50aXR5KSB7XG4gICAgICBjb25zdCBjb21wV2l0aEVudGl0eSA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5kYXRhU291cmNlPy5lbnRpdHlOYW1lKTtcbiAgICAgIGlmIChjb21wV2l0aEVudGl0eT8uZGF0YVNvdXJjZT8uZW50aXR5TmFtZSkge1xuICAgICAgICB0YXJnZXRFbnRpdHkgPSBjb21wV2l0aEVudGl0eS5kYXRhU291cmNlLmVudGl0eU5hbWU7XG4gICAgICAgIHRhcmdldE1hcHBpbmdzID0gKGNvbXBXaXRoRW50aXR5LmRhdGFTb3VyY2UucGFyYW1ldGVyTWFwcGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgICAgICBpZiAoY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgdGFyZ2V0VHlwZSA9ICd0YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZW1hID0gY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5zY2hlbWEgfHwgJ2Ribyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRFbnRpdHkpIHtcbiAgICAgIHRoaXMuZ3JpZERldGVjdGlvblN0YXR1cy5zZXQoe1xuICAgICAgICBtZXNzYWdlOiAnTm8gZGF0YSBzb3VyY2UgY29uZmlndXJlZC4gQ2hvb3NlIGEgU3RvcmVkIFByb2NlZHVyZSBvciBUYWJsZSBpbiB0aGUgR3JpZCBEYXRhIFNvdXJjZSBzZWN0aW9uIGFib3ZlLicsXG4gICAgICAgIGtpbmQ6ICdlcnJvcicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzRGV0ZWN0aW5nQ29sdW1ucy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5ncmlkRGV0ZWN0aW9uU3RhdHVzLnNldCh7XG4gICAgICBtZXNzYWdlOiBgRGV0ZWN0aW5nIGNvbHVtbnMgZm9yICR7dGFyZ2V0RW50aXR5fS4uLmAsXG4gICAgICBraW5kOiAnaW5mbycsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFEaXNjb3ZlcnkuYXV0b0RldGVjdENvbHVtbnModGFyZ2V0RW50aXR5LCB0YXJnZXRUeXBlLCB0YXJnZXRNYXBwaW5ncywgc2NoZW1hKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKG1hcHBlZENvbHMpID0+IHtcbiAgICAgICAgaWYgKG1hcHBlZENvbHMgJiYgbWFwcGVkQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSBjdXJyZW50R3JpZD8ub3B0aW9ucyA/IHsgLi4uY3VycmVudEdyaWQub3B0aW9ucyB9IDoge1xuICAgICAgICAgICAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VTaXplOiAyNSxcbiAgICAgICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgc2hvd0Zvb3RlcjogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGRlbGV0ZSBjdXJyZW50T3B0aW9ucy5yZXBvcnRTdGF0ZTtcblxuICAgICAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRHcmlkID8/IHtcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZUlkOiBncmlkRHM/LmlkIHx8IGBkcy0ke3RhcmdldEVudGl0eX1gLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvcHRpb25zOiBjdXJyZW50T3B0aW9ucyxcbiAgICAgICAgICAgIGNvbHVtbnM6IG1hcHBlZENvbHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5pc0RldGVjdGluZ0NvbHVtbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmdyaWREZXRlY3Rpb25TdGF0dXMuc2V0KHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgZGV0ZWN0ZWQgJHttYXBwZWRDb2xzLmxlbmd0aH0gY29sdW1ucyBmcm9tICR7dGFyZ2V0RW50aXR5fSFgLFxuICAgICAgICAgICAga2luZDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ncmlkRGV0ZWN0aW9uU3RhdHVzLnNldChudWxsKSwgNDAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0RldGVjdGluZ0NvbHVtbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgICBjb25zdCBlbnRpdHlUeXBlTGFiZWwgPSB0YXJnZXRUeXBlID09PSAndGFibGUnID8gJ1RhYmxlL1ZpZXcnIDogJ1N0b3JlZCBwcm9jZWR1cmUnO1xuICAgICAgICAgIHRoaXMuZ3JpZERldGVjdGlvblN0YXR1cy5zZXQoe1xuICAgICAgICAgICAgbWVzc2FnZTogYE5vIGNvbHVtbnMgZGV0ZWN0ZWQgZm9yICR7dGFyZ2V0RW50aXR5fS4gJHtlbnRpdHlUeXBlTGFiZWx9IHJldHVybmVkIDAgcm93cyBvciBjb2x1bW5zLiBWZXJpZnkgY29uZmlndXJhdGlvbiBvciBhZGQgY29sdW1ucyBtYW51YWxseS5gLFxuICAgICAgICAgICAga2luZDogJ2Vycm9yJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuaXNEZXRlY3RpbmdDb2x1bW5zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZ3JpZERldGVjdGlvblN0YXR1cy5zZXQoe1xuICAgICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZGV0ZWN0IGNvbHVtbnM6ICR7ZXJyPy5tZXNzYWdlIHx8ICdEYXRhYmFzZSBlcnJvcid9LiBZb3UgY2FuIGFkZCBjb2x1bW5zIG1hbnVhbGx5LmAsXG4gICAgICAgICAga2luZDogJ2Vycm9yJyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZXhwYW5kZWRTZWN0aW9ucyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe1xuICAgIGRhdGFzb3VyY2U6IHRydWUsXG4gICAgYWN0aW9uOiB0cnVlLFxuICAgIGdlbmVyYWw6IHRydWUsXG4gICAgbGF5b3V0OiBmYWxzZSxcbiAgICB2YWxpZGF0aW9uOiBmYWxzZSxcbiAgfSk7XG5cbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkU2VjdGlvbnMudXBkYXRlKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtzZWN0aW9uXTogIXByZXZbc2VjdGlvbl0sXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTZWN0aW9uRXhwYW5kZWQoc2VjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFNlY3Rpb25zKClbc2VjdGlvbl07XG4gIH1cblxuICBnZXRBY3Rpb25CYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhY3QgPSAoY29tcC5wcm9wZXJ0aWVzPy5bJ2FjdGlvbiddIGFzIHN0cmluZykgfHwgJ2V4ZWN1dGUtcmVwb3J0JztcbiAgICBzd2l0Y2ggKGFjdCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZS1yZXBvcnQnOlxuICAgICAgICByZXR1cm4gJ1J1biBSZXBvcnQnO1xuICAgICAgY2FzZSAncmVzZXQnOlxuICAgICAgICByZXR1cm4gJ1Jlc2V0IEZvcm0nO1xuICAgICAgY2FzZSAnZXhwb3J0Jzoge1xuICAgICAgICBjb25zdCBmbXQgPSAoKGNvbXAucHJvcGVydGllcz8uWydhY3Rpb25QYXJhbXMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LlsnZm9ybWF0J10gYXMgc3RyaW5nKSB8fCAnZXhjZWwnO1xuICAgICAgICByZXR1cm4gYEV4cG9ydCAoJHtmbXQudG9VcHBlckNhc2UoKX0pYDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ByaW50LXJlcG9ydCc6XG4gICAgICAgIHJldHVybiAnUHJpbnQgKC5ScHQpJztcbiAgICAgIGNhc2UgJ25hdmlnYXRlJzpcbiAgICAgICAgcmV0dXJuICdOYXZpZ2F0ZSc7XG4gICAgICBjYXNlICdjdXN0b20tZXZlbnQnOlxuICAgICAgICByZXR1cm4gJ0N1c3RvbSBFdmVudCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGFzb3VyY2VCYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBkcyA9IGNvbXAuZGF0YVNvdXJjZTtcbiAgICBpZiAoIWRzIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdzdGF0aWMnKSByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgICBpZiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5lbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBUYWJsZTogJHtkcy5lbnRpdHlOYW1lfWAgOiAnVGFibGUgLyBWaWV3JztcbiAgICB9XG4gICAgaWYgKGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBTUDogJHtkcy5lbnRpdHlOYW1lfWAgOiAnU3RvcmVkIFByb2MnO1xuICAgIH1cbiAgICByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgfVxuXG4gIGdldExheW91dEJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYW4gPSBjb21wLmxheW91dD8uY29sdW1uU3BhbiB8fCAoY29tcC50eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KTtcbiAgICByZXR1cm4gYCR7c3Bhbn0vJHt0aGlzLm1heENvbHVtbnMoKX0gY29sc2A7XG4gIH1cblxuICBnZXRWYWxpZGF0aW9uQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXAudmFsaWRhdGlvbj8ucmVxdWlyZWQgPyAnUmVxdWlyZWQnIDogJ09wdGlvbmFsJztcbiAgfVxufVxuIiwiICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIEVkaXRvciBIZWFkZXIgJiBUYWJzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVkaXRvci10YWJzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdwcm9wZXJ0aWVzJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRhYigncHJvcGVydGllcycpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkQ29tcG9uZW50KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlByb3BlcnRpZXM8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAncmVwb3J0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRhYigncmVwb3J0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJkZXNpZ25cIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+TGF5b3V0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdncmlkJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5HcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj48L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuIGJ0bi1jb2xsYXBzZS1pbnNwZWN0b3JcIlxuICAgICAgICAgIChjbGljayk9XCJjb2xsYXBzZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAgIHRpdGxlPVwiQ29sbGFwc2UgUHJvcGVydHkgRWRpdG9yXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29sbGFwc2UgUHJvcGVydHkgRWRpdG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1yaWdodFwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFZGl0b3IgQm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItYm9keVwiIGNka1Njcm9sbGFibGU+XG4gICAgICAgIDwhLS0gMS4gQ09NUE9ORU5UIFBST1BFUlRJRVMgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncHJvcGVydGllcycpIHtcbiAgICAgICAgICBAaWYgKHNlbGVjdGVkQ29tcG9uZW50KCk7IGFzIGNvbXApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc2VjdGlvbnMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8IS0tIENvbXBvbmVudCBJZGVudGlmaWVyIEhlYWRlciAoUGlubmVkIGF0IFRvcCkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wLWJhZGdlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS10eXBlXCI+e3sgY29tcC50eXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1pZFwiPnt7IGNvbXAuaWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlLWhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQ29tcG9uZW50KGNvbXAuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEdXBsaWNhdGUgY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb3B5XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb24gYnRuLWJhZGdlLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb21wb25lbnQoY29tcC5pZClcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkRlbGV0ZSBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kZXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZXNlbGVjdCBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWFjY29yZGlvblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gMS4gT1BUSU9OUyBEQVRBIFNPVVJDRSBBQ0NPUkRJT04gKGZvciBEcm9wZG93biAmIFJhZGlvKSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbXAudHlwZSA9PT0gJ2Ryb3Bkb3duJyB8fCBjb21wLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnZGF0YXNvdXJjZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdkYXRhc291cmNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIE9wdGlvbnMgRGF0YSBTb3VyY2Ugc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGF0YWJhc2VcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPk9wdGlvbnMgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldERhdGFzb3VyY2VCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdkYXRhc291cmNlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxDb21wb25lbnRzXT1cImFsbENvbXBvbmVudHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVEYXRhU291cmNlKT1cInVwZGF0ZUNvbXBEYXRhU291cmNlKGNvbXAuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQlVUVE9OIEFDVElPTiBBQ0NPUkRJT04gKEZJUlNUIGZvciBCdXR0b24pIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29tcC50eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignYWN0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEJ1dHRvbiBBY3Rpb24gc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlnaHRuaW5nXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5CdXR0b24gQWN0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRBY3Rpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gMi4gR0VORVJBTCBQUk9QRVJUSUVTIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2dlbmVyYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2dlbmVyYWwnKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEdlbmVyYWwgUHJvcGVydGllcyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+R2VuZXJhbCBQcm9wZXJ0aWVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29tcC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBjb21wLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdnZW5lcmFsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlTY2hlbWFdPVwicHJvcGVydHlTY2hlbWEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlKT1cInVwZGF0ZUNvbXAoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0KT1cImRlc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSAzLiBMQVlPVVQgJiBHUklEIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2xheW91dCcpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignbGF5b3V0JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBMYXlvdXQgJiBEaW1lbnNpb25zIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkxheW91dCAmIEdyaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRMYXlvdXRCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdsYXlvdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21heENvbHVtbnNdPVwibWF4Q29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVMYXlvdXQpPVwidXBkYXRlTGF5b3V0KCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZUhlaWdodCk9XCJ1cGRhdGVDb21wb25lbnRIZWlnaHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzZXREaW1lbnNpb25zKT1cInJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhjb21wLmlkLCBjb21wLnR5cGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gNC4gVkFMSURBVElPTiBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCd2YWxpZGF0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBWYWxpZGF0aW9uIFJ1bGVzIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+VmFsaWRhdGlvbiBSdWxlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldFZhbGlkYXRpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlVmFsaWRhdGlvbik9XCJ1cGRhdGVWYWxpZGF0aW9uKCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaWNvbi13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjdXJzb3JcIiBbc2l6ZV09XCIyNFwiIGNvbG9yPVwiIzY0NzQ4YlwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5LXRleHRcIj5TZWxlY3QgYSBjb21wb25lbnQgb24gdGhlIGNhbnZhcyB0byBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMuPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBSRVBPUlQgU0VUVElOR1MgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwb3J0Jykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLXJlcG9ydFxuICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvbigpXCJcbiAgICAgICAgICAgICh1cGRhdGVSZXBvcnQpPVwidXBkYXRlUmVwb3J0KCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlTGF5b3V0KT1cInVwZGF0ZUxheW91dFByb3AoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAzLiBSRVNVTFQgR1JJRCBTRVRUSU5HUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdncmlkJykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWdyaWRcbiAgICAgICAgICAgIFtncmlkXT1cImRlZmluaXRpb24oKS5ncmlkXCJcbiAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImdyaWREYXRhU291cmNlKClcIlxuICAgICAgICAgICAgW2F2YWlsYWJsZUVudGl0aWVzXT1cImF2YWlsYWJsZUVudGl0aWVzKClcIlxuICAgICAgICAgICAgW3Byb2NlZHVyZVBhcmFtZXRlcnNdPVwiZ3JpZFByb2NlZHVyZVBhcmFtZXRlcnMoKVwiXG4gICAgICAgICAgICBbYWxsQ29tcG9uZW50c109XCJhbGxDb21wb25lbnRzKClcIlxuICAgICAgICAgICAgW2lzRGV0ZWN0aW5nXT1cImlzRGV0ZWN0aW5nQ29sdW1ucygpXCJcbiAgICAgICAgICAgIFtzdGF0dXNNZXNzYWdlXT1cImdyaWREZXRlY3Rpb25TdGF0dXMoKT8ubWVzc2FnZSA/PyBudWxsXCJcbiAgICAgICAgICAgIFtzdGF0dXNLaW5kXT1cImdyaWREZXRlY3Rpb25TdGF0dXMoKT8ua2luZCA/PyBudWxsXCJcbiAgICAgICAgICAgIChlbnRpdHlDaGFuZ2VkKT1cIm9uR3JpZEVudGl0eUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAodXBkYXRlRGF0YVNvdXJjZVBhcmFtZXRlcnMpPVwib25HcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGFkZEdyaWQpPVwiYWRkUmVzdWx0R3JpZCgpXCJcbiAgICAgICAgICAgIChyZW1vdmVHcmlkKT1cInJlbW92ZVJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICAoYWRkQ29sdW1uKT1cImFkZENvbHVtbigpXCJcbiAgICAgICAgICAgIChhdXRvRGV0ZWN0Q29sdW1ucyk9XCJhdXRvRGV0ZWN0R3JpZENvbHVtbnMoKVwiXG4gICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1cInJlbW92ZUNvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgICAgICh1cGRhdGVDb2x1bW4pPVwidXBkYXRlQ29sdW1uKCRldmVudC5pbmRleCwgJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVPcHRpb24pPVwidXBkYXRlR3JpZE9wdGlvbigkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHVwZGF0ZVJvd0NsaWNrQWN0aW9uKT1cInVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4iXX0=