@arsedizioni/ars-utils 18.1.74 → 18.1.76
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.
- package/clipper.common/common/common.module.d.ts +1 -2
- package/clipper.common/common/definitions.d.ts +317 -0
- package/clipper.common/common/interceptors/auth.interceptor.d.ts +2 -5
- package/clipper.common/common/messages.d.ts +4 -0
- package/clipper.common/common/services/clipper.service.d.ts +12 -36
- package/clipper.ui/{ui/document/documents.d.ts → documents.d.ts} +2 -6
- package/clipper.ui/public_api.d.ts +6 -5
- package/clipper.ui/ui/browser-dialog/browser-dialog.component.d.ts +30 -143
- package/clipper.ui/ui/clipper.scss +270 -106
- package/clipper.ui/ui/document/document.component.d.ts +64 -118
- package/clipper.ui/ui/document-index/document-index.component.d.ts +34 -0
- package/clipper.ui/ui/document-manager/document-manager.d.ts +126 -0
- package/clipper.ui/ui/document-menu/document-menu.component.d.ts +28 -0
- package/clipper.ui/ui/references/references.component.d.ts +39 -73
- package/clipper.ui/ui/search-calendar/search-calendar.component.d.ts +40 -0
- package/clipper.ui/ui/search-dialog/search-dialog.component.d.ts +37 -40
- package/clipper.ui/ui/search-facets/search-facets.component.d.ts +22 -70
- package/clipper.ui/ui/search-free-text-help/search-free-text-help.component.d.ts +0 -1
- package/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.d.ts +8 -12
- package/clipper.ui/ui/search-result-item/search-result-item.component.d.ts +6 -4
- package/clipper.ui/ui/search-result-manager/search-result-manager.d.ts +147 -0
- package/esm2022/clipper.common/common/common.module.mjs +2 -3
- package/esm2022/clipper.common/common/definitions.mjs +1536 -0
- package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +15 -15
- package/esm2022/clipper.common/common/messages.mjs +6 -1
- package/esm2022/clipper.common/common/services/clipper.service.mjs +65 -65
- package/esm2022/clipper.ui/documents.mjs +51 -0
- package/esm2022/clipper.ui/public_api.mjs +7 -6
- package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +320 -785
- package/esm2022/clipper.ui/ui/document/document.component.mjs +213 -320
- package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +121 -0
- package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +431 -0
- package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +56 -0
- package/esm2022/clipper.ui/ui/references/references.component.mjs +244 -438
- package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +116 -0
- package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +216 -205
- package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +157 -209
- package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +7 -8
- package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +22 -23
- package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +12 -10
- package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +462 -0
- package/esm2022/help/components/help-viewer/help-viewer.component.mjs +25 -28
- package/esm2022/support.common/common/definitions.mjs +21 -0
- package/esm2022/support.common/common/services/support.service.mjs +9 -7
- package/esm2022/support.common/public_api.mjs +2 -2
- package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +3 -3
- package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +4 -5
- package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +3 -3
- package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +3 -3
- package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +3 -3
- package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +3 -3
- package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +3 -3
- package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +3 -3
- package/esm2022/ui.application/public_api.mjs +4 -1
- package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +163 -0
- package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +47 -0
- package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +239 -0
- package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +23 -24
- package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/messages.mjs +3 -3
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +1608 -1507
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +2283 -2407
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-help.mjs +25 -28
- package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +8 -6
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +5 -6
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +450 -47
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +12 -12
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/help/components/help-viewer/help-viewer.component.d.ts +6 -10
- package/package.json +13 -13
- package/styles/ui.scss +140 -0
- package/support.common/common/services/support.service.d.ts +2 -2
- package/support.common/public_api.d.ts +1 -1
- package/ui.application/public_api.d.ts +3 -0
- package/ui.application/ui/components/button-selector/button-selector.component.d.ts +49 -0
- package/ui.application/ui/components/button-toggle/button-toggle.component.d.ts +26 -0
- package/ui.application/ui/components/chips-selector/chips-selector.component.d.ts +70 -0
- package/ui.application/ui/components/file-preview/file-preview.component.d.ts +4 -8
- package/ui.application/ui/messages.d.ts +2 -2
- package/clipper.common/common/clipper.d.ts +0 -119
- package/clipper.common/common/search.d.ts +0 -49
- package/clipper.ui/ui/document/base/document-base.component.d.ts +0 -38
- package/clipper.ui/ui/document/document-index/document-index.component.d.ts +0 -38
- package/clipper.ui/ui/document/document-menu/document-menu.component.d.ts +0 -30
- package/clipper.ui/ui/last-15-days/last-15-days.component.d.ts +0 -41
- package/esm2022/clipper.common/common/clipper.mjs +0 -1371
- package/esm2022/clipper.common/common/search.mjs +0 -69
- package/esm2022/clipper.ui/ui/document/base/document-base.component.mjs +0 -194
- package/esm2022/clipper.ui/ui/document/document-index/document-index.component.mjs +0 -121
- package/esm2022/clipper.ui/ui/document/document-menu/document-menu.component.mjs +0 -88
- package/esm2022/clipper.ui/ui/document/documents.mjs +0 -49
- package/esm2022/clipper.ui/ui/last-15-days/last-15-days.component.mjs +0 -107
- package/esm2022/help/components/help-search-query-builder/help-search-query-builder.component.mjs +0 -114
- package/esm2022/support.common/common/support.mjs +0 -21
- package/esm2022/ui.oauth/ui/components/login/loginOAuth.component.mjs +0 -198
- package/help/components/help-search-query-builder/help-search-query-builder.component.d.ts +0 -29
- package/help/help.scss +0 -72
- package/ui.oauth/ui/components/login/loginOAuth.component.d.ts +0 -38
- /package/support.common/common/{support.d.ts → definitions.d.ts} +0 -0
|
@@ -1,299 +1,210 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { NgClass } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ViewChild, inject } from '@angular/core';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { MatBadgeModule } from '@angular/material/badge';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
7
|
+
import { MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER } from '@angular/material/datepicker';
|
|
8
|
+
import { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
|
|
9
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
10
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
12
|
+
import { MatInputModule } from '@angular/material/input';
|
|
3
13
|
import { MatMenuModule } from '@angular/material/menu';
|
|
4
14
|
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
15
|
+
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
5
16
|
import { MatSidenavModule } from '@angular/material/sidenav';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
17
|
+
import { MatTabsModule } from '@angular/material/tabs';
|
|
18
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
19
|
+
import { Breakpoints } from '@angular/cdk/layout';
|
|
20
|
+
import { ClipperAuthors, ClipperDocumentChangeReason, ClipperMessages, ClipperModel, ClipperModels, ClipperSearchUtils, ClipperSectorTypes, ClipperSectors, ClipperSort, ClipperSources } from '@arsedizioni/ars-utils/clipper.common';
|
|
21
|
+
import { SystemUtils } from '@arsedizioni/ars-utils/core';
|
|
22
|
+
import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
|
|
23
|
+
import { FlexModule } from '@ngbracket/ngx-layout/flex';
|
|
24
|
+
import { fromEvent } from 'rxjs';
|
|
25
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
26
|
+
import { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';
|
|
27
|
+
import { ClipperDocumentsUtils } from '../../documents';
|
|
13
28
|
import { ClipperSearchDialogComponent } from '../search-dialog/search-dialog.component';
|
|
14
29
|
import { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';
|
|
15
30
|
import { ClipperSearchFreeTextHelpComponent } from '../search-free-text-help/search-free-text-help.component';
|
|
16
31
|
import { ClipperSearchFreeTextQueryBuilderComponent } from '../search-free-text-query-builder/search-free-text-query-builder.component';
|
|
17
|
-
import { ClipperDocumentsUtils } from '../document/documents';
|
|
18
|
-
import { MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER } from '@angular/material/datepicker';
|
|
19
|
-
import { ClipperLast15DaysComponent } from '../last-15-days/last-15-days.component';
|
|
20
32
|
import { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';
|
|
21
|
-
import {
|
|
22
|
-
import { ClipperDocumentMenuComponent } from '../document/document-menu/document-menu.component';
|
|
23
|
-
import { MatDividerModule } from '@angular/material/divider';
|
|
24
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
25
|
-
import { FormsModule } from '@angular/forms';
|
|
26
|
-
import { MatInputModule } from '@angular/material/input';
|
|
27
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
28
|
-
import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
|
|
29
|
-
import { MatTabsModule } from '@angular/material/tabs';
|
|
30
|
-
import { MatBadgeModule } from '@angular/material/badge';
|
|
31
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
32
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
33
|
-
import { NgStyle, NgClass } from '@angular/common';
|
|
34
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
35
|
-
import { FlexModule } from '@ngbracket/ngx-layout/flex';
|
|
33
|
+
import { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';
|
|
36
34
|
import * as i0 from "@angular/core";
|
|
37
|
-
import * as i1 from "@
|
|
38
|
-
import * as i2 from "@
|
|
39
|
-
import * as i3 from "@
|
|
40
|
-
import * as i4 from "@angular/material/
|
|
41
|
-
import * as i5 from "@
|
|
42
|
-
import * as i6 from "@ngbracket/ngx-layout/
|
|
43
|
-
import * as i7 from "@angular/material/
|
|
44
|
-
import * as i8 from "@angular/material/
|
|
45
|
-
import * as i9 from "@angular/
|
|
46
|
-
import * as i10 from "@angular/material/
|
|
47
|
-
import * as i11 from "@angular/material/
|
|
48
|
-
import * as i12 from "@
|
|
49
|
-
import * as i13 from "@angular/material/
|
|
50
|
-
import * as i14 from "@angular/material/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
import * as i21 from "@angular/material/paginator";
|
|
58
|
-
export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent {
|
|
59
|
-
constructor($dialog, $clipper, $screen, $broadcast, dialogRef, media, _data) {
|
|
60
|
-
super($dialog, $clipper);
|
|
61
|
-
this.$dialog = $dialog;
|
|
62
|
-
this.$clipper = $clipper;
|
|
63
|
-
this.$screen = $screen;
|
|
64
|
-
this.$broadcast = $broadcast;
|
|
65
|
-
this.dialogRef = dialogRef;
|
|
66
|
-
this.media = media;
|
|
67
|
-
this.__d$ = new Subject();
|
|
68
|
-
this.dialogTab = 1;
|
|
69
|
-
this.data = {};
|
|
35
|
+
import * as i1 from "@ngbracket/ngx-layout/flex";
|
|
36
|
+
import * as i2 from "@angular/material/tooltip";
|
|
37
|
+
import * as i3 from "@angular/material/button";
|
|
38
|
+
import * as i4 from "@angular/material/icon";
|
|
39
|
+
import * as i5 from "@angular/material/badge";
|
|
40
|
+
import * as i6 from "@ngbracket/ngx-layout/extended";
|
|
41
|
+
import * as i7 from "@angular/material/form-field";
|
|
42
|
+
import * as i8 from "@angular/material/input";
|
|
43
|
+
import * as i9 from "@angular/forms";
|
|
44
|
+
import * as i10 from "@angular/material/checkbox";
|
|
45
|
+
import * as i11 from "@angular/material/menu";
|
|
46
|
+
import * as i12 from "@angular/material/divider";
|
|
47
|
+
import * as i13 from "@angular/material/sidenav";
|
|
48
|
+
import * as i14 from "@angular/material/paginator";
|
|
49
|
+
export class ClipperBrowserDialogComponent extends ClipperSearchResultManager {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
this.height = -1;
|
|
53
|
+
this.dialogRef = inject((MatDialogRef));
|
|
54
|
+
this.dialogData = inject(MAT_DIALOG_DATA);
|
|
70
55
|
this.title = 'Ricerca in Clipper';
|
|
71
|
-
this.trackableId = (index, item) => { index >= 0 ? item.id : 0; };
|
|
72
|
-
this.selection = new SelectableModel(true, 'documentId');
|
|
73
56
|
this.snapshot = {
|
|
74
57
|
searchInfo: null,
|
|
75
58
|
searchParams: {
|
|
76
|
-
module: ClipperDefinitions.MOD_SEMANTIC_SEARCH,
|
|
77
|
-
model: null,
|
|
78
59
|
first: 0,
|
|
79
60
|
count: 25
|
|
80
61
|
},
|
|
81
62
|
};
|
|
82
|
-
this.facetsMode = 'side';
|
|
83
|
-
this.facetsClosed = false;
|
|
84
63
|
this.currentModel = 'Tutto';
|
|
85
64
|
this.currentSort = 'Rilevanza';
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
this.mq = null;
|
|
89
|
-
this.item = null;
|
|
90
|
-
// Store dialog data
|
|
91
|
-
this.data = _data ?? {};
|
|
65
|
+
}
|
|
66
|
+
ngOnInit() {
|
|
92
67
|
// Use service snapshot
|
|
93
|
-
this.snapshot =
|
|
68
|
+
this.snapshot = this.clipperService.snapshot;
|
|
94
69
|
if (!this.snapshot)
|
|
95
70
|
this.snapshot = {
|
|
96
71
|
searchInfo: null,
|
|
97
72
|
searchParams: null,
|
|
98
73
|
};
|
|
99
|
-
if (this.
|
|
100
|
-
this.
|
|
101
|
-
module: ClipperDefinitions.MOD_SEMANTIC_SEARCH,
|
|
102
|
-
model: null,
|
|
74
|
+
if (this.filterParams == null) {
|
|
75
|
+
this.filterParams = {
|
|
103
76
|
first: 0,
|
|
104
|
-
count:
|
|
77
|
+
count: 15,
|
|
105
78
|
};
|
|
106
79
|
// Store snapshot
|
|
107
|
-
|
|
80
|
+
this.clipperService.snapshot = this.snapshot;
|
|
108
81
|
}
|
|
109
|
-
//
|
|
110
|
-
this.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
.pipe(takeUntil(this.__d$))
|
|
82
|
+
// Update model
|
|
83
|
+
if (this.dialogData.initialModel) {
|
|
84
|
+
this.changeModel(this.dialogData.initialModel, false);
|
|
85
|
+
}
|
|
86
|
+
this.broadcastService.getMessage()
|
|
87
|
+
.pipe(takeUntil(this.unsubscribe))
|
|
116
88
|
.subscribe((message) => {
|
|
117
89
|
if (message.id === ClipperMessages.DOCUMENT_SELECTED_INNER) {
|
|
118
|
-
this
|
|
90
|
+
this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_SELECTED, message.data);
|
|
91
|
+
this.changeDetector.markForCheck();
|
|
119
92
|
this.close();
|
|
120
93
|
}
|
|
121
94
|
});
|
|
122
|
-
// React to media query changes
|
|
123
|
-
this.media
|
|
124
|
-
.asObservable()
|
|
125
|
-
.pipe(takeUntil(this.__d$))
|
|
126
|
-
.subscribe((changes) => {
|
|
127
|
-
this.mq = changes[0].mqAlias;
|
|
128
|
-
this.updateFacetsVisibility(this.mq);
|
|
129
|
-
});
|
|
130
|
-
this.updateFacetsVisibility();
|
|
131
95
|
// React to window size change
|
|
132
96
|
fromEvent(window, 'resize')
|
|
133
|
-
.pipe(takeUntil(this.
|
|
97
|
+
.pipe(takeUntil(this.unsubscribe), debounceTime(500))
|
|
134
98
|
.subscribe(() => {
|
|
135
|
-
|
|
136
|
-
this.updateView();
|
|
99
|
+
this.resize();
|
|
137
100
|
});
|
|
138
|
-
this.
|
|
101
|
+
this.clipperService.visible = true;
|
|
102
|
+
}
|
|
103
|
+
ngOnDestroy() {
|
|
104
|
+
this.unsubscribe.next();
|
|
105
|
+
this.unsubscribe.complete();
|
|
106
|
+
this.clipperService.visible = false;
|
|
107
|
+
}
|
|
108
|
+
ngAfterViewInit() {
|
|
139
109
|
setTimeout(() => {
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
this.snapshot.searchParams.fromDate = this.facetsSearch.fromDate;
|
|
152
|
-
this.snapshot.searchParams.toDate = this.facetsSearch.toDate;
|
|
153
|
-
this.snapshot.searchParams.year = this.facetsSearch.fromDate.getFullYear();
|
|
110
|
+
// Handle filter pane
|
|
111
|
+
this.handleFilterPaneVisibility();
|
|
112
|
+
// Handle facets
|
|
113
|
+
if (this.facets) {
|
|
114
|
+
this.facets.changed
|
|
115
|
+
.subscribe((value) => {
|
|
116
|
+
this.snapshot.facets = value;
|
|
117
|
+
if (this.snapshot.facets.fromDate) {
|
|
118
|
+
this.filterParams.fromDate = this.snapshot.facets.fromDate;
|
|
119
|
+
this.filterParams.toDate = this.snapshot.facets.toDate;
|
|
120
|
+
this.filterParams.year = this.snapshot.facets.fromDate.getFullYear();
|
|
154
121
|
}
|
|
155
|
-
else if (this.
|
|
156
|
-
this.
|
|
157
|
-
this.
|
|
158
|
-
this.
|
|
122
|
+
else if (this.snapshot.facets.changedInterval) {
|
|
123
|
+
this.filterParams.year = null;
|
|
124
|
+
this.filterParams.fromDate = null;
|
|
125
|
+
this.filterParams.toDate = null;
|
|
159
126
|
}
|
|
160
|
-
if (this.
|
|
161
|
-
this.
|
|
162
|
-
if (this.
|
|
163
|
-
this.
|
|
164
|
-
if (this.
|
|
165
|
-
this.
|
|
127
|
+
if (this.snapshot.facets.sector || this.snapshot.facets.changedSector)
|
|
128
|
+
this.filterParams.sector = this.snapshot.facets.sector;
|
|
129
|
+
if (this.snapshot.facets.type || this.snapshot.facets.changedType)
|
|
130
|
+
this.filterParams.type = this.snapshot.facets.type;
|
|
131
|
+
if (this.snapshot.facets.author || this.snapshot.facets.changedAuthor)
|
|
132
|
+
this.filterParams.author = this.snapshot.facets.author;
|
|
166
133
|
this.fetch(true);
|
|
167
134
|
});
|
|
168
135
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
this.facetsOpen();
|
|
173
|
-
}
|
|
174
|
-
}, 250);
|
|
175
|
-
}
|
|
176
|
-
ngOnDestroy() {
|
|
177
|
-
this.__d$.next();
|
|
178
|
-
this.__d$.complete();
|
|
179
|
-
this.$clipper.visible = false;
|
|
180
|
-
}
|
|
181
|
-
onContextMenu(event, item) {
|
|
182
|
-
event.preventDefault();
|
|
183
|
-
this.contextMenuPosition.x = event.clientX + 'px';
|
|
184
|
-
this.contextMenuPosition.y = event.clientY + 'px';
|
|
185
|
-
this.contextMenu.menuData = { item: item };
|
|
186
|
-
this.contextMenu.openMenu();
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Update sidenav visibility
|
|
190
|
-
* @param mq : the current media query
|
|
191
|
-
*/
|
|
192
|
-
updateFacetsVisibility(mq = null) {
|
|
193
|
-
if (!mq)
|
|
194
|
-
mq = this.$screen.mq;
|
|
195
|
-
if (mq === 'xs') {
|
|
196
|
-
this.facetsMode = 'over';
|
|
197
|
-
if (this.facetsSearch &&
|
|
198
|
-
this.facetsSearch.hasFacets &&
|
|
199
|
-
this.facetsSidenav &&
|
|
200
|
-
this.facetsSidenav.opened)
|
|
201
|
-
this.facetsSidenav.close();
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
this.facetsMode = 'side';
|
|
205
|
-
if (this.facetsSearch &&
|
|
206
|
-
this.facetsSearch.hasFacets &&
|
|
207
|
-
this.facetsSidenav &&
|
|
208
|
-
!this.facetsClosed)
|
|
209
|
-
this.facetsSidenav.toggle(true);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Open facetsSidenav sidebar
|
|
214
|
-
*/
|
|
215
|
-
facetsOpen() {
|
|
216
|
-
this.facetsClosed = false;
|
|
217
|
-
this.facetsSidenav.open();
|
|
136
|
+
}, 0);
|
|
137
|
+
this.resize();
|
|
138
|
+
this.changeDetector.detectChanges();
|
|
218
139
|
}
|
|
219
140
|
/**
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
141
|
+
* Resize
|
|
142
|
+
*/
|
|
143
|
+
resize() {
|
|
144
|
+
setTimeout(() => {
|
|
145
|
+
let elem = document.getElementById('clipper-browser-scrollable');
|
|
146
|
+
if (elem) {
|
|
147
|
+
const height = this.dialogService.getCurrentDialogScrollableHeight(['clipper-browser-fixed'], window.innerHeight);
|
|
148
|
+
if (height != this.height) {
|
|
149
|
+
elem.setAttribute('style', 'height:' + height + 'px !important;max-height:' + height + 'px !important');
|
|
150
|
+
this.height = height;
|
|
151
|
+
this.resize();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
this.resize();
|
|
156
|
+
}
|
|
157
|
+
}, 100);
|
|
227
158
|
}
|
|
228
159
|
/**
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return;
|
|
235
|
-
if (!this.facetsSearch)
|
|
236
|
-
return;
|
|
237
|
-
this.facetsSearch.busy = true;
|
|
238
|
-
this.$clipper.queryFacets(searchParams)
|
|
239
|
-
.subscribe((r) => {
|
|
240
|
-
this.facetsSearch.update(r.value.facets, r.value.interval);
|
|
241
|
-
if (this.facetsSearch.hasFacets && !this.facetsClosed && this.mq !== 'xs')
|
|
242
|
-
this.facetsOpen();
|
|
243
|
-
else
|
|
244
|
-
this.facetsClose();
|
|
245
|
-
this.facetsSearch.busy = false;
|
|
246
|
-
this.snapshot.facets = this.facetsSearch.saveSnapshot();
|
|
247
|
-
// Update view
|
|
248
|
-
this.adjustView();
|
|
249
|
-
});
|
|
160
|
+
* Show hide filter pane manually
|
|
161
|
+
*/
|
|
162
|
+
toggleFilterPane() {
|
|
163
|
+
this.filterPaneClosed = !this.filterPaneClosed;
|
|
164
|
+
this.filterPane?.toggle();
|
|
250
165
|
}
|
|
251
166
|
/**
|
|
252
|
-
*
|
|
167
|
+
* Handle filter pane visibility
|
|
253
168
|
*/
|
|
254
|
-
|
|
255
|
-
if (this.
|
|
256
|
-
this
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
169
|
+
handleFilterPaneVisibility() {
|
|
170
|
+
if (this.filterPane) {
|
|
171
|
+
if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||
|
|
172
|
+
this.breakpointObserver.isMatched(Breakpoints.Small) ||
|
|
173
|
+
this.breakpointObserver.isMatched(Breakpoints.Medium)) {
|
|
174
|
+
if (this.filterPane.opened) {
|
|
175
|
+
this.filterPane.close();
|
|
176
|
+
}
|
|
177
|
+
this.filterPane.mode = 'over';
|
|
178
|
+
this.filterPane.disableClose = false;
|
|
179
|
+
this.filterPaneHasBackdrop = true;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
if (!this.filterPane.opened && !this.filterPaneClosed) {
|
|
183
|
+
this.filterPane.open();
|
|
184
|
+
}
|
|
185
|
+
else if (this.filterPane.opened && this.filterPaneClosed) {
|
|
186
|
+
this.filterPane.close();
|
|
187
|
+
}
|
|
188
|
+
this.filterPane.mode = 'side';
|
|
189
|
+
this.filterPane.disableClose = true;
|
|
190
|
+
this.filterPaneHasBackdrop = false;
|
|
191
|
+
}
|
|
264
192
|
}
|
|
265
|
-
return ids;
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Check if every element are selected
|
|
269
|
-
*/
|
|
270
|
-
isAllSelected() {
|
|
271
|
-
return (this.selection.current.selected.length === this.snapshot.items.length);
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Master selection toggle
|
|
275
|
-
* @parma args: event info
|
|
276
|
-
*/
|
|
277
|
-
masterSelectionToggle(args) {
|
|
278
|
-
if (args.checked)
|
|
279
|
-
this.snapshot.items.forEach((row) => this.selection.select(row, row.documentId));
|
|
280
|
-
else
|
|
281
|
-
this.snapshot.items.forEach((row) => this.selection.deselect(row, row.documentId));
|
|
282
193
|
}
|
|
283
194
|
/**
|
|
284
195
|
* Checks if documents can be selected and returned as message
|
|
285
196
|
*/
|
|
286
197
|
canSelect() {
|
|
287
198
|
let allow = this.selection &&
|
|
288
|
-
((this.
|
|
199
|
+
((this.dialogData.selectionMode === 1 &&
|
|
289
200
|
this.selection.current.selected.length === 1) ||
|
|
290
|
-
(this.
|
|
201
|
+
(this.dialogData.selectionMode === 2 &&
|
|
291
202
|
this.selection.current.selected.length > 1) ||
|
|
292
|
-
(this.
|
|
203
|
+
(this.dialogData.selectionMode === 3 &&
|
|
293
204
|
this.selection.current.selected.length > 0));
|
|
294
|
-
if (allow && this.
|
|
205
|
+
if (allow && this.dialogData.selectableModels?.length > 0) {
|
|
295
206
|
this.selection.current.selected.forEach(n => {
|
|
296
|
-
if (this.
|
|
207
|
+
if (this.dialogData.selectableModels.indexOf(n.model) === -1) {
|
|
297
208
|
allow = false;
|
|
298
209
|
return;
|
|
299
210
|
}
|
|
@@ -306,7 +217,8 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
306
217
|
*/
|
|
307
218
|
select() {
|
|
308
219
|
if (this.selection.current.selected && this.selection.current.selected.length > 0) {
|
|
309
|
-
this
|
|
220
|
+
this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_SELECTED, this.selection.current.selected);
|
|
221
|
+
this.changeDetector.markForCheck();
|
|
310
222
|
this.close();
|
|
311
223
|
}
|
|
312
224
|
}
|
|
@@ -321,77 +233,38 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
321
233
|
* Reset scroll position
|
|
322
234
|
*/
|
|
323
235
|
resetScrollPosition() {
|
|
324
|
-
document.querySelector('#
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Update menu buttons visibility when the menu is closed
|
|
328
|
-
*/
|
|
329
|
-
updateMenuButtonsVisibility() {
|
|
330
|
-
this.snapshot.items.forEach((n) => {
|
|
331
|
-
n.isMenuOpen = false;
|
|
332
|
-
});
|
|
236
|
+
document.querySelector('#clipper-references-scroller').scrollTo(0, 0);
|
|
333
237
|
}
|
|
334
238
|
/**
|
|
335
239
|
* Update sort
|
|
336
240
|
*/
|
|
337
241
|
updateSortOptions() {
|
|
338
|
-
switch (this.
|
|
339
|
-
case
|
|
242
|
+
switch (this.filterParams.sortMode) {
|
|
243
|
+
case ClipperSort.DateAsc:
|
|
340
244
|
this.currentSort = 'Data cre.';
|
|
341
245
|
break;
|
|
342
|
-
case
|
|
246
|
+
case ClipperSort.Popularity:
|
|
343
247
|
this.currentSort = 'Popolarità';
|
|
344
248
|
break;
|
|
345
|
-
case
|
|
249
|
+
case ClipperSort.Relevance:
|
|
346
250
|
this.currentSort = 'Rilevanza';
|
|
347
251
|
break;
|
|
348
|
-
case ClipperDefinitions.SRT_ORIGINAL:
|
|
349
|
-
this.currentSort = 'Data ins. decr.';
|
|
350
|
-
break;
|
|
351
|
-
case ClipperDefinitions.SRT_TAXONOMY:
|
|
352
|
-
this.currentSort = 'Argomento';
|
|
353
|
-
break;
|
|
354
252
|
default:
|
|
355
|
-
this.
|
|
253
|
+
this.filterParams.sortMode = ClipperSort.DateDesc;
|
|
356
254
|
this.currentSort = 'Data decr.';
|
|
357
255
|
break;
|
|
358
256
|
}
|
|
359
257
|
}
|
|
360
|
-
/**
|
|
361
|
-
* Adjust view
|
|
362
|
-
*/
|
|
363
|
-
adjustView() {
|
|
364
|
-
setTimeout(() => {
|
|
365
|
-
this.updateView();
|
|
366
|
-
}, 0);
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Update view
|
|
370
|
-
*/
|
|
371
|
-
updateView() {
|
|
372
|
-
// Update router height
|
|
373
|
-
let a = window.innerHeight;
|
|
374
|
-
let b = document.getElementById('clipper-browser-fixed');
|
|
375
|
-
try {
|
|
376
|
-
if (!a || !b || a === 0)
|
|
377
|
-
this.adjustView();
|
|
378
|
-
let hb = b.clientHeight;
|
|
379
|
-
if (hb === 0)
|
|
380
|
-
this.adjustView();
|
|
381
|
-
this.contentHeight = a - hb;
|
|
382
|
-
}
|
|
383
|
-
catch { }
|
|
384
|
-
}
|
|
385
258
|
/**
|
|
386
259
|
* Update current search info
|
|
387
260
|
*/
|
|
388
261
|
updateSearchInfo() {
|
|
389
262
|
let si = [];
|
|
390
|
-
if (this.
|
|
391
|
-
(this.
|
|
392
|
-
let s = SystemUtils.arrayFindByKey(
|
|
393
|
-
? this.
|
|
394
|
-
: this.
|
|
263
|
+
if (this.filterParams.sector ||
|
|
264
|
+
(this.facets && this.snapshot.facets.sector)) {
|
|
265
|
+
let s = SystemUtils.arrayFindByKey(ClipperSectors, 'value', this.facets && this.snapshot.facets.sector
|
|
266
|
+
? this.snapshot.facets.sector
|
|
267
|
+
: this.filterParams.sector);
|
|
395
268
|
if (s) {
|
|
396
269
|
si.push({
|
|
397
270
|
field: 'settore',
|
|
@@ -400,9 +273,9 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
400
273
|
});
|
|
401
274
|
}
|
|
402
275
|
else {
|
|
403
|
-
let s = SystemUtils.arrayFindByKey(
|
|
404
|
-
? this.
|
|
405
|
-
: this.
|
|
276
|
+
let s = SystemUtils.arrayFindByKey(ClipperModels, 'value', this.snapshot.facets && this.snapshot.facets.sector
|
|
277
|
+
? this.snapshot.facets.sector
|
|
278
|
+
: this.filterParams.sector);
|
|
406
279
|
if (s) {
|
|
407
280
|
si.push({
|
|
408
281
|
field: 'sezione',
|
|
@@ -412,11 +285,11 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
412
285
|
}
|
|
413
286
|
}
|
|
414
287
|
}
|
|
415
|
-
if (this.
|
|
416
|
-
(this.
|
|
417
|
-
let a = SystemUtils.arrayFindByKey(
|
|
418
|
-
? this.
|
|
419
|
-
: this.
|
|
288
|
+
if (this.filterParams.author ||
|
|
289
|
+
(this.snapshot.facets && this.snapshot.facets.author)) {
|
|
290
|
+
let a = SystemUtils.arrayFindByKey(ClipperAuthors, 'value', this.facets && this.snapshot.facets.author
|
|
291
|
+
? this.snapshot.facets.author
|
|
292
|
+
: this.filterParams.author);
|
|
420
293
|
if (a) {
|
|
421
294
|
si.push({
|
|
422
295
|
field: 'autore',
|
|
@@ -425,36 +298,36 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
425
298
|
});
|
|
426
299
|
}
|
|
427
300
|
}
|
|
428
|
-
if (this.
|
|
301
|
+
if (this.filterParams.topic)
|
|
429
302
|
si.push({
|
|
430
303
|
field: 'argomento',
|
|
431
|
-
value: this.
|
|
304
|
+
value: this.filterParams.topic,
|
|
432
305
|
sep: si.length > 0,
|
|
433
306
|
});
|
|
434
|
-
if (this.
|
|
307
|
+
if (this.filterParams.taxonomy)
|
|
435
308
|
si.push({
|
|
436
309
|
field: 'argomento',
|
|
437
|
-
value: this.
|
|
310
|
+
value: this.filterParams.taxonomyNode,
|
|
438
311
|
sep: si.length > 0,
|
|
439
312
|
});
|
|
440
|
-
if (this.
|
|
313
|
+
if (this.filterParams.number)
|
|
441
314
|
si.push({
|
|
442
315
|
field: 'numero',
|
|
443
|
-
value: this.
|
|
316
|
+
value: this.filterParams.number,
|
|
444
317
|
sep: si.length > 0,
|
|
445
318
|
});
|
|
446
319
|
if (!this.snapshot.interval &&
|
|
447
|
-
(this.
|
|
448
|
-
(this.
|
|
449
|
-
this.
|
|
450
|
-
this.
|
|
451
|
-
|
|
452
|
-
let d1 = this.
|
|
453
|
-
? this.
|
|
454
|
-
: this.
|
|
455
|
-
const d2 = this.
|
|
456
|
-
? this.
|
|
457
|
-
: this.
|
|
320
|
+
(this.filterParams.fromDate ||
|
|
321
|
+
(this.snapshot.facets &&
|
|
322
|
+
this.snapshot.facets.fromDate &&
|
|
323
|
+
this.filterParams.model !==
|
|
324
|
+
ClipperModel.AggiornamentoNormativo))) {
|
|
325
|
+
let d1 = this.snapshot.facets && this.snapshot.facets.fromDate
|
|
326
|
+
? this.snapshot.facets.fromDate
|
|
327
|
+
: this.filterParams.fromDate;
|
|
328
|
+
const d2 = this.snapshot.facets && this.snapshot.facets.toDate
|
|
329
|
+
? this.snapshot.facets.toDate
|
|
330
|
+
: this.filterParams.toDate;
|
|
458
331
|
si.push({
|
|
459
332
|
field: !d2 ? 'in data' : 'da data',
|
|
460
333
|
value: SystemUtils.formatDate(d1),
|
|
@@ -462,14 +335,14 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
462
335
|
});
|
|
463
336
|
}
|
|
464
337
|
if (!this.snapshot.interval &&
|
|
465
|
-
(this.
|
|
466
|
-
(this.
|
|
467
|
-
this.
|
|
468
|
-
this.
|
|
469
|
-
|
|
470
|
-
let d = this.
|
|
471
|
-
? this.
|
|
472
|
-
: this.
|
|
338
|
+
(this.filterParams.toDate ||
|
|
339
|
+
(this.snapshot.facets &&
|
|
340
|
+
this.snapshot.facets.toDate &&
|
|
341
|
+
this.filterParams.model !==
|
|
342
|
+
ClipperModel.AggiornamentoNormativo))) {
|
|
343
|
+
let d = this.snapshot.facets && this.snapshot.facets.toDate
|
|
344
|
+
? this.snapshot.facets.toDate
|
|
345
|
+
: this.filterParams.toDate;
|
|
473
346
|
si.push({
|
|
474
347
|
field: 'a data',
|
|
475
348
|
value: SystemUtils.formatDate(d),
|
|
@@ -482,60 +355,60 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
482
355
|
value: this.snapshot.interval,
|
|
483
356
|
sep: si.length > 0,
|
|
484
357
|
});
|
|
485
|
-
if (this.
|
|
358
|
+
if (this.filterParams.source)
|
|
486
359
|
si.push({
|
|
487
360
|
field: 'fonte',
|
|
488
|
-
value: SystemUtils.arrayGetValue(
|
|
361
|
+
value: SystemUtils.arrayGetValue(ClipperSources, this.filterParams.source),
|
|
489
362
|
sep: si.length > 0,
|
|
490
363
|
});
|
|
491
|
-
if (this.
|
|
364
|
+
if (this.filterParams.sourceNumber)
|
|
492
365
|
si.push({
|
|
493
366
|
field: 'num. fonte',
|
|
494
|
-
value: this.
|
|
367
|
+
value: this.filterParams.sourceNumber,
|
|
495
368
|
sep: si.length > 0,
|
|
496
369
|
});
|
|
497
|
-
if (this.
|
|
498
|
-
(this.
|
|
499
|
-
this.
|
|
500
|
-
this.
|
|
501
|
-
|
|
502
|
-
let d1 = this.
|
|
503
|
-
? this.
|
|
504
|
-
: this.
|
|
505
|
-
const d2 = this.
|
|
506
|
-
? this.
|
|
507
|
-
: this.
|
|
370
|
+
if (this.filterParams.sourceFromDate ||
|
|
371
|
+
(this.snapshot.facets &&
|
|
372
|
+
this.snapshot.facets.fromDate &&
|
|
373
|
+
this.filterParams.model ===
|
|
374
|
+
ClipperModel.AggiornamentoNormativo)) {
|
|
375
|
+
let d1 = this.snapshot.facets && this.snapshot.facets.fromDate
|
|
376
|
+
? this.snapshot.facets.fromDate
|
|
377
|
+
: this.filterParams.sourceFromDate;
|
|
378
|
+
const d2 = this.snapshot.facets && this.snapshot.facets.toDate
|
|
379
|
+
? this.snapshot.facets.toDate
|
|
380
|
+
: this.filterParams.sourceToDate;
|
|
508
381
|
si.push({
|
|
509
382
|
field: !d2 ? 'in data fonte' : 'da data fonte',
|
|
510
383
|
value: SystemUtils.formatDate(d1),
|
|
511
384
|
sep: si.length > 0,
|
|
512
385
|
});
|
|
513
386
|
}
|
|
514
|
-
if (this.
|
|
515
|
-
(this.
|
|
516
|
-
this.
|
|
517
|
-
this.
|
|
518
|
-
|
|
519
|
-
let d = this.
|
|
520
|
-
? this.
|
|
521
|
-
: this.
|
|
387
|
+
if (this.filterParams.sourceToDate ||
|
|
388
|
+
(this.snapshot.facets &&
|
|
389
|
+
this.snapshot.facets.toDate &&
|
|
390
|
+
this.filterParams.model ===
|
|
391
|
+
ClipperModel.AggiornamentoNormativo)) {
|
|
392
|
+
let d = this.snapshot.facets && this.snapshot.facets.toDate
|
|
393
|
+
? this.snapshot.facets.toDate
|
|
394
|
+
: this.filterParams.sourceToDate;
|
|
522
395
|
si.push({
|
|
523
396
|
field: 'a data fonte',
|
|
524
397
|
value: SystemUtils.formatDate(d),
|
|
525
398
|
sep: si.length > 0,
|
|
526
399
|
});
|
|
527
400
|
}
|
|
528
|
-
if (this.
|
|
401
|
+
if (this.filterParams.text)
|
|
529
402
|
si.push({
|
|
530
403
|
field: 'testo',
|
|
531
|
-
value: this.
|
|
404
|
+
value: this.filterParams.text,
|
|
532
405
|
sep: si.length > 0,
|
|
533
406
|
});
|
|
534
|
-
if (this.
|
|
535
|
-
(this.
|
|
536
|
-
let t = SystemUtils.arrayFindByKey(
|
|
537
|
-
? this.
|
|
538
|
-
: this.
|
|
407
|
+
if (this.filterParams.type ||
|
|
408
|
+
(this.snapshot.facets && this.snapshot.facets.type)) {
|
|
409
|
+
let t = SystemUtils.arrayFindByKey(ClipperSectorTypes, 'value', this.snapshot.facets && this.snapshot.facets.type
|
|
410
|
+
? this.snapshot.facets.type
|
|
411
|
+
: this.filterParams.type);
|
|
539
412
|
if (t) {
|
|
540
413
|
si.push({
|
|
541
414
|
field: 'tipo',
|
|
@@ -544,55 +417,55 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
544
417
|
});
|
|
545
418
|
}
|
|
546
419
|
}
|
|
547
|
-
if (this.
|
|
420
|
+
if (this.filterParams.showUnreadDocumentsOnly)
|
|
548
421
|
si.push({
|
|
549
422
|
field: 'stato',
|
|
550
423
|
value: 'non letti',
|
|
551
424
|
sep: si.length > 0,
|
|
552
425
|
});
|
|
553
|
-
if (this.
|
|
554
|
-
(this.
|
|
426
|
+
if (this.filterParams.changeReason ||
|
|
427
|
+
(this.snapshot.facets && this.snapshot.facets.reason))
|
|
555
428
|
si.push({
|
|
556
429
|
field: 'tipo mod.',
|
|
557
|
-
value: SystemUtils.arrayGetValue(
|
|
558
|
-
? this.
|
|
559
|
-
: this.
|
|
430
|
+
value: SystemUtils.arrayGetValue(ClipperDocumentChangeReason, this.snapshot.facets && this.snapshot.facets.reason
|
|
431
|
+
? this.snapshot.facets.reason
|
|
432
|
+
: this.filterParams.changeReason),
|
|
560
433
|
sep: si.length > 0,
|
|
561
434
|
});
|
|
562
|
-
if (this.
|
|
435
|
+
if (this.filterParams.changedNumber)
|
|
563
436
|
si.push({
|
|
564
437
|
field: 'num. modificato',
|
|
565
|
-
value: this.
|
|
438
|
+
value: this.filterParams.changedNumber,
|
|
566
439
|
sep: si.length > 0,
|
|
567
440
|
});
|
|
568
|
-
if (this.
|
|
441
|
+
if (this.filterParams.changedYear)
|
|
569
442
|
si.push({
|
|
570
443
|
field: 'anno modificato',
|
|
571
|
-
value: this.
|
|
444
|
+
value: this.filterParams.changedYear,
|
|
572
445
|
sep: si.length > 0,
|
|
573
446
|
});
|
|
574
|
-
if (this.
|
|
447
|
+
if (this.filterParams.changedTitle)
|
|
575
448
|
si.push({
|
|
576
449
|
field: 'titolo modificato',
|
|
577
|
-
value: this.
|
|
450
|
+
value: this.filterParams.changedTitle,
|
|
578
451
|
sep: si.length > 0,
|
|
579
452
|
});
|
|
580
|
-
if (this.
|
|
453
|
+
if (this.filterParams.modifierNumber)
|
|
581
454
|
si.push({
|
|
582
455
|
field: 'num. modificante',
|
|
583
|
-
value: this.
|
|
456
|
+
value: this.filterParams.modifierNumber,
|
|
584
457
|
sep: si.length > 0,
|
|
585
458
|
});
|
|
586
|
-
if (this.
|
|
459
|
+
if (this.filterParams.modifierYear)
|
|
587
460
|
si.push({
|
|
588
461
|
field: 'anno modificante',
|
|
589
|
-
value: this.
|
|
462
|
+
value: this.filterParams.modifierYear,
|
|
590
463
|
sep: si.length > 0,
|
|
591
464
|
});
|
|
592
|
-
if (this.
|
|
465
|
+
if (this.filterParams.modifierTitle)
|
|
593
466
|
si.push({
|
|
594
467
|
field: 'titolo modificante',
|
|
595
|
-
value: this.
|
|
468
|
+
value: this.filterParams.modifierTitle,
|
|
596
469
|
sep: si.length > 0,
|
|
597
470
|
});
|
|
598
471
|
this.snapshot.searchInfo = si;
|
|
@@ -603,12 +476,12 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
603
476
|
* @param fetch : true if data must be fetched. Default is true
|
|
604
477
|
*/
|
|
605
478
|
changeModel(model = null, fetch = true) {
|
|
606
|
-
this.
|
|
479
|
+
this.filterParams.model = model;
|
|
607
480
|
switch (model) {
|
|
608
|
-
case
|
|
481
|
+
case ClipperModel.AggiornamentoNormativo:
|
|
609
482
|
this.currentModel = "Gazzette e bollettini";
|
|
610
483
|
break;
|
|
611
|
-
case
|
|
484
|
+
case ClipperModel.NormativaVigente:
|
|
612
485
|
this.currentModel = "Normativa vigente";
|
|
613
486
|
break;
|
|
614
487
|
default:
|
|
@@ -623,217 +496,85 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
623
496
|
* @param mode : the sort mode
|
|
624
497
|
*/
|
|
625
498
|
sortBy(mode) {
|
|
626
|
-
this.
|
|
499
|
+
this.filterParams.sortMode = mode;
|
|
627
500
|
this.updateSortOptions();
|
|
628
501
|
this.fetch(false);
|
|
629
502
|
}
|
|
503
|
+
/**
|
|
504
|
+
* Get facets
|
|
505
|
+
*/
|
|
506
|
+
fetchFacets() {
|
|
507
|
+
if (!this.clipperService.loggedIn)
|
|
508
|
+
return;
|
|
509
|
+
this.facets.busy.set(true);
|
|
510
|
+
this.clipperService.referencesFacets(this.filterParams)
|
|
511
|
+
.subscribe({
|
|
512
|
+
next: (r) => {
|
|
513
|
+
if (r.success) {
|
|
514
|
+
this.prepareResults(null, r.value.facets);
|
|
515
|
+
this.handleFilterPaneVisibility();
|
|
516
|
+
}
|
|
517
|
+
this.resetScrollPosition();
|
|
518
|
+
},
|
|
519
|
+
complete: () => {
|
|
520
|
+
this.facets.busy.set(false);
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
}
|
|
630
524
|
/**
|
|
631
525
|
* Perform a search using current params
|
|
632
526
|
*/
|
|
633
527
|
fetch(newSearch = false) {
|
|
634
|
-
this
|
|
635
|
-
this.
|
|
528
|
+
this.dialogService.busy('Ricerca in corso...');
|
|
529
|
+
this.filterParams.count = 25;
|
|
636
530
|
if (newSearch) {
|
|
637
|
-
this.
|
|
638
|
-
if (this.
|
|
639
|
-
this.
|
|
640
|
-
else if (!this.
|
|
641
|
-
this.
|
|
531
|
+
this.filterParams.first = 0;
|
|
532
|
+
if (this.filterParams.text)
|
|
533
|
+
this.filterParams.sortMode = ClipperSort.Relevance;
|
|
534
|
+
else if (!this.filterParams.sortMode)
|
|
535
|
+
this.filterParams.sortMode = ClipperSort.DateDesc;
|
|
642
536
|
this.updateSortOptions();
|
|
643
537
|
}
|
|
644
|
-
if (this.
|
|
645
|
-
const year = this.
|
|
646
|
-
this.
|
|
647
|
-
this.
|
|
538
|
+
if (this.filterParams.year > 0) {
|
|
539
|
+
const year = this.filterParams.year;
|
|
540
|
+
this.filterParams.fromDate = new Date(year, 0, 1, 2);
|
|
541
|
+
this.filterParams.toDate = new Date(year, 11, 31, 2);
|
|
648
542
|
}
|
|
649
543
|
else {
|
|
650
|
-
this.
|
|
544
|
+
this.filterParams.year = null;
|
|
651
545
|
}
|
|
652
|
-
if (this.
|
|
653
|
-
this.
|
|
546
|
+
if (this.filterParams.text) {
|
|
547
|
+
this.filterParams.text = ClipperSearchUtils.normalizeTextQuery(this.filterParams.text);
|
|
654
548
|
}
|
|
655
|
-
this
|
|
549
|
+
this.clipperService.query(this.filterParams)
|
|
656
550
|
.subscribe({
|
|
657
551
|
next: (r) => {
|
|
658
552
|
if (!r.success)
|
|
659
|
-
this
|
|
553
|
+
this.dialogService.error(r.message);
|
|
660
554
|
else {
|
|
661
|
-
this.
|
|
662
|
-
|
|
663
|
-
this.snapshot.interval = r.value?.interval;
|
|
664
|
-
const today = startOfToday();
|
|
665
|
-
const groupByYear = this.snapshot.searchParams.sortMode ===
|
|
666
|
-
ClipperDefinitions.SRT_DATE_ASC ||
|
|
667
|
-
this.snapshot.searchParams.sortMode ===
|
|
668
|
-
ClipperDefinitions.SRT_DATE_DESC;
|
|
669
|
-
const groupByRelevance = this.snapshot.searchParams.sortMode ===
|
|
670
|
-
ClipperDefinitions.SRT_RELEVANCE;
|
|
671
|
-
const groupByPopularity = this.snapshot.searchParams.sortMode ===
|
|
672
|
-
ClipperDefinitions.SRT_POPULARITY;
|
|
673
|
-
let group = '';
|
|
674
|
-
this.snapshot.items.forEach((n) => {
|
|
675
|
-
if (n.model === ClipperDefinitions.DM_SCADENZA ||
|
|
676
|
-
n.model === ClipperDefinitions.DM_SEGNALAZIONE) {
|
|
677
|
-
switch (n.model) {
|
|
678
|
-
case ClipperDefinitions.DM_SCADENZA:
|
|
679
|
-
n.originDescription = 'Scadenza';
|
|
680
|
-
break;
|
|
681
|
-
case ClipperDefinitions.DM_SEGNALAZIONE:
|
|
682
|
-
n.originDescription = 'Segnalazione';
|
|
683
|
-
break;
|
|
684
|
-
}
|
|
685
|
-
if (n.expiringInfo) {
|
|
686
|
-
let parts = n.expiringInfo.split('|');
|
|
687
|
-
if (parts.length === 3)
|
|
688
|
-
n.description = parts[2];
|
|
689
|
-
}
|
|
690
|
-
if (n.expiringDate) {
|
|
691
|
-
n.date = startOfDay(new Date(n.expiringDate));
|
|
692
|
-
const d = subDays(n.date, 15);
|
|
693
|
-
n.isExpiring = today <= n.date && today >= d;
|
|
694
|
-
n.isExpired = n.date < today;
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
else {
|
|
698
|
-
if (n.date) {
|
|
699
|
-
n.date = startOfDay(new Date(n.date));
|
|
700
|
-
const d = startOfDay(subDays(startOfToday(), 7));
|
|
701
|
-
n.isNew = n.date > d;
|
|
702
|
-
}
|
|
703
|
-
if (n.anchors) {
|
|
704
|
-
let anchorType;
|
|
705
|
-
let anchors = [];
|
|
706
|
-
n.anchors.forEach((a) => {
|
|
707
|
-
if (a.type === 20)
|
|
708
|
-
return;
|
|
709
|
-
if (a.type !== anchorType) {
|
|
710
|
-
if (a.type >= 3)
|
|
711
|
-
anchors.push({ text: a.typeDescription });
|
|
712
|
-
anchorType = a.type;
|
|
713
|
-
}
|
|
714
|
-
let score = a.score;
|
|
715
|
-
if (score > 7)
|
|
716
|
-
score -= 7;
|
|
717
|
-
else if (score > 5)
|
|
718
|
-
score -= 5;
|
|
719
|
-
else if (score > 3)
|
|
720
|
-
score -= 3;
|
|
721
|
-
anchors.push({
|
|
722
|
-
text: a.text,
|
|
723
|
-
title: a.title,
|
|
724
|
-
documentId: a.documentId,
|
|
725
|
-
uri: a.uri,
|
|
726
|
-
veryRelevant: score > 0.6,
|
|
727
|
-
});
|
|
728
|
-
});
|
|
729
|
-
n.anchors = anchors;
|
|
730
|
-
}
|
|
731
|
-
if (n.validityState > 0) {
|
|
732
|
-
n.validityDescription = 'Il documento non è più vigente';
|
|
733
|
-
n.isExpired = true;
|
|
734
|
-
if (n.validUntilDate) {
|
|
735
|
-
const expiringDate = startOfDay(new Date(n.validUntilDate));
|
|
736
|
-
if (expiringDate < today) {
|
|
737
|
-
n.validityDescription =
|
|
738
|
-
'Il documento non è più vigente dal ' +
|
|
739
|
-
SystemUtils.formatDate(expiringDate) +
|
|
740
|
-
'.';
|
|
741
|
-
}
|
|
742
|
-
else {
|
|
743
|
-
n.validityDescription =
|
|
744
|
-
'Il documento non sarà più vigente dal ' +
|
|
745
|
-
SystemUtils.formatDate(expiringDate) +
|
|
746
|
-
'.';
|
|
747
|
-
n.isExpired = false;
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
if (n.expiringDate) {
|
|
752
|
-
n.date = startOfDay(new Date(n.expiringDate));
|
|
753
|
-
n.isExpired = n.date < today;
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
if (groupByYear) {
|
|
757
|
-
let year = SystemUtils.formatDate(n.date, DateFormat.LongMonthAndYear).toLowerCase();
|
|
758
|
-
if (group !== year) {
|
|
759
|
-
n.group = year;
|
|
760
|
-
group = year;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
else if (groupByRelevance) {
|
|
764
|
-
if (group !== 'none') {
|
|
765
|
-
n.group =
|
|
766
|
-
'Elenco per rilevanza: gli elementi più importanti sono in testa';
|
|
767
|
-
group = 'none';
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
else if (groupByPopularity) {
|
|
771
|
-
if (group !== 'none') {
|
|
772
|
-
n.group =
|
|
773
|
-
'Elenco per popolarità: gli elementi più importanti sono in testa';
|
|
774
|
-
group = 'none';
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
if (n.taxonomy) {
|
|
778
|
-
n.taxonomyNodes = n.taxonomy.split('\r\n');
|
|
779
|
-
if (this.snapshot.searchParams.model ===
|
|
780
|
-
ClipperDefinitions.DM_GUIDA ||
|
|
781
|
-
this.snapshot.searchParams.model ===
|
|
782
|
-
ClipperDefinitions.DM_GUIDA_NORMATIVA ||
|
|
783
|
-
this.snapshot.searchParams.model ===
|
|
784
|
-
ClipperDefinitions.DM_SCHEDA_ADEMPIMENTI) {
|
|
785
|
-
for (let i = 0; i < n.taxonomyNodes.length; i++) {
|
|
786
|
-
let node = n.taxonomyNodes[i];
|
|
787
|
-
let p = node.indexOf('>');
|
|
788
|
-
if (p !== -1)
|
|
789
|
-
n.taxonomyNodes[i] = node
|
|
790
|
-
.substring(p + 1)
|
|
791
|
-
.replace(/\>/gi, ' > ');
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
});
|
|
796
|
-
// Show toast if new search
|
|
555
|
+
this.prepareResults(r.value);
|
|
556
|
+
// Handle facets
|
|
797
557
|
if (this.snapshot.total > 0) {
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
if (newSearch && this.snapshot.searchParams.first === 0) {
|
|
801
|
-
if (this.snapshot.total >= 1000) {
|
|
802
|
-
let t = this.$dialog.toast('Ho trovato più di 1000 elementi', 3000, 'warning', 'Rifinisci');
|
|
803
|
-
t.instance.action.subscribe(() => {
|
|
804
|
-
this.advancedSearch();
|
|
805
|
-
});
|
|
806
|
-
}
|
|
807
|
-
else {
|
|
808
|
-
this.$dialog.toast('Ho trovato ' +
|
|
809
|
-
this.snapshot.total +
|
|
810
|
-
(this.snapshot.total === 1 ? ' elemento' : ' elementi'));
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
if (newSearch && !this.snapshot.searchParams.first) {
|
|
558
|
+
this.snapshot.facets.hasTooManyResults = this.snapshot.total >= 1000;
|
|
559
|
+
if (newSearch)
|
|
814
560
|
// Update facets
|
|
815
|
-
this.
|
|
816
|
-
}
|
|
561
|
+
this.fetchFacets();
|
|
817
562
|
}
|
|
818
563
|
else {
|
|
819
|
-
this.
|
|
820
|
-
this.
|
|
564
|
+
this.facets.reset();
|
|
565
|
+
this.filterPane.close();
|
|
821
566
|
}
|
|
822
567
|
if (newSearch) {
|
|
823
568
|
if (this.paginator)
|
|
824
569
|
this.paginator.pageIndex = 0;
|
|
825
570
|
}
|
|
826
571
|
this.resetScrollPosition();
|
|
827
|
-
// Update snapshot
|
|
828
|
-
this.$clipper.snapshot = this.snapshot;
|
|
829
572
|
// Update view
|
|
830
573
|
this.updateSearchInfo();
|
|
831
|
-
this.updateFacetsVisibility();
|
|
832
|
-
this.adjustView();
|
|
833
574
|
}
|
|
834
575
|
},
|
|
835
576
|
complete: () => {
|
|
836
|
-
this
|
|
577
|
+
this.dialogService.clearBusy();
|
|
837
578
|
}
|
|
838
579
|
});
|
|
839
580
|
}
|
|
@@ -842,26 +583,24 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
842
583
|
* @param e : the MatPaginator PageEvent data
|
|
843
584
|
*/
|
|
844
585
|
fetchMore(e) {
|
|
845
|
-
let first = e.pageIndex * this.
|
|
846
|
-
this.
|
|
586
|
+
let first = e.pageIndex * this.filterParams.count;
|
|
587
|
+
this.filterParams.first = first;
|
|
847
588
|
this.fetch();
|
|
848
589
|
}
|
|
849
590
|
/**
|
|
850
591
|
* Clear search
|
|
851
592
|
*/
|
|
852
593
|
clearSearch() {
|
|
853
|
-
this.snapshot.searchParams = {
|
|
854
|
-
module: ClipperDefinitions.MOD_SEMANTIC_SEARCH,
|
|
855
|
-
model: ClipperDefinitions.DM_NORMATIVA_VIGENTE,
|
|
856
|
-
first: 0,
|
|
857
|
-
count: 25,
|
|
858
|
-
};
|
|
859
594
|
this.currentModel = 'Normativa vigente';
|
|
860
595
|
this.snapshot.items = null;
|
|
861
596
|
this.snapshot.total = 0;
|
|
862
597
|
this.snapshot.facets = null;
|
|
863
|
-
this.
|
|
864
|
-
this.
|
|
598
|
+
this.facets.reset();
|
|
599
|
+
this.filterParams = {
|
|
600
|
+
first: 0,
|
|
601
|
+
count: 15,
|
|
602
|
+
};
|
|
603
|
+
this.filterPane.close();
|
|
865
604
|
this.updateSearchInfo();
|
|
866
605
|
}
|
|
867
606
|
/**
|
|
@@ -882,13 +621,13 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
882
621
|
openDocument(documentId) {
|
|
883
622
|
if (!documentId)
|
|
884
623
|
return;
|
|
885
|
-
ClipperDocumentsUtils.openDocument(
|
|
624
|
+
ClipperDocumentsUtils.openDocument(documentId, this.filterParams.text, this.dialogData.selectionMode);
|
|
886
625
|
}
|
|
887
626
|
/**
|
|
888
627
|
* Compose a free text search query
|
|
889
628
|
*/
|
|
890
629
|
composeSearch() {
|
|
891
|
-
let d = this
|
|
630
|
+
let d = this.dialogService.open(ClipperSearchFreeTextQueryBuilderComponent, {
|
|
892
631
|
ariaLabel: 'costruisci ricerca',
|
|
893
632
|
autoFocus: false,
|
|
894
633
|
restoreFocus: true,
|
|
@@ -899,97 +638,22 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
899
638
|
});
|
|
900
639
|
d.componentInstance.done
|
|
901
640
|
.subscribe((r) => {
|
|
902
|
-
this.
|
|
641
|
+
this.filterParams.text = r.query;
|
|
903
642
|
// Finished
|
|
904
643
|
d.close();
|
|
905
644
|
});
|
|
906
645
|
}
|
|
907
|
-
/**
|
|
908
|
-
* Return item state css class
|
|
909
|
-
* @param item : the item to evaluate
|
|
910
|
-
*/
|
|
911
|
-
getItemStateCssClass(item) {
|
|
912
|
-
if (item.isExpired)
|
|
913
|
-
return 'item-expired-ind';
|
|
914
|
-
if (item.popularity === 3)
|
|
915
|
-
return 'item-popular-ind';
|
|
916
|
-
else if (item.popularity > 3)
|
|
917
|
-
return 'item-very-popular-ind';
|
|
918
|
-
return null;
|
|
919
|
-
}
|
|
920
|
-
/**
|
|
921
|
-
* Return the item state tooltip text
|
|
922
|
-
* @param item : the item to evaluate
|
|
923
|
-
*/
|
|
924
|
-
getItemStateTooltip(item) {
|
|
925
|
-
if (item.isExpired)
|
|
926
|
-
return 'Non più vigente';
|
|
927
|
-
if (item.popularity === 3)
|
|
928
|
-
return 'Documento con numero di citazioni alto';
|
|
929
|
-
else if (item.popularity > 3)
|
|
930
|
-
return 'Documento con numero di citazioni molto alto';
|
|
931
|
-
return null;
|
|
932
|
-
}
|
|
933
|
-
/**
|
|
934
|
-
* Send item link or all selected ones by email
|
|
935
|
-
* @param item : the optional item
|
|
936
|
-
*/
|
|
937
|
-
sendTo(item = null) {
|
|
938
|
-
this.sendItemsTo(item ? [item] : this.selection.current.selected);
|
|
939
|
-
}
|
|
940
|
-
/**
|
|
941
|
-
* Browse document references
|
|
942
|
-
* @param item : the document item
|
|
943
|
-
* @param mode : the mode
|
|
944
|
-
*/
|
|
945
|
-
references(item, mode = ClipperDefinitions.SM_REFERENCES_IN) {
|
|
946
|
-
if (!item)
|
|
947
|
-
return;
|
|
948
|
-
let d = this.$dialog.open(ClipperReferencesComponent, {
|
|
949
|
-
ariaLabel: 'riferimenti legati al documento',
|
|
950
|
-
autoFocus: false,
|
|
951
|
-
restoreFocus: false,
|
|
952
|
-
disableClose: false,
|
|
953
|
-
closeOnNavigation: false,
|
|
954
|
-
data: { id: item.documentId, mode: mode },
|
|
955
|
-
panelClass: 'references-container',
|
|
956
|
-
minWidth: '375px',
|
|
957
|
-
maxWidth: '1000px',
|
|
958
|
-
width: '99%',
|
|
959
|
-
height: '99%',
|
|
960
|
-
});
|
|
961
|
-
d.afterClosed()
|
|
962
|
-
.subscribe((r) => {
|
|
963
|
-
if (r && r.id)
|
|
964
|
-
this.open(r.id);
|
|
965
|
-
});
|
|
966
|
-
}
|
|
967
|
-
/**
|
|
968
|
-
* Display a document report
|
|
969
|
-
* @param item : the document
|
|
970
|
-
*/
|
|
971
|
-
report(item) {
|
|
972
|
-
if (!item)
|
|
973
|
-
return;
|
|
974
|
-
if (!item)
|
|
975
|
-
return;
|
|
976
|
-
if (item.model != ClipperDefinitions.DM_NORMATIVA_VIGENTE && item.model != ClipperDefinitions.DM_SCADENZA) {
|
|
977
|
-
this.$dialog.info("Questa funzionalità non è disponibile per questo tipo di documento.");
|
|
978
|
-
return;
|
|
979
|
-
}
|
|
980
|
-
this.openReport(item.documentId, item.title1);
|
|
981
|
-
}
|
|
982
646
|
/**
|
|
983
647
|
* Perform search
|
|
984
648
|
*/
|
|
985
649
|
search() {
|
|
986
|
-
if (this.
|
|
987
|
-
this.
|
|
650
|
+
if (this.filterParams.sector === this.snapshot.facets.sector)
|
|
651
|
+
this.filterParams.sector = null;
|
|
988
652
|
// Reset paginator
|
|
989
653
|
if (this.paginator)
|
|
990
654
|
this.paginator.pageIndex = 0;
|
|
991
655
|
// Reset facets search
|
|
992
|
-
this.
|
|
656
|
+
this.facets.reset();
|
|
993
657
|
// Do search
|
|
994
658
|
this.fetch(true);
|
|
995
659
|
}
|
|
@@ -997,13 +661,13 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
997
661
|
* Show advanced search
|
|
998
662
|
*/
|
|
999
663
|
advancedSearch() {
|
|
1000
|
-
let d = this
|
|
664
|
+
let d = this.dialogService.open(ClipperSearchDialogComponent, {
|
|
1001
665
|
ariaLabel: 'ricerca avanzata',
|
|
1002
666
|
autoFocus: false,
|
|
1003
667
|
restoreFocus: false,
|
|
1004
668
|
disableClose: false,
|
|
1005
669
|
data: {
|
|
1006
|
-
params: this.
|
|
670
|
+
params: this.filterParams,
|
|
1007
671
|
enableRead: false,
|
|
1008
672
|
enableSector: true,
|
|
1009
673
|
enableType: true,
|
|
@@ -1020,17 +684,17 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
1020
684
|
d.componentInstance.done
|
|
1021
685
|
.subscribe((r) => {
|
|
1022
686
|
// Update search params
|
|
1023
|
-
r.model = this.
|
|
1024
|
-
this.
|
|
1025
|
-
this.
|
|
1026
|
-
this.
|
|
1027
|
-
if (this.
|
|
1028
|
-
this.
|
|
687
|
+
r.model = this.filterParams.model;
|
|
688
|
+
this.filterParams = r;
|
|
689
|
+
this.filterParams.first = 0;
|
|
690
|
+
this.filterParams.count = 25;
|
|
691
|
+
if (this.filterParams.sector === this.snapshot.facets.sector)
|
|
692
|
+
this.filterParams.sector = null;
|
|
1029
693
|
// Reset paginator
|
|
1030
694
|
if (this.paginator)
|
|
1031
695
|
this.paginator.pageIndex = 0;
|
|
1032
696
|
// Reset facets search
|
|
1033
|
-
this.
|
|
697
|
+
this.facets.reset();
|
|
1034
698
|
// Do search
|
|
1035
699
|
this.fetch(true);
|
|
1036
700
|
// Finished
|
|
@@ -1041,7 +705,7 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
1041
705
|
* Show free text help
|
|
1042
706
|
*/
|
|
1043
707
|
helpSearch() {
|
|
1044
|
-
this
|
|
708
|
+
this.dialogService.open(ClipperSearchFreeTextHelpComponent, {
|
|
1045
709
|
ariaLabel: 'informazioni ricerca',
|
|
1046
710
|
autoFocus: false,
|
|
1047
711
|
restoreFocus: true,
|
|
@@ -1051,128 +715,16 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
|
|
|
1051
715
|
width: '99%',
|
|
1052
716
|
});
|
|
1053
717
|
}
|
|
1054
|
-
|
|
1055
|
-
* Manage clipper bag
|
|
1056
|
-
*/
|
|
1057
|
-
manageBag() {
|
|
1058
|
-
let items = [];
|
|
1059
|
-
this.$clipper.bag.forEach((n) => {
|
|
1060
|
-
let title = n.Title1 ? n.Title1 : n.Title2;
|
|
1061
|
-
items.push({
|
|
1062
|
-
template: title,
|
|
1063
|
-
bag: n,
|
|
1064
|
-
searchBag: { name: title },
|
|
1065
|
-
});
|
|
1066
|
-
});
|
|
1067
|
-
let d = this.$dialog.select({
|
|
1068
|
-
title: 'Gestisci documenti di lavoro',
|
|
1069
|
-
multi: false,
|
|
1070
|
-
mustSelect: false,
|
|
1071
|
-
okCaption: 'SELEZIONA',
|
|
1072
|
-
items: items,
|
|
1073
|
-
canDelete: true,
|
|
1074
|
-
canView: true,
|
|
1075
|
-
});
|
|
1076
|
-
d.componentInstance.view
|
|
1077
|
-
.subscribe((r) => {
|
|
1078
|
-
let item = r.bag;
|
|
1079
|
-
this.open(item.DocumentId);
|
|
1080
|
-
});
|
|
1081
|
-
d.componentInstance.delete
|
|
1082
|
-
.subscribe((r) => {
|
|
1083
|
-
var item = r.selectedItems[0].bag;
|
|
1084
|
-
this.$clipper.removeFromBag(item.DocumentId).subscribe(() => {
|
|
1085
|
-
this.$dialog.toast('Operazione completata con successo.');
|
|
1086
|
-
for (let p = 0; p < r.items.length; p++) {
|
|
1087
|
-
if (r.items[p].bag.DocumentId === item.DocumentId) {
|
|
1088
|
-
r.items.splice(p, 1);
|
|
1089
|
-
if (r.items.length === 0)
|
|
1090
|
-
d.close();
|
|
1091
|
-
return;
|
|
1092
|
-
}
|
|
1093
|
-
}
|
|
1094
|
-
});
|
|
1095
|
-
});
|
|
1096
|
-
}
|
|
1097
|
-
/**
|
|
1098
|
-
* Show home tab
|
|
1099
|
-
*/
|
|
1100
|
-
showHome() {
|
|
1101
|
-
this.dialogTab = 2;
|
|
1102
|
-
if (this.$clipper.loggedIn && !this.last15Days.daysLoaded)
|
|
1103
|
-
this.last15Days.fetch();
|
|
1104
|
-
}
|
|
1105
|
-
/**
|
|
1106
|
-
* Expand or collapse home days view
|
|
1107
|
-
* @param collapse
|
|
1108
|
-
*/
|
|
1109
|
-
expandHome(collapse = false) {
|
|
1110
|
-
this.last15Days.expand(collapse);
|
|
1111
|
-
}
|
|
1112
|
-
//
|
|
1113
|
-
// Registro e scadenzario
|
|
1114
|
-
//
|
|
1115
|
-
/**
|
|
1116
|
-
* Checks if all documents are supported by RS
|
|
1117
|
-
* @param documents : the list of documens
|
|
1118
|
-
* @returns: true if all documents supports RS
|
|
1119
|
-
*/
|
|
1120
|
-
RS_enabled(documents) {
|
|
1121
|
-
if (!documents)
|
|
1122
|
-
return false;
|
|
1123
|
-
if (this.data.selectionMode > 0)
|
|
1124
|
-
return false;
|
|
1125
|
-
let allow = false;
|
|
1126
|
-
documents.forEach((n) => {
|
|
1127
|
-
allow = n.model === ClipperDefinitions.DM_NORMATIVA_VIGENTE ||
|
|
1128
|
-
n.model === ClipperDefinitions.DM_AGGIORNAMENTO_NORMATIVO ||
|
|
1129
|
-
n.model === ClipperDefinitions.DM_SCADENZA;
|
|
1130
|
-
if (!allow)
|
|
1131
|
-
return;
|
|
1132
|
-
});
|
|
1133
|
-
return allow;
|
|
1134
|
-
}
|
|
1135
|
-
/**
|
|
1136
|
-
* New law
|
|
1137
|
-
* @param document: the law
|
|
1138
|
-
*/
|
|
1139
|
-
RS_newLaw(document) {
|
|
1140
|
-
if (this.data.selectionMode > 0 || !this.$clipper.supportsRS)
|
|
1141
|
-
return;
|
|
1142
|
-
this.$broadcast.sendMessage(ClipperMessages.INTEROP_RS_NEW_LAW, document ? [document] : this.selection.current.selected);
|
|
1143
|
-
}
|
|
1144
|
-
/**
|
|
1145
|
-
* New activity
|
|
1146
|
-
* @param document: the law
|
|
1147
|
-
*/
|
|
1148
|
-
RS_newActivity(document) {
|
|
1149
|
-
if (!document)
|
|
1150
|
-
return;
|
|
1151
|
-
if (this.data.selectionMode > 0 || !this.$clipper.supportsRS)
|
|
1152
|
-
return;
|
|
1153
|
-
this.$broadcast.sendMessage(ClipperMessages.INTEROP_RS_NEW_ACTIVITY, document);
|
|
1154
|
-
}
|
|
1155
|
-
/**
|
|
1156
|
-
* Document usage report
|
|
1157
|
-
* @param document: the law
|
|
1158
|
-
*/
|
|
1159
|
-
RS_usageReport(document) {
|
|
1160
|
-
if (!document)
|
|
1161
|
-
return;
|
|
1162
|
-
if (this.data.selectionMode > 0 || !this.$clipper.supportsRS)
|
|
1163
|
-
return;
|
|
1164
|
-
this.$broadcast.sendMessage(ClipperMessages.INTEROP_RS_USAGE_REPORT, document);
|
|
1165
|
-
}
|
|
1166
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperBrowserDialogComponent, deps: [{ token: i1.ApplicationDialogService }, { token: i2.ClipperService }, { token: i3.ScreenService }, { token: i3.BroadcastService }, { token: i4.MatDialogRef }, { token: i5.MediaObserver }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
718
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperBrowserDialogComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
1167
719
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperBrowserDialogComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, providers: [
|
|
1168
720
|
MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER
|
|
1169
|
-
], viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "last15Days", first: true, predicate: ["last15Days"], descendants: true }, { propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenuTrigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b> \r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? ' ' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, item)) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i6.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i6.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i6.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i11.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i11.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i12.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i12.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i12.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i13.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i15.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: i15.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i15.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i17.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i17.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i17.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i18.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["selectionSource", "parent", "item", "isReference", "isReadable", "isSelectable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i19.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i19.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i19.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i20.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", inputs: ["busy"], outputs: ["changed"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ClipperSearchResultItemComponent, selector: "clipper-search-result-item", inputs: ["parent", "item"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i21.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: ClipperLast15DaysComponent, selector: "clipper-last-15-days", inputs: ["showHeader"] }] }); }
|
|
721
|
+
], viewQueries: [{ propertyName: "filterPane", first: true, predicate: ["filterPane"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (dialogData?.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\" class=\"dialog-close\">\r\n @if (clipperService.bag.length > 0) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Documenti di lavoro\" aria-label=\"'Documenti di lavoro'\"\r\n (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"clipperService.bag.length\"\r\n matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"filterParams.number\" #number=\"ngModel\" name=\"number\" maxlength=\"10\"\r\n (keyup.Enter)=\"fetch(true)\">\r\n @if (filterParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"filterParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"filterParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (filterParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"filterParams.text\" maxlength=\"200\"\r\n (keyup.Enter)=\"search()\" autofocus />\r\n @if (filterParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <button type=\"button\" mat-icon-button (click)=\"search()\" [attr.aria-label]=\"'Avvia la ricerca'\"\r\n matTooltip=\"Avvia ricerca\" [disabled]=\"!clipperService.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button (click)=\"advancedSearch()\" [attr.aria-label]=\"'Ricerca avanzata'\"\r\n matTooltip=\"Ricerca avanzata\" [disabled]=\"!clipperService.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"small\" style=\"padding-left: 15px;\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n <b>RICERCA ATTIVA</b> \r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? ' ' : ''}} {{si.field}}: <span class=\"accent lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between center\" fxFill style=\"padding-left: 15px;\">\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox (change)=\"$event ? selectAll($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !allSelected()\" [attr.aria-label]=\"'Seleziona/deseleziona tutto'\"\r\n matTooltip=\"Seleziona/deseleziona tutto\" [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (filterParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [useSelections]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"toggleFilterPane()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content id=\"clipper-browser-scrollable\">\r\n <mat-drawer-container>\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"40px\" style=\"margin:0 4px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlexAlign=\"center\" class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" id=\"clipper-references-scroller\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track item; let i = $index) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [ngClass]=\"{'spaced': i > 0}\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"center\">\r\n @if (screenService.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"item-content\">\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [useSelections]=\"canSelect()\" [isReadable]=\"false\"\r\n [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot?.total ?? 0\"\r\n [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #191c1b;--ars-color-text-low: #e0e2e5;--ars-color-divider: #757d87;--ars-drawer-background-color: #eff1ef;--ars-drawer-background-color-low: #e0e3e1;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.wide{min-width:100%!important;max-width:100%;width:100%}.fill{min-width:100%!important;max-width:100%;width:100%;min-height:100%!important;max-height:100%;height:100%}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.smaller{font-size:smaller}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.accent{color:var(--ars-accent)!important}.primary{color:var(--ars-primary)!important}.secondary{color:var(--ars-secondary)!important}.error{color:var(--ars-error)!important}.warning{color:var(--ars-warning)!important}.drawer-content{padding-top:10px}.drawer,.drawer-small{min-width:420px!important;max-width:420px!important;padding:20px 5px 5px;background-color:var(--ars-drawer-background-color)!important}.drawer .title,.drawer-small .title{font-size:1.2em;font-weight:600;padding-left:10px;min-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .fade-in,.drawer-small .fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.drawer .content,.drawer-small .content{padding:10px 0}.drawer .fixed,.drawer-small .fixed{padding:0 4px}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:15px;padding-right:20px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}.drawer-small .title{min-width:150px}.drawer-small .content{padding:20px 0 10px}@media screen and (min-width: 0px) and (max-width: 359px){.drawer{min-width:360px!important;max-width:360px!important}.drawer .title{min-width:150px}}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #e0e2e5;--ars-color-text-low: #191c1b;--ars-color-divider: #757d87;--ars-drawer-background-color: #323534;--ars-drawer-background-color-low: #424444;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.expired,.unread{color:var(--ars-error, #ff5449)!important}.expiring{color:var(--ars-warning, #FFC107)!important}.error-bg,.expired-bg,.unread-bg{background-color:var(--ars-error, #ff5449)}.expiring-bg{background-color:var(--ars-warning, #FFC107)}.popular-bg{background-color:#388e3c}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-accent, #7894ae);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .spaced,.items-footer{padding-top:10px}.item{border-radius:12px;padding:10px 0;min-height:60px!important;margin-bottom:2px}.item .item-content .info-1{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent, #7894ae)}.item .item-content .info-2{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent-low, #456179)}.item .item-content .title{font-size:small}.item .item-content .details{margin-top:4px;font-size:x-small;font-weight:700;color:var(--ars-accent-low, #456179);text-transform:uppercase;border-left:4px solid var(--ars-accent-low, #456179);padding-left:10px}.item .item-content .details .links{text-transform:none;text-decoration:none}.item .item-content .details .links a,.item .item-content .details .links span,.item .item-content .details .links div{margin-right:8px;font-weight:600;color:var(--ars-color-text, #191c1b)}.item .item-content .details .links a{cursor:pointer!important;color:var(--ars-link, #03A9F4);font-weight:600}.item .item-content a.link{color:var(--ars-link, #03A9F4);cursor:pointer!important}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer;padding:10px 13px;margin-bottom:2px}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--ars-error, #ff5449);margin:0 8px}.tile .image{height:180px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .image .img{object-fit:cover;width:100%;height:100%}.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-accent, #7894ae);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .check{position:absolute;left:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .image .check-selected{background-color:var(--ars-primary-hi, #12c0ae)}.tile .image .read{position:absolute;right:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .badge,.tile .badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:700;text-align:center;background-color:var(--ars-accent, #7894ae);text-transform:uppercase;white-space:nowrap;color:var(--ars-color-text-low, #e0e2e5)}.tile .badge-red{background-color:var(--ars-error, #ff5449);color:var(--ars-color-text-low, #e0e2e5)}.tile .date{padding:8px 0 6px;font-weight:700;text-transform:uppercase}.tile .date .date-day{color:var(--ars-accent, #7894ae)}.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .time{font-size:small;font-weight:700}.tile .title{text-decoration:none;font-size:small;min-height:72px;overflow:hidden}.busy-backdrop{background-color:#00000052!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .next{margin-left:8px}.special-date,.special-date-expired{border:2px var(--ars-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-error, #ff5449) solid!important}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i1.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i5.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i6.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i6.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.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: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i11.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i11.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i11.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i11.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["parent", "selectionSource", "useSelections", "item", "isReference", "isReadable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i13.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i13.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", outputs: ["changed"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ClipperSearchResultItemComponent, selector: "clipper-search-result-item", inputs: ["parent", "item"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i14.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1170
722
|
}
|
|
1171
723
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperBrowserDialogComponent, decorators: [{
|
|
1172
724
|
type: Component,
|
|
1173
725
|
args: [{ host: { 'Bind': SystemUtils.generateUUID() }, providers: [
|
|
1174
726
|
MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER
|
|
1175
|
-
], standalone: true, imports: [
|
|
727
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
1176
728
|
FlexModule,
|
|
1177
729
|
MatTooltipModule,
|
|
1178
730
|
MatButtonModule,
|
|
@@ -1188,32 +740,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
|
|
|
1188
740
|
MatDividerModule,
|
|
1189
741
|
ClipperDocumentMenuComponent,
|
|
1190
742
|
MatDialogContent,
|
|
1191
|
-
NgStyle,
|
|
1192
743
|
MatSidenavModule,
|
|
1193
744
|
MatProgressBarModule,
|
|
1194
745
|
ClipperSearchFacetsComponent,
|
|
1195
746
|
NgClass,
|
|
1196
747
|
ClipperSearchResultItemComponent,
|
|
1197
|
-
MatPaginatorModule
|
|
1198
|
-
ClipperLast15DaysComponent,
|
|
1199
|
-
], template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b> \r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? ' ' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, item)) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"] }]
|
|
1200
|
-
}], ctorParameters: () => [{ type: i1.ApplicationDialogService }, { type: i2.ClipperService }, { type: i3.ScreenService }, { type: i3.BroadcastService }, { type: i4.MatDialogRef }, { type: i5.MediaObserver }, { type: undefined, decorators: [{
|
|
1201
|
-
type: Inject,
|
|
1202
|
-
args: [MAT_DIALOG_DATA]
|
|
1203
|
-
}] }], propDecorators: { facetsSidenav: [{
|
|
1204
|
-
type: ViewChild,
|
|
1205
|
-
args: ['facetsSidenav']
|
|
1206
|
-
}], facetsSearch: [{
|
|
1207
|
-
type: ViewChild,
|
|
1208
|
-
args: ['facetsSearch']
|
|
1209
|
-
}], last15Days: [{
|
|
1210
|
-
type: ViewChild,
|
|
1211
|
-
args: ['last15Days']
|
|
1212
|
-
}], paginator: [{
|
|
1213
|
-
type: ViewChild,
|
|
1214
|
-
args: ['paginator']
|
|
1215
|
-
}], contextMenu: [{
|
|
748
|
+
MatPaginatorModule
|
|
749
|
+
], template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (dialogData?.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\" class=\"dialog-close\">\r\n @if (clipperService.bag.length > 0) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Documenti di lavoro\" aria-label=\"'Documenti di lavoro'\"\r\n (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"clipperService.bag.length\"\r\n matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"filterParams.number\" #number=\"ngModel\" name=\"number\" maxlength=\"10\"\r\n (keyup.Enter)=\"fetch(true)\">\r\n @if (filterParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"filterParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"filterParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (filterParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"filterParams.text\" maxlength=\"200\"\r\n (keyup.Enter)=\"search()\" autofocus />\r\n @if (filterParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <button type=\"button\" mat-icon-button (click)=\"search()\" [attr.aria-label]=\"'Avvia la ricerca'\"\r\n matTooltip=\"Avvia ricerca\" [disabled]=\"!clipperService.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button (click)=\"advancedSearch()\" [attr.aria-label]=\"'Ricerca avanzata'\"\r\n matTooltip=\"Ricerca avanzata\" [disabled]=\"!clipperService.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"small\" style=\"padding-left: 15px;\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n <b>RICERCA ATTIVA</b> \r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? ' ' : ''}} {{si.field}}: <span class=\"accent lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between center\" fxFill style=\"padding-left: 15px;\">\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox (change)=\"$event ? selectAll($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !allSelected()\" [attr.aria-label]=\"'Seleziona/deseleziona tutto'\"\r\n matTooltip=\"Seleziona/deseleziona tutto\" [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (filterParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [useSelections]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"toggleFilterPane()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content id=\"clipper-browser-scrollable\">\r\n <mat-drawer-container>\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"40px\" style=\"margin:0 4px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlexAlign=\"center\" class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" id=\"clipper-references-scroller\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track item; let i = $index) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [ngClass]=\"{'spaced': i > 0}\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"center\">\r\n @if (screenService.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"item-content\">\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [useSelections]=\"canSelect()\" [isReadable]=\"false\"\r\n [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot?.total ?? 0\"\r\n [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #191c1b;--ars-color-text-low: #e0e2e5;--ars-color-divider: #757d87;--ars-drawer-background-color: #eff1ef;--ars-drawer-background-color-low: #e0e3e1;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.wide{min-width:100%!important;max-width:100%;width:100%}.fill{min-width:100%!important;max-width:100%;width:100%;min-height:100%!important;max-height:100%;height:100%}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.smaller{font-size:smaller}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.accent{color:var(--ars-accent)!important}.primary{color:var(--ars-primary)!important}.secondary{color:var(--ars-secondary)!important}.error{color:var(--ars-error)!important}.warning{color:var(--ars-warning)!important}.drawer-content{padding-top:10px}.drawer,.drawer-small{min-width:420px!important;max-width:420px!important;padding:20px 5px 5px;background-color:var(--ars-drawer-background-color)!important}.drawer .title,.drawer-small .title{font-size:1.2em;font-weight:600;padding-left:10px;min-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .fade-in,.drawer-small .fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.drawer .content,.drawer-small .content{padding:10px 0}.drawer .fixed,.drawer-small .fixed{padding:0 4px}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:15px;padding-right:20px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}.drawer-small .title{min-width:150px}.drawer-small .content{padding:20px 0 10px}@media screen and (min-width: 0px) and (max-width: 359px){.drawer{min-width:360px!important;max-width:360px!important}.drawer .title{min-width:150px}}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #e0e2e5;--ars-color-text-low: #191c1b;--ars-color-divider: #757d87;--ars-drawer-background-color: #323534;--ars-drawer-background-color-low: #424444;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.expired,.unread{color:var(--ars-error, #ff5449)!important}.expiring{color:var(--ars-warning, #FFC107)!important}.error-bg,.expired-bg,.unread-bg{background-color:var(--ars-error, #ff5449)}.expiring-bg{background-color:var(--ars-warning, #FFC107)}.popular-bg{background-color:#388e3c}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-accent, #7894ae);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .spaced,.items-footer{padding-top:10px}.item{border-radius:12px;padding:10px 0;min-height:60px!important;margin-bottom:2px}.item .item-content .info-1{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent, #7894ae)}.item .item-content .info-2{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent-low, #456179)}.item .item-content .title{font-size:small}.item .item-content .details{margin-top:4px;font-size:x-small;font-weight:700;color:var(--ars-accent-low, #456179);text-transform:uppercase;border-left:4px solid var(--ars-accent-low, #456179);padding-left:10px}.item .item-content .details .links{text-transform:none;text-decoration:none}.item .item-content .details .links a,.item .item-content .details .links span,.item .item-content .details .links div{margin-right:8px;font-weight:600;color:var(--ars-color-text, #191c1b)}.item .item-content .details .links a{cursor:pointer!important;color:var(--ars-link, #03A9F4);font-weight:600}.item .item-content a.link{color:var(--ars-link, #03A9F4);cursor:pointer!important}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer;padding:10px 13px;margin-bottom:2px}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--ars-error, #ff5449);margin:0 8px}.tile .image{height:180px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .image .img{object-fit:cover;width:100%;height:100%}.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-accent, #7894ae);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .check{position:absolute;left:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .image .check-selected{background-color:var(--ars-primary-hi, #12c0ae)}.tile .image .read{position:absolute;right:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .badge,.tile .badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:700;text-align:center;background-color:var(--ars-accent, #7894ae);text-transform:uppercase;white-space:nowrap;color:var(--ars-color-text-low, #e0e2e5)}.tile .badge-red{background-color:var(--ars-error, #ff5449);color:var(--ars-color-text-low, #e0e2e5)}.tile .date{padding:8px 0 6px;font-weight:700;text-transform:uppercase}.tile .date .date-day{color:var(--ars-accent, #7894ae)}.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .time{font-size:small;font-weight:700}.tile .title{text-decoration:none;font-size:small;min-height:72px;overflow:hidden}.busy-backdrop{background-color:#00000052!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .next{margin-left:8px}.special-date,.special-date-expired{border:2px var(--ars-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-error, #ff5449) solid!important}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"] }]
|
|
750
|
+
}], propDecorators: { filterPane: [{
|
|
1216
751
|
type: ViewChild,
|
|
1217
|
-
args: ['
|
|
752
|
+
args: ['filterPane']
|
|
1218
753
|
}] } });
|
|
1219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQWdCLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBRUwsVUFBVSxFQUVWLGVBQWUsRUFDZixXQUFXLEVBQ1osTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFdBQVcsRUFFWCxlQUFlLEVBQ2Ysa0JBQWtCLEdBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDBCQUEwQixF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LDZCQUE2QjtrQkFsQ3pDLFNBQVM7MkJBQ0EsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGFBR2pDO3dCQUNQLCtDQUErQztxQkFDbEQsY0FDVyxJQUFJLFdBQ1A7d0JBQ0wsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQiw0QkFBNEI7d0JBQzVCLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1QixPQUFPO3dCQUNQLGdDQUFnQzt3QkFDaEMsa0JBQWtCO3dCQUNsQiwwQkFBMEI7cUJBQzdCOzswQkE2Q0EsTUFBTTsyQkFBQyxlQUFlO3lDQXhDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNBLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1csV0FBVztzQkFBM0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZWRpYUNoYW5nZSwgTWVkaWFPYnNlcnZlciB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHtcclxuICBCcm9hZGNhc3RTZXJ2aWNlLFxyXG4gIERhdGVGb3JtYXQsXHJcbiAgU2NyZWVuU2VydmljZSxcclxuICBTZWxlY3RhYmxlTW9kZWwsXHJcbiAgU3lzdGVtVXRpbHNcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaFV0aWxzLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIENsaXBwZXJNZXNzYWdlcyxcclxuICBDbGlwcGVyRGVmaW5pdGlvbnMsXHJcbiAgQ2xpcHBlckRpYWxvZ0RhdGEsXHJcbiAgRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCxcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2Jhc2UvZG9jdW1lbnQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCB9IGZyb20gJy4uL3JlZmVyZW5jZXMvcmVmZXJlbmNlcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWRpYWxvZy9zZWFyY2gtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mcmVlLXRleHQtaGVscC9zZWFyY2gtZnJlZS10ZXh0LWhlbHAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWZyZWUtdGV4dC1xdWVyeS1idWlsZGVyL3NlYXJjaC1mcmVlLXRleHQtcXVlcnktYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRzVXRpbHMgfSBmcm9tICcuLi9kb2N1bWVudC9kb2N1bWVudHMnO1xyXG5pbXBvcnQgeyBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBDbGlwcGVyTGFzdDE1RGF5c0NvbXBvbmVudCB9IGZyb20gJy4uL2xhc3QtMTUtZGF5cy9sYXN0LTE1LWRheXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaFJlc3VsdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtcmVzdWx0LWl0ZW0vc2VhcmNoLXJlc3VsdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBFeHRlbmRlZE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9leHRlbmRlZCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgICBOZ1N0eWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXgnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUlxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgRmxleE1vZHVsZSxcclxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLCAgICAgIFxyXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgICAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICAgICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXHJcbiAgICAgICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgICAgICBDbGlwcGVyRG9jdW1lbnRNZW51Q29tcG9uZW50LFxyXG4gICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgICAgICAgTmdTdHlsZSxcclxuICAgICAgICBNYXRTaWRlbmF2TW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBDbGlwcGVyU2VhcmNoUmVzdWx0SXRlbUNvbXBvbmVudCxcclxuICAgICAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQsXHJcbiAgICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xpcHBlckJyb3dzZXJEaWFsb2dDb21wb25lbnRcclxuICBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdjogTWF0U2lkZW5hdjtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTZWFyY2gnKSBmYWNldHNTZWFyY2g6IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnRcclxuICBAVmlld0NoaWxkKCdsYXN0MTVEYXlzJykgbGFzdDE1RGF5czogQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yJykgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51VHJpZ2dlcicpIGNvbnRleHRNZW51ITogTWF0TWVudVRyaWdnZXI7XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZGlhbG9nVGFiOiBudW1iZXIgPSAxO1xyXG4gIGRhdGE6IENsaXBwZXJEaWFsb2dEYXRhID0ge307XHJcbiAgdGl0bGU6IHN0cmluZyA9ICdSaWNlcmNhIGluIENsaXBwZXInO1xyXG4gIHRyYWNrYWJsZUlkID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4geyBpbmRleCA+PSAwID8gaXRlbS5pZCA6IDAgfVxyXG4gIHNlbGVjdGlvbjogU2VsZWN0YWJsZU1vZGVsPGFueSwgc3RyaW5nPiA9IG5ldyBTZWxlY3RhYmxlTW9kZWwodHJ1ZSwgJ2RvY3VtZW50SWQnKTtcclxuICBzbmFwc2hvdDogRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCA9IHtcclxuICAgIHNlYXJjaEluZm86IG51bGwsXHJcbiAgICBzZWFyY2hQYXJhbXM6IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IG51bGwsXHJcbiAgICAgIGZpcnN0OiAwLFxyXG4gICAgICBjb3VudDogMjVcclxuICAgIH0sXHJcbiAgfTtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudE1vZGVsOiBzdHJpbmcgPSAnVHV0dG8nO1xyXG4gIGN1cnJlbnRTb3J0OiBzdHJpbmcgPSAnUmlsZXZhbnphJztcclxuICBjb250ZW50SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gIGNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6ICcwcHgnLCB5OiAnMHB4JyB9O1xyXG4gIG1xOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW06IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljICRkaWFsb2c6IEFwcGxpY2F0aW9uRGlhbG9nU2VydmljZSwgICAgXHJcbiAgICBwdWJsaWMgJGNsaXBwZXI6IENsaXBwZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljICRzY3JlZW46IFNjcmVlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlICRicm9hZGNhc3Q6IEJyb2FkY2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJCcm93c2VyRGlhbG9nQ29tcG9uZW50PixcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgX2RhdGE6IENsaXBwZXJEaWFsb2dEYXRhXHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gU3RvcmUgZGlhbG9nIGRhdGFcclxuICAgIHRoaXMuZGF0YSA9IF9kYXRhID8/IHt9O1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIuc25hcHNob3Q7XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QpXHJcbiAgICAgIHRoaXMuc25hcHNob3QgPSB7XHJcbiAgICAgICAgc2VhcmNoSW5mbzogbnVsbCxcclxuICAgICAgICBzZWFyY2hQYXJhbXM6IG51bGwsXHJcbiAgICAgIH07XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2R1bGU6IENsaXBwZXJEZWZpbml0aW9ucy5NT0RfU0VNQU5USUNfU0VBUkNILFxyXG4gICAgICAgIG1vZGVsOiBudWxsLFxyXG4gICAgICAgIGZpcnN0OiAwLFxyXG4gICAgICAgIGNvdW50OiAyNSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHNuYXBzaG90XHJcbiAgICAgICRjbGlwcGVyLnNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgaW5pdGlhbCBtb2RlbFxyXG4gICAgdGhpcy5jaGFuZ2VNb2RlbChfZGF0YT8uaW5pdGlhbE1vZGVsLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy4kY2xpcHBlci52aXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LmdldE1lc3NhZ2UoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRF9JTk5FUikge1xyXG4gICAgICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRCwgbWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIG1lZGlhIHF1ZXJ5IGNoYW5nZXNcclxuICAgIHRoaXMubWVkaWFcclxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9fZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjaGFuZ2VzOiBNZWRpYUNoYW5nZVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tcSA9IGNoYW5nZXNbMF0ubXFBbGlhcztcclxuICAgICAgICB0aGlzLnVwZGF0ZUZhY2V0c1Zpc2liaWxpdHkodGhpcy5tcSk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZXRcclxuICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoKSB7XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGU7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRJbnRlcnZhbCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3I7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC50eXBlIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRUeXBlKVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2guYXV0aG9yIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRBdXRob3IpXHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yID0gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc3RvcmVGcm9tU25hcHNob3QodGhpcy5zbmFwc2hvdC5mYWNldHMpO1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cy5oYXNGYWNldHMpIHRoaXMuZmFjZXRzT3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9fZCQubmV4dCgpO1xyXG4gICAgdGhpcy5fX2QkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi54ID0gZXZlbnQuY2xpZW50WCArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51UG9zaXRpb24ueSA9IGV2ZW50LmNsaWVudFkgKyAncHgnO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5tZW51RGF0YSA9IHsgaXRlbTogaXRlbSB9O1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5vcGVuTWVudSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNpZGVuYXYgdmlzaWJpbGl0eVxyXG4gICAqIEBwYXJhbSBtcSA6IHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5XHJcbiAgICovXHJcbiAgdXBkYXRlRmFjZXRzVmlzaWJpbGl0eShtcTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgaWYgKCFtcSkgbXEgPSB0aGlzLiRzY3JlZW4ubXE7XHJcbiAgICBpZiAobXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0c1xyXG4gICAqL1xyXG4gIGdldEZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuZmFjZXRzU2VhcmNoKSByZXR1cm47XHJcbiAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuJGNsaXBwZXIucXVlcnlGYWNldHMoc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIHIudmFsdWUuaW50ZXJ2YWwpO1xyXG4gICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgICB0aGlzLmZhY2V0c09wZW4oKTtcclxuICAgICAgICBlbHNlIHRoaXMuZmFjZXRzQ2xvc2UoKTtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc25hcHNob3QuZmFjZXRzID0gdGhpcy5mYWNldHNTZWFyY2guc2F2ZVNuYXBzaG90KCk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBzZWxlY3RlZCBpZHNcclxuICAgKi9cclxuICBnZXRTZWxldGVjdElkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxMDApIHtcclxuICAgICAgdGhpcy4kZGlhbG9nLmVycm9yKCdMYSBzZWxlemlvbmUgbm9uIHB1w7IgY29udGVuZXJlIHBpw7kgZGkgMTAwIGVsZW1lbnRpLicpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBpZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgICAgaWRzLnB1c2gobi5kb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBhcmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuc25hcHNob3QuaXRlbXMubGVuZ3RoXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzdGVyIHNlbGVjdGlvbiB0b2dnbGVcclxuICAgKiBAcGFybWEgYXJnczogZXZlbnQgaW5mb1xyXG4gICAqL1xyXG4gIG1hc3RlclNlbGVjdGlvblRvZ2dsZShhcmdzOiBhbnkpIHtcclxuICAgIGlmIChhcmdzLmNoZWNrZWQpXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdywgcm93LmRvY3VtZW50SWQpXHJcbiAgICAgICk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93LCByb3cuZG9jdW1lbnRJZClcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBkb2N1bWVudHMgY2FuIGJlIHNlbGVjdGVkIGFuZCByZXR1cm5lZCBhcyBtZXNzYWdlXHJcbiAgICovXHJcbiAgY2FuU2VsZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ID1cclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgKCh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMSAmJlxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMiAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMyAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSk7XHJcbiAgICBpZiAoYWxsb3cgJiYgdGhpcy5kYXRhLnNlbGVjdGFibGVNb2RlbHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0YWJsZU1vZGVscy5pbmRleE9mKG4ubW9kZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbG93O1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBtZXNzYWdlIHdpdGggY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlIGRpYWxvZ1xyXG4gICAqL1xyXG4gIHNlbGVjdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLiRicm9hZGNhc3Quc2VuZE1lc3NhZ2UoXHJcbiAgICAgICAgQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVELFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZGlhbG9nXHJcbiAgICogQHBhcmFtIG5ld1JvdXRlOiB0aGUgbmV3IHJvdXRlIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgY2xvc2UobmV3Um91dGU6IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG5ld1JvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VhcmNoX2NvbnRhaW5lcicpLnNjcm9sbFRvKDAsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIG1lbnUgYnV0dG9ucyB2aXNpYmlsaXR5IHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkXHJcbiAgICovXHJcbiAgdXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgbi5pc01lbnVPcGVuID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBzb3J0XHJcbiAgICovXHJcbiAgdXBkYXRlU29ydE9wdGlvbnMoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9EQVRFX0FTQzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0ID0gJ0RhdGEgY3JlLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9QT1BVTEFSSVRZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUG9wb2xhcml0w6AnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUmlsZXZhbnphJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX09SSUdJTkFMOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBpbnMuIGRlY3IuJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1RBWE9OT01ZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnQXJnb21lbnRvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9ERVNDO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBkZWNyLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdmlld1xyXG4gICAqL1xyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICAvLyBVcGRhdGUgcm91dGVyIGhlaWdodFxyXG4gICAgbGV0IGEgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICBsZXQgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGlwcGVyLWJyb3dzZXItZml4ZWQnKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghYSB8fCAhYiB8fCBhID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgbGV0IGhiID0gYi5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmIChoYiA9PT0gMCkgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIHRoaXMuY29udGVudEhlaWdodCA9IGEgLSBoYjtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VycmVudCBzZWFyY2ggaW5mb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoSW5mbygpIHtcclxuICAgIGxldCBzaSA9IFtdO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICkge1xyXG4gICAgICBsZXQgcyA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JTLFxyXG4gICAgICAgICdpZCcsXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3JcclxuICAgICAgKTtcclxuICAgICAgaWYgKHMpIHtcclxuICAgICAgICBzaS5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkOiAnc2V0dG9yZScsXHJcbiAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzID0gU3lzdGVtVXRpbHMuYXJyYXlGaW5kQnlLZXkoXHJcbiAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuTU9ERUxTLFxyXG4gICAgICAgICAgJ2lkJyxcclxuICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvclxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHMpIHtcclxuICAgICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NlemlvbmUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3IpXHJcbiAgICApIHtcclxuICAgICAgbGV0IGEgPSBTeXN0ZW1VdGlscy5hcnJheUZpbmRCeUtleShcclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU0VDVE9SX0FVVEhPUlMsXHJcbiAgICAgICAgJ2F1dGhvcklkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3JcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmF1dGhvclxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYSkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICdhdXRvcmUnLFxyXG4gICAgICAgICAgdmFsdWU6IGEuYXV0aG9yRGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYylcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhcmdvbWVudG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215KVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2FyZ29tZW50bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215Tm9kZSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlcilcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdudW1lcm8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5udW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiZcclxuICAgICAgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJlxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZDEgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlO1xyXG4gICAgICBjb25zdCBkMiA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAhZDIgPyAnaW4gZGF0YScgOiAnZGEgZGF0YScsXHJcbiAgICAgICAgdmFsdWU6IFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZDEpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiYgXHJcbiAgICAgICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZCA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYSBkYXRhJyxcclxuICAgICAgICB2YWx1ZTogU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShkKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3QuaW50ZXJ2YWwpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnaW50ZXJ2YWxsbycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3QuaW50ZXJ2YWwsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2UpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNPVVJDRVMsXHJcbiAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VcclxuICAgICAgICApLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlTnVtYmVyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ251bS4gZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VOdW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlRnJvbURhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGUgJiZcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8pXHJcbiAgICApIHtcclxuICAgICAgbGV0IGQxID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VGcm9tRGF0ZTtcclxuICAgICAgY29uc3QgZDIgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlVG9EYXRlO1xyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogIWQyID8gJ2luIGRhdGEgZm9udGUnIDogJ2RhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQxKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VUb0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvdXJjZVRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0ZXN0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZSB8fFxyXG4gICAgICAodGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudHlwZSlcclxuICAgICkge1xyXG4gICAgICBsZXQgdCA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JfVFlQRVMsXHJcbiAgICAgICAgJ2RvY3VtZW50VHlwZUlkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50eXBlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnR5cGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodCkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICd0aXBvJyxcclxuICAgICAgICAgIHZhbHVlOiB0LmRvY3VtZW50VHlwZURlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2hvd1VucmVhZERvY3VtZW50c09ubHkpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnc3RhdG8nLFxyXG4gICAgICAgIHZhbHVlOiAnbm9uIGxldHRpJyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZWFzb24gfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbilcclxuICAgIClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0aXBvIG1vZC4nLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkNIQU5HRV9SRUFTT05TLFxyXG4gICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMucmVhc29uXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWROdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZE51bWJlcixcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2F0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJOdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyTnVtYmVyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2FudGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclllYXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyVGl0bGUsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaEluZm8gPSBzaTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBDaGFuZ2Ugc2VhcmNoIG1vZGVsXHJcbiAqIEBwYXJhbSBtb2RlbCA6IHRoZSBuZXcgZG9jdW1lbnQgbW9kZWwgXHJcbiAqIEBwYXJhbSBmZXRjaCA6IHRydWUgaWYgZGF0YSBtdXN0IGJlIGZldGNoZWQuIERlZmF1bHQgaXMgdHJ1ZVxyXG4gKi9cclxuICBjaGFuZ2VNb2RlbChtb2RlbDogbnVtYmVyID0gbnVsbCwgZmV0Y2g6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9IG1vZGVsO1xyXG4gICAgc3dpdGNoIChtb2RlbCkge1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9BR0dJT1JOQU1FTlRPX05PUk1BVElWTzogdGhpcy5jdXJyZW50TW9kZWwgPSBcIkdhenpldHRlIGUgYm9sbGV0dGluaVwiOyBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEU6IHRoaXMuY3VycmVudE1vZGVsID0gXCJOb3JtYXRpdmEgdmlnZW50ZVwiOyBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbCA9IFwiVHV0dG9cIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChmZXRjaClcclxuICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGEgc29ydFxyXG4gICAqIEBwYXJhbSBtb2RlIDogdGhlIHNvcnQgbW9kZVxyXG4gICAqL1xyXG4gIHNvcnRCeShtb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID0gbW9kZTtcclxuICAgIHRoaXMudXBkYXRlU29ydE9wdGlvbnMoKTtcclxuICAgIHRoaXMuZmV0Y2goZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhIHNlYXJjaCB1c2luZyBjdXJyZW50IHBhcmFtc1xyXG4gICAqL1xyXG4gIGZldGNoKG5ld1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQgPSAyNTtcclxuICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSAwO1xyXG4gICAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFO1xyXG4gICAgICBlbHNlIGlmICghdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUpXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgdGhpcy51cGRhdGVTb3J0T3B0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEsIDIpO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAxMSwgMzEsIDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gU2VhcmNoVXRpbHMubm9ybWFsaXplVGV4dFF1ZXJ5KHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4kY2xpcHBlci5xdWVyeSh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgPSByLnZhbHVlPy50b3RhbCA/PyAwO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gci52YWx1ZT8uaXRlbXMgPz8gW107XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuaW50ZXJ2YWwgPSByLnZhbHVlPy5pbnRlcnZhbDtcclxuICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mVG9kYXkoKTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVllYXIgPVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID09PVxyXG4gICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9BU0MgfHxcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVJlbGV2YW5jZSA9XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPT09XHJcbiAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9SRUxFVkFOQ0U7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnlQb3B1bGFyaXR5ID1cclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1BPUFVMQVJJVFk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQSB8fFxyXG4gICAgICAgICAgICAgICAgbi5tb2RlbCA9PT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NFR05BTEFaSU9ORVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChuLm1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2NhZGVuemEnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkU6XHJcbiAgICAgICAgICAgICAgICAgICAgbi5vcmlnaW5EZXNjcmlwdGlvbiA9ICdTZWduYWxhemlvbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG4uZXhwaXJpbmdJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cyA9IG4uZXhwaXJpbmdJbmZvLnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIG4uZGVzY3JpcHRpb24gPSBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBzdWJEYXlzKG4uZGF0ZSwgMTUpO1xyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChncm91cEJ5WWVhcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHllYXIgPSBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKG4uZGF0ZSwgRGF0ZUZvcm1hdC5Mb25nTW9udGhBbmRZZWFyKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9PSB5ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9IHllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChncm91cEJ5UmVsZXZhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICAgICAgICBuLmdyb3VwID1cclxuICAgICAgICAgICAgICAgICAgICAnRWxlbmNvIHBlciByaWxldmFuemE6IGdsaSBlbGVtZW50aSBwacO5IGltcG9ydGFudGkgc29ubyBpbiB0ZXN0YSc7XHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBCeVBvcHVsYXJpdHkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91cCAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPVxyXG4gICAgICAgICAgICAgICAgICAgICdFbGVuY28gcGVyIHBvcG9sYXJpdMOgOiBnbGkgZWxlbWVudGkgcGnDuSBpbXBvcnRhbnRpIHNvbm8gaW4gdGVzdGEnO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKG4udGF4b25vbXkpIHtcclxuICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2RlcyA9IG4udGF4b25vbXkuc3BsaXQoJ1xcclxcbicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0dVSURBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREFfTk9STUFUSVZBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NIRURBX0FERU1QSU1FTlRJXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLnRheG9ub215Tm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG4udGF4b25vbXlOb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IG5vZGUuaW5kZXhPZignPicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwICE9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2Rlc1tpXSA9IG5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhwICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcPi9naSwgJyA+ICcpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNob3cgdG9hc3QgaWYgbmV3IHNlYXJjaFxyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNUb29NYW55UmVzdWx0cyA9IHRoaXMuc25hcHNob3QudG90YWwgPj0gMTAwMDtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoICYmIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0ID0gdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvIHBpw7kgZGkgMTAwMCBlbGVtZW50aScsXHJcbiAgICAgICAgICAgICAgICAgICAgMzAwMCxcclxuICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ1JpZmluaXNjaSdcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdC5pbnN0YW5jZS5hY3Rpb24uc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgK1xyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnNuYXBzaG90LnRvdGFsID09PSAxID8gJyBlbGVtZW50bycgOiAnIGVsZW1lbnRpJylcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChuZXdTZWFyY2ggJiYgIXRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmFjZXRzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldEZhY2V0cyh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgc25hcHNob3RcclxuICAgICAgICAgICAgdGhpcy4kY2xpcHBlci5zbmFwc2hvdCA9IHRoaXMuc25hcHNob3Q7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdmlld1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy5jbGVhckJ1c3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5ldyBwYWdlIHJlc3VsdFxyXG4gICAqIEBwYXJhbSBlIDogdGhlIE1hdFBhZ2luYXRvciBQYWdlRXZlbnQgZGF0YVxyXG4gICAqL1xyXG4gIGZldGNoTW9yZShlOiBhbnkpIHtcclxuICAgIGxldCBmaXJzdCA9IGUucGFnZUluZGV4ICogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5mZXRjaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VhcmNoXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IENsaXBwZXJEZWZpbml0aW9ucy5ETV9OT1JNQVRJVkFfVklHRU5URSxcclxuICAgICAgZmlyc3Q6IDAsXHJcbiAgICAgIGNvdW50OiAyNSxcclxuICAgIH07XHJcbiAgICB0aGlzLmN1cnJlbnRNb2RlbCA9ICdOb3JtYXRpdmEgdmlnZW50ZSc7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMuc25hcHNob3QudG90YWwgPSAwO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSBudWxsO1xyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgdGhpcy51cGRhdGVTZWFyY2hJbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIGFuIGl0ZW1cclxuICAgKiBAcGFyYW0gZG9jdW1lbnRJZCA6IHRoZSBkb2N1bWVudCBpZFxyXG4gICAqIEBwYXJhbSBuZXdXaW5kb3c6IHRydWUgaWYgdGhlIGRvY3VtZW50IG11c3QgYmUgb3BlbiBpbnRvIGEgbmV3IHdpbmRvd1xyXG4gICAqL1xyXG4gIG9wZW4oZG9jdW1lbnRJZDogc3RyaW5nLCBuZXdXaW5kb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCFuZXdXaW5kb3cpIHRoaXMub3BlbkRvY3VtZW50KGRvY3VtZW50SWQpO1xyXG4gICAgZWxzZSB3aW5kb3cub3BlbignL2RvY3VtZW50by8nICsgZG9jdW1lbnRJZCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBhIGRvY3VtZW50XHJcbiAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBwcml2YXRlIG9wZW5Eb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZG9jdW1lbnRJZCkgcmV0dXJuO1xyXG4gICAgQ2xpcHBlckRvY3VtZW50c1V0aWxzLm9wZW5Eb2N1bWVudChcclxuICAgICAgdGhpcy4kZGlhbG9nLFxyXG4gICAgICB0aGlzLiRjbGlwcGVyLFxyXG4gICAgICBkb2N1bWVudElkLFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0LFxyXG4gICAgICB0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBvc2UgYSBmcmVlIHRleHQgc2VhcmNoIHF1ZXJ5XHJcbiAgICovXHJcbiAgY29tcG9zZVNlYXJjaCgpIHtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ2Nvc3RydWlzY2kgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuY29tcG9uZW50SW5zdGFuY2UuZG9uZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gci5xdWVyeTtcclxuXHJcbiAgICAgICAgLy8gRmluaXNoZWRcclxuICAgICAgICBkLmNsb3NlKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGl0ZW0gc3RhdGUgY3NzIGNsYXNzXHJcbiAgICogQHBhcmFtIGl0ZW0gOiB0aGUgaXRlbSB0byBldmFsdWF0ZVxyXG4gICAqL1xyXG4gIGdldEl0ZW1TdGF0ZUNzc0NsYXNzKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ2l0ZW0tZXhwaXJlZC1pbmQnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdpdGVtLXBvcHVsYXItaW5kJztcclxuICAgIGVsc2UgaWYgKGl0ZW0ucG9wdWxhcml0eSA+IDMpIHJldHVybiAnaXRlbS12ZXJ5LXBvcHVsYXItaW5kJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBpdGVtIHN0YXRlIHRvb2x0aXAgdGV4dFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gZXZhbHVhdGVcclxuICAgKi9cclxuICBnZXRJdGVtU3RhdGVUb29sdGlwKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ05vbiBwacO5IHZpZ2VudGUnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdEb2N1bWVudG8gY29uIG51bWVybyBkaSBjaXRhemlvbmkgYWx0byc7XHJcbiAgICBlbHNlIGlmIChpdGVtLnBvcHVsYXJpdHkgPiAzKVxyXG4gICAgICByZXR1cm4gJ0RvY3VtZW50byBjb24gbnVtZXJvIGRpIGNpdGF6aW9uaSBtb2x0byBhbHRvJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBpdGVtIGxpbmsgb3IgYWxsIHNlbGVjdGVkIG9uZXMgYnkgZW1haWxcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBvcHRpb25hbCBpdGVtXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnJvd3NlIGRvY3VtZW50IHJlZmVyZW5jZXNcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCBpdGVtXHJcbiAgICogQHBhcmFtIG1vZGUgOiB0aGUgbW9kZVxyXG4gICAqL1xyXG4gIHJlZmVyZW5jZXMoaXRlbTogYW55LCBtb2RlOiBudW1iZXIgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19JTikge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47XHJcbiAgICBsZXQgZCA9IHRoaXMuJGRpYWxvZy5vcGVuKENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpZmVyaW1lbnRpIGxlZ2F0aSBhbCBkb2N1bWVudG8nLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBjbG9zZU9uTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHsgaWQ6IGl0ZW0uZG9jdW1lbnRJZCwgbW9kZTogbW9kZSB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAncmVmZXJlbmNlcy1jb250YWluZXInLFxyXG4gICAgICBtaW5XaWR0aDogJzM3NXB4JyxcclxuICAgICAgbWF4V2lkdGg6ICcxMDAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICAgIGhlaWdodDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAociAmJiByLmlkKSB0aGlzLm9wZW4oci5pZCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheSBhIGRvY3VtZW50IHJlcG9ydFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGRvY3VtZW50XHJcbiAgICovXHJcbiAgcmVwb3J0KGl0ZW06IGFueSkge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47IGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgaWYgKGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX05PUk1BVElWQV9WSUdFTlRFICYmIGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBKSB7XHJcbiAgICAgIHRoaXMuJGRpYWxvZy5pbmZvKFwiUXVlc3RhIGZ1bnppb25hbGl0w6Agbm9uIMOoIGRpc3BvbmliaWxlIHBlciBxdWVzdG8gdGlwbyBkaSBkb2N1bWVudG8uXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IHRoaXMub3BlblJlcG9ydChpdGVtLmRvY3VtZW50SWQsIGl0ZW0udGl0bGUxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQZXJmb3JtIHNlYXJjaFxyXG4gKi9cclxuICBzZWFyY2goKSB7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID09PSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IpXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgLy8gUmVzZXQgcGFnaW5hdG9yXHJcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuXHJcbiAgICAvLyBEbyBzZWFyY2hcclxuICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFkdmFuY2VkIHNlYXJjaFxyXG4gICAqL1xyXG4gIGFkdmFuY2VkU2VhcmNoKCkge1xyXG4gICAgbGV0IGQgPSB0aGlzLiRkaWFsb2cub3BlbihDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpY2VyY2EgYXZhbnphdGEnLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcGFyYW1zOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyxcclxuICAgICAgICBlbmFibGVSZWFkOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTZWN0b3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVHlwZTogdHJ1ZSxcclxuICAgICAgICBlbmFibGVBdXRob3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVG9waWM6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVGV4dDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVEb2N1bWVudDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVTb3VyY2U6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzcwMHB4JyxcclxuICAgICAgd2lkdGg6ICc5OSUnLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRvbmVcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHNlYXJjaCBwYXJhbXNcclxuICAgICAgICByLm1vZGVsID0gdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWw7XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPSByO1xyXG4gICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID0gMDtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudCA9IDI1O1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPT09IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHBhZ2luYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIC8vIERvIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIEZpbmlzaGVkXHJcbiAgICAgICAgZC5jbG9zZSgpO1xyXG5cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogU2hvdyBmcmVlIHRleHQgaGVscFxyXG4gKi9cclxuICBoZWxwU2VhcmNoKCkge1xyXG4gICAgdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCwge1xyXG4gICAgICBhcmlhTGFiZWw6ICdpbmZvcm1hemlvbmkgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnODAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYW5hZ2UgY2xpcHBlciBiYWdcclxuICAgKi9cclxuICBtYW5hZ2VCYWcoKSB7XHJcbiAgICBsZXQgaXRlbXM6IGFueSA9IFtdO1xyXG4gICAgdGhpcy4kY2xpcHBlci5iYWcuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgIGxldCB0aXRsZSA9IG4uVGl0bGUxID8gbi5UaXRsZTEgOiBuLlRpdGxlMjtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgdGVtcGxhdGU6IHRpdGxlLFxyXG4gICAgICAgIGJhZzogbixcclxuICAgICAgICBzZWFyY2hCYWc6IHsgbmFtZTogdGl0bGUgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLnNlbGVjdCh7XHJcbiAgICAgIHRpdGxlOiAnR2VzdGlzY2kgZG9jdW1lbnRpIGRpIGxhdm9ybycsXHJcbiAgICAgIG11bHRpOiBmYWxzZSxcclxuICAgICAgbXVzdFNlbGVjdDogZmFsc2UsXHJcbiAgICAgIG9rQ2FwdGlvbjogJ1NFTEVaSU9OQScsXHJcbiAgICAgIGl0ZW1zOiBpdGVtcyxcclxuICAgICAgY2FuRGVsZXRlOiB0cnVlLFxyXG4gICAgICBjYW5WaWV3OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLnZpZXdcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSByLmJhZztcclxuICAgICAgICB0aGlzLm9wZW4oaXRlbS5Eb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRlbGV0ZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB2YXIgaXRlbSA9IHIuc2VsZWN0ZWRJdGVtc1swXS5iYWc7XHJcbiAgICAgICAgdGhpcy4kY2xpcHBlci5yZW1vdmVGcm9tQmFnKGl0ZW0uRG9jdW1lbnRJZCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy50b2FzdCgnT3BlcmF6aW9uZSBjb21wbGV0YXRhIGNvbiBzdWNjZXNzby4nKTtcclxuICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgci5pdGVtcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICBpZiAoci5pdGVtc1twXS5iYWcuRG9jdW1lbnRJZCA9PT0gaXRlbS5Eb2N1bWVudElkKSB7XHJcbiAgICAgICAgICAgICAgci5pdGVtcy5zcGxpY2UocCwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHIuaXRlbXMubGVuZ3RoID09PSAwKSBkLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgaG9tZSB0YWJcclxuICAgKi9cclxuICBzaG93SG9tZSgpIHtcclxuICAgIHRoaXMuZGlhbG9nVGFiID0gMjtcclxuICAgIGlmICh0aGlzLiRjbGlwcGVyLmxvZ2dlZEluICYmICF0aGlzLmxhc3QxNURheXMuZGF5c0xvYWRlZCkgdGhpcy5sYXN0MTVEYXlzLmZldGNoKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgb3IgY29sbGFwc2UgaG9tZSBkYXlzIHZpZXdcclxuICAgKiBAcGFyYW0gY29sbGFwc2VcclxuICAgKi9cclxuICBleHBhbmRIb21lKGNvbGxhcHNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIHRoaXMubGFzdDE1RGF5cy5leHBhbmQoY29sbGFwc2UpXHJcbiAgfVxyXG4gIFxyXG4gIC8vXHJcbiAgLy8gUmVnaXN0cm8gZSBzY2FkZW56YXJpb1xyXG4gIC8vXHJcblxyXG4gIC8qKlxyXG4gKiBDaGVja3MgaWYgYWxsIGRvY3VtZW50cyBhcmUgc3VwcG9ydGVkIGJ5IFJTXHJcbiAqIEBwYXJhbSBkb2N1bWVudHMgOiB0aGUgbGlzdCBvZiBkb2N1bWVuc1xyXG4gKiBAcmV0dXJuczogdHJ1ZSBpZiBhbGwgZG9jdW1lbnRzIHN1cHBvcnRzIFJTXHJcbiAqL1xyXG4gIFJTX2VuYWJsZWQoZG9jdW1lbnRzOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghZG9jdW1lbnRzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgYWxsb3cgPSBmYWxzZTtcclxuICAgIGRvY3VtZW50cy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgYWxsb3cgPSBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEUgfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8gfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkE7XHJcbiAgICAgIGlmICghYWxsb3cpIHJldHVybjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFsbG93O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmV3IGxhd1xyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0xhdyhkb2N1bWVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgIHRoaXMuJGJyb2FkY2FzdC5zZW5kTWVzc2FnZShDbGlwcGVyTWVzc2FnZXMuSU5URVJPUF9SU19ORVdfTEFXLCBkb2N1bWVudCA/IFtkb2N1bWVudF0gOiB0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5ldyBhY3Rpdml0eVxyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0FjdGl2aXR5KGRvY3VtZW50OiBhbnkpIHtcclxuICAgIGlmICghZG9jdW1lbnQpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA+IDAgfHwgIXRoaXMuJGNsaXBwZXIuc3VwcG9ydHNSUykgcmV0dXJuO1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX05FV19BQ1RJVklUWSwgZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBEb2N1bWVudCB1c2FnZSByZXBvcnRcclxuICAgKiBAcGFyYW0gZG9jdW1lbnQ6IHRoZSBsYXdcclxuICAgKi9cclxuICAgIFJTX3VzYWdlUmVwb3J0KGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX1VTQUdFX1JFUE9SVCwgZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1icm93c2VyLWZpeGVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNsaXBwZXItYnJvd3Nlci1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiIG1hdFRvb2x0aXA9XCJBcHJpIENsaXBwZXIgaW4gdW4gbnVvdm8gdGFiXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICA8aW1nIHNyYz1cIi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9jbGlwcGVyX2xvZ28ucG5nXCIgYWx0PVwiQ2xpcHBlclwiIHN0eWxlPVwibWF4LWhlaWdodDogNTBweDsgcGFkZGluZzogNXB4XCIgLz5cclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKGRhdGEuc2VsZWN0aW9uTW9kZSA+IDApIHtcclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgQGlmIChjYW5TZWxlY3QoKSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3QoKVwiPlxyXG4gICAgICAgICAgICBVc2Egc2VsZXppb25lXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBmeEZsZXg9XCIxNTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICBAaWYgKCRjbGlwcGVyLmJhZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkRvY3VtZW50aSBkaSBsYXZvcm9cIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIidEb2N1bWVudGkgZGkgbGF2b3JvJ1wiIChjbGljayk9XCJtYW5hZ2VCYWcoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbbWF0QmFkZ2VdPVwiJGNsaXBwZXIuYmFnLmxlbmd0aFwiIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIj53b3JrX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQ2hpdWRpXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaGl1ZGlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmF2IG1hdC10YWItbmF2LWJhciBtYXQtc3RyZXRjaC10YWJzIFt0YWJQYW5lbF09XCJ0YWJQYW5lbDFcIj5cclxuICAgIDxhIG1hdC10YWItbGluayAoY2xpY2spPVwiZGlhbG9nVGFiID0gMVwiIFthY3RpdmVdPVwiZGlhbG9nVGFiID09PSAxXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlJpY2VyY2E8L2E+XHJcbiAgICA8YSBtYXQtdGFiLWxpbmsgKGNsaWNrKT1cInNob3dIb21lKClcIiBbYWN0aXZlXT1cImRpYWxvZ1RhYiA9PT0gMlwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgPG1hdC1pY29uPnVwZGF0ZTwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIGZ4SGlkZS54cyBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHhcIj4gVWx0aW1pIDE1IGdpb3JuaTwvc3Bhbj5cclxuICAgIDwvYT5cclxuICA8L25hdj5cclxuICA8bWF0LXRhYi1uYXYtcGFuZWwgI3RhYlBhbmVsMT48L21hdC10YWItbmF2LXBhbmVsPlxyXG4gIDxkaXYgW2hpZGRlbl09XCJkaWFsb2dUYWIgIT09IDFcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4IDAgMTBweCAxNXB4XCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlblwiIGZ4RmlsbD5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleC54cz1cIjYyXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9JzEwcHgnIGZ4RmlsbD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+TnVtZXJvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyXCIgI251bWJlcj1cIm5nTW9kZWxcIiBuYW1lPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggYXJpYS1sYWJlbD1cIkF6emVyYVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlciA9IG51bGw7XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+QW5ubzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhclwiICN5ZWFyPVwibmdNb2RlbFwiIG5hbWU9XCJ5ZWFyXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0XCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCIgLz5cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlB1bGlzY2lcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyID0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmICh5ZWFyLmludmFsaWQpIHtcclxuICAgICAgICAgICAgICA8bWF0LWVycm9yPk5vbiB2YWxpZG8uPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5QYXJvbGUsIGZyYXNpIG8gY29uY2V0dGkuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3NlYXJjaElucHV0PVwibWF0SW5wdXRcIiB0eXBlPVwidGV4dFwiICN0ZXh0IFsobmdNb2RlbCldPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHRcIlxyXG4gICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjAwXCIgKGtleXVwLkVudGVyKT1cInNlYXJjaCgpXCIgYXV0b2ZvY3VzIC8+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJQdWxpc2NpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCA9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiQ29tcG9uaVwiIG1hdFRvb2x0aXA9XCJDb21wb25pXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXh0LmZvY3VzKCk7IGNvbXBvc2VTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmJ1aWxkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiSW5mb3JtYXppb25pXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21lIGVmZmV0dHVhcmUgbGEgcmljZXJjYSBpbiB0ZXN0byBsaWJlcm9cIiAoY2xpY2spPVwidGV4dC5mb2N1cygpOyBoZWxwU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5oZWxwX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXgueHM9XCIzNlwiPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGw+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzZWFyY2goKVwiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXZ2aWEgbGEgcmljZXJjYSdcIiBtYXRUb29sdGlwPVwiQXZ2aWEgcmljZXJjYVwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZFNlYXJjaCgpXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSaWNlcmNhIGF2YW56YXRhJ1wiIG1hdFRvb2x0aXA9XCJSaWNlcmNhIGF2YW56YXRhXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBAaWYgKHNuYXBzaG90LnNlYXJjaEluZm8gJiYgc25hcHNob3Quc2VhcmNoSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICA8ZGl2IGZ4SGlkZS54cyBjbGFzcz1cInNlYXJjaC1pbmZvIHNtYWxsXCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICA8Yj5SSUNFUkNBIEFUVElWQTwvYj4mbmJzcDsmbmJzcDsmbmJzcDtcclxuICAgICAgICAgIEBmb3IgKHNpIG9mIHNuYXBzaG90LnNlYXJjaEluZm87IHRyYWNrIHNpKSB7XHJcbiAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAge3tzaS5zZXAgPyAnJm5ic3A7Jm5ic3A7JyA6ICcnfX0ge3tzaS5maWVsZH19OiA8c3BhblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1wcmltYXJ5IGxvd2VyY2FzZVwiPjxpPnt7c2kudmFsdWV9fTwvaT48L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cInN0YXJ0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkF6emVyYSByaWNlcmNhXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MCAwIDZweCAyMHB4O1wiIGZ4TGF5b3V0PVwicm93IHdyYXAtcmV2ZXJzZVwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiPlxyXG4gICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgIDxkaXYgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZXppb25hL2Rlc2VsZXppb25hIHR1dHRvJ1wiIG1hdFRvb2x0aXA9XCJTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QuaXRlbXMgfHwgc25hcHNob3QuaXRlbXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIk9yZGluYVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3JkaW5hJ1wiXHJcbiAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTb3J0XCIgY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFzbmFwc2hvdC50b3RhbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5PcmRpbmEgcGVyOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gZnhIaWRlLmd0LW1kPnNvcnQ8L21hdC1pY29uPiB7e2N1cnJlbnRTb3J0fX1cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVTb3J0PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDMpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGRlY3Jlc2NlbnRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgRGF0YSBkZWNyZXNjZW50ZVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDIpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGNyZXNjZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIERhdGEgY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDEpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciByaWxldmFuemEnXCI+XHJcbiAgICAgICAgICAgICAgICBSaWxldmFuemFcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzb3J0QnkoNSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcmRpbmEgcGVyIHBvcG9sYXJpdMOgJ1wiPlxyXG4gICAgICAgICAgICAgICAgUG9wb2xhcml0w6BcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8IS0tIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDQpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09yZGluYSBwZXIgZGF0YSBkaSBpbnNlcmltZW50byBkZXNjcmVzY2VudGUnXCI+XHJcbiAgICAgICAgICAgICAgICBEYXRhIGRpIGluc2VyaW1lbnRvIGRlY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+LS0+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG1vZGVsbG8nXCJcclxuICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudU1vZGVsc1wiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5Nb3N0cmE6PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmeEhpZGUuZ3QtbWQ+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPiB7e2N1cnJlbnRNb2RlbH19XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIGljb24tbWVudS1kcm9wLWRvd25cIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVNb2RlbHM9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgyKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01vc3RyYSBhZ2dpb3JuYW1lbnRvIG5vcm1hdGl2bydcIj5cclxuICAgICAgICAgICAgICAgIEdhenpldHRlIGUgYm9sbGV0dGluaVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTW9kZWwoOSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidOb3JtYXRpdmEgdmlnZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIE5vcm1hdGl2YSB2aWdlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInTW9zdHJhIHR1dHRpIGkgZG9jdW1lbnRpJ1wiPlxyXG4gICAgICAgICAgICAgICAgVHV0dG9cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBtYXRUb29sdGlwPVwiQXppb25pIGRhIGVzZWd1aXJlIHN1Z2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3B6aW9uaSBwZXIgZWxlbWVudGkgc2VsZXppb25hdGknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTZWxlY3Rpb25zXCJcclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW21hdEJhZGdlXT1cInNlbGVjdGlvbi5hbGwubGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiPnBsYXlsaXN0X2FkZF9jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgPGNsaXBwZXItZG9jdW1lbnQtbWVudSBbcGFyZW50XT1cInRoaXNcIiBzZWxlY3Rpb25Tb3VyY2U9XCJzZWxlY3Rpb25cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2ggJiYgZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJiBmYWNldHNTaWRlbmF2ICYmICghZmFjZXRzU2lkZW5hdi5vcGVuZWQgfHwgZmFjZXRzQ2xvc2VkKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdFRvb2x0aXA9XCJBZmZpbmEgcmljZXJjYVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiIChjbGljayk9XCJmYWNldHNPcGVuKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5tZW51X29wZW48L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGZvcm0tY29sdW1uXCI+XHJcbiAgICAgIDxwPkVjY28gY29zYSDDqCBzdWNjZXNzbyBuZWdsaSB1bHRpbWkgMTUgZ2lvcm5pIGluIGJhc2UgYWxsYSB0dWEgY29uZmlndXJhemlvbmUuPC9wPlxyXG4gICAgICA8cD5QZXIgbW9kaWZpY2FyZSBsYSB0dWFcclxuICAgICAgICBjb25maWd1cmF6aW9uZSBkZXZpIGFjY2VkZXJlIGEgPGEgY2xhc3M9XCJsaW5rXCIgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiQXByaSBDbGlwcGVyIGluIHVuIG51b3ZvIHRhYlwiIHRhcmdldD1cIl9ibGFua1wiPkNsaXBwZXI8L2E+LjwvcD5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPScxMHB4JyBmeEZpbGw+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJFc3BhbmRpIHR1dHRvXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRXNwYW5kaSB0dXR0byBcXCBjb21wcmltaSB0dXR0bydcIlxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZXhwYW5kSG9tZSgpXCI+XHJcbiAgICAgICAgICAgIEVzcGFuZGkgdHV0dG9cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJDb21wcmltaSB0dXR0b1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvbXByaW1pIHR1dHRvJ1wiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRIb21lKHRydWUpXCI+XHJcbiAgICAgICAgICAgIENvbXByaW1pIHR1dHRvXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IHN0eWxlPVwicGFkZGluZzowIDAgMCAxNXB4XCIgW25nU3R5bGVdPVwieydtaW4taGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAxXCI+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGFpbmVyIFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICAgICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJzaWRlbmF2IHNpZGVuYXYtZmFjZXRzXCI+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2guYnVzeSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmFjZXRzU2VhcmNoLmJ1c3kpIHtcclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgY2xhc3M9XCJzaWRlbmF2LWxvYWRlclwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNjRweFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaWRlbmF2LXRpdGxlXCI+QWZmaW5hIHJpY2VyY2E8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiIChjbGljayk9XCJmYWNldHNDbG9zZSh0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1mYWNldHMgI2ZhY2V0c1NlYXJjaD48L2NsaXBwZXItc2VhcmNoLWZhY2V0cz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC1zaWRlbmF2PlxyXG4gICAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodCB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwic2VhcmNoX2NvbnRhaW5lclwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MzJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICBOb24gaGFpIGFuY29yYSBlZmZldHR1YXRvXHJcbiAgICAgICAgICAgICAgICAgICAgbGEgdHVhIHByaW1hIHJpY2VyY2Egb3BwdXJlIGxhIHJpY2VyY2EgZWZmZXR0dWF0YSBub24gaGEgcHJvZG90dG8gYWxjdW4gcmlzdWx0YXRvLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SW5zZXJpc2NpIG5lbGwnYXBwb3NpdG8gY2FtcG8gY2nDsiBjaGUgaW50ZW5kaSBjZXJjYXJlIGUgZmFpIGNsaWNrIHN1IDxiPlRyb3ZhPC9iPiBvcHB1cmUgdXRpbGl6emFcclxuICAgICAgICAgICAgICAgICAgICBsYVxyXG4gICAgICAgICAgICAgICAgICAgIDxiPlJpY2VyY2EgYXZhbnphdGE8L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD4uXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNuYXBzaG90Lml0ZW1zOyB0cmFjayB0cmFja2FibGVJZCgkaW5kZXgsIGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaXRlbS5pc092ZXIgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtcy1ncm91cC10aXRsZSBpdGVtLWFjY2VudFwiPnt7aXRlbS5ncm91cH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGwgY2xhc3M9XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXRlbS1zZWxlY3RlZCc6IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0pIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoJHNjcmVlbi5pc1RvdWNoYWJsZSB8fCBpdGVtLmlzT3ZlciB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtLmRvY3VtZW50SWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggZnhMYXlvdXRBbGlnbj1cImNlbnRlclwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShpdGVtLCBpdGVtLmRvY3VtZW50SWQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbSBbcGFyZW50XT1cInRoaXNcIiBbaXRlbV09XCJpdGVtXCI+PC9jbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaXNPdmVyIHx8IGl0ZW0uaXNNZW51T3BlbiB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cIntpdGVtOiBpdGVtfVwiIChjbGljayk9XCJpdGVtLmlzTWVudU9wZW4gPSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29udGV4dE1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2NvbnRleHRNZW51PVwibWF0TWVudVwiIChjbG9zZWQpPVwidXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0IC8gc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50XCIgW2xlbmd0aF09XCJzbmFwc2hvdC50b3RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudFwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCIgKHBhZ2UpPVwiZmV0Y2hNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gICAgPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBbaGlkZGVuXT1cImRpYWxvZ1RhYiAhPT0gMlwiPlxyXG4gICAgPGNsaXBwZXItbGFzdC0xNS1kYXlzICNsYXN0MTVEYXlzIFtzaG93SGVhZGVyXT1cImZhbHNlXCI+PC9jbGlwcGVyLWxhc3QtMTUtZGF5cz5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
754
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1B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Y0FBYyxzK0NBQ2Qsa0JBQWtCLHdnQkFDbEIsY0FBYywwV0FDZCxXQUFXLDhtQ0FDWCxpQkFBaUIsOFdBQ2pCLGFBQWEsMDFCQUNiLGdCQUFnQixvSUFDaEIsNEJBQTRCLHNNQUM1QixnQkFBZ0Isd0dBQ2hCLGdCQUFnQiwwZEFDaEIsb0JBQW9CLCtCQUNwQiw0QkFBNEIsd0ZBQzVCLE9BQU8sb0ZBQ1AsZ0NBQWdDLGtHQUNoQyxrQkFBa0I7OzJGQUdULDZCQUE2QjtrQkFqQ3pDLFNBQVM7MkJBQ0YsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGFBR2pDO3dCQUNULCtDQUErQztxQkFDaEQsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsNEJBQTRCO3dCQUM1QixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3dCQUNwQiw0QkFBNEI7d0JBQzVCLE9BQU87d0JBQ1AsZ0NBQWdDO3dCQUNoQyxrQkFBa0I7cUJBQ25COzhCQUt3QixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1BVF9EQVRFUElDS0VSX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IE1hdERyYXdlciwgTWF0U2lkZW5hdk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgQnJlYWtwb2ludHMgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHtcclxuICBDbGlwcGVyQXV0aG9ycyxcclxuICBDbGlwcGVyRG9jdW1lbnRDaGFuZ2VSZWFzb24sXHJcbiAgQ2xpcHBlclNlYXJjaFJlc3VsdCwgQ2xpcHBlck1lc3NhZ2VzLFxyXG4gIENsaXBwZXJNb2RlbCxcclxuICBDbGlwcGVyTW9kZWxzLFxyXG4gIENsaXBwZXJTZWFyY2hVdGlscyxcclxuICBDbGlwcGVyU2VjdG9yVHlwZXMsXHJcbiAgQ2xpcHBlclNlY3RvcnMsIENsaXBwZXJTb3J0LFxyXG4gIENsaXBwZXJTb3VyY2VzLFxyXG4gIENsaXBwZXJTZWxlY3Rpb25Nb2RlXHJcbn0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jbGlwcGVyLmNvbW1vbic7XHJcbmltcG9ydCB7IFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgRXh0ZW5kZWRNb2R1bGUgfSBmcm9tICdAbmdicmFja2V0L25neC1sYXlvdXQvZXh0ZW5kZWQnO1xyXG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXgnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENsaXBwZXJEb2N1bWVudE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9kb2N1bWVudC1tZW51L2RvY3VtZW50LW1lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50c1V0aWxzIH0gZnJvbSAnLi4vLi4vZG9jdW1lbnRzJztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1kaWFsb2cvc2VhcmNoLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoRmFjZXRzQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWZhY2V0cy9zZWFyY2gtZmFjZXRzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGcmVlVGV4dEhlbHBDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZnJlZS10ZXh0LWhlbHAvc2VhcmNoLWZyZWUtdGV4dC1oZWxwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGcmVlVGV4dFF1ZXJ5QnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mcmVlLXRleHQtcXVlcnktYnVpbGRlci9zZWFyY2gtZnJlZS10ZXh0LXF1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaFJlc3VsdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtcmVzdWx0LWl0ZW0vc2VhcmNoLXJlc3VsdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNTbmFwc2hvdCB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY2xpcHBlci5jb21tb24nO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoUmVzdWx0TWFuYWdlciB9IGZyb20gJy4uL3NlYXJjaC1yZXN1bHQtbWFuYWdlci9zZWFyY2gtcmVzdWx0LW1hbmFnZXInO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xpcHBlckJyb3dzZXJEaWFsb2dEYXRhIHtcclxuICBzZWxlY3Rpb25Nb2RlPzogQ2xpcHBlclNlbGVjdGlvbk1vZGUgfCBudWxsLFxyXG4gIHNlbGVjdGFibGVNb2RlbHM/OiBudW1iZXJbXSB8IG51bGwsXHJcbiAgaW5pdGlhbE1vZGVsPzogbnVtYmVyIHwgbnVsbFxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBob3N0OiB7ICdCaW5kJzogU3lzdGVtVXRpbHMuZ2VuZXJhdGVVVUlEKCkgfSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUlxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGbGV4TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRCYWRnZU1vZHVsZSxcclxuICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICBFeHRlbmRlZE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdE1lbnVNb2R1bGUsXHJcbiAgICBNYXREaXZpZGVyTW9kdWxlLFxyXG4gICAgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCxcclxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgICBNYXRTaWRlbmF2TW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICBDbGlwcGVyU2VhcmNoRmFjZXRzQ29tcG9uZW50LFxyXG4gICAgTmdDbGFzcyxcclxuICAgIENsaXBwZXJTZWFyY2hSZXN1bHRJdGVtQ29tcG9uZW50LFxyXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENsaXBwZXJCcm93c2VyRGlhbG9nQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBDbGlwcGVyU2VhcmNoUmVzdWx0TWFuYWdlclxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlclBhbmUnKSBmaWx0ZXJQYW5lITogTWF0RHJhd2VyO1xyXG5cclxuICBwcml2YXRlIGhlaWdodDogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBkaWFsb2dSZWYgPSBpbmplY3QoTWF0RGlhbG9nUmVmPENsaXBwZXJCcm93c2VyRGlhbG9nQ29tcG9uZW50Pik7XHJcbiAgcHJvdGVjdGVkIGRpYWxvZ0RhdGE6IENsaXBwZXJCcm93c2VyRGlhbG9nRGF0YSA9IGluamVjdChNQVRfRElBTE9HX0RBVEEpO1xyXG4gIHByb3RlY3RlZCB0aXRsZTogc3RyaW5nID0gJ1JpY2VyY2EgaW4gQ2xpcHBlcic7XHJcbiAgcHJvdGVjdGVkIHNuYXBzaG90OiBDbGlwcGVyU2VhcmNoUmVzdWx0ID0ge1xyXG4gICAgc2VhcmNoSW5mbzogbnVsbCxcclxuICAgIHNlYXJjaFBhcmFtczoge1xyXG4gICAgICBmaXJzdDogMCxcclxuICAgICAgY291bnQ6IDI1XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCBjdXJyZW50TW9kZWw6IHN0cmluZyA9ICdUdXR0byc7XHJcbiAgcHJvdGVjdGVkIGN1cnJlbnRTb3J0OiBzdHJpbmcgPSAnUmlsZXZhbnphJztcclxuXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gVXNlIHNlcnZpY2Ugc25hcHNob3RcclxuICAgIHRoaXMuc25hcHNob3QgPSB0aGlzLmNsaXBwZXJTZXJ2aWNlLnNuYXBzaG90O1xyXG4gICAgaWYgKCF0aGlzLnNuYXBzaG90KVxyXG4gICAgICB0aGlzLnNuYXBzaG90ID0ge1xyXG4gICAgICAgIHNlYXJjaEluZm86IG51bGwsXHJcbiAgICAgICAgc2VhcmNoUGFyYW1zOiBudWxsLFxyXG4gICAgICB9O1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyUGFyYW1zID09IG51bGwpIHtcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgZmlyc3Q6IDAsXHJcbiAgICAgICAgY291bnQ6IDE1LFxyXG4gICAgICB9O1xyXG4gICAgICAvLyBTdG9yZSBzbmFwc2hvdFxyXG4gICAgICB0aGlzLmNsaXBwZXJTZXJ2aWNlLnNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgbW9kZWxcclxuICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEuaW5pdGlhbE1vZGVsKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlTW9kZWwodGhpcy5kaWFsb2dEYXRhLmluaXRpYWxNb2RlbCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5nZXRNZXNzYWdlKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpKVxyXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVEX0lOTkVSKSB7XHJcbiAgICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVELCBtZXNzYWdlLmRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIHdpbmRvdyBzaXplIGNoYW5nZVxyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDUwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2xpcHBlclNlcnZpY2UudmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUubmV4dCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5jbGlwcGVyU2VydmljZS52aXNpYmxlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIEhhbmRsZSBmaWx0ZXIgcGFuZSBcclxuICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJQYW5lVmlzaWJpbGl0eSgpO1xyXG4gICAgICAvLyBIYW5kbGUgZmFjZXRzXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0cykge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzLmNoYW5nZWRcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBDbGlwcGVyU2VhcmNoRmFjZXRzU25hcHNob3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc25hcHNob3QuZmFjZXRzLmZyb21EYXRlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZnJvbURhdGUgPSB0aGlzLnNuYXBzaG90LmZhY2V0cy5mcm9tRGF0ZTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy50b0RhdGUgPSB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGU7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMueWVhciA9IHRoaXMuc25hcHNob3QuZmFjZXRzLmZyb21EYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zbmFwc2hvdC5mYWNldHMuY2hhbmdlZEludGVydmFsKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZnJvbURhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnRvRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc25hcHNob3QuZmFjZXRzLnNlY3RvciB8fCB0aGlzLnNuYXBzaG90LmZhY2V0cy5jaGFuZ2VkU2VjdG9yKVxyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnNlY3RvciA9IHRoaXMuc25hcHNob3QuZmFjZXRzLnNlY3RvcjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc25hcHNob3QuZmFjZXRzLnR5cGUgfHwgdGhpcy5zbmFwc2hvdC5mYWNldHMuY2hhbmdlZFR5cGUpXHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudHlwZSA9IHRoaXMuc25hcHNob3QuZmFjZXRzLnR5cGU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cy5hdXRob3IgfHwgdGhpcy5zbmFwc2hvdC5mYWNldHMuY2hhbmdlZEF1dGhvcilcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5hdXRob3IgPSB0aGlzLnNuYXBzaG90LmZhY2V0cy5hdXRob3I7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUmVzaXplIFxyXG4gKi9cclxuICBwcml2YXRlIHJlc2l6ZSgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGlwcGVyLWJyb3dzZXItc2Nyb2xsYWJsZScpO1xyXG4gICAgICBpZiAoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZGlhbG9nU2VydmljZS5nZXRDdXJyZW50RGlhbG9nU2Nyb2xsYWJsZUhlaWdodChcclxuICAgICAgICAgIFsnY2xpcHBlci1icm93c2VyLWZpeGVkJ10sXHJcbiAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChoZWlnaHQgIT0gdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICdoZWlnaHQ6JyArIGhlaWdodCArICdweCAhaW1wb3J0YW50O21heC1oZWlnaHQ6JyArIGhlaWdodCArICdweCAhaW1wb3J0YW50Jyk7XHJcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiogU2hvdyBoaWRlIGZpbHRlciBwYW5lIG1hbnVhbGx5XHJcbiovXHJcbiAgcHJvdGVjdGVkIHRvZ2dsZUZpbHRlclBhbmUoKSB7XHJcbiAgICB0aGlzLmZpbHRlclBhbmVDbG9zZWQgPSAhdGhpcy5maWx0ZXJQYW5lQ2xvc2VkO1xyXG4gICAgdGhpcy5maWx0ZXJQYW5lPy50b2dnbGUoKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIHBhbmUgdmlzaWJpbGl0eVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlRmlsdGVyUGFuZVZpc2liaWxpdHkoKSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJQYW5lKSB7XHJcbiAgICAgIGlmICh0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuWFNtYWxsKSB8fFxyXG4gICAgICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5TbWFsbCkgfHxcclxuICAgICAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuTWVkaXVtKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclBhbmUub3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBhbmUuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lLm1vZGUgPSAnb3Zlcic7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lLmRpc2FibGVDbG9zZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFuZUhhc0JhY2tkcm9wID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyUGFuZS5vcGVuZWQgJiYgIXRoaXMuZmlsdGVyUGFuZUNsb3NlZCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQYW5lLm9wZW4oKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyUGFuZS5vcGVuZWQgJiYgdGhpcy5maWx0ZXJQYW5lQ2xvc2VkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBhbmUuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lLm1vZGUgPSAnc2lkZSc7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lLmRpc2FibGVDbG9zZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lSGFzQmFja2Ryb3AgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBkb2N1bWVudHMgY2FuIGJlIHNlbGVjdGVkIGFuZCByZXR1cm5lZCBhcyBtZXNzYWdlXHJcbiAgICovXHJcbiAgY2FuU2VsZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ID1cclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgKCh0aGlzLmRpYWxvZ0RhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMSAmJlxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRpYWxvZ0RhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMiAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRpYWxvZ0RhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMyAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSk7XHJcbiAgICBpZiAoYWxsb3cgJiYgdGhpcy5kaWFsb2dEYXRhLnNlbGVjdGFibGVNb2RlbHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEuc2VsZWN0YWJsZU1vZGVscy5pbmRleE9mKG4ubW9kZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbG93O1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBtZXNzYWdlIHdpdGggY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlIGRpYWxvZ1xyXG4gICAqL1xyXG4gIHNlbGVjdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoXHJcbiAgICAgICAgQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVELFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZGlhbG9nXHJcbiAgICogQHBhcmFtIG5ld1JvdXRlOiB0aGUgbmV3IHJvdXRlIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgY2xvc2UobmV3Um91dGU6IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG5ld1JvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2xpcHBlci1yZWZlcmVuY2VzLXNjcm9sbGVyJykuc2Nyb2xsVG8oMCwgMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNvcnRcclxuICAgKi9cclxuICB1cGRhdGVTb3J0T3B0aW9ucygpIHtcclxuICAgIHN3aXRjaCAodGhpcy5maWx0ZXJQYXJhbXMuc29ydE1vZGUpIHtcclxuICAgICAgY2FzZSBDbGlwcGVyU29ydC5EYXRlQXNjOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBjcmUuJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyU29ydC5Qb3B1bGFyaXR5OlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUG9wb2xhcml0w6AnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJTb3J0LlJlbGV2YW5jZTpcclxuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0ID0gJ1JpbGV2YW56YSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuc29ydE1vZGUgPSBDbGlwcGVyU29ydC5EYXRlRGVzYztcclxuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0ID0gJ0RhdGEgZGVjci4nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBjdXJyZW50IHNlYXJjaCBpbmZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWFyY2hJbmZvKCkge1xyXG4gICAgbGV0IHNpID0gW107XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnNlY3RvciB8fFxyXG4gICAgICAodGhpcy5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzID0gU3lzdGVtVXRpbHMuYXJyYXlGaW5kQnlLZXkoXHJcbiAgICAgICAgQ2xpcHBlclNlY3RvcnMsXHJcbiAgICAgICAgJ3ZhbHVlJyxcclxuICAgICAgICB0aGlzLmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy5zZWN0b3JcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yXHJcbiAgICAgICAgICA6IHRoaXMuZmlsdGVyUGFyYW1zLnNlY3RvclxyXG4gICAgICApO1xyXG4gICAgICBpZiAocykge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICdzZXR0b3JlJyxcclxuICAgICAgICAgIHZhbHVlOiBzLm5hbWUsXHJcbiAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHMgPSBTeXN0ZW1VdGlscy5hcnJheUZpbmRCeUtleShcclxuICAgICAgICAgIENsaXBwZXJNb2RlbHMsXHJcbiAgICAgICAgICAndmFsdWUnLFxyXG4gICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yXHJcbiAgICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yXHJcbiAgICAgICAgICAgIDogdGhpcy5maWx0ZXJQYXJhbXMuc2VjdG9yXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocykge1xyXG4gICAgICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnc2V6aW9uZScsXHJcbiAgICAgICAgICAgIHZhbHVlOiBzLm5hbWUsXHJcbiAgICAgICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZpbHRlclBhcmFtcy5hdXRob3IgfHxcclxuICAgICAgKHRoaXMuc25hcHNob3QuZmFjZXRzICYmIHRoaXMuc25hcHNob3QuZmFjZXRzLmF1dGhvcilcclxuICAgICkge1xyXG4gICAgICBsZXQgYSA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJBdXRob3JzLFxyXG4gICAgICAgICd2YWx1ZScsXHJcbiAgICAgICAgdGhpcy5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMuYXV0aG9yXHJcbiAgICAgICAgICA/IHRoaXMuc25hcHNob3QuZmFjZXRzLmF1dGhvclxyXG4gICAgICAgICAgOiB0aGlzLmZpbHRlclBhcmFtcy5hdXRob3JcclxuICAgICAgKTtcclxuICAgICAgaWYgKGEpIHtcclxuICAgICAgICBzaS5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkOiAnYXV0b3JlJyxcclxuICAgICAgICAgIHZhbHVlOiBhLmF1dGhvckRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMudG9waWMpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYXJnb21lbnRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJQYXJhbXMudG9waWMsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy50YXhvbm9teSlcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhcmdvbWVudG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmZpbHRlclBhcmFtcy50YXhvbm9teU5vZGUsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5udW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtZXJvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJQYXJhbXMubnVtYmVyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLnNuYXBzaG90LmludGVydmFsICYmXHJcbiAgICAgICh0aGlzLmZpbHRlclBhcmFtcy5mcm9tRGF0ZSB8fFxyXG4gICAgICAgICh0aGlzLnNuYXBzaG90LmZhY2V0cyAmJlxyXG4gICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGUgJiZcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsICE9PVxyXG4gICAgICAgICAgQ2xpcHBlck1vZGVsLkFnZ2lvcm5hbWVudG9Ob3JtYXRpdm8pKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkMSA9XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGVcclxuICAgICAgICAgIDogdGhpcy5maWx0ZXJQYXJhbXMuZnJvbURhdGU7XHJcbiAgICAgIGNvbnN0IGQyID1cclxuICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuZmlsdGVyUGFyYW1zLnRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICFkMiA/ICdpbiBkYXRhJyA6ICdkYSBkYXRhJyxcclxuICAgICAgICB2YWx1ZTogU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShkMSksXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zbmFwc2hvdC5pbnRlcnZhbCAmJlxyXG4gICAgICAodGhpcy5maWx0ZXJQYXJhbXMudG9EYXRlIHx8XHJcbiAgICAgICAgKHRoaXMuc25hcHNob3QuZmFjZXRzICYmXHJcbiAgICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGUgJiZcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsICE9PVxyXG4gICAgICAgICAgQ2xpcHBlck1vZGVsLkFnZ2lvcm5hbWVudG9Ob3JtYXRpdm8pKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkID1cclxuICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuZmlsdGVyUGFyYW1zLnRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhIGRhdGEnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5pbnRlcnZhbClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdpbnRlcnZhbGxvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5pbnRlcnZhbCxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyUGFyYW1zLnNvdXJjZSlcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdmb250ZScsXHJcbiAgICAgICAgdmFsdWU6IFN5c3RlbVV0aWxzLmFycmF5R2V0VmFsdWUoXHJcbiAgICAgICAgICBDbGlwcGVyU291cmNlcyxcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnNvdXJjZVxyXG4gICAgICAgICksXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5zb3VyY2VOdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBmb250ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyUGFyYW1zLnNvdXJjZU51bWJlcixcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZpbHRlclBhcmFtcy5zb3VyY2VGcm9tRGF0ZSB8fFxyXG4gICAgICAodGhpcy5zbmFwc2hvdC5mYWNldHMgJiZcclxuICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cy5mcm9tRGF0ZSAmJlxyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgIENsaXBwZXJNb2RlbC5BZ2dpb3JuYW1lbnRvTm9ybWF0aXZvKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkMSA9XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGVcclxuICAgICAgICAgIDogdGhpcy5maWx0ZXJQYXJhbXMuc291cmNlRnJvbURhdGU7XHJcbiAgICAgIGNvbnN0IGQyID1cclxuICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuZmlsdGVyUGFyYW1zLnNvdXJjZVRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICFkMiA/ICdpbiBkYXRhIGZvbnRlJyA6ICdkYSBkYXRhIGZvbnRlJyxcclxuICAgICAgICB2YWx1ZTogU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShkMSksXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuc291cmNlVG9EYXRlIHx8XHJcbiAgICAgICh0aGlzLnNuYXBzaG90LmZhY2V0cyAmJlxyXG4gICAgICAgIHRoaXMuc25hcHNob3QuZmFjZXRzLnRvRGF0ZSAmJlxyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgIENsaXBwZXJNb2RlbC5BZ2dpb3JuYW1lbnRvTm9ybWF0aXZvKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkID1cclxuICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuZmlsdGVyUGFyYW1zLnNvdXJjZVRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMudGV4dClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0ZXN0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyUGFyYW1zLnRleHQsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudHlwZSB8fFxyXG4gICAgICAodGhpcy5zbmFwc2hvdC5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMudHlwZSlcclxuICAgICkge1xyXG4gICAgICBsZXQgdCA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJTZWN0b3JUeXBlcyxcclxuICAgICAgICAndmFsdWUnLFxyXG4gICAgICAgIHRoaXMuc25hcHNob3QuZmFjZXRzICYmIHRoaXMuc25hcHNob3QuZmFjZXRzLnR5cGVcclxuICAgICAgICAgID8gdGhpcy5zbmFwc2hvdC5mYWNldHMudHlwZVxyXG4gICAgICAgICAgOiB0aGlzLmZpbHRlclBhcmFtcy50eXBlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0KSB7XHJcbiAgICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgICBmaWVsZDogJ3RpcG8nLFxyXG4gICAgICAgICAgdmFsdWU6IHQuZG9jdW1lbnRUeXBlRGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5zaG93VW5yZWFkRG9jdW1lbnRzT25seSlcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdzdGF0bycsXHJcbiAgICAgICAgdmFsdWU6ICdub24gbGV0dGknLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLmNoYW5nZVJlYXNvbiB8fFxyXG4gICAgICAodGhpcy5zbmFwc2hvdC5mYWNldHMgJiYgdGhpcy5zbmFwc2hvdC5mYWNldHMucmVhc29uKVxyXG4gICAgKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpcG8gbW9kLicsXHJcbiAgICAgICAgdmFsdWU6IFN5c3RlbVV0aWxzLmFycmF5R2V0VmFsdWUoXHJcbiAgICAgICAgICBDbGlwcGVyRG9jdW1lbnRDaGFuZ2VSZWFzb24sXHJcbiAgICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyAmJiB0aGlzLnNuYXBzaG90LmZhY2V0cy5yZWFzb25cclxuICAgICAgICAgICAgPyB0aGlzLnNuYXBzaG90LmZhY2V0cy5yZWFzb25cclxuICAgICAgICAgICAgOiB0aGlzLmZpbHRlclBhcmFtcy5jaGFuZ2VSZWFzb25cclxuICAgICAgICApLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMuY2hhbmdlZE51bWJlcilcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdudW0uIG1vZGlmaWNhdG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmZpbHRlclBhcmFtcy5jaGFuZ2VkTnVtYmVyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMuY2hhbmdlZFllYXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYW5ubyBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJQYXJhbXMuY2hhbmdlZFllYXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5jaGFuZ2VkVGl0bGUpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAndGl0b2xvIG1vZGlmaWNhdG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmZpbHRlclBhcmFtcy5jaGFuZ2VkVGl0bGUsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5tb2RpZmllck51bWJlcilcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdudW0uIG1vZGlmaWNhbnRlJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJQYXJhbXMubW9kaWZpZXJOdW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy5tb2RpZmllclllYXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYW5ubyBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyUGFyYW1zLm1vZGlmaWVyWWVhcixcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyUGFyYW1zLm1vZGlmaWVyVGl0bGUpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAndGl0b2xvIG1vZGlmaWNhbnRlJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJQYXJhbXMubW9kaWZpZXJUaXRsZSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc25hcHNob3Quc2VhcmNoSW5mbyA9IHNpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIENoYW5nZSBzZWFyY2ggbW9kZWxcclxuICogQHBhcmFtIG1vZGVsIDogdGhlIG5ldyBkb2N1bWVudCBtb2RlbCBcclxuICogQHBhcmFtIGZldGNoIDogdHJ1ZSBpZiBkYXRhIG11c3QgYmUgZmV0Y2hlZC4gRGVmYXVsdCBpcyB0cnVlXHJcbiAqL1xyXG4gIGNoYW5nZU1vZGVsKG1vZGVsOiBudW1iZXIgPSBudWxsLCBmZXRjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsID0gbW9kZWw7XHJcbiAgICBzd2l0Y2ggKG1vZGVsKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlck1vZGVsLkFnZ2lvcm5hbWVudG9Ob3JtYXRpdm86IHRoaXMuY3VycmVudE1vZGVsID0gXCJHYXp6ZXR0ZSBlIGJvbGxldHRpbmlcIjsgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlck1vZGVsLk5vcm1hdGl2YVZpZ2VudGU6IHRoaXMuY3VycmVudE1vZGVsID0gXCJOb3JtYXRpdmEgdmlnZW50ZVwiOyBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbCA9IFwiVHV0dG9cIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChmZXRjaClcclxuICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGEgc29ydFxyXG4gICAqIEBwYXJhbSBtb2RlIDogdGhlIHNvcnQgbW9kZVxyXG4gICAqL1xyXG4gIHNvcnRCeShtb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZmlsdGVyUGFyYW1zLnNvcnRNb2RlID0gbW9kZTtcclxuICAgIHRoaXMudXBkYXRlU29ydE9wdGlvbnMoKTtcclxuICAgIHRoaXMuZmV0Y2goZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIEdldCBmYWNldHNcclxuICovXHJcbiAgZmV0Y2hGYWNldHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2xpcHBlclNlcnZpY2UubG9nZ2VkSW4pIHJldHVybjtcclxuICAgIHRoaXMuZmFjZXRzLmJ1c3kuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5jbGlwcGVyU2VydmljZS5yZWZlcmVuY2VzRmFjZXRzKHRoaXMuZmlsdGVyUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocikgPT4ge1xyXG4gICAgICAgICAgaWYgKHIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVSZXN1bHRzKG51bGwsIHIudmFsdWUuZmFjZXRzKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJQYW5lVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZmFjZXRzLmJ1c3kuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhIHNlYXJjaCB1c2luZyBjdXJyZW50IHBhcmFtc1xyXG4gICAqL1xyXG4gIGZldGNoKG5ld1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy5maWx0ZXJQYXJhbXMuY291bnQgPSAyNTtcclxuICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZmlyc3QgPSAwO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMudGV4dClcclxuICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJTb3J0LlJlbGV2YW5jZTtcclxuICAgICAgZWxzZSBpZiAoIXRoaXMuZmlsdGVyUGFyYW1zLnNvcnRNb2RlKVxyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnNvcnRNb2RlID0gQ2xpcHBlclNvcnQuRGF0ZURlc2M7XHJcbiAgICAgIHRoaXMudXBkYXRlU29ydE9wdGlvbnMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpbHRlclBhcmFtcy55ZWFyID4gMCkge1xyXG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5maWx0ZXJQYXJhbXMueWVhcjtcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZnJvbURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAyKTtcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudG9EYXRlID0gbmV3IERhdGUoeWVhciwgMTEsIDMxLCAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnllYXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmlsdGVyUGFyYW1zLnRleHQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudGV4dCA9IENsaXBwZXJTZWFyY2hVdGlscy5ub3JtYWxpemVUZXh0UXVlcnkodGhpcy5maWx0ZXJQYXJhbXMudGV4dCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaXBwZXJTZXJ2aWNlLnF1ZXJ5KHRoaXMuZmlsdGVyUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXIuc3VjY2VzcykgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlUmVzdWx0cyhyLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEhhbmRsZSBmYWNldHNcclxuICAgICAgICAgICAgaWYgKHRoaXMuc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMuaGFzVG9vTWFueVJlc3VsdHMgPSB0aGlzLnNuYXBzaG90LnRvdGFsID49IDEwMDA7XHJcbiAgICAgICAgICAgICAgaWYgKG5ld1NlYXJjaClcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmYWNldHNcclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hGYWNldHMoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0cy5yZXNldCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyUGFuZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobmV3U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VhcmNoSW5mbygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5ldyBwYWdlIHJlc3VsdFxyXG4gICAqIEBwYXJhbSBlIDogdGhlIE1hdFBhZ2luYXRvciBQYWdlRXZlbnQgZGF0YVxyXG4gICAqL1xyXG4gIGZldGNoTW9yZShlOiBhbnkpIHtcclxuICAgIGxldCBmaXJzdCA9IGUucGFnZUluZGV4ICogdGhpcy5maWx0ZXJQYXJhbXMuY291bnQ7XHJcbiAgICB0aGlzLmZpbHRlclBhcmFtcy5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5mZXRjaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VhcmNoXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRNb2RlbCA9ICdOb3JtYXRpdmEgdmlnZW50ZSc7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMuc25hcHNob3QudG90YWwgPSAwO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSBudWxsO1xyXG4gICAgdGhpcy5mYWNldHMucmVzZXQoKTtcclxuICAgIHRoaXMuZmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICBmaXJzdDogMCxcclxuICAgICAgY291bnQ6IDE1LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZmlsdGVyUGFuZS5jbG9zZSgpO1xyXG4gICAgdGhpcy51cGRhdGVTZWFyY2hJbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIGFuIGl0ZW1cclxuICAgKiBAcGFyYW0gZG9jdW1lbnRJZCA6IHRoZSBkb2N1bWVudCBpZFxyXG4gICAqIEBwYXJhbSBuZXdXaW5kb3c6IHRydWUgaWYgdGhlIGRvY3VtZW50IG11c3QgYmUgb3BlbiBpbnRvIGEgbmV3IHdpbmRvd1xyXG4gICAqL1xyXG4gIG9wZW4oZG9jdW1lbnRJZDogc3RyaW5nLCBuZXdXaW5kb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCFuZXdXaW5kb3cpIHRoaXMub3BlbkRvY3VtZW50KGRvY3VtZW50SWQpO1xyXG4gICAgZWxzZSB3aW5kb3cub3BlbignL2RvY3VtZW50by8nICsgZG9jdW1lbnRJZCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBhIGRvY3VtZW50XHJcbiAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBwcml2YXRlIG9wZW5Eb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZG9jdW1lbnRJZCkgcmV0dXJuO1xyXG4gICAgQ2xpcHBlckRvY3VtZW50c1V0aWxzLm9wZW5Eb2N1bWVudChcclxuICAgICAgZG9jdW1lbnRJZCxcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudGV4dCxcclxuICAgICAgdGhpcy5kaWFsb2dEYXRhLnNlbGVjdGlvbk1vZGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wb3NlIGEgZnJlZSB0ZXh0IHNlYXJjaCBxdWVyeVxyXG4gICAqL1xyXG4gIGNvbXBvc2VTZWFyY2goKSB7XHJcbiAgICBsZXQgZCA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKENsaXBwZXJTZWFyY2hGcmVlVGV4dFF1ZXJ5QnVpbGRlckNvbXBvbmVudCwge1xyXG4gICAgICBhcmlhTGFiZWw6ICdjb3N0cnVpc2NpIHJpY2VyY2EnLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IHRydWUsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzYwMHB4JyxcclxuICAgICAgd2lkdGg6ICc5OSUnLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRvbmVcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudGV4dCA9IHIucXVlcnk7XHJcblxyXG4gICAgICAgIC8vIEZpbmlzaGVkXHJcbiAgICAgICAgZC5jbG9zZSgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICogUGVyZm9ybSBzZWFyY2hcclxuICovXHJcbiAgc2VhcmNoKCkge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyUGFyYW1zLnNlY3RvciA9PT0gdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yKVxyXG4gICAgICB0aGlzLmZpbHRlclBhcmFtcy5zZWN0b3IgPSBudWxsO1xyXG5cclxuICAgIC8vIFJlc2V0IHBhZ2luYXRvclxyXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG5cclxuICAgIC8vIFJlc2V0IGZhY2V0cyBzZWFyY2hcclxuICAgIHRoaXMuZmFjZXRzLnJlc2V0KCk7XHJcblxyXG4gICAgLy8gRG8gc2VhcmNoXHJcbiAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhZHZhbmNlZCBzZWFyY2hcclxuICAgKi9cclxuICBhZHZhbmNlZFNlYXJjaCgpIHtcclxuICAgIGxldCBkID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQ2xpcHBlclNlYXJjaERpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBhcmlhTGFiZWw6ICdyaWNlcmNhIGF2YW56YXRhJyxcclxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcclxuICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHBhcmFtczogdGhpcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgZW5hYmxlUmVhZDogZmFsc2UsXHJcbiAgICAgICAgZW5hYmxlU2VjdG9yOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVR5cGU6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlQXV0aG9yOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVRvcGljOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVRleHQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlRG9jdW1lbnQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlU291cmNlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICBtaW5XaWR0aDogJzM3NXB4JyxcclxuICAgICAgbWF4V2lkdGg6ICc3MDBweCcsXHJcbiAgICAgIHdpZHRoOiAnOTklJyxcclxuICAgIH0pO1xyXG4gICAgZC5jb21wb25lbnRJbnN0YW5jZS5kb25lXHJcbiAgICAgIC5zdWJzY3JpYmUoKHI6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBzZWFyY2ggcGFyYW1zXHJcbiAgICAgICAgci5tb2RlbCA9IHRoaXMuZmlsdGVyUGFyYW1zLm1vZGVsO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zID0gcjtcclxuICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuY291bnQgPSAyNTtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJQYXJhbXMuc2VjdG9yID09PSB0aGlzLnNuYXBzaG90LmZhY2V0cy5zZWN0b3IpXHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5zZWN0b3IgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBwYWdpbmF0b3JcclxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IGZhY2V0cyBzZWFyY2hcclxuICAgICAgICB0aGlzLmZhY2V0cy5yZXNldCgpO1xyXG5cclxuICAgICAgICAvLyBEbyBzZWFyY2hcclxuICAgICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBGaW5pc2hlZFxyXG4gICAgICAgIGQuY2xvc2UoKTtcclxuXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFNob3cgZnJlZSB0ZXh0IGhlbHBcclxuICovXHJcbiAgaGVscFNlYXJjaCgpIHtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKENsaXBwZXJTZWFyY2hGcmVlVGV4dEhlbHBDb21wb25lbnQsIHtcclxuICAgICAgYXJpYUxhYmVsOiAnaW5mb3JtYXppb25pIHJpY2VyY2EnLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IHRydWUsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzgwMHB4JyxcclxuICAgICAgd2lkdGg6ICc5OSUnLFxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgaWQ9XCJjbGlwcGVyLWJyb3dzZXItZml4ZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2xpcHBlci1icm93c2VyLWhlYWRlclwiPlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPScxMHB4JyBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIj5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9jbGlwcGVyLmFyc2VkaXppb25pLml0XCIgbWF0VG9vbHRpcD1cIkFwcmkgQ2xpcHBlciBpbiB1biBudW92byB0YWJcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgIDxpbWcgc3JjPVwiLi8uLi8uLi8uLi9hc3NldHMvaW1hZ2VzL2NsaXBwZXJfbG9nby5wbmdcIiBhbHQ9XCJDbGlwcGVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA1MHB4OyBwYWRkaW5nOiA1cHhcIiAvPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAoZGlhbG9nRGF0YT8uc2VsZWN0aW9uTW9kZSA+IDApIHtcclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgQGlmIChjYW5TZWxlY3QoKSkge1xyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwic2VsZWN0KClcIj5cclxuICAgICAgICAgIFVzYSBzZWxlemlvbmVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTUwcHhcIiBmeExheW91dEFsaWduPVwiZW5kXCIgY2xhc3M9XCJkaWFsb2ctY2xvc2VcIj5cclxuICAgICAgICBAaWYgKGNsaXBwZXJTZXJ2aWNlLmJhZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJEb2N1bWVudGkgZGkgbGF2b3JvXCIgYXJpYS1sYWJlbD1cIidEb2N1bWVudGkgZGkgbGF2b3JvJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwibWFuYWdlQmFnKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW21hdEJhZGdlXT1cImNsaXBwZXJTZXJ2aWNlLmJhZy5sZW5ndGhcIlxyXG4gICAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+d29ya19vdXRsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJDaGl1ZGlcIiBhcmlhLWxhYmVsPVwiQ2hpdWRpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE1cHggMCAxMHB4IDE1cHhcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXgueHM9XCI2MlwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPk51bWVybzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImZpbHRlclBhcmFtcy5udW1iZXJcIiAjbnVtYmVyPVwibmdNb2RlbFwiIG5hbWU9XCJudW1iZXJcIiBtYXhsZW5ndGg9XCIxMFwiXHJcbiAgICAgICAgICAgICAgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmlsdGVyUGFyYW1zLm51bWJlcikge1xyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiQXp6ZXJhXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVyUGFyYW1zLm51bWJlciA9IG51bGw7XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTMwcHhcIiBmeEhpZGUueHMgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+QW5ubzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1hdElucHV0IFsobmdNb2RlbCldPVwiZmlsdGVyUGFyYW1zLnllYXJcIiAjeWVhcj1cIm5nTW9kZWxcIiBuYW1lPVwieWVhclwiIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgIG1heGxlbmd0aD1cIjRcIiAoa2V5dXAuRW50ZXIpPVwiZmV0Y2godHJ1ZSlcIiAvPlxyXG4gICAgICAgICAgICBAaWYgKGZpbHRlclBhcmFtcy55ZWFyKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJQdWxpc2NpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVyUGFyYW1zLnllYXIgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGlmICh5ZWFyLmludmFsaWQpIHtcclxuICAgICAgICAgICAgPG1hdC1lcnJvcj5Ob24gdmFsaWRvLjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPlBhcm9sZSwgZnJhc2kgbyBjb25jZXR0aS4uLjwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3NlYXJjaElucHV0PVwibWF0SW5wdXRcIiB0eXBlPVwidGV4dFwiICN0ZXh0IFsobmdNb2RlbCldPVwiZmlsdGVyUGFyYW1zLnRleHRcIiBtYXhsZW5ndGg9XCIyMDBcIlxyXG4gICAgICAgICAgICAgIChrZXl1cC5FbnRlcik9XCJzZWFyY2goKVwiIGF1dG9mb2N1cyAvPlxyXG4gICAgICAgICAgICBAaWYgKGZpbHRlclBhcmFtcy50ZXh0KSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJQdWxpc2NpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVyUGFyYW1zLnRleHQgPSAnJ1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhIaWRlLnhzIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IGFyaWEtbGFiZWw9XCJDb21wb25pXCIgbWF0VG9vbHRpcD1cIkNvbXBvbmlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0ZXh0LmZvY3VzKCk7IGNvbXBvc2VTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5idWlsZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiSW5mb3JtYXppb25pXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tZSBlZmZldHR1YXJlIGxhIHJpY2VyY2EgaW4gdGVzdG8gbGliZXJvXCIgKGNsaWNrKT1cInRleHQuZm9jdXMoKTsgaGVscFNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmhlbHBfb3V0bGluZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4LnhzPVwiMzZcIj5cclxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxMHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEZpbGw+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNlYXJjaCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQXZ2aWEgbGEgcmljZXJjYSdcIlxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQXZ2aWEgcmljZXJjYVwiIFtkaXNhYmxlZF09XCIhY2xpcHBlclNlcnZpY2UubG9nZ2VkSW5cIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnNlYXJjaDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWR2YW5jZWRTZWFyY2goKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JpY2VyY2EgYXZhbnphdGEnXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJpY2VyY2EgYXZhbnphdGFcIiBbZGlzYWJsZWRdPVwiIWNsaXBwZXJTZXJ2aWNlLmxvZ2dlZEluXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICBAaWYgKHNuYXBzaG90LnNlYXJjaEluZm8gJiYgc25hcHNob3Quc2VhcmNoSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgPGRpdiBmeEhpZGUueHMgY2xhc3M9XCJzbWFsbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxNXB4O1wiPlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICAgIDxiPlJJQ0VSQ0EgQVRUSVZBPC9iPiZuYnNwOyZuYnNwOyZuYnNwO1xyXG4gICAgICAgIEBmb3IgKHNpIG9mIHNuYXBzaG90LnNlYXJjaEluZm87IHRyYWNrIHNpKSB7XHJcbiAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICB7e3NpLnNlcCA/ICcmbmJzcDsmbmJzcDsnIDogJyd9fSB7e3NpLmZpZWxkfX06IDxzcGFuIGNsYXNzPVwiYWNjZW50IGxvd2VyY2FzZVwiPjxpPnt7c2kudmFsdWV9fTwvaT48L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4QWxpZ249XCJzdGFydFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQXp6ZXJhIHJpY2VyY2FcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICB9XHJcbiAgPGRpdiBmeExheW91dD1cInJvdyB3cmFwLXJldmVyc2VcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIiBmeEZpbGwgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7XCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxMHB4XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG4gICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdEFsbCgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFhbGxTZWxlY3RlZCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZXppb25hL2Rlc2VsZXppb25hIHR1dHRvJ1wiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG9cIiBbZGlzYWJsZWRdPVwiIXNuYXBzaG90Lml0ZW1zIHx8IHNuYXBzaG90Lml0ZW1zLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCI+XHJcbiAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJPcmRpbmFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9yZGluYSdcIlxyXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVNvcnRcIiBbZGlzYWJsZWRdPVwiIXNuYXBzaG90LnRvdGFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5PcmRpbmEgcGVyOjwvc3Bhbj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGZ4SGlkZS5ndC1tZD5zb3J0PC9tYXQtaWNvbj4ge3tjdXJyZW50U29ydH19XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tbWVudS1kcm9wLWRvd25cIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxtYXQtbWVudSAjbWVudVNvcnQ9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDMpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGRlY3Jlc2NlbnRlJ1wiPlxyXG4gICAgICAgICAgICAgIERhdGEgZGVjcmVzY2VudGVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDIpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGNyZXNjZW50ZSdcIj5cclxuICAgICAgICAgICAgICBEYXRhIGNyZXNjZW50ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgQGlmIChmaWx0ZXJQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNvcnRCeSgxKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09yZGluYSBwZXIgcmlsZXZhbnphJ1wiPlxyXG4gICAgICAgICAgICAgIFJpbGV2YW56YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNvcnRCeSg1KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09yZGluYSBwZXIgcG9wb2xhcml0w6AnXCI+XHJcbiAgICAgICAgICAgICAgUG9wb2xhcml0w6BcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwhLS0gPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzb3J0QnkoNClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGRpIGluc2VyaW1lbnRvIGRlc2NyZXNjZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIERhdGEgZGkgaW5zZXJpbWVudG8gZGVjcmVzY2VudGVcclxuICAgICAgICAgICAgICA8L2J1dHRvbj4tLT5cclxuICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBtb2RlbGxvJ1wiXHJcbiAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51TW9kZWxzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5Nb3N0cmE6PC9zcGFuPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gZnhIaWRlLmd0LW1kPmZpbHRlcl9saXN0PC9tYXQtaWNvbj4ge3tjdXJyZW50TW9kZWx9fVxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIgaWNvbi1tZW51LWRyb3AtZG93blwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPG1hdC1tZW51ICNtZW51TW9kZWxzPVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNoYW5nZU1vZGVsKDIpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInTW9zdHJhIGFnZ2lvcm5hbWVudG8gbm9ybWF0aXZvJ1wiPlxyXG4gICAgICAgICAgICAgIEdhenpldHRlIGUgYm9sbGV0dGluaVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCg5KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ05vcm1hdGl2YSB2aWdlbnRlJ1wiPlxyXG4gICAgICAgICAgICAgIE5vcm1hdGl2YSB2aWdlbnRlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInTW9zdHJhIHR1dHRpIGkgZG9jdW1lbnRpJ1wiPlxyXG4gICAgICAgICAgICAgIFR1dHRvXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICBAaWYgKHNlbGVjdGlvbi5oYXNWYWx1ZSgpKSB7XHJcbiAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBtYXRUb29sdGlwPVwiQXppb25pIGRhIGVzZWd1aXJlIHN1Z2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmkgcGVyIGVsZW1lbnRpIHNlbGV6aW9uYXRpJ1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51U2VsZWN0aW9uc1wiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzbmFwc2hvdC50b3RhbFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW21hdEJhZGdlXT1cInNlbGVjdGlvbi5hbGwubGVuZ3RoXCJcclxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIj5wbGF5bGlzdF9hZGRfY2hlY2s8L21hdC1pY29uPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tbWVudS1kcm9wLWRvd25cIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICAgIDxtYXQtbWVudSAjbWVudVNlbGVjdGlvbnM9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgPGNsaXBwZXItZG9jdW1lbnQtbWVudSBbcGFyZW50XT1cInRoaXNcIiBzZWxlY3Rpb25Tb3VyY2U9XCJzZWxlY3Rpb25cIiBbdXNlU2VsZWN0aW9uc109XCJjYW5TZWxlY3QoKVwiXHJcbiAgICAgICAgICBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc0xhd0luRm9yY2VdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICA8L21hdC1tZW51PlxyXG4gICAgICBAaWYgKHNuYXBzaG90ICYmIHNuYXBzaG90LmZhY2V0cz8uaGFzRmFjZXRzICYmIGZpbHRlclBhbmUgJiYgKCFmaWx0ZXJQYW5lLm9wZW5lZCB8fCBmaWx0ZXJQYW5lQ2xvc2VkKSkge1xyXG4gICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWZmaW5hIHJpY2VyY2FcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCInQWZmaW5hIHJpY2VyY2EnXCIgKGNsaWNrKT1cInRvZ2dsZUZpbHRlclBhbmUoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5tZW51X29wZW48L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudCBpZD1cImNsaXBwZXItYnJvd3Nlci1zY3JvbGxhYmxlXCI+XHJcbiAgPG1hdC1kcmF3ZXItY29udGFpbmVyPlxyXG4gICAgPG1hdC1kcmF3ZXIgI2ZpbHRlclBhbmUgcG9zaXRpb249XCJlbmRcIiBjbGFzcz1cImRyYXdlci1zbWFsbFwiPlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgZnhGbGV4PVwiNDBweFwiIHN0eWxlPVwibWFyZ2luOjAgNHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxMHB4XCIgZnhGaWxsPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCIgY2xhc3M9XCJ0aXRsZVwiPkFmZmluYSByaWNlcmNhPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJQYW5lKClcIlxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5hc2NvbmRpXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBjbGFzcz1cInNjcm9sbC1oaWRkZW5cIj5cclxuICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1mYWNldHMgI2ZhY2V0cz48L2NsaXBwZXItc2VhcmNoLWZhY2V0cz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1kcmF3ZXI+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1zY3JvbGxlclwiPlxyXG4gICAgICAgIEBpZiAoIXNuYXBzaG90LnRvdGFsKSB7XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MzJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiPlxyXG4gICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgIE5vbiBoYWkgYW5jb3JhIGVmZmV0dHVhdG9cclxuICAgICAgICAgICAgbGEgdHVhIHByaW1hIHJpY2VyY2Egb3BwdXJlIGxhIHJpY2VyY2EgZWZmZXR0dWF0YSBub24gaGEgcHJvZG90dG8gYWxjdW4gcmlzdWx0YXRvLjwvcD5cclxuICAgICAgICAgIDxwPkluc2VyaXNjaSBuZWxsJ2FwcG9zaXRvIGNhbXBvIGNpw7IgY2hlIGludGVuZGkgY2VyY2FyZSBlIGZhaSBjbGljayBzdSA8Yj5Ucm92YTwvYj4gb3BwdXJlIHV0aWxpenphXHJcbiAgICAgICAgICAgIGxhXHJcbiAgICAgICAgICAgIDxiPlJpY2VyY2EgYXZhbnphdGE8L2I+XHJcbiAgICAgICAgICA8L3A+LlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIHNuYXBzaG90Lml0ZW1zOyB0cmFjayBpdGVtOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgPGRpdiAoY29udGV4dG1lbnUpPVwib25Db250ZXh0TWVudSgkZXZlbnQsIGl0ZW0pXCIgKG1vdXNlZW50ZXIpPVwiaXRlbS5pc092ZXIgPSB0cnVlXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaXRlbS5pc092ZXIgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICBAaWYgKGl0ZW0uZ3JvdXApIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1zLWdyb3VwLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3NwYWNlZCc6IGkgPiAwfVwiPnt7aXRlbS5ncm91cH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjZweFwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeEZpbGwgY2xhc3M9XCJpdGVtXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2l0ZW0tc2VsZWN0ZWQnOiBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtLmRvY3VtZW50SWQpIH1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjQ4cHhcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKHNjcmVlblNlcnZpY2UuaXNUb3VjaGFibGUgfHwgaXRlbS5pc092ZXIgfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKGl0ZW0sIGl0ZW0uZG9jdW1lbnRJZCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cIml0ZW0tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBwZXItc2VhcmNoLXJlc3VsdC1pdGVtIFtpdGVtXT1cIml0ZW1cIiBbcGFyZW50XT1cInRoaXNcIj48L2NsaXBwZXItc2VhcmNoLXJlc3VsdC1pdGVtPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pc092ZXIgfHwgaXRlbS5pc01lbnVPcGVuIHx8IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0uZG9jdW1lbnRJZCkpIHtcclxuICAgICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNZW51XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pJ1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCIgKGNsaWNrKT1cIml0ZW0uaXNNZW51T3BlbiA9IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICNjb250ZXh0TWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiIHN0eWxlPVwicG9zaXRpb246IGZpeGVkXCIgW3N0eWxlLmxlZnRdPVwiY29udGV4dE1lbnVQb3NpdGlvbi54XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8bWF0LW1lbnUgI2NvbnRleHRNZW51PVwibWF0TWVudVwiIChjbG9zZWQpPVwidXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW2l0ZW1dPVwiaXRlbVwiIFt1c2VTZWxlY3Rpb25zXT1cImNhblNlbGVjdCgpXCIgW2lzUmVhZGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2lzTGF3SW5Gb3JjZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gZm9vdGVyIC0tPlxyXG4gICAgICBAaWYgKChzbmFwc2hvdD8udG90YWwgPz8gMCkgPiAwKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtcy1mb290ZXJcIj5cclxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxMHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEZpbGw+XHJcbiAgICAgICAgICA8bWF0LXBhZ2luYXRvciAjcGFnaW5hdG9yIGNsYXNzPVwicGFnaW5hdG9yXCIgW2hpZGVQYWdlU2l6ZV09XCJ0cnVlXCIgW2xlbmd0aF09XCJzbmFwc2hvdD8udG90YWwgPz8gMFwiXHJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJmaWx0ZXJQYXJhbXMuY291bnQgPz8gMTVcIiBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwidHJ1ZVwiIChwYWdlKT1cImZldGNoTW9yZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L21hdC1kcmF3ZXItY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
|