@valtimo/document 10.8.0 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/lib/document.module.mjs +5 -5
- package/esm2022/lib/document.service.mjs +250 -0
- package/{esm2020 → esm2022}/lib/models/document.model.mjs +1 -1
- package/{fesm2020 → fesm2022}/valtimo-document.mjs +46 -45
- package/fesm2022/valtimo-document.mjs.map +1 -0
- package/lib/document.service.d.ts +10 -8
- package/lib/document.service.d.ts.map +1 -1
- package/lib/models/document.model.d.ts +2 -2
- package/lib/models/document.model.d.ts.map +1 -1
- package/lib/models/list-sorting.model.d.ts +1 -1
- package/lib/models/list-sorting.model.d.ts.map +1 -1
- package/package.json +8 -14
- package/esm2020/lib/document.service.mjs +0 -252
- package/fesm2015/valtimo-document.mjs +0 -485
- package/fesm2015/valtimo-document.mjs.map +0 -1
- package/fesm2020/valtimo-document.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/advanced-document-search-request.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/document-search-request.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/audit.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/list-sorting.model.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/valtimo-document.mjs +0 -0
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2023 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Injectable } from '@angular/core';
|
|
17
|
-
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
18
|
-
import { catchError, of } from 'rxjs';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "@angular/common/http";
|
|
21
|
-
import * as i2 from "@valtimo/config";
|
|
22
|
-
export class DocumentService {
|
|
23
|
-
constructor(http, configService) {
|
|
24
|
-
this.http = http;
|
|
25
|
-
this.EMPTY_DOCUMENTS_RESPONSE = {
|
|
26
|
-
content: [],
|
|
27
|
-
empty: true,
|
|
28
|
-
first: false,
|
|
29
|
-
last: false,
|
|
30
|
-
number: 0,
|
|
31
|
-
numberOfElements: 0,
|
|
32
|
-
size: 0,
|
|
33
|
-
sort: false,
|
|
34
|
-
totalElements: 0,
|
|
35
|
-
totalPages: 0,
|
|
36
|
-
};
|
|
37
|
-
this.valtimoEndpointUri = configService.config.valtimoApi.endpointUri;
|
|
38
|
-
}
|
|
39
|
-
// Document-calls
|
|
40
|
-
getAllDefinitions() {
|
|
41
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-definition`);
|
|
42
|
-
}
|
|
43
|
-
queryDefinitions(params) {
|
|
44
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-definition`, { params });
|
|
45
|
-
}
|
|
46
|
-
getDocumentDefinition(documentDefinitionName) {
|
|
47
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-definition/${documentDefinitionName}`);
|
|
48
|
-
}
|
|
49
|
-
getDocuments(documentSearchRequest) {
|
|
50
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document-search`, documentSearchRequest.asHttpBody(), {
|
|
51
|
-
params: documentSearchRequest.asHttpParams(),
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
getDocumentsSearch(documentSearchRequest, searchOperator, assigneeFilter, otherFilters) {
|
|
55
|
-
const body = documentSearchRequest.asHttpBody();
|
|
56
|
-
if (searchOperator) {
|
|
57
|
-
body.searchOperator = searchOperator;
|
|
58
|
-
}
|
|
59
|
-
if (assigneeFilter) {
|
|
60
|
-
body.assigneeFilter = assigneeFilter;
|
|
61
|
-
}
|
|
62
|
-
if (otherFilters) {
|
|
63
|
-
body.otherFilters = otherFilters;
|
|
64
|
-
}
|
|
65
|
-
return this.http
|
|
66
|
-
.post(`${this.valtimoEndpointUri}v1/document-definition/${documentSearchRequest.definitionName}/search`, body, { params: documentSearchRequest.asHttpParams() })
|
|
67
|
-
.pipe(catchError(() => of(this.EMPTY_DOCUMENTS_RESPONSE)));
|
|
68
|
-
}
|
|
69
|
-
getSpecifiedDocumentsSearch(documentSearchRequest, searchOperator, assigneeFilter, otherFilters) {
|
|
70
|
-
const body = documentSearchRequest.asHttpBody();
|
|
71
|
-
if (searchOperator) {
|
|
72
|
-
body.searchOperator = searchOperator;
|
|
73
|
-
}
|
|
74
|
-
if (assigneeFilter) {
|
|
75
|
-
body.assigneeFilter = assigneeFilter;
|
|
76
|
-
}
|
|
77
|
-
if (otherFilters) {
|
|
78
|
-
body.otherFilters = otherFilters;
|
|
79
|
-
}
|
|
80
|
-
return this.http
|
|
81
|
-
.post(`${this.valtimoEndpointUri}v1/case/${documentSearchRequest.definitionName}/search`, body, { params: documentSearchRequest.asHttpParams() })
|
|
82
|
-
.pipe(catchError(() => of(this.EMPTY_DOCUMENTS_RESPONSE)));
|
|
83
|
-
}
|
|
84
|
-
getDocumentSearchFields(documentDefinitionName) {
|
|
85
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-search/${documentDefinitionName}/fields`);
|
|
86
|
-
}
|
|
87
|
-
putDocumentSearch(documentDefinitionName, request) {
|
|
88
|
-
return this.http.put(`${this.valtimoEndpointUri}v1/document-search/${documentDefinitionName}/fields`, [...request]);
|
|
89
|
-
}
|
|
90
|
-
postDocumentSearch(documentDefinitionName, request) {
|
|
91
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document-search/${documentDefinitionName}/fields`, { ...request });
|
|
92
|
-
}
|
|
93
|
-
deleteDocumentSearch(documentDefinitionName, key) {
|
|
94
|
-
const options = {
|
|
95
|
-
headers: new HttpHeaders({
|
|
96
|
-
'Content-Type': 'application/json',
|
|
97
|
-
}),
|
|
98
|
-
};
|
|
99
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/document-search/${documentDefinitionName}/fields?key=${key}`, options);
|
|
100
|
-
}
|
|
101
|
-
getDropdownDataProviders() {
|
|
102
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/data/dropdown-list/provider`);
|
|
103
|
-
}
|
|
104
|
-
getDropdownData(provider, documentDefinitionName, fieldKey) {
|
|
105
|
-
const dropdownListKey = encodeURI(documentDefinitionName + '_' + fieldKey);
|
|
106
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/data/dropdown-list?provider=${provider}&key=${dropdownListKey}`);
|
|
107
|
-
}
|
|
108
|
-
postDropdownData(provider, documentDefinitionName, fieldKey, dropdownData) {
|
|
109
|
-
const dropdownListKey = encodeURI(documentDefinitionName + '_' + fieldKey);
|
|
110
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/data/dropdown-list?provider=${provider}&key=${dropdownListKey}`, dropdownData);
|
|
111
|
-
}
|
|
112
|
-
deleteDropdownData(provider, documentDefinitionName, fieldKey) {
|
|
113
|
-
const dropdownListKey = encodeURI(documentDefinitionName + '_' + fieldKey);
|
|
114
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/data/dropdown-list?provider=${provider}&key=${dropdownListKey}`);
|
|
115
|
-
}
|
|
116
|
-
getDocumentRoles(documentDefinitionName) {
|
|
117
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-definition/${documentDefinitionName}/roles`);
|
|
118
|
-
}
|
|
119
|
-
modifyDocumentRoles(documentDefinitionName, roles) {
|
|
120
|
-
return this.http.put(`${this.valtimoEndpointUri}v1/document-definition/${documentDefinitionName}/roles`, roles);
|
|
121
|
-
}
|
|
122
|
-
getDocument(documentId) {
|
|
123
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document/${documentId}`);
|
|
124
|
-
}
|
|
125
|
-
modifyDocument(document) {
|
|
126
|
-
return this.http.put(`${this.valtimoEndpointUri}v1/document`, document);
|
|
127
|
-
}
|
|
128
|
-
// ProcessDocument-calls
|
|
129
|
-
getProcessDocumentDefinitions() {
|
|
130
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/definition`);
|
|
131
|
-
}
|
|
132
|
-
findProcessDocumentDefinitions(documentDefinitionName) {
|
|
133
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/definition/document/${documentDefinitionName}`);
|
|
134
|
-
}
|
|
135
|
-
findProcessDocumentDefinitionsByProcessDefinitionKey(processDefinitionKey) {
|
|
136
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/definition/process/${processDefinitionKey}`);
|
|
137
|
-
}
|
|
138
|
-
findProcessDocumentInstances(documentId) {
|
|
139
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/instance/document/${documentId}`);
|
|
140
|
-
}
|
|
141
|
-
newDocumentAndStartProcess(request) {
|
|
142
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/process-document/operation/new-document-and-start-process`, request);
|
|
143
|
-
}
|
|
144
|
-
modifyDocumentAndCompleteTask(request) {
|
|
145
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/process-document/operation/modify-document-and-complete-task`, request);
|
|
146
|
-
}
|
|
147
|
-
modifyDocumentAndStartProcess(request) {
|
|
148
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/process-document/operation/modify-document-and-start-process`, request);
|
|
149
|
-
}
|
|
150
|
-
createProcessDocumentDefinition(request) {
|
|
151
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/process-document/definition`, request);
|
|
152
|
-
}
|
|
153
|
-
createDocumentDefinition(documentDefinitionCreateRequest) {
|
|
154
|
-
const options = {
|
|
155
|
-
headers: new HttpHeaders({
|
|
156
|
-
'Content-Type': 'application/json',
|
|
157
|
-
}),
|
|
158
|
-
};
|
|
159
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document-definition`, documentDefinitionCreateRequest, options);
|
|
160
|
-
}
|
|
161
|
-
deleteProcessDocumentDefinition(request) {
|
|
162
|
-
const options = {
|
|
163
|
-
headers: new HttpHeaders({
|
|
164
|
-
'Content-Type': 'application/json',
|
|
165
|
-
}),
|
|
166
|
-
body: request,
|
|
167
|
-
};
|
|
168
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/process-document/definition`, options);
|
|
169
|
-
}
|
|
170
|
-
getAuditLog(documentId, page = 0) {
|
|
171
|
-
let params = new HttpParams();
|
|
172
|
-
params = params.set('page', page.toString());
|
|
173
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/instance/document/${documentId}/audit`, { params });
|
|
174
|
-
}
|
|
175
|
-
assignResource(documentId, resourceId) {
|
|
176
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document/${documentId}/resource/${resourceId}`, {});
|
|
177
|
-
}
|
|
178
|
-
removeResource(documentId, resourceId) {
|
|
179
|
-
const options = {
|
|
180
|
-
headers: new HttpHeaders({
|
|
181
|
-
'Content-Type': 'application/json',
|
|
182
|
-
}),
|
|
183
|
-
};
|
|
184
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/document/${documentId}/resource/${resourceId}`, options);
|
|
185
|
-
}
|
|
186
|
-
removeDocumentDefinition(name) {
|
|
187
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/document-definition/${name}`);
|
|
188
|
-
}
|
|
189
|
-
sendMessage(documentId, request) {
|
|
190
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document/${documentId}/message`, request);
|
|
191
|
-
}
|
|
192
|
-
getDocumentTypes(documentDefinitionName) {
|
|
193
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/documentdefinition/${documentDefinitionName}/zaaktype/documenttype`);
|
|
194
|
-
}
|
|
195
|
-
getLinkedUploadProcess(documentDefinitionName) {
|
|
196
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/demo/${documentDefinitionName}/process`);
|
|
197
|
-
}
|
|
198
|
-
updateLinkedUploadProcess(documentDefinitionName, processDefinitionKey) {
|
|
199
|
-
return this.http.put(`${this.valtimoEndpointUri}v1/process-document/demo/${documentDefinitionName}/process`, {
|
|
200
|
-
processDefinitionKey,
|
|
201
|
-
linkType: 'DOCUMENT_UPLOAD',
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
deleteLinkedUploadProcess(documentDefinitionName) {
|
|
205
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/process-document/demo/${documentDefinitionName}/process`);
|
|
206
|
-
}
|
|
207
|
-
getProcessDocumentDefinitionFromProcessInstanceId(processInstanceId) {
|
|
208
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/process-document/definition/processinstance/${processInstanceId}`);
|
|
209
|
-
}
|
|
210
|
-
assignHandlerToDocument(documentId, assigneeId) {
|
|
211
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document/${documentId}/assign`, { assigneeId });
|
|
212
|
-
}
|
|
213
|
-
unassignHandlerFromDocument(documentId) {
|
|
214
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/document/${documentId}/unassign`, {});
|
|
215
|
-
}
|
|
216
|
-
getCandidateUsers(documentId) {
|
|
217
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document/${documentId}/candidate-user`);
|
|
218
|
-
}
|
|
219
|
-
getOpenDocumentCount() {
|
|
220
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/document-definition/open/count`);
|
|
221
|
-
}
|
|
222
|
-
patchCaseSettings(documentDefinitionName, request) {
|
|
223
|
-
return this.http.patch(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/settings`, { ...request });
|
|
224
|
-
}
|
|
225
|
-
getCaseSettings(documentDefinitionName) {
|
|
226
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/settings`);
|
|
227
|
-
}
|
|
228
|
-
getCaseList(documentDefinitionName) {
|
|
229
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/list-column`);
|
|
230
|
-
}
|
|
231
|
-
postCaseList(documentDefinitionName, request) {
|
|
232
|
-
return this.http.post(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/list-column`, { ...request });
|
|
233
|
-
}
|
|
234
|
-
putCaseList(documentDefinitionName, request) {
|
|
235
|
-
return this.http.put(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/list-column`, [...request]);
|
|
236
|
-
}
|
|
237
|
-
deleteCaseList(documentDefinitionName, columnKey) {
|
|
238
|
-
return this.http.delete(`${this.valtimoEndpointUri}v1/case/${documentDefinitionName}/list-column/${columnKey}`);
|
|
239
|
-
}
|
|
240
|
-
getZakenApiDocuments(documentId) {
|
|
241
|
-
return this.http.get(`${this.valtimoEndpointUri}v1/zaken-api/document/${documentId}/files`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
DocumentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DocumentService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
245
|
-
DocumentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DocumentService, providedIn: 'root' });
|
|
246
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DocumentService, decorators: [{
|
|
247
|
-
type: Injectable,
|
|
248
|
-
args: [{
|
|
249
|
-
providedIn: 'root',
|
|
250
|
-
}]
|
|
251
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigService }]; } });
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9jdW1lbnQvc3JjL2xpYi9kb2N1bWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxVQUFVLEVBQWMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7O0FBNkNoRCxNQUFNLE9BQU8sZUFBZTtJQWdCMUIsWUFBb0IsSUFBZ0IsRUFBRSxhQUE0QjtRQUE5QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBYm5CLDZCQUF3QixHQUFtQztZQUMxRSxPQUFPLEVBQUUsRUFBRTtZQUNYLEtBQUssRUFBRSxJQUFJO1lBQ1gsS0FBSyxFQUFFLEtBQUs7WUFDWixJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxDQUFDO1lBQ1QsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxLQUFLO1lBQ1gsYUFBYSxFQUFFLENBQUM7WUFDaEIsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDO1FBR0EsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUN4RSxDQUFDO0lBRUQsaUJBQWlCO0lBQ1YsaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXNCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQix3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENB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Q2xCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQix5QkFBeUIsVUFBVSxRQUFRLENBQ3RFLENBQUM7SUFDSixDQUFDOzs0R0EzYlUsZUFBZTtnSEFBZixlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEFzc2lnbkhhbmRsZXJUb0RvY3VtZW50UmVzdWx0LFxuICBBdWRpdFJlY29yZCxcbiAgQ2FzZUxpc3RDb2x1bW4sXG4gIENhc2VTZXR0aW5ncyxcbiAgRG9jdW1lbnQsXG4gIERvY3VtZW50RGVmaW5pdGlvbixcbiAgRG9jdW1lbnREZWZpbml0aW9uQ3JlYXRlUmVxdWVzdCxcbiAgRG9jdW1lbnREZWZpbml0aW9ucyxcbiAgRG9jdW1lbnRSZXN1bHQsXG4gIERvY3VtZW50cyxcbiAgRG9jdW1lbnRTZW5kTWVzc2FnZVJlcXVlc3QsXG4gIERvY3VtZW50VHlwZSxcbiAgTW9kaWZ5RG9jdW1lbnRBbmRDb21wbGV0ZVRhc2tSZXF1ZXN0SW1wbCxcbiAgTW9kaWZ5RG9jdW1lbnRBbmRDb21wbGV0ZVRhc2tSZXN1bHQsXG4gIE1vZGlmeURvY3VtZW50QW5kU3RhcnRQcm9jZXNzUmVxdWVzdEltcGwsXG4gIE1vZGlmeURvY3VtZW50QW5kU3RhcnRQcm9jZXNzUmVzdWx0LFxuICBOZXdEb2N1bWVudEFuZFN0YXJ0UHJvY2Vzc1JlcXVlc3RJbXBsLFxuICBOZXdEb2N1bWVudEFuZFN0YXJ0UHJvY2Vzc1Jlc3VsdCxcbiAgT3BlbkRvY3VtZW50Q291bnQsXG4gIFBhZ2UsXG4gIFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24sXG4gIFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25SZXF1ZXN0LFxuICBQcm9jZXNzRG9jdW1lbnRJbnN0YW5jZSxcbiAgUmVsYXRlZEZpbGUsXG4gIFNwZWNpZmllZERvY3VtZW50cyxcbiAgVW5kZXBsb3lEb2N1bWVudERlZmluaXRpb25SZXN1bHQsXG4gIFVwbG9hZFByb2Nlc3NMaW5rLFxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge0RvY3VtZW50U2VhcmNoUmVxdWVzdH0gZnJvbSAnLi9kb2N1bWVudC1zZWFyY2gtcmVxdWVzdCc7XG5pbXBvcnQge1xuICBBc3NpZ25lZUZpbHRlcixcbiAgQ29uZmlnU2VydmljZSxcbiAgTmFtZWRVc2VyLFxuICBTZWFyY2hGaWVsZCxcbiAgU2VhcmNoRmlsdGVyLFxuICBTZWFyY2hGaWx0ZXJSYW5nZSxcbiAgU2VhcmNoT3BlcmF0b3IsXG59IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0FkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0fSBmcm9tICcuL2FkdmFuY2VkLWRvY3VtZW50LXNlYXJjaC1yZXF1ZXN0JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERvY3VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgdmFsdGltb0VuZHBvaW50VXJpOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBFTVBUWV9ET0NVTUVOVFNfUkVTUE9OU0U6IERvY3VtZW50cyB8IFNwZWNpZmllZERvY3VtZW50cyA9IHtcbiAgICBjb250ZW50OiBbXSxcbiAgICBlbXB0eTogdHJ1ZSxcbiAgICBmaXJzdDogZmFsc2UsXG4gICAgbGFzdDogZmFsc2UsXG4gICAgbnVtYmVyOiAwLFxuICAgIG51bWJlck9mRWxlbWVudHM6IDAsXG4gICAgc2l6ZTogMCxcbiAgICBzb3J0OiBmYWxzZSxcbiAgICB0b3RhbEVsZW1lbnRzOiAwLFxuICAgIHRvdGFsUGFnZXM6IDAsXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlKSB7XG4gICAgdGhpcy52YWx0aW1vRW5kcG9pbnRVcmkgPSBjb25maWdTZXJ2aWNlLmNvbmZpZy52YWx0aW1vQXBpLmVuZHBvaW50VXJpO1xuICB9XG5cbiAgLy8gRG9jdW1lbnQtY2FsbHNcbiAgcHVibGljIGdldEFsbERlZmluaXRpb25zKCk6IE9ic2VydmFibGU8RG9jdW1lbnREZWZpbml0aW9ucz4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PERvY3VtZW50RGVmaW5pdGlvbnM+KGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LWRlZmluaXRpb25gKTtcbiAgfVxuXG4gIHF1ZXJ5RGVmaW5pdGlvbnMocGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxQYWdlPERvY3VtZW50RGVmaW5pdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxQYWdlPERvY3VtZW50RGVmaW5pdGlvbj4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtZGVmaW5pdGlvbmAsXG4gICAgICB7cGFyYW1zfVxuICAgICk7XG4gIH1cblxuICBnZXREb2N1bWVudERlZmluaXRpb24oZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb2N1bWVudERlZmluaXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxEb2N1bWVudERlZmluaXRpb24+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtZGVmaW5pdGlvbi8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YFxuICAgICk7XG4gIH1cblxuICBnZXREb2N1bWVudHMoZG9jdW1lbnRTZWFyY2hSZXF1ZXN0OiBEb2N1bWVudFNlYXJjaFJlcXVlc3QpOiBPYnNlcnZhYmxlPERvY3VtZW50cz4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxEb2N1bWVudHM+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtc2VhcmNoYCxcbiAgICAgIGRvY3VtZW50U2VhcmNoUmVxdWVzdC5hc0h0dHBCb2R5KCksXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LmFzSHR0cFBhcmFtcygpLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXREb2N1bWVudHNTZWFyY2goXG4gICAgZG9jdW1lbnRTZWFyY2hSZXF1ZXN0OiBBZHZhbmNlZERvY3VtZW50U2VhcmNoUmVxdWVzdCxcbiAgICBzZWFyY2hPcGVyYXRvcj86IFNlYXJjaE9wZXJhdG9yLFxuICAgIGFzc2lnbmVlRmlsdGVyPzogQXNzaWduZWVGaWx0ZXIsXG4gICAgb3RoZXJGaWx0ZXJzPzogQXJyYXk8U2VhcmNoRmlsdGVyIHwgU2VhcmNoRmlsdGVyUmFuZ2U+XG4gICk6IE9ic2VydmFibGU8RG9jdW1lbnRzPiB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50U2VhcmNoUmVxdWVzdC5hc0h0dHBCb2R5KCk7XG5cbiAgICBpZiAoc2VhcmNoT3BlcmF0b3IpIHtcbiAgICAgIGJvZHkuc2VhcmNoT3BlcmF0b3IgPSBzZWFyY2hPcGVyYXRvcjtcbiAgICB9XG5cbiAgICBpZiAoYXNzaWduZWVGaWx0ZXIpIHtcbiAgICAgIGJvZHkuYXNzaWduZWVGaWx0ZXIgPSBhc3NpZ25lZUZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJGaWx0ZXJzKSB7XG4gICAgICBib2R5Lm90aGVyRmlsdGVycyA9IG90aGVyRmlsdGVycztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxEb2N1bWVudHM+KFxuICAgICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9kb2N1bWVudC1kZWZpbml0aW9uLyR7ZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LmRlZmluaXRpb25OYW1lfS9zZWFyY2hgLFxuICAgICAgICBib2R5LFxuICAgICAgICB7cGFyYW1zOiBkb2N1bWVudFNlYXJjaFJlcXVlc3QuYXNIdHRwUGFyYW1zKCl9XG4gICAgICApXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKHRoaXMuRU1QVFlfRE9DVU1FTlRTX1JFU1BPTlNFIGFzIERvY3VtZW50cykpKTtcbiAgfVxuXG4gIGdldFNwZWNpZmllZERvY3VtZW50c1NlYXJjaChcbiAgICBkb2N1bWVudFNlYXJjaFJlcXVlc3Q6IEFkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0LFxuICAgIHNlYXJjaE9wZXJhdG9yPzogU2VhcmNoT3BlcmF0b3IsXG4gICAgYXNzaWduZWVGaWx0ZXI/OiBBc3NpZ25lZUZpbHRlcixcbiAgICBvdGhlckZpbHRlcnM/OiBBcnJheTxTZWFyY2hGaWx0ZXIgfCBTZWFyY2hGaWx0ZXJSYW5nZT5cbiAgKTogT2JzZXJ2YWJsZTxTcGVjaWZpZWREb2N1bWVudHM+IHtcbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LmFzSHR0cEJvZHkoKTtcblxuICAgIGlmIChzZWFyY2hPcGVyYXRvcikge1xuICAgICAgYm9keS5zZWFyY2hPcGVyYXRvciA9IHNlYXJjaE9wZXJhdG9yO1xuICAgIH1cblxuICAgIGlmIChhc3NpZ25lZUZpbHRlcikge1xuICAgICAgYm9keS5hc3NpZ25lZUZpbHRlciA9IGFzc2lnbmVlRmlsdGVyO1xuICAgIH1cblxuICAgIGlmIChvdGhlckZpbHRlcnMpIHtcbiAgICAgIGJvZHkub3RoZXJGaWx0ZXJzID0gb3RoZXJGaWx0ZXJzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNwZWNpZmllZERvY3VtZW50cz4oXG4gICAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2Nhc2UvJHtkb2N1bWVudFNlYXJjaFJlcXVlc3QuZGVmaW5pdGlvbk5hbWV9L3NlYXJjaGAsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHtwYXJhbXM6IGRvY3VtZW50U2VhcmNoUmVxdWVzdC5hc0h0dHBQYXJhbXMoKX1cbiAgICAgIClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YodGhpcy5FTVBUWV9ET0NVTUVOVFNfUkVTUE9OU0UgYXMgU3BlY2lmaWVkRG9jdW1lbnRzKSkpO1xuICB9XG5cbiAgZ2V0RG9jdW1lbnRTZWFyY2hGaWVsZHMoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxTZWFyY2hGaWVsZD4+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxTZWFyY2hGaWVsZD4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtc2VhcmNoLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vZmllbGRzYFxuICAgICk7XG4gIH1cblxuICBwdXREb2N1bWVudFNlYXJjaChkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsIHJlcXVlc3Q6IEFycmF5PFNlYXJjaEZpZWxkPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtc2VhcmNoLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vZmllbGRzYCxcbiAgICAgIFsuLi5yZXF1ZXN0XVxuICAgICk7XG4gIH1cblxuICBwb3N0RG9jdW1lbnRTZWFyY2goZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLCByZXF1ZXN0OiBTZWFyY2hGaWVsZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx2b2lkPihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LXNlYXJjaC8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L2ZpZWxkc2AsXG4gICAgICB7Li4ucmVxdWVzdH1cbiAgICApO1xuICB9XG5cbiAgZGVsZXRlRG9jdW1lbnRTZWFyY2goZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtc2VhcmNoLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vZmllbGRzP2tleT0ke2tleX1gLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cblxuICBnZXREcm9wZG93bkRhdGFQcm92aWRlcnMoKTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8c3RyaW5nPj4oYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZGF0YS9kcm9wZG93bi1saXN0L3Byb3ZpZGVyYCk7XG4gIH1cblxuICBnZXREcm9wZG93bkRhdGEoXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgZmllbGRLZXk6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPG9iamVjdD4ge1xuICAgIGNvbnN0IGRyb3Bkb3duTGlzdEtleSA9IGVuY29kZVVSSShkb2N1bWVudERlZmluaXRpb25OYW1lICsgJ18nICsgZmllbGRLZXkpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG9iamVjdD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9kYXRhL2Ryb3Bkb3duLWxpc3Q/cHJvdmlkZXI9JHtwcm92aWRlcn0ma2V5PSR7ZHJvcGRvd25MaXN0S2V5fWBcbiAgICApO1xuICB9XG5cbiAgcG9zdERyb3Bkb3duRGF0YShcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIGRyb3Bkb3duRGF0YTogb2JqZWN0XG4gICk6IE9ic2VydmFibGU8b2JqZWN0PiB7XG4gICAgY29uc3QgZHJvcGRvd25MaXN0S2V5ID0gZW5jb2RlVVJJKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgKyAnXycgKyBmaWVsZEtleSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PG9iamVjdD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9kYXRhL2Ryb3Bkb3duLWxpc3Q/cHJvdmlkZXI9JHtwcm92aWRlcn0ma2V5PSR7ZHJvcGRvd25MaXN0S2V5fWAsXG4gICAgICBkcm9wZG93bkRhdGFcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlRHJvcGRvd25EYXRhKFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkS2V5OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxvYmplY3Q+IHtcbiAgICBjb25zdCBkcm9wZG93bkxpc3RLZXkgPSBlbmNvZGVVUkkoZG9jdW1lbnREZWZpbml0aW9uTmFtZSArICdfJyArIGZpZWxkS2V5KTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxvYmplY3Q+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZGF0YS9kcm9wZG93bi1saXN0P3Byb3ZpZGVyPSR7cHJvdmlkZXJ9JmtleT0ke2Ryb3Bkb3duTGlzdEtleX1gXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREb2N1bWVudFJvbGVzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PHN0cmluZz4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtZGVmaW5pdGlvbi8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L3JvbGVzYFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5RG9jdW1lbnRSb2xlcyhkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsIHJvbGVzOiBhbnkpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LWRlZmluaXRpb24vJHtkb2N1bWVudERlZmluaXRpb25OYW1lfS9yb2xlc2AsXG4gICAgICByb2xlc1xuICAgICk7XG4gIH1cblxuICBnZXREb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8RG9jdW1lbnQ+KGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LyR7ZG9jdW1lbnRJZH1gKTtcbiAgfVxuXG4gIG1vZGlmeURvY3VtZW50KGRvY3VtZW50OiBhbnkpOiBPYnNlcnZhYmxlPERvY3VtZW50UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8RG9jdW1lbnRSZXN1bHQ+KGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50YCwgZG9jdW1lbnQpO1xuICB9XG5cbiAgLy8gUHJvY2Vzc0RvY3VtZW50LWNhbGxzXG4gIGdldFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zKCk6IE9ic2VydmFibGU8UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9kZWZpbml0aW9uYFxuICAgICk7XG4gIH1cblxuICBmaW5kUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMoXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbltdPihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL3Byb2Nlc3MtZG9jdW1lbnQvZGVmaW5pdGlvbi9kb2N1bWVudC8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YFxuICAgICk7XG4gIH1cblxuICBmaW5kUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNCeVByb2Nlc3NEZWZpbml0aW9uS2V5KFxuICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uW10+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9kZWZpbml0aW9uL3Byb2Nlc3MvJHtwcm9jZXNzRGVmaW5pdGlvbktleX1gXG4gICAgKTtcbiAgfVxuXG4gIGZpbmRQcm9jZXNzRG9jdW1lbnRJbnN0YW5jZXMoZG9jdW1lbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcm9jZXNzRG9jdW1lbnRJbnN0YW5jZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UHJvY2Vzc0RvY3VtZW50SW5zdGFuY2VbXT4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L2luc3RhbmNlL2RvY3VtZW50LyR7ZG9jdW1lbnRJZH1gXG4gICAgKTtcbiAgfVxuXG4gIG5ld0RvY3VtZW50QW5kU3RhcnRQcm9jZXNzKFxuICAgIHJlcXVlc3Q6IE5ld0RvY3VtZW50QW5kU3RhcnRQcm9jZXNzUmVxdWVzdEltcGxcbiAgKTogT2JzZXJ2YWJsZTxOZXdEb2N1bWVudEFuZFN0YXJ0UHJvY2Vzc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOZXdEb2N1bWVudEFuZFN0YXJ0UHJvY2Vzc1Jlc3VsdD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L29wZXJhdGlvbi9uZXctZG9jdW1lbnQtYW5kLXN0YXJ0LXByb2Nlc3NgLFxuICAgICAgcmVxdWVzdFxuICAgICk7XG4gIH1cblxuICBtb2RpZnlEb2N1bWVudEFuZENvbXBsZXRlVGFzayhcbiAgICByZXF1ZXN0OiBNb2RpZnlEb2N1bWVudEFuZENvbXBsZXRlVGFza1JlcXVlc3RJbXBsXG4gICk6IE9ic2VydmFibGU8TW9kaWZ5RG9jdW1lbnRBbmRDb21wbGV0ZVRhc2tSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TW9kaWZ5RG9jdW1lbnRBbmRDb21wbGV0ZVRhc2tSZXN1bHQ+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9vcGVyYXRpb24vbW9kaWZ5LWRvY3VtZW50LWFuZC1jb21wbGV0ZS10YXNrYCxcbiAgICAgIHJlcXVlc3RcbiAgICApO1xuICB9XG5cbiAgbW9kaWZ5RG9jdW1lbnRBbmRTdGFydFByb2Nlc3MoXG4gICAgcmVxdWVzdDogTW9kaWZ5RG9jdW1lbnRBbmRTdGFydFByb2Nlc3NSZXF1ZXN0SW1wbFxuICApOiBPYnNlcnZhYmxlPE1vZGlmeURvY3VtZW50QW5kU3RhcnRQcm9jZXNzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1vZGlmeURvY3VtZW50QW5kU3RhcnRQcm9jZXNzUmVzdWx0PihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL3Byb2Nlc3MtZG9jdW1lbnQvb3BlcmF0aW9uL21vZGlmeS1kb2N1bWVudC1hbmQtc3RhcnQtcHJvY2Vzc2AsXG4gICAgICByZXF1ZXN0XG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVByb2Nlc3NEb2N1bWVudERlZmluaXRpb24oXG4gICAgcmVxdWVzdDogUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvblJlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTxQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9kZWZpbml0aW9uYCxcbiAgICAgIHJlcXVlc3RcbiAgICApO1xuICB9XG5cbiAgY3JlYXRlRG9jdW1lbnREZWZpbml0aW9uKFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbkNyZWF0ZVJlcXVlc3Q6IERvY3VtZW50RGVmaW5pdGlvbkNyZWF0ZVJlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx2b2lkPihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LWRlZmluaXRpb25gLFxuICAgICAgZG9jdW1lbnREZWZpbml0aW9uQ3JlYXRlUmVxdWVzdCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbihyZXF1ZXN0OiBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L2RlZmluaXRpb25gLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldEF1ZGl0TG9nKGRvY3VtZW50SWQ6IHN0cmluZywgcGFnZTogbnVtYmVyID0gMCk6IE9ic2VydmFibGU8UGFnZTxBdWRpdFJlY29yZD4+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYWdlJywgcGFnZS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxQYWdlPEF1ZGl0UmVjb3JkPj4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L2luc3RhbmNlL2RvY3VtZW50LyR7ZG9jdW1lbnRJZH0vYXVkaXRgLFxuICAgICAge3BhcmFtc31cbiAgICApO1xuICB9XG5cbiAgYXNzaWduUmVzb3VyY2UoZG9jdW1lbnRJZDogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9kb2N1bWVudC8ke2RvY3VtZW50SWR9L3Jlc291cmNlLyR7cmVzb3VyY2VJZH1gLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlUmVzb3VyY2UoZG9jdW1lbnRJZDogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9kb2N1bWVudC8ke2RvY3VtZW50SWR9L3Jlc291cmNlLyR7cmVzb3VyY2VJZH1gLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cblxuICByZW1vdmVEb2N1bWVudERlZmluaXRpb24obmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxVbmRlcGxveURvY3VtZW50RGVmaW5pdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFVuZGVwbG95RG9jdW1lbnREZWZpbml0aW9uUmVzdWx0PihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LWRlZmluaXRpb24vJHtuYW1lfWBcbiAgICApO1xuICB9XG5cbiAgc2VuZE1lc3NhZ2UoZG9jdW1lbnRJZDogc3RyaW5nLCByZXF1ZXN0OiBEb2N1bWVudFNlbmRNZXNzYWdlUmVxdWVzdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50LyR7ZG9jdW1lbnRJZH0vbWVzc2FnZWAsIHJlcXVlc3QpO1xuICB9XG5cbiAgZ2V0RG9jdW1lbnRUeXBlcyhkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFycmF5PERvY3VtZW50VHlwZT4+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxEb2N1bWVudFR5cGU+PihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2RvY3VtZW50ZGVmaW5pdGlvbi8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L3phYWt0eXBlL2RvY3VtZW50dHlwZWBcbiAgICApO1xuICB9XG5cbiAgZ2V0TGlua2VkVXBsb2FkUHJvY2Vzcyhkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVwbG9hZFByb2Nlc3NMaW5rPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VXBsb2FkUHJvY2Vzc0xpbms+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9kZW1vLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vcHJvY2Vzc2BcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlTGlua2VkVXBsb2FkUHJvY2VzcyhcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJvY2Vzc0RlZmluaXRpb25LZXk6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFVwbG9hZFByb2Nlc3NMaW5rPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBsb2FkUHJvY2Vzc0xpbms+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvcHJvY2Vzcy1kb2N1bWVudC9kZW1vLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vcHJvY2Vzc2AsXG4gICAgICB7XG4gICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICBsaW5rVHlwZTogJ0RPQ1VNRU5UX1VQTE9BRCcsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUxpbmtlZFVwbG9hZFByb2Nlc3MoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L2RlbW8vJHtkb2N1bWVudERlZmluaXRpb25OYW1lfS9wcm9jZXNzYFxuICAgICk7XG4gIH1cblxuICBnZXRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uRnJvbVByb2Nlc3NJbnN0YW5jZUlkKFxuICAgIHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbj4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9wcm9jZXNzLWRvY3VtZW50L2RlZmluaXRpb24vcHJvY2Vzc2luc3RhbmNlLyR7cHJvY2Vzc0luc3RhbmNlSWR9YFxuICAgICk7XG4gIH1cblxuICBhc3NpZ25IYW5kbGVyVG9Eb2N1bWVudChcbiAgICBkb2N1bWVudElkOiBzdHJpbmcsXG4gICAgYXNzaWduZWVJZDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8QXNzaWduSGFuZGxlclRvRG9jdW1lbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXNzaWduSGFuZGxlclRvRG9jdW1lbnRSZXN1bHQ+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQvJHtkb2N1bWVudElkfS9hc3NpZ25gLFxuICAgICAge2Fzc2lnbmVlSWR9XG4gICAgKTtcbiAgfVxuXG4gIHVuYXNzaWduSGFuZGxlckZyb21Eb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQvJHtkb2N1bWVudElkfS91bmFzc2lnbmAsIHt9KTtcbiAgfVxuXG4gIGdldENhbmRpZGF0ZVVzZXJzKGRvY3VtZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8TmFtZWRVc2VyPj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PE5hbWVkVXNlcj4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQvJHtkb2N1bWVudElkfS9jYW5kaWRhdGUtdXNlcmBcbiAgICApO1xuICB9XG5cbiAgZ2V0T3BlbkRvY3VtZW50Q291bnQoKTogT2JzZXJ2YWJsZTxBcnJheTxPcGVuRG9jdW1lbnRDb3VudD4+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxPcGVuRG9jdW1lbnRDb3VudD4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvZG9jdW1lbnQtZGVmaW5pdGlvbi9vcGVuL2NvdW50YFxuICAgICk7XG4gIH1cblxuICBwYXRjaENhc2VTZXR0aW5ncyhcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogQ2FzZVNldHRpbmdzXG4gICk6IE9ic2VydmFibGU8Q2FzZVNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxDYXNlU2V0dGluZ3M+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvY2FzZS8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L3NldHRpbmdzYCxcbiAgICAgIHsuLi5yZXF1ZXN0fVxuICAgICk7XG4gIH1cblxuICBnZXRDYXNlU2V0dGluZ3MoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXNlU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDYXNlU2V0dGluZ3M+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvY2FzZS8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L3NldHRpbmdzYFxuICAgICk7XG4gIH1cblxuICBnZXRDYXNlTGlzdChkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFycmF5PENhc2VMaXN0Q29sdW1uPj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENhc2VMaXN0Q29sdW1uPj4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9jYXNlLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vbGlzdC1jb2x1bW5gXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RDYXNlTGlzdChcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogQ2FzZUxpc3RDb2x1bW5cbiAgKTogT2JzZXJ2YWJsZTxDYXNlTGlzdENvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDYXNlTGlzdENvbHVtbj4oXG4gICAgICBgJHt0aGlzLnZhbHRpbW9FbmRwb2ludFVyaX12MS9jYXNlLyR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vbGlzdC1jb2x1bW5gLFxuICAgICAgey4uLnJlcXVlc3R9XG4gICAgKTtcbiAgfVxuXG4gIHB1dENhc2VMaXN0KFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0OiBBcnJheTxDYXNlTGlzdENvbHVtbj5cbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtbj4+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcnJheTxDYXNlTGlzdENvbHVtbj4+KFxuICAgICAgYCR7dGhpcy52YWx0aW1vRW5kcG9pbnRVcml9djEvY2FzZS8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L2xpc3QtY29sdW1uYCxcbiAgICAgIFsuLi5yZXF1ZXN0XVxuICAgICk7XG4gIH1cblxuICBkZWxldGVDYXNlTGlzdChkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsIGNvbHVtbktleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXNlTGlzdENvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPENhc2VMaXN0Q29sdW1uPihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL2Nhc2UvJHtkb2N1bWVudERlZmluaXRpb25OYW1lfS9saXN0LWNvbHVtbi8ke2NvbHVtbktleX1gXG4gICAgKTtcbiAgfVxuXG4gIGdldFpha2VuQXBpRG9jdW1lbnRzKGRvY3VtZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8UmVsYXRlZEZpbGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8UmVsYXRlZEZpbGU+PihcbiAgICAgIGAke3RoaXMudmFsdGltb0VuZHBvaW50VXJpfXYxL3pha2VuLWFwaS9kb2N1bWVudC8ke2RvY3VtZW50SWR9L2ZpbGVzYFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|