@ogidor/dashboard 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, Input, Output, EventEmitter, ContentChild, TemplateRef } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ContentChild, TemplateRef, ViewChild, Pipe } from '@angular/core';
2
2
  import { Subscription } from 'rxjs';
3
3
  import { GridCellDirective } from './custom-grid.component';
4
4
  import * as i0 from "@angular/core";
@@ -14,42 +14,44 @@ const DEFAULT_THEME = {
14
14
  accentColor: '#0a84ff',
15
15
  dangerColor: '#ff453a',
16
16
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
17
- // Header / Tabs
18
17
  tabsContainerColor: 'rgba(44,44,46,0.6)',
19
18
  tabActiveColor: '#3a3a3c',
20
19
  tabActiveTextColor: '#ffffff',
21
20
  tabHoverTextColor: '#e5e5ea',
22
21
  addWidgetButtonTextColor: '#ffffff',
23
- // Pop-out
24
22
  popoutTitleColor: '#ffffff',
25
- // Widget card
26
23
  widgetTitleColor: '#ffffff',
27
24
  dragHandleColor: 'rgba(255,255,255,0.2)',
28
25
  widgetBorderColor: 'rgba(255,255,255,0.07)',
29
26
  widgetButtonBgColor: 'rgba(255,255,255,0.07)',
30
27
  widgetButtonColor: 'rgba(255,255,255,0.5)',
31
- // Grid
32
28
  placeholderColor: '#0a84ff',
33
29
  resizeHandleColor: 'rgba(255,255,255,0.25)',
34
30
  };
31
+ export class OverflowActivePipe {
32
+ transform(pages, activePageId) {
33
+ return pages.some(p => p.id === activePageId);
34
+ }
35
+ }
36
+ OverflowActivePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverflowActivePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
37
+ OverflowActivePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: OverflowActivePipe, name: "overflowActive" });
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverflowActivePipe, decorators: [{
39
+ type: Pipe,
40
+ args: [{ name: 'overflowActive' }]
41
+ }] });
35
42
  export class DashboardComponent {
36
- constructor(stateService) {
43
+ constructor(stateService, cdr, zone) {
37
44
  this.stateService = stateService;
38
- /**
39
- * Emits when the user clicks "Add Widget".
40
- * The consumer should open their own dialog and call `stateService.addWidget(...)`.
41
- */
45
+ this.cdr = cdr;
46
+ this.zone = zone;
42
47
  this.addWidgetRequested = new EventEmitter();
43
- /**
44
- * Emits the Widget when the user clicks the edit (pen) icon on a card.
45
- * The consumer should open their own edit UI and call `stateService.updateWidget(...)`.
46
- */
47
48
  this.editWidgetRequested = new EventEmitter();
48
49
  this.resolvedTheme = { ...DEFAULT_THEME };
49
50
  this.wrapperStyles = {};
50
51
  this.pages = [];
51
52
  this.activePageId = '';
52
53
  this.isPoppedOut = false;
54
+ this.tabsOverflow = false;
53
55
  this.subs = new Subscription();
54
56
  }
55
57
  ngOnChanges(changes) {
@@ -72,8 +74,7 @@ export class DashboardComponent {
72
74
  this.subs.add(this.stateService.pages$.subscribe(pages => {
73
75
  this.pages = pages;
74
76
  if (this.isPoppedOut && hash) {
75
- const target = pages.find(p => p.id === hash);
76
- if (target)
77
+ if (pages.find(p => p.id === hash))
77
78
  this.stateService.setActivePage(hash);
78
79
  }
79
80
  this.updateActivePage();
@@ -83,7 +84,24 @@ export class DashboardComponent {
83
84
  this.updateActivePage();
84
85
  }));
85
86
  }
86
- ngOnDestroy() { this.subs.unsubscribe(); }
87
+ ngAfterViewInit() {
88
+ if (!this.tabsContainerRef)
89
+ return;
90
+ this.zone.runOutsideAngular(() => {
91
+ this.resizeObserver = new ResizeObserver(() => {
92
+ this.zone.run(() => this.checkOverflow());
93
+ });
94
+ this.resizeObserver.observe(this.tabsContainerRef.nativeElement);
95
+ });
96
+ // Also detect scroll so fade hides when scrolled to end
97
+ this.tabsContainerRef.nativeElement.addEventListener('scroll', () => {
98
+ this.zone.run(() => this.checkOverflow());
99
+ });
100
+ }
101
+ ngOnDestroy() {
102
+ this.subs.unsubscribe();
103
+ this.resizeObserver?.disconnect();
104
+ }
87
105
  onItemChanged(widget) {
88
106
  this.stateService.updateWidgetPosition(this.activePageId, widget.id, widget.x, widget.y, widget.cols, widget.rows);
89
107
  }
@@ -104,6 +122,14 @@ export class DashboardComponent {
104
122
  this.stateService.popOutPage(pageId);
105
123
  }
106
124
  serializeLayout() { return this.stateService.serializeLayout(); }
125
+ checkOverflow() {
126
+ const el = this.tabsContainerRef?.nativeElement;
127
+ if (!el)
128
+ return;
129
+ const atEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 4;
130
+ this.tabsOverflow = !atEnd && el.scrollWidth > el.clientWidth;
131
+ this.cdr.markForCheck();
132
+ }
107
133
  applyTheme() {
108
134
  this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };
109
135
  const t = this.resolvedTheme;
@@ -132,86 +158,85 @@ export class DashboardComponent {
132
158
  }
133
159
  updateActivePage() {
134
160
  this.activePage = this.pages.find(p => p.id === this.activePageId);
161
+ // scroll active tab into view
162
+ setTimeout(() => {
163
+ if (!this.tabsContainerRef)
164
+ return;
165
+ const active = this.tabsContainerRef.nativeElement.querySelector('.tab.active');
166
+ active?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
167
+ this.checkOverflow();
168
+ });
135
169
  }
136
170
  }
137
- DashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.DashboardStateService }], target: i0.ɵɵFactoryTarget.Component });
138
- DashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DashboardComponent, selector: "app-dashboard", inputs: { initialLayout: "initialLayout", theme: "theme" }, outputs: { addWidgetRequested: "addWidgetRequested", editWidgetRequested: "editWidgetRequested" }, queries: [{ propertyName: "cellTemplate", first: true, predicate: GridCellDirective, descendants: true, read: TemplateRef }], usesOnChanges: true, ngImport: i0, template: `
139
- <!-- ══════════════════════════════════════════════════════════
140
- POPPED-OUT MODE
141
- ══════════════════════════════════════════════════════════ -->
171
+ DashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.DashboardStateService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
172
+ DashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DashboardComponent, selector: "app-dashboard", inputs: { initialLayout: "initialLayout", theme: "theme" }, outputs: { addWidgetRequested: "addWidgetRequested", editWidgetRequested: "editWidgetRequested" }, queries: [{ propertyName: "cellTemplate", first: true, predicate: GridCellDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "tabsContainerRef", first: true, predicate: ["tabsContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
173
+ <!-- POPPED-OUT MODE -->
142
174
  <ng-container *ngIf="isPoppedOut; else normalMode">
143
175
  <div class="popout-wrapper" [ngStyle]="wrapperStyles">
144
176
  <header class="popout-header">
145
177
  <span class="popout-title">{{ activePage?.name }}</span>
146
178
  </header>
147
- <div class="grid-container">
148
- <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
149
- <ng-template gridCell let-widget="widget">
150
- <app-widget-renderer
151
- [widget]="widget"
152
- [theme]="resolvedTheme"
153
- (editRequested)="editWidgetRequested.emit($event)"
154
- (removeRequested)="onRemoveWidget($event)"
155
- >
156
- <ng-container
157
- *ngIf="cellTemplate"
158
- [ngTemplateOutlet]="cellTemplate"
159
- [ngTemplateOutletContext]="{ widget: widget }">
160
- </ng-container>
161
- </app-widget-renderer>
162
- </ng-template>
163
- </app-grid>
164
- </div>
179
+ <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
180
+ <ng-template gridCell let-widget="widget">
181
+ <app-widget-renderer [widget]="widget" [theme]="resolvedTheme"
182
+ (editRequested)="editWidgetRequested.emit($event)"
183
+ (removeRequested)="onRemoveWidget($event)">
184
+ <ng-container *ngIf="cellTemplate"
185
+ [ngTemplateOutlet]="cellTemplate"
186
+ [ngTemplateOutletContext]="{ widget: widget }">
187
+ </ng-container>
188
+ </app-widget-renderer>
189
+ </ng-template>
190
+ </app-grid>
165
191
  </div>
166
192
  </ng-container>
167
193
 
168
- <!-- ══════════════════════════════════════════════════════════
169
- NORMAL MODE
170
- ══════════════════════════════════════════════════════════ -->
194
+ <!-- NORMAL MODE -->
171
195
  <ng-template #normalMode>
172
196
  <div class="dashboard-wrapper" [ngStyle]="wrapperStyles">
173
197
  <main class="main-content">
174
198
 
175
199
  <header class="dashboard-header">
176
- <div class="tabs-container">
177
- <div
178
- *ngFor="let page of pages"
179
- class="tab"
180
- [class.active]="page.id === activePageId"
181
- (click)="onSelectPage(page.id)"
182
- >
183
- <span class="tab-name">{{ page.name }}</span>
184
- <button class="tab-action tab-popout" (click)="onPopOut($event, page.id)" title="Open in new window">
185
- <i class="la la-external-link-alt"></i>
186
- </button>
187
- <button class="tab-action tab-close" *ngIf="pages.length > 1" (click)="onRemovePage($event, page.id)" title="Close">
188
- <i class="la la-times"></i>
200
+
201
+ <!-- Tabs pill — scrollable, fades when overflowing -->
202
+ <div class="tabs-scroll-track">
203
+ <div class="tabs-container" #tabsContainer>
204
+ <div
205
+ *ngFor="let page of pages"
206
+ class="tab"
207
+ [class.active]="page.id === activePageId"
208
+ (click)="onSelectPage(page.id)"
209
+ >
210
+ <span class="tab-name">{{ page.name }}</span>
211
+ <button class="tab-action tab-popout" (click)="onPopOut($event, page.id)" title="Open in new window">
212
+ <i class="la la-external-link-alt"></i>
213
+ </button>
214
+ <button class="tab-action tab-close" *ngIf="pages.length > 1" (click)="onRemovePage($event, page.id)" title="Close">
215
+ <i class="la la-times"></i>
216
+ </button>
217
+ </div>
218
+ <button class="btn-add-page" (click)="onAddPage()" title="New workspace">
219
+ <i class="la la-plus"></i>
189
220
  </button>
190
221
  </div>
191
- <button class="btn-add-page" (click)="onAddPage()" title="New workspace">
192
- <i class="la la-plus"></i>
193
- </button>
222
+ <!-- fade hint shown when scrollable -->
223
+ <div class="tabs-fade-right" *ngIf="tabsOverflow"></div>
194
224
  </div>
195
225
 
196
- <!-- Add Widget button — consumer decides what happens -->
197
226
  <button class="btn-add-widget" (click)="addWidgetRequested.emit()" title="Add widget">
198
227
  <i class="la la-plus"></i>
199
228
  <span>Add Widget</span>
200
229
  </button>
230
+
201
231
  </header>
202
232
 
203
233
  <div class="grid-container">
204
234
  <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
205
235
  <ng-template gridCell let-widget="widget">
206
- <app-widget-renderer
207
- [widget]="widget"
208
- [theme]="resolvedTheme"
236
+ <app-widget-renderer [widget]="widget" [theme]="resolvedTheme"
209
237
  (editRequested)="editWidgetRequested.emit($event)"
210
- (removeRequested)="onRemoveWidget($event)"
211
- >
212
- <!-- Stamp consumer's cell template (if provided) inside the card body -->
213
- <ng-container
214
- *ngIf="cellTemplate"
238
+ (removeRequested)="onRemoveWidget($event)">
239
+ <ng-container *ngIf="cellTemplate"
215
240
  [ngTemplateOutlet]="cellTemplate"
216
241
  [ngTemplateOutletContext]="{ widget: widget }">
217
242
  </ng-container>
@@ -223,86 +248,77 @@ DashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
223
248
  </main>
224
249
  </div>
225
250
  </ng-template>
226
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;--dash-bg: #000000;--dash-panel-bg: #1c1c1e;--dash-card-bg: #2c2c2e;--dash-fore-color: #8e8e93;--dash-accent-color: #0a84ff;--dash-danger-color: #ff453a;--dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;--dash-tabs-container-color: rgba(44,44,46,.6);--dash-tab-active-color: #3a3a3c;--dash-tab-active-text: #ffffff;--dash-tab-hover-text: #e5e5ea;--dash-add-widget-text: #ffffff;--dash-popout-title-color: #ffffff;--dash-widget-title-color: #ffffff;--dash-drag-handle-color: rgba(255,255,255,.2);--dash-widget-border-color: rgba(255,255,255,.07);--dash-widget-btn-bg: rgba(255,255,255,.07);--dash-widget-btn-color: rgba(255,255,255,.5);--dash-placeholder-color: #0a84ff;--dash-resize-handle-color: rgba(255,255,255,.25)}.dashboard-wrapper{display:flex;flex:1;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.main-content{flex:1;display:flex;flex-direction:column;overflow:hidden;border-radius:40px;padding:20px;background:var(--dash-panel-bg);border:1px solid rgba(255,255,255,.05)}.popout-wrapper{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.popout-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding:10px 18px;background:var(--dash-panel-bg);border-radius:20px;border:1px solid rgba(255,255,255,.06);flex-shrink:0}.popout-title{font-size:16px;font-weight:700;color:var(--dash-popout-title-color)}.popout-wrapper .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0;background:var(--dash-panel-bg);padding:16px;border:1px solid rgba(255,255,255,.05)}.dashboard-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px}.tabs-container{display:flex;align-items:center;gap:8px;background:var(--dash-tabs-container-color);backdrop-filter:blur(10px);border-radius:25px;padding:6px}.tab{display:flex;align-items:center;gap:4px;padding:8px 14px 8px 18px;border-radius:20px;cursor:pointer;font-size:14px;font-weight:500;color:var(--dash-fore-color);transition:all .3s cubic-bezier(.25,.8,.25,1)}.tab.active{background:var(--dash-tab-active-color);color:var(--dash-tab-active-text)}.tab:hover:not(.active){color:var(--dash-tab-hover-text);background:rgba(255,255,255,.05)}.tab-name{flex:1;white-space:nowrap}.tab-action{background:transparent;border:none;color:var(--dash-fore-color);padding:2px;font-size:11px;cursor:pointer;opacity:0;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.tab:hover .tab-action{opacity:1}.tab-popout:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.18)}.tab-close:hover{color:var(--dash-danger-color);background:rgba(255,69,58,.2)}.btn-add-page{background:transparent;border:none;color:var(--dash-fore-color);padding:8px 16px;cursor:pointer;border-radius:20px;transition:all .2s}.btn-add-page:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.1)}.btn-add-widget{display:flex;align-items:center;gap:6px;background:var(--dash-accent-color);border:none;color:var(--dash-add-widget-text);font-size:14px;font-weight:600;padding:10px 20px;border-radius:22px;cursor:pointer;white-space:nowrap;transition:opacity .2s,transform .15s}.btn-add-widget:hover{opacity:.9;transform:translateY(-1px)}.btn-add-widget:active{transform:translateY(0)}.main-content .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0}app-grid{background:transparent;display:block;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.WidgetRendererComponent, selector: "app-widget-renderer", inputs: ["widget", "theme"], outputs: ["editRequested", "removeRequested"] }, { kind: "component", type: i4.CustomGridComponent, selector: "app-grid", inputs: ["widgets", "columns", "gap", "rowHeight", "minItemCols", "minItemRows"], outputs: ["itemChanged", "layoutChanged"] }, { kind: "directive", type: i4.GridCellDirective, selector: "[gridCell]" }] });
251
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;--dash-bg: #000000;--dash-panel-bg: #1c1c1e;--dash-card-bg: #2c2c2e;--dash-fore-color: #8e8e93;--dash-accent-color: #0a84ff;--dash-danger-color: #ff453a;--dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;--dash-tabs-container-color: rgba(44,44,46,.6);--dash-tab-active-color: #3a3a3c;--dash-tab-active-text: #ffffff;--dash-tab-hover-text: #e5e5ea;--dash-add-widget-text: #ffffff;--dash-popout-title-color: #ffffff;--dash-widget-title-color: #ffffff;--dash-drag-handle-color: rgba(255,255,255,.2);--dash-widget-border-color: rgba(255,255,255,.07);--dash-widget-btn-bg: rgba(255,255,255,.07);--dash-widget-btn-color: rgba(255,255,255,.5);--dash-placeholder-color: #0a84ff;--dash-resize-handle-color: rgba(255,255,255,.25)}.dashboard-wrapper{display:flex;flex:1;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.main-content{flex:1;display:flex;flex-direction:column;overflow:hidden;border-radius:40px;padding:20px;background:var(--dash-panel-bg);border:1px solid rgba(255,255,255,.05)}.popout-wrapper{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.popout-header{display:flex;align-items:center;margin-bottom:16px;padding:10px 18px;background:var(--dash-panel-bg);border-radius:20px;border:1px solid rgba(255,255,255,.06);flex-shrink:0}.popout-title{font-size:16px;font-weight:700;color:var(--dash-popout-title-color)}.popout-wrapper app-grid{flex:1;min-height:0;overflow:auto}.dashboard-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px;flex-shrink:0}.tabs-scroll-track{position:relative;flex:1;min-width:0}.tabs-container{display:flex;align-items:center;gap:8px;background:var(--dash-tabs-container-color);backdrop-filter:blur(10px);border-radius:25px;padding:6px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.tabs-container::-webkit-scrollbar{display:none}.tabs-fade-right{position:absolute;top:0;right:0;width:60px;height:100%;border-radius:0 25px 25px 0;pointer-events:none;background:linear-gradient(to right,transparent,var(--dash-panel-bg))}.tab{display:flex;align-items:center;gap:4px;padding:8px 14px 8px 18px;border-radius:20px;cursor:pointer;font-size:14px;font-weight:500;color:var(--dash-fore-color);white-space:nowrap;flex-shrink:0;transition:all .2s}.tab.active{background:var(--dash-tab-active-color);color:var(--dash-tab-active-text)}.tab:hover:not(.active){color:var(--dash-tab-hover-text);background:rgba(255,255,255,.05)}.tab-name{flex:1;white-space:nowrap}.tab-action{background:transparent;border:none;color:var(--dash-fore-color);padding:2px;font-size:11px;cursor:pointer;opacity:0;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.tab:hover .tab-action{opacity:1}.tab-popout:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.18)}.tab-close:hover{color:var(--dash-danger-color);background:rgba(255,69,58,.2)}.btn-add-page{background:transparent;border:none;color:var(--dash-fore-color);padding:8px 16px;cursor:pointer;border-radius:20px;flex-shrink:0;transition:all .2s}.btn-add-page:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.1)}.btn-add-widget{display:flex;align-items:center;gap:6px;background:var(--dash-accent-color);border:none;color:var(--dash-add-widget-text);font-size:14px;font-weight:600;padding:10px 20px;border-radius:22px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:opacity .2s,transform .15s}.btn-add-widget:hover{opacity:.9;transform:translateY(-1px)}.btn-add-widget:active{transform:translateY(0)}.main-content .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0}app-grid{background:transparent;display:block;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.WidgetRendererComponent, selector: "app-widget-renderer", inputs: ["widget", "theme"], outputs: ["editRequested", "removeRequested"] }, { kind: "component", type: i4.CustomGridComponent, selector: "app-grid", inputs: ["widgets", "columns", "gap", "rowHeight", "minItemCols", "minItemRows"], outputs: ["itemChanged", "layoutChanged"] }, { kind: "directive", type: i4.GridCellDirective, selector: "[gridCell]" }] });
227
252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardComponent, decorators: [{
228
253
  type: Component,
229
254
  args: [{ selector: 'app-dashboard', template: `
230
- <!-- ══════════════════════════════════════════════════════════
231
- POPPED-OUT MODE
232
- ══════════════════════════════════════════════════════════ -->
255
+ <!-- POPPED-OUT MODE -->
233
256
  <ng-container *ngIf="isPoppedOut; else normalMode">
234
257
  <div class="popout-wrapper" [ngStyle]="wrapperStyles">
235
258
  <header class="popout-header">
236
259
  <span class="popout-title">{{ activePage?.name }}</span>
237
260
  </header>
238
- <div class="grid-container">
239
- <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
240
- <ng-template gridCell let-widget="widget">
241
- <app-widget-renderer
242
- [widget]="widget"
243
- [theme]="resolvedTheme"
244
- (editRequested)="editWidgetRequested.emit($event)"
245
- (removeRequested)="onRemoveWidget($event)"
246
- >
247
- <ng-container
248
- *ngIf="cellTemplate"
249
- [ngTemplateOutlet]="cellTemplate"
250
- [ngTemplateOutletContext]="{ widget: widget }">
251
- </ng-container>
252
- </app-widget-renderer>
253
- </ng-template>
254
- </app-grid>
255
- </div>
261
+ <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
262
+ <ng-template gridCell let-widget="widget">
263
+ <app-widget-renderer [widget]="widget" [theme]="resolvedTheme"
264
+ (editRequested)="editWidgetRequested.emit($event)"
265
+ (removeRequested)="onRemoveWidget($event)">
266
+ <ng-container *ngIf="cellTemplate"
267
+ [ngTemplateOutlet]="cellTemplate"
268
+ [ngTemplateOutletContext]="{ widget: widget }">
269
+ </ng-container>
270
+ </app-widget-renderer>
271
+ </ng-template>
272
+ </app-grid>
256
273
  </div>
257
274
  </ng-container>
258
275
 
259
- <!-- ══════════════════════════════════════════════════════════
260
- NORMAL MODE
261
- ══════════════════════════════════════════════════════════ -->
276
+ <!-- NORMAL MODE -->
262
277
  <ng-template #normalMode>
263
278
  <div class="dashboard-wrapper" [ngStyle]="wrapperStyles">
264
279
  <main class="main-content">
265
280
 
266
281
  <header class="dashboard-header">
267
- <div class="tabs-container">
268
- <div
269
- *ngFor="let page of pages"
270
- class="tab"
271
- [class.active]="page.id === activePageId"
272
- (click)="onSelectPage(page.id)"
273
- >
274
- <span class="tab-name">{{ page.name }}</span>
275
- <button class="tab-action tab-popout" (click)="onPopOut($event, page.id)" title="Open in new window">
276
- <i class="la la-external-link-alt"></i>
277
- </button>
278
- <button class="tab-action tab-close" *ngIf="pages.length > 1" (click)="onRemovePage($event, page.id)" title="Close">
279
- <i class="la la-times"></i>
282
+
283
+ <!-- Tabs pill — scrollable, fades when overflowing -->
284
+ <div class="tabs-scroll-track">
285
+ <div class="tabs-container" #tabsContainer>
286
+ <div
287
+ *ngFor="let page of pages"
288
+ class="tab"
289
+ [class.active]="page.id === activePageId"
290
+ (click)="onSelectPage(page.id)"
291
+ >
292
+ <span class="tab-name">{{ page.name }}</span>
293
+ <button class="tab-action tab-popout" (click)="onPopOut($event, page.id)" title="Open in new window">
294
+ <i class="la la-external-link-alt"></i>
295
+ </button>
296
+ <button class="tab-action tab-close" *ngIf="pages.length > 1" (click)="onRemovePage($event, page.id)" title="Close">
297
+ <i class="la la-times"></i>
298
+ </button>
299
+ </div>
300
+ <button class="btn-add-page" (click)="onAddPage()" title="New workspace">
301
+ <i class="la la-plus"></i>
280
302
  </button>
281
303
  </div>
282
- <button class="btn-add-page" (click)="onAddPage()" title="New workspace">
283
- <i class="la la-plus"></i>
284
- </button>
304
+ <!-- fade hint shown when scrollable -->
305
+ <div class="tabs-fade-right" *ngIf="tabsOverflow"></div>
285
306
  </div>
286
307
 
287
- <!-- Add Widget button — consumer decides what happens -->
288
308
  <button class="btn-add-widget" (click)="addWidgetRequested.emit()" title="Add widget">
289
309
  <i class="la la-plus"></i>
290
310
  <span>Add Widget</span>
291
311
  </button>
312
+
292
313
  </header>
293
314
 
294
315
  <div class="grid-container">
295
316
  <app-grid [widgets]="activePage?.widgets || []" (itemChanged)="onItemChanged($event)">
296
317
  <ng-template gridCell let-widget="widget">
297
- <app-widget-renderer
298
- [widget]="widget"
299
- [theme]="resolvedTheme"
318
+ <app-widget-renderer [widget]="widget" [theme]="resolvedTheme"
300
319
  (editRequested)="editWidgetRequested.emit($event)"
301
- (removeRequested)="onRemoveWidget($event)"
302
- >
303
- <!-- Stamp consumer's cell template (if provided) inside the card body -->
304
- <ng-container
305
- *ngIf="cellTemplate"
320
+ (removeRequested)="onRemoveWidget($event)">
321
+ <ng-container *ngIf="cellTemplate"
306
322
  [ngTemplateOutlet]="cellTemplate"
307
323
  [ngTemplateOutletContext]="{ widget: widget }">
308
324
  </ng-container>
@@ -314,8 +330,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
314
330
  </main>
315
331
  </div>
316
332
  </ng-template>
317
- `, styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;--dash-bg: #000000;--dash-panel-bg: #1c1c1e;--dash-card-bg: #2c2c2e;--dash-fore-color: #8e8e93;--dash-accent-color: #0a84ff;--dash-danger-color: #ff453a;--dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;--dash-tabs-container-color: rgba(44,44,46,.6);--dash-tab-active-color: #3a3a3c;--dash-tab-active-text: #ffffff;--dash-tab-hover-text: #e5e5ea;--dash-add-widget-text: #ffffff;--dash-popout-title-color: #ffffff;--dash-widget-title-color: #ffffff;--dash-drag-handle-color: rgba(255,255,255,.2);--dash-widget-border-color: rgba(255,255,255,.07);--dash-widget-btn-bg: rgba(255,255,255,.07);--dash-widget-btn-color: rgba(255,255,255,.5);--dash-placeholder-color: #0a84ff;--dash-resize-handle-color: rgba(255,255,255,.25)}.dashboard-wrapper{display:flex;flex:1;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.main-content{flex:1;display:flex;flex-direction:column;overflow:hidden;border-radius:40px;padding:20px;background:var(--dash-panel-bg);border:1px solid rgba(255,255,255,.05)}.popout-wrapper{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.popout-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding:10px 18px;background:var(--dash-panel-bg);border-radius:20px;border:1px solid rgba(255,255,255,.06);flex-shrink:0}.popout-title{font-size:16px;font-weight:700;color:var(--dash-popout-title-color)}.popout-wrapper .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0;background:var(--dash-panel-bg);padding:16px;border:1px solid rgba(255,255,255,.05)}.dashboard-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px}.tabs-container{display:flex;align-items:center;gap:8px;background:var(--dash-tabs-container-color);backdrop-filter:blur(10px);border-radius:25px;padding:6px}.tab{display:flex;align-items:center;gap:4px;padding:8px 14px 8px 18px;border-radius:20px;cursor:pointer;font-size:14px;font-weight:500;color:var(--dash-fore-color);transition:all .3s cubic-bezier(.25,.8,.25,1)}.tab.active{background:var(--dash-tab-active-color);color:var(--dash-tab-active-text)}.tab:hover:not(.active){color:var(--dash-tab-hover-text);background:rgba(255,255,255,.05)}.tab-name{flex:1;white-space:nowrap}.tab-action{background:transparent;border:none;color:var(--dash-fore-color);padding:2px;font-size:11px;cursor:pointer;opacity:0;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.tab:hover .tab-action{opacity:1}.tab-popout:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.18)}.tab-close:hover{color:var(--dash-danger-color);background:rgba(255,69,58,.2)}.btn-add-page{background:transparent;border:none;color:var(--dash-fore-color);padding:8px 16px;cursor:pointer;border-radius:20px;transition:all .2s}.btn-add-page:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.1)}.btn-add-widget{display:flex;align-items:center;gap:6px;background:var(--dash-accent-color);border:none;color:var(--dash-add-widget-text);font-size:14px;font-weight:600;padding:10px 20px;border-radius:22px;cursor:pointer;white-space:nowrap;transition:opacity .2s,transform .15s}.btn-add-widget:hover{opacity:.9;transform:translateY(-1px)}.btn-add-widget:active{transform:translateY(0)}.main-content .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0}app-grid{background:transparent;display:block;height:100%;width:100%}\n"] }]
318
- }], ctorParameters: function () { return [{ type: i1.DashboardStateService }]; }, propDecorators: { initialLayout: [{
333
+ `, styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;--dash-bg: #000000;--dash-panel-bg: #1c1c1e;--dash-card-bg: #2c2c2e;--dash-fore-color: #8e8e93;--dash-accent-color: #0a84ff;--dash-danger-color: #ff453a;--dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;--dash-tabs-container-color: rgba(44,44,46,.6);--dash-tab-active-color: #3a3a3c;--dash-tab-active-text: #ffffff;--dash-tab-hover-text: #e5e5ea;--dash-add-widget-text: #ffffff;--dash-popout-title-color: #ffffff;--dash-widget-title-color: #ffffff;--dash-drag-handle-color: rgba(255,255,255,.2);--dash-widget-border-color: rgba(255,255,255,.07);--dash-widget-btn-bg: rgba(255,255,255,.07);--dash-widget-btn-color: rgba(255,255,255,.5);--dash-placeholder-color: #0a84ff;--dash-resize-handle-color: rgba(255,255,255,.25)}.dashboard-wrapper{display:flex;flex:1;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.main-content{flex:1;display:flex;flex-direction:column;overflow:hidden;border-radius:40px;padding:20px;background:var(--dash-panel-bg);border:1px solid rgba(255,255,255,.05)}.popout-wrapper{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden;padding:16px;box-sizing:border-box;background:var(--dash-bg);color:var(--dash-fore-color);font-family:var(--dash-font-family)}.popout-header{display:flex;align-items:center;margin-bottom:16px;padding:10px 18px;background:var(--dash-panel-bg);border-radius:20px;border:1px solid rgba(255,255,255,.06);flex-shrink:0}.popout-title{font-size:16px;font-weight:700;color:var(--dash-popout-title-color)}.popout-wrapper app-grid{flex:1;min-height:0;overflow:auto}.dashboard-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px;flex-shrink:0}.tabs-scroll-track{position:relative;flex:1;min-width:0}.tabs-container{display:flex;align-items:center;gap:8px;background:var(--dash-tabs-container-color);backdrop-filter:blur(10px);border-radius:25px;padding:6px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.tabs-container::-webkit-scrollbar{display:none}.tabs-fade-right{position:absolute;top:0;right:0;width:60px;height:100%;border-radius:0 25px 25px 0;pointer-events:none;background:linear-gradient(to right,transparent,var(--dash-panel-bg))}.tab{display:flex;align-items:center;gap:4px;padding:8px 14px 8px 18px;border-radius:20px;cursor:pointer;font-size:14px;font-weight:500;color:var(--dash-fore-color);white-space:nowrap;flex-shrink:0;transition:all .2s}.tab.active{background:var(--dash-tab-active-color);color:var(--dash-tab-active-text)}.tab:hover:not(.active){color:var(--dash-tab-hover-text);background:rgba(255,255,255,.05)}.tab-name{flex:1;white-space:nowrap}.tab-action{background:transparent;border:none;color:var(--dash-fore-color);padding:2px;font-size:11px;cursor:pointer;opacity:0;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.tab:hover .tab-action{opacity:1}.tab-popout:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.18)}.tab-close:hover{color:var(--dash-danger-color);background:rgba(255,69,58,.2)}.btn-add-page{background:transparent;border:none;color:var(--dash-fore-color);padding:8px 16px;cursor:pointer;border-radius:20px;flex-shrink:0;transition:all .2s}.btn-add-page:hover{color:var(--dash-accent-color);background:rgba(10,132,255,.1)}.btn-add-widget{display:flex;align-items:center;gap:6px;background:var(--dash-accent-color);border:none;color:var(--dash-add-widget-text);font-size:14px;font-weight:600;padding:10px 20px;border-radius:22px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:opacity .2s,transform .15s}.btn-add-widget:hover{opacity:.9;transform:translateY(-1px)}.btn-add-widget:active{transform:translateY(0)}.main-content .grid-container{flex:1;overflow:auto;border-radius:24px;min-height:0}app-grid{background:transparent;display:block;height:100%;width:100%}\n"] }]
334
+ }], ctorParameters: function () { return [{ type: i1.DashboardStateService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { initialLayout: [{
319
335
  type: Input
320
336
  }], theme: [{
321
337
  type: Input
@@ -326,5 +342,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
326
342
  }], cellTemplate: [{
327
343
  type: ContentChild,
328
344
  args: [GridCellDirective, { read: TemplateRef }]
345
+ }], tabsContainerRef: [{
346
+ type: ViewChild,
347
+ args: ['tabsContainer']
329
348
  }] } });
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvZGFzaGJvYXJkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxFQUM1QixZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFDdkQsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBRTVELE1BQU0sYUFBYSxHQUE2QjtJQUM5QyxlQUFlLEVBQVUsU0FBUztJQUNsQyxVQUFVLEVBQWUsU0FBUztJQUNsQyxlQUFlLEVBQVUsU0FBUztJQUNsQyxTQUFTLEVBQWdCLFNBQVM7SUFDbEMsV0FBVyxFQUFjLFNBQVM7SUFDbEMsV0FBVyxFQUFjLFNBQVM7SUFDbEMsVUFBVSxFQUFlLHFGQUFxRjtJQUM5RyxnQkFBZ0I7SUFDaEIsa0JBQWtCLEVBQU8sb0JBQW9CO0lBQzdDLGNBQWMsRUFBVyxTQUFTO0lBQ2xDLGtCQUFrQixFQUFPLFNBQVM7SUFDbEMsaUJBQWlCLEVBQVEsU0FBUztJQUNsQyx3QkFBd0IsRUFBQyxTQUFTO0lBQ2xDLFVBQVU7SUFDVixnQkFBZ0IsRUFBUyxTQUFTO0lBQ2xDLGNBQWM7SUFDZCxnQkFBZ0IsRUFBUyxTQUFTO0lBQ2xDLGVBQWUsRUFBVSx1QkFBdUI7SUFDaEQsaUJBQWlCLEVBQVEsd0JBQXdCO0lBQ2pELG1CQUFtQixFQUFNLHdCQUF3QjtJQUNqRCxpQkFBaUIsRUFBUSx1QkFBdUI7SUFDaEQsT0FBTztJQUNQLGdCQUFnQixFQUFTLFNBQVM7SUFDbEMsaUJBQWlCLEVBQVEsd0JBQXdCO0NBQ2xELENBQUM7QUF3TkYsTUFBTSxPQUFPLGtCQUFrQjtJQWlDN0IsWUFBbUIsWUFBbUM7UUFB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ZSxZQUNmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0ZUOzRHQTZIUSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFNSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBTUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQU9QLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT3V0cHV0LCBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkLCBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhc2hib2FyZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZSwgV2lkZ2V0LCBEYXNoYm9hcmRUaGVtZSB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JpZENlbGxEaXJlY3RpdmUgfSBmcm9tICcuL2N1c3RvbS1ncmlkLmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfVEhFTUU6IFJlcXVpcmVkPERhc2hib2FyZFRoZW1lPiA9IHtcbiAgYmFja2dyb3VuZENvbG9yOiAgICAgICAgICcjMDAwMDAwJyxcbiAgcGFuZWxDb2xvcjogICAgICAgICAgICAgICcjMWMxYzFlJyxcbiAgd2lkZ2V0Q2FyZENvbG9yOiAgICAgICAgICcjMmMyYzJlJyxcbiAgZm9yZUNvbG9yOiAgICAgICAgICAgICAgICcjOGU4ZTkzJyxcbiAgYWNjZW50Q29sb3I6ICAgICAgICAgICAgICcjMGE4NGZmJyxcbiAgZGFuZ2VyQ29sb3I6ICAgICAgICAgICAgICcjZmY0NTNhJyxcbiAgZm9udEZhbWlseTogICAgICAgICAgICAgICctYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJyxcbiAgLy8gSGVhZGVyIC8gVGFic1xuICB0YWJzQ29udGFpbmVyQ29sb3I6ICAgICAgJ3JnYmEoNDQsNDQsNDYsMC42KScsXG4gIHRhYkFjdGl2ZUNvbG9yOiAgICAgICAgICAnIzNhM2EzYycsXG4gIHRhYkFjdGl2ZVRleHRDb2xvcjogICAgICAnI2ZmZmZmZicsXG4gIHRhYkhvdmVyVGV4dENvbG9yOiAgICAgICAnI2U1ZTVlYScsXG4gIGFkZFdpZGdldEJ1dHRvblRleHRDb2xvcjonI2ZmZmZmZicsXG4gIC8vIFBvcC1vdXRcbiAgcG9wb3V0VGl0bGVDb2xvcjogICAgICAgICcjZmZmZmZmJyxcbiAgLy8gV2lkZ2V0IGNhcmRcbiAgd2lkZ2V0VGl0bGVDb2xvcjogICAgICAgICcjZmZmZmZmJyxcbiAgZHJhZ0hhbmRsZUNvbG9yOiAgICAgICAgICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICB3aWRnZXRCb3JkZXJDb2xvcjogICAgICAgJ3JnYmEoMjU1LDI1NSwyNTUsMC4wNyknLFxuICB3aWRnZXRCdXR0b25CZ0NvbG9yOiAgICAgJ3JnYmEoMjU1LDI1NSwyNTUsMC4wNyknLFxuICB3aWRnZXRCdXR0b25Db2xvcjogICAgICAgJ3JnYmEoMjU1LDI1NSwyNTUsMC41KScsXG4gIC8vIEdyaWRcbiAgcGxhY2Vob2xkZXJDb2xvcjogICAgICAgICcjMGE4NGZmJyxcbiAgcmVzaXplSGFuZGxlQ29sb3I6ICAgICAgICdyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpJyxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICAgICAgICBQT1BQRUQtT1VUIE1PREVcbiAgICAgICAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQb3BwZWRPdXQ7IGVsc2Ugbm9ybWFsTW9kZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBvcG91dC13cmFwcGVyXCIgW25nU3R5bGVdPVwid3JhcHBlclN0eWxlc1wiPlxuICAgICAgICA8aGVhZGVyIGNsYXNzPVwicG9wb3V0LWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9wb3V0LXRpdGxlXCI+e3sgYWN0aXZlUGFnZT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxhcHAtZ3JpZCBbd2lkZ2V0c109XCJhY3RpdmVQYWdlPy53aWRnZXRzIHx8IFtdXCIgKGl0ZW1DaGFuZ2VkKT1cIm9uSXRlbUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGdyaWRDZWxsIGxldC13aWRnZXQ9XCJ3aWRnZXRcIj5cbiAgICAgICAgICAgICAgPGFwcC13aWRnZXQtcmVuZGVyZXJcbiAgICAgICAgICAgICAgICBbd2lkZ2V0XT1cIndpZGdldFwiXG4gICAgICAgICAgICAgICAgW3RoZW1lXT1cInJlc29sdmVkVGhlbWVcIlxuICAgICAgICAgICAgICAgIChlZGl0UmVxdWVzdGVkKT1cImVkaXRXaWRnZXRSZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlUmVxdWVzdGVkKT1cIm9uUmVtb3ZlV2lkZ2V0KCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHdpZGdldDogd2lkZ2V0IH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9hcHAtd2lkZ2V0LXJlbmRlcmVyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2FwcC1ncmlkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICAgICAgIE5PUk1BTCBNT0RFXG4gICAgICAgICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNub3JtYWxNb2RlPlxuICAgICAgPGRpdiBjbGFzcz1cImRhc2hib2FyZC13cmFwcGVyXCIgW25nU3R5bGVdPVwid3JhcHBlclN0eWxlc1wiPlxuICAgICAgICA8bWFpbiBjbGFzcz1cIm1haW4tY29udGVudFwiPlxuXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRhc2hib2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZXNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGFiXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInBhZ2UuaWQgPT09IGFjdGl2ZVBhZ2VJZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0UGFnZShwYWdlLmlkKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1uYW1lXCI+e3sgcGFnZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYWN0aW9uIHRhYi1wb3BvdXRcIiAoY2xpY2spPVwib25Qb3BPdXQoJGV2ZW50LCBwYWdlLmlkKVwiIHRpdGxlPVwiT3BlbiBpbiBuZXcgd2luZG93XCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxhIGxhLWV4dGVybmFsLWxpbmstYWx0XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYWN0aW9uIHRhYi1jbG9zZVwiICpuZ0lmPVwicGFnZXMubGVuZ3RoID4gMVwiIChjbGljayk9XCJvblJlbW92ZVBhZ2UoJGV2ZW50LCBwYWdlLmlkKVwiIHRpdGxlPVwiQ2xvc2VcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGEgbGEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFkZC1wYWdlXCIgKGNsaWNrKT1cIm9uQWRkUGFnZSgpXCIgdGl0bGU9XCJOZXcgd29ya3NwYWNlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsYSBsYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEFkZCBXaWRnZXQgYnV0dG9uIOKAlCBjb25zdW1lciBkZWNpZGVzIHdoYXQgaGFwcGVucyAtLT5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYWRkLXdpZGdldFwiIChjbGljayk9XCJhZGRXaWRnZXRSZXF1ZXN0ZWQuZW1pdCgpXCIgdGl0bGU9XCJBZGQgd2lkZ2V0XCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwibGEgbGEtcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+QWRkIFdpZGdldDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YXBwLWdyaWQgW3dpZGdldHNdPVwiYWN0aXZlUGFnZT8ud2lkZ2V0cyB8fCBbXVwiIChpdGVtQ2hhbmdlZCk9XCJvbkl0ZW1DaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGdyaWRDZWxsIGxldC13aWRnZXQ9XCJ3aWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgW3dpZGdldF09XCJ3aWRnZXRcIlxuICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInJlc29sdmVkVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgKGVkaXRSZXF1ZXN0ZWQpPVwiZWRpdFdpZGdldFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHJlbW92ZVJlcXVlc3RlZCk9XCJvblJlbW92ZVdpZGdldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8IS0tIFN0YW1wIGNvbnN1bWVyJ3MgY2VsbCB0ZW1wbGF0ZSAoaWYgcHJvdmlkZWQpIGluc2lkZSB0aGUgY2FyZCBib2R5IC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHdpZGdldDogd2lkZ2V0IH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYXBwLXdpZGdldC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvYXBwLWdyaWQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9tYWluPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgLS1kYXNoLWJnOiAgICAgICAgICAgICAgICAgICAgIzAwMDAwMDtcbiAgICAgIC0tZGFzaC1wYW5lbC1iZzogICAgICAgICAgICAgICMxYzFjMWU7XG4gICAgICAtLWRhc2gtY2FyZC1iZzogICAgICAgICAgICAgICAjMmMyYzJlO1xuICAgICAgLS1kYXNoLWZvcmUtY29sb3I6ICAgICAgICAgICAgIzhlOGU5MztcbiAgICAgIC0tZGFzaC1hY2NlbnQtY29sb3I6ICAgICAgICAgICMwYTg0ZmY7XG4gICAgICAtLWRhc2gtZGFuZ2VyLWNvbG9yOiAgICAgICAgICAjZmY0NTNhO1xuICAgICAgLS1kYXNoLWZvbnQtZmFtaWx5OiAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICAgIC0tZGFzaC10YWJzLWNvbnRhaW5lci1jb2xvcjogIHJnYmEoNDQsNDQsNDYsMC42KTtcbiAgICAgIC0tZGFzaC10YWItYWN0aXZlLWNvbG9yOiAgICAgICMzYTNhM2M7XG4gICAgICAtLWRhc2gtdGFiLWFjdGl2ZS10ZXh0OiAgICAgICAjZmZmZmZmO1xuICAgICAgLS1kYXNoLXRhYi1ob3Zlci10ZXh0OiAgICAgICAgI2U1ZTVlYTtcbiAgICAgIC0tZGFzaC1hZGQtd2lkZ2V0LXRleHQ6ICAgICAgICNmZmZmZmY7XG4gICAgICAtLWRhc2gtcG9wb3V0LXRpdGxlLWNvbG9yOiAgICAjZmZmZmZmO1xuICAgICAgLS1kYXNoLXdpZGdldC10aXRsZS1jb2xvcjogICAgI2ZmZmZmZjtcbiAgICAgIC0tZGFzaC1kcmFnLWhhbmRsZS1jb2xvcjogICAgIHJnYmEoMjU1LDI1NSwyNTUsMC4yKTtcbiAgICAgIC0tZGFzaC13aWRnZXQtYm9yZGVyLWNvbG9yOiAgIHJnYmEoMjU1LDI1NSwyNTUsMC4wNyk7XG4gICAgICAtLWRhc2gtd2lkZ2V0LWJ0bi1iZzogICAgICAgICByZ2JhKDI1NSwyNTUsMjU1LDAuMDcpO1xuICAgICAgLS1kYXNoLXdpZGdldC1idG4tY29sb3I6ICAgICAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpO1xuICAgICAgLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yOiAgICAgIzBhODRmZjtcbiAgICAgIC0tZGFzaC1yZXNpemUtaGFuZGxlLWNvbG9yOiAgIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSk7XG4gICAgfVxuXG4gICAgLyog4pSA4pSAIE5vcm1hbCBsYXlvdXQg4pSA4pSAICovXG4gICAgLmRhc2hib2FyZC13cmFwcGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtYmcpO1xuICAgICAgY29sb3I6IHZhcigtLWRhc2gtZm9yZS1jb2xvcik7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tZGFzaC1mb250LWZhbWlseSk7XG4gICAgfVxuICAgIC5tYWluLWNvbnRlbnQge1xuICAgICAgZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDQwcHg7IHBhZGRpbmc6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kYXNoLXBhbmVsLWJnKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7XG4gICAgfVxuXG4gICAgLyog4pSA4pSAIFBvcC1vdXQgbGF5b3V0IOKUgOKUgCAqL1xuICAgIC5wb3BvdXQtd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMTtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1kYXNoLWZvbnQtZmFtaWx5KTtcbiAgICB9XG4gICAgLnBvcG91dC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxOHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1wYW5lbC1iZyk7IGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpOyBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnBvcG91dC10aXRsZSB7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6IHZhcigtLWRhc2gtcG9wb3V0LXRpdGxlLWNvbG9yKTsgfVxuICAgIC5wb3BvdXQtd3JhcHBlciAuZ3JpZC1jb250YWluZXIge1xuICAgICAgZmxleDogMTsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1yYWRpdXM6IDI0cHg7IG1pbi1oZWlnaHQ6IDA7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kYXNoLXBhbmVsLWJnKTsgcGFkZGluZzogMTZweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7XG4gICAgfVxuXG4gICAgLyog4pSA4pSAIEhlYWRlciDilIDilIAgKi9cbiAgICAuZGFzaGJvYXJkLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OyBnYXA6IDEycHg7XG4gICAgfVxuICAgIC50YWJzLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtdGFicy1jb250YWluZXItY29sb3IpOyBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7XG4gICAgICBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiA2cHg7XG4gICAgfVxuICAgIC50YWIge1xuICAgICAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA0cHg7XG4gICAgICBwYWRkaW5nOiA4cHggMTRweCA4cHggMThweDsgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLWRhc2gtZm9yZS1jb2xvcik7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBjdWJpYy1iZXppZXIoMC4yNSwwLjgsMC4yNSwxKTtcbiAgICB9XG4gICAgLnRhYi5hY3RpdmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kYXNoLXRhYi1hY3RpdmUtY29sb3IpOyBjb2xvcjogdmFyKC0tZGFzaC10YWItYWN0aXZlLXRleHQpOyB9XG4gICAgLnRhYjpob3Zlcjpub3QoLmFjdGl2ZSkgeyBjb2xvcjogdmFyKC0tZGFzaC10YWItaG92ZXItdGV4dCk7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7IH1cbiAgICAudGFiLW5hbWUgeyBmbGV4OiAxOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG4gICAgLnRhYi1hY3Rpb24ge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogbm9uZTsgY29sb3I6IHZhcigtLWRhc2gtZm9yZS1jb2xvcik7XG4gICAgICBwYWRkaW5nOiAycHg7IGZvbnQtc2l6ZTogMTFweDsgY3Vyc29yOiBwb2ludGVyOyBvcGFjaXR5OiAwOyBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOyBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnRhYjpob3ZlciAudGFiLWFjdGlvbiB7IG9wYWNpdHk6IDE7IH1cbiAgICAudGFiLXBvcG91dDpob3ZlciB7IGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvcik7IGJhY2tncm91bmQ6IHJnYmEoMTAsMTMyLDI1NSwwLjE4KTsgfVxuICAgIC50YWItY2xvc2U6aG92ZXIgIHsgY29sb3I6IHZhcigtLWRhc2gtZGFuZ2VyLWNvbG9yKTsgYmFja2dyb3VuZDogcmdiYSgyNTUsNjksNTgsMC4yKTsgfVxuICAgIC5idG4tYWRkLXBhZ2Uge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogbm9uZTsgY29sb3I6IHZhcigtLWRhc2gtZm9yZS1jb2xvcik7XG4gICAgICBwYWRkaW5nOiA4cHggMTZweDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXItcmFkaXVzOiAyMHB4OyB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICB9XG4gICAgLmJ0bi1hZGQtcGFnZTpob3ZlciB7IGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvcik7IGJhY2tncm91bmQ6IHJnYmEoMTAsMTMyLDI1NSwwLjEpOyB9XG4gICAgLmJ0bi1hZGQtd2lkZ2V0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1hY2NlbnQtY29sb3IpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB2YXIoLS1kYXNoLWFkZC13aWRnZXQtdGV4dCk7XG4gICAgICBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyLXJhZGl1czogMjJweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMTVzO1xuICAgIH1cbiAgICAuYnRuLWFkZC13aWRnZXQ6aG92ZXIgIHsgb3BhY2l0eTogMC45OyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7IH1cbiAgICAuYnRuLWFkZC13aWRnZXQ6YWN0aXZlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XG5cbiAgICAvKiDilIDilIAgR3JpZCDilIDilIAgKi9cbiAgICAubWFpbi1jb250ZW50IC5ncmlkLWNvbnRhaW5lciB7IGZsZXg6IDE7IG92ZXJmbG93OiBhdXRvOyBib3JkZXItcmFkaXVzOiAyNHB4OyBtaW4taGVpZ2h0OiAwOyB9XG4gICAgYXBwLWdyaWQgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgZGlzcGxheTogYmxvY2s7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGluaXRpYWxMYXlvdXQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRoZW1lPzogRGFzaGJvYXJkVGhlbWU7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiQWRkIFdpZGdldFwiLlxuICAgKiBUaGUgY29uc3VtZXIgc2hvdWxkIG9wZW4gdGhlaXIgb3duIGRpYWxvZyBhbmQgY2FsbCBgc3RhdGVTZXJ2aWNlLmFkZFdpZGdldCguLi4pYC5cbiAgICovXG4gIEBPdXRwdXQoKSBhZGRXaWRnZXRSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBXaWRnZXQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGVkaXQgKHBlbikgaWNvbiBvbiBhIGNhcmQuXG4gICAqIFRoZSBjb25zdW1lciBzaG91bGQgb3BlbiB0aGVpciBvd24gZWRpdCBVSSBhbmQgY2FsbCBgc3RhdGVTZXJ2aWNlLnVwZGF0ZVdpZGdldCguLi4pYC5cbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0V2lkZ2V0UmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxXaWRnZXQ+KCk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsOiBjb25zdW1lciBjYW4gcHJvdmlkZSBhbiBgPG5nLXRlbXBsYXRlIHdpZGdldENlbGwgbGV0LXdpZGdldD1cIndpZGdldFwiPmAgY2hpbGRcbiAgICogdG8gcmVuZGVyIGN1c3RvbSBjb250ZW50IGluc2lkZSBldmVyeSBjYXJkIGJvZHkuXG4gICAqL1xuICBAQ29udGVudENoaWxkKEdyaWRDZWxsRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGNlbGxUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgd2lkZ2V0OiBXaWRnZXQgfT47XG5cbiAgcmVzb2x2ZWRUaGVtZTogUmVxdWlyZWQ8RGFzaGJvYXJkVGhlbWU+ID0geyAuLi5ERUZBVUxUX1RIRU1FIH07XG4gIHdyYXBwZXJTdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBwYWdlczogUGFnZVtdID0gW107XG4gIGFjdGl2ZVBhZ2VJZCA9ICcnO1xuICBhY3RpdmVQYWdlPzogUGFnZTtcbiAgaXNQb3BwZWRPdXQgPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHN0YXRlU2VydmljZTogRGFzaGJvYXJkU3RhdGVTZXJ2aWNlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sndGhlbWUnXSB8fCBjaGFuZ2VzWydpbml0aWFsTGF5b3V0J10pIHRoaXMuYXBwbHlUaGVtZSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hcHBseVRoZW1lKCk7XG5cbiAgICBpZiAodGhpcy5pbml0aWFsTGF5b3V0KSB7XG4gICAgICB0cnkgeyB0aGlzLnN0YXRlU2VydmljZS5sb2FkTGF5b3V0KEpTT04ucGFyc2UodGhpcy5pbml0aWFsTGF5b3V0KSk7IH1cbiAgICAgIGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ1tEYXNoYm9hcmRdIEZhaWxlZCB0byBwYXJzZSBpbml0aWFsTGF5b3V0JywgZSk7IH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g/LnJlcGxhY2UoJyMnLCAnJykudHJpbSgpO1xuICAgIGlmIChoYXNoKSB0aGlzLmlzUG9wcGVkT3V0ID0gdHJ1ZTtcblxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5zdGF0ZVNlcnZpY2UucGFnZXMkLnN1YnNjcmliZShwYWdlcyA9PiB7XG4gICAgICB0aGlzLnBhZ2VzID0gcGFnZXM7XG4gICAgICBpZiAodGhpcy5pc1BvcHBlZE91dCAmJiBoYXNoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhZ2VzLmZpbmQocCA9PiBwLmlkID09PSBoYXNoKTtcbiAgICAgICAgaWYgKHRhcmdldCkgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0QWN0aXZlUGFnZShoYXNoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQWN0aXZlUGFnZSgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnN1YnMuYWRkKHRoaXMuc3RhdGVTZXJ2aWNlLmFjdGl2ZVBhZ2VJZCQuc3Vic2NyaWJlKGlkID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlUGFnZUlkID0gaWQ7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVBhZ2UoKTtcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHsgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7IH1cblxuICBvbkl0ZW1DaGFuZ2VkKHdpZGdldDogV2lkZ2V0KSB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlV2lkZ2V0UG9zaXRpb24oXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJZCwgd2lkZ2V0LmlkLCB3aWRnZXQueCwgd2lkZ2V0LnksIHdpZGdldC5jb2xzLCB3aWRnZXQucm93c1xuICAgICk7XG4gIH1cblxuICBvblJlbW92ZVdpZGdldCh3aWRnZXRJZDogc3RyaW5nKSB7IHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZVdpZGdldCh3aWRnZXRJZCk7IH1cblxuICBvblNlbGVjdFBhZ2UoaWQ6IHN0cmluZykgeyB0aGlzLnN0YXRlU2VydmljZS5zZXRBY3RpdmVQYWdlKGlkKTsgfVxuXG4gIG9uQWRkUGFnZSgpIHtcbiAgICBjb25zdCBuYW1lID0gcHJvbXB0KCdXb3Jrc3BhY2UgbmFtZTonLCBgV29ya3NwYWNlICR7dGhpcy5wYWdlcy5sZW5ndGggKyAxfWApO1xuICAgIGlmIChuYW1lKSB0aGlzLnN0YXRlU2VydmljZS5hZGRQYWdlKG5hbWUpO1xuICB9XG5cbiAgb25SZW1vdmVQYWdlKGV2ZW50OiBFdmVudCwgaWQ6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChjb25maXJtKCdSZW1vdmUgdGhpcyB3b3Jrc3BhY2U/JykpIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZVBhZ2UoaWQpO1xuICB9XG5cbiAgb25Qb3BPdXQoZXZlbnQ6IEV2ZW50LCBwYWdlSWQ6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnBvcE91dFBhZ2UocGFnZUlkKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZUxheW91dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc2VyaWFsaXplTGF5b3V0KCk7IH1cblxuICBwcml2YXRlIGFwcGx5VGhlbWUoKSB7XG4gICAgdGhpcy5yZXNvbHZlZFRoZW1lID0geyAuLi5ERUZBVUxUX1RIRU1FLCAuLi4odGhpcy50aGVtZSA/PyB7fSkgfTtcbiAgICBjb25zdCB0ID0gdGhpcy5yZXNvbHZlZFRoZW1lO1xuICAgIHRoaXMud3JhcHBlclN0eWxlcyA9IHtcbiAgICAgICctLWRhc2gtYmcnOiAgICAgICAgICAgICAgICAgICB0LmJhY2tncm91bmRDb2xvcixcbiAgICAgICctLWRhc2gtcGFuZWwtYmcnOiAgICAgICAgICAgICB0LnBhbmVsQ29sb3IsXG4gICAgICAnLS1kYXNoLWNhcmQtYmcnOiAgICAgICAgICAgICAgdC53aWRnZXRDYXJkQ29sb3IsXG4gICAgICAnLS1kYXNoLWZvcmUtY29sb3InOiAgICAgICAgICAgdC5mb3JlQ29sb3IsXG4gICAgICAnLS1kYXNoLWFjY2VudC1jb2xvcic6ICAgICAgICAgdC5hY2NlbnRDb2xvcixcbiAgICAgICctLWRhc2gtZGFuZ2VyLWNvbG9yJzogICAgICAgICB0LmRhbmdlckNvbG9yLFxuICAgICAgJy0tZGFzaC1mb250LWZhbWlseSc6ICAgICAgICAgIHQuZm9udEZhbWlseSxcbiAgICAgICctLWRhc2gtdGFicy1jb250YWluZXItY29sb3InOiB0LnRhYnNDb250YWluZXJDb2xvcixcbiAgICAgICctLWRhc2gtdGFiLWFjdGl2ZS1jb2xvcic6ICAgICB0LnRhYkFjdGl2ZUNvbG9yLFxuICAgICAgJy0tZGFzaC10YWItYWN0aXZlLXRleHQnOiAgICAgIHQudGFiQWN0aXZlVGV4dENvbG9yLFxuICAgICAgJy0tZGFzaC10YWItaG92ZXItdGV4dCc6ICAgICAgIHQudGFiSG92ZXJUZXh0Q29sb3IsXG4gICAgICAnLS1kYXNoLWFkZC13aWRnZXQtdGV4dCc6ICAgICAgdC5hZGRXaWRnZXRCdXR0b25UZXh0Q29sb3IsXG4gICAgICAnLS1kYXNoLXBvcG91dC10aXRsZS1jb2xvcic6ICAgdC5wb3BvdXRUaXRsZUNvbG9yLFxuICAgICAgJy0tZGFzaC13aWRnZXQtdGl0bGUtY29sb3InOiAgIHQud2lkZ2V0VGl0bGVDb2xvcixcbiAgICAgICctLWRhc2gtZHJhZy1oYW5kbGUtY29sb3InOiAgICB0LmRyYWdIYW5kbGVDb2xvcixcbiAgICAgICctLWRhc2gtd2lkZ2V0LWJvcmRlci1jb2xvcic6ICB0LndpZGdldEJvcmRlckNvbG9yLFxuICAgICAgJy0tZGFzaC13aWRnZXQtYnRuLWJnJzogICAgICAgIHQud2lkZ2V0QnV0dG9uQmdDb2xvcixcbiAgICAgICctLWRhc2gtd2lkZ2V0LWJ0bi1jb2xvcic6ICAgICB0LndpZGdldEJ1dHRvbkNvbG9yLFxuICAgICAgJy0tZGFzaC1wbGFjZWhvbGRlci1jb2xvcic6ICAgIHQucGxhY2Vob2xkZXJDb2xvcixcbiAgICAgICctLWRhc2gtcmVzaXplLWhhbmRsZS1jb2xvcic6ICB0LnJlc2l6ZUhhbmRsZUNvbG9yLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVBhZ2UoKSB7XG4gICAgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy5wYWdlcy5maW5kKHAgPT4gcC5pZCA9PT0gdGhpcy5hY3RpdmVQYWdlSWQpO1xuICB9XG59XG4iXX0=
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvZGFzaGJvYXJkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFvQyxLQUFLLEVBQUUsTUFBTSxFQUMzQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUF5QyxJQUFJLEVBQ3ZELE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUU1RCxNQUFNLGFBQWEsR0FBNkI7SUFDOUMsZUFBZSxFQUFVLFNBQVM7SUFDbEMsVUFBVSxFQUFlLFNBQVM7SUFDbEMsZUFBZSxFQUFVLFNBQVM7SUFDbEMsU0FBUyxFQUFnQixTQUFTO0lBQ2xDLFdBQVcsRUFBYyxTQUFTO0lBQ2xDLFdBQVcsRUFBYyxTQUFTO0lBQ2xDLFVBQVUsRUFBZSxxRkFBcUY7SUFDOUcsa0JBQWtCLEVBQU8sb0JBQW9CO0lBQzdDLGNBQWMsRUFBVyxTQUFTO0lBQ2xDLGtCQUFrQixFQUFPLFNBQVM7SUFDbEMsaUJBQWlCLEVBQVEsU0FBUztJQUNsQyx3QkFBd0IsRUFBQyxTQUFTO0lBQ2xDLGdCQUFnQixFQUFTLFNBQVM7SUFDbEMsZ0JBQWdCLEVBQVMsU0FBUztJQUNsQyxlQUFlLEVBQVUsdUJBQXVCO0lBQ2hELGlCQUFpQixFQUFRLHdCQUF3QjtJQUNqRCxtQkFBbUIsRUFBTSx3QkFBd0I7SUFDakQsaUJBQWlCLEVBQVEsdUJBQXVCO0lBQ2hELGdCQUFnQixFQUFTLFNBQVM7SUFDbEMsaUJBQWlCLEVBQVEsd0JBQXdCO0NBQ2xELENBQUM7QUFHRixNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFNBQVMsQ0FBQyxLQUFhLEVBQUUsWUFBb0I7UUFDM0MsT0FBTyxL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aXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQsIE91dHB1dCwgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE5nWm9uZSwgUGlwZSwgUGlwZVRyYW5zZm9ybVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhc2hib2FyZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZSwgV2lkZ2V0LCBEYXNoYm9hcmRUaGVtZSB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JpZENlbGxEaXJlY3RpdmUgfSBmcm9tICcuL2N1c3RvbS1ncmlkLmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfVEhFTUU6IFJlcXVpcmVkPERhc2hib2FyZFRoZW1lPiA9IHtcbiAgYmFja2dyb3VuZENvbG9yOiAgICAgICAgICcjMDAwMDAwJyxcbiAgcGFuZWxDb2xvcjogICAgICAgICAgICAgICcjMWMxYzFlJyxcbiAgd2lkZ2V0Q2FyZENvbG9yOiAgICAgICAgICcjMmMyYzJlJyxcbiAgZm9yZUNvbG9yOiAgICAgICAgICAgICAgICcjOGU4ZTkzJyxcbiAgYWNjZW50Q29sb3I6ICAgICAgICAgICAgICcjMGE4NGZmJyxcbiAgZGFuZ2VyQ29sb3I6ICAgICAgICAgICAgICcjZmY0NTNhJyxcbiAgZm9udEZhbWlseTogICAgICAgICAgICAgICctYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJyxcbiAgdGFic0NvbnRhaW5lckNvbG9yOiAgICAgICdyZ2JhKDQ0LDQ0LDQ2LDAuNiknLFxuICB0YWJBY3RpdmVDb2xvcjogICAgICAgICAgJyMzYTNhM2MnLFxuICB0YWJBY3RpdmVUZXh0Q29sb3I6ICAgICAgJyNmZmZmZmYnLFxuICB0YWJIb3ZlclRleHRDb2xvcjogICAgICAgJyNlNWU1ZWEnLFxuICBhZGRXaWRnZXRCdXR0b25UZXh0Q29sb3I6JyNmZmZmZmYnLFxuICBwb3BvdXRUaXRsZUNvbG9yOiAgICAgICAgJyNmZmZmZmYnLFxuICB3aWRnZXRUaXRsZUNvbG9yOiAgICAgICAgJyNmZmZmZmYnLFxuICBkcmFnSGFuZGxlQ29sb3I6ICAgICAgICAgJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gIHdpZGdldEJvcmRlckNvbG9yOiAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjA3KScsXG4gIHdpZGdldEJ1dHRvbkJnQ29sb3I6ICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjA3KScsXG4gIHdpZGdldEJ1dHRvbkNvbG9yOiAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjUpJyxcbiAgcGxhY2Vob2xkZXJDb2xvcjogICAgICAgICcjMGE4NGZmJyxcbiAgcmVzaXplSGFuZGxlQ29sb3I6ICAgICAgICdyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpJyxcbn07XG5cbkBQaXBlKHsgbmFtZTogJ292ZXJmbG93QWN0aXZlJyB9KVxuZXhwb3J0IGNsYXNzIE92ZXJmbG93QWN0aXZlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0ocGFnZXM6IFBhZ2VbXSwgYWN0aXZlUGFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGFnZXMuc29tZShwID0+IHAuaWQgPT09IGFjdGl2ZVBhZ2VJZCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRhc2hib2FyZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSBQT1BQRUQtT1VUIE1PREUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUG9wcGVkT3V0OyBlbHNlIG5vcm1hbE1vZGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdXQtd3JhcHBlclwiIFtuZ1N0eWxlXT1cIndyYXBwZXJTdHlsZXNcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzcz1cInBvcG91dC1oZWFkZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvcG91dC10aXRsZVwiPnt7IGFjdGl2ZVBhZ2U/Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgIDwvaGVhZGVyPlxuICAgICAgICA8YXBwLWdyaWQgW3dpZGdldHNdPVwiYWN0aXZlUGFnZT8ud2lkZ2V0cyB8fCBbXVwiIChpdGVtQ2hhbmdlZCk9XCJvbkl0ZW1DaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgZ3JpZENlbGwgbGV0LXdpZGdldD1cIndpZGdldFwiPlxuICAgICAgICAgICAgPGFwcC13aWRnZXQtcmVuZGVyZXIgW3dpZGdldF09XCJ3aWRnZXRcIiBbdGhlbWVdPVwicmVzb2x2ZWRUaGVtZVwiXG4gICAgICAgICAgICAgIChlZGl0UmVxdWVzdGVkKT1cImVkaXRXaWRnZXRSZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHJlbW92ZVJlcXVlc3RlZCk9XCJvblJlbW92ZVdpZGdldCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgd2lkZ2V0OiB3aWRnZXQgfVwiPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYXBwLXdpZGdldC1yZW5kZXJlcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2FwcC1ncmlkPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5PUk1BTCBNT0RFIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsTW9kZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtd3JhcHBlclwiIFtuZ1N0eWxlXT1cIndyYXBwZXJTdHlsZXNcIj5cbiAgICAgICAgPG1haW4gY2xhc3M9XCJtYWluLWNvbnRlbnRcIj5cblxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkYXNoYm9hcmQtaGVhZGVyXCI+XG5cbiAgICAgICAgICAgIDwhLS0gVGFicyBwaWxsIOKAlCBzY3JvbGxhYmxlLCBmYWRlcyB3aGVuIG92ZXJmbG93aW5nIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMtc2Nyb2xsLXRyYWNrXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWNvbnRhaW5lclwiICN0YWJzQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlIG9mIHBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFiXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicGFnZS5pZCA9PT0gYWN0aXZlUGFnZUlkXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdFBhZ2UocGFnZS5pZClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLW5hbWVcIj57eyBwYWdlLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGFiLWFjdGlvbiB0YWItcG9wb3V0XCIgKGNsaWNrKT1cIm9uUG9wT3V0KCRldmVudCwgcGFnZS5pZClcIiB0aXRsZT1cIk9wZW4gaW4gbmV3IHdpbmRvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxhIGxhLWV4dGVybmFsLWxpbmstYWx0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGFiLWFjdGlvbiB0YWItY2xvc2VcIiAqbmdJZj1cInBhZ2VzLmxlbmd0aCA+IDFcIiAoY2xpY2spPVwib25SZW1vdmVQYWdlKCRldmVudCwgcGFnZS5pZClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGEgbGEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFkZC1wYWdlXCIgKGNsaWNrKT1cIm9uQWRkUGFnZSgpXCIgdGl0bGU9XCJOZXcgd29ya3NwYWNlXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxhIGxhLXBsdXNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIGZhZGUgaGludCBzaG93biB3aGVuIHNjcm9sbGFibGUgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWZhZGUtcmlnaHRcIiAqbmdJZj1cInRhYnNPdmVyZmxvd1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYWRkLXdpZGdldFwiIChjbGljayk9XCJhZGRXaWRnZXRSZXF1ZXN0ZWQuZW1pdCgpXCIgdGl0bGU9XCJBZGQgd2lkZ2V0XCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwibGEgbGEtcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+QWRkIFdpZGdldDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxhcHAtZ3JpZCBbd2lkZ2V0c109XCJhY3RpdmVQYWdlPy53aWRnZXRzIHx8IFtdXCIgKGl0ZW1DaGFuZ2VkKT1cIm9uSXRlbUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZ3JpZENlbGwgbGV0LXdpZGdldD1cIndpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxhcHAtd2lkZ2V0LXJlbmRlcmVyIFt3aWRnZXRdPVwid2lkZ2V0XCIgW3RoZW1lXT1cInJlc29sdmVkVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgKGVkaXRSZXF1ZXN0ZWQpPVwiZWRpdFdpZGdldFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHJlbW92ZVJlcXVlc3RlZCk9XCJvblJlbW92ZVdpZGdldCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgd2lkZ2V0OiB3aWRnZXQgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9hcHAtd2lkZ2V0LXJlbmRlcmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9hcHAtZ3JpZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L21haW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAtLWRhc2gtYmc6ICAgICAgICAgICAgICAgICAgICAjMDAwMDAwO1xuICAgICAgLS1kYXNoLXBhbmVsLWJnOiAgICAgICAgICAgICAgIzFjMWMxZTtcbiAgICAgIC0tZGFzaC1jYXJkLWJnOiAgICAgICAgICAgICAgICMyYzJjMmU7XG4gICAgICAtLWRhc2gtZm9yZS1jb2xvcjogICAgICAgICAgICAjOGU4ZTkzO1xuICAgICAgLS1kYXNoLWFjY2VudC1jb2xvcjogICAgICAgICAgIzBhODRmZjtcbiAgICAgIC0tZGFzaC1kYW5nZXItY29sb3I6ICAgICAgICAgICNmZjQ1M2E7XG4gICAgICAtLWRhc2gtZm9udC1mYW1pbHk6ICAgICAgICAgICAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgICAgLS1kYXNoLXRhYnMtY29udGFpbmVyLWNvbG9yOiAgcmdiYSg0NCw0NCw0NiwwLjYpO1xuICAgICAgLS1kYXNoLXRhYi1hY3RpdmUtY29sb3I6ICAgICAgIzNhM2EzYztcbiAgICAgIC0tZGFzaC10YWItYWN0aXZlLXRleHQ6ICAgICAgICNmZmZmZmY7XG4gICAgICAtLWRhc2gtdGFiLWhvdmVyLXRleHQ6ICAgICAgICAjZTVlNWVhO1xuICAgICAgLS1kYXNoLWFkZC13aWRnZXQtdGV4dDogICAgICAgI2ZmZmZmZjtcbiAgICAgIC0tZGFzaC1wb3BvdXQtdGl0bGUtY29sb3I6ICAgICNmZmZmZmY7XG4gICAgICAtLWRhc2gtd2lkZ2V0LXRpdGxlLWNvbG9yOiAgICAjZmZmZmZmO1xuICAgICAgLS1kYXNoLWRyYWctaGFuZGxlLWNvbG9yOiAgICAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xuICAgICAgLS1kYXNoLXdpZGdldC1ib3JkZXItY29sb3I6ICAgcmdiYSgyNTUsMjU1LDI1NSwwLjA3KTtcbiAgICAgIC0tZGFzaC13aWRnZXQtYnRuLWJnOiAgICAgICAgIHJnYmEoMjU1LDI1NSwyNTUsMC4wNyk7XG4gICAgICAtLWRhc2gtd2lkZ2V0LWJ0bi1jb2xvcjogICAgICByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7XG4gICAgICAtLWRhc2gtcGxhY2Vob2xkZXItY29sb3I6ICAgICAjMGE4NGZmO1xuICAgICAgLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3I6ICAgcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtcbiAgICB9XG5cbiAgICAvKiDilIDilIAgTm9ybWFsIGxheW91dCDilIDilIAgKi9cbiAgICAuZGFzaGJvYXJkLXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1kYXNoLWZvbnQtZmFtaWx5KTtcbiAgICB9XG4gICAgLm1haW4tY29udGVudCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm9yZGVyLXJhZGl1czogNDBweDtcbiAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kYXNoLXBhbmVsLWJnKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7XG4gICAgfVxuXG4gICAgLyog4pSA4pSAIFBvcC1vdXQgbGF5b3V0IOKUgOKUgCAqL1xuICAgIC5wb3BvdXQtd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMTtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1kYXNoLWZvbnQtZmFtaWx5KTtcbiAgICB9XG4gICAgLnBvcG91dC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgcGFkZGluZzogMTBweCAxOHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGFzaC1wYW5lbC1iZyk7XG4gICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjA2KTtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAucG9wb3V0LXRpdGxlIHsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogdmFyKC0tZGFzaC1wb3BvdXQtdGl0bGUtY29sb3IpOyB9XG4gICAgLnBvcG91dC13cmFwcGVyIGFwcC1ncmlkIHsgZmxleDogMTsgbWluLWhlaWdodDogMDsgb3ZlcmZsb3c6IGF1dG87IH1cblxuICAgIC8qIOKUgOKUgCBIZWFkZXIg4pSA4pSAICovXG4gICAgLmRhc2hib2FyZC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLyogU2Nyb2xsIHRyYWNrIHdyYXBzIHRoZSBwaWxsIGFuZCBzaG93cyBhIGZhZGUgd2hlbiBvdmVyZmxvd2luZyAqL1xuICAgIC50YWJzLXNjcm9sbC10cmFjayB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgICAudGFicy1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtdGFicy1jb250YWluZXItY29sb3IpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcbiAgICAgIHBhZGRpbmc6IDZweDtcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7XG4gICAgfVxuICAgIC50YWJzLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lOyB9XG5cbiAgICAvKiBGYWRlLW91dCBoaW50IG9uIHJpZ2h0IGVkZ2Ugd2hlbiB0aGVyZSBhcmUgbW9yZSB0YWJzICovXG4gICAgLnRhYnMtZmFkZS1yaWdodCB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7IHJpZ2h0OiAwO1xuICAgICAgd2lkdGg6IDYwcHg7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3JkZXItcmFkaXVzOiAwIDI1cHggMjVweCAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCB2YXIoLS1kYXNoLXBhbmVsLWJnKSk7XG4gICAgfVxuXG4gICAgLyog4pSA4pSAIEluZGl2aWR1YWwgdGFiIOKUgOKUgCAqL1xuICAgIC50YWIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4IDhweCAxOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzO1xuICAgIH1cbiAgICAudGFiLmFjdGl2ZSB7IGJhY2tncm91bmQ6IHZhcigtLWRhc2gtdGFiLWFjdGl2ZS1jb2xvcik7IGNvbG9yOiB2YXIoLS1kYXNoLXRhYi1hY3RpdmUtdGV4dCk7IH1cbiAgICAudGFiOmhvdmVyOm5vdCguYWN0aXZlKSB7IGNvbG9yOiB2YXIoLS1kYXNoLXRhYi1ob3Zlci10ZXh0KTsgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjA1KTsgfVxuICAgIC50YWItbmFtZSB7IGZsZXg6IDE7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH1cbiAgICAudGFiLWFjdGlvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiBub25lOyBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiAxMXB4OyBjdXJzb3I6IHBvaW50ZXI7IG9wYWNpdHk6IDA7IGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7IGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAudGFiOmhvdmVyIC50YWItYWN0aW9uIHsgb3BhY2l0eTogMTsgfVxuICAgIC50YWItcG9wb3V0OmhvdmVyIHsgY29sb3I6IHZhcigtLWRhc2gtYWNjZW50LWNvbG9yKTsgYmFja2dyb3VuZDogcmdiYSgxMCwxMzIsMjU1LDAuMTgpOyB9XG4gICAgLnRhYi1jbG9zZTpob3ZlciAgeyBjb2xvcjogdmFyKC0tZGFzaC1kYW5nZXItY29sb3IpOyAgYmFja2dyb3VuZDogcmdiYSgyNTUsNjksNTgsMC4yKTsgfVxuXG4gICAgLmJ0bi1hZGQtcGFnZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiBub25lOyBjb2xvcjogdmFyKC0tZGFzaC1mb3JlLWNvbG9yKTtcbiAgICAgIHBhZGRpbmc6IDhweCAxNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzO1xuICAgIH1cbiAgICAuYnRuLWFkZC1wYWdlOmhvdmVyIHsgY29sb3I6IHZhcigtLWRhc2gtYWNjZW50LWNvbG9yKTsgYmFja2dyb3VuZDogcmdiYSgxMCwxMzIsMjU1LDAuMSk7IH1cblxuICAgIC5idG4tYWRkLXdpZGdldCB7XG4gICAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtYWNjZW50LWNvbG9yKTsgYm9yZGVyOiBub25lOyBjb2xvcjogdmFyKC0tZGFzaC1hZGQtd2lkZ2V0LXRleHQpO1xuICAgICAgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlci1yYWRpdXM6IDIycHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGZsZXgtc2hyaW5rOiAwO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzLCB0cmFuc2Zvcm0gMC4xNXM7XG4gICAgfVxuICAgIC5idG4tYWRkLXdpZGdldDpob3ZlciAgeyBvcGFjaXR5OiAwLjk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfVxuICAgIC5idG4tYWRkLXdpZGdldDphY3RpdmUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cblxuICAgIC8qIOKUgOKUgCBHcmlkIOKUgOKUgCAqL1xuICAgIC5tYWluLWNvbnRlbnQgLmdyaWQtY29udGFpbmVyIHsgZmxleDogMTsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1yYWRpdXM6IDI0cHg7IG1pbi1oZWlnaHQ6IDA7IH1cbiAgICBhcHAtZ3JpZCB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaW5pdGlhbExheW91dD86IHN0cmluZztcbiAgQElucHV0KCkgdGhlbWU/OiBEYXNoYm9hcmRUaGVtZTtcblxuICBAT3V0cHV0KCkgYWRkV2lkZ2V0UmVxdWVzdGVkICA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRXaWRnZXRSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldD4oKTtcblxuICBAQ29udGVudENoaWxkKEdyaWRDZWxsRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGNlbGxUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgd2lkZ2V0OiBXaWRnZXQgfT47XG5cbiAgQFZpZXdDaGlsZCgndGFic0NvbnRhaW5lcicpIHRhYnNDb250YWluZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICByZXNvbHZlZFRoZW1lOiBSZXF1aXJlZDxEYXNoYm9hcmRUaGVtZT4gPSB7IC4uLkRFRkFVTFRfVEhFTUUgfTtcbiAgd3JhcHBlclN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIHBhZ2VzOiBQYWdlW10gPSBbXTtcbiAgYWN0aXZlUGFnZUlkICA9ICcnO1xuICBhY3RpdmVQYWdlPzogUGFnZTtcbiAgaXNQb3BwZWRPdXQgICA9IGZhbHNlO1xuICB0YWJzT3ZlcmZsb3cgID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXRlU2VydmljZTogRGFzaGJvYXJkU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWyd0aGVtZSddIHx8IGNoYW5nZXNbJ2luaXRpYWxMYXlvdXQnXSkgdGhpcy5hcHBseVRoZW1lKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFwcGx5VGhlbWUoKTtcblxuICAgIGlmICh0aGlzLmluaXRpYWxMYXlvdXQpIHtcbiAgICAgIHRyeSB7IHRoaXMuc3RhdGVTZXJ2aWNlLmxvYWRMYXlvdXQoSlNPTi5wYXJzZSh0aGlzLmluaXRpYWxMYXlvdXQpKTsgfVxuICAgICAgY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignW0Rhc2hib2FyZF0gRmFpbGVkIHRvIHBhcnNlIGluaXRpYWxMYXlvdXQnLCBlKTsgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaD8ucmVwbGFjZSgnIycsICcnKS50cmltKCk7XG4gICAgaWYgKGhhc2gpIHRoaXMuaXNQb3BwZWRPdXQgPSB0cnVlO1xuXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLnN0YXRlU2VydmljZS5wYWdlcyQuc3Vic2NyaWJlKHBhZ2VzID0+IHtcbiAgICAgIHRoaXMucGFnZXMgPSBwYWdlcztcbiAgICAgIGlmICh0aGlzLmlzUG9wcGVkT3V0ICYmIGhhc2gpIHtcbiAgICAgICAgaWYgKHBhZ2VzLmZpbmQocCA9PiBwLmlkID09PSBoYXNoKSkgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0QWN0aXZlUGFnZShoYXNoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQWN0aXZlUGFnZSgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnN1YnMuYWRkKHRoaXMuc3RhdGVTZXJ2aWNlLmFjdGl2ZVBhZ2VJZCQuc3Vic2NyaWJlKGlkID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlUGFnZUlkID0gaWQ7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVBhZ2UoKTtcbiAgICB9KSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKCF0aGlzLnRhYnNDb250YWluZXJSZWYpIHJldHVybjtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5jaGVja092ZXJmbG93KCkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy50YWJzQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xuICAgIC8vIEFsc28gZGV0ZWN0IHNjcm9sbCBzbyBmYWRlIGhpZGVzIHdoZW4gc2Nyb2xsZWQgdG8gZW5kXG4gICAgdGhpcy50YWJzQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmNoZWNrT3ZlcmZsb3coKSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBvbkl0ZW1DaGFuZ2VkKHdpZGdldDogV2lkZ2V0KSB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlV2lkZ2V0UG9zaXRpb24oXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJZCwgd2lkZ2V0LmlkLCB3aWRnZXQueCwgd2lkZ2V0LnksIHdpZGdldC5jb2xzLCB3aWRnZXQucm93c1xuICAgICk7XG4gIH1cblxuICBvblJlbW92ZVdpZGdldCh3aWRnZXRJZDogc3RyaW5nKSB7IHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZVdpZGdldCh3aWRnZXRJZCk7IH1cbiAgb25TZWxlY3RQYWdlKGlkOiBzdHJpbmcpICAgICAgICAgeyB0aGlzLnN0YXRlU2VydmljZS5zZXRBY3RpdmVQYWdlKGlkKTsgfVxuXG4gIG9uQWRkUGFnZSgpIHtcbiAgICBjb25zdCBuYW1lID0gcHJvbXB0KCdXb3Jrc3BhY2UgbmFtZTonLCBgV29ya3NwYWNlICR7dGhpcy5wYWdlcy5sZW5ndGggKyAxfWApO1xuICAgIGlmIChuYW1lKSB0aGlzLnN0YXRlU2VydmljZS5hZGRQYWdlKG5hbWUpO1xuICB9XG5cbiAgb25SZW1vdmVQYWdlKGV2ZW50OiBFdmVudCwgaWQ6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChjb25maXJtKCdSZW1vdmUgdGhpcyB3b3Jrc3BhY2U/JykpIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZVBhZ2UoaWQpO1xuICB9XG5cbiAgb25Qb3BPdXQoZXZlbnQ6IEV2ZW50LCBwYWdlSWQ6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnBvcE91dFBhZ2UocGFnZUlkKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZUxheW91dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc2VyaWFsaXplTGF5b3V0KCk7IH1cblxuICBwcml2YXRlIGNoZWNrT3ZlcmZsb3coKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLnRhYnNDb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGF0RW5kID0gZWwuc2Nyb2xsTGVmdCArIGVsLmNsaWVudFdpZHRoID49IGVsLnNjcm9sbFdpZHRoIC0gNDtcbiAgICB0aGlzLnRhYnNPdmVyZmxvdyA9ICFhdEVuZCAmJiBlbC5zY3JvbGxXaWR0aCA+IGVsLmNsaWVudFdpZHRoO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRoZW1lKCkge1xuICAgIHRoaXMucmVzb2x2ZWRUaGVtZSA9IHsgLi4uREVGQVVMVF9USEVNRSwgLi4uKHRoaXMudGhlbWUgPz8ge30pIH07XG4gICAgY29uc3QgdCA9IHRoaXMucmVzb2x2ZWRUaGVtZTtcbiAgICB0aGlzLndyYXBwZXJTdHlsZXMgPSB7XG4gICAgICAnLS1kYXNoLWJnJzogICAgICAgICAgICAgICAgICAgdC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAnLS1kYXNoLXBhbmVsLWJnJzogICAgICAgICAgICAgdC5wYW5lbENvbG9yLFxuICAgICAgJy0tZGFzaC1jYXJkLWJnJzogICAgICAgICAgICAgIHQud2lkZ2V0Q2FyZENvbG9yLFxuICAgICAgJy0tZGFzaC1mb3JlLWNvbG9yJzogICAgICAgICAgIHQuZm9yZUNvbG9yLFxuICAgICAgJy0tZGFzaC1hY2NlbnQtY29sb3InOiAgICAgICAgIHQuYWNjZW50Q29sb3IsXG4gICAgICAnLS1kYXNoLWRhbmdlci1jb2xvcic6ICAgICAgICAgdC5kYW5nZXJDb2xvcixcbiAgICAgICctLWRhc2gtZm9udC1mYW1pbHknOiAgICAgICAgICB0LmZvbnRGYW1pbHksXG4gICAgICAnLS1kYXNoLXRhYnMtY29udGFpbmVyLWNvbG9yJzogdC50YWJzQ29udGFpbmVyQ29sb3IsXG4gICAgICAnLS1kYXNoLXRhYi1hY3RpdmUtY29sb3InOiAgICAgdC50YWJBY3RpdmVDb2xvcixcbiAgICAgICctLWRhc2gtdGFiLWFjdGl2ZS10ZXh0JzogICAgICB0LnRhYkFjdGl2ZVRleHRDb2xvcixcbiAgICAgICctLWRhc2gtdGFiLWhvdmVyLXRleHQnOiAgICAgICB0LnRhYkhvdmVyVGV4dENvbG9yLFxuICAgICAgJy0tZGFzaC1hZGQtd2lkZ2V0LXRleHQnOiAgICAgIHQuYWRkV2lkZ2V0QnV0dG9uVGV4dENvbG9yLFxuICAgICAgJy0tZGFzaC1wb3BvdXQtdGl0bGUtY29sb3InOiAgIHQucG9wb3V0VGl0bGVDb2xvcixcbiAgICAgICctLWRhc2gtd2lkZ2V0LXRpdGxlLWNvbG9yJzogICB0LndpZGdldFRpdGxlQ29sb3IsXG4gICAgICAnLS1kYXNoLWRyYWctaGFuZGxlLWNvbG9yJzogICAgdC5kcmFnSGFuZGxlQ29sb3IsXG4gICAgICAnLS1kYXNoLXdpZGdldC1ib3JkZXItY29sb3InOiAgdC53aWRnZXRCb3JkZXJDb2xvcixcbiAgICAgICctLWRhc2gtd2lkZ2V0LWJ0bi1iZyc6ICAgICAgICB0LndpZGdldEJ1dHRvbkJnQ29sb3IsXG4gICAgICAnLS1kYXNoLXdpZGdldC1idG4tY29sb3InOiAgICAgdC53aWRnZXRCdXR0b25Db2xvcixcbiAgICAgICctLWRhc2gtcGxhY2Vob2xkZXItY29sb3InOiAgICB0LnBsYWNlaG9sZGVyQ29sb3IsXG4gICAgICAnLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3InOiAgdC5yZXNpemVIYW5kbGVDb2xvcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVQYWdlKCkge1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9IHRoaXMucGFnZXMuZmluZChwID0+IHAuaWQgPT09IHRoaXMuYWN0aXZlUGFnZUlkKTtcbiAgICAvLyBzY3JvbGwgYWN0aXZlIHRhYiBpbnRvIHZpZXdcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJzQ29udGFpbmVyUmVmKSByZXR1cm47XG4gICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLnRhYnNDb250YWluZXJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnRhYi5hY3RpdmUnKTtcbiAgICAgIGFjdGl2ZT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ25lYXJlc3QnIH0pO1xuICAgICAgdGhpcy5jaGVja092ZXJmbG93KCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==