@energycap/components 0.43.11 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -62,21 +62,20 @@ import * as i59 from "./controls/item-picker/item-picker.component";
62
62
  import * as i60 from "./controls/help-popover/help-popover.component";
63
63
  import * as i61 from "./controls/link-button/link-button.component";
64
64
  import * as i62 from "./display/tooltip/tooltip.component";
65
- import * as i63 from "./display/tour/tour.component";
66
- import * as i64 from "./controls/button/copy-table-button.directive";
67
- import * as i65 from "./display/tooltip-directive/tooltip.directive";
68
- import * as i66 from "./controls/calendar/calendar.component";
69
- import * as i67 from "./controls/calendar/calendar-item.component";
70
- import * as i68 from "./controls/date-input/date-input.component";
71
- import * as i69 from "./shared/directives/keyboard-nav-container/keyboard-nav-container.directive";
72
- import * as i70 from "./shared/display/pipes/date-display-2.pipe";
73
- import * as i71 from "@angular/common";
74
- import * as i72 from "@angular/forms";
75
- import * as i73 from "@angular/router";
76
- import * as i74 from "@ngx-translate/core";
77
- import * as i75 from "@angular/cdk/a11y";
78
- import * as i76 from "@angular/cdk/overlay";
79
- import * as i77 from "@angular/cdk/scrolling";
65
+ import * as i63 from "./controls/button/copy-table-button.directive";
66
+ import * as i64 from "./display/tooltip-directive/tooltip.directive";
67
+ import * as i65 from "./controls/calendar/calendar.component";
68
+ import * as i66 from "./controls/calendar/calendar-item.component";
69
+ import * as i67 from "./controls/date-input/date-input.component";
70
+ import * as i68 from "./shared/directives/keyboard-nav-container/keyboard-nav-container.directive";
71
+ import * as i69 from "./shared/display/pipes/date-display-2.pipe";
72
+ import * as i70 from "@angular/common";
73
+ import * as i71 from "@angular/forms";
74
+ import * as i72 from "@angular/router";
75
+ import * as i73 from "@ngx-translate/core";
76
+ import * as i74 from "@angular/cdk/a11y";
77
+ import * as i75 from "@angular/cdk/overlay";
78
+ import * as i76 from "@angular/cdk/scrolling";
80
79
  export type ComponentsModuleConfig = {
81
80
  tracker: Provider;
82
81
  };
@@ -88,6 +87,6 @@ export declare class ComponentsModule {
88
87
  */
89
88
  static forRoot(config: ComponentsModuleConfig): ModuleWithProviders<ComponentsModule>;
90
89
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentsModule, never>;
91
- static ɵmod: i0.ɵɵNgModuleDeclaration<ComponentsModule, [typeof i1.ButtonComponent, typeof i2.TabsComponent, typeof i3.TextboxComponent, typeof i4.NavItemActiveDirective, typeof i5.SpinnerComponent, typeof i6.ViewOverlayComponent, typeof i7.BannerComponent, typeof i8.ResizableTableDirective, typeof i2.TabsComponent, typeof i9.TableComponent, typeof i10.SearchableTableComponent, typeof i11.ComboboxComponent, typeof i12.MenuComponent, typeof i13.PopupContainerDirective, typeof i14.DropdownComponent, typeof i15.ConfirmComponent, typeof i16.DialogComponent, typeof i17.DateDisplayPipe, typeof i18.TimeDisplayPipe, typeof i19.MockDateDisplayPipe, typeof i20.RadioButtonComponent, typeof i21.CheckboxComponent, typeof i22.NumericboxComponent, typeof i23.AvatarComponent, typeof i24.AppBarComponent, typeof i25.SplashComponent, typeof i26.IfViewportWidthDirective, typeof i27.ClickAreaForDirective, typeof i28.CollapsibleToggleComponent, typeof i29.TableMasterRowComponent, typeof i30.TableMasterHeaderRowComponent, typeof i31.TableDetailRowComponent, typeof i32.TableLockedColumnComponent, typeof i33.TableSelectableRowComponent, typeof i34.PopoverComponent, typeof i35.TablePaginationComponent, typeof i36.RowCountPipe, typeof i37.CopyButtonDirective, typeof i35.TablePaginationComponent, typeof i38.TagsComponent, typeof i39.FormControlComponent, typeof i40.SelectComponent, typeof i41.ItemDisplayComponent, typeof i33.TableSelectableRowComponent, typeof i42.ResizableColumnComponent, typeof i43.DialogGroupComponent, typeof i44.FileUploadComponent, typeof i45.FormGroupComponent, typeof i46.JsonDisplayComponent, typeof i47.ToastComponent, typeof i48.ToasterComponent, typeof i49.PageViewComponent, typeof i50.PageTitleComponent, typeof i51.WizardProgressComponent, typeof i52.WizardButtonsComponent, typeof i53.HierarchyTreeComponent, typeof i54.TreeComponent, typeof i55.RelativeDatePipe, typeof i56.ResizableComponent, typeof i57.HighlightTextPipe, typeof i58.FormControlLabelComponent, typeof i59.ItemPickerComponent, typeof i60.HelpPopoverComponent, typeof i61.LinkButtonComponent, typeof i62.TooltipComponent, typeof i63.TourComponent, typeof i64.CopyTableButtonDirective, typeof i65.TooltipDirective, typeof i66.CalendarComponent, typeof i67.CalendarItemComponent, typeof i68.DateInputComponent, typeof i69.KeyboardNavContainerDirective, typeof i70.DateDisplayPipe2], [typeof i71.CommonModule, typeof i72.FormsModule, typeof i72.ReactiveFormsModule, typeof i73.RouterModule, typeof i74.TranslateModule, typeof i75.A11yModule, typeof i76.OverlayModule, typeof i77.ScrollingModule], [typeof i1.ButtonComponent, typeof i2.TabsComponent, typeof i3.TextboxComponent, typeof i4.NavItemActiveDirective, typeof i5.SpinnerComponent, typeof i6.ViewOverlayComponent, typeof i7.BannerComponent, typeof i2.TabsComponent, typeof i9.TableComponent, typeof i10.SearchableTableComponent, typeof i11.ComboboxComponent, typeof i12.MenuComponent, typeof i13.PopupContainerDirective, typeof i14.DropdownComponent, typeof i15.ConfirmComponent, typeof i16.DialogComponent, typeof i17.DateDisplayPipe, typeof i18.TimeDisplayPipe, typeof i20.RadioButtonComponent, typeof i21.CheckboxComponent, typeof i22.NumericboxComponent, typeof i23.AvatarComponent, typeof i24.AppBarComponent, typeof i25.SplashComponent, typeof i26.IfViewportWidthDirective, typeof i27.ClickAreaForDirective, typeof i28.CollapsibleToggleComponent, typeof i29.TableMasterRowComponent, typeof i30.TableMasterHeaderRowComponent, typeof i32.TableLockedColumnComponent, typeof i33.TableSelectableRowComponent, typeof i34.PopoverComponent, typeof i37.CopyButtonDirective, typeof i35.TablePaginationComponent, typeof i38.TagsComponent, typeof i39.FormControlComponent, typeof i40.SelectComponent, typeof i41.ItemDisplayComponent, typeof i42.ResizableColumnComponent, typeof i43.DialogGroupComponent, typeof i44.FileUploadComponent, typeof i45.FormGroupComponent, typeof i46.JsonDisplayComponent, typeof i47.ToastComponent, typeof i48.ToasterComponent, typeof i49.PageViewComponent, typeof i50.PageTitleComponent, typeof i51.WizardProgressComponent, typeof i52.WizardButtonsComponent, typeof i53.HierarchyTreeComponent, typeof i54.TreeComponent, typeof i55.RelativeDatePipe, typeof i56.ResizableComponent, typeof i57.HighlightTextPipe, typeof i58.FormControlLabelComponent, typeof i59.ItemPickerComponent, typeof i60.HelpPopoverComponent, typeof i61.LinkButtonComponent, typeof i62.TooltipComponent, typeof i63.TourComponent, typeof i64.CopyTableButtonDirective, typeof i65.TooltipDirective, typeof i66.CalendarComponent, typeof i68.DateInputComponent, typeof i69.KeyboardNavContainerDirective, typeof i70.DateDisplayPipe2]>;
90
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ComponentsModule, [typeof i1.ButtonComponent, typeof i2.TabsComponent, typeof i3.TextboxComponent, typeof i4.NavItemActiveDirective, typeof i5.SpinnerComponent, typeof i6.ViewOverlayComponent, typeof i7.BannerComponent, typeof i8.ResizableTableDirective, typeof i2.TabsComponent, typeof i9.TableComponent, typeof i10.SearchableTableComponent, typeof i11.ComboboxComponent, typeof i12.MenuComponent, typeof i13.PopupContainerDirective, typeof i14.DropdownComponent, typeof i15.ConfirmComponent, typeof i16.DialogComponent, typeof i17.DateDisplayPipe, typeof i18.TimeDisplayPipe, typeof i19.MockDateDisplayPipe, typeof i20.RadioButtonComponent, typeof i21.CheckboxComponent, typeof i22.NumericboxComponent, typeof i23.AvatarComponent, typeof i24.AppBarComponent, typeof i25.SplashComponent, typeof i26.IfViewportWidthDirective, typeof i27.ClickAreaForDirective, typeof i28.CollapsibleToggleComponent, typeof i29.TableMasterRowComponent, typeof i30.TableMasterHeaderRowComponent, typeof i31.TableDetailRowComponent, typeof i32.TableLockedColumnComponent, typeof i33.TableSelectableRowComponent, typeof i34.PopoverComponent, typeof i35.TablePaginationComponent, typeof i36.RowCountPipe, typeof i37.CopyButtonDirective, typeof i35.TablePaginationComponent, typeof i38.TagsComponent, typeof i39.FormControlComponent, typeof i40.SelectComponent, typeof i41.ItemDisplayComponent, typeof i33.TableSelectableRowComponent, typeof i42.ResizableColumnComponent, typeof i43.DialogGroupComponent, typeof i44.FileUploadComponent, typeof i45.FormGroupComponent, typeof i46.JsonDisplayComponent, typeof i47.ToastComponent, typeof i48.ToasterComponent, typeof i49.PageViewComponent, typeof i50.PageTitleComponent, typeof i51.WizardProgressComponent, typeof i52.WizardButtonsComponent, typeof i53.HierarchyTreeComponent, typeof i54.TreeComponent, typeof i55.RelativeDatePipe, typeof i56.ResizableComponent, typeof i57.HighlightTextPipe, typeof i58.FormControlLabelComponent, typeof i59.ItemPickerComponent, typeof i60.HelpPopoverComponent, typeof i61.LinkButtonComponent, typeof i62.TooltipComponent, typeof i63.CopyTableButtonDirective, typeof i64.TooltipDirective, typeof i65.CalendarComponent, typeof i66.CalendarItemComponent, typeof i67.DateInputComponent, typeof i68.KeyboardNavContainerDirective, typeof i69.DateDisplayPipe2], [typeof i70.CommonModule, typeof i71.FormsModule, typeof i71.ReactiveFormsModule, typeof i72.RouterModule, typeof i73.TranslateModule, typeof i74.A11yModule, typeof i75.OverlayModule, typeof i76.ScrollingModule], [typeof i1.ButtonComponent, typeof i2.TabsComponent, typeof i3.TextboxComponent, typeof i4.NavItemActiveDirective, typeof i5.SpinnerComponent, typeof i6.ViewOverlayComponent, typeof i7.BannerComponent, typeof i2.TabsComponent, typeof i9.TableComponent, typeof i10.SearchableTableComponent, typeof i11.ComboboxComponent, typeof i12.MenuComponent, typeof i13.PopupContainerDirective, typeof i14.DropdownComponent, typeof i15.ConfirmComponent, typeof i16.DialogComponent, typeof i17.DateDisplayPipe, typeof i18.TimeDisplayPipe, typeof i20.RadioButtonComponent, typeof i21.CheckboxComponent, typeof i22.NumericboxComponent, typeof i23.AvatarComponent, typeof i24.AppBarComponent, typeof i25.SplashComponent, typeof i26.IfViewportWidthDirective, typeof i27.ClickAreaForDirective, typeof i28.CollapsibleToggleComponent, typeof i29.TableMasterRowComponent, typeof i30.TableMasterHeaderRowComponent, typeof i32.TableLockedColumnComponent, typeof i33.TableSelectableRowComponent, typeof i34.PopoverComponent, typeof i37.CopyButtonDirective, typeof i35.TablePaginationComponent, typeof i38.TagsComponent, typeof i39.FormControlComponent, typeof i40.SelectComponent, typeof i41.ItemDisplayComponent, typeof i42.ResizableColumnComponent, typeof i43.DialogGroupComponent, typeof i44.FileUploadComponent, typeof i45.FormGroupComponent, typeof i46.JsonDisplayComponent, typeof i47.ToastComponent, typeof i48.ToasterComponent, typeof i49.PageViewComponent, typeof i50.PageTitleComponent, typeof i51.WizardProgressComponent, typeof i52.WizardButtonsComponent, typeof i53.HierarchyTreeComponent, typeof i54.TreeComponent, typeof i55.RelativeDatePipe, typeof i56.ResizableComponent, typeof i57.HighlightTextPipe, typeof i58.FormControlLabelComponent, typeof i59.ItemPickerComponent, typeof i60.HelpPopoverComponent, typeof i61.LinkButtonComponent, typeof i62.TooltipComponent, typeof i63.CopyTableButtonDirective, typeof i64.TooltipDirective, typeof i65.CalendarComponent, typeof i67.DateInputComponent, typeof i68.KeyboardNavContainerDirective, typeof i69.DateDisplayPipe2]>;
92
91
  static ɵinj: i0.ɵɵInjectorDeclaration<ComponentsModule>;
93
92
  }
@@ -27,7 +27,7 @@ export interface TooltipOptions {
27
27
  */
28
28
  customContent?: TemplateRef<any>;
29
29
  /**
30
- * When true a close button appears in the top right corner to hide the tooltip. Useful when tooltips are used in a tour. An event will emitted when the tooltip is hidden.
30
+ * When true a close button appears in the top right corner to hide the tooltip. An event will emitted when the tooltip is hidden.
31
31
  */
32
32
  dismissible?: boolean;
33
33
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energycap/components",
3
- "version": "0.43.11",
3
+ "version": "0.44.0",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "dependencies": {
6
6
  "tslib": "^2.0.0"
package/public-api.d.ts CHANGED
@@ -78,9 +78,6 @@ export * from './lib/display/toast/toaster/toaster.component';
78
78
  export * from './lib/display/tooltip-directive/tooltip.directive';
79
79
  export * from './lib/display/tooltip/tooltip.component';
80
80
  export * from './lib/display/tooltip/tooltip.service';
81
- export * from './lib/display/tour/tour-types';
82
- export * from './lib/display/tour/tour.component';
83
- export * from './lib/display/tour/tour.service';
84
81
  export * from './lib/display/tree/tree.component';
85
82
  export * from './lib/display/view-overlay/view-overlay.component';
86
83
  export * from './lib/shared/directives/click-area-for/click-area-for.directive';
@@ -138,8 +138,6 @@
138
138
 
139
139
  // TODO: where is this used and what would the new value be
140
140
  --ec-color-accrual: #{$ec-color-accrual};
141
-
142
- --ec-color-tour-title: var(--ec-color-primary-light);
143
141
 
144
142
  --ec-background-color: rgb(255, 255, 255);
145
143
  --ec-background-color-overlay: rgba(255, 255, 255, .7);
@@ -148,7 +146,6 @@
148
146
  --ec-background-color-dark: rgb(26, 26, 35);
149
147
  --ec-background-color-dialog: rgba(26, 26, 35, .5);
150
148
  --ec-background-color-dialog-stacked: rgba(26, 26, 35, .25);
151
- --ec-background-color-tour: var(--ec-color-gray-8);
152
149
  --ec-background-splash: radial-gradient(104.77% 95.14% at 90.16% 85.25%, rgba(113,235,111,0.60) 0%, rgba(255, 255, 255, 0) 100%),
153
150
  radial-gradient(156.88% 63.71% at 8.4% 78.12%, rgba(219, 141, 255, 0.60) 0%, rgba(255, 255, 255, 0) 100%),
154
151
  radial-gradient(265.09% 182.17% at 24.49% 5.63%, rgba(0, 87, 255, 0.60) 0%, rgba(255, 255, 255, 0) 100%), #FFF;
@@ -1,34 +0,0 @@
1
- export class Tour {
2
- constructor() {
3
- /** Unique identifier for the tour */
4
- this.id = '';
5
- /** List of tour steps to present to the user */
6
- this.steps = [];
7
- }
8
- }
9
- export class TourStep {
10
- constructor() {
11
- /** Unique identifier for the tour step */
12
- this.id = '';
13
- /** HTML formatted text that contains the primary content of the tour step */
14
- this.text = '';
15
- }
16
- }
17
- export class TourAnchor {
18
- constructor() {
19
- /**
20
- * Selector to attach the tooltip to. If defined but does not exist in the
21
- * DOM skip this step because it is probably hidden to the user because of
22
- * permissions.
23
- */
24
- this.selector = '';
25
- }
26
- }
27
- export class TourEvent {
28
- constructor(tours, tourAction = 'start', isAutoStart = false) {
29
- this.tours = tours;
30
- this.tourAction = tourAction;
31
- this.isAutoStart = isAutoStart;
32
- }
33
- }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91ci10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RvdXIvdG91ci10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8sSUFBSTtJQUFqQjtRQUNFLHFDQUFxQztRQUNyQyxPQUFFLEdBQVcsRUFBRSxDQUFDO1FBQ2hCLGdEQUFnRDtRQUNoRCxVQUFLLEdBQWUsRUFBRSxDQUFDO0lBT3pCLENBQUM7Q0FBQTtBQVdELE1BQU0sT0FBTyxRQUFRO0lBQXJCO1FBQ0UsMENBQTBDO1FBQzFDLE9BQUUsR0FBVyxFQUFFLENBQUM7UUFRaEIsNkVBQTZFO1FBQzdFLFNBQUksR0FBVyxFQUFFLENBQUM7SUFjcEIsQ0FBQztDQUFBO0FBRUQsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFlRTs7OztXQUlHO1FBQ0gsYUFBUSxHQUFXLEVBQUUsQ0FBQztJQUl4QixDQUFDO0NBQUE7QUFFRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUNTLEtBQWEsRUFDYixhQUF5QyxPQUFPLEVBQ2hELGNBQXVCLEtBQUs7UUFGNUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGVBQVUsR0FBVixVQUFVLENBQXNDO1FBQ2hELGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtJQUNqQyxDQUFDO0NBQ04iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERpYWxvZ0NvbnRlbnQgfSBmcm9tIFwiLi4vZGlhbG9nL2RpYWxvZy1jb250ZW50XCI7XHJcbmltcG9ydCB7IERpYWxvZ09wdGlvbnMsIERpYWxvZ1NpemUgfSBmcm9tIFwiLi4vZGlhbG9nL2RpYWxvZy10eXBlc1wiO1xyXG5pbXBvcnQgeyBUb29sdGlwUG9zaXRpb24gfSBmcm9tIFwiLi4vdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IHR5cGUgVG91ckNhY2hlRW50cnkgPSB7IGNvbXBsZXRlZDogYm9vbGVhbiB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRvdXI8VCA9IGFueT4ge1xyXG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRvdXIgKi9cclxuICBpZDogc3RyaW5nID0gJyc7XHJcbiAgLyoqIExpc3Qgb2YgdG91ciBzdGVwcyB0byBwcmVzZW50IHRvIHRoZSB1c2VyICovXHJcbiAgc3RlcHM6IFRvdXJTdGVwW10gPSBbXTtcclxuXHJcbiAgLyoqIEZpbmFsIHN0ZXAgdG8gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGlmIGRlZmluZWQgKi9cclxuICBleGl0U3RlcD86IFRvdXJTdGVwO1xyXG5cclxuICAvKiogRGlhbG9nIHRvIHByZXNlbnQgdG8gdGhlIHVzZXIgYmVmb3JlIHRoZSB0b3VyIGJlZ2lucyAqL1xyXG4gIGludHJvRGlhbG9nPzogVG91ckludHJvRGlhbG9nPFQ+XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRvdXJJbnRyb0RpYWxvZzxUPiB7XHJcbiAgY29udGVudD86IFR5cGU8RGlhbG9nQ29udGVudDxUPj4gfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGNvbnRleHQ/OiBUO1xyXG4gIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zO1xyXG4gIHNpemU/OiBEaWFsb2dTaXplO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFRvdXJTdGVwIHtcclxuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0b3VyIHN0ZXAgKi9cclxuICBpZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBPcHRpb25hbCB0b3VyIHN0ZXAgdGl0bGUgZGlzcGxheWVkIGF0IHRvcCBvZiB0b29sdGlwICovXHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBPcHRpb25hbCBtZWRpYSB0byBkaXNwbGF5IGJlbG93IHRpdGxlIGFuZCBhYm92ZSB0b3VyIHRleHQuIENhbiBiZSBhIGpwZywgcG5nLCBvciBnaWYgKi9cclxuICBtZWRpYT86IHN0cmluZztcclxuXHJcbiAgLyoqIEhUTUwgZm9ybWF0dGVkIHRleHQgdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBjb250ZW50IG9mIHRoZSB0b3VyIHN0ZXAgKi9cclxuICB0ZXh0OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRoZSBlbGVtZW50IHRvIGF0dGFjaCB0aGUgdG91ciBzdGVwIHRvLiBJZiB1bmRlZmluZWQsIHN0ZXAgd2lsbCBhcHBlYXIgY2VudGVyZWQgb24gc2NyZWVuICovXHJcbiAgYW5jaG9yPzogVG91ckFuY2hvcjtcclxuXHJcbiAgaGVscExpbms/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBBbGxvd3MgdGhlIHN0ZXAgdG8gaGF2ZSBhIGZpeGVkIHdpZHRoIGRlZmluZWQgZm9yIHRoZSB0b29sdGlwLiBJZiBub3QgZGVmaW5lZCB0aGUgd2lkdGggd2lsbCBiZSBkZWZhdWx0ZWQgdG8gNDAwLiBJZiB5b3Ugd291bGQgbGlrZSBcclxuICAgKiAgYXV0byB3aWR0aCBkZWZpbmUgYXMgJ2F1dG8nLlxyXG4gICAqL1xyXG4gIHdpZHRoPzogbnVtYmVyIHwgJ2F1dG8nO1xyXG5cclxuICAvKiogQWxsb3dzIHRoZSBzdGVwIHRvIGhhdmUgYSBtYXggd2lkdGggZGVmaW5lZCBmb3IgdGhlIHRvb2x0aXAgKi9cclxuICBtYXhXaWR0aD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRvdXJBbmNob3Ige1xyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGNzcyBzZWxlY3RvciBvZiBhbiBlbGVtZW50IHRvIGNsaWNrIGluIG9yZGVyIHRvIG9wZW4gYSBtZW51IG9yIFxyXG4gICAqIG92ZXJsYXkuIFNob3VsZCBub3QgY2F1c2UgYSBuYXZpZ2F0aW9uLiBJZiBkZWZpbmVkIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiBcclxuICAgKiB0aGUgRE9NLCBza2lwIHRoaXMgc3RlcCBiZWNhdXNlIGl0IGlzIHByb2JhYmx5IGhpZGRlbiB0byB0aGUgdXNlciBiZWNhdXNlIG9mIHBlcm1pc3Npb25zIFxyXG4gICAqL1xyXG4gIGNsaWNrQmVmb3JlPzogc3RyaW5nO1xyXG5cclxuICAvKiogXHJcbiAgICogQ1NTIHNlbGVjdG9yIG9mIGVsZW1lbnQgdG8gY2xpY2sgaW4gb3JkZXIgdG8gY2xvc2UgYSBtZW51IG9yIG92ZXJsYXkgXHJcbiAgICogYmVmb3JlIGNvbnRpbnVpbmcgdG8gdGhlIG5leHQgc3RlcC4gSWdub3JlZCBpZiBjbGlja0JlZm9yZSBpcyB1bmRlZmluZWQuIFxyXG4gICAqIFNob3VsZCBub3QgY2F1c2UgYSBuYXZpZ2F0aW9uIFxyXG4gICAqL1xyXG4gIGNsaWNrQWZ0ZXI/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBcclxuICAgKiBTZWxlY3RvciB0byBhdHRhY2ggdGhlIHRvb2x0aXAgdG8uIElmIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSAgXHJcbiAgICogRE9NIHNraXAgdGhpcyBzdGVwIGJlY2F1c2UgaXQgaXMgcHJvYmFibHkgaGlkZGVuIHRvIHRoZSB1c2VyIGJlY2F1c2Ugb2YgIFxyXG4gICAqIHBlcm1pc3Npb25zLlxyXG4gICAqL1xyXG4gIHNlbGVjdG9yOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIHJlbGF0aXZlIHRvIHRoZSBhbmNob3IuIGh0dHBzOi8vZW5lcmd5Y2FwLWNvbXBvbmVudHMubmV0bGlmeS5hcHAvdG9vbHRpcCNwb3NpdGlvbiAqL1xyXG4gIHBvc2l0aW9uPzogVG9vbHRpcFBvc2l0aW9uXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUb3VyRXZlbnQge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHRvdXJzOiBUb3VyW10sXHJcbiAgICBwdWJsaWMgdG91ckFjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2FwcGVuZCcgPSAnc3RhcnQnLFxyXG4gICAgcHVibGljIGlzQXV0b1N0YXJ0OiBib29sZWFuID0gZmFsc2UsXHJcbiAgKSB7IH1cclxufSJdfQ==
@@ -1,398 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { Component, Inject, ViewChild } from '@angular/core';
3
- import { Subject, lastValueFrom } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./tour.service";
7
- import * as i2 from "./../tooltip/tooltip.service";
8
- import * as i3 from "../../core/telemetry.service";
9
- import * as i4 from "../../core/cache.service";
10
- import * as i5 from "../dialog/dialog.service";
11
- import * as i6 from "@ngx-translate/core";
12
- import * as i7 from "@angular/common";
13
- import * as i8 from "../../controls/link-button/link-button.component";
14
- export class TourComponent {
15
- constructor(tourService, tooltipService, telemetryService, cacheService, dialogService, translateService, document) {
16
- this.tourService = tourService;
17
- this.tooltipService = tooltipService;
18
- this.telemetryService = telemetryService;
19
- this.cacheService = cacheService;
20
- this.dialogService = dialogService;
21
- this.translateService = translateService;
22
- this.document = document;
23
- /** Used to tell the UI that the step being shown is an exit step. This will change the
24
- * link text and the action when clicked
25
- */
26
- this.showDoneButton = false;
27
- /** Array of tours provided when the start tour event was detected */
28
- this.tours = [];
29
- // Couple indexes for the current tour/step stored for easier reference when knowing if we are at the end of the steps/tours
30
- this.currentStepIndex = -1;
31
- this.currentTourIndex = -1;
32
- /** Used to know if the restore step should be triggered when the tour is dismissed */
33
- this.isAutoStart = false;
34
- this.destroyed = new Subject();
35
- }
36
- ngOnInit() {
37
- this.tourService.events.pipe(takeUntil(this.destroyed)).subscribe(async (event) => {
38
- if (event.tourAction === 'start') {
39
- await this.setupTourComponent(event);
40
- }
41
- else if (event.tourAction === 'end') {
42
- if (this.currentTour) {
43
- this.writeCompletionKeyForAllTours();
44
- await this.endTour();
45
- }
46
- }
47
- else if (event.tourAction === 'append') {
48
- let visibleTours = event.tours;
49
- // If this was triggered via auto start then we need to remove any tours that have been completed
50
- if (event.isAutoStart) {
51
- visibleTours = this.removeCompletedTours(visibleTours);
52
- }
53
- // If there is already a current tour, then we need to append the new tours to the current tour
54
- if (this.currentTour) {
55
- this.tours = this.tours.concat(visibleTours);
56
- }
57
- else {
58
- // There is not a current tour, so treat this as a start event
59
- await this.setupTourComponent(event);
60
- }
61
- }
62
- });
63
- }
64
- ngOnDestroy() {
65
- this.destroyed.next();
66
- this.destroyed.unsubscribe();
67
- }
68
- /**
69
- * Called when a restore step has been completed
70
- */
71
- async done() {
72
- this.writeCompletionKey(this.currentTour);
73
- await this.endTour();
74
- }
75
- /**
76
- * Called when a tour begins and when the user clicks next on the current tour step. It will handle any after click actions and then
77
- * find the next step and present it to the user and transition to a restore step or new tour if needed.
78
- */
79
- async showNextStep() {
80
- // Before moving to the next step, make sure the current step does not have a click after defined. This could be hiding a menu
81
- // that was opened for the soon to be previous step.
82
- await this.waitForTimeout(this.handleClickAfter.bind(this));
83
- // Remove any previous tooltips
84
- this.removeTooltip();
85
- // Get our next step index to display to the user
86
- this.currentStepIndex = this.getNextAvailableStepIndex();
87
- if (this.currentStepIndex === -1) {
88
- // No more steps found, we either need to check for the exit step if this is the last tour
89
- // in the tours array or advance to the next tour
90
- if (this.currentTourIndex === this.tours.length - 1) {
91
- await this.handleExitStep();
92
- }
93
- else {
94
- // Write the completion key for the current tour before we move to the next
95
- this.writeCompletionKey(this.currentTour);
96
- this.currentTourIndex++;
97
- await this.showNextTour();
98
- }
99
- }
100
- else {
101
- this.currentTourStep = this.currentTour?.steps[this.currentStepIndex];
102
- // Now that we have our current step index, take care of any click before elements before showing the
103
- // tooltip. This could be opening a menu to get the tooltip element visible.
104
- await this.waitForTimeout(this.handleClickBefore.bind(this));
105
- // Click befores are done, now let's show the tooltip defined in the tour step
106
- await this.waitForTimeout(this.showStepTooltip.bind(this));
107
- }
108
- }
109
- async setupTourComponent(event) {
110
- // End any tours that may have been in progress if the user kicks off a new one
111
- if (this.currentTour) {
112
- this.writeCompletionKeyForAllTours();
113
- await this.endTour();
114
- }
115
- this.isAutoStart = event.isAutoStart;
116
- if (event.isAutoStart) {
117
- this.tours = this.removeCompletedTours(event.tours);
118
- }
119
- else {
120
- this.tours = event.tours;
121
- }
122
- if (this.tours.length) {
123
- this.showDoneButton = false;
124
- this.currentTourStep = undefined;
125
- this.currentStepIndex = -1;
126
- // Prime the index for the first tour
127
- this.currentTourIndex = 0;
128
- await this.showNextTour();
129
- }
130
- }
131
- /**
132
- * Shows a tour and emits an event that it was started
133
- * @param tour
134
- */
135
- async showNextTour() {
136
- // Track a tour started event if the consumer of the library has telemetry configured
137
- this.telemetryService.trackEvent('TourStarted', { tourId: this.currentTour.id });
138
- let continueTour = true;
139
- if (this.isAutoStart && this.currentTourIndex === 0 && this.currentTour?.introDialog) {
140
- let result = await lastValueFrom(this.dialogService.openDialog(this.currentTour.introDialog.content, this.currentTour.introDialog.size ?? 'small', this.currentTour.introDialog.context ?? undefined, this.currentTour.introDialog.options ?? undefined));
141
- if (!result.save) {
142
- continueTour = false;
143
- this.writeCompletionKeyForAllTours();
144
- // Advance to the last tour if there are multiple for its exit step
145
- this.currentTourIndex = this.tours.length - 1;
146
- await this.handleExitStep();
147
- }
148
- }
149
- if (continueTour) {
150
- this.showNextStep();
151
- }
152
- }
153
- async endTour() {
154
- // Handle any click afters for the active step shown before shutting it down
155
- await this.waitForTimeout(this.handleClickAfter.bind(this));
156
- this.currentTourStep = undefined;
157
- this.tours = [];
158
- this.removeTooltip();
159
- }
160
- /**
161
- * Displays a tooltip for the current tour step
162
- */
163
- async showStepTooltip() {
164
- // Track an event if the consumer of the library has telemetry configured
165
- this.telemetryService.trackEvent('TourStepChange', { tourId: this.currentTour.id, tourStepId: this.currentTourStep.id });
166
- const tooltipElement = this.document.querySelector(this.currentTourStep.anchor.selector);
167
- if (tooltipElement) {
168
- // Default width if none provided
169
- let stepWidth = 432;
170
- // Check the current tour step width and decide if it needs to change from the default value
171
- // based on whether the step defined it or not
172
- if (this.currentTourStep?.width !== undefined) {
173
- if (typeof this.currentTourStep.width === 'number') {
174
- stepWidth = this.currentTourStep.width;
175
- }
176
- else if (this.currentTourStep.width === 'auto') {
177
- stepWidth = undefined;
178
- }
179
- }
180
- const options = {
181
- id: `${this.currentTour?.id}_${this.currentTourStep.id}`,
182
- text: this.translateService.instant(this.currentTourStep.text),
183
- title: this.currentTourStep.title ? this.translateService.instant(this.currentTourStep.title) : undefined,
184
- customContent: this.custom,
185
- dismissible: true,
186
- maxWidth: this.currentTourStep?.maxWidth,
187
- width: stepWidth,
188
- backgroundColor: 'var(--ec-background-color-tour)',
189
- titleColor: 'var(--ec-color-tour-title)'
190
- };
191
- this.tooltip = this.tooltipService.show(tooltipElement, this.currentTourStep.anchor?.position, options);
192
- await this.waitForTimeout(this.focusOnNextOrDoneButton.bind(this));
193
- this.subscribeToTooltipOnHide();
194
- }
195
- }
196
- /**
197
- * Subscribes to the tooltips onHide event emitter and reacts if the user dismisses the tooltip
198
- */
199
- async subscribeToTooltipOnHide() {
200
- let tooltipSubscription = this.tooltip?.onHide.pipe(takeUntil(this.destroyed)).subscribe(async () => {
201
- tooltipSubscription?.unsubscribe();
202
- this.writeCompletionKeyForAllTours();
203
- // If this is dismissed during an auto start tour then handle the exit step
204
- // Check that the done button is shown as well, if the done is shown then we're in the exit step
205
- // and dismissing should just end the tour
206
- if (this.isAutoStart && !this.showDoneButton) {
207
- // Advance to the last tour if there are multiple for its exit step
208
- this.currentTourIndex = this.tours.length - 1;
209
- await this.handleExitStep();
210
- }
211
- else {
212
- await this.endTour();
213
- }
214
- });
215
- }
216
- /**
217
- * Loops through the current tour steps starting after the current step index. It will try to find a visible
218
- * selector and if so return the index.
219
- * @returns
220
- */
221
- getNextAvailableStepIndex() {
222
- let nextStepIndex = -1;
223
- // Look through the steps starting with the current index and find the next that is avaiable
224
- // for the user.
225
- for (let i = this.currentStepIndex + 1; i < this.currentTour.steps.length; i++) {
226
- if (this.currentTour?.steps[i].anchor && this.stepElementFound(this.currentTour.steps[i].anchor)) {
227
- return i;
228
- }
229
- }
230
- return nextStepIndex;
231
- }
232
- /**
233
- * Try to find the tour step element to know if it is visible for the user. Check for the clickBefore first if defined
234
- * @param anchor
235
- * @returns
236
- */
237
- stepElementFound(anchor) {
238
- if (anchor.clickBefore) {
239
- return this.document.querySelector(anchor.clickBefore) !== null;
240
- }
241
- else {
242
- return this.document.querySelector(anchor.selector) !== null;
243
- }
244
- }
245
- /**
246
- * Some tour steps may have a click after defined. If so call the click method on the html element
247
- */
248
- handleClickAfter() {
249
- let selector = this.currentTourStep?.anchor?.clickAfter;
250
- if (selector) {
251
- this.clickElementIfFound(selector);
252
- }
253
- }
254
- /**
255
- * Some tour steps may have a click before defined. If so call the click method on the html element
256
- */
257
- handleClickBefore() {
258
- if (this.currentTourStep?.anchor?.clickBefore) {
259
- this.clickElementIfFound(this.currentTourStep.anchor?.clickBefore);
260
- }
261
- }
262
- /**
263
- * Checks for an exit step on the current tour and if found displays the step
264
- */
265
- async handleExitStep() {
266
- if (this.currentTour?.exitStep) {
267
- this.removeTooltip();
268
- this.showDoneButton = true;
269
- this.currentTourStep = this.currentTour?.exitStep;
270
- await this.waitForTimeout(this.handleClickBefore.bind(this));
271
- await this.waitForTimeout(this.showStepTooltip.bind(this));
272
- }
273
- }
274
- /**
275
- * Try to find the element with the selector provided and if so click it. This is how tour steps will open/close menus to
276
- * give a tour to the user
277
- * @param selector
278
- */
279
- clickElementIfFound(selector) {
280
- if (selector !== undefined) {
281
- const element = this.document.querySelector(selector);
282
- if (element) {
283
- element.click();
284
- }
285
- }
286
- }
287
- /**
288
- * When auto starting tours we will want to remove any that have the local storage key written as completed so
289
- * they are not presented to the user again.
290
- * @param tours
291
- * @returns
292
- */
293
- removeCompletedTours(tours) {
294
- return tours.filter(tour => {
295
- let cacheValue = this.cacheService.getItem(this.makeCacheKey(tour));
296
- if (cacheValue) {
297
- return !cacheValue.completed;
298
- }
299
- else {
300
- return true;
301
- }
302
- });
303
- }
304
- /**
305
- * Writes a key to local storage so the tour will not be shown again automatically
306
- */
307
- writeCompletionKey(tour) {
308
- if (tour) {
309
- this.cacheService.setItem(this.makeCacheKey(tour), { completed: true });
310
- }
311
- }
312
- /**
313
- * When dismissing a tour or one being dismissed via a navigation event, etc we will want to mark
314
- * every tour in the array as completed so it doesn't resurface unless the user requests the tour.
315
- * This function will loop over all and write the local storage key
316
- */
317
- writeCompletionKeyForAllTours() {
318
- this.tours.forEach(tour => {
319
- this.writeCompletionKey(tour);
320
- });
321
- }
322
- /**
323
- * Cache key used to set/get the completion status of a tour
324
- * @param tour
325
- * @returns
326
- */
327
- makeCacheKey(tour) {
328
- return this.tourService.getCacheKey(tour);
329
- }
330
- /**
331
- * Removes a tooltip from the view, used when switching tour steps and closing a tour
332
- */
333
- removeTooltip() {
334
- this.tooltip?.overlayRef?.dispose();
335
- }
336
- /**
337
- * Returns the tour based on the current index
338
- */
339
- get currentTour() {
340
- if (this.currentTourIndex > -1 && this.currentTourIndex < this.tours.length) {
341
- return this.tours[this.currentTourIndex];
342
- }
343
- else {
344
- return undefined;
345
- }
346
- }
347
- /**
348
- * The click before/after and show tooltip functions need to be wrapped in setTimeout for the UI
349
- * to operate correctly but setTimeout is an action we cannot await so we're wrapping it in a promise to return
350
- * so the function calls can await the action
351
- * @param fn
352
- * @returns
353
- */
354
- waitForTimeout(fn) {
355
- return new Promise(resolve => {
356
- setTimeout(() => {
357
- fn();
358
- resolve();
359
- });
360
- });
361
- }
362
- /**
363
- * Find the "next" or "done" button and focus on it.
364
- *
365
- * They are mutually exclusive, so if we cannot find the next button
366
- * we look for the done button.
367
- */
368
- focusOnNextOrDoneButton() {
369
- if (!this.focusOnElement(`#${this.currentTourStep.id}_nextButton`)) {
370
- this.focusOnElement(`#${this.currentTourStep.id}_doneButton`);
371
- }
372
- }
373
- /**
374
- * Find an element with given selector and focus on it.
375
- * Return false if element not found.
376
- */
377
- focusOnElement(selector) {
378
- const element = this.document.querySelector(selector);
379
- if (element) {
380
- element.focus();
381
- return true;
382
- }
383
- return false;
384
- }
385
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TourComponent, deps: [{ token: i1.TourService }, { token: i2.TooltipService }, { token: i3.TelemetryService }, { token: i4.CacheService }, { token: i5.DialogService }, { token: i6.TranslateService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
386
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TourComponent, selector: "ec-tour", viewQueries: [{ propertyName: "custom", first: true, predicate: ["tourTooltip"], descendants: true }], ngImport: i0, template: "<ng-template #tourTooltip>\r\n <div *ngIf=\"currentTourStep?.media\"\r\n class=\"mb-3\">\r\n <img id=\"{{currentTourStep?.id + '_media'}}\"\r\n style=\"max-width: 100%;\"\r\n src=\"{{currentTourStep?.media}}\">\r\n </div>\r\n <div class=\"font-color-primary-light px-3 mb-3\"\r\n [innerHtml]=\"currentTourStep?.text | translate\">\r\n </div>\r\n <a *ngIf=\"currentTourStep?.helpLink\" id=\"{{currentTourStep?.id + '_helpLink'}}\" class=\"d-block mb-3 px-3\" target=\"_blank\" href=\"{{currentTourStep?.helpLink}}\" translate>LearnMore_SC</a>\r\n <footer class=\"px-3 mt-3 d-flex\">\r\n <button id=\"{{currentTourStep?.id + '_nextButton'}}\" *ngIf=\"!showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"showNextStep()\" translate>Next_TC</button>\r\n <button id=\"{{currentTourStep?.id + '_doneButton'}}\" *ngIf=\"showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"done()\" translate>Done_TC</button>\r\n </footer>\r\n</ng-template>", styles: [".tourAction{color:var(--ec-tour-action-color, var(--ec-color-brand-green))!important}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i8.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
387
- }
388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TourComponent, decorators: [{
389
- type: Component,
390
- args: [{ selector: 'ec-tour', template: "<ng-template #tourTooltip>\r\n <div *ngIf=\"currentTourStep?.media\"\r\n class=\"mb-3\">\r\n <img id=\"{{currentTourStep?.id + '_media'}}\"\r\n style=\"max-width: 100%;\"\r\n src=\"{{currentTourStep?.media}}\">\r\n </div>\r\n <div class=\"font-color-primary-light px-3 mb-3\"\r\n [innerHtml]=\"currentTourStep?.text | translate\">\r\n </div>\r\n <a *ngIf=\"currentTourStep?.helpLink\" id=\"{{currentTourStep?.id + '_helpLink'}}\" class=\"d-block mb-3 px-3\" target=\"_blank\" href=\"{{currentTourStep?.helpLink}}\" translate>LearnMore_SC</a>\r\n <footer class=\"px-3 mt-3 d-flex\">\r\n <button id=\"{{currentTourStep?.id + '_nextButton'}}\" *ngIf=\"!showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"showNextStep()\" translate>Next_TC</button>\r\n <button id=\"{{currentTourStep?.id + '_doneButton'}}\" *ngIf=\"showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"done()\" translate>Done_TC</button>\r\n </footer>\r\n</ng-template>", styles: [".tourAction{color:var(--ec-tour-action-color, var(--ec-color-brand-green))!important}\n"] }]
391
- }], ctorParameters: () => [{ type: i1.TourService }, { type: i2.TooltipService }, { type: i3.TelemetryService }, { type: i4.CacheService }, { type: i5.DialogService }, { type: i6.TranslateService }, { type: Document, decorators: [{
392
- type: Inject,
393
- args: [DOCUMENT]
394
- }] }], propDecorators: { custom: [{
395
- type: ViewChild,
396
- args: ['tourTooltip']
397
- }] } });
398
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91ci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90b3VyL3RvdXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdG91ci90b3VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxGLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQWUzQyxNQUFNLE9BQU8sYUFBYTtJQTRCeEIsWUFDVSxXQUF3QixFQUN4QixjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsZ0JBQWtDLEVBQ2hCLFFBQWtCO1FBTnBDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTdCOUM7O1dBRUc7UUFDSSxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUt2QyxxRUFBcUU7UUFDN0QsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQiw0SEFBNEg7UUFDcEgscUJBQWdCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIs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QUFnQixDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxjQUFjLENBQUMsUUFBZ0I7UUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNYLE9BQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQWpiVSxhQUFhLG9NQW1DZCxRQUFRO21HQW5DUCxhQUFhLHNKQ25CMUIsMGhDQWVjOzs0RkRJRCxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFNBQVM7OzBCQXVDaEIsTUFBTTsyQkFBQyxRQUFRO3lDQVRlLE1BQU07c0JBQXRDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdGVsZW1ldHJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCwgVG9vbHRpcE9wdGlvbnMgfSBmcm9tICcuLy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUb29sdGlwU2VydmljZSB9IGZyb20gJy4vLi4vdG9vbHRpcC90b29sdGlwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb3VyLCBUb3VyQW5jaG9yLCBUb3VyQ2FjaGVFbnRyeSwgVG91ckV2ZW50LCBUb3VyU3RlcCB9IGZyb20gJy4vdG91ci10eXBlcyc7XHJcbmltcG9ydCB7IFRvdXJTZXJ2aWNlIH0gZnJvbSAnLi90b3VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy10b3VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdG91ci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdG91ci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb3VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvKiogQ3VycmVudCB0b3VyIHN0ZXAgYmVpbmcgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBjdXN0b20gY29udGVudCBpbiB0aGUgdGVtcGxhdGUgaXMgYm91bmQgdG8gcHJvcGVydGllcyBvbiB0aGlzIGFuZCB0aGVyZWZvciBuZWVkcyB0byBiZVxyXG4gICogIGl0cyBvd24gcHJvcGVydHkuIFRoZSBleGl0U3RlcCBpcyBhIHRvdXIgc3RlcCBhbmQgdGhpcyB3aWxsIGhvbGQgdGhhdCBzdGVwIGF0IHRoZSBlbmQgb2YgdGhlIHRvdXIuXHJcbiAgKi9cclxuICBwdWJsaWMgY3VycmVudFRvdXJTdGVwPzogVG91clN0ZXA7XHJcblxyXG4gIC8qKiBVc2VkIHRvIHRlbGwgdGhlIFVJIHRoYXQgdGhlIHN0ZXAgYmVpbmcgc2hvd24gaXMgYW4gZXhpdCBzdGVwLiBUaGlzIHdpbGwgY2hhbmdlIHRoZVxyXG4gICAqICBsaW5rIHRleHQgYW5kIHRoZSBhY3Rpb24gd2hlbiBjbGlja2VkXHJcbiAgICovXHJcbiAgcHVibGljIHNob3dEb25lQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHRvb2x0aXAgdXNlZCBmb3IgdGhlIHRvdXIgc3RlcHMgKi9cclxuICBwdWJsaWMgdG9vbHRpcD86IFRvb2x0aXBDb21wb25lbnQ7XHJcblxyXG4gIC8qKiBBcnJheSBvZiB0b3VycyBwcm92aWRlZCB3aGVuIHRoZSBzdGFydCB0b3VyIGV2ZW50IHdhcyBkZXRlY3RlZCAqL1xyXG4gIHByaXZhdGUgdG91cnM6IFRvdXJbXSA9IFtdO1xyXG5cclxuICAvLyBDb3VwbGUgaW5kZXhlcyBmb3IgdGhlIGN1cnJlbnQgdG91ci9zdGVwIHN0b3JlZCBmb3IgZWFzaWVyIHJlZmVyZW5jZSB3aGVuIGtub3dpbmcgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0ZXBzL3RvdXJzXHJcbiAgcHJpdmF0ZSBjdXJyZW50U3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuICBwcml2YXRlIGN1cnJlbnRUb3VySW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAvKiogVXNlZCB0byBrbm93IGlmIHRoZSByZXN0b3JlIHN0ZXAgc2hvdWxkIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0b3VyIGlzIGRpc21pc3NlZCAqL1xyXG4gIHByaXZhdGUgaXNBdXRvU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCd0b3VyVG9vbHRpcCcpIHB1YmxpYyBjdXN0b20hOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdG91clNlcnZpY2U6IFRvdXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b29sdGlwU2VydmljZTogVG9vbHRpcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRlbGVtZXRyeVNlcnZpY2U6IFRlbGVtZXRyeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdXJTZXJ2aWNlLmV2ZW50cy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZShhc3luYyBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50b3VyQWN0aW9uID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFRvdXJDb21wb25lbnQoZXZlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnRvdXJBY3Rpb24gPT09ICdlbmQnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXIpIHtcclxuICAgICAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5kVG91cigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChldmVudC50b3VyQWN0aW9uID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgIGxldCB2aXNpYmxlVG91cnM6IFRvdXJbXSA9IGV2ZW50LnRvdXJzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIHRyaWdnZXJlZCB2aWEgYXV0byBzdGFydCB0aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIGFueSB0b3VycyB0aGF0IGhhdmUgYmVlbiBjb21wbGV0ZWRcclxuICAgICAgICBpZiAoZXZlbnQuaXNBdXRvU3RhcnQpIHtcclxuICAgICAgICAgIHZpc2libGVUb3VycyA9IHRoaXMucmVtb3ZlQ29tcGxldGVkVG91cnModmlzaWJsZVRvdXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBjdXJyZW50IHRvdXIsIHRoZW4gd2UgbmVlZCB0byBhcHBlbmQgdGhlIG5ldyB0b3VycyB0byB0aGUgY3VycmVudCB0b3VyXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXIpIHtcclxuICAgICAgICAgIHRoaXMudG91cnMgPSB0aGlzLnRvdXJzLmNvbmNhdCh2aXNpYmxlVG91cnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBUaGVyZSBpcyBub3QgYSBjdXJyZW50IHRvdXIsIHNvIHRyZWF0IHRoaXMgYXMgYSBzdGFydCBldmVudFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFRvdXJDb21wb25lbnQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhIHJlc3RvcmUgc3RlcCBoYXMgYmVlbiBjb21wbGV0ZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5KHRoaXMuY3VycmVudFRvdXIpO1xyXG4gICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhIHRvdXIgYmVnaW5zIGFuZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBuZXh0IG9uIHRoZSBjdXJyZW50IHRvdXIgc3RlcC4gSXQgd2lsbCBoYW5kbGUgYW55IGFmdGVyIGNsaWNrIGFjdGlvbnMgYW5kIHRoZW5cclxuICAgKiBmaW5kIHRoZSBuZXh0IHN0ZXAgYW5kIHByZXNlbnQgaXQgdG8gdGhlIHVzZXIgYW5kIHRyYW5zaXRpb24gdG8gYSByZXN0b3JlIHN0ZXAgb3IgbmV3IHRvdXIgaWYgbmVlZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBzaG93TmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBCZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IHN0ZXAsIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdGVwIGRvZXMgbm90IGhhdmUgYSBjbGljayBhZnRlciBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGhpZGluZyBhIG1lbnVcclxuICAgIC8vIHRoYXQgd2FzIG9wZW5lZCBmb3IgdGhlIHNvb24gdG8gYmUgcHJldmlvdXMgc3RlcC5cclxuICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5oYW5kbGVDbGlja0FmdGVyLmJpbmQodGhpcykpO1xyXG5cclxuICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXMgdG9vbHRpcHNcclxuICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG5cclxuICAgIC8vIEdldCBvdXIgbmV4dCBzdGVwIGluZGV4IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXJcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZVN0ZXBJbmRleCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIC8vIE5vIG1vcmUgc3RlcHMgZm91bmQsIHdlIGVpdGhlciBuZWVkIHRvIGNoZWNrIGZvciB0aGUgZXhpdCBzdGVwIGlmIHRoaXMgaXMgdGhlIGxhc3QgdG91clxyXG4gICAgICAvLyBpbiB0aGUgdG91cnMgYXJyYXkgb3IgYWR2YW5jZSB0byB0aGUgbmV4dCB0b3VyXHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRUb3VySW5kZXggPT09IHRoaXMudG91cnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhpdFN0ZXAoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBXcml0ZSB0aGUgY29tcGxldGlvbiBrZXkgZm9yIHRoZSBjdXJyZW50IHRvdXIgYmVmb3JlIHdlIG1vdmUgdG8gdGhlIG5leHRcclxuICAgICAgICB0aGlzLndyaXRlQ29tcGxldGlvbktleSh0aGlzLmN1cnJlbnRUb3VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4Kys7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93TmV4dFRvdXIoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VG91clN0ZXAgPSB0aGlzLmN1cnJlbnRUb3VyPy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXhdO1xyXG5cclxuICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBvdXIgY3VycmVudCBzdGVwIGluZGV4LCB0YWtlIGNhcmUgb2YgYW55IGNsaWNrIGJlZm9yZSBlbGVtZW50cyBiZWZvcmUgc2hvd2luZyB0aGVcclxuICAgICAgLy8gdG9vbHRpcC4gVGhpcyBjb3VsZCBiZSBvcGVuaW5nIGEgbWVudSB0byBnZXQgdGhlIHRvb2x0aXAgZWxlbWVudCB2aXNpYmxlLlxyXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JUaW1lb3V0KHRoaXMuaGFuZGxlQ2xpY2tCZWZvcmUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAvLyBDbGljayBiZWZvcmVzIGFyZSBkb25lLCBub3cgbGV0J3Mgc2hvdyB0aGUgdG9vbHRpcCBkZWZpbmVkIGluIHRoZSB0b3VyIHN0ZXBcclxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yVGltZW91dCh0aGlzLnNob3dTdGVwVG9vbHRpcC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBUb3VyQ29tcG9uZW50KGV2ZW50OiBUb3VyRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEVuZCBhbnkgdG91cnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHByb2dyZXNzIGlmIHRoZSB1c2VyIGtpY2tzIG9mZiBhIG5ldyBvbmVcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyKSB7XHJcbiAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0F1dG9TdGFydCA9IGV2ZW50LmlzQXV0b1N0YXJ0O1xyXG5cclxuICAgIGlmIChldmVudC5pc0F1dG9TdGFydCkge1xyXG4gICAgICB0aGlzLnRvdXJzID0gdGhpcy5yZW1vdmVDb21wbGV0ZWRUb3VycyhldmVudC50b3Vycyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvdXJzID0gZXZlbnQudG91cnM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudG91cnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RvbmVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAtMTtcclxuXHJcbiAgICAgIC8vIFByaW1lIHRoZSBpbmRleCBmb3IgdGhlIGZpcnN0IHRvdXJcclxuICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gMDtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuc2hvd05leHRUb3VyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyBhIHRvdXIgYW5kIGVtaXRzIGFuIGV2ZW50IHRoYXQgaXQgd2FzIHN0YXJ0ZWRcclxuICAgKiBAcGFyYW0gdG91clxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgc2hvd05leHRUb3VyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVHJhY2sgYSB0b3VyIHN0YXJ0ZWQgZXZlbnQgaWYgdGhlIGNvbnN1bWVyIG9mIHRoZSBsaWJyYXJ5IGhhcyB0ZWxlbWV0cnkgY29uZmlndXJlZFxyXG4gICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRyYWNrRXZlbnQoJ1RvdXJTdGFydGVkJywgeyB0b3VySWQ6IHRoaXMuY3VycmVudFRvdXIhLmlkIH0pO1xyXG5cclxuICAgIGxldCBjb250aW51ZVRvdXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLmlzQXV0b1N0YXJ0ICYmIHRoaXMuY3VycmVudFRvdXJJbmRleCA9PT0gMCAmJiB0aGlzLmN1cnJlbnRUb3VyPy5pbnRyb0RpYWxvZykge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRpYWxvZyh0aGlzLmN1cnJlbnRUb3VyLmludHJvRGlhbG9nLmNvbnRlbnQhLCB0aGlzLmN1cnJlbnRUb3VyLmludHJvRGlhbG9nLnNpemUgPz8gJ3NtYWxsJywgdGhpcy5jdXJyZW50VG91ci5pbnRyb0RpYWxvZy5jb250ZXh0ID8/IHVuZGVmaW5lZCwgdGhpcy5jdXJyZW50VG91ci5pbnRyb0RpYWxvZy5vcHRpb25zID8/IHVuZGVmaW5lZCkpO1xyXG4gICAgICBpZiAoIXJlc3VsdC5zYXZlKSB7XHJcbiAgICAgICAgY29udGludWVUb3VyID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBsYXN0IHRvdXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvciBpdHMgZXhpdCBzdGVwXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gdGhpcy50b3Vycy5sZW5ndGggLSAxO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhpdFN0ZXAoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb250aW51ZVRvdXIpIHtcclxuICAgICAgdGhpcy5zaG93TmV4dFN0ZXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVG91cigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEhhbmRsZSBhbnkgY2xpY2sgYWZ0ZXJzIGZvciB0aGUgYWN0aXZlIHN0ZXAgc2hvd24gYmVmb3JlIHNodXR0aW5nIGl0IGRvd25cclxuICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5oYW5kbGVDbGlja0FmdGVyLmJpbmQodGhpcykpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b3VycyA9IFtdO1xyXG5cclxuICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheXMgYSB0b29sdGlwIGZvciB0aGUgY3VycmVudCB0b3VyIHN0ZXBcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHNob3dTdGVwVG9vbHRpcCgpIHtcclxuICAgIC8vIFRyYWNrIGFuIGV2ZW50IGlmIHRoZSBjb25zdW1lciBvZiB0aGUgbGlicmFyeSBoYXMgdGVsZW1ldHJ5IGNvbmZpZ3VyZWRcclxuICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS50cmFja0V2ZW50KCdUb3VyU3RlcENoYW5nZScsIHsgdG91cklkOiB0aGlzLmN1cnJlbnRUb3VyIS5pZCwgdG91clN0ZXBJZDogdGhpcy5jdXJyZW50VG91clN0ZXAhLmlkIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvb2x0aXBFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY3VycmVudFRvdXJTdGVwIS5hbmNob3IhLnNlbGVjdG9yKTtcclxuXHJcbiAgICBpZiAodG9vbHRpcEVsZW1lbnQpIHtcclxuICAgICAgLy8gRGVmYXVsdCB3aWR0aCBpZiBub25lIHByb3ZpZGVkXHJcbiAgICAgIGxldCBzdGVwV2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDQzMjtcclxuXHJcbiAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHRvdXIgc3RlcCB3aWR0aCBhbmQgZGVjaWRlIGlmIGl0IG5lZWRzIHRvIGNoYW5nZSBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIC8vIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHN0ZXAgZGVmaW5lZCBpdCBvciBub3RcclxuICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXJTdGVwPy53aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1cnJlbnRUb3VyU3RlcC53aWR0aCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHN0ZXBXaWR0aCA9IHRoaXMuY3VycmVudFRvdXJTdGVwLndpZHRoO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VG91clN0ZXAud2lkdGggPT09ICdhdXRvJykge1xyXG4gICAgICAgICAgc3RlcFdpZHRoID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgb3B0aW9uczogVG9vbHRpcE9wdGlvbnMgPSB7XHJcbiAgICAgICAgaWQ6IGAke3RoaXMuY3VycmVudFRvdXI/LmlkfV8ke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1gLFxyXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY3VycmVudFRvdXJTdGVwIS50ZXh0KSxcclxuICAgICAgICB0aXRsZTogdGhpcy5jdXJyZW50VG91clN0ZXAhLnRpdGxlID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jdXJyZW50VG91clN0ZXAhLnRpdGxlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBjdXN0b21Db250ZW50OiB0aGlzLmN1c3RvbSxcclxuICAgICAgICBkaXNtaXNzaWJsZTogdHJ1ZSxcclxuICAgICAgICBtYXhXaWR0aDogdGhpcy5jdXJyZW50VG91clN0ZXA/Lm1heFdpZHRoLFxyXG4gICAgICAgIHdpZHRoOiBzdGVwV2lkdGgsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZWMtYmFja2dyb3VuZC1jb2xvci10b3VyKScsXHJcbiAgICAgICAgdGl0bGVDb2xvcjogJ3ZhcigtLWVjLWNvbG9yLXRvdXItdGl0bGUpJ1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy50b29sdGlwID0gdGhpcy50b29sdGlwU2VydmljZS5zaG93KHRvb2x0aXBFbGVtZW50IGFzIEhUTUxFbGVtZW50LCB0aGlzLmN1cnJlbnRUb3VyU3RlcCEuYW5jaG9yPy5wb3NpdGlvbiwgb3B0aW9ucyk7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5mb2N1c09uTmV4dE9yRG9uZUJ1dHRvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb1Rvb2x0aXBPbkhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIHRvb2x0aXBzIG9uSGlkZSBldmVudCBlbWl0dGVyIGFuZCByZWFjdHMgaWYgdGhlIHVzZXIgZGlzbWlzc2VzIHRoZSB0b29sdGlwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzdWJzY3JpYmVUb1Rvb2x0aXBPbkhpZGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9vbHRpcFN1YnNjcmlwdGlvbiA9IHRoaXMudG9vbHRpcD8ub25IaWRlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcclxuICAgICAgdG9vbHRpcFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgLy8gSWYgdGhpcyBpcyBkaXNtaXNzZWQgZHVyaW5nIGFuIGF1dG8gc3RhcnQgdG91ciB0aGVuIGhhbmRsZSB0aGUgZXhpdCBzdGVwXHJcbiAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGRvbmUgYnV0dG9uIGlzIHNob3duIGFzIHdlbGwsIGlmIHRoZSBkb25lIGlzIHNob3duIHRoZW4gd2UncmUgaW4gdGhlIGV4aXQgc3RlcFxyXG4gICAgICAvLyBhbmQgZGlzbWlzc2luZyBzaG91bGQganVzdCBlbmQgdGhlIHRvdXJcclxuICAgICAgaWYgKHRoaXMuaXNBdXRvU3RhcnQgJiYgIXRoaXMuc2hvd0RvbmVCdXR0b24pIHtcclxuICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBsYXN0IHRvdXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvciBpdHMgZXhpdCBzdGVwXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gdGhpcy50b3Vycy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4aXRTdGVwKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9vcHMgdGhyb3VnaCB0aGUgY3VycmVudCB0b3VyIHN0ZXBzIHN0YXJ0aW5nIGFmdGVyIHRoZSBjdXJyZW50IHN0ZXAgaW5kZXguIEl0IHdpbGwgdHJ5IHRvIGZpbmQgYSB2aXNpYmxlXHJcbiAgICogc2VsZWN0b3IgYW5kIGlmIHNvIHJldHVybiB0aGUgaW5kZXguXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIGdldE5leHRBdmFpbGFibGVTdGVwSW5kZXgoKTogbnVtYmVyIHtcclxuICAgIGxldCBuZXh0U3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICAvLyBMb29rIHRocm91Z2ggdGhlIHN0ZXBzIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgaW5kZXggYW5kIGZpbmQgdGhlIG5leHQgdGhhdCBpcyBhdmFpYWJsZVxyXG4gICAgLy8gZm9yIHRoZSB1c2VyLlxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5jdXJyZW50U3RlcEluZGV4ICsgMTsgaSA8IHRoaXMuY3VycmVudFRvdXIhLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyPy5zdGVwc1tpXS5hbmNob3IgJiYgdGhpcy5zdGVwRWxlbWVudEZvdW5kKHRoaXMuY3VycmVudFRvdXIhLnN0ZXBzW2ldLmFuY2hvciEpKSB7XHJcbiAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV4dFN0ZXBJbmRleDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyeSB0byBmaW5kIHRoZSB0b3VyIHN0ZXAgZWxlbWVudCB0byBrbm93IGlmIGl0IGlzIHZpc2libGUgZm9yIHRoZSB1c2VyLiBDaGVjayBmb3IgdGhlIGNsaWNrQmVmb3JlIGZpcnN0IGlmIGRlZmluZWRcclxuICAgKiBAcGFyYW0gYW5jaG9yXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIHN0ZXBFbGVtZW50Rm91bmQoYW5jaG9yOiBUb3VyQW5jaG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYW5jaG9yLmNsaWNrQmVmb3JlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYW5jaG9yLmNsaWNrQmVmb3JlKSAhPT0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYW5jaG9yLnNlbGVjdG9yKSAhPT0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbWUgdG91ciBzdGVwcyBtYXkgaGF2ZSBhIGNsaWNrIGFmdGVyIGRlZmluZWQuIElmIHNvIGNhbGwgdGhlIGNsaWNrIG1ldGhvZCBvbiB0aGUgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDbGlja0FmdGVyKCk6IHZvaWQge1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGhpcy5jdXJyZW50VG91clN0ZXA/LmFuY2hvcj8uY2xpY2tBZnRlcjtcclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICB0aGlzLmNsaWNrRWxlbWVudElmRm91bmQoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29tZSB0b3VyIHN0ZXBzIG1heSBoYXZlIGEgY2xpY2sgYmVmb3JlIGRlZmluZWQuIElmIHNvIGNhbGwgdGhlIGNsaWNrIG1ldGhvZCBvbiB0aGUgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDbGlja0JlZm9yZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyU3RlcD8uYW5jaG9yPy5jbGlja0JlZm9yZSkge1xyXG4gICAgICB0aGlzLmNsaWNrRWxlbWVudElmRm91bmQodGhpcy5jdXJyZW50VG91clN0ZXAuYW5jaG9yPy5jbGlja0JlZm9yZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIENoZWNrcyBmb3IgYW4gZXhpdCBzdGVwIG9uIHRoZSBjdXJyZW50IHRvdXIgYW5kIGlmIGZvdW5kIGRpc3BsYXlzIHRoZSBzdGVwXHJcbiAgKi9cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV4aXRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRvdXI/LmV4aXRTdGVwKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG5cclxuICAgICAgdGhpcy5zaG93RG9uZUJ1dHRvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdGhpcy5jdXJyZW50VG91cj8uZXhpdFN0ZXA7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JUaW1lb3V0KHRoaXMuaGFuZGxlQ2xpY2tCZWZvcmUuYmluZCh0aGlzKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5zaG93U3RlcFRvb2x0aXAuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcnkgdG8gZmluZCB0aGUgZWxlbWVudCB3aXRoIHRoZSBzZWxlY3RvciBwcm92aWRlZCBhbmQgaWYgc28gY2xpY2sgaXQuIFRoaXMgaXMgaG93IHRvdXIgc3RlcHMgd2lsbCBvcGVuL2Nsb3NlIG1lbnVzIHRvXHJcbiAgICogZ2l2ZSBhIHRvdXIgdG8gdGhlIHVzZXJcclxuICAgKiBAcGFyYW0gc2VsZWN0b3JcclxuICAgKi9cclxuICBwcml2YXRlIGNsaWNrRWxlbWVudElmRm91bmQoc2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgaWYgKHNlbGVjdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYXV0byBzdGFydGluZyB0b3VycyB3ZSB3aWxsIHdhbnQgdG8gcmVtb3ZlIGFueSB0aGF0IGhhdmUgdGhlIGxvY2FsIHN0b3JhZ2Uga2V5IHdyaXR0ZW4gYXMgY29tcGxldGVkIHNvXHJcbiAgICogdGhleSBhcmUgbm90IHByZXNlbnRlZCB0byB0aGUgdXNlciBhZ2Fpbi5cclxuICAgKiBAcGFyYW0gdG91cnNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlQ29tcGxldGVkVG91cnModG91cnM6IFRvdXJbXSk6IFRvdXJbXSB7XHJcbiAgICByZXR1cm4gdG91cnMuZmlsdGVyKHRvdXIgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVWYWx1ZSA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldEl0ZW08VG91ckNhY2hlRW50cnk+KHRoaXMubWFrZUNhY2hlS2V5KHRvdXIpKTtcclxuICAgICAgaWYgKGNhY2hlVmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gIWNhY2hlVmFsdWUuY29tcGxldGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlcyBhIGtleSB0byBsb2NhbCBzdG9yYWdlIHNvIHRoZSB0b3VyIHdpbGwgbm90IGJlIHNob3duIGFnYWluIGF1dG9tYXRpY2FsbHlcclxuICAgKi9cclxuICBwcml2YXRlIHdyaXRlQ29tcGxldGlvbktleSh0b3VyOiBUb3VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAodG91cikge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRJdGVtKHRoaXMubWFrZUNhY2hlS2V5KHRvdXIpLCA8VG91ckNhY2hlRW50cnk+eyBjb21wbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGRpc21pc3NpbmcgYSB0b3VyIG9yIG9uZSBiZWluZyBkaXNtaXNzZWQgdmlhIGEgbmF2aWdhdGlvbiBldmVudCwgZXRjIHdlIHdpbGwgd2FudCB0byBtYXJrXHJcbiAgICogZXZlcnkgdG91ciBpbiB0aGUgYXJyYXkgYXMgY29tcGxldGVkIHNvIGl0IGRvZXNuJ3QgcmVzdXJmYWNlIHVubGVzcyB0aGUgdXNlciByZXF1ZXN0cyB0aGUgdG91ci5cclxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9vcCBvdmVyIGFsbCBhbmQgd3JpdGUgdGhlIGxvY2FsIHN0b3JhZ2Uga2V5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB3cml0ZUNvbXBsZXRpb25LZXlGb3JBbGxUb3VycygpOiB2b2lkIHtcclxuICAgIHRoaXMudG91cnMuZm9yRWFjaCh0b3VyID0+IHtcclxuICAgICAgdGhpcy53cml0ZUNvbXBsZXRpb25LZXkodG91cik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhY2hlIGtleSB1c2VkIHRvIHNldC9nZXQgdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIGEgdG91clxyXG4gICAqIEBwYXJhbSB0b3VyXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIG1ha2VDYWNoZUtleSh0b3VyOiBUb3VyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRvdXJTZXJ2aWNlLmdldENhY2hlS2V5KHRvdXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhIHRvb2x0aXAgZnJvbSB0aGUgdmlldywgdXNlZCB3aGVuIHN3aXRjaGluZyB0b3VyIHN0ZXBzIGFuZCBjbG9zaW5nIGEgdG91clxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlVG9vbHRpcCgpOiB2b2lkIHtcclxuICAgIHRoaXMudG9vbHRpcD8ub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdG91ciBiYXNlZCBvbiB0aGUgY3VycmVudCBpbmRleFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRUb3VyKCk6IFRvdXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRvdXJJbmRleCA+IC0xICYmIHRoaXMuY3VycmVudFRvdXJJbmRleCA8IHRoaXMudG91cnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvdXJzW3RoaXMuY3VycmVudFRvdXJJbmRleF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNsaWNrIGJlZm9yZS9hZnRlciBhbmQgc2hvdyB0b29sdGlwIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gc2V0VGltZW91dCBmb3IgdGhlIFVJXHJcbiAgICogdG8gb3BlcmF0ZSBjb3JyZWN0bHkgYnV0IHNldFRpbWVvdXQgaXMgYW4gYWN0aW9uIHdlIGNhbm5vdCBhd2FpdCBzbyB3ZSdyZSB3cmFwcGluZyBpdCBpbiBhIHByb21pc2UgdG8gcmV0dXJuXHJcbiAgICogc28gdGhlIGZ1bmN0aW9uIGNhbGxzIGNhbiBhd2FpdCB0aGUgYWN0aW9uXHJcbiAgICogQHBhcmFtIGZuXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIHdhaXRGb3JUaW1lb3V0KGZuOiAoKSA9PiB2b2lkKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZCB0aGUgXCJuZXh0XCIgb3IgXCJkb25lXCIgYnV0dG9uIGFuZCBmb2N1cyBvbiBpdC5cclxuICAgKlxyXG4gICAqIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gaWYgd2UgY2Fubm90IGZpbmQgdGhlIG5leHQgYnV0dG9uXHJcbiAgICogd2UgbG9vayBmb3IgdGhlIGRvbmUgYnV0dG9uLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9jdXNPbk5leHRPckRvbmVCdXR0b24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNPbkVsZW1lbnQoYCMke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1fbmV4dEJ1dHRvbmApKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNPbkVsZW1lbnQoYCMke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1fZG9uZUJ1dHRvbmApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgd2l0aCBnaXZlbiBzZWxlY3RvciBhbmQgZm9jdXMgb24gaXQuXHJcbiAgICogUmV0dXJuIGZhbHNlIGlmIGVsZW1lbnQgbm90IGZvdW5kLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9jdXNPbkVsZW1lbnQoc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy10ZW1wbGF0ZSAjdG91clRvb2x0aXA+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFRvdXJTdGVwPy5tZWRpYVwiXHJcbiAgICAgICAgIGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxpbWcgaWQ9XCJ7e2N1cnJlbnRUb3VyU3RlcD8uaWQgKyAnX21lZGlhJ319XCJcclxuICAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1wiXHJcbiAgICAgICAgICAgICBzcmM9XCJ7e2N1cnJlbnRUb3VyU3RlcD8ubWVkaWF9fVwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9udC1jb2xvci1wcmltYXJ5LWxpZ2h0IHB4LTMgbWItM1wiXHJcbiAgICAgICAgIFtpbm5lckh0bWxdPVwiY3VycmVudFRvdXJTdGVwPy50ZXh0IHwgdHJhbnNsYXRlXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxhICpuZ0lmPVwiY3VycmVudFRvdXJTdGVwPy5oZWxwTGlua1wiIGlkPVwie3tjdXJyZW50VG91clN0ZXA/LmlkICsgJ19oZWxwTGluayd9fVwiIGNsYXNzPVwiZC1ibG9jayBtYi0zIHB4LTNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwie3tjdXJyZW50VG91clN0ZXA/LmhlbHBMaW5rfX1cIiB0cmFuc2xhdGU+TGVhcm5Nb3JlX1NDPC9hPlxyXG4gICAgPGZvb3RlciBjbGFzcz1cInB4LTMgbXQtMyBkLWZsZXhcIj5cclxuICAgICAgICA8YnV0dG9uIGlkPVwie3tjdXJyZW50VG91clN0ZXA/LmlkICsgJ19uZXh0QnV0dG9uJ319XCIgKm5nSWY9XCIhc2hvd0RvbmVCdXR0b25cIiBjbGFzcz1cIm1sLWF1dG8gdG91ckFjdGlvblwiIGVjTGlua0J1dHRvbiAoY2xpY2spPVwic2hvd05leHRTdGVwKClcIiB0cmFuc2xhdGU+TmV4dF9UQzwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJ7e2N1cnJlbnRUb3VyU3RlcD8uaWQgKyAnX2RvbmVCdXR0b24nfX1cIiAqbmdJZj1cInNob3dEb25lQnV0dG9uXCIgY2xhc3M9XCJtbC1hdXRvIHRvdXJBY3Rpb25cIiBlY0xpbmtCdXR0b24gKGNsaWNrKT1cImRvbmUoKVwiIHRyYW5zbGF0ZT5Eb25lX1RDPC9idXR0b24+XHJcbiAgICA8L2Zvb3Rlcj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=