fabrikantencore 1.0.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.
Files changed (30) hide show
  1. package/README.md +27 -0
  2. package/esm2020/fabrikantencore.mjs +5 -0
  3. package/esm2020/public_api.mjs +4 -0
  4. package/esm2020/src/app/modules/fabrikantencore/beheer/components/beheer-inlog/beheer-inlog.component.mjs +17 -0
  5. package/esm2020/src/app/modules/fabrikantencore/beheer/components/beheer-main/beheer-main.component.mjs +14 -0
  6. package/esm2020/src/app/modules/fabrikantencore/components/fab-button/fab-button.component.mjs +21 -0
  7. package/esm2020/src/app/modules/fabrikantencore/components/fab-filters/fab-filters.component.mjs +23 -0
  8. package/esm2020/src/app/modules/fabrikantencore/fabrikantencore.module.mjs +83 -0
  9. package/esm2020/src/app/modules/fabrikantencore/helpers/auth.guard.mjs +29 -0
  10. package/esm2020/src/app/modules/fabrikantencore/helpers/basic-auth.interceptor.mjs +26 -0
  11. package/esm2020/src/app/modules/fabrikantencore/helpers/error.interceptor.mjs +27 -0
  12. package/esm2020/src/app/modules/fabrikantencore/services/authentication.service.mjs +44 -0
  13. package/esm2020/src/app/modules/fabrikantencore/swagger/SwaggerClient.mjs +341 -0
  14. package/fesm2015/fabrikantencore.mjs +588 -0
  15. package/fesm2015/fabrikantencore.mjs.map +1 -0
  16. package/fesm2020/fabrikantencore.mjs +584 -0
  17. package/fesm2020/fabrikantencore.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/package.json +42 -0
  20. package/public_api.d.ts +3 -0
  21. package/src/app/modules/fabrikantencore/beheer/components/beheer-inlog/beheer-inlog.component.d.ts +8 -0
  22. package/src/app/modules/fabrikantencore/beheer/components/beheer-main/beheer-main.component.d.ts +8 -0
  23. package/src/app/modules/fabrikantencore/components/fab-button/fab-button.component.d.ts +11 -0
  24. package/src/app/modules/fabrikantencore/components/fab-filters/fab-filters.component.d.ts +10 -0
  25. package/src/app/modules/fabrikantencore/fabrikantencore.module.d.ts +15 -0
  26. package/src/app/modules/fabrikantencore/helpers/auth.guard.d.ts +11 -0
  27. package/src/app/modules/fabrikantencore/helpers/basic-auth.interceptor.d.ts +11 -0
  28. package/src/app/modules/fabrikantencore/helpers/error.interceptor.d.ts +11 -0
  29. package/src/app/modules/fabrikantencore/services/authentication.service.d.ts +14 -0
  30. package/src/app/modules/fabrikantencore/swagger/SwaggerClient.d.ts +81 -0
@@ -0,0 +1,341 @@
1
+ //----------------------
2
+ // <auto-generated>
3
+ // Generated using the NSwag toolchain v13.16.1.0 (NJsonSchema v10.7.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
4
+ // </auto-generated>
5
+ //----------------------
6
+ /* tslint:disable */
7
+ /* eslint-disable */
8
+ // ReSharper disable InconsistentNaming
9
+ import { mergeMap as _observableMergeMap, catchError as _observableCatch } from 'rxjs/operators';
10
+ import { Observable, throwError as _observableThrow, of as _observableOf } from 'rxjs';
11
+ import { Injectable, Inject, Optional, InjectionToken } from '@angular/core';
12
+ import { HttpClient, HttpHeaders, HttpResponse, HttpResponseBase } from '@angular/common/http';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/common/http";
15
+ export const API_BASE_URL = new InjectionToken('API_BASE_URL');
16
+ export class FiltersApiClient {
17
+ constructor(http, baseUrl) {
18
+ this.jsonParseReviver = undefined;
19
+ this.http = http;
20
+ this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "";
21
+ }
22
+ getFilterViewModel() {
23
+ let url_ = this.baseUrl + "/api/filters/viewmodel";
24
+ url_ = url_.replace(/[?&]$/, "");
25
+ let options_ = {
26
+ observe: "response",
27
+ responseType: "blob",
28
+ headers: new HttpHeaders({
29
+ "Accept": "application/json"
30
+ })
31
+ };
32
+ return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
33
+ return this.processGetFilterViewModel(response_);
34
+ })).pipe(_observableCatch((response_) => {
35
+ if (response_ instanceof HttpResponseBase) {
36
+ try {
37
+ return this.processGetFilterViewModel(response_);
38
+ }
39
+ catch (e) {
40
+ return _observableThrow(e);
41
+ }
42
+ }
43
+ else
44
+ return _observableThrow(response_);
45
+ }));
46
+ }
47
+ processGetFilterViewModel(response) {
48
+ const status = response.status;
49
+ const responseBlob = response instanceof HttpResponse ? response.body :
50
+ response.error instanceof Blob ? response.error : undefined;
51
+ let _headers = {};
52
+ if (response.headers) {
53
+ for (let key of response.headers.keys()) {
54
+ _headers[key] = response.headers.get(key);
55
+ }
56
+ }
57
+ if (status === 200) {
58
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
59
+ let result200 = null;
60
+ let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
61
+ result200 = FilterViewModel.fromJS(resultData200);
62
+ return _observableOf(result200);
63
+ }));
64
+ }
65
+ else if (status !== 200 && status !== 204) {
66
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
67
+ return throwException("An unexpected server error occurred.", status, _responseText, _headers);
68
+ }));
69
+ }
70
+ return _observableOf(null);
71
+ }
72
+ getFilterViewModel2() {
73
+ let url_ = this.baseUrl + "/api/filters/viewmodel2";
74
+ url_ = url_.replace(/[?&]$/, "");
75
+ let options_ = {
76
+ observe: "response",
77
+ responseType: "blob",
78
+ headers: new HttpHeaders({
79
+ "Accept": "application/json"
80
+ })
81
+ };
82
+ return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
83
+ return this.processGetFilterViewModel2(response_);
84
+ })).pipe(_observableCatch((response_) => {
85
+ if (response_ instanceof HttpResponseBase) {
86
+ try {
87
+ return this.processGetFilterViewModel2(response_);
88
+ }
89
+ catch (e) {
90
+ return _observableThrow(e);
91
+ }
92
+ }
93
+ else
94
+ return _observableThrow(response_);
95
+ }));
96
+ }
97
+ processGetFilterViewModel2(response) {
98
+ const status = response.status;
99
+ const responseBlob = response instanceof HttpResponse ? response.body :
100
+ response.error instanceof Blob ? response.error : undefined;
101
+ let _headers = {};
102
+ if (response.headers) {
103
+ for (let key of response.headers.keys()) {
104
+ _headers[key] = response.headers.get(key);
105
+ }
106
+ }
107
+ if (status === 200) {
108
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
109
+ let result200 = null;
110
+ let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
111
+ result200 = FilterViewModel.fromJS(resultData200);
112
+ return _observableOf(result200);
113
+ }));
114
+ }
115
+ else if (status !== 200 && status !== 204) {
116
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
117
+ return throwException("An unexpected server error occurred.", status, _responseText, _headers);
118
+ }));
119
+ }
120
+ return _observableOf(null);
121
+ }
122
+ }
123
+ FiltersApiClient.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: FiltersApiClient, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
124
+ FiltersApiClient.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: FiltersApiClient });
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: FiltersApiClient, decorators: [{
126
+ type: Injectable
127
+ }], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
128
+ type: Inject,
129
+ args: [HttpClient]
130
+ }] }, { type: undefined, decorators: [{
131
+ type: Optional
132
+ }, {
133
+ type: Inject,
134
+ args: [API_BASE_URL]
135
+ }] }]; } });
136
+ export class SecurityApiClient {
137
+ constructor(http, baseUrl) {
138
+ this.jsonParseReviver = undefined;
139
+ this.http = http;
140
+ this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "";
141
+ }
142
+ authenticateUser(pLoginRequestModel) {
143
+ let url_ = this.baseUrl + "/api/security/authenticateuser";
144
+ url_ = url_.replace(/[?&]$/, "");
145
+ const content_ = JSON.stringify(pLoginRequestModel);
146
+ let options_ = {
147
+ body: content_,
148
+ observe: "response",
149
+ responseType: "blob",
150
+ headers: new HttpHeaders({
151
+ "Content-Type": "application/json",
152
+ "Accept": "application/json"
153
+ })
154
+ };
155
+ return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
156
+ return this.processAuthenticateUser(response_);
157
+ })).pipe(_observableCatch((response_) => {
158
+ if (response_ instanceof HttpResponseBase) {
159
+ try {
160
+ return this.processAuthenticateUser(response_);
161
+ }
162
+ catch (e) {
163
+ return _observableThrow(e);
164
+ }
165
+ }
166
+ else
167
+ return _observableThrow(response_);
168
+ }));
169
+ }
170
+ processAuthenticateUser(response) {
171
+ const status = response.status;
172
+ const responseBlob = response instanceof HttpResponse ? response.body :
173
+ response.error instanceof Blob ? response.error : undefined;
174
+ let _headers = {};
175
+ if (response.headers) {
176
+ for (let key of response.headers.keys()) {
177
+ _headers[key] = response.headers.get(key);
178
+ }
179
+ }
180
+ if (status === 200) {
181
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
182
+ let result200 = null;
183
+ let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
184
+ result200 = LoginResponseModel.fromJS(resultData200);
185
+ return _observableOf(result200);
186
+ }));
187
+ }
188
+ else if (status !== 200 && status !== 204) {
189
+ return blobToText(responseBlob).pipe(_observableMergeMap((_responseText) => {
190
+ return throwException("An unexpected server error occurred.", status, _responseText, _headers);
191
+ }));
192
+ }
193
+ return _observableOf(null);
194
+ }
195
+ }
196
+ SecurityApiClient.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: SecurityApiClient, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
197
+ SecurityApiClient.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: SecurityApiClient });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: SecurityApiClient, decorators: [{
199
+ type: Injectable
200
+ }], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
201
+ type: Inject,
202
+ args: [HttpClient]
203
+ }] }, { type: undefined, decorators: [{
204
+ type: Optional
205
+ }, {
206
+ type: Inject,
207
+ args: [API_BASE_URL]
208
+ }] }]; } });
209
+ export class FilterViewModel {
210
+ constructor(data) {
211
+ if (data) {
212
+ for (var property in data) {
213
+ if (data.hasOwnProperty(property))
214
+ this[property] = data[property];
215
+ }
216
+ }
217
+ }
218
+ init(_data) {
219
+ if (_data) {
220
+ this.id = _data["id"];
221
+ this.name = _data["name"];
222
+ }
223
+ }
224
+ static fromJS(data) {
225
+ data = typeof data === 'object' ? data : {};
226
+ let result = new FilterViewModel();
227
+ result.init(data);
228
+ return result;
229
+ }
230
+ toJSON(data) {
231
+ data = typeof data === 'object' ? data : {};
232
+ data["id"] = this.id;
233
+ data["name"] = this.name;
234
+ return data;
235
+ }
236
+ }
237
+ export class LoginResponseModel {
238
+ constructor(data) {
239
+ if (data) {
240
+ for (var property in data) {
241
+ if (data.hasOwnProperty(property))
242
+ this[property] = data[property];
243
+ }
244
+ }
245
+ }
246
+ init(_data) {
247
+ if (_data) {
248
+ this.name = _data["name"];
249
+ if (Array.isArray(_data["roles"])) {
250
+ this.roles = [];
251
+ for (let item of _data["roles"])
252
+ this.roles.push(item);
253
+ }
254
+ this.loginSuccess = _data["loginSuccess"];
255
+ this.authData = _data["authData"];
256
+ }
257
+ }
258
+ static fromJS(data) {
259
+ data = typeof data === 'object' ? data : {};
260
+ let result = new LoginResponseModel();
261
+ result.init(data);
262
+ return result;
263
+ }
264
+ toJSON(data) {
265
+ data = typeof data === 'object' ? data : {};
266
+ data["name"] = this.name;
267
+ if (Array.isArray(this.roles)) {
268
+ data["roles"] = [];
269
+ for (let item of this.roles)
270
+ data["roles"].push(item);
271
+ }
272
+ data["loginSuccess"] = this.loginSuccess;
273
+ data["authData"] = this.authData;
274
+ return data;
275
+ }
276
+ }
277
+ export class LoginRequestModel {
278
+ constructor(data) {
279
+ if (data) {
280
+ for (var property in data) {
281
+ if (data.hasOwnProperty(property))
282
+ this[property] = data[property];
283
+ }
284
+ }
285
+ }
286
+ init(_data) {
287
+ if (_data) {
288
+ this.name = _data["name"];
289
+ this.password = _data["password"];
290
+ }
291
+ }
292
+ static fromJS(data) {
293
+ data = typeof data === 'object' ? data : {};
294
+ let result = new LoginRequestModel();
295
+ result.init(data);
296
+ return result;
297
+ }
298
+ toJSON(data) {
299
+ data = typeof data === 'object' ? data : {};
300
+ data["name"] = this.name;
301
+ data["password"] = this.password;
302
+ return data;
303
+ }
304
+ }
305
+ export class ApiException extends Error {
306
+ constructor(message, status, response, headers, result) {
307
+ super();
308
+ this.isApiException = true;
309
+ this.message = message;
310
+ this.status = status;
311
+ this.response = response;
312
+ this.headers = headers;
313
+ this.result = result;
314
+ }
315
+ static isApiException(obj) {
316
+ return obj.isApiException === true;
317
+ }
318
+ }
319
+ function throwException(message, status, response, headers, result) {
320
+ if (result !== null && result !== undefined)
321
+ return _observableThrow(result);
322
+ else
323
+ return _observableThrow(new ApiException(message, status, response, headers, null));
324
+ }
325
+ function blobToText(blob) {
326
+ return new Observable((observer) => {
327
+ if (!blob) {
328
+ observer.next("");
329
+ observer.complete();
330
+ }
331
+ else {
332
+ let reader = new FileReader();
333
+ reader.onload = event => {
334
+ observer.next(event.target.result);
335
+ observer.complete();
336
+ };
337
+ reader.readAsText(blob);
338
+ }
339
+ });
340
+ }
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3dhZ2dlckNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvc3dhZ2dlci9Td2FnZ2VyQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QjtBQUN4QixtQkFBbUI7QUFDbkIsNEhBQTRIO0FBQzVILG9CQUFvQjtBQUNwQix3QkFBd0I7QUFFeEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQVMsY0FBYyxDQUFDLENBQUM7QUFHdkUsTUFBTSxPQUFPLGdCQUFnQjtJQUt6QixZQUFnQyxJQUFnQixFQUFvQyxPQUFnQjtRQUYxRixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBR25GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxJ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LEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFDLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPGF1dG8tZ2VuZXJhdGVkPlxyXG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjEzLjE2LjEuMCAoTkpzb25TY2hlbWEgdjEwLjcuMi4wIChOZXd0b25zb2Z0Lkpzb24gdjEzLjAuMC4wKSkgKGh0dHA6Ly9OU3dhZy5vcmcpXHJcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyogdHNsaW50OmRpc2FibGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgKi9cclxuLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nXHJcblxyXG5pbXBvcnQgeyBtZXJnZU1hcCBhcyBfb2JzZXJ2YWJsZU1lcmdlTWFwLCBjYXRjaEVycm9yIGFzIF9vYnNlcnZhYmxlQ2F0Y2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgYXMgX29ic2VydmFibGVUaHJvdywgb2YgYXMgX29ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZpbHRlcnNBcGlDbGllbnQge1xyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcclxuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlclZpZXdNb2RlbCgpOiBPYnNlcnZhYmxlPEZpbHRlclZpZXdNb2RlbD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2ZpbHRlcnMvdmlld21vZGVsXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dldEZpbHRlclZpZXdNb2RlbChyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHZXRGaWx0ZXJWaWV3TW9kZWwocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8RmlsdGVyVmlld01vZGVsPjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPEZpbHRlclZpZXdNb2RlbD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmlsdGVyVmlld01vZGVsKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWx0ZXJWaWV3TW9kZWw+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKF9yZXNwb25zZVRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xyXG4gICAgICAgICAgICByZXN1bHQyMDAgPSBGaWx0ZXJWaWV3TW9kZWwuZnJvbUpTKHJlc3VsdERhdGEyMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgoX3Jlc3BvbnNlVGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihudWxsIGFzIGFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyVmlld01vZGVsMigpOiBPYnNlcnZhYmxlPEZpbHRlclZpZXdNb2RlbD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2ZpbHRlcnMvdmlld21vZGVsMlwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcclxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHZXRGaWx0ZXJWaWV3TW9kZWwyKHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dldEZpbHRlclZpZXdNb2RlbDIocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8RmlsdGVyVmlld01vZGVsPjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPEZpbHRlclZpZXdNb2RlbD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmlsdGVyVmlld01vZGVsMihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsdGVyVmlld01vZGVsPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChfcmVzcG9uc2VUZXh0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcclxuICAgICAgICAgICAgcmVzdWx0MjAwID0gRmlsdGVyVmlld01vZGVsLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKF9yZXNwb25zZVRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YobnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZWN1cml0eUFwaUNsaWVudCB7XHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XHJcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xyXG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXV0aGVudGljYXRlVXNlcihwTG9naW5SZXF1ZXN0TW9kZWw6IExvZ2luUmVxdWVzdE1vZGVsKTogT2JzZXJ2YWJsZTxMb2dpblJlc3BvbnNlTW9kZWw+IHtcclxuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zZWN1cml0eS9hdXRoZW50aWNhdGV1c2VyXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShwTG9naW5SZXF1ZXN0TW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0F1dGhlbnRpY2F0ZVVzZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQXV0aGVudGljYXRlVXNlcihyZXNwb25zZV8gYXMgYW55KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxMb2dpblJlc3BvbnNlTW9kZWw+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8TG9naW5SZXNwb25zZU1vZGVsPjtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NBdXRoZW50aWNhdGVVc2VyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxMb2dpblJlc3BvbnNlTW9kZWw+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKF9yZXNwb25zZVRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xyXG4gICAgICAgICAgICByZXN1bHQyMDAgPSBMb2dpblJlc3BvbnNlTW9kZWwuZnJvbUpTKHJlc3VsdERhdGEyMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgoX3Jlc3BvbnNlVGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihudWxsIGFzIGFueSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJWaWV3TW9kZWwgaW1wbGVtZW50cyBJRmlsdGVyVmlld01vZGVsIHtcclxuICAgIGlkITogbnVtYmVyO1xyXG4gICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSUZpbHRlclZpZXdNb2RlbCkge1xyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcclxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xyXG4gICAgICAgIGlmIChfZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmlkID0gX2RhdGFbXCJpZFwiXTtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gX2RhdGFbXCJuYW1lXCJdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEZpbHRlclZpZXdNb2RlbCB7XHJcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEZpbHRlclZpZXdNb2RlbCgpO1xyXG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcclxuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xyXG4gICAgICAgIGRhdGFbXCJpZFwiXSA9IHRoaXMuaWQ7XHJcbiAgICAgICAgZGF0YVtcIm5hbWVcIl0gPSB0aGlzLm5hbWU7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbHRlclZpZXdNb2RlbCB7XHJcbiAgICBpZDogbnVtYmVyO1xyXG4gICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIExvZ2luUmVzcG9uc2VNb2RlbCBpbXBsZW1lbnRzIElMb2dpblJlc3BvbnNlTW9kZWwge1xyXG4gICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIHJvbGVzPzogc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcbiAgICBsb2dpblN1Y2Nlc3MhOiBib29sZWFuO1xyXG4gICAgYXV0aERhdGE/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElMb2dpblJlc3BvbnNlTW9kZWwpIHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcclxuICAgICAgICBpZiAoX2RhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gX2RhdGFbXCJuYW1lXCJdO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZGF0YVtcInJvbGVzXCJdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlcyA9IFtdIGFzIGFueTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgX2RhdGFbXCJyb2xlc1wiXSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVzIS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9naW5TdWNjZXNzID0gX2RhdGFbXCJsb2dpblN1Y2Nlc3NcIl07XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aERhdGEgPSBfZGF0YVtcImF1dGhEYXRhXCJdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IExvZ2luUmVzcG9uc2VNb2RlbCB7XHJcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IExvZ2luUmVzcG9uc2VNb2RlbCgpO1xyXG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcclxuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xyXG4gICAgICAgIGRhdGFbXCJuYW1lXCJdID0gdGhpcy5uYW1lO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucm9sZXMpKSB7XHJcbiAgICAgICAgICAgIGRhdGFbXCJyb2xlc1wiXSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMucm9sZXMpXHJcbiAgICAgICAgICAgICAgICBkYXRhW1wicm9sZXNcIl0ucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVtcImxvZ2luU3VjY2Vzc1wiXSA9IHRoaXMubG9naW5TdWNjZXNzO1xyXG4gICAgICAgIGRhdGFbXCJhdXRoRGF0YVwiXSA9IHRoaXMuYXV0aERhdGE7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luUmVzcG9uc2VNb2RlbCB7XHJcbiAgICBuYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgcm9sZXM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcclxuICAgIGxvZ2luU3VjY2VzczogYm9vbGVhbjtcclxuICAgIGF1dGhEYXRhPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9naW5SZXF1ZXN0TW9kZWwgaW1wbGVtZW50cyBJTG9naW5SZXF1ZXN0TW9kZWwge1xyXG4gICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIHBhc3N3b3JkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJTG9naW5SZXF1ZXN0TW9kZWwpIHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcclxuICAgICAgICBpZiAoX2RhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gX2RhdGFbXCJuYW1lXCJdO1xyXG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gX2RhdGFbXCJwYXNzd29yZFwiXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBMb2dpblJlcXVlc3RNb2RlbCB7XHJcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IExvZ2luUmVxdWVzdE1vZGVsKCk7XHJcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xyXG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XHJcbiAgICAgICAgZGF0YVtcIm5hbWVcIl0gPSB0aGlzLm5hbWU7XHJcbiAgICAgICAgZGF0YVtcInBhc3N3b3JkXCJdID0gdGhpcy5wYXNzd29yZDtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5SZXF1ZXN0TW9kZWwge1xyXG4gICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIHBhc3N3b3JkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXBpRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgb3ZlcnJpZGUgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICByZXNwb25zZTogc3RyaW5nO1xyXG4gICAgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XHJcbiAgICByZXN1bHQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCByZXNwb25zZTogc3RyaW5nLCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgcmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpc0FwaUV4Y2VwdGlvbiA9IHRydWU7XHJcblxyXG4gICAgc3RhdGljIGlzQXBpRXhjZXB0aW9uKG9iajogYW55KTogb2JqIGlzIEFwaUV4Y2VwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5pc0FwaUV4Y2VwdGlvbiA9PT0gdHJ1ZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24obWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdD86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3VsdCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cobmV3IEFwaUV4Y2VwdGlvbihtZXNzYWdlLCBzdGF0dXMsIHJlc3BvbnNlLCBoZWFkZXJzLCBudWxsKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJsb2JUb1RleHQoYmxvYjogYW55KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFibG9iKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoXCJcIik7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBldmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KChldmVudC50YXJnZXQgYXMgYW55KS5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYik7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iXX0=