@firestitch/filter 18.0.31 → 18.0.32

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.
@@ -10,6 +10,7 @@ import { FsFilterConfig } from '../../models/filter-config';
10
10
  import { BaseItem } from '../../models/items/base-item';
11
11
  import { TextItem } from '../../models/items/text-item';
12
12
  import { ExternalParamsController } from '../../services/external-params-controller.service';
13
+ import { QueryPersistanceController } from '../../services/external-params/query-persistance-controller.service';
13
14
  import { SavedFiltersController } from '../../services/external-params/saved-filters-controller.service';
14
15
  import { FsFilterOverlayService } from '../../services/filter-overlay.service';
15
16
  import { FsFilterItemsStore } from '../../services/items-store.service';
@@ -20,6 +21,7 @@ export declare class FilterComponent implements OnInit, OnDestroy {
20
21
  private _filterOverlay;
21
22
  private _zone;
22
23
  private _externalParams;
24
+ private _persistanceParams;
23
25
  private _filterItems;
24
26
  private _actions;
25
27
  private _savedFiltersController;
@@ -47,9 +49,12 @@ export declare class FilterComponent implements OnInit, OnDestroy {
47
49
  private _hasFilterChips$;
48
50
  private _keyword$;
49
51
  private _destroy$;
50
- constructor(_defaultConfig: FsFilterConfig, _filterOverlay: FsFilterOverlayService, _zone: NgZone, _externalParams: ExternalParamsController, _filterItems: FsFilterItemsStore, _actions: ActionsController, _savedFiltersController: SavedFiltersController);
52
+ private _dialogRef;
53
+ private _drawerRef;
54
+ constructor(_defaultConfig: FsFilterConfig, _filterOverlay: FsFilterOverlayService, _zone: NgZone, _externalParams: ExternalParamsController, _persistanceParams: QueryPersistanceController, _filterItems: FsFilterItemsStore, _actions: ActionsController, _savedFiltersController: SavedFiltersController);
51
55
  get config(): FsFilterConfig;
52
56
  get filterParams(): Record<string, unknown>;
57
+ get inDialog(): boolean;
53
58
  get filterParamsQuery(): Record<string, unknown>;
54
59
  get items(): BaseItem<IFilterConfigItem>[];
55
60
  get visibleItems(): BaseItem<IFilterConfigItem>[];
@@ -198,6 +203,6 @@ export declare class FilterComponent implements OnInit, OnDestroy {
198
203
  private _initOverlay;
199
204
  private _listenWhenFilterReady;
200
205
  private _updateChipsVisibility;
201
- static ɵfac: i0.ɵɵFactoryDeclaration<FilterComponent, [{ optional: true; }, null, null, null, null, null, null]>;
206
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterComponent, [{ optional: true; }, null, null, null, null, null, null, null]>;
202
207
  static ɵcmp: i0.ɵɵComponentDeclaration<FilterComponent, "fs-filter", never, { "setConfig": { "alias": "config"; "required": false; }; "setFilter": { "alias": "filter"; "required": false; }; "showSortBy": { "alias": "showSortBy"; "required": false; }; "showFilterInput": { "alias": "showFilterInput"; "required": false; }; }, { "closed": "closed"; "opened": "opened"; "ready": "ready"; }, ["statusBar"], never, false, never>;
203
208
  }
@@ -0,0 +1,9 @@
1
+ export declare enum ActionType {
2
+ Basic = "basic",
3
+ Raised = "raised",
4
+ Icon = "icon",
5
+ Fab = "fab",
6
+ MiniFab = "mini-fab",
7
+ Flat = "flat",
8
+ Stroked = "stroked"
9
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './action-mode.enum';
2
+ export * from './action-type.enum';
2
3
  export * from './button-style';
3
4
  export * from './item-date-mode.enum';
4
5
  export * from './item-type.enum';
@@ -11,4 +11,4 @@ import { DateTimeRangeItem } from '../models/items/date-time-range-item';
11
11
  import { RangeItem } from '../models/items/range-item';
12
12
  import { TextItem } from '../models/items/text-item';
13
13
  import { WeekItem } from '../models/items/week-item';
14
- export declare function createFilterItem(item: IFilterConfigItem, config: any, filter: FilterComponent): TextItem | DateRangeItem | DateTimeRangeItem | RangeItem | WeekItem | AutocompleteChipsItem | AutocompleteItem | CheckboxItem | ChipsItem | DateItem | DateTimeItem | import("../models/items/select/multiple-select-item").MultipleSelectItem | import("../models/items/select/simple-select-item").SimpleSelectItem;
14
+ export declare function createFilterItem(item: IFilterConfigItem, config: any, filter: FilterComponent): ChipsItem | TextItem | WeekItem | RangeItem | AutocompleteItem | AutocompleteChipsItem | DateItem | DateTimeItem | DateRangeItem | DateTimeRangeItem | CheckboxItem | import("../models/items/select/simple-select-item").SimpleSelectItem | import("../models/items/select/multiple-select-item").MultipleSelectItem;
@@ -63,5 +63,6 @@ export interface FilterSort {
63
63
  export interface FsFilterPersistanceConfig {
64
64
  name?: string;
65
65
  timeout?: number;
66
+ queryEnabled?: boolean;
66
67
  }
67
68
  export type FsFilterPersistance = boolean | FsFilterPersistanceConfig;
@@ -0,0 +1,3 @@
1
+ export * from './query-params-controller.service';
2
+ export * from './query-persistance-controller.service';
3
+ export * from './saved-filters-controller.service';
@@ -0,0 +1,19 @@
1
+ import { FsFilterConfig } from '../../models/filter-config';
2
+ import * as i0 from "@angular/core";
3
+ export declare class QueryPersistanceController {
4
+ queryEnabled: boolean;
5
+ private _store;
6
+ private _name;
7
+ private _data;
8
+ private _location;
9
+ private readonly _storeKey;
10
+ setConfig(filterConfig: FsFilterConfig, inDialog: boolean): void;
11
+ setQuery(value: any): void;
12
+ getQuery(): any;
13
+ private _set;
14
+ private _get;
15
+ private _initConfig;
16
+ private _getConfig;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryPersistanceController, never>;
18
+ static ɵprov: i0.ɵɵInjectableDeclaration<QueryPersistanceController>;
19
+ }
@@ -1,10 +1,7 @@
1
1
  import { OnDestroy } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
- import { IFilterExternalParams } from '../interfaces/external-params.interface';
4
- import { IFilterSavedFilter } from '../interfaces/saved-filters.interface';
5
- import { PersistanceParamsController } from './external-params/persistance-params-controller.service';
6
- import { QueryParamsController } from './external-params/query-params-controller.service';
7
- import { SavedFiltersController } from './external-params/saved-filters-controller.service';
3
+ import { IFilterExternalParams, IFilterSavedFilter } from '../interfaces';
4
+ import { QueryParamsController, QueryPersistanceController, SavedFiltersController } from './external-params';
8
5
  import { FsFilterItemsStore } from './items-store.service';
9
6
  import * as i0 from "@angular/core";
10
7
  export declare class ExternalParamsController implements OnDestroy {
@@ -17,7 +14,7 @@ export declare class ExternalParamsController implements OnDestroy {
17
14
  private _shouldResetSavedFilters;
18
15
  private _config;
19
16
  private _destroy$;
20
- constructor(_itemsStore: FsFilterItemsStore, _persistanceStore: PersistanceParamsController, _queryParams: QueryParamsController, _savedFilters: SavedFiltersController);
17
+ constructor(_itemsStore: FsFilterItemsStore, _persistanceStore: QueryPersistanceController, _queryParams: QueryParamsController, _savedFilters: SavedFiltersController);
21
18
  get params(): IFilterExternalParams;
22
19
  get pending(): boolean;
23
20
  get pending$(): Observable<boolean>;
@@ -30,7 +27,6 @@ export declare class ExternalParamsController implements OnDestroy {
30
27
  initItems(): void;
31
28
  _initItemsValues(): void;
32
29
  fetchQueryParams(): void;
33
- private _initPersistance;
34
30
  private _initQueryParams;
35
31
  private _initSavedFilters;
36
32
  private _listenItemsChange;
@@ -1,15 +1,17 @@
1
1
  import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, HostBinding, inject, Inject, Input, NgZone, Optional, Output, ViewChild, } from '@angular/core';
2
2
  import { DomSanitizer } from '@angular/platform-browser';
3
+ import { MatDialogRef } from '@angular/material/dialog';
3
4
  import { MatIconRegistry } from '@angular/material/icon';
4
5
  import { MatInput } from '@angular/material/input';
6
+ import { DrawerRef } from '@firestitch/drawer';
5
7
  import { BehaviorSubject, combineLatest, fromEvent, interval, Subject } from 'rxjs';
6
8
  import { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';
7
9
  import { ActionsController } from '../../classes/actions-controller';
8
10
  import { objectsAreEquals } from '../../helpers/compare';
9
11
  import { FsFilterConfig } from '../../models/filter-config';
10
12
  import { ExternalParamsController } from '../../services/external-params-controller.service';
11
- import { PersistanceParamsController } from '../../services/external-params/persistance-params-controller.service';
12
13
  import { QueryParamsController } from '../../services/external-params/query-params-controller.service';
14
+ import { QueryPersistanceController } from '../../services/external-params/query-persistance-controller.service';
13
15
  import { SavedFiltersController } from '../../services/external-params/saved-filters-controller.service';
14
16
  import { FsFilterOverlayService } from '../../services/filter-overlay.service';
15
17
  import { FocusControllerService } from '../../services/focus-controller.service';
@@ -19,26 +21,28 @@ import { FS_FILTER_CONFIG } from './../../injectors/filter-config';
19
21
  import * as i0 from "@angular/core";
20
22
  import * as i1 from "../../services/filter-overlay.service";
21
23
  import * as i2 from "../../services/external-params-controller.service";
22
- import * as i3 from "../../services/items-store.service";
23
- import * as i4 from "../../classes/actions-controller";
24
- import * as i5 from "../../services/external-params/saved-filters-controller.service";
25
- import * as i6 from "@angular/common";
26
- import * as i7 from "@angular/forms";
27
- import * as i8 from "@angular/material/icon";
28
- import * as i9 from "@angular/material/input";
29
- import * as i10 from "@angular/material/form-field";
30
- import * as i11 from "@angular/material/button";
31
- import * as i12 from "@angular/material/slide-toggle";
32
- import * as i13 from "@firestitch/form";
33
- import * as i14 from "@firestitch/clear";
34
- import * as i15 from "../filter-chips/filter-chips.component";
35
- import * as i16 from "../actions/actions.component";
36
- import * as i17 from "../../models/filter-config";
24
+ import * as i3 from "../../services/external-params/query-persistance-controller.service";
25
+ import * as i4 from "../../services/items-store.service";
26
+ import * as i5 from "../../classes/actions-controller";
27
+ import * as i6 from "../../services/external-params/saved-filters-controller.service";
28
+ import * as i7 from "@angular/common";
29
+ import * as i8 from "@angular/forms";
30
+ import * as i9 from "@angular/material/icon";
31
+ import * as i10 from "@angular/material/input";
32
+ import * as i11 from "@angular/material/form-field";
33
+ import * as i12 from "@angular/material/button";
34
+ import * as i13 from "@angular/material/slide-toggle";
35
+ import * as i14 from "@firestitch/form";
36
+ import * as i15 from "@firestitch/clear";
37
+ import * as i16 from "../filter-chips/filter-chips.component";
38
+ import * as i17 from "../actions/actions.component";
39
+ import * as i18 from "../../models/filter-config";
37
40
  export class FilterComponent {
38
41
  _defaultConfig;
39
42
  _filterOverlay;
40
43
  _zone;
41
44
  _externalParams;
45
+ _persistanceParams;
42
46
  _filterItems;
43
47
  _actions;
44
48
  _savedFiltersController;
@@ -72,11 +76,14 @@ export class FilterComponent {
72
76
  _hasFilterChips$ = new BehaviorSubject(false);
73
77
  _keyword$ = new Subject();
74
78
  _destroy$ = new Subject();
75
- constructor(_defaultConfig, _filterOverlay, _zone, _externalParams, _filterItems, _actions, _savedFiltersController) {
79
+ _dialogRef = inject(MatDialogRef, { optional: true });
80
+ _drawerRef = inject(DrawerRef, { optional: true });
81
+ constructor(_defaultConfig, _filterOverlay, _zone, _externalParams, _persistanceParams, _filterItems, _actions, _savedFiltersController) {
76
82
  this._defaultConfig = _defaultConfig;
77
83
  this._filterOverlay = _filterOverlay;
78
84
  this._zone = _zone;
79
85
  this._externalParams = _externalParams;
86
+ this._persistanceParams = _persistanceParams;
80
87
  this._filterItems = _filterItems;
81
88
  this._actions = _actions;
82
89
  this._savedFiltersController = _savedFiltersController;
@@ -105,6 +112,9 @@ export class FilterComponent {
105
112
  get filterParams() {
106
113
  return this._filterItems.values();
107
114
  }
115
+ get inDialog() {
116
+ return !!this._dialogRef || !!this._drawerRef;
117
+ }
108
118
  get filterParamsQuery() {
109
119
  return this._filterItems.valuesAsQuery();
110
120
  }
@@ -468,6 +478,7 @@ export class FilterComponent {
468
478
  };
469
479
  this._config = new FsFilterConfig(config);
470
480
  this._actions.setConfig(this._config);
481
+ this._persistanceParams.setConfig(this._config, this.inDialog);
471
482
  this._filterItems.setConfig(this._config);
472
483
  this._externalParams.setConfig(this._config);
473
484
  this._syncSearchInputWithKeyword();
@@ -560,36 +571,36 @@ export class FilterComponent {
560
571
  });
561
572
  this._hasFilterChips$.next(hasFilterChips);
562
573
  }
563
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilterComponent, deps: [{ token: FS_FILTER_CONFIG, optional: true }, { token: i1.FsFilterOverlayService }, { token: i0.NgZone }, { token: i2.ExternalParamsController }, { token: i3.FsFilterItemsStore }, { token: i4.ActionsController }, { token: i5.SavedFiltersController }], target: i0.ɵɵFactoryTarget.Component });
574
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilterComponent, deps: [{ token: FS_FILTER_CONFIG, optional: true }, { token: i1.FsFilterOverlayService }, { token: i0.NgZone }, { token: i2.ExternalParamsController }, { token: i3.QueryPersistanceController }, { token: i4.FsFilterItemsStore }, { token: i5.ActionsController }, { token: i6.SavedFiltersController }], target: i0.ɵɵFactoryTarget.Component });
564
575
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FilterComponent, selector: "fs-filter", inputs: { setConfig: ["config", "setConfig"], setFilter: ["filter", "setFilter"], showSortBy: "showSortBy", showFilterInput: "showFilterInput" }, outputs: { closed: "closed", opened: "opened", ready: "ready" }, host: { properties: { "class.filters-open": "this.showFilterMenu", "class.window-desktop": "this.windowDesktop", "class.fs-filter": "this.fsFilterClass", "class.has-keyword": "this.hasKeyword" } }, providers: [
565
576
  FsFilterOverlayService,
566
577
  ExternalParamsController,
567
- PersistanceParamsController,
578
+ QueryPersistanceController,
568
579
  QueryParamsController,
569
580
  FocusControllerService,
570
581
  FsFilterItemsStore,
571
582
  SavedFiltersController,
572
583
  ActionsController,
573
- ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }], viewQueries: [{ propertyName: "keywordMatInput", first: true, predicate: ["keywordMatInput"], descendants: true, read: MatInput }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"filter-container\">\n <div class=\"filter-inner-container\">\n <ng-container *ngIf=\"!hasKeyword; else filterKeyword\">\n <div>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n <ng-container *ngIf=\"hasKeyword\">\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </ng-container>\n</div>\n<ng-template #filterStatusBarChips>\n <ng-container *ngIf=\"statusBar\">\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"config.chips && hasFilterChips$ | async\">\n <fs-filter-chips\n class=\"filter-chips\"\n [filters]=\"items\">\n </fs-filter-chips>\n </ng-container>\n</ng-template>\n<ng-template #filterKeyword>\n <div class=\"filter-keyword\">\n <ng-container *ngIf=\"(keywordVisible$ | async) && !keywordItem?.hide \">\n <mat-form-field\n class=\"search-form-field form-field-padless\"\n [ngClass]=\"{\n 'has-keyword': !!keyword\n }\">\n <span\n matPrefix\n class=\"icon\">\n <mat-icon matPrefix>\n search\n </mat-icon>\n </span>\n <input\n #keywordMatInput\n matInput\n [(ngModel)]=\"keyword\"\n (ngModelChange)=\"keywordChange($event)\"\n name=\"filter-input\"\n [fsClear]=\"true\"\n [placeholder]=\"searchPlaceholder\">\n </mat-form-field>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #filterActions>\n <div class=\"filter-actions\">\n <fs-filter-actions\n *ngIf=\"actionsVisible$ | async\"\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n</ng-template>\n<ng-template #filterToolbar>\n <div class=\"filter-toolbar\">\n @if (filtersBtnVisible$ | async) {\n @if (hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"changeVisibilityClick(!showFilterMenu, $event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon svgIcon=\"filterOutline\"></mat-icon>\n }\n {{ config.button.label }}\n </a>\n }\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n @if (config.autoReload) {\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [(ngModel)]=\"autoReload\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n }\n </div>\n }\n </div>\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}:host.has-keyword .filter-status-container.has-status{margin-top:4px}:host:not(.has-keyword) .filter-status-container:not(.has-status)+fs-filter-chips{margin-top:0}:host:not(.has-keyword) .filter-inner-container{display:flex}:host:not(.has-keyword) .filter-toolbar{justify-content:flex-end}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-keyword{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;margin-right:3px}.filter-inner-container .filter-keyword mat-form-field.search-form-field{max-width:100%;width:250px;margin-top:0}.filter-inner-container .filter-keyword mat-form-field.search-form-field .icon{margin-left:10px;color:#626262}.filter-inner-container .filter-keyword mat-form-field.search-form-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-actions{display:flex;align-items:center}.filter-toolbar{flex:1;white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: i11.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i12.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "component", type: i14.FsClearComponent, selector: "[fsClear]", inputs: ["ngModel", "visible", "fsClear"], outputs: ["ngModelChange", "cleared"] }, { kind: "component", type: i15.FsFilterChipsComponent, selector: "fs-filter-chips", inputs: ["filters"] }, { kind: "component", type: i16.FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
584
+ ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }], viewQueries: [{ propertyName: "keywordMatInput", first: true, predicate: ["keywordMatInput"], descendants: true, read: MatInput }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"filter-container\">\n <div class=\"filter-inner-container\">\n <ng-container *ngIf=\"!hasKeyword; else filterKeyword\">\n <div>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n <ng-container *ngIf=\"hasKeyword\">\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </ng-container>\n</div>\n<ng-template #filterStatusBarChips>\n <ng-container *ngIf=\"statusBar\">\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"config.chips && hasFilterChips$ | async\">\n <fs-filter-chips\n class=\"filter-chips\"\n [filters]=\"items\">\n </fs-filter-chips>\n </ng-container>\n</ng-template>\n<ng-template #filterKeyword>\n <div class=\"filter-keyword\">\n <ng-container *ngIf=\"(keywordVisible$ | async) && !keywordItem?.hide \">\n <mat-form-field\n class=\"search-form-field form-field-padless\"\n [ngClass]=\"{\n 'has-keyword': !!keyword\n }\">\n <span\n matPrefix\n class=\"icon\">\n <mat-icon matPrefix>\n search\n </mat-icon>\n </span>\n <input\n #keywordMatInput\n matInput\n [(ngModel)]=\"keyword\"\n (ngModelChange)=\"keywordChange($event)\"\n name=\"filter-input\"\n [fsClear]=\"true\"\n [placeholder]=\"searchPlaceholder\">\n </mat-form-field>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #filterActions>\n <div class=\"filter-actions\">\n <fs-filter-actions\n *ngIf=\"actionsVisible$ | async\"\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n</ng-template>\n<ng-template #filterToolbar>\n <div class=\"filter-toolbar\">\n @if (filtersBtnVisible$ | async) {\n @if (hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"changeVisibilityClick(!showFilterMenu, $event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon svgIcon=\"filterOutline\"></mat-icon>\n }\n {{ config.button.label }}\n </a>\n }\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n @if (config.autoReload) {\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [(ngModel)]=\"autoReload\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n }\n </div>\n }\n </div>\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}:host.has-keyword .filter-status-container.has-status{margin-top:4px}:host:not(.has-keyword) .filter-status-container:not(.has-status)+fs-filter-chips{margin-top:0}:host:not(.has-keyword) .filter-inner-container{display:flex}:host:not(.has-keyword) .filter-toolbar{justify-content:flex-end}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-keyword{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;margin-right:3px}.filter-inner-container .filter-keyword mat-form-field.search-form-field{max-width:100%;width:250px;margin-top:0}.filter-inner-container .filter-keyword mat-form-field.search-form-field .icon{margin-left:10px;color:#626262}.filter-inner-container .filter-keyword mat-form-field.search-form-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-actions{display:flex;align-items:center}.filter-toolbar{flex:1;white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: i12.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i13.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i14.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "component", type: i15.FsClearComponent, selector: "[fsClear]", inputs: ["ngModel", "visible", "fsClear"], outputs: ["ngModelChange", "cleared"] }, { kind: "component", type: i16.FsFilterChipsComponent, selector: "fs-filter-chips", inputs: ["filters"] }, { kind: "component", type: i17.FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
574
585
  }
575
586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilterComponent, decorators: [{
576
587
  type: Component,
577
588
  args: [{ selector: 'fs-filter', providers: [
578
589
  FsFilterOverlayService,
579
590
  ExternalParamsController,
580
- PersistanceParamsController,
591
+ QueryPersistanceController,
581
592
  QueryParamsController,
582
593
  FocusControllerService,
583
594
  FsFilterItemsStore,
584
595
  SavedFiltersController,
585
596
  ActionsController,
586
597
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter-container\">\n <div class=\"filter-inner-container\">\n <ng-container *ngIf=\"!hasKeyword; else filterKeyword\">\n <div>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n <ng-container *ngIf=\"hasKeyword\">\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </ng-container>\n</div>\n<ng-template #filterStatusBarChips>\n <ng-container *ngIf=\"statusBar\">\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"config.chips && hasFilterChips$ | async\">\n <fs-filter-chips\n class=\"filter-chips\"\n [filters]=\"items\">\n </fs-filter-chips>\n </ng-container>\n</ng-template>\n<ng-template #filterKeyword>\n <div class=\"filter-keyword\">\n <ng-container *ngIf=\"(keywordVisible$ | async) && !keywordItem?.hide \">\n <mat-form-field\n class=\"search-form-field form-field-padless\"\n [ngClass]=\"{\n 'has-keyword': !!keyword\n }\">\n <span\n matPrefix\n class=\"icon\">\n <mat-icon matPrefix>\n search\n </mat-icon>\n </span>\n <input\n #keywordMatInput\n matInput\n [(ngModel)]=\"keyword\"\n (ngModelChange)=\"keywordChange($event)\"\n name=\"filter-input\"\n [fsClear]=\"true\"\n [placeholder]=\"searchPlaceholder\">\n </mat-form-field>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #filterActions>\n <div class=\"filter-actions\">\n <fs-filter-actions\n *ngIf=\"actionsVisible$ | async\"\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n</ng-template>\n<ng-template #filterToolbar>\n <div class=\"filter-toolbar\">\n @if (filtersBtnVisible$ | async) {\n @if (hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"changeVisibilityClick(!showFilterMenu, $event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon svgIcon=\"filterOutline\"></mat-icon>\n }\n {{ config.button.label }}\n </a>\n }\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n @if (config.autoReload) {\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [(ngModel)]=\"autoReload\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n }\n </div>\n }\n </div>\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}:host.has-keyword .filter-status-container.has-status{margin-top:4px}:host:not(.has-keyword) .filter-status-container:not(.has-status)+fs-filter-chips{margin-top:0}:host:not(.has-keyword) .filter-inner-container{display:flex}:host:not(.has-keyword) .filter-toolbar{justify-content:flex-end}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-keyword{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;margin-right:3px}.filter-inner-container .filter-keyword mat-form-field.search-form-field{max-width:100%;width:250px;margin-top:0}.filter-inner-container .filter-keyword mat-form-field.search-form-field .icon{margin-left:10px;color:#626262}.filter-inner-container .filter-keyword mat-form-field.search-form-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-actions{display:flex;align-items:center}.filter-toolbar{flex:1;white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"] }]
587
- }], ctorParameters: () => [{ type: i17.FsFilterConfig, decorators: [{
598
+ }], ctorParameters: () => [{ type: i18.FsFilterConfig, decorators: [{
588
599
  type: Optional
589
600
  }, {
590
601
  type: Inject,
591
602
  args: [FS_FILTER_CONFIG]
592
- }] }, { type: i1.FsFilterOverlayService }, { type: i0.NgZone }, { type: i2.ExternalParamsController }, { type: i3.FsFilterItemsStore }, { type: i4.ActionsController }, { type: i5.SavedFiltersController }], propDecorators: { setConfig: [{
603
+ }] }, { type: i1.FsFilterOverlayService }, { type: i0.NgZone }, { type: i2.ExternalParamsController }, { type: i3.QueryPersistanceController }, { type: i4.FsFilterItemsStore }, { type: i5.ActionsController }, { type: i6.SavedFiltersController }], propDecorators: { setConfig: [{
593
604
  type: Input,
594
605
  args: ['config']
595
606
  }], setFilter: [{
@@ -627,4 +638,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
627
638
  type: HostBinding,
628
639
  args: ['class.has-keyword']
629
640
  }] } });
630
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBT3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzRUFBc0UsQ0FB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Z0JBSS9CLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUl6QyxRQUFRO3NCQURkLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJcEMsY0FBYztzQkFEcEIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBSTFCLGFBQWE7c0JBRG5CLFdBQVc7dUJBQUMsc0JBQXNCO2dCQUk1QixhQUFhO3NCQURuQixXQUFXO3VCQUFDLGlCQUFpQjtnQkFJbkIsVUFBVTtzQkFEcEIsV0FBVzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgaW50ZXJ2YWwsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFjdGlvbnNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hY3Rpb25zLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgb2JqZWN0c0FyZUVxdWFscyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29tcGFyZSc7XG5pbXBvcnQgeyBJRmlsdGVyU2F2ZWRGaWx0ZXIsIElTb3J0aW5nQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEZpbHRlckNvbmZpZywgRmlsdGVyU29ydCwgSUZpbHRlckNvbmZpZ0l0ZW0sIFNvcnRJdGVtLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVVwZGF0ZUZpbHRlckl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3VwZGF0ZS1maWx0ZXItaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBCYXNlSXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9pdGVtcy9iYXNlLWl0ZW0nO1xuaW1wb3J0IHsgVGV4dEl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaXRlbXMvdGV4dC1pdGVtJztcbmltcG9ydCB7IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVyc2lzdGFuY2VQYXJhbXNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zL3BlcnNpc3RhbmNlLXBhcmFtcy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlQYXJhbXNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zL3F1ZXJ5LXBhcmFtcy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2F2ZWRGaWx0ZXJzQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9zYXZlZC1maWx0ZXJzLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGc0ZpbHRlck92ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsdGVyLW92ZXJsYXkuc2VydmljZSc7XG5pbXBvcnQgeyBGb2N1c0NvbnRyb2xsZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9jdXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZzRmlsdGVySXRlbXNTdG9yZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmUgfSBmcm9tICcuLy4uLy4uL2RpcmVjdGl2ZXMvc3RhdHVzLWJhci9zdGF0dXMtYmFyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGU19GSUxURVJfQ09ORklHIH0gZnJvbSAnLi8uLi8uLi9pbmplY3RvcnMvZmlsdGVyLWNvbmZpZyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtZmlsdGVyJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICBGc0ZpbHRlck92ZXJsYXlTZXJ2aWNlLFxuICAgIEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcixcbiAgICBQZXJzaXN0YW5jZVBhcmFtc0NvbnRyb2xsZXIsXG4gICAgUXVlcnlQYXJhbXNDb250cm9sbGVyLFxuICAgIEZvY3VzQ29udHJvbGxlclNlcnZpY2UsXG4gICAgRnNGaWx0ZXJJdGVtc1N0b3JlLFxuICAgIFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIsXG4gICAgQWN0aW9uc0NvbnRyb2xsZXIsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCdjb25maWcnKVxuICBwdWJsaWMgc2V0IHNldENvbmZpZyhjb25maWcpIHtcbiAgICB0aGlzLl9pbml0RmlsdGVyV2l0aENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgQElucHV0KCdmaWx0ZXInKVxuICBwdWJsaWMgc2V0IHNldEZpbHRlcihjb25maWcpIHtcbiAgICB0aGlzLl9pbml0RmlsdGVyV2l0aENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgQElucHV0KCkgcHVibGljIHNob3dTb3J0Qnk6IGFueSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93RmlsdGVySW5wdXQgPSB0cnVlO1xuICBAT3V0cHV0KCkgcHVibGljIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoRmlsdGVyU3RhdHVzQmFyRGlyZWN0aXZlKVxuICBwdWJsaWMgc3RhdHVzQmFyOiBGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgna2V5d29yZE1hdElucHV0JywgeyByZWFkOiBNYXRJbnB1dCB9KVxuICBwdWJsaWMga2V5d29yZE1hdElucHV0OiBNYXRJbnB1dDtcblxuICBAVmlld0NoaWxkKCdyZWxvYWRFbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwdWJsaWMgcmVsb2FkRWw6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maWx0ZXJzLW9wZW4nKVxuICBwdWJsaWMgc2hvd0ZpbHRlck1lbnUgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLndpbmRvdy1kZXNrdG9wJylcbiAgcHVibGljIHdpbmRvd0Rlc2t0b3AgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZpbHRlcicpXG4gIHB1YmxpYyBmc0ZpbHRlckNsYXNzID0gdHJ1ZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhcy1rZXl3b3JkJylcbiAgcHVibGljIGdldCBoYXNLZXl3b3JkKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5oYXNLZXl3b3JkO1xuICB9XG5cbiAgcHVibGljIHNlYXJjaFBsYWNlaG9sZGVyID0gJ1NlYXJjaCc7XG4gIHB1YmxpYyBrZXl3b3JkID0gJyc7XG4gIHB1YmxpYyBhdXRvUmVsb2FkID0gdHJ1ZTtcblxuICBwcm90ZWN0ZWQgX2NvbmZpZzogRnNGaWx0ZXJDb25maWcgPSBudWxsO1xuXG4gIHByaXZhdGUgX3NvcnQ6IEZpbHRlclNvcnQ7XG4gIHByaXZhdGUgX2ZpbHRlcnNCdG5WaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHByaXZhdGUgX2tleXdvcmRWaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHByaXZhdGUgX2hhc0ZpbHRlckNoaXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9rZXl3b3JkJCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZTX0ZJTFRFUl9DT05GSUcpIHByaXZhdGUgX2RlZmF1bHRDb25maWc6IEZzRmlsdGVyQ29uZmlnLFxuICAgIHByaXZhdGUgX2ZpbHRlck92ZXJsYXk6IEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2V4dGVybmFsUGFyYW1zOiBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfZmlsdGVySXRlbXM6IEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBBY3Rpb25zQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9zYXZlZEZpbHRlcnNDb250cm9sbGVyOiBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxuICApIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5maWx0ZXIgPSB0aGlzO1xuICAgIHRoaXMuX2xpc3RlbldoZW5GaWx0ZXJSZWFkeSgpO1xuICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG5cbiAgICBjb25zdCBpY29uUmVnaXN0cnkgPSBpbmplY3QoTWF0SWNvblJlZ2lzdHJ5KTtcbiAgICBjb25zdCBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcbiAgICBjb25zdCBmaWx0ZXJBbHQgPSAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiPjxwYXRoIGQ9XCJNNDQwLTE2MHEtMTcgMC0yOC41LTExLjVUNDAwLTIwMHYtMjQwTDE2MS03NDVxLTE0LTE3LTQtMzZ0MzEtMTloNTg0cTIxIDAgMzEgMTl0LTQgMzZMNTYwLTQ0MHYyNDBxMCAxNy0xMS41IDI4LjVUNTIwLTE2MGgtODBabTQwLTI3NiAyNDAtMzA0SDI0MGwyNDAgMzA0Wm0wIDBaXCIvPjwvc3ZnPic7XG5cbiAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoJ2ZpbHRlck91dGxpbmUnLCBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoZmlsdGVyQWx0KSk7XG5cbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LmF0dGFjaCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0ZpbHRlck1lbnUgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LmRldGFjaCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0ZpbHRlck1lbnUgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fbGlzdGVuV2luZG93UmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBGc0ZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFyYW1zUXVlcnkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52aXNpYmxlSXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGtleXdvcmRJdGVtKCk6IFRleHRJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckl0ZW1zLmtleXdvcmRJdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc1JlYWR5JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMucmVhZHkkO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaWx0ZXJDaGlwcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZpbHRlckNoaXBzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9maWx0ZXJJdGVtcy5zb3J0QnlJdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzQnRuVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNCdG5WaXNpYmxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQga2V5d29yZFZpc2libGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9rZXl3b3JkVmlzaWJsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnNWaXNpYmxlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy52aXNpYmxlJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aW9ucyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMuYWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lbnVBY3Rpb25zJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5tZW51QWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIpIHtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zZXRBY3RpdmVTYXZlZEZpbHRlcihzYXZlZEZpbHRlcik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVNhdmVkRmlsdGVyKCk6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVyc0NvbnRyb2xsZXIuYWN0aXZlRmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBzYXZlZEZpbHRlcnMoKTogSUZpbHRlclNhdmVkRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnNDb250cm9sbGVyLnNhdmVkRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBBdm9pZCBuZ0NoYW5nZXMgZXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5faW5pdEF1dG9SZWxvYWQoKTtcbiAgICB0aGlzLl9saXN0ZW5JbnB1dENoYW5nZXMoKTtcbiAgICB0aGlzLl9saXN0ZW5JbnRlcm5hbEl0ZW1zQ2hhbmdlKCk7XG4gICAgdGhpcy5faW5pdE92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95RmlsdGVyRHJhd2VyKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5rZXl3b3JkTWF0SW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMudXBkYXRlU29ydChzb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBEbyB1cGRhdGUgdmFsdWUgb2Ygc29tZSBmaWVsZFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVzIC0gdmFsdWVzIGZvciB1cGRhdGVcbiAgICpcbiAgICogVG8gdXBkYXRlIHRleHQgdmFsdWUganVzdCBwYXNzIG5ldyB0ZXh0IHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGtleXdvcmQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgc2VsZWN0IG9yIG9ic2VydmFibGUgc2VsZWN0IHlvdSBjb3VsZCBwYXNzIHN1aXRhYmxlIHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWw6IG51bWJlcikge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgc2ltcGxlX3NlbGVjdDogdmFsIH0sIHsgb2JzZXJ2YWJsZV9zZWxlY3Q6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgY2hlY2tib3ggdmFsdWUganVzdCBwYXNzIHRydWUvZmFsc2UgYXMgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUNoZWNrb3godmFsOiBib29sZWFuKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBjaGVja2JveDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSByYW5nZSB2YWx1ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbWluJm1heCBvYmplY3Qgb3IganVzdCB3aXRoIG9uZSBvZiB0YXJnZXRzXG4gICAqXG4gICAqIEV4LjogeyBtaW46IDEwLCBtYXggMTUgfSwgeyBtaW46IDUgfSwgeyBtYXggNSB9XG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVSYW5nZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IHJhbmdlOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHNcbiAgICpcbiAgICogRXguOiB7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH1cbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUF1dG9jb21wbGV0ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGF1dG9jb21wbGV0ZV91c2VyX2lkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZWNoaXBzIGp1c3QgcGFzczpcbiAgICpcbiAgICogMSkgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9XG4gICAqXG4gICAqIDIpIGFycmF5IG9mIG9iamVjdHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogW3sgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfSwgeyBuYW1lOiAnRGFyeWEgRmlsaXBvdmEnLCB2YWx1ZTogMiB9XVxuICAgKlxuICAgKiAzKSBudWxsIC0gY2xlYXIgZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQXV0b2NvbXBsZXRlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgYXV0b2NvbXBsZXRlY2hpcHNfdXNlcl9pZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVzKHZhbHVlcykge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJJdGVtID0gdGhpcy5pdGVtc1xuICAgICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBrZXkpO1xuXG4gICAgICBpZiAoIWZpbHRlckl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmaWx0ZXJJdGVtLm1vZGVsID0gdmFsdWVzW2tleV07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZpc2liaWxpdHlDbGljayh2YWx1ZSwgZXZlbnQgPSBudWxsKSB7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1WYWx1ZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9uRW1wdHlJdGVtVmFsdWVzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0l0ZW1WYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5zb21lKChpdGVtKSA9PiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKF9pdGVtKSA9PiBfaXRlbS5uYW1lID09PSBuYW1lKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93SXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGl0ZW0uaGlkZSA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVJdGVtc1Zpc2libGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlSXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXRlbS5oaWRlID0gdHJ1ZTtcblxuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnVwZGF0ZUl0ZW1zVmlzaWJsaXR5KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJJdGVtKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7XG5cbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpdGVtLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSXRlbUNvbmZpZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJVXBkYXRlRmlsdGVySXRlbUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGl0ZW0ubGFiZWwgPSBwYXJhbXMubGFiZWwgPz8gaXRlbS5sYWJlbDtcbiAgICBpdGVtLmNoaXBMYWJlbCA9IHBhcmFtcy5jaGlwTGFiZWwgPz8gaXRlbS5jaGlwTGFiZWw7XG5cbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVJdGVtc1Zpc2libGl0eSgpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZUNoYW5nZSQobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBuYW1lKTtcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLm1vZGVsO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuXG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmlzaWJpbGl0eShzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSA9PT0gdGhpcy5zaG93RmlsdGVyTWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3lGaWx0ZXJEcmF3ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0ZW5Fc2NCdXR0b24oKTtcblxuICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcblxuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkub3BlbigpO1xuICB9XG5cbiAgcHVibGljIGluaXQoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2ZpbHRlckl0ZW1zLnZhbHVlc0FzUXVlcnkoKTtcbiAgICB0aGlzLl9zb3J0ID0gdGhpcy5fZmlsdGVySXRlbXMuZ2V0U29ydCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmluaXQpIHtcbiAgICAgIHRoaXMuY29uZmlnLmluaXQoZGF0YSwgdGhpcy5fc29ydCwgdGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQ2hpcHNWaXNpYmlsaXR5KCk7XG5cbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmluaXQoaXRlbSwgdGhpcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihldmVudCA9IG51bGwpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLmZpbHRlcnNDbGVhcigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNsZWFyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jbGVhcigpO1xuICAgIH1cblxuICAgIHRoaXMua2V5d29yZCA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGZpbHRlciB3aW5kb3cgYW5kIGRvIGNoYW5nZSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChldmVudCkge1xuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eUNsaWNrKGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLnJlbG9hZEVsPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYoZWwpIHtcbiAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsIDAuNzVzIDAuMHMnO1xuICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZSgzNjBkZWcpJztcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBudWxsO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnJlbG9hZCkge1xuICAgICAgdGhpcy5jb25maWcucmVsb2FkKGRhdGEsIHRoaXMuX2ZpbHRlckl0ZW1zLmdldFNvcnQoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEl0ZW0obmFtZSk6IEJhc2VJdGVtPGFueT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX2V4dGVybmFsUGFyYW1zLmZldGNoUXVlcnlQYXJhbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIGNoYW5nZSBjYWxsYmFjayBhbmQgYXBwbHkgbmV3IGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2UoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2ZpbHRlckl0ZW1zLnZhbHVlc0FzUXVlcnkoKTtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fZmlsdGVySXRlbXMuZ2V0U29ydCgpO1xuXG4gICAgY29uc3Qgc29ydGluZ0NoYW5nZWQgPSAoKCFzb3J0IHx8ICF0aGlzLl9zb3J0KSAmJiBzb3J0ICE9PSB0aGlzLl9zb3J0KVxuICAgICAgfHwgKHNvcnQgJiYgdGhpcy5fc29ydCAmJiAhb2JqZWN0c0FyZUVxdWFscyh0aGlzLl9zb3J0LCBzb3J0KSk7XG5cbiAgICBpZiAoc29ydGluZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3NvcnQgPSBzb3J0O1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuc29ydENoYW5nZSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zb3J0Q2hhbmdlKGRhdGEsIHNvcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5jaGFuZ2UpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNoYW5nZShkYXRhLCBzb3J0KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKTtcblxuICAgIC8vIHZpc2liaWxpdHkgZm9yIGFjdGlvbnMgY2FuIGRlcGVuZCBvbiBmaWx0ZXJzIHN0YXRlXG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVBY3Rpb25zVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmaWx0ZXIgYWN0aW9ucyBjb25maWdcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVBY3Rpb25zKGFjdGlvbnM6IEZzRmlsdGVyQWN0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zLmluaXRBY3Rpb25zKGFjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgXCJGaWx0ZXJzXCIgYnV0dG9uXG4gICAqL1xuICBwdWJsaWMgc2hvd0ZpbHRlcnNCdG4oKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyc0J0blZpc2libGUkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBoaWRlRmlsdGVyc0J0bigpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzQnRuVmlzaWJsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIktleXdvcmRcIiBmaWVsZCBpZiBpdCBwcmVzZW50XG4gICAqL1xuICBwdWJsaWMgc2hvd0tleXdvcmRGaWVsZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXl3b3JkVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBoaWRlS2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIHNob3coKSBjYWxsYmFjayBhbmQgdXBkYXRlIHZpc2libGUgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnMudXBkYXRlQWN0aW9uc1Zpc2liaWxpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIGRpc2FibGVkKCkgY2FsbGJhY2sgYW5kIHVwZGF0ZSBkaXNhYmxlZCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURpc2FibGVkU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5kZXN0cm95SXRlbXMoKTtcblxuICAgIHRoaXMuY29uZmlnLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMuc2V0Q29uZmlnKHRoaXMuX2NvbmZpZyk7XG4gICAgdGhpcy5fZXh0ZXJuYWxQYXJhbXMuaW5pdEl0ZW1zKCk7XG5cbiAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuICB9XG5cbiAgcHVibGljIGtleXdvcmRDaGFuZ2Uoa2V5d29yZCkge1xuICAgIHRoaXMuX2tleXdvcmQkLm5leHQoa2V5d29yZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydGluZ3MoaXRlbXM6IFNvcnRJdGVtW10pOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVTb3J0aW5nSXRlbXNWYWx1ZXMoaXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZpbHRlcldpdGhDb25maWcoY29uZmlnOiBGaWx0ZXJDb25maWcpIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuX2ZpbHRlckl0ZW1zLmRlc3Ryb3lJdGVtcygpO1xuICAgIH1cblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLih0aGlzLl9kZWZhdWx0Q29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fY29uZmlnID0gbmV3IEZzRmlsdGVyQ29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fYWN0aW9ucy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcblxuICAgIHRoaXMuX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcucmVsb2FkV2hlbkNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzdHJveUZpbHRlckRyYXdlcigpIHtcbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVXaW5kb3dXaWR0aCgpIHtcbiAgICB0aGlzLndpbmRvd0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDEyMDA7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Fc2NCdXR0b24oKSB7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQod2luZG93LCAna2V5dXAnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5jb2RlID09PSAnRXNjYXBlJyksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuY2xvc2VkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuV2luZG93UmVzaXplKCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlV2luZG93V2lkdGgoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXV0b1JlbG9hZCgpIHtcbiAgICBpZih0aGlzLmNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICBpbnRlcnZhbCh0aGlzLmNvbmZpZy5hdXRvUmVsb2FkLnNlY29uZHMgKiAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5hdXRvUmVsb2FkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVsb2FkKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JbnB1dENoYW5nZXMoKSB7XG4gICAgdGhpcy5fa2V5d29yZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG4gICAgICAgIGtleXdvcmRJdGVtLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hhbmdlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG4gICAgaWYgKGtleXdvcmRJdGVtKSB7XG4gICAgICB0aGlzLmtleXdvcmQgPSBrZXl3b3JkSXRlbS5tb2RlbDtcbiAgICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSBrZXl3b3JkSXRlbS5sYWJlbCBhcyBzdHJpbmcgfHwgJ1NlYXJjaCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSW50ZXJuYWxJdGVtc0NoYW5nZSgpIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtc1xuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2UoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdE92ZXJsYXkoKSB7XG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5zZXRDbGVhckZuKHRoaXMuY2xlYXIuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5zZXREb25lRm4odGhpcy5oaWRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gV2UgbWF5IG5lZWQgc29tZSB0aW1lIHRvIHJlY2lldmUgZXh0ZXJuYWwgcGFyYW1zIGFuZCBhZnRlciB0aGF0IHJlYWR5IGNhbiBiZSBlbWl0dGVkXG4gIHByaXZhdGUgX2xpc3RlbldoZW5GaWx0ZXJSZWFkeSgpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgW1xuICAgICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5wZW5kaW5nJCxcbiAgICAgICAgdGhpcy5pdGVtc1JlYWR5JCxcbiAgICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChbcGVuZGluZ1BhcmFtcywgaXRlbXNSZWFkeV0pID0+ICFwZW5kaW5nUGFyYW1zICYmIGl0ZW1zUmVhZHkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuXG4gICAgICAgIHRoaXMucmVhZHkuZW1pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKSB7XG4gICAgY29uc3QgaGFzRmlsdGVyQ2hpcHMgPSB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtc1xuICAgICAgLnNvbWUoKGl0ZW06IEJhc2VJdGVtPGFueT4pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNDaGlwVmlzaWJsZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faGFzRmlsdGVyQ2hpcHMkLm5leHQoaGFzRmlsdGVyQ2hpcHMpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWlubmVyLWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzS2V5d29yZDsgZWxzZSBmaWx0ZXJLZXl3b3JkXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyU3RhdHVzQmFyQ2hpcHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyVG9vbGJhclwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyQWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0tleXdvcmRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyU3RhdHVzQmFyQ2hpcHNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyU3RhdHVzQmFyQ2hpcHM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0dXNCYXJcIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmlsdGVyLXN0YXR1cy1jb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdoYXMtc3RhdHVzJzogISFmaWx0ZXJTdGF0dXMudGV4dENvbnRlbnQgfVwiPlxuICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLXN0YXR1c1wiXG4gICAgICAgICAgI2ZpbHRlclN0YXR1cz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1c0Jhci50ZW1wbGF0ZVJlZlwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmNoaXBzICYmIGhhc0ZpbHRlckNoaXBzJCB8IGFzeW5jXCI+XG4gICAgPGZzLWZpbHRlci1jaGlwc1xuICAgICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgICAgW2ZpbHRlcnNdPVwiaXRlbXNcIj5cbiAgICA8L2ZzLWZpbHRlci1jaGlwcz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJLZXl3b3JkPlxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWtleXdvcmRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGtleXdvcmRWaXNpYmxlJCB8IGFzeW5jKSAmJiAha2V5d29yZEl0ZW0/LmhpZGUgXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1mb3JtLWZpZWxkIGZvcm0tZmllbGQtcGFkbGVzc1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2hhcy1rZXl3b3JkJzogISFrZXl3b3JkXG4gICAgICAgICAgfVwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgbWF0UHJlZml4XG4gICAgICAgICAgICBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4PlxuICAgICAgICAgICAgc2VhcmNoXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAja2V5d29yZE1hdElucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImtleXdvcmRcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImtleXdvcmRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgbmFtZT1cImZpbHRlci1pbnB1dFwiXG4gICAgICAgICAgW2ZzQ2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlckFjdGlvbnM+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYWN0aW9uc1wiPlxuICAgIDxmcy1maWx0ZXItYWN0aW9uc1xuICAgICAgKm5nSWY9XCJhY3Rpb25zVmlzaWJsZSQgfCBhc3luY1wiXG4gICAgICBbYWN0aW9uc109XCJhY3Rpb25zJCB8IGFzeW5jXCJcbiAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICA8L2ZzLWZpbHRlci1hY3Rpb25zPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlclRvb2xiYXI+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9vbGJhclwiPlxuICAgIEBpZiAoZmlsdGVyc0J0blZpc2libGUkIHwgYXN5bmMpIHtcbiAgICAgIEBpZiAoaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcpIHtcbiAgICAgICAgPGFcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tZmlsdGVyc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVmlzaWJpbGl0eUNsaWNrKCFzaG93RmlsdGVyTWVudSwgJGV2ZW50KVwiXG4gICAgICAgICAgICBbY29sb3JdPVwiY29uZmlnLmJ1dHRvbi5jb2xvclwiPlxuICAgICAgICAgIEBpZiAoY29uZmlnLmJ1dHRvbi5pY29uKSB7XG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImZpbHRlck91dGxpbmVcIj48L21hdC1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7eyBjb25maWcuYnV0dG9uLmxhYmVsIH19XG4gICAgICAgIDwvYT5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmIChjb25maWcucmVsb2FkKSB7XG4gICAgICA8YVxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24tcmVsb2FkXCI+XG4gICAgICAgIDxtYXQtaWNvbiAjcmVsb2FkRWw+XG4gICAgICAgICAgcmVmcmVzaFxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9hPlxuICAgIH1cbiAgICBAaWYgKGNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXJlbG9hZFwiPlxuICAgICAgICBAaWYgKGNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgbmFtZT1cImF1dG9SZWxvYWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImF1dG8tcmVsb2FkXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhdXRvUmVsb2FkXCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgQXV0byByZWZyZXNoXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
641
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FB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NkJDM0YzQywwekdBOEdjOzs0RkQzQ0QsZUFBZTtrQkFoQjNCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWO3dCQUNULHNCQUFzQjt3QkFDdEIsd0JBQXdCO3dCQUN4QiwwQkFBMEI7d0JBQzFCLHFCQUFxQjt3QkFDckIsc0JBQXNCO3dCQUN0QixrQkFBa0I7d0JBQ2xCLHNCQUFzQjt3QkFDdEIsaUJBQWlCO3FCQUNsQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs7MEJBMkQ1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjt5UkF0RDNCLFNBQVM7c0JBRG5CLEtBQUs7dUJBQUMsUUFBUTtnQkFNSixTQUFTO3NCQURuQixLQUFLO3VCQUFDLFFBQVE7Z0JBS0MsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNXLE1BQU07c0JBQXRCLE1BQU07Z0JBQ1UsTUFBTTtzQkFBdEIsTUFBTTtnQkFDVSxLQUFLO3NCQUFyQixNQUFNO2dCQUdBLFNBQVM7c0JBRGYsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSS9CLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUl6QyxRQUFRO3NCQURkLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJcEMsY0FBYztzQkFEcEIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBSTFCLGFBQWE7c0JBRG5CLFdBQVc7dUJBQUMsc0JBQXNCO2dCQUk1QixhQUFhO3NCQURuQixXQUFXO3VCQUFDLGlCQUFpQjtnQkFJbkIsVUFBVTtzQkFEcEIsV0FBVzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcblxuaW1wb3J0IHsgRHJhd2VyUmVmIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZHJhd2VyJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tRXZlbnQsIGludGVydmFsLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBY3Rpb25zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYWN0aW9ucy1jb250cm9sbGVyJztcbmltcG9ydCB7IG9iamVjdHNBcmVFcXVhbHMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2NvbXBhcmUnO1xuaW1wb3J0IHsgSUZpbHRlclNhdmVkRmlsdGVyLCBJU29ydGluZ0NoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGc0ZpbHRlckFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBGaWx0ZXJDb25maWcsIEZpbHRlclNvcnQsIElGaWx0ZXJDb25maWdJdGVtLCBTb3J0SXRlbSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IElVcGRhdGVGaWx0ZXJJdGVtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy91cGRhdGUtZmlsdGVyLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpbHRlci1jb25maWcnO1xuaW1wb3J0IHsgQmFzZUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaXRlbXMvYmFzZS1pdGVtJztcbmltcG9ydCB7IFRleHRJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2l0ZW1zL3RleHQtaXRlbSc7XG5pbXBvcnQgeyBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHRlcm5hbC1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9xdWVyeS1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zL3F1ZXJ5LXBlcnNpc3RhbmNlLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTYXZlZEZpbHRlcnNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zL3NhdmVkLWZpbHRlcnMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXItb3ZlcmxheS5zZXJ2aWNlJztcbmltcG9ydCB7IEZvY3VzQ29udHJvbGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb2N1cy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRnNGaWx0ZXJJdGVtc1N0b3JlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZSc7XG5cbmltcG9ydCB7IEZpbHRlclN0YXR1c0JhckRpcmVjdGl2ZSB9IGZyb20gJy4vLi4vLi4vZGlyZWN0aXZlcy9zdGF0dXMtYmFyL3N0YXR1cy1iYXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZTX0ZJTFRFUl9DT05GSUcgfSBmcm9tICcuLy4uLy4uL2luamVjdG9ycy9maWx0ZXItY29uZmlnJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1maWx0ZXInLFxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UsXG4gICAgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyLFxuICAgIFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyLFxuICAgIFF1ZXJ5UGFyYW1zQ29udHJvbGxlcixcbiAgICBGb2N1c0NvbnRyb2xsZXJTZXJ2aWNlLFxuICAgIEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgICBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxuICAgIEFjdGlvbnNDb250cm9sbGVyLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgnY29uZmlnJylcbiAgcHVibGljIHNldCBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5faW5pdEZpbHRlcldpdGhDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIEBJbnB1dCgnZmlsdGVyJylcbiAgcHVibGljIHNldCBzZXRGaWx0ZXIoY29uZmlnKSB7XG4gICAgdGhpcy5faW5pdEZpbHRlcldpdGhDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U29ydEJ5OiBhbnkgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbHRlcklucHV0ID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAQ29udGVudENoaWxkKEZpbHRlclN0YXR1c0JhckRpcmVjdGl2ZSlcbiAgcHVibGljIHN0YXR1c0JhcjogRmlsdGVyU3RhdHVzQmFyRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ2tleXdvcmRNYXRJbnB1dCcsIHsgcmVhZDogTWF0SW5wdXQgfSlcbiAgcHVibGljIGtleXdvcmRNYXRJbnB1dDogTWF0SW5wdXQ7XG5cbiAgQFZpZXdDaGlsZCgncmVsb2FkRWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHVibGljIHJlbG9hZEVsOiBFbGVtZW50UmVmO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsdGVycy1vcGVuJylcbiAgcHVibGljIHNob3dGaWx0ZXJNZW51ID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy53aW5kb3ctZGVza3RvcCcpXG4gIHB1YmxpYyB3aW5kb3dEZXNrdG9wID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1maWx0ZXInKVxuICBwdWJsaWMgZnNGaWx0ZXJDbGFzcyA9IHRydWU7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5oYXMta2V5d29yZCcpXG4gIHB1YmxpYyBnZXQgaGFzS2V5d29yZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMuaGFzS2V5d29yZDtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2gnO1xuICBwdWJsaWMga2V5d29yZCA9ICcnO1xuICBwdWJsaWMgYXV0b1JlbG9hZCA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIF9jb25maWc6IEZzRmlsdGVyQ29uZmlnID0gbnVsbDtcblxuICBwcml2YXRlIF9zb3J0OiBGaWx0ZXJTb3J0O1xuICBwcml2YXRlIF9maWx0ZXJzQnRuVmlzaWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIF9rZXl3b3JkVmlzaWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIF9oYXNGaWx0ZXJDaGlwcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfa2V5d29yZCQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2RpYWxvZ1JlZiA9IGluamVjdChNYXREaWFsb2dSZWYsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2RyYXdlclJlZiA9IGluamVjdChEcmF3ZXJSZWYsIHsgb3B0aW9uYWw6IHRydWUgfSk7ICBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZTX0ZJTFRFUl9DT05GSUcpIHByaXZhdGUgX2RlZmF1bHRDb25maWc6IEZzRmlsdGVyQ29uZmlnLFxuICAgIHByaXZhdGUgX2ZpbHRlck92ZXJsYXk6IEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2V4dGVybmFsUGFyYW1zOiBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfcGVyc2lzdGFuY2VQYXJhbXM6IFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyLFxuICAgIHByaXZhdGUgX2ZpbHRlckl0ZW1zOiBGc0ZpbHRlckl0ZW1zU3RvcmUsXG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQWN0aW9uc0NvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJzQ29udHJvbGxlcjogU2F2ZWRGaWx0ZXJzQ29udHJvbGxlcixcbiAgKSB7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMuZmlsdGVyID0gdGhpcztcbiAgICB0aGlzLl9saXN0ZW5XaGVuRmlsdGVyUmVhZHkoKTtcbiAgICB0aGlzLl91cGRhdGVXaW5kb3dXaWR0aCgpO1xuXG4gICAgY29uc3QgaWNvblJlZ2lzdHJ5ID0gaW5qZWN0KE1hdEljb25SZWdpc3RyeSk7XG4gICAgY29uc3Qgc2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gICAgY29uc3QgZmlsdGVyQWx0ID0gJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIj48cGF0aCBkPVwiTTQ0MC0xNjBxLTE3IDAtMjguNS0xMS41VDQwMC0yMDB2LTI0MEwxNjEtNzQ1cS0xNC0xNy00LTM2dDMxLTE5aDU4NHEyMSAwIDMxIDE5dC00IDM2TDU2MC00NDB2MjQwcTAgMTctMTEuNSAyOC41VDUyMC0xNjBoLTgwWm00MC0yNzYgMjQwLTMwNEgyNDBsMjQwIDMwNFptMCAwWlwiLz48L3N2Zz4nO1xuXG4gICAgaWNvblJlZ2lzdHJ5LmFkZFN2Z0ljb25MaXRlcmFsKCdmaWx0ZXJPdXRsaW5lJywgc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGZpbHRlckFsdCkpO1xuXG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5hdHRhY2gkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dGaWx0ZXJNZW51ID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5kZXRhY2gkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dGaWx0ZXJNZW51ID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2xpc3RlbldpbmRvd1Jlc2l6ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogRnNGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMudmFsdWVzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluRGlhbG9nKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RpYWxvZ1JlZiB8fCAhIXRoaXMuX2RyYXdlclJlZjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFyYW1zUXVlcnkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52aXNpYmxlSXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGtleXdvcmRJdGVtKCk6IFRleHRJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckl0ZW1zLmtleXdvcmRJdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc1JlYWR5JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMucmVhZHkkO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaWx0ZXJDaGlwcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZpbHRlckNoaXBzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9maWx0ZXJJdGVtcy5zb3J0QnlJdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzQnRuVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNCdG5WaXNpYmxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQga2V5d29yZFZpc2libGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9rZXl3b3JkVmlzaWJsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnNWaXNpYmxlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy52aXNpYmxlJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aW9ucyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMuYWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lbnVBY3Rpb25zJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5tZW51QWN0aW9ucyQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIpIHtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zZXRBY3RpdmVTYXZlZEZpbHRlcihzYXZlZEZpbHRlcik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVNhdmVkRmlsdGVyKCk6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkRmlsdGVyc0NvbnRyb2xsZXIuYWN0aXZlRmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBzYXZlZEZpbHRlcnMoKTogSUZpbHRlclNhdmVkRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnNDb250cm9sbGVyLnNhdmVkRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBBdm9pZCBuZ0NoYW5nZXMgZXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5faW5pdEF1dG9SZWxvYWQoKTtcbiAgICB0aGlzLl9saXN0ZW5JbnB1dENoYW5nZXMoKTtcbiAgICB0aGlzLl9saXN0ZW5JbnRlcm5hbEl0ZW1zQ2hhbmdlKCk7XG4gICAgdGhpcy5faW5pdE92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95RmlsdGVyRHJhd2VyKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5rZXl3b3JkTWF0SW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMudXBkYXRlU29ydChzb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBEbyB1cGRhdGUgdmFsdWUgb2Ygc29tZSBmaWVsZFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVzIC0gdmFsdWVzIGZvciB1cGRhdGVcbiAgICpcbiAgICogVG8gdXBkYXRlIHRleHQgdmFsdWUganVzdCBwYXNzIG5ldyB0ZXh0IHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGtleXdvcmQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgc2VsZWN0IG9yIG9ic2VydmFibGUgc2VsZWN0IHlvdSBjb3VsZCBwYXNzIHN1aXRhYmxlIHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWw6IG51bWJlcikge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgc2ltcGxlX3NlbGVjdDogdmFsIH0sIHsgb2JzZXJ2YWJsZV9zZWxlY3Q6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgY2hlY2tib3ggdmFsdWUganVzdCBwYXNzIHRydWUvZmFsc2UgYXMgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUNoZWNrb3godmFsOiBib29sZWFuKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBjaGVja2JveDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSByYW5nZSB2YWx1ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbWluJm1heCBvYmplY3Qgb3IganVzdCB3aXRoIG9uZSBvZiB0YXJnZXRzXG4gICAqXG4gICAqIEV4LjogeyBtaW46IDEwLCBtYXggMTUgfSwgeyBtaW46IDUgfSwgeyBtYXggNSB9XG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVSYW5nZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IHJhbmdlOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHNcbiAgICpcbiAgICogRXguOiB7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH1cbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUF1dG9jb21wbGV0ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGF1dG9jb21wbGV0ZV91c2VyX2lkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZWNoaXBzIGp1c3QgcGFzczpcbiAgICpcbiAgICogMSkgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9XG4gICAqXG4gICAqIDIpIGFycmF5IG9mIG9iamVjdHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogW3sgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfSwgeyBuYW1lOiAnRGFyeWEgRmlsaXBvdmEnLCB2YWx1ZTogMiB9XVxuICAgKlxuICAgKiAzKSBudWxsIC0gY2xlYXIgZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQXV0b2NvbXBsZXRlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgYXV0b2NvbXBsZXRlY2hpcHNfdXNlcl9pZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVzKHZhbHVlcykge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJJdGVtID0gdGhpcy5pdGVtc1xuICAgICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBrZXkpO1xuXG4gICAgICBpZiAoIWZpbHRlckl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmaWx0ZXJJdGVtLm1vZGVsID0gdmFsdWVzW2tleV07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZpc2liaWxpdHlDbGljayh2YWx1ZSwgZXZlbnQgPSBudWxsKSB7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1WYWx1ZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9uRW1wdHlJdGVtVmFsdWVzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0l0ZW1WYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5zb21lKChpdGVtKSA9PiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKF9pdGVtKSA9PiBfaXRlbS5uYW1lID09PSBuYW1lKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93SXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGl0ZW0uaGlkZSA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVJdGVtc1Zpc2libGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlSXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXRlbS5oaWRlID0gdHJ1ZTtcblxuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnVwZGF0ZUl0ZW1zVmlzaWJsaXR5KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJJdGVtKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7XG5cbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpdGVtLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSXRlbUNvbmZpZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJVXBkYXRlRmlsdGVySXRlbUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGl0ZW0ubGFiZWwgPSBwYXJhbXMubGFiZWwgPz8gaXRlbS5sYWJlbDtcbiAgICBpdGVtLmNoaXBMYWJlbCA9IHBhcmFtcy5jaGlwTGFiZWwgPz8gaXRlbS5jaGlwTGFiZWw7XG5cbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVJdGVtc1Zpc2libGl0eSgpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZUNoYW5nZSQobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBuYW1lKTtcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLm1vZGVsO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuXG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmlzaWJpbGl0eShzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSA9PT0gdGhpcy5zaG93RmlsdGVyTWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3lGaWx0ZXJEcmF3ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0ZW5Fc2NCdXR0b24oKTtcblxuICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcblxuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkub3BlbigpO1xuICB9XG5cbiAgcHVibGljIGluaXQoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2ZpbHRlckl0ZW1zLnZhbHVlc0FzUXVlcnkoKTtcbiAgICB0aGlzLl9zb3J0ID0gdGhpcy5fZmlsdGVySXRlbXMuZ2V0U29ydCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmluaXQpIHtcbiAgICAgIHRoaXMuY29uZmlnLmluaXQoZGF0YSwgdGhpcy5fc29ydCwgdGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQ2hpcHNWaXNpYmlsaXR5KCk7XG5cbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmluaXQoaXRlbSwgdGhpcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihldmVudCA9IG51bGwpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLmZpbHRlcnNDbGVhcigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNsZWFyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jbGVhcigpO1xuICAgIH1cblxuICAgIHRoaXMua2V5d29yZCA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGZpbHRlciB3aW5kb3cgYW5kIGRvIGNoYW5nZSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChldmVudCkge1xuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eUNsaWNrKGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLnJlbG9hZEVsPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYoZWwpIHtcbiAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsIDAuNzVzIDAuMHMnO1xuICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZSgzNjBkZWcpJztcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBudWxsO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnJlbG9hZCkge1xuICAgICAgdGhpcy5jb25maWcucmVsb2FkKGRhdGEsIHRoaXMuX2ZpbHRlckl0ZW1zLmdldFNvcnQoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEl0ZW0obmFtZSk6IEJhc2VJdGVtPGFueT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX2V4dGVybmFsUGFyYW1zLmZldGNoUXVlcnlQYXJhbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIGNoYW5nZSBjYWxsYmFjayBhbmQgYXBwbHkgbmV3IGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2UoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2ZpbHRlckl0ZW1zLnZhbHVlc0FzUXVlcnkoKTtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fZmlsdGVySXRlbXMuZ2V0U29ydCgpO1xuXG4gICAgY29uc3Qgc29ydGluZ0NoYW5nZWQgPSAoKCFzb3J0IHx8ICF0aGlzLl9zb3J0KSAmJiBzb3J0ICE9PSB0aGlzLl9zb3J0KVxuICAgICAgfHwgKHNvcnQgJiYgdGhpcy5fc29ydCAmJiAhb2JqZWN0c0FyZUVxdWFscyh0aGlzLl9zb3J0LCBzb3J0KSk7XG5cbiAgICBpZiAoc29ydGluZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3NvcnQgPSBzb3J0O1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuc29ydENoYW5nZSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zb3J0Q2hhbmdlKGRhdGEsIHNvcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5jaGFuZ2UpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNoYW5nZShkYXRhLCBzb3J0KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKTtcblxuICAgIC8vIHZpc2liaWxpdHkgZm9yIGFjdGlvbnMgY2FuIGRlcGVuZCBvbiBmaWx0ZXJzIHN0YXRlXG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVBY3Rpb25zVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmaWx0ZXIgYWN0aW9ucyBjb25maWdcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVBY3Rpb25zKGFjdGlvbnM6IEZzRmlsdGVyQWN0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zLmluaXRBY3Rpb25zKGFjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgXCJGaWx0ZXJzXCIgYnV0dG9uXG4gICAqL1xuICBwdWJsaWMgc2hvd0ZpbHRlcnNCdG4oKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyc0J0blZpc2libGUkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBoaWRlRmlsdGVyc0J0bigpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzQnRuVmlzaWJsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIktleXdvcmRcIiBmaWVsZCBpZiBpdCBwcmVzZW50XG4gICAqL1xuICBwdWJsaWMgc2hvd0tleXdvcmRGaWVsZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXl3b3JkVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBoaWRlS2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIHNob3coKSBjYWxsYmFjayBhbmQgdXBkYXRlIHZpc2libGUgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnMudXBkYXRlQWN0aW9uc1Zpc2liaWxpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIGRpc2FibGVkKCkgY2FsbGJhY2sgYW5kIHVwZGF0ZSBkaXNhYmxlZCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURpc2FibGVkU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5kZXN0cm95SXRlbXMoKTtcblxuICAgIHRoaXMuY29uZmlnLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMuc2V0Q29uZmlnKHRoaXMuX2NvbmZpZyk7XG4gICAgdGhpcy5fZXh0ZXJuYWxQYXJhbXMuaW5pdEl0ZW1zKCk7XG5cbiAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuICB9XG5cbiAgcHVibGljIGtleXdvcmRDaGFuZ2Uoa2V5d29yZCkge1xuICAgIHRoaXMuX2tleXdvcmQkLm5leHQoa2V5d29yZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydGluZ3MoaXRlbXM6IFNvcnRJdGVtW10pOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVTb3J0aW5nSXRlbXNWYWx1ZXMoaXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZpbHRlcldpdGhDb25maWcoY29uZmlnOiBGaWx0ZXJDb25maWcpIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuX2ZpbHRlckl0ZW1zLmRlc3Ryb3lJdGVtcygpO1xuICAgIH1cblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLih0aGlzLl9kZWZhdWx0Q29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fY29uZmlnID0gbmV3IEZzRmlsdGVyQ29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fYWN0aW9ucy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9wZXJzaXN0YW5jZVBhcmFtcy5zZXRDb25maWcodGhpcy5fY29uZmlnLCB0aGlzLmluRGlhbG9nKTtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcblxuICAgIHRoaXMuX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcucmVsb2FkV2hlbkNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzdHJveUZpbHRlckRyYXdlcigpIHtcbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVXaW5kb3dXaWR0aCgpIHtcbiAgICB0aGlzLndpbmRvd0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDEyMDA7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Fc2NCdXR0b24oKSB7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQod2luZG93LCAna2V5dXAnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5jb2RlID09PSAnRXNjYXBlJyksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuY2xvc2VkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuV2luZG93UmVzaXplKCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlV2luZG93V2lkdGgoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXV0b1JlbG9hZCgpIHtcbiAgICBpZih0aGlzLmNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICBpbnRlcnZhbCh0aGlzLmNvbmZpZy5hdXRvUmVsb2FkLnNlY29uZHMgKiAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5hdXRvUmVsb2FkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVsb2FkKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JbnB1dENoYW5nZXMoKSB7XG4gICAgdGhpcy5fa2V5d29yZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG4gICAgICAgIGtleXdvcmRJdGVtLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hhbmdlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG4gICAgaWYgKGtleXdvcmRJdGVtKSB7XG4gICAgICB0aGlzLmtleXdvcmQgPSBrZXl3b3JkSXRlbS5tb2RlbDtcbiAgICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSBrZXl3b3JkSXRlbS5sYWJlbCBhcyBzdHJpbmcgfHwgJ1NlYXJjaCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSW50ZXJuYWxJdGVtc0NoYW5nZSgpIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtc1xuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2UoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdE92ZXJsYXkoKSB7XG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5zZXRDbGVhckZuKHRoaXMuY2xlYXIuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5zZXREb25lRm4odGhpcy5oaWRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gV2UgbWF5IG5lZWQgc29tZSB0aW1lIHRvIHJlY2lldmUgZXh0ZXJuYWwgcGFyYW1zIGFuZCBhZnRlciB0aGF0IHJlYWR5IGNhbiBiZSBlbWl0dGVkXG4gIHByaXZhdGUgX2xpc3RlbldoZW5GaWx0ZXJSZWFkeSgpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgW1xuICAgICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5wZW5kaW5nJCxcbiAgICAgICAgdGhpcy5pdGVtc1JlYWR5JCxcbiAgICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChbcGVuZGluZ1BhcmFtcywgaXRlbXNSZWFkeV0pID0+ICFwZW5kaW5nUGFyYW1zICYmIGl0ZW1zUmVhZHkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuXG4gICAgICAgIHRoaXMucmVhZHkuZW1pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKSB7XG4gICAgY29uc3QgaGFzRmlsdGVyQ2hpcHMgPSB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtc1xuICAgICAgLnNvbWUoKGl0ZW06IEJhc2VJdGVtPGFueT4pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNDaGlwVmlzaWJsZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faGFzRmlsdGVyQ2hpcHMkLm5leHQoaGFzRmlsdGVyQ2hpcHMpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWlubmVyLWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzS2V5d29yZDsgZWxzZSBmaWx0ZXJLZXl3b3JkXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyU3RhdHVzQmFyQ2hpcHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyVG9vbGJhclwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyQWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0tleXdvcmRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyU3RhdHVzQmFyQ2hpcHNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyU3RhdHVzQmFyQ2hpcHM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0dXNCYXJcIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmlsdGVyLXN0YXR1cy1jb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdoYXMtc3RhdHVzJzogISFmaWx0ZXJTdGF0dXMudGV4dENvbnRlbnQgfVwiPlxuICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLXN0YXR1c1wiXG4gICAgICAgICAgI2ZpbHRlclN0YXR1cz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1c0Jhci50ZW1wbGF0ZVJlZlwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmNoaXBzICYmIGhhc0ZpbHRlckNoaXBzJCB8IGFzeW5jXCI+XG4gICAgPGZzLWZpbHRlci1jaGlwc1xuICAgICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgICAgW2ZpbHRlcnNdPVwiaXRlbXNcIj5cbiAgICA8L2ZzLWZpbHRlci1jaGlwcz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJLZXl3b3JkPlxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWtleXdvcmRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGtleXdvcmRWaXNpYmxlJCB8IGFzeW5jKSAmJiAha2V5d29yZEl0ZW0/LmhpZGUgXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1mb3JtLWZpZWxkIGZvcm0tZmllbGQtcGFkbGVzc1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2hhcy1rZXl3b3JkJzogISFrZXl3b3JkXG4gICAgICAgICAgfVwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgbWF0UHJlZml4XG4gICAgICAgICAgICBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4PlxuICAgICAgICAgICAgc2VhcmNoXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAja2V5d29yZE1hdElucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImtleXdvcmRcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImtleXdvcmRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgbmFtZT1cImZpbHRlci1pbnB1dFwiXG4gICAgICAgICAgW2ZzQ2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlckFjdGlvbnM+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYWN0aW9uc1wiPlxuICAgIDxmcy1maWx0ZXItYWN0aW9uc1xuICAgICAgKm5nSWY9XCJhY3Rpb25zVmlzaWJsZSQgfCBhc3luY1wiXG4gICAgICBbYWN0aW9uc109XCJhY3Rpb25zJCB8IGFzeW5jXCJcbiAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICA8L2ZzLWZpbHRlci1hY3Rpb25zPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ZpbHRlclRvb2xiYXI+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9vbGJhclwiPlxuICAgIEBpZiAoZmlsdGVyc0J0blZpc2libGUkIHwgYXN5bmMpIHtcbiAgICAgIEBpZiAoaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcpIHtcbiAgICAgICAgPGFcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tZmlsdGVyc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVmlzaWJpbGl0eUNsaWNrKCFzaG93RmlsdGVyTWVudSwgJGV2ZW50KVwiXG4gICAgICAgICAgICBbY29sb3JdPVwiY29uZmlnLmJ1dHRvbi5jb2xvclwiPlxuICAgICAgICAgIEBpZiAoY29uZmlnLmJ1dHRvbi5pY29uKSB7XG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImZpbHRlck91dGxpbmVcIj48L21hdC1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7eyBjb25maWcuYnV0dG9uLmxhYmVsIH19XG4gICAgICAgIDwvYT5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmIChjb25maWcucmVsb2FkKSB7XG4gICAgICA8YVxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24tcmVsb2FkXCI+XG4gICAgICAgIDxtYXQtaWNvbiAjcmVsb2FkRWw+XG4gICAgICAgICAgcmVmcmVzaFxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9hPlxuICAgIH1cbiAgICBAaWYgKGNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXJlbG9hZFwiPlxuICAgICAgICBAaWYgKGNvbmZpZy5hdXRvUmVsb2FkKSB7XG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgbmFtZT1cImF1dG9SZWxvYWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImF1dG8tcmVsb2FkXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhdXRvUmVsb2FkXCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgQXV0byByZWZyZXNoXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
@@ -0,0 +1,11 @@
1
+ export var ActionType;
2
+ (function (ActionType) {
3
+ ActionType["Basic"] = "basic";
4
+ ActionType["Raised"] = "raised";
5
+ ActionType["Icon"] = "icon";
6
+ ActionType["Fab"] = "fab";
7
+ ActionType["MiniFab"] = "mini-fab";
8
+ ActionType["Flat"] = "flat";
9
+ ActionType["Stroked"] = "stroked";
10
+ })(ActionType || (ActionType = {}));
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXR5cGUuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZW51bXMvYWN0aW9uLXR5cGUuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQU4sSUFBWSxVQVFYO0FBUkQsV0FBWSxVQUFVO0lBQ3BCLDZCQUF5QixDQUFBO0lBQ3pCLCtCQUEyQixDQUFBO0lBQzNCLDJCQUF1QixDQUFBO0lBQ3ZCLHlCQUFxQixDQUFBO0lBQ3JCLGtDQUE2QixDQUFBO0lBQzdCLDJCQUF1QixDQUFBO0lBQ3ZCLGlDQUE2QixDQUFBO0FBQy9CLENBQUMsRUFSVyxVQUFVLEtBQVYsVUFBVSxRQVFyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1dHRvblN0eWxlIH0gZnJvbSAnLi9idXR0b24tc3R5bGUnO1xuXG5leHBvcnQgZW51bSBBY3Rpb25UeXBlIHtcbiAgQmFzaWMgPSBCdXR0b25TdHlsZS5CYXNpYyxcbiAgUmFpc2VkID0gQnV0dG9uU3R5bGUuUmFpc2VkLFxuICBJY29uID0gQnV0dG9uU3R5bGUuSWNvbixcbiAgRmFiID0gQnV0dG9uU3R5bGUuRmFiLFxuICBNaW5pRmFiID0gQnV0dG9uU3R5bGUuTWluaUZhYixcbiAgRmxhdCA9IEJ1dHRvblN0eWxlLkZsYXQsXG4gIFN0cm9rZWQgPSBCdXR0b25TdHlsZS5TdHJva2VkLCAgXG59XG4iXX0=
@@ -1,7 +1,8 @@
1
1
  export * from './action-mode.enum';
2
+ export * from './action-type.enum';
2
3
  export * from './button-style';
3
4
  export * from './item-date-mode.enum';
4
5
  export * from './item-type.enum';
5
6
  export * from './menu-action-mode.enum';
6
7
  export * from './picker-view-type.enum';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2VudW1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hY3Rpb24tbW9kZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYnV0dG9uLXN0eWxlJztcbmV4cG9ydCAqIGZyb20gJy4vaXRlbS1kYXRlLW1vZGUuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2l0ZW0tdHlwZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vbWVudS1hY3Rpb24tbW9kZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vcGlja2VyLXZpZXctdHlwZS5lbnVtJztcblxuIl19
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2VudW1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FjdGlvbi1tb2RlLmVudW0nO1xuZXhwb3J0ICogZnJvbSAnLi9hY3Rpb24tdHlwZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vYnV0dG9uLXN0eWxlJztcbmV4cG9ydCAqIGZyb20gJy4vaXRlbS1kYXRlLW1vZGUuZW51bSc7XG5leHBvcnQgKiBmcm9tICcuL2l0ZW0tdHlwZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vbWVudS1hY3Rpb24tbW9kZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vcGlja2VyLXZpZXctdHlwZS5lbnVtJztcbiJdfQ==