@adins/ucsearch 2.15.0 → 3.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 (66) hide show
  1. package/README.md +39 -17
  2. package/adins-ucsearch.d.ts +1 -2
  3. package/esm2020/adins-ucsearch.mjs +5 -0
  4. package/esm2020/lib/model/adins-constant.mjs +52 -0
  5. package/esm2020/lib/model/criteria-obj.model.mjs +9 -0
  6. package/esm2020/lib/model/input-search-obj.model.mjs +45 -0
  7. package/esm2020/lib/model/integration-obj.model.mjs +12 -0
  8. package/esm2020/lib/model/key-value-report.model.mjs +15 -0
  9. package/esm2020/lib/model/key-value-uc-search.model.mjs +38 -0
  10. package/esm2020/lib/model/request-criteria-obj.model.mjs +14 -0
  11. package/esm2020/lib/pipe/text-search.pipe.mjs +24 -0
  12. package/esm2020/lib/services/export-file.service.mjs +61 -0
  13. package/esm2020/lib/ucsearch.component.mjs +1057 -0
  14. package/esm2020/lib/ucsearch.module.mjs +55 -0
  15. package/esm2020/lib/ucsearch.service.mjs +14 -0
  16. package/esm2020/public-api.mjs +7 -0
  17. package/fesm2015/adins-ucsearch.mjs +1385 -0
  18. package/fesm2015/adins-ucsearch.mjs.map +1 -0
  19. package/fesm2020/adins-ucsearch.mjs +1374 -0
  20. package/fesm2020/adins-ucsearch.mjs.map +1 -0
  21. package/lib/model/adins-constant.d.ts +21 -0
  22. package/lib/model/input-search-obj.model.d.ts +1 -0
  23. package/lib/pipe/text-search.pipe.d.ts +3 -0
  24. package/lib/services/export-file.service.d.ts +12 -0
  25. package/lib/ucsearch.component.d.ts +16 -13
  26. package/lib/ucsearch.module.d.ts +12 -0
  27. package/lib/ucsearch.service.d.ts +3 -0
  28. package/package.json +24 -13
  29. package/adins-ucsearch.metadata.json +0 -1
  30. package/bundles/adins-ucsearch.umd.js +0 -1931
  31. package/bundles/adins-ucsearch.umd.js.map +0 -1
  32. package/bundles/adins-ucsearch.umd.min.js +0 -2
  33. package/bundles/adins-ucsearch.umd.min.js.map +0 -1
  34. package/esm2015/adins-ucsearch.js +0 -11
  35. package/esm2015/lib/model/adins-constant.js +0 -68
  36. package/esm2015/lib/model/criteria-obj.model.js +0 -31
  37. package/esm2015/lib/model/input-search-obj.model.js +0 -105
  38. package/esm2015/lib/model/integration-obj.model.js +0 -30
  39. package/esm2015/lib/model/key-value-report.model.js +0 -39
  40. package/esm2015/lib/model/key-value-uc-search.model.js +0 -54
  41. package/esm2015/lib/model/request-criteria-obj.model.js +0 -42
  42. package/esm2015/lib/pipe/text-search.pipe.js +0 -33
  43. package/esm2015/lib/services/excel-service/excel-service.js +0 -49
  44. package/esm2015/lib/ucsearch.component.js +0 -1468
  45. package/esm2015/lib/ucsearch.module.js +0 -43
  46. package/esm2015/lib/ucsearch.service.js +0 -18
  47. package/esm2015/public-api.js +0 -11
  48. package/esm5/adins-ucsearch.js +0 -11
  49. package/esm5/lib/model/adins-constant.js +0 -72
  50. package/esm5/lib/model/criteria-obj.model.js +0 -33
  51. package/esm5/lib/model/input-search-obj.model.js +0 -117
  52. package/esm5/lib/model/integration-obj.model.js +0 -32
  53. package/esm5/lib/model/key-value-report.model.js +0 -45
  54. package/esm5/lib/model/key-value-uc-search.model.js +0 -58
  55. package/esm5/lib/model/request-criteria-obj.model.js +0 -44
  56. package/esm5/lib/pipe/text-search.pipe.js +0 -42
  57. package/esm5/lib/services/excel-service/excel-service.js +0 -63
  58. package/esm5/lib/ucsearch.component.js +0 -1633
  59. package/esm5/lib/ucsearch.module.js +0 -47
  60. package/esm5/lib/ucsearch.service.js +0 -21
  61. package/esm5/public-api.js +0 -11
  62. package/fesm2015/adins-ucsearch.js +0 -1641
  63. package/fesm2015/adins-ucsearch.js.map +0 -1
  64. package/fesm5/adins-ucsearch.js +0 -1842
  65. package/fesm5/adins-ucsearch.js.map +0 -1
  66. package/lib/services/excel-service/excel-service.d.ts +0 -5
@@ -1,1633 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { Component, Input, ViewChild, ElementRef, Inject, Renderer2, EventEmitter, Output } from '@angular/core';
7
- import { HttpClient } from '@angular/common/http';
8
- import { NgForm } from '@angular/forms';
9
- import { DatePipe, formatDate } from '@angular/common';
10
- import { InputSearchObj } from './model/input-search-obj.model';
11
- import { CriteriaObj } from './model/criteria-obj.model';
12
- import { RequestCriteriaObj } from './model/request-criteria-obj.model';
13
- import { AdInsConstant } from './model/adins-constant';
14
- import { DOCUMENT } from '@angular/platform-browser';
15
- import { ExcelService } from './services/excel-service/excel-service';
16
- import { trigger, transition, style, animate, state } from '@angular/animations';
17
- import { ToastrService } from 'ngx-toastr';
18
- import { ExportTypeConstant } from './model/key-value-report.model';
19
- import { CookieService } from 'ngx-cookie';
20
- import * as CryptoJS from 'crypto-js';
21
- import { ListKeyValueMonth } from './model/key-value-uc-search.model';
22
- import { ActivatedRoute } from '@angular/router';
23
- var UCSearchComponent = /** @class */ (function () {
24
- function UCSearchComponent(http, excelService, _renderer2, _document, toastr, cookieService, datePipe, elemRef, route) {
25
- var _this = this;
26
- this.http = http;
27
- this.excelService = excelService;
28
- this._renderer2 = _renderer2;
29
- this._document = _document;
30
- this.toastr = toastr;
31
- this.cookieService = cookieService;
32
- this.datePipe = datePipe;
33
- this.elemRef = elemRef;
34
- this.route = route;
35
- this.searchInput = new InputSearchObj();
36
- this.pageSize = 10;
37
- this.isReport = false;
38
- this.result = new EventEmitter();
39
- this.genRpt = new EventEmitter();
40
- this.reqGetAllData = new EventEmitter();
41
- this.ExportTypeList = [
42
- {
43
- key: ExportTypeConstant.EXP_TYPE_PDF,
44
- value: "PDF"
45
- },
46
- {
47
- key: ExportTypeConstant.EXP_TYPE_XLSX,
48
- value: "Excel 2007"
49
- },
50
- {
51
- key: ExportTypeConstant.EXP_TYPE_DOCX,
52
- value: "Document XML"
53
- },
54
- {
55
- key: ExportTypeConstant.EXP_TYPE_JPDF,
56
- value: "Justify PDF"
57
- }
58
- ];
59
- this.ListOfMonth = new ListKeyValueMonth();
60
- this.ListOfYear = new Array();
61
- this.ClaimList = [
62
- {
63
- Key: AdInsConstant.RestrictionIsNotNull,
64
- Value: "CLAIMED"
65
- },
66
- {
67
- Key: AdInsConstant.RestrictionIsNull,
68
- Value: "UNCLAIMED"
69
- },
70
- ];
71
- this.ExportType = 0;
72
- this.pageNow = 1;
73
- this.isDataLoaded = false;
74
- this.isHidden = false;
75
- this.BusinessDt = new Date();
76
- this.dateWrong = false;
77
- this.readonly = false;
78
- this.currentState = 'initial';
79
- this.countForm = 0;
80
- this.formattedAmount = '';
81
- this.amount = 0;
82
- this.route.queryParams.subscribe((/**
83
- * @param {?} params
84
- * @return {?}
85
- */
86
- function (params) {
87
- _this.queryParam = params;
88
- }));
89
- }
90
- Object.defineProperty(UCSearchComponent.prototype, "content", {
91
- // isListHide: boolean = true;
92
- // @HostListener('document:click', ['$event'])
93
- // onClick(ev: MouseEvent) {
94
- // const clickInside = this.elemRef.nativeElement.contains(ev.target);
95
- // if (!clickInside) {
96
- // this.isListHide = true;
97
- // }
98
- // }
99
- set:
100
- // isListHide: boolean = true;
101
- // @HostListener('document:click', ['$event'])
102
- // onClick(ev: MouseEvent) {
103
- // const clickInside = this.elemRef.nativeElement.contains(ev.target);
104
- // if (!clickInside) {
105
- // this.isListHide = true;
106
- // }
107
- // }
108
- /**
109
- * @param {?} content
110
- * @return {?}
111
- */
112
- function (content) {
113
- if (content) { // initially setter gets called with undefined
114
- this.searchForm = content;
115
- }
116
- },
117
- enumerable: true,
118
- configurable: true
119
- });
120
- /**
121
- * @return {?}
122
- */
123
- UCSearchComponent.prototype.changeState = /**
124
- * @return {?}
125
- */
126
- function () {
127
- this.currentState = this.currentState === 'initial' ? 'final' : 'initial';
128
- this.isHidden = this.isHidden === false ? true : false;
129
- };
130
- /**
131
- * @return {?}
132
- */
133
- UCSearchComponent.prototype.ngOnInit = /**
134
- * @return {?}
135
- */
136
- function () {
137
- return tslib_1.__awaiter(this, void 0, void 0, function () {
138
- var js, value;
139
- return tslib_1.__generator(this, function (_a) {
140
- switch (_a.label) {
141
- case 0:
142
- console.log("ucsearch");
143
- this.apiUrl = this.searchInput.enviromentUrl + this.searchInput.apiQryPaging;
144
- this.arrCrit = this.searchInput.arrCritObj;
145
- js = this._renderer2.createElement('script');
146
- js.text = "\n $(document).ready(function(){\n $(\"#flip\").click(function(){\n $(\"#panel\").slideToggle(\"slow\");\n });\n });\n ";
147
- this._renderer2.appendChild(this._document.body, js);
148
- value = this.cookieService.get('BusinessDateRaw');
149
- this.BisDt = this.DecryptString(value, "AdInsFOU12345678");
150
- this.BusinessDt = new Date(this.BisDt);
151
- return [4 /*yield*/, this.initiateForm()];
152
- case 1:
153
- _a.sent();
154
- return [2 /*return*/];
155
- }
156
- });
157
- });
158
- };
159
- /**
160
- * @return {?}
161
- */
162
- UCSearchComponent.prototype.initiateForm = /**
163
- * @return {?}
164
- */
165
- function () {
166
- return tslib_1.__awaiter(this, void 0, void 0, function () {
167
- var _this = this;
168
- return tslib_1.__generator(this, function (_a) {
169
- switch (_a.label) {
170
- case 0: return [4 /*yield*/, this.getJSON(this.searchInput._url).subscribe((/**
171
- * @param {?} data
172
- * @return {?}
173
- */
174
- function (data) {
175
- _this.configuration = data;
176
- _this.exportData = data.exportExcel;
177
- if (data.exportTypeList != undefined && data.exportTypeList.length != 0) {
178
- _this.ExportTypeList = data.exportTypeList;
179
- _this.ExportType = _this.ExportTypeList[0].key;
180
- }
181
- _this.countForm = data.component.length;
182
- _this.isDataLoaded = true;
183
- if (_this.searchInput.title != undefined && _this.searchInput.title != "") {
184
- _this.configuration.title = _this.searchInput.title;
185
- }
186
- for (var i = 0; i < _this.countForm; i++) {
187
- //ini kalau datanya di load dari URL
188
- if (data.component[i].isFromURL == true) {
189
- /** @type {?} */
190
- var request = new RequestCriteriaObj();
191
- /** @type {?} */
192
- var arrayCrit = new Array();
193
- /** @type {?} */
194
- var criteriaObject = new CriteriaObj();
195
- criteriaObject.DataType = "text";
196
- criteriaObject.propName = data.component[i].criteriaPropName;
197
- criteriaObject.value = data.component[i].criteriaPropValue;
198
- criteriaObject.restriction = "eq";
199
- arrayCrit.push(criteriaObject);
200
- request.criteria = arrayCrit;
201
- request[data.component[i].criteriaPropName] = data.component[i].criteriaPropValue;
202
- // Pengecekan penggunaan url atau path
203
- if (data.component[i].path != undefined && data.component[i].path != "") {
204
- if (_this.searchInput.listEnvironments != undefined && _this.searchInput.listEnvironments.length != 0) {
205
- for (var y = 0; y < _this.searchInput.listEnvironments.length; y++) {
206
- if (data.component[i].environment == _this.searchInput.listEnvironments[y].environment) {
207
- data.component[i].fullpath = _this.searchInput.listEnvironments[y].url + data.component[i].path;
208
- break;
209
- }
210
- }
211
- }
212
- else {
213
- data.component[i].fullpath = data.component[i].url;
214
- }
215
- }
216
- else {
217
- data.component[i].fullpath = data.component[i].url;
218
- }
219
- //lempar objectnya sekalian sama urlnya, nnti di bind di dalem karena masalah di asyncnya
220
- //biar tiap function ada state2nya sendiri
221
- _this.resolveObject(data.component[i], data.component[i].fullpath, request);
222
- }
223
- if (data.component[i].type == "numeric") {
224
- data.component[i].value = parseFloat(data.component[i].value).toLocaleString('en');
225
- }
226
- //pengecekan ddl
227
- if (data.component[i].type == "dropdown") {
228
- if (data.component[i].dtmType != undefined) {
229
- if (data.component[i].dtmType.includes("month")) {
230
- if (data.component[i].value != undefined && data.component[i].value.includes("BD")) {
231
- data.component[i].value = _this.setDefaultValueMonth(data.component[i].value);
232
- }
233
- data.component[i].items = _this.setMonthDDL(data.component[i].dtmType);
234
- }
235
- if (data.component[i].dtmType.includes("year")) {
236
- if (data.component[i].value != undefined && data.component[i].value.includes("BD")) {
237
- data.component[i].value = _this.setDefaultValueYear(data.component[i].value);
238
- }
239
- data.component[i].items = _this.setYearDDL(data.component[i].dtmType);
240
- }
241
- }
242
- }
243
- // if (data.component[i].type == "dropdownSearch" && !data.component[i].isFromURL && data.component[i].items?.length != 1) {
244
- // if (data.component[i].ddsType == undefined || data.component[i].ddsType == "all") {
245
- // data.component[i].value = "all";
246
- // data.component[i].descr = "All";
247
- // } else if (data.component[i].ddsType == "one") {
248
- // data.component[i].value = "one";
249
- // data.component[i].descr = "Select One";
250
- // }
251
- // }
252
- if (data.component[i].type == "dropdownSearch" && !data.component[i].isFromURL && data.component[i].items.length == 1) {
253
- data.component[i].value = data.component[i].items[0].Key;
254
- data.component[i].descr = data.component[i].items[0].Value;
255
- }
256
- if (data.component[i].type != "dropdownSearch" && !data.component[i].value) {
257
- data.component[i].value = "";
258
- if (data.component[i].ddlType == 'all')
259
- data.component[i].value = "all";
260
- if (data.component[i].ddlType == 'one')
261
- data.component[i].value = "one";
262
- }
263
- //pengecekan tanggal
264
- if (data.component[i].type == "datepicker") {
265
- _this.readonly = data.component[i].readonly;
266
- if (data.component[i].value.includes("BD")) {
267
- /** @type {?} */
268
- var businessDate = new Date();
269
- if (_this.BisDt != null) {
270
- businessDate = new Date(_this.BisDt);
271
- }
272
- /** @type {?} */
273
- var operator = data.component[i].value.charAt(2);
274
- /** @type {?} */
275
- var dateShow = new Date();
276
- if (operator == "-") {
277
- /** @type {?} */
278
- var tempMinus = data.component[i].value.split("-", 2);
279
- /** @type {?} */
280
- var numDay = parseInt(tempMinus[1]);
281
- businessDate.setDate(businessDate.getDate() - numDay);
282
- }
283
- else if (operator == "+") {
284
- /** @type {?} */
285
- var tempMinus = data.component[i].value.split("+", 2);
286
- /** @type {?} */
287
- var numDay = parseInt(tempMinus[1]);
288
- businessDate.setDate(businessDate.getDate() + numDay);
289
- }
290
- dateShow = businessDate;
291
- /** @type {?} */
292
- var dateText = formatDate(dateShow, 'yyyy-MM-dd', 'en-US');
293
- data.component[i].value = dateText;
294
- }
295
- if (_this.readonly = false) {
296
- if (data.component[i].restriction != undefined && data.component[i].restriction != "") {
297
- if (data.component[i].restriction.toUpperCase() == "GT") {
298
- /** @type {?} */
299
- var minDate = new Date(_this.datePipe.transform(data.component[i].minDate, 'yyyy-MM-dd'));
300
- minDate.setDate(minDate.getDate() + 1);
301
- data.component[i].minDate = minDate;
302
- }
303
- else if (data.component[i].restriction.toUpperCase() == "LT") {
304
- /** @type {?} */
305
- var maxDate = new Date(_this.datePipe.transform(data.component[i].maxDate, 'yyyy-MM-dd'));
306
- maxDate.setDate(maxDate.getDate() - 1);
307
- data.component[i].maxDate = maxDate;
308
- }
309
- }
310
- }
311
- }
312
- if (data.component[i].type == "textbox") {
313
- _this.configuration.component[i].value = _this.autofill(data.component[i]);
314
- }
315
- }
316
- setTimeout((/**
317
- * @return {?}
318
- */
319
- function () {
320
- for (var j = 0; j < _this.countForm; j++) {
321
- if (data.component[j].isEvent == true && _this.configuration.component[j].itemsUrl.length == 1) {
322
- _this.onChangeEvent(data.component[j].itemsUrl[0].Key, data.component[j]);
323
- }
324
- if (data.component[j].type == "officeRoleCodes" && _this.configuration.component[j].itemsUrl.length > 0) {
325
- _this.SetRoleOfficeCodes(j);
326
- }
327
- }
328
- }), 1000);
329
- }))];
330
- case 1:
331
- _a.sent();
332
- return [2 /*return*/];
333
- }
334
- });
335
- });
336
- };
337
- /**
338
- * @private
339
- * @param {?} data
340
- * @return {?}
341
- */
342
- UCSearchComponent.prototype.autofill = /**
343
- * @private
344
- * @param {?} data
345
- * @return {?}
346
- */
347
- function (data) {
348
- if (data.value != "")
349
- return data.value;
350
- /** @type {?} */
351
- var autofill = data.autofill;
352
- if (autofill == undefined)
353
- return data.value;
354
- if (this.queryParam[autofill.key] == undefined)
355
- return data.value;
356
- if (autofill.source == "param") {
357
- return this.queryParam[autofill.key];
358
- }
359
- return data.value;
360
- };
361
- /**
362
- * @param {?} i
363
- * @return {?}
364
- */
365
- UCSearchComponent.prototype.SetRoleOfficeCodes = /**
366
- * @param {?} i
367
- * @return {?}
368
- */
369
- function (i) {
370
- /** @type {?} */
371
- var value = this.cookieService.get("UserAccess");
372
- /** @type {?} */
373
- var userAccess = JSON.parse(this.DecryptString(value, "AdInsFOU12345678"));
374
- /** @type {?} */
375
- var roleCode = userAccess["RoleCode"];
376
- /** @type {?} */
377
- var listOfficeRoleCodes = new Array();
378
- listOfficeRoleCodes.push(roleCode);
379
- /** @type {?} */
380
- var component = this.myForm.nativeElement[i];
381
- /** @type {?} */
382
- var ddl = component.options;
383
- /** @type {?} */
384
- var text = ddl[ddl.selectedIndex].value.trim();
385
- if (this.configuration.component[i].itemsUrl.length == 1 || (this.configuration.component[i].ddlType == 'all' && text == 'all')) {
386
- for (var index = 0; index < this.configuration.component[i].itemsUrl.length; index++) {
387
- /** @type {?} */
388
- var element = this.configuration.component[i].itemsUrl[index];
389
- listOfficeRoleCodes.push(element.Key);
390
- listOfficeRoleCodes.push(roleCode + "-" + element.Key);
391
- }
392
- }
393
- else {
394
- listOfficeRoleCodes.push(text);
395
- listOfficeRoleCodes.push(roleCode + "-" + text);
396
- }
397
- this.searchInput.integrationObj.requestObj["OfficeRoleCodes"] = listOfficeRoleCodes;
398
- };
399
- /**
400
- * @param {?} value
401
- * @return {?}
402
- */
403
- UCSearchComponent.prototype.setDefaultValueMonth = /**
404
- * @param {?} value
405
- * @return {?}
406
- */
407
- function (value) {
408
- /** @type {?} */
409
- var businessDate = new Date(this.BusinessDt);
410
- /** @type {?} */
411
- var operator = value.charAt(2);
412
- /** @type {?} */
413
- var tempValue = value.split(operator, 2);
414
- /** @type {?} */
415
- var numMonth = parseInt(tempValue[1]);
416
- if (!numMonth)
417
- numMonth = 1;
418
- if (operator == "-") {
419
- businessDate.setMonth(businessDate.getMonth() - numMonth);
420
- }
421
- else if (operator == "+") {
422
- businessDate.setMonth(businessDate.getMonth() + numMonth);
423
- }
424
- return businessDate.getMonth();
425
- };
426
- /**
427
- * @param {?} month
428
- * @return {?}
429
- */
430
- UCSearchComponent.prototype.setMonthDDL = /**
431
- * @param {?} month
432
- * @return {?}
433
- */
434
- function (month) {
435
- /** @type {?} */
436
- var ListOfMonth;
437
- /** @type {?} */
438
- var equation = month.match("[\\/+][-]|[-][\\/+]|\\/+|-");
439
- /** @type {?} */
440
- var toMin = this.BusinessDt.getMonth();
441
- /** @type {?} */
442
- var toMax = this.BusinessDt.getMonth();
443
- /** @type {?} */
444
- var tempEquation = equation[0];
445
- /** @type {?} */
446
- var minMax = parseInt(month.substring(equation.index + equation[0].length));
447
- if (minMax >= 12)
448
- return this.ListOfMonth.ListOfMonth;
449
- if ((tempEquation == "+-" || tempEquation == "-+") && minMax >= 6)
450
- return this.ListOfMonth.ListOfMonth;
451
- /** @type {?} */
452
- var dictOfMonth = this.ListOfMonth.DictOfMonth;
453
- ListOfMonth.push({ key: toMin, value: dictOfMonth[toMin] });
454
- for (var q = 0; q < minMax; q++) {
455
- if (tempEquation.includes("-")) {
456
- toMin--;
457
- if (toMin == 0)
458
- toMin = 12;
459
- ListOfMonth.push({ key: toMin, value: dictOfMonth[toMin] });
460
- }
461
- if (tempEquation.includes("+")) {
462
- toMax++;
463
- if (toMax == 13)
464
- toMax = 1;
465
- ListOfMonth.push({ key: toMax, value: dictOfMonth[toMax] });
466
- }
467
- }
468
- ListOfMonth.sort((/**
469
- * @param {?} a
470
- * @param {?} b
471
- * @return {?}
472
- */
473
- function (a, b) {
474
- return a.key - b.key;
475
- }));
476
- return ListOfMonth;
477
- };
478
- /**
479
- * @param {?} value
480
- * @return {?}
481
- */
482
- UCSearchComponent.prototype.setDefaultValueYear = /**
483
- * @param {?} value
484
- * @return {?}
485
- */
486
- function (value) {
487
- /** @type {?} */
488
- var businessDate = new Date(this.BusinessDt);
489
- /** @type {?} */
490
- var operator = value.charAt(2);
491
- /** @type {?} */
492
- var tempValue = value.split(operator, 2);
493
- /** @type {?} */
494
- var numYear = parseInt(tempValue[1]);
495
- if (!numYear)
496
- numYear = 1;
497
- if (operator == "-") {
498
- businessDate.setFullYear(businessDate.getFullYear() - numYear);
499
- }
500
- else if (operator == "+") {
501
- businessDate.setFullYear(businessDate.getFullYear() + numYear);
502
- }
503
- return businessDate.getFullYear();
504
- };
505
- /**
506
- * @param {?} year
507
- * @return {?}
508
- */
509
- UCSearchComponent.prototype.setYearDDL = /**
510
- * @param {?} year
511
- * @return {?}
512
- */
513
- function (year) {
514
- this.ListOfYear = new Array();
515
- /** @type {?} */
516
- var equation = year.match("[\\/+][-]|[-][\\/+]|\\/+|-");
517
- /** @type {?} */
518
- var toMin = this.BusinessDt.getFullYear();
519
- /** @type {?} */
520
- var toMax = this.BusinessDt.getFullYear();
521
- /** @type {?} */
522
- var minMax = parseInt(year.substring(equation.index + equation[0].length));
523
- this.ListOfYear.push({ key: this.BusinessDt.getFullYear(), value: this.BusinessDt.getFullYear().toString() });
524
- for (var q = 0; q < minMax; q++) {
525
- if (equation[0] == "-+" || equation[0] == "+-") {
526
- toMin--;
527
- toMax++;
528
- this.ListOfYear.push({ key: toMin, value: toMin.toString() }, { key: toMax, value: toMax.toString() });
529
- }
530
- else if (equation[0] == "-") {
531
- toMin--;
532
- this.ListOfYear.push({ key: toMin, value: toMin.toString() });
533
- }
534
- else if (equation[0] == "+") {
535
- toMax++;
536
- this.ListOfYear.push({ key: toMax, value: toMax.toString() });
537
- }
538
- }
539
- this.ListOfYear.sort((/**
540
- * @param {?} a
541
- * @param {?} b
542
- * @return {?}
543
- */
544
- function (a, b) {
545
- return a.key - b.key;
546
- }));
547
- return this.ListOfYear;
548
- };
549
- /**
550
- * @param {?} url
551
- * @return {?}
552
- */
553
- UCSearchComponent.prototype.getJSON = /**
554
- * @param {?} url
555
- * @return {?}
556
- */
557
- function (url) {
558
- return this.http.get(url);
559
- };
560
- /**
561
- * @param {?} url
562
- * @param {?=} criteria
563
- * @return {?}
564
- */
565
- UCSearchComponent.prototype.postJSON = /**
566
- * @param {?} url
567
- * @param {?=} criteria
568
- * @return {?}
569
- */
570
- function (url, criteria) {
571
- if (criteria === void 0) { criteria = null; }
572
- return this.http.post(url, criteria);
573
- };
574
- /**
575
- * @param {?=} IsExportExcel
576
- * @return {?}
577
- */
578
- UCSearchComponent.prototype.searchClick = /**
579
- * @param {?=} IsExportExcel
580
- * @return {?}
581
- */
582
- function (IsExportExcel) {
583
- if (IsExportExcel === void 0) { IsExportExcel = false; }
584
- /** @type {?} */
585
- var filtered = this.configuration.component.filter((/**
586
- * @param {?} item
587
- * @param {?} i
588
- * @param {?} arr
589
- * @return {?}
590
- */
591
- function (item, i, arr) {
592
- if (item.datepickerPair === undefined || item.datepickerPair === '')
593
- return;
594
- return arr.findIndex((/**
595
- * @param {?} x
596
- * @return {?}
597
- */
598
- function (x) { return (x.datepickerPair === item.datepickerPair); })) === i;
599
- }));
600
- for (var i = 0; i < filtered.length; i++) {
601
- if (filtered[i].type == "numeric" || filtered[i].type == "datepicker") {
602
- if (!this.checkValueGteLte(filtered[i]))
603
- return;
604
- }
605
- }
606
- /** @type {?} */
607
- var order = null;
608
- if (this.configuration.orderby != null) {
609
- order = {
610
- key: this.configuration.orderby.key,
611
- value: this.configuration.orderby.value
612
- };
613
- }
614
- this.pageNow = 1;
615
- /** @type {?} */
616
- var rowPerPage = this.pageSize;
617
- if (IsExportExcel)
618
- rowPerPage = 9999;
619
- this.search(this.apiUrl, this.pageNow, rowPerPage, order, true, this.arrCrit, IsExportExcel);
620
- };
621
- /**
622
- * @return {?}
623
- */
624
- UCSearchComponent.prototype.reset = /**
625
- * @return {?}
626
- */
627
- function () {
628
- return tslib_1.__awaiter(this, void 0, void 0, function () {
629
- return tslib_1.__generator(this, function (_a) {
630
- switch (_a.label) {
631
- case 0:
632
- this.searchForm.resetForm({
633
- ExportType: this.ExportTypeList[0].key
634
- });
635
- return [4 /*yield*/, this.initiateForm()];
636
- case 1:
637
- _a.sent();
638
- return [2 /*return*/];
639
- }
640
- });
641
- });
642
- };
643
- /**
644
- * @param {?} apiUrl
645
- * @param {?} pageNo
646
- * @param {?} rowPerPage
647
- * @param {?} orderBy
648
- * @param {?} isClickSearch
649
- * @param {?=} addCrit
650
- * @param {?=} IsExportExcel
651
- * @param {?=} isAddToTemp
652
- * @param {?=} addToTempCrit
653
- * @return {?}
654
- */
655
- UCSearchComponent.prototype.search = /**
656
- * @param {?} apiUrl
657
- * @param {?} pageNo
658
- * @param {?} rowPerPage
659
- * @param {?} orderBy
660
- * @param {?} isClickSearch
661
- * @param {?=} addCrit
662
- * @param {?=} IsExportExcel
663
- * @param {?=} isAddToTemp
664
- * @param {?=} addToTempCrit
665
- * @return {?}
666
- */
667
- function (apiUrl, pageNo, rowPerPage, orderBy, isClickSearch, addCrit, IsExportExcel, isAddToTemp, addToTempCrit) {
668
- var _this = this;
669
- if (addCrit === void 0) { addCrit = new Array(); }
670
- if (IsExportExcel === void 0) { IsExportExcel = false; }
671
- if (isAddToTemp === void 0) { isAddToTemp = false; }
672
- if (addToTempCrit === void 0) { addToTempCrit = new Array(); }
673
- /** @type {?} */
674
- var request = new RequestCriteriaObj();
675
- /** @type {?} */
676
- var arrCrit = new Array();
677
- /** @type {?} */
678
- var IsQueryIn = false;
679
- /** @type {?} */
680
- var IsBreak = false;
681
- // Inject whereQuery for where criteria
682
- if (this.searchInput.whereValue != undefined && this.searchInput.whereValue.length != 0) {
683
- this.configuration.querystring.whereQuery = new Array();
684
- for (var x = 0; x < this.searchInput.whereValue.length; x++) {
685
- this.configuration.querystring.whereQuery.push(this.searchInput.whereValue[x].value);
686
- }
687
- }
688
- if (this.searchInput.fromValue != undefined && this.searchInput.fromValue.length != 0) {
689
- this.configuration.querystring.fromQuery = new Array();
690
- for (var x = 0; x < this.searchInput.fromValue.length; x++) {
691
- this.configuration.querystring.fromQuery.push(this.searchInput.fromValue[x].value);
692
- }
693
- }
694
- request.pageNo = pageNo;
695
- request.rowPerPage = rowPerPage;
696
- request.orderBy = orderBy;
697
- request.queryString = this.configuration.querystring;
698
- /** @type {?} */
699
- var formSeq = -1;
700
- for (var i = 0; i < this.countForm; i++) {
701
- /** @type {?} */
702
- var critObj = new CriteriaObj();
703
- if (this.configuration.component[i].type == "dropdownSearch") {
704
- formSeq += 3;
705
- }
706
- else {
707
- formSeq++;
708
- }
709
- /** @type {?} */
710
- var component = this.myForm.nativeElement[formSeq];
711
- // // popup message if required
712
- // if (component.getAttribute('data-required') != null && component.getAttribute('data-required') == "true") {
713
- // let val = component.value.trim();
714
- // if (val == "") {
715
- // IsBreak = true;
716
- // let label = component.getAttribute('label');
717
- // this.toastr.warning("Please input " + label);
718
- // break;
719
- // }
720
- // }
721
- critObj.DataType = component.getAttribute('data-type');
722
- //Ini khusus kalau dari Drop Down
723
- if (component.getAttribute('query-in') != null && component.getAttribute('query-in') == "true") {
724
- IsQueryIn = true;
725
- }
726
- else {
727
- IsQueryIn = false;
728
- }
729
- if (component.value != "") {
730
- if (component.nodeName == 'SELECT') {
731
- /** @type {?} */
732
- var ddl = component.options;
733
- /** @type {?} */
734
- var text = ddl[ddl.selectedIndex].value.trim();
735
- if (text == "one") {
736
- IsBreak = true;
737
- /** @type {?} */
738
- var label = component.getAttribute('label');
739
- this.toastr.warning("Please select " + label);
740
- break;
741
- }
742
- if (component.getAttribute('data-crit-datatable') != "" && component.getAttribute('data-crit-datatable') != null) {
743
- critObj.isCriteriaDataTable = component.getAttribute('data-crit-datatable');
744
- }
745
- if (this.configuration.component[i].type == "taskDefinitionKey" ||
746
- this.configuration.component[i].type == "processKey")
747
- continue;
748
- if (this.configuration.component[i].type == "claim") {
749
- critObj.propName = component.getAttribute('data-name');
750
- critObj.restriction = text;
751
- critObj.value = null;
752
- if (!isAddToTemp) {
753
- arrCrit.push(critObj);
754
- }
755
- }
756
- else {
757
- if (text != "all" && text != "one") {
758
- //Kalau Dari Dropdown udah pasti pake Eq
759
- critObj.restriction = AdInsConstant.RestrictionEq;
760
- if (component.name != "") {
761
- critObj.propName = component.name;
762
- }
763
- else {
764
- critObj.propName = component.getAttribute('data-name');
765
- }
766
- critObj.value = text;
767
- if (!isAddToTemp) {
768
- arrCrit.push(critObj);
769
- }
770
- }
771
- else if (text == "all" && IsQueryIn == true && component.options.length != 0) {
772
- /** @type {?} */
773
- var ddlList = new Array();
774
- for (var x = 0; x < component.options.length; x++) {
775
- if (x != 0) {
776
- ddlList.push(component.options[x].value);
777
- }
778
- }
779
- if (ddlList.length != 0) {
780
- critObj.restriction = AdInsConstant.RestrictionIn;
781
- if (component.name != "") {
782
- critObj.propName = component.name;
783
- }
784
- else {
785
- critObj.propName = component.getAttribute('data-name');
786
- }
787
- critObj.listValue = ddlList;
788
- if (!isAddToTemp) {
789
- arrCrit.push(critObj);
790
- }
791
- }
792
- }
793
- }
794
- }
795
- else {
796
- //Kalau ada Percent maka yang dipake nnti adalah Restrictions Like
797
- if (component.name != "") {
798
- critObj.propName = component.name;
799
- }
800
- else {
801
- critObj.propName = component.getAttribute('data-name');
802
- }
803
- critObj.value = component.value.trim();
804
- if (component.value.includes("%")) {
805
- critObj.restriction = AdInsConstant.RestrictionLike;
806
- }
807
- //kalau componentnya Date, restrictionsnya lgsg ambil dari property JSONnya
808
- else if (component.getAttribute('data-restriction') != "" && component.getAttribute('data-restriction') != null) {
809
- critObj.restriction = component.getAttribute('data-restriction');
810
- if (component.getAttribute('data-type') == 'numeric') {
811
- critObj.value = parseFloat(component.value.replace(/,/g, '')).toString();
812
- }
813
- if (critObj.restriction.toUpperCase() == "LIKE") {
814
- critObj.value = "%" + component.value.trim() + "%";
815
- critObj.restriction = AdInsConstant.RestrictionLike;
816
- }
817
- }
818
- else {
819
- critObj.restriction = AdInsConstant.RestrictionEq;
820
- }
821
- if (component.getAttribute('data-crit-datatable') != "" && component.getAttribute('data-crit-datatable') != null) {
822
- critObj.isCriteriaDataTable = component.getAttribute('data-crit-datatable');
823
- }
824
- if (!isAddToTemp) {
825
- arrCrit.push(critObj);
826
- }
827
- }
828
- }
829
- }
830
- if (IsBreak) {
831
- return;
832
- }
833
- if (addCrit != null && addCrit != undefined) {
834
- if (addCrit.length != 0) {
835
- for (var i = 0; i < addCrit.length; i++) {
836
- arrCrit.push(addCrit[i]);
837
- }
838
- }
839
- else if (this.searchInput.addCritInput != null || this.searchInput.addCritInput != undefined) {
840
- for (var i = 0; i < this.searchInput.addCritInput.length; i++) {
841
- arrCrit.push(this.searchInput.addCritInput[i]);
842
- }
843
- }
844
- }
845
- else if (this.searchInput.addCritInput != null || this.searchInput.addCritInput != undefined) {
846
- for (var i = 0; i < this.searchInput.addCritInput.length; i++) {
847
- arrCrit.push(this.searchInput.addCritInput[i]);
848
- }
849
- }
850
- if (isClickSearch) {
851
- this.persistCrit = arrCrit;
852
- }
853
- request.criteria = this.persistCrit;
854
- if (isAddToTemp) {
855
- this.persistAddToTempCrit = addToTempCrit;
856
- }
857
- if (this.persistAddToTempCrit !== undefined) {
858
- request.criteria = request.criteria.concat(this.persistAddToTempCrit);
859
- }
860
- // filter duplicate data in array
861
- request.criteria = this.filterDuplicateData(request.criteria);
862
- // filter empty value in listValue
863
- request.criteria = this.filterListValueEmpty(request.criteria);
864
- request.integrationObj = null;
865
- if (this.searchInput.isJoinExAPI) {
866
- request.integrationObj = this.searchInput.integrationObj;
867
- }
868
- this.http.post(apiUrl, request).subscribe((/**
869
- * @param {?} response
870
- * @return {?}
871
- */
872
- function (response) {
873
- if (IsExportExcel) {
874
- _this.ExcelData = response["Data"];
875
- /** @type {?} */
876
- var title = _this.configuration.title != null && _this.configuration.title != "" ? _this.configuration.title : "untitled";
877
- _this.excelService.exportAsExcelFile(_this.ExcelData, title);
878
- return;
879
- }
880
- /** @type {?} */
881
- var qryPaging = {
882
- response: response,
883
- pageNow: pageNo
884
- };
885
- console.log(qryPaging);
886
- _this.result.emit(qryPaging);
887
- _this.reqGetAllData.emit(request);
888
- return response;
889
- }));
890
- };
891
- /**
892
- * @private
893
- * @param {?} data
894
- * @return {?}
895
- */
896
- UCSearchComponent.prototype.filterDuplicateData = /**
897
- * @private
898
- * @param {?} data
899
- * @return {?}
900
- */
901
- function (data) {
902
- return data.filter((/**
903
- * @param {?} value
904
- * @param {?} index
905
- * @return {?}
906
- */
907
- function (value, index) {
908
- /** @type {?} */
909
- var _value = JSON.stringify(value);
910
- return index === data.findIndex((/**
911
- * @param {?} obj
912
- * @return {?}
913
- */
914
- function (obj) {
915
- return JSON.stringify(obj) === _value;
916
- }));
917
- }));
918
- };
919
- /**
920
- * @private
921
- * @param {?} data
922
- * @return {?}
923
- */
924
- UCSearchComponent.prototype.filterListValueEmpty = /**
925
- * @private
926
- * @param {?} data
927
- * @return {?}
928
- */
929
- function (data) {
930
- return data.filter((/**
931
- * @param {?} value
932
- * @return {?}
933
- */
934
- function (value) {
935
- if (value.listValue === undefined)
936
- return value;
937
- if (value.listValue.length === 0)
938
- return;
939
- return value;
940
- }));
941
- };
942
- /**
943
- * @return {?}
944
- */
945
- UCSearchComponent.prototype.GenerateReport = /**
946
- * @return {?}
947
- */
948
- function () {
949
- this.genRpt.emit({ ExportType: this.ExportType, ElRef: this.myForm });
950
- };
951
- /**
952
- * @return {?}
953
- */
954
- UCSearchComponent.prototype.lessThanFour = /**
955
- * @return {?}
956
- */
957
- function () {
958
- if (this.countForm > 3) {
959
- return false;
960
- }
961
- else {
962
- return true;
963
- }
964
- };
965
- /**
966
- * @param {?} obj
967
- * @param {?} url
968
- * @param {?=} crit
969
- * @return {?}
970
- */
971
- UCSearchComponent.prototype.resolveObject = /**
972
- * @param {?} obj
973
- * @param {?} url
974
- * @param {?=} crit
975
- * @return {?}
976
- */
977
- function (obj, url, crit) {
978
- var _this = this;
979
- if (crit === void 0) { crit = null; }
980
- /** @type {?} */
981
- var val = this.postJSON(url, crit);
982
- val.subscribe((/**
983
- * @param {?} tempData
984
- * @return {?}
985
- */
986
- function (tempData) {
987
- obj.itemsUrl = new Array();
988
- obj.itemsUrl = tempData.ReturnObject;
989
- if (obj.exclude != undefined && obj.exclude != "") {
990
- obj.itemsUrl = obj.itemsUrl.filter((/**
991
- * @param {?} value
992
- * @return {?}
993
- */
994
- function (value) { return !obj.exclude.includes(value.Key); }));
995
- }
996
- if (obj.type == "dropdownSearch" && obj.itemsUrl.length == 1) {
997
- obj.value = obj.itemsUrl[0].Key;
998
- obj.descr = obj.itemsUrl[0].Value;
999
- }
1000
- if (obj.affectedFilter && obj.itemsUrl.length == 1) {
1001
- _this.onChangeEvent(obj.itemsUrl[0].Key, obj);
1002
- }
1003
- }));
1004
- };
1005
- /**
1006
- * @param {?} component
1007
- * @return {?}
1008
- */
1009
- UCSearchComponent.prototype.checkValueGteLte = /**
1010
- * @param {?} component
1011
- * @return {?}
1012
- */
1013
- function (component) {
1014
- //cek yg pakai restriction gte/lte/gt/lt
1015
- /** @type {?} */
1016
- var MinComponent = this.configuration.component.find((/**
1017
- * @param {?} x
1018
- * @return {?}
1019
- */
1020
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GTE"); })) == undefined ? this.configuration.component.find((/**
1021
- * @param {?} x
1022
- * @return {?}
1023
- */
1024
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GT"); })) : this.configuration.component.find((/**
1025
- * @param {?} x
1026
- * @return {?}
1027
- */
1028
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GTE"); }));
1029
- /** @type {?} */
1030
- var MaxComponent = this.configuration.component.find((/**
1031
- * @param {?} x
1032
- * @return {?}
1033
- */
1034
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LTE"); })) == undefined ? this.configuration.component.find((/**
1035
- * @param {?} x
1036
- * @return {?}
1037
- */
1038
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LT"); })) : this.configuration.component.find((/**
1039
- * @param {?} x
1040
- * @return {?}
1041
- */
1042
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LTE"); }));
1043
- if (this.myForm.nativeElement[MinComponent.id].value > this.myForm.nativeElement[MaxComponent.id].value) {
1044
- this.toastr.warning(MinComponent.label + " must be less than " + MaxComponent.label);
1045
- return false;
1046
- }
1047
- return true;
1048
- };
1049
- /**
1050
- * @param {?} element
1051
- * @return {?}
1052
- */
1053
- UCSearchComponent.prototype.transformAmount = /**
1054
- * @param {?} element
1055
- * @return {?}
1056
- */
1057
- function (element) {
1058
- this.formattedAmount = parseFloat(element.target.value).toLocaleString('en');
1059
- // to show the formatted amount in the textbox.
1060
- element.target.value = this.formattedAmount;
1061
- };
1062
- /**
1063
- * @param {?} element
1064
- * @return {?}
1065
- */
1066
- UCSearchComponent.prototype.transformToDecimal = /**
1067
- * @param {?} element
1068
- * @return {?}
1069
- */
1070
- function (element) {
1071
- element.target.value = parseFloat(element.target.value.toString().replace(/,/g, ''));
1072
- };
1073
- /**
1074
- * @return {?}
1075
- */
1076
- UCSearchComponent.prototype.exportAsXLSX = /**
1077
- * @return {?}
1078
- */
1079
- function () {
1080
- this.searchClick(true);
1081
- // let request = new RequestCriteriaObj();
1082
- // request.pageNo = 1;
1083
- // request.rowPerPage = 9999;
1084
- // request.orderBy = null;
1085
- // request.criteria = [];
1086
- // request.queryString = this.configuration.querystring;
1087
- // if (!this.searchInput.isJoinExAPI) {
1088
- // request.integrationObj = null;
1089
- // } else {
1090
- // request.integrationObj = this.searchInput.integrationObj;
1091
- // }
1092
- // this.http.post(this.apiUrl, request).subscribe(
1093
- // response => {
1094
- // this.ExcelData = response["Data"];
1095
- // this.excelService.exportAsExcelFile(this.ExcelData, 'sample');
1096
- // },
1097
- // (error) => {
1098
- // console.log(error);
1099
- // });
1100
- };
1101
- /**
1102
- * @param {?} optValue
1103
- * @param {?} afFilter
1104
- * @return {?}
1105
- */
1106
- UCSearchComponent.prototype.onChangeEvent = /**
1107
- * @param {?} optValue
1108
- * @param {?} afFilter
1109
- * @return {?}
1110
- */
1111
- function (optValue, afFilter) {
1112
- /** @type {?} */
1113
- var jsonComp = this.configuration.component;
1114
- for (var i = 0; i < afFilter.affectedFilter.length; i++) {
1115
- for (var j = 0; j < jsonComp.length; j++) {
1116
- if (jsonComp[j].name == afFilter.affectedFilter[i]) {
1117
- /** @type {?} */
1118
- var request = new RequestCriteriaObj();
1119
- /** @type {?} */
1120
- var arrayCrit = new Array();
1121
- if (optValue != "all" && optValue != "one") {
1122
- /** @type {?} */
1123
- var critObj = new CriteriaObj();
1124
- critObj.DataType = afFilter.datatype;
1125
- if (afFilter.filterPropName != undefined || afFilter.filterPropName != "") {
1126
- request[afFilter.filterPropName] = optValue;
1127
- critObj.propName = afFilter.filterPropName;
1128
- }
1129
- else {
1130
- critObj.propName = afFilter.name;
1131
- request[afFilter.name] = optValue;
1132
- }
1133
- critObj.value = optValue;
1134
- critObj.restriction = AdInsConstant.RestrictionEq;
1135
- arrayCrit.push(critObj);
1136
- }
1137
- request.criteria = arrayCrit;
1138
- if (jsonComp[j].path != undefined && jsonComp[j].path != "") {
1139
- if (this.searchInput.listEnvironments != undefined && this.searchInput.listEnvironments.length != 0) {
1140
- for (var y = 0; y < this.searchInput.listEnvironments.length; y++) {
1141
- if (jsonComp[j].environment == this.searchInput.listEnvironments[y].environment) {
1142
- jsonComp[j].fullpath = this.searchInput.listEnvironments[y].url + jsonComp[j].path;
1143
- break;
1144
- }
1145
- }
1146
- }
1147
- else {
1148
- jsonComp[j].fullpath = jsonComp[j].url;
1149
- }
1150
- }
1151
- else {
1152
- jsonComp[j].fullpath = jsonComp[j].url;
1153
- }
1154
- this.resolveObject(jsonComp[j], jsonComp[j].fullpath, request);
1155
- }
1156
- }
1157
- }
1158
- };
1159
- /**
1160
- * @param {?} idx
1161
- * @param {?} wfKeyFilter
1162
- * @return {?}
1163
- */
1164
- UCSearchComponent.prototype.SetProcessKey = /**
1165
- * @param {?} idx
1166
- * @param {?} wfKeyFilter
1167
- * @return {?}
1168
- */
1169
- function (idx, wfKeyFilter) {
1170
- /** @type {?} */
1171
- var component = this.myForm.nativeElement[idx];
1172
- /** @type {?} */
1173
- var ddl = component.options;
1174
- /** @type {?} */
1175
- var text = ddl[ddl.selectedIndex].value.trim();
1176
- /** @type {?} */
1177
- var listValue = text.split(';');
1178
- /** @type {?} */
1179
- var listWfKey = wfKeyFilter.split(';');
1180
- for (var i = 0; i < listValue.length; i++) {
1181
- this.searchInput.integrationObj.requestObj[listWfKey[i]] = listValue[i];
1182
- }
1183
- };
1184
- /**
1185
- * @param {?} condList
1186
- * @return {?}
1187
- */
1188
- UCSearchComponent.prototype.switchCase = /**
1189
- * @param {?} condList
1190
- * @return {?}
1191
- */
1192
- function (condList) {
1193
- /** @type {?} */
1194
- var condition = false;
1195
- var _loop_1 = function (i) {
1196
- /** @type {?} */
1197
- var idx = this_1.searchInput.switchValue.findIndex((/**
1198
- * @param {?} x
1199
- * @return {?}
1200
- */
1201
- function (x) { return x.property == condList.conditions[i].property; }));
1202
- if (condList.conditions[i].restriction == "EQ") {
1203
- if (condList.conditions[i].isUser != true) {
1204
- if (this_1.searchInput.switchValue[idx].value == condList.conditions[i].value) {
1205
- condition = true;
1206
- }
1207
- else {
1208
- condition = false;
1209
- return "break";
1210
- }
1211
- }
1212
- else {
1213
- /** @type {?} */
1214
- var username = localStorage.getItem("Username");
1215
- if (this_1.searchInput.switchValue[idx].value == username) {
1216
- condition = true;
1217
- }
1218
- else {
1219
- condition = false;
1220
- return "break";
1221
- }
1222
- }
1223
- }
1224
- else if (condList.conditions[i].restriction == "NEQ") {
1225
- if (condList.conditions[i].isUser != true) {
1226
- if (this_1.searchInput.switchValue[idx].value != condList.conditions[i].value) {
1227
- condition = true;
1228
- }
1229
- else {
1230
- condition = false;
1231
- return "break";
1232
- }
1233
- }
1234
- else {
1235
- /** @type {?} */
1236
- var username = localStorage.getItem("Username");
1237
- if (this_1.searchInput.switchValue[idx].value != username) {
1238
- condition = true;
1239
- }
1240
- else {
1241
- condition = false;
1242
- return "break";
1243
- }
1244
- }
1245
- }
1246
- else if (condList.conditions[i].restriction == "GT") {
1247
- if (condList.conditions[i].isUser != true) {
1248
- if (this_1.searchInput.switchValue[idx].value > condList.conditions[i].value) {
1249
- condition = true;
1250
- }
1251
- else {
1252
- condition = false;
1253
- return "break";
1254
- }
1255
- }
1256
- else {
1257
- /** @type {?} */
1258
- var username = localStorage.getItem("Username");
1259
- if (this_1.searchInput.switchValue[idx].value > username) {
1260
- condition = true;
1261
- }
1262
- else {
1263
- condition = false;
1264
- return "break";
1265
- }
1266
- }
1267
- }
1268
- else if (condList.conditions[i].restriction == "GTE") {
1269
- if (condList.conditions[i].isUser != true) {
1270
- if (this_1.searchInput.switchValue[idx].value >= condList.conditions[i].value) {
1271
- condition = true;
1272
- }
1273
- else {
1274
- condition = false;
1275
- return "break";
1276
- }
1277
- }
1278
- else {
1279
- /** @type {?} */
1280
- var username = localStorage.getItem("Username");
1281
- if (this_1.searchInput.switchValue[idx].value >= username) {
1282
- condition = true;
1283
- }
1284
- else {
1285
- condition = false;
1286
- return "break";
1287
- }
1288
- }
1289
- }
1290
- else if (condList.conditions[i].restriction == "LT") {
1291
- if (condList.conditions[i].isUser != true) {
1292
- if (this_1.searchInput.switchValue[idx].value < condList.conditions[i].value) {
1293
- condition = true;
1294
- }
1295
- else {
1296
- condition = false;
1297
- return "break";
1298
- }
1299
- }
1300
- else {
1301
- /** @type {?} */
1302
- var username = localStorage.getItem("Username");
1303
- if (this_1.searchInput.switchValue[idx].value < username) {
1304
- condition = true;
1305
- }
1306
- else {
1307
- condition = false;
1308
- return "break";
1309
- }
1310
- }
1311
- }
1312
- else if (condList.conditions[i].restriction == "LTE") {
1313
- if (condList.conditions[i].isUser != true) {
1314
- if (this_1.searchInput.switchValue[idx].value <= condList.conditions[i].value) {
1315
- condition = true;
1316
- }
1317
- else {
1318
- condition = false;
1319
- return "break";
1320
- }
1321
- }
1322
- else {
1323
- /** @type {?} */
1324
- var username = localStorage.getItem("Username");
1325
- if (this_1.searchInput.switchValue[idx].value <= username) {
1326
- condition = true;
1327
- }
1328
- else {
1329
- condition = false;
1330
- return "break";
1331
- }
1332
- }
1333
- }
1334
- };
1335
- var this_1 = this;
1336
- for (var i = 0; i < condList.conditions.length; i++) {
1337
- var state_1 = _loop_1(i);
1338
- if (state_1 === "break")
1339
- break;
1340
- }
1341
- return condition;
1342
- };
1343
- /**
1344
- * @private
1345
- * @param {?} chipperText
1346
- * @param {?} chipperKey
1347
- * @return {?}
1348
- */
1349
- UCSearchComponent.prototype.DecryptString = /**
1350
- * @private
1351
- * @param {?} chipperText
1352
- * @param {?} chipperKey
1353
- * @return {?}
1354
- */
1355
- function (chipperText, chipperKey) {
1356
- if (chipperKey == undefined || chipperKey.trim() == '' ||
1357
- chipperText == undefined || chipperText.trim() == '')
1358
- return chipperText;
1359
- /** @type {?} */
1360
- var chipperKeyArr = CryptoJS.enc.Utf8.parse(chipperKey);
1361
- /** @type {?} */
1362
- var iv = CryptoJS.lib.WordArray.create([0x00, 0x00, 0x00, 0x00]);
1363
- /** @type {?} */
1364
- var decrypted = CryptoJS.AES.decrypt(chipperText, chipperKeyArr, { iv: iv });
1365
- /** @type {?} */
1366
- var plainText = decrypted.toString(CryptoJS.enc.Utf8);
1367
- return plainText;
1368
- };
1369
- /**
1370
- * @param {?} component
1371
- * @return {?}
1372
- */
1373
- UCSearchComponent.prototype.checkInputDate = /**
1374
- * @param {?} component
1375
- * @return {?}
1376
- */
1377
- function (component) {
1378
- /** @type {?} */
1379
- var minDateVal;
1380
- /** @type {?} */
1381
- var maxDateVal;
1382
- /** @type {?} */
1383
- var label;
1384
- /** @type {?} */
1385
- var errorMessage = new Array();
1386
- /** @type {?} */
1387
- var MinComponent = this.configuration.component.find((/**
1388
- * @param {?} x
1389
- * @return {?}
1390
- */
1391
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GTE"); })) == undefined ? this.configuration.component.find((/**
1392
- * @param {?} x
1393
- * @return {?}
1394
- */
1395
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GT"); })) : this.configuration.component.find((/**
1396
- * @param {?} x
1397
- * @return {?}
1398
- */
1399
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "GTE"); }));
1400
- if (MinComponent != undefined) {
1401
- minDateVal = this.myForm.nativeElement[MinComponent.id].min == "" ? null : new Date(this.myForm.nativeElement[MinComponent.id].min);
1402
- label = MinComponent.label.split(">", 2);
1403
- if (minDateVal != null) {
1404
- if (MinComponent.restriction.toUpperCase() == "GT") {
1405
- minDateVal.setDate(minDateVal.getDate() - 1);
1406
- errorMessage.push(" must be greater than ");
1407
- }
1408
- else if (MinComponent.restriction.toUpperCase() == "GTE") {
1409
- errorMessage.push(" must be greater than or equals to ");
1410
- }
1411
- }
1412
- }
1413
- /** @type {?} */
1414
- var MaxComponent = this.configuration.component.find((/**
1415
- * @param {?} x
1416
- * @return {?}
1417
- */
1418
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LTE"); })) == undefined ? this.configuration.component.find((/**
1419
- * @param {?} x
1420
- * @return {?}
1421
- */
1422
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LT"); })) : this.configuration.component.find((/**
1423
- * @param {?} x
1424
- * @return {?}
1425
- */
1426
- function (x) { return x.name == component.name && (x.restriction.toUpperCase() == "LTE"); }));
1427
- if (MaxComponent != undefined) {
1428
- maxDateVal = this.myForm.nativeElement[MaxComponent.id].max == "" ? null : new Date(this.myForm.nativeElement[MaxComponent.id].max);
1429
- label = MaxComponent.label.split("<", 2);
1430
- if (maxDateVal != null) {
1431
- if (MaxComponent.restriction.toUpperCase() == "LT") {
1432
- maxDateVal.setDate(maxDateVal.getDate() + 1);
1433
- errorMessage.push(" must be less than ");
1434
- }
1435
- else if (MaxComponent.restriction.toUpperCase() == "LTE") {
1436
- errorMessage.push(" must be less than or equals to ");
1437
- }
1438
- }
1439
- }
1440
- if (minDateVal != null && maxDateVal == null && new Date(this.myForm.nativeElement[MinComponent.id].value) < minDateVal) {
1441
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(minDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1442
- this.dateWrong = true;
1443
- }
1444
- else if (maxDateVal != null && minDateVal == null && new Date(this.myForm.nativeElement[MaxComponent.id].value) > maxDateVal) {
1445
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(maxDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1446
- this.dateWrong = true;
1447
- }
1448
- else if (minDateVal != null && maxDateVal != null) {
1449
- if (new Date(this.myForm.nativeElement[MaxComponent.id].value) > maxDateVal || new Date(this.myForm.nativeElement[MinComponent.id].value) < minDateVal) {
1450
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(minDateVal, 'dd MMMM yyyy', 'en-US') + " and" + errorMessage[1] + formatDate(maxDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1451
- this.dateWrong = true;
1452
- }
1453
- else {
1454
- this.dateWrong = false;
1455
- }
1456
- }
1457
- else {
1458
- this.dateWrong = false;
1459
- }
1460
- };
1461
- /**
1462
- * @param {?} item
1463
- * @param {?} crit
1464
- * @return {?}
1465
- */
1466
- UCSearchComponent.prototype.selectedOption = /**
1467
- * @param {?} item
1468
- * @param {?} crit
1469
- * @return {?}
1470
- */
1471
- function (item, crit) {
1472
- crit.descr = item.Value;
1473
- crit.isListHide = true;
1474
- };
1475
- UCSearchComponent.decorators = [
1476
- { type: Component, args: [{
1477
- selector: 'lib-UCSearch',
1478
- template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformAmount($event)\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"{{question.isTime ? 'datetime-local' : 'date'}}\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name+[i]}}\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n [readonly]=\"question.readonly\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\" min=\"{{question.minDate | date:'yyyy-MM-dd'}}\"\r\n max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-form-control\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [(ngModel)]=\"question.value\" [required]=\"question.isRequired\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control search-form-control dds-input\"\r\n name=\"{{'ddsValue'+question.name}}\" [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-form-control\"\r\n name=\"{{'searchText'+question.name}}\" [(ngModel)]=\"question.searchText\"\r\n [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-form-control\"\r\n attr.data-type=\"{{'text'}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-name=\"{{'Assignee'}}\" [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <lib-uc-show-errors *ngIf=\"question.type!='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type=='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Export Excel</span>\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i>&nbsp;<span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick>\r\n <i class=\"fa fa-search\"></i>&nbsp;<span translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport()\"\r\n class=\"btn btn-raised btn-primary\">\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->",
1479
- providers: [ExcelService, DatePipe],
1480
- animations: [
1481
- trigger('changeDivSize', [
1482
- state('initial', style({
1483
- height: '*',
1484
- opacity: '1',
1485
- })),
1486
- state('final', style({
1487
- height: '0px',
1488
- opacity: '0',
1489
- overflow: 'hidden',
1490
- })),
1491
- transition('initial=>final', animate('300ms')),
1492
- transition('final=>initial', animate('300ms'))
1493
- ]),
1494
- ],
1495
- styles: [".ucSearch-title{margin:3px}.dds-input{background-color:#fff;text-transform:uppercase}.dds-display-item:after{content:'\\e929';font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}"]
1496
- }] }
1497
- ];
1498
- /** @nocollapse */
1499
- UCSearchComponent.ctorParameters = function () { return [
1500
- { type: HttpClient },
1501
- { type: ExcelService },
1502
- { type: Renderer2 },
1503
- { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
1504
- { type: ToastrService },
1505
- { type: CookieService },
1506
- { type: DatePipe },
1507
- { type: ElementRef },
1508
- { type: ActivatedRoute }
1509
- ]; };
1510
- UCSearchComponent.propDecorators = {
1511
- content: [{ type: ViewChild, args: ['enjiForm',] }],
1512
- myForm: [{ type: ViewChild, args: ['formIdSearch',] }],
1513
- searchInput: [{ type: Input }],
1514
- pageSize: [{ type: Input }],
1515
- isReport: [{ type: Input }],
1516
- result: [{ type: Output }],
1517
- genRpt: [{ type: Output }],
1518
- reqGetAllData: [{ type: Output }]
1519
- };
1520
- return UCSearchComponent;
1521
- }());
1522
- export { UCSearchComponent };
1523
- if (false) {
1524
- /** @type {?} */
1525
- UCSearchComponent.prototype.myForm;
1526
- /** @type {?} */
1527
- UCSearchComponent.prototype.searchInput;
1528
- /** @type {?} */
1529
- UCSearchComponent.prototype.pageSize;
1530
- /** @type {?} */
1531
- UCSearchComponent.prototype.isReport;
1532
- /** @type {?} */
1533
- UCSearchComponent.prototype.result;
1534
- /** @type {?} */
1535
- UCSearchComponent.prototype.genRpt;
1536
- /** @type {?} */
1537
- UCSearchComponent.prototype.reqGetAllData;
1538
- /** @type {?} */
1539
- UCSearchComponent.prototype.ExportTypeList;
1540
- /** @type {?} */
1541
- UCSearchComponent.prototype.ListOfMonth;
1542
- /** @type {?} */
1543
- UCSearchComponent.prototype.ListOfYear;
1544
- /** @type {?} */
1545
- UCSearchComponent.prototype.ClaimList;
1546
- /** @type {?} */
1547
- UCSearchComponent.prototype.ExportType;
1548
- /** @type {?} */
1549
- UCSearchComponent.prototype.pageNow;
1550
- /** @type {?} */
1551
- UCSearchComponent.prototype.configuration;
1552
- /** @type {?} */
1553
- UCSearchComponent.prototype.exportData;
1554
- /** @type {?} */
1555
- UCSearchComponent.prototype.ExcelData;
1556
- /** @type {?} */
1557
- UCSearchComponent.prototype.isDataLoaded;
1558
- /** @type {?} */
1559
- UCSearchComponent.prototype.isHidden;
1560
- /** @type {?} */
1561
- UCSearchComponent.prototype.BisDt;
1562
- /** @type {?} */
1563
- UCSearchComponent.prototype.BusinessDt;
1564
- /** @type {?} */
1565
- UCSearchComponent.prototype.dateWrong;
1566
- /** @type {?} */
1567
- UCSearchComponent.prototype.readonly;
1568
- /** @type {?} */
1569
- UCSearchComponent.prototype.currentState;
1570
- /** @type {?} */
1571
- UCSearchComponent.prototype.form;
1572
- /** @type {?} */
1573
- UCSearchComponent.prototype.countForm;
1574
- /** @type {?} */
1575
- UCSearchComponent.prototype.formattedAmount;
1576
- /** @type {?} */
1577
- UCSearchComponent.prototype.amount;
1578
- /** @type {?} */
1579
- UCSearchComponent.prototype.apiUrl;
1580
- /** @type {?} */
1581
- UCSearchComponent.prototype.arrCrit;
1582
- /** @type {?} */
1583
- UCSearchComponent.prototype.searchForm;
1584
- /** @type {?} */
1585
- UCSearchComponent.prototype.queryParam;
1586
- /** @type {?} */
1587
- UCSearchComponent.prototype.persistCrit;
1588
- /** @type {?} */
1589
- UCSearchComponent.prototype.persistAddToTempCrit;
1590
- /**
1591
- * @type {?}
1592
- * @private
1593
- */
1594
- UCSearchComponent.prototype.http;
1595
- /**
1596
- * @type {?}
1597
- * @private
1598
- */
1599
- UCSearchComponent.prototype.excelService;
1600
- /**
1601
- * @type {?}
1602
- * @private
1603
- */
1604
- UCSearchComponent.prototype._renderer2;
1605
- /**
1606
- * @type {?}
1607
- * @private
1608
- */
1609
- UCSearchComponent.prototype._document;
1610
- /** @type {?} */
1611
- UCSearchComponent.prototype.toastr;
1612
- /**
1613
- * @type {?}
1614
- * @private
1615
- */
1616
- UCSearchComponent.prototype.cookieService;
1617
- /**
1618
- * @type {?}
1619
- * @private
1620
- */
1621
- UCSearchComponent.prototype.datePipe;
1622
- /**
1623
- * @type {?}
1624
- * @private
1625
- */
1626
- UCSearchComponent.prototype.elemRef;
1627
- /**
1628
- * @type {?}
1629
- * @private
1630
- */
1631
- UCSearchComponent.prototype.route;
1632
- }
1633
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFkaW5zL3Vjc2VhcmNoLyIsInNvdXJjZXMiOlsibGliL3Vjc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUV2SSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFhLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFxQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRDtJQXNHRSwyQkFBb0IsSUFBZ0IsRUFBVSxZQUEwQixFQUFVLFVBQXFCLEVBQzNFLFNBQVMsRUFBUyxNQUFxQixFQUFVLGFBQTRCLEVBQy9GLFFBQWtCLEVBQVUsT0FBbUIsRUFBVSxLQUFxQjtRQUZ4RixpQkFNQztRQU5tQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQzNFLGNBQVMsR0FBVCxTQUFTLENBQUE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDL0YsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQWpFL0UsZ0JBQVcsR0FBbUIsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuRCxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDekIsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9DLFdBQU0sR0FBNEQsSUFBSSxZQUFZLEVBQTZDLENBQUM7UUFDaEksa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRSxtQkFBYyxHQUE2QjtZQUN6QztnQkFDRSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsWUFBWTtnQkFDcEMsS0FBSyxFQUFFLEtBQUs7YUFDYjtZQUNEO2dCQUNFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhO2dCQUNyQyxLQUFLLEVBQUUsWUFBWTthQUNwQjtZQUNEO2dCQUNFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhO2dCQUNyQyxLQUFLLEVBQUUsY0FBYzthQUN0QjtZQUNEO2dCQUNFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhO2dCQUNyQyxLQUFLLEVBQUUsYUFBYTthQUNyQjtTQUNGLENBQUM7UUFDRixnQkFBVyxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDekQsZUFBVSxHQUErQixJQUFJLEtBQUssRUFBdUIsQ0FBQztRQUMxRSxjQUFTLEdBQWU7WUFDdEI7Z0JBQ0UsR0FBRyxFQUFFLGFBQWEsQ0FBQyxvQkFBb0I7Z0JBQ3ZDLEtBQUssRUFBRSxTQUFTO2FBQ2pCO1lBQ0Q7Z0JBQ0UsR0FBRyxFQUFFLGFBQWEsQ0FBQyxpQkFBaUI7Z0JBQ3BDLEtBQUssRUFBRSxXQUFXO2FBQ25CO1NBQ0YsQ0FBQztRQUVGLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFFdkIsWUFBTyxHQUFRLENBQUMsQ0FBQztRQUlqQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLGVBQVUsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixpQkFBWSxHQUFHLFNBQVMsQ0FBQztRQUd6QixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2Qsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQVdQLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVM7Ozs7UUFBQyxVQUFBLE1BQU07WUFDckMsS0FBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDM0IsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDO0lBNUVELHNCQUEyQixzQ0FBTztRQVRsQyw4QkFBOEI7UUFDOUIsOENBQThDO1FBQzlDLDRCQUE0QjtRQUM1Qix3RUFBd0U7UUFDeEUsd0JBQXdCO1FBQ3hCLDhCQUE4QjtRQUM5QixNQUFNO1FBQ04sSUFBSTs7Ozs7Ozs7Ozs7Ozs7UUFFSixVQUFtQyxPQUFlO1lBQ2hELElBQUksT0FBTyxFQUFFLEVBQUUsOENBQThDO2dCQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQzthQUMzQjtRQUNILENBQUM7OztPQUFBOzs7O0lBMEVELHVDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3pELENBQUM7Ozs7SUFFSyxvQ0FBUTs7O0lBQWQ7Ozs7Ozt3QkFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO3dCQUM3RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO3dCQUN2QyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO3dCQUNoRCxFQUFFLENBQUMsSUFBSSxHQUFHLHFMQU1MLENBQUM7d0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBRWpELEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdkMscUJBQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFBOzt3QkFBekIsU0FBeUIsQ0FBQzs7Ozs7S0FDM0I7Ozs7SUFFSyx3Q0FBWTs7O0lBQWxCOzs7Ozs0QkFDRSxxQkFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUzs7Ozt3QkFBQyxVQUFBLElBQUk7NEJBQ3RELEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOzRCQUMxQixLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7NEJBQ25DLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUN2RSxLQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7Z0NBQzFDLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7NkJBQzlDOzRCQUVELEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7NEJBQ3ZDLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOzRCQUV6QixJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUU7Z0NBQ3ZFLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDOzZCQUNuRDs0QkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDdkMsb0NBQW9DO2dDQUNwQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTs7d0NBQ25DLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFOzt3Q0FDbEMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFOzt3Q0FDdkIsY0FBYyxHQUFHLElBQUksV0FBVyxFQUFFO29DQUN0QyxjQUFjLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztvQ0FDakMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO29DQUM3RCxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7b0NBQzNELGNBQWMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO29DQUNsQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29DQUMvQixPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztvQ0FDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO29DQUVsRixzQ0FBc0M7b0NBQ3RDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRTt3Q0FDdkUsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixJQUFJLFNBQVMsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7NENBQ25HLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnREFDakUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtvREFDckYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0RBQy9GLE1BQU07aURBQ1A7NkNBQ0Y7eUNBQ0Y7NkNBQU07NENBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7eUNBQ3BEO3FDQUVGO3lDQUFNO3dDQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO3FDQUNwRDtvQ0FDRCx5RkFBeUY7b0NBQ3pGLDBDQUEwQztvQ0FDMUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lDQUM1RTtnQ0FFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtvQ0FDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2lDQUNwRjtnQ0FFRCxnQkFBZ0I7Z0NBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFO29DQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRTt3Q0FDMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7NENBQy9DLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnREFDbEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NkNBQzlFOzRDQUNELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQzt5Q0FDdkU7d0NBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7NENBQzlDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnREFDbEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NkNBQzdFOzRDQUNELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQzt5Q0FDdEU7cUNBQ0Y7aUNBQ0Y7Z0NBQ0QsNEhBQTRIO2dDQUM1SCx3RkFBd0Y7Z0NBQ3hGLHVDQUF1QztnQ0FDdkMsdUNBQXVDO2dDQUN2QyxxREFBcUQ7Z0NBQ3JELHVDQUF1QztnQ0FDdkMsOENBQThDO2dDQUM5QyxNQUFNO2dDQUNOLElBQUk7Z0NBQ0osSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0NBQ3JILElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQ0FDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lDQUM1RDtnQ0FDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7b0NBQzFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQ0FDN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLO3dDQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztvQ0FDeEUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLO3dDQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztpQ0FDekU7Z0NBQ0Qsb0JBQW9CO2dDQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRTtvQ0FDMUMsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtvQ0FFMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7OzRDQUN0QyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUU7d0NBQzdCLElBQUksS0FBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7NENBQ3RCLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7eUNBQ3JDOzs0Q0FDRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7NENBQzVDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRTt3Q0FDekIsSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFOztnREFDZixTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7O2dEQUNqRCxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0Q0FDbkMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7eUNBQ3ZEOzZDQUNJLElBQUksUUFBUSxJQUFJLEdBQUcsRUFBRTs7Z0RBQ3BCLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Z0RBQ2pELE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRDQUNuQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQzt5Q0FDdkQ7d0NBQ0QsUUFBUSxHQUFHLFlBQVksQ0FBQzs7NENBQ3BCLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUM7d0NBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztxQ0FDcEM7b0NBRUQsSUFBSSxLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRTt3Q0FDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFOzRDQUNyRixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTs7b0RBQ25ELE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztnREFDeEYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0RBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs2Q0FDckM7aURBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7O29EQUMxRCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0RBQ3hGLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dEQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7NkNBQ3JDO3lDQUNGO3FDQUNGO2lDQUNGO2dDQUVELElBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO29DQUN0QyxLQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQzFFOzZCQUNGOzRCQUVELFVBQVU7Ozs0QkFBQztnQ0FDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0NBQzdGLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQ0FDMUU7b0NBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxpQkFBaUIsSUFBSSxLQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3Q0FDdEcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO3FDQUM1QjtpQ0FDRjs0QkFDSCxDQUFDLEdBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ1gsQ0FBQyxFQUFDLEVBQUE7O3dCQWpKRixTQWlKRSxDQUFDOzs7OztLQUNKOzs7Ozs7SUFFTyxvQ0FBUTs7Ozs7SUFBaEIsVUFBaUIsSUFBUztRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQzs7WUFDbEMsUUFBUSxHQUEyQixJQUFJLENBQUMsUUFBUTtRQUN0RCxJQUFJLFFBQVEsSUFBSSxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFFRCw4Q0FBa0I7Ozs7SUFBbEIsVUFBbUIsQ0FBUzs7WUFDdEIsS0FBSyxHQUFXLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQzs7WUFDcEQsVUFBVSxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7WUFDOUUsUUFBUSxHQUFXLFVBQVUsQ0FBQyxVQUFVLENBQUM7O1lBQ3pDLG1CQUFtQixHQUFrQixJQUFJLEtBQUssRUFBRTtRQUNwRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBQy9CLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7O1lBQ3hDLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTzs7WUFDdkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDL0gsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O29CQUM5RSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDL0QsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3hEO1NBQ0Y7YUFBTTtZQUNMLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO0lBQ3RGLENBQUM7Ozs7O0lBRUQsZ0RBQW9COzs7O0lBQXBCLFVBQXFCLEtBQUs7O1lBQ3BCLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOztZQUN4QyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7O1lBQzFCLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1lBQ3BDLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRO1lBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLFFBQVEsSUFBSSxHQUFHLEVBQUU7WUFDbkIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDM0Q7YUFDSSxJQUFJLFFBQVEsSUFBSSxHQUFHLEVBQUU7WUFDeEIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDM0Q7UUFDRCxPQUFPLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxDQUFDOzs7OztJQUNELHVDQUFXOzs7O0lBQVgsVUFBWSxLQUFLOztZQUNYLFdBQXVDOztZQUN2QyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQzs7WUFDcEQsS0FBSyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFOztZQUMxQyxLQUFLLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7O1lBQzFDLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDOztZQUMxQixNQUFNLEdBQVcsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkYsSUFBSSxNQUFNLElBQUksRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDdEQsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7WUFDbkcsV0FBVyxHQUFnQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVc7UUFDM0UsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksS0FBSyxJQUFJLENBQUM7b0JBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDN0Q7WUFDRCxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDN0Q7U0FDRjtRQUNELFdBQVcsQ0FBQyxJQUFJOzs7OztRQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxFQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOzs7OztJQUVELCtDQUFtQjs7OztJQUFuQixVQUFvQixLQUFLOztZQUNuQixZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7WUFDeEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOztZQUMxQixTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztZQUNwQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFO1lBQ25CLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO2FBQ0ksSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFO1lBQ3hCLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsT0FBTyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7Ozs7SUFDRCxzQ0FBVTs7OztJQUFWLFVBQVcsSUFBSTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7O1lBQy9DLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDOztZQUNuRCxLQUFLLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7O1lBQzdDLEtBQUssR0FBVyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTs7WUFDN0MsTUFBTSxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTlHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlDLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3hHO2lCQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDN0IsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDN0IsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQy9EO1NBQ0Y7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7Ozs7O1FBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2QixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOzs7OztJQUVNLG1DQUFPOzs7O0lBQWQsVUFBZSxHQUFXO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7O0lBRU0sb0NBQVE7Ozs7O0lBQWYsVUFBZ0IsR0FBVyxFQUFFLFFBQW9CO1FBQXBCLHlCQUFBLEVBQUEsZUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQzs7Ozs7SUFFRCx1Q0FBVzs7OztJQUFYLFVBQVksYUFBOEI7UUFBOUIsOEJBQUEsRUFBQSxxQkFBOEI7O1lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNOzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRztZQUM5RCxJQUFHLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssRUFBRTtnQkFBRSxPQUFPO1lBQzNFLE9BQU8sR0FBRyxDQUFDLFNBQVM7Ozs7WUFBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQTFDLENBQTBDLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0UsQ0FBQyxFQUFDO1FBRUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRTtnQkFDckUsSUFBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUUsT0FBTzthQUNoRDtTQUNGOztZQUVHLEtBQUssR0FBRyxJQUFJO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ3RDLEtBQUssR0FBRztnQkFDTixHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRztnQkFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUs7YUFDeEMsQ0FBQTtTQUNGO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7O1lBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRO1FBQzlCLElBQUksYUFBYTtZQUFFLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMvRixDQUFDOzs7O0lBRUssaUNBQUs7OztJQUFYOzs7Ozt3QkFDRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQzs0QkFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRzt5QkFDdkMsQ0FBQyxDQUFDO3dCQUNILHFCQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBQTs7d0JBQXpCLFNBQXlCLENBQUM7Ozs7O0tBQzNCOzs7Ozs7Ozs7Ozs7O0lBRUQsa0NBQU07Ozs7Ozs7Ozs7OztJQUFOLFVBQU8sTUFBYyxFQUFFLE1BQWMsRUFBRSxVQUFrQixFQUFFLE9BQVksRUFBRSxhQUFzQixFQUFFLE9BQW9DLEVBQUUsYUFBOEIsRUFBRSxXQUE0QixFQUFFLGFBQTBDO1FBQS9PLGlCQWtOQztRQWxOZ0csd0JBQUEsRUFBQSxjQUE2QixLQUFLLEVBQUU7UUFBRSw4QkFBQSxFQUFBLHFCQUE4QjtRQUFFLDRCQUFBLEVBQUEsbUJBQTRCO1FBQUUsOEJBQUEsRUFBQSxvQkFBbUMsS0FBSyxFQUFFOztZQUN6TyxPQUFPLEdBQUcsSUFBSSxrQkFBa0IsRUFBRTs7WUFDbEMsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFFOztZQUNyQixTQUFTLEdBQUcsS0FBSzs7WUFDakIsT0FBTyxHQUFHLEtBQUs7UUFFbkIsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7WUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0RjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNyRixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztZQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BGO1NBQ0Y7UUFDRCxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN4QixPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNoQyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUMxQixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDOztZQUVqRCxPQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDbkMsT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFO2dCQUM1RCxPQUFPLElBQUksQ0FBQyxDQUFDO2FBQ2Q7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUM7YUFDWDs7Z0JBQ0csU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUVsRCwrQkFBK0I7WUFDL0IsOEdBQThHO1lBQzlHLHNDQUFzQztZQUN0QyxxQkFBcUI7WUFDckIsc0JBQXNCO1lBQ3RCLG1EQUFtRDtZQUNuRCxvREFBb0Q7WUFDcEQsYUFBYTtZQUNiLE1BQU07WUFDTixJQUFJO1lBRUosT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELGlDQUFpQztZQUNqQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxFQUFFO2dCQUM5RixTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ2xCO2lCQUNJO2dCQUNILFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDbkI7WUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFO2dCQUN6QixJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFOzt3QkFDOUIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPOzt3QkFDdkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtvQkFDOUMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFO3dCQUNqQixPQUFPLEdBQUcsSUFBSSxDQUFDOzs0QkFDWCxLQUFLLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7d0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDO3dCQUM5QyxNQUFNO3FCQUNQO29CQUVELElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLElBQUksSUFBSSxFQUFFO3dCQUNoSCxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO3FCQUM3RTtvQkFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxtQkFBbUI7d0JBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxZQUFZO3dCQUNwRCxTQUFTO29CQUVYLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRTt3QkFDbkQsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUN2RCxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDM0IsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7d0JBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3ZCO3FCQUNGO3lCQUFNO3dCQUNMLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFOzRCQUNsQyx3Q0FBd0M7NEJBQ3hDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQzs0QkFDbEQsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRTtnQ0FDeEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDOzZCQUNuQztpQ0FBTTtnQ0FDTCxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7NkJBQ3hEOzRCQUNELE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFO2dDQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzZCQUN2Qjt5QkFDRjs2QkFBTSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7O2dDQUMxRSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQUU7NEJBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29DQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQ0FDMUM7NkJBQ0Y7NEJBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQ0FDdkIsT0FBTyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDO2dDQUNsRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFO29DQUN4QixPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7aUNBQ25DO3FDQUFNO29DQUNMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDeEQ7Z0NBQ0QsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0NBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUU7b0NBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUNBQ3ZCOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO3FCQUNJO29CQUNILGtFQUFrRTtvQkFDbEUsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRTt3QkFDeEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO3FCQUNuQzt5QkFBTTt3QkFDTCxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3hEO29CQUNELE9BQU8sQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDakMsT0FBTyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDO3FCQUNyRDtvQkFDRCwyRUFBMkU7eUJBQ3RFLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxFQUFFO3dCQUMvRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDakUsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsRUFBRTs0QkFDcEQsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7eUJBQzFFO3dCQUNELElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLEVBQUU7NEJBQy9DLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDOzRCQUNuRCxPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUE7eUJBQ3BEO3FCQUNGO3lCQUNJO3dCQUNILE9BQU8sQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQTtxQkFDbEQ7b0JBQ0QsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsSUFBSSxJQUFJLEVBQUU7d0JBQ2hILE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7cUJBQzdFO29CQUNELElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3ZCO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELElBQUksT0FBTyxFQUFFO1lBQ1gsT0FBTztTQUNSO1FBRUQsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUU7WUFDM0MsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFCO2FBQ0Y7aUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksU0FBUyxFQUFFO2dCQUM5RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7U0FDRjthQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFNBQVMsRUFBRTtZQUM1RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7U0FDRjtRQUVELElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXBDLElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztTQUMzQztRQUVELElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtZQUMzQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsaUNBQWlDO1FBQ2pDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUU3RCxrQ0FBa0M7UUFDbEMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9ELE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDaEMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztTQUMxRDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQyxRQUFRO1lBQ2pELElBQUksYUFBYSxFQUFFO2dCQUNqQixLQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7b0JBQzlCLEtBQUssR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVTtnQkFDckgsS0FBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRCxPQUFPO2FBQ1I7O2dCQUNHLFNBQVMsR0FBRztnQkFDZCxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsT0FBTyxFQUFFLE1BQU07YUFDaEI7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sK0NBQW1COzs7OztJQUEzQixVQUE0QixJQUFJO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU07Ozs7O1FBQUMsVUFBQyxLQUFLLEVBQUUsS0FBSzs7Z0JBQ3hCLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNwQyxPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUzs7OztZQUFDLFVBQUEsR0FBRztnQkFDakMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQztZQUN4QyxDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sZ0RBQW9COzs7OztJQUE1QixVQUE2QixJQUFJO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE1BQU07Ozs7UUFBQyxVQUFDLEtBQUs7WUFDdkIsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFHLE9BQU87WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCwwQ0FBYzs7O0lBQWQ7UUFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDOzs7O0lBRUQsd0NBQVk7OztJQUFaO1FBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtZQUN0QixPQUFPLEtBQUssQ0FBQztTQUNkO2FBQ0k7WUFDSCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQzs7Ozs7OztJQUVELHlDQUFhOzs7Ozs7SUFBYixVQUFjLEdBQVEsRUFBRSxHQUFXLEVBQUUsSUFBK0I7UUFBcEUsaUJBa0JDO1FBbEJvQyxxQkFBQSxFQUFBLFdBQStCOztZQUM1RCxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQSxRQUFRO1lBQ3BCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQixHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFFckMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLFNBQVMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRTtnQkFDakQsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU07Ozs7Z0JBQUMsVUFBQyxLQUFLLElBQUssT0FBQSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBaEMsQ0FBZ0MsRUFBQyxDQUFDO2FBQ2pGO1lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDNUQsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNuQztZQUNELElBQUksR0FBRyxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQ2xELEtBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDOUM7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsNENBQWdCOzs7O0lBQWhCLFVBQWlCLFNBQVM7OztZQUVwQixZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsRUFBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBakUsQ0FBaUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJOzs7O1FBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFsRSxDQUFrRSxFQUFDOztZQUMvVixZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsRUFBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBakUsQ0FBaUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJOzs7O1FBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFsRSxDQUFrRSxFQUFDO1FBRW5XLElBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDO1lBQ3JHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcscUJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7O0lBRUQsMkNBQWU7Ozs7SUFBZixVQUFnQixPQUFZO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLCtDQUErQztRQUMvQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlDLENBQUM7Ozs7O0lBRUQsOENBQWtCOzs7O0lBQWxCLFVBQW1CLE9BQVk7UUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDOzs7O0lBRUQsd0NBQVk7OztJQUFaO1FBQ0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QiwwQ0FBMEM7UUFDMUMsc0JBQXNCO1FBQ3RCLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIseUJBQXlCO1FBQ3pCLHdEQUF3RDtRQUN4RCx1Q0FBdUM7UUFDdkMsbUNBQW1DO1FBQ25DLFdBQVc7UUFDWCw4REFBOEQ7UUFDOUQsSUFBSTtRQUVKLGtEQUFrRDtRQUNsRCxrQkFBa0I7UUFDbEIseUNBQXlDO1FBQ3pDLHFFQUFxRTtRQUNyRSxPQUFPO1FBQ1AsaUJBQWlCO1FBQ2pCLDBCQUEwQjtRQUMxQixRQUFRO0lBQ1YsQ0FBQzs7Ozs7O0lBRUQseUNBQWE7Ozs7O0lBQWIsVUFBYyxRQUFRLEVBQUUsUUFBUTs7WUFDMUIsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztRQUUzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFOzt3QkFDOUMsT0FBTyxHQUFHLElBQUksa0JBQWtCLEVBQUU7O3dCQUNsQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUU7b0JBRTNCLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFOzs0QkFDdEMsT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFO3dCQUMvQixPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7d0JBQ3JDLElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxTQUFTLElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUU7NEJBQ3pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsUUFBUSxDQUFDOzRCQUM1QyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7eUJBQzVDOzZCQUFNOzRCQUNMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDakMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7eUJBQ25DO3dCQUNELE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO3dCQUN6QixPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7d0JBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3pCO29CQUNELE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO29CQUM3QixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFO3dCQUMzRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTs0QkFDbkcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUNqRSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7b0NBQy9FLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQ0FDbkYsTUFBTTtpQ0FDUDs2QkFDRjt5QkFDRjs2QkFBTTs0QkFDTCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7eUJBQ3hDO3FCQUVGO3lCQUFNO3dCQUNMLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztxQkFDeEM7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQseUNBQWE7Ozs7O0lBQWIsVUFBYyxHQUFXLEVBQUUsV0FBbUI7O1lBQ3hDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7O1lBQzFDLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTzs7WUFDdkIsSUFBSSxHQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTs7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOztZQUMzQixTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RTtJQUVILENBQUM7Ozs7O0lBRUQsc0NBQVU7Ozs7SUFBVixVQUFXLFFBQVE7O1lBQ2IsU0FBUyxHQUFHLEtBQUs7Z0NBRVosQ0FBQzs7Z0JBQ0osR0FBRyxHQUFHLE9BQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUE3QyxDQUE2QyxFQUFDO1lBQ3BHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO2dCQUM5QyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDekMsSUFBSSxPQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO3dCQUMzRSxTQUFTLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjt5QkFBTTt3QkFDTCxTQUFTLEdBQUcsS0FBSyxDQUFDOztxQkFFbkI7aUJBQ0Y7cUJBQU07O3dCQUNELFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFDL0MsSUFBSSxPQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTt3QkFDdkQsU0FBUyxHQUFHLElBQUksQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsU0FBUyxHQUFHLEtBQUssQ0FBQzs7cUJBRW5CO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLEVBQUU7Z0JBQ3RELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO29CQUN6QyxJQUFJLE9BQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7d0JBQzNFLFNBQVMsR0FBRyxJQUFJLENBQUM7cUJBQ2xCO3lCQUFNO3dCQUNMLFNBQVMsR0FBRyxLQUFLLENBQUM7O3FCQUVuQjtpQkFDRjtxQkFBTTs7d0JBQ0QsUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO29CQUMvQyxJQUFJLE9BQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFO3dCQUN2RCxTQUFTLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjt5QkFBTTt3QkFDTCxTQUFTLEdBQUcsS0FBSyxDQUFDOztxQkFFbkI7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtnQkFDckQsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7b0JBQ3pDLElBQUksT0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTt3QkFDMUUsU0FBUyxHQUFHLElBQUksQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsU0FBUyxHQUFHLEtBQUssQ0FBQzs7cUJBRW5CO2lCQUNGO3FCQUFNOzt3QkFDRCxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7b0JBQy9DLElBQUksT0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxRQUFRLEVBQUU7d0JBQ3RELFNBQVMsR0FBRyxJQUFJLENBQUM7cUJBQ2xCO3lCQUFNO3dCQUNMLFNBQVMsR0FBRyxLQUFLLENBQUM7O3FCQUVuQjtpQkFDRjthQUNGO2lCQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksS0FBSyxFQUFFO2dCQUN0RCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDekMsSUFBSSxPQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO3dCQUMzRSxTQUFTLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjt5QkFBTTt3QkFDTCxTQUFTLEdBQUcsS0FBSyxDQUFDOztxQkFFbkI7aUJBQ0Y7cUJBQU07O3dCQUNELFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFDL0MsSUFBSSxPQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTt3QkFDdkQsU0FBUyxHQUFHLElBQUksQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsU0FBUyxHQUFHLEtBQUssQ0FBQzs7cUJBRW5CO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO29CQUN6QyxJQUFJLE9BQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7d0JBQzFFLFNBQVMsR0FBRyxJQUFJLENBQUM7cUJBQ2xCO3lCQUFNO3dCQUNMLFNBQVMsR0FBRyxLQUFLLENBQUM7O3FCQUVuQjtpQkFDRjtxQkFBTTs7d0JBQ0QsUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO29CQUMvQyxJQUFJLE9BQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxFQUFFO3dCQUN0RCxTQUFTLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjt5QkFBTTt3QkFDTCxTQUFTLEdBQUcsS0FBSyxDQUFDOztxQkFFbkI7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssRUFBRTtnQkFDdEQsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7b0JBQ3pDLElBQUksT0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTt3QkFDM0UsU0FBUyxHQUFHLElBQUksQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsU0FBUyxHQUFHLEtBQUssQ0FBQzs7cUJBRW5CO2lCQUNGO3FCQUFNOzt3QkFDRCxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7b0JBQy9DLElBQUksT0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLEVBQUU7d0JBQ3ZELFNBQVMsR0FBRyxJQUFJLENBQUM7cUJBQ2xCO3lCQUFNO3dCQUNMLFNBQVMsR0FBRyxLQUFLLENBQUM7O3FCQUVuQjtpQkFDRjthQUNGOzs7UUF4R0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtrQ0FBMUMsQ0FBQzs7O1NBeUdUO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFFbkIsQ0FBQzs7Ozs7OztJQUVPLHlDQUFhOzs7Ozs7SUFBckIsVUFBc0IsV0FBbUIsRUFBRSxVQUFrQjtRQUMzRCxJQUNFLFVBQVUsSUFBSSxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDbEQsV0FBVyxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNwRCxPQUFPLFdBQVcsQ0FBQzs7WUFDakIsYUFBYSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7O1lBQ25ELEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFDNUQsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O1lBQ3hFLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3JELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Ozs7O0lBRUQsMENBQWM7Ozs7SUFBZCxVQUFlLFNBQWM7O1lBQ3ZCLFVBQVU7O1lBQ1YsVUFBVTs7WUFDVixLQUFLOztZQUNMLFlBQVksR0FBRyxJQUFJLEtBQUssRUFBVTs7WUFFbEMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQWxFLENBQWtFLEVBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQWpFLENBQWlFLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsRUFBQztRQUNuVyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwSSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDbEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLFlBQVksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztpQkFDN0M7cUJBQU0sSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDMUQsWUFBWSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO2lCQUMxRDthQUNGO1NBQ0Y7O1lBRUcsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQWxFLENBQWtFLEVBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQWpFLENBQWlFLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsRUFBQztRQUNuVyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwSSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDbEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztpQkFDMUM7cUJBQU0sSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDMUQsWUFBWSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2lCQUN2RDthQUNGO1NBQ0Y7UUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxFQUFFO1lBQ3ZILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7WUFDdkcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7YUFBTSxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxFQUFFO1lBQzlILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7WUFDdkcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7YUFBTSxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNuRCxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxVQUFVLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLFVBQVUsRUFBRTtnQkFDdEosSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO2dCQUNwTCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUN4QjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNILENBQUM7Ozs7OztJQUVELDBDQUFjOzs7OztJQUFkLFVBQWUsSUFBb0MsRUFBRSxJQUFTO1FBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDOztnQkE5OUJGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsOHd0QkFBd0M7b0JBRXhDLFNBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUM7b0JBQ25DLFVBQVUsRUFBRTt3QkFDVixPQUFPLENBQUMsZUFBZSxFQUFFOzRCQUN2QixLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztnQ0FDckIsTUFBTSxFQUFFLEdBQUc7Z0NBQ1gsT0FBTyxFQUFFLEdBQUc7NkJBQ2IsQ0FBQyxDQUFDOzRCQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO2dDQUNuQixNQUFNLEVBQUUsS0FBSztnQ0FDYixPQUFPLEVBQUUsR0FBRztnQ0FDWixRQUFRLEVBQUUsUUFBUTs2QkFDbkIsQ0FBQyxDQUFDOzRCQUNILFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzlDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQy9DLENBQUM7cUJBQ0g7O2lCQUNGOzs7O2dCQXJDUSxVQUFVO2dCQVFWLFlBQVk7Z0JBVjZDLFNBQVM7Z0RBMEh0RSxNQUFNLFNBQUMsUUFBUTtnQkE5R1gsYUFBYTtnQkFFYixhQUFhO2dCQVZiLFFBQVE7Z0JBSjZCLFVBQVU7Z0JBaUIvQyxjQUFjOzs7MEJBa0NwQixTQUFTLFNBQUMsVUFBVTt5QkFNcEIsU0FBUyxTQUFDLGNBQWM7OEJBQ3hCLEtBQUs7MkJBQ0wsS0FBSzsyQkFDTCxLQUFLO3lCQUNMLE1BQU07eUJBQ04sTUFBTTtnQ0FDTixNQUFNOztJQW03QlQsd0JBQUM7Q0FBQSxBQS85QkQsSUErOUJDO1NBMThCWSxpQkFBaUI7OztJQWlCNUIsbUNBQThDOztJQUM5Qyx3Q0FBNEQ7O0lBQzVELHFDQUErQjs7SUFDL0IscUNBQW1DOztJQUNuQyxtQ0FBeUQ7O0lBQ3pELG1DQUEwSTs7SUFDMUksMENBQWdFOztJQUNoRSwyQ0FpQkU7O0lBQ0Ysd0NBQXlEOztJQUN6RCx1Q0FBMEU7O0lBQzFFLHNDQVNFOztJQUVGLHVDQUF1Qjs7SUFFdkIsb0NBQWlCOztJQUNqQiwwQ0FBbUI7O0lBQ25CLHVDQUFnQjs7SUFDaEIsc0NBQWU7O0lBQ2YseUNBQThCOztJQUM5QixxQ0FBMEI7O0lBQzFCLGtDQUFjOztJQUNkLHVDQUE4Qjs7SUFDOUIsc0NBQTJCOztJQUMzQixxQ0FBMEI7O0lBRTFCLHlDQUF5Qjs7SUFFekIsaUNBQWdCOztJQUNoQixzQ0FBYzs7SUFDZCw0Q0FBcUI7O0lBQ3JCLG1DQUFXOztJQUNYLG1DQUFlOztJQUNmLG9DQUFhOztJQUNiLHVDQUFtQjs7SUFDbkIsdUNBQW1DOztJQUNuQyx3Q0FBMkI7O0lBQzNCLGlEQUFvQzs7Ozs7SUFFeEIsaUNBQXdCOzs7OztJQUFFLHlDQUFrQzs7Ozs7SUFBRSx1Q0FBNkI7Ozs7O0lBQ3JHLHNDQUFtQzs7SUFBRSxtQ0FBNEI7Ozs7O0lBQUUsMENBQW9DOzs7OztJQUN2RyxxQ0FBMEI7Ozs7O0lBQUUsb0NBQTJCOzs7OztJQUFFLGtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbmplY3QsIFJlbmRlcmVyMiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IElucHV0U2VhcmNoT2JqIH0gZnJvbSAnLi9tb2RlbC9pbnB1dC1zZWFyY2gtb2JqLm1vZGVsJztcclxuaW1wb3J0IHsgQ3JpdGVyaWFPYmogfSBmcm9tICcuL21vZGVsL2NyaXRlcmlhLW9iai5tb2RlbCc7XHJcbmltcG9ydCB7IFJlcXVlc3RDcml0ZXJpYU9iaiB9IGZyb20gJy4vbW9kZWwvcmVxdWVzdC1jcml0ZXJpYS1vYmoubW9kZWwnO1xyXG5pbXBvcnQgeyBBZEluc0NvbnN0YW50IH0gZnJvbSAnLi9tb2RlbC9hZGlucy1jb25zdGFudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZXhjZWwtc2VydmljZS9leGNlbC1zZXJ2aWNlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgc3R5bGUsIGFuaW1hdGUsIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgRXhwb3J0VHlwZUNvbnN0YW50LCBLZXlWYWx1ZVJlcG9ydE9iaiB9IGZyb20gJy4vbW9kZWwva2V5LXZhbHVlLXJlcG9ydC5tb2RlbCc7XHJcbmltcG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tICduZ3gtY29va2llJztcclxuaW1wb3J0ICogYXMgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcclxuaW1wb3J0IHsgS2V5VmFsdWVVQ1NlYXJjaE9iaiwgTGlzdEtleVZhbHVlTW9udGggfSBmcm9tICcuL21vZGVsL2tleS12YWx1ZS11Yy1zZWFyY2gubW9kZWwnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1VQ1NlYXJjaCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91Y3NlYXJjaC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbRXhjZWxTZXJ2aWNlLCBEYXRlUGlwZV0sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignY2hhbmdlRGl2U2l6ZScsIFtcclxuICAgICAgc3RhdGUoJ2luaXRpYWwnLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnKicsXHJcbiAgICAgICAgb3BhY2l0eTogJzEnLFxyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdmaW5hbCcsIHN0eWxlKHtcclxuICAgICAgICBoZWlnaHQ6ICcwcHgnLFxyXG4gICAgICAgIG9wYWNpdHk6ICcwJyxcclxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaW5pdGlhbD0+ZmluYWwnLCBhbmltYXRlKCczMDBtcycpKSxcclxuICAgICAgdHJhbnNpdGlvbignZmluYWw9PmluaXRpYWwnLCBhbmltYXRlKCczMDBtcycpKVxyXG4gICAgXSksXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVUNTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAvLyBpc0xpc3RIaWRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAvLyBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgLy8gb25DbGljayhldjogTW91c2VFdmVudCkge1xyXG4gIC8vICAgY29uc3QgY2xpY2tJbnNpZGUgPSB0aGlzLmVsZW1SZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldi50YXJnZXQpO1xyXG4gIC8vICAgaWYgKCFjbGlja0luc2lkZSkge1xyXG4gIC8vICAgICB0aGlzLmlzTGlzdEhpZGUgPSB0cnVlO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZW5qaUZvcm0nKSBzZXQgY29udGVudChjb250ZW50OiBOZ0Zvcm0pIHtcclxuICAgIGlmIChjb250ZW50KSB7IC8vIGluaXRpYWxseSBzZXR0ZXIgZ2V0cyBjYWxsZWQgd2l0aCB1bmRlZmluZWRcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gY29udGVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Zvcm1JZFNlYXJjaCcpIG15Rm9ybTogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBzZWFyY2hJbnB1dDogSW5wdXRTZWFyY2hPYmogPSBuZXcgSW5wdXRTZWFyY2hPYmooKTtcclxuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XHJcbiAgQElucHV0KCkgaXNSZXBvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgcmVzdWx0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZ2VuUnB0OiBFdmVudEVtaXR0ZXI8eyBFeHBvcnRUeXBlOiBudW1iZXIsIEVsUmVmOiBFbGVtZW50UmVmIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IEV4cG9ydFR5cGU6IG51bWJlciwgRWxSZWY6IEVsZW1lbnRSZWYgfT4oKTtcclxuICBAT3V0cHV0KCkgcmVxR2V0QWxsRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgRXhwb3J0VHlwZUxpc3Q6IEFycmF5PEtleVZhbHVlUmVwb3J0T2JqPiA9IFtcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfUERGLFxyXG4gICAgICB2YWx1ZTogXCJQREZcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfWExTWCxcclxuICAgICAgdmFsdWU6IFwiRXhjZWwgMjAwN1wiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9ET0NYLFxyXG4gICAgICB2YWx1ZTogXCJEb2N1bWVudCBYTUxcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfSlBERixcclxuICAgICAgdmFsdWU6IFwiSnVzdGlmeSBQREZcIlxyXG4gICAgfVxyXG4gIF07XHJcbiAgTGlzdE9mTW9udGg6IExpc3RLZXlWYWx1ZU1vbnRoID0gbmV3IExpc3RLZXlWYWx1ZU1vbnRoKCk7XHJcbiAgTGlzdE9mWWVhcjogQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4gPSBuZXcgQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4oKTtcclxuICBDbGFpbUxpc3Q6IEFycmF5PGFueT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIEtleTogQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbklzTm90TnVsbCxcclxuICAgICAgVmFsdWU6IFwiQ0xBSU1FRFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBLZXk6IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25Jc051bGwsXHJcbiAgICAgIFZhbHVlOiBcIlVOQ0xBSU1FRFwiXHJcbiAgICB9LFxyXG4gIF07XHJcblxyXG4gIEV4cG9ydFR5cGU6IG51bWJlciA9IDA7XHJcblxyXG4gIHBhZ2VOb3c6IGFueSA9IDE7XHJcbiAgY29uZmlndXJhdGlvbjogYW55O1xyXG4gIGV4cG9ydERhdGE6IGFueTtcclxuICBFeGNlbERhdGE6IGFueTtcclxuICBpc0RhdGFMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0hpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEJpc0R0OiBzdHJpbmc7XHJcbiAgQnVzaW5lc3NEdDogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgZGF0ZVdyb25nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY3VycmVudFN0YXRlID0gJ2luaXRpYWwnO1xyXG5cclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgY291bnRGb3JtID0gMDtcclxuICBmb3JtYXR0ZWRBbW91bnQgPSAnJztcclxuICBhbW91bnQgPSAwO1xyXG4gIGFwaVVybDogc3RyaW5nO1xyXG4gIGFyckNyaXQ6IGFueTtcclxuICBzZWFyY2hGb3JtOiBOZ0Zvcm07XHJcbiAgcXVlcnlQYXJhbTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBwZXJzaXN0Q3JpdDogQ3JpdGVyaWFPYmpbXTtcclxuICBwZXJzaXN0QWRkVG9UZW1wQ3JpdDogQ3JpdGVyaWFPYmpbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLCBwcml2YXRlIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50LCBwdWJsaWMgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHJpdmF0ZSBlbGVtUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHBhcmFtcztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGF0ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jdXJyZW50U3RhdGUgPT09ICdpbml0aWFsJyA/ICdmaW5hbCcgOiAnaW5pdGlhbCc7XHJcbiAgICB0aGlzLmlzSGlkZGVuID0gdGhpcy5pc0hpZGRlbiA9PT0gZmFsc2UgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwidWNzZWFyY2hcIik7XHJcbiAgICB0aGlzLmFwaVVybCA9IHRoaXMuc2VhcmNoSW5wdXQuZW52aXJvbWVudFVybCArIHRoaXMuc2VhcmNoSW5wdXQuYXBpUXJ5UGFnaW5nO1xyXG4gICAgdGhpcy5hcnJDcml0ID0gdGhpcy5zZWFyY2hJbnB1dC5hcnJDcml0T2JqO1xyXG4gICAgbGV0IGpzID0gdGhpcy5fcmVuZGVyZXIyLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAganMudGV4dCA9IGBcclxuICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICQoXCIjZmxpcFwiKS5jbGljayhmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICQoXCIjcGFuZWxcIikuc2xpZGVUb2dnbGUoXCJzbG93XCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGA7XHJcbiAgICB0aGlzLl9yZW5kZXJlcjIuYXBwZW5kQ2hpbGQodGhpcy5fZG9jdW1lbnQuYm9keSwganMpO1xyXG5cclxuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29va2llU2VydmljZS5nZXQoJ0J1c2luZXNzRGF0ZVJhdycpO1xyXG4gICAgdGhpcy5CaXNEdCA9IHRoaXMuRGVjcnlwdFN0cmluZyh2YWx1ZSwgXCJBZEluc0ZPVTEyMzQ1Njc4XCIpO1xyXG4gICAgdGhpcy5CdXNpbmVzc0R0ID0gbmV3IERhdGUodGhpcy5CaXNEdCk7XHJcbiAgICBhd2FpdCB0aGlzLmluaXRpYXRlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdGlhdGVGb3JtKCkge1xyXG4gICAgYXdhaXQgdGhpcy5nZXRKU09OKHRoaXMuc2VhcmNoSW5wdXQuX3VybCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBkYXRhO1xyXG4gICAgICB0aGlzLmV4cG9ydERhdGEgPSBkYXRhLmV4cG9ydEV4Y2VsO1xyXG4gICAgICBpZiAoZGF0YS5leHBvcnRUeXBlTGlzdCAhPSB1bmRlZmluZWQgJiYgZGF0YS5leHBvcnRUeXBlTGlzdC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIHRoaXMuRXhwb3J0VHlwZUxpc3QgPSBkYXRhLmV4cG9ydFR5cGVMaXN0O1xyXG4gICAgICAgIHRoaXMuRXhwb3J0VHlwZSA9IHRoaXMuRXhwb3J0VHlwZUxpc3RbMF0ua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvdW50Rm9ybSA9IGRhdGEuY29tcG9uZW50Lmxlbmd0aDtcclxuICAgICAgdGhpcy5pc0RhdGFMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudGl0bGUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQudGl0bGUgIT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi50aXRsZSA9IHRoaXMuc2VhcmNoSW5wdXQudGl0bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudEZvcm07IGkrKykge1xyXG4gICAgICAgIC8vaW5pIGthbGF1IGRhdGFueWEgZGkgbG9hZCBkYXJpIFVSTFxyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICBsZXQgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICBsZXQgY3JpdGVyaWFPYmplY3QgPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LkRhdGFUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC5wcm9wTmFtZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWU7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC52YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG4gICAgICAgICAgY3JpdGVyaWFPYmplY3QucmVzdHJpY3Rpb24gPSBcImVxXCI7XHJcbiAgICAgICAgICBhcnJheUNyaXQucHVzaChjcml0ZXJpYU9iamVjdCk7XHJcbiAgICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xyXG4gICAgICAgICAgcmVxdWVzdFtkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BOYW1lXSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIFBlbmdlY2VrYW4gcGVuZ2d1bmFhbiB1cmwgYXRhdSBwYXRoXHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSB1bmRlZmluZWQgJiYgZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZW52aXJvbm1lbnQgPT0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLnVybCArIGRhdGEuY29tcG9uZW50W2ldLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IGRhdGEuY29tcG9uZW50W2ldLnVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9sZW1wYXIgb2JqZWN0bnlhIHNla2FsaWFuIHNhbWEgdXJsbnlhLCBubnRpIGRpIGJpbmQgZGkgZGFsZW0ga2FyZW5hIG1hc2FsYWggZGkgYXN5bmNueWFcclxuICAgICAgICAgIC8vYmlhciB0aWFwIGZ1bmN0aW9uIGFkYSBzdGF0ZTJueWEgc2VuZGlyaVxyXG4gICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KGRhdGEuY29tcG9uZW50W2ldLCBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCwgcmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBwYXJzZUZsb2F0KGRhdGEuY29tcG9uZW50W2ldLnZhbHVlKS50b0xvY2FsZVN0cmluZygnZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcGVuZ2VjZWthbiBkZGxcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZS5pbmNsdWRlcyhcIm1vbnRoXCIpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlTW9udGgoZGF0YS5jb21wb25lbnRbaV0udmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5pdGVtcyA9IHRoaXMuc2V0TW9udGhEREwoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUuaW5jbHVkZXMoXCJ5ZWFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlWWVhcihkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zID0gdGhpcy5zZXRZZWFyRERMKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiAhZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMICYmIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zPy5sZW5ndGggIT0gMSkge1xyXG4gICAgICAgIC8vICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkc1R5cGUgPT0gdW5kZWZpbmVkIHx8IGRhdGEuY29tcG9uZW50W2ldLmRkc1R5cGUgPT0gXCJhbGxcIikge1xyXG4gICAgICAgIC8vICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwiYWxsXCI7XHJcbiAgICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gXCJBbGxcIjtcclxuICAgICAgICAvLyAgIH0gZWxzZSBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSBcIm9uZVwiKSB7XHJcbiAgICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJvbmVcIjtcclxuICAgICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBcIlNlbGVjdCBPbmVcIjtcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgJiYgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0uS2V5O1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBkYXRhLmNvbXBvbmVudFtpXS5pdGVtc1swXS5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgIT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSkge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ2FsbCcpIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJhbGxcIjtcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZGxUeXBlID09ICdvbmUnKSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwib25lXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vcGVuZ2VjZWthbiB0YW5nZ2FsXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkYXRlcGlja2VyXCIpIHtcclxuICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSBkYXRhLmNvbXBvbmVudFtpXS5yZWFkb25seVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgIGxldCBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5CaXNEdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUodGhpcy5CaXNEdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IG9wZXJhdG9yID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuY2hhckF0KDIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZVNob3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgICAgICAgICBsZXQgdGVtcE1pbnVzID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCItXCIsIDIpO1xyXG4gICAgICAgICAgICAgIGxldCBudW1EYXkgPSBwYXJzZUludCh0ZW1wTWludXNbMV0pO1xyXG4gICAgICAgICAgICAgIGJ1c2luZXNzRGF0ZS5zZXREYXRlKGJ1c2luZXNzRGF0ZS5nZXREYXRlKCkgLSBudW1EYXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09IFwiK1wiKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXBNaW51cyA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiK1wiLCAyKTtcclxuICAgICAgICAgICAgICBsZXQgbnVtRGF5ID0gcGFyc2VJbnQodGVtcE1pbnVzWzFdKTtcclxuICAgICAgICAgICAgICBidXNpbmVzc0RhdGUuc2V0RGF0ZShidXNpbmVzc0RhdGUuZ2V0RGF0ZSgpICsgbnVtRGF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRlU2hvdyA9IGJ1c2luZXNzRGF0ZTtcclxuICAgICAgICAgICAgbGV0IGRhdGVUZXh0ID0gZm9ybWF0RGF0ZShkYXRlU2hvdywgJ3l5eXktTU0tZGQnLCAnZW4tVVMnKVxyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IGRhdGVUZXh0O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5yZXN0cmljdGlvbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGEuY29tcG9uZW50W2ldLm1pbkRhdGUsICd5eXl5LU1NLWRkJykpO1xyXG4gICAgICAgICAgICAgICAgbWluRGF0ZS5zZXREYXRlKG1pbkRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5taW5EYXRlID0gbWluRGF0ZTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGEuY29tcG9uZW50W2ldLm1heERhdGUsICd5eXl5LU1NLWRkJykpO1xyXG4gICAgICAgICAgICAgICAgbWF4RGF0ZS5zZXREYXRlKG1heERhdGUuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5tYXhEYXRlID0gbWF4RGF0ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJ0ZXh0Ym94XCIpIHtcclxuICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udmFsdWUgPSB0aGlzLmF1dG9maWxsKGRhdGEuY29tcG9uZW50W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb3VudEZvcm07IGorKykge1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2pdLmlzRXZlbnQgPT0gdHJ1ZSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2pdLml0ZW1zVXJsLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VFdmVudChkYXRhLmNvbXBvbmVudFtqXS5pdGVtc1VybFswXS5LZXksIGRhdGEuY29tcG9uZW50W2pdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtqXS50eXBlID09IFwib2ZmaWNlUm9sZUNvZGVzXCIgJiYgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtqXS5pdGVtc1VybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Um9sZU9mZmljZUNvZGVzKGopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXV0b2ZpbGwoZGF0YTogYW55KSB7XHJcbiAgICBpZiAoZGF0YS52YWx1ZSAhPSBcIlwiKSByZXR1cm4gZGF0YS52YWx1ZTtcclxuICAgIGNvbnN0IGF1dG9maWxsOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gZGF0YS5hdXRvZmlsbDtcclxuICAgIGlmIChhdXRvZmlsbCA9PSB1bmRlZmluZWQpIHJldHVybiBkYXRhLnZhbHVlO1xyXG4gICAgaWYgKHRoaXMucXVlcnlQYXJhbVthdXRvZmlsbC5rZXldID09IHVuZGVmaW5lZCkgcmV0dXJuIGRhdGEudmFsdWU7XHJcbiAgICBpZiAoYXV0b2ZpbGwuc291cmNlID09IFwicGFyYW1cIikge1xyXG4gICAgICByZXR1cm4gdGhpcy5xdWVyeVBhcmFtW2F1dG9maWxsLmtleV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YS52YWx1ZTtcclxuICB9XHJcblxyXG4gIFNldFJvbGVPZmZpY2VDb2RlcyhpOiBudW1iZXIpIHtcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIlVzZXJBY2Nlc3NcIik7XHJcbiAgICBsZXQgdXNlckFjY2Vzczogc3RyaW5nID0gSlNPTi5wYXJzZSh0aGlzLkRlY3J5cHRTdHJpbmcodmFsdWUsIFwiQWRJbnNGT1UxMjM0NTY3OFwiKSk7XHJcbiAgICBsZXQgcm9sZUNvZGU6IHN0cmluZyA9IHVzZXJBY2Nlc3NbXCJSb2xlQ29kZVwiXTtcclxuICAgIGxldCBsaXN0T2ZmaWNlUm9sZUNvZGVzOiBBcnJheTxzdHJpbmc+ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUpO1xyXG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbaV07XHJcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICBsZXQgdGV4dCA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmwubGVuZ3RoID09IDEgfHwgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uZGRsVHlwZSA9PSAnYWxsJyAmJiB0ZXh0ID09ICdhbGwnKSkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybFtpbmRleF07XHJcbiAgICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKGVsZW1lbnQuS2V5KTtcclxuICAgICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUgKyBcIi1cIiArIGVsZW1lbnQuS2V5KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHRleHQpO1xyXG4gICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUgKyBcIi1cIiArIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmoucmVxdWVzdE9ialtcIk9mZmljZVJvbGVDb2Rlc1wiXSA9IGxpc3RPZmZpY2VSb2xlQ29kZXM7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0VmFsdWVNb250aCh2YWx1ZSkge1xyXG4gICAgbGV0IGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuQnVzaW5lc3NEdCk7XHJcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XHJcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWUuc3BsaXQob3BlcmF0b3IsIDIpO1xyXG4gICAgbGV0IG51bU1vbnRoID0gcGFyc2VJbnQodGVtcFZhbHVlWzFdKTtcclxuICAgIGlmICghbnVtTW9udGgpIG51bU1vbnRoID0gMTtcclxuICAgIGlmIChvcGVyYXRvciA9PSBcIi1cIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0TW9udGgoYnVzaW5lc3NEYXRlLmdldE1vbnRoKCkgLSBudW1Nb250aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PSBcIitcIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0TW9udGgoYnVzaW5lc3NEYXRlLmdldE1vbnRoKCkgKyBudW1Nb250aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVzaW5lc3NEYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG4gIHNldE1vbnRoRERMKG1vbnRoKSB7XHJcbiAgICBsZXQgTGlzdE9mTW9udGg6IEFycmF5PEtleVZhbHVlVUNTZWFyY2hPYmo+O1xyXG4gICAgbGV0IGVxdWF0aW9uID0gbW9udGgubWF0Y2goXCJbXFxcXC8rXVstXXxbLV1bXFxcXC8rXXxcXFxcLyt8LVwiKTtcclxuICAgIGxldCB0b01pbjogbnVtYmVyID0gdGhpcy5CdXNpbmVzc0R0LmdldE1vbnRoKCk7XHJcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRNb250aCgpO1xyXG4gICAgbGV0IHRlbXBFcXVhdGlvbiA9IGVxdWF0aW9uWzBdO1xyXG4gICAgbGV0IG1pbk1heDogbnVtYmVyID0gcGFyc2VJbnQobW9udGguc3Vic3RyaW5nKGVxdWF0aW9uLmluZGV4ICsgZXF1YXRpb25bMF0ubGVuZ3RoKSk7XHJcbiAgICBpZiAobWluTWF4ID49IDEyKSByZXR1cm4gdGhpcy5MaXN0T2ZNb250aC5MaXN0T2ZNb250aDtcclxuICAgIGlmICgodGVtcEVxdWF0aW9uID09IFwiKy1cIiB8fCB0ZW1wRXF1YXRpb24gPT0gXCItK1wiKSAmJiBtaW5NYXggPj0gNikgcmV0dXJuIHRoaXMuTGlzdE9mTW9udGguTGlzdE9mTW9udGg7XHJcbiAgICBsZXQgZGljdE9mTW9udGg6IHsgW21vbnRoOiBudW1iZXJdOiBzdHJpbmcgfSA9IHRoaXMuTGlzdE9mTW9udGguRGljdE9mTW9udGg7XHJcbiAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWluXSB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBxID0gMDsgcSA8IG1pbk1heDsgcSsrKSB7XHJcbiAgICAgIGlmICh0ZW1wRXF1YXRpb24uaW5jbHVkZXMoXCItXCIpKSB7XHJcbiAgICAgICAgdG9NaW4tLTtcclxuICAgICAgICBpZiAodG9NaW4gPT0gMCkgdG9NaW4gPSAxMjtcclxuICAgICAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWluXSB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGVtcEVxdWF0aW9uLmluY2x1ZGVzKFwiK1wiKSkge1xyXG4gICAgICAgIHRvTWF4Kys7XHJcbiAgICAgICAgaWYgKHRvTWF4ID09IDEzKSB0b01heCA9IDE7XHJcbiAgICAgICAgTGlzdE9mTW9udGgucHVzaCh7IGtleTogdG9NYXgsIHZhbHVlOiBkaWN0T2ZNb250aFt0b01heF0gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIExpc3RPZk1vbnRoLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgcmV0dXJuIGEua2V5IC0gYi5rZXk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBMaXN0T2ZNb250aDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZVllYXIodmFsdWUpIHtcclxuICAgIGxldCBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLkJ1c2luZXNzRHQpO1xyXG4gICAgbGV0IG9wZXJhdG9yID0gdmFsdWUuY2hhckF0KDIpO1xyXG4gICAgbGV0IHRlbXBWYWx1ZSA9IHZhbHVlLnNwbGl0KG9wZXJhdG9yLCAyKTtcclxuICAgIGxldCBudW1ZZWFyID0gcGFyc2VJbnQodGVtcFZhbHVlWzFdKTtcclxuICAgIGlmICghbnVtWWVhcikgbnVtWWVhciA9IDE7XHJcbiAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldEZ1bGxZZWFyKGJ1c2luZXNzRGF0ZS5nZXRGdWxsWWVhcigpIC0gbnVtWWVhcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PSBcIitcIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0RnVsbFllYXIoYnVzaW5lc3NEYXRlLmdldEZ1bGxZZWFyKCkgKyBudW1ZZWFyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidXNpbmVzc0RhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcbiAgc2V0WWVhckRETCh5ZWFyKSB7XHJcbiAgICB0aGlzLkxpc3RPZlllYXIgPSBuZXcgQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4oKTtcclxuICAgIGxldCBlcXVhdGlvbiA9IHllYXIubWF0Y2goXCJbXFxcXC8rXVstXXxbLV1bXFxcXC8rXXxcXFxcLyt8LVwiKTtcclxuICAgIGxldCB0b01pbjogbnVtYmVyID0gdGhpcy5CdXNpbmVzc0R0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IG1pbk1heDogbnVtYmVyID0gcGFyc2VJbnQoeWVhci5zdWJzdHJpbmcoZXF1YXRpb24uaW5kZXggKyBlcXVhdGlvblswXS5sZW5ndGgpKTtcclxuICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKSwgdmFsdWU6IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgcSA9IDA7IHEgPCBtaW5NYXg7IHErKykge1xyXG4gICAgICBpZiAoZXF1YXRpb25bMF0gPT0gXCItK1wiIHx8IGVxdWF0aW9uWzBdID09IFwiKy1cIikge1xyXG4gICAgICAgIHRvTWluLS07XHJcbiAgICAgICAgdG9NYXgrKztcclxuICAgICAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7IGtleTogdG9NaW4sIHZhbHVlOiB0b01pbi50b1N0cmluZygpIH0sIHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCItXCIpIHtcclxuICAgICAgICB0b01pbi0tO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IHRvTWluLnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCIrXCIpIHtcclxuICAgICAgICB0b01heCsrO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuTGlzdE9mWWVhci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5MaXN0T2ZZZWFyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEpTT04odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwb3N0SlNPTih1cmw6IHN0cmluZywgY3JpdGVyaWE6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ2xpY2soSXNFeHBvcnRFeGNlbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbHRlcigoaXRlbSwgaSwgYXJyKSA9PiB7XHJcbiAgICAgIGlmKGl0ZW0uZGF0ZXBpY2tlclBhaXIgPT09IHVuZGVmaW5lZCB8fCBpdGVtLmRhdGVwaWNrZXJQYWlyID09PSAnJykgcmV0dXJuO1xyXG4gICAgICByZXR1cm4gYXJyLmZpbmRJbmRleCgoeCkgPT4gKHguZGF0ZXBpY2tlclBhaXIgPT09IGl0ZW0uZGF0ZXBpY2tlclBhaXIpKSA9PT0gaVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoZmlsdGVyZWRbaV0udHlwZSA9PSBcIm51bWVyaWNcIiB8fCBmaWx0ZXJlZFtpXS50eXBlID09IFwiZGF0ZXBpY2tlclwiKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuY2hlY2tWYWx1ZUd0ZUx0ZShmaWx0ZXJlZFtpXSkpIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBvcmRlciA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkgIT0gbnVsbCkge1xyXG4gICAgICBvcmRlciA9IHtcclxuICAgICAgICBrZXk6IHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LmtleSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkudmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlTm93ID0gMTtcclxuICAgIGxldCByb3dQZXJQYWdlID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIGlmIChJc0V4cG9ydEV4Y2VsKSByb3dQZXJQYWdlID0gOTk5OTtcclxuICAgIHRoaXMuc2VhcmNoKHRoaXMuYXBpVXJsLCB0aGlzLnBhZ2VOb3csIHJvd1BlclBhZ2UsIG9yZGVyLCB0cnVlLCB0aGlzLmFyckNyaXQsIElzRXhwb3J0RXhjZWwpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm0ucmVzZXRGb3JtKHtcclxuICAgICAgRXhwb3J0VHlwZTogdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXlcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5pbml0aWF0ZUZvcm0oKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaChhcGlVcmw6IHN0cmluZywgcGFnZU5vOiBudW1iZXIsIHJvd1BlclBhZ2U6IG51bWJlciwgb3JkZXJCeTogYW55LCBpc0NsaWNrU2VhcmNoOiBib29sZWFuLCBhZGRDcml0OiBDcml0ZXJpYU9ialtdID0gbmV3IEFycmF5KCksIElzRXhwb3J0RXhjZWw6IGJvb2xlYW4gPSBmYWxzZSwgaXNBZGRUb1RlbXA6IGJvb2xlYW4gPSBmYWxzZSwgYWRkVG9UZW1wQ3JpdDogQ3JpdGVyaWFPYmpbXSA9IG5ldyBBcnJheSgpKSB7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgIGxldCBhcnJDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgSXNRdWVyeUluID0gZmFsc2U7XHJcbiAgICBsZXQgSXNCcmVhayA9IGZhbHNlO1xyXG5cclxuICAgIC8vIEluamVjdCB3aGVyZVF1ZXJ5IGZvciB3aGVyZSBjcml0ZXJpYVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeS5wdXNoKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZVt4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LmZyb21WYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUubGVuZ3RoICE9IDApIHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLmZyb21RdWVyeSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5LnB1c2godGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWVbeF0udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXF1ZXN0LnBhZ2VObyA9IHBhZ2VObztcclxuICAgIHJlcXVlc3Qucm93UGVyUGFnZSA9IHJvd1BlclBhZ2U7XHJcbiAgICByZXF1ZXN0Lm9yZGVyQnkgPSBvcmRlckJ5O1xyXG4gICAgcmVxdWVzdC5xdWVyeVN0cmluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZztcclxuXHJcbiAgICBsZXQgZm9ybVNlcTogbnVtYmVyID0gLTE7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRGb3JtOyBpKyspIHtcclxuICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcImRyb3Bkb3duU2VhcmNoXCIpIHtcclxuICAgICAgICBmb3JtU2VxICs9IDM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9ybVNlcSsrO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2Zvcm1TZXFdO1xyXG5cclxuICAgICAgLy8gLy8gcG9wdXAgbWVzc2FnZSBpZiByZXF1aXJlZFxyXG4gICAgICAvLyBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlZCcpICE9IG51bGwgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlZCcpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgIC8vICAgbGV0IHZhbCA9IGNvbXBvbmVudC52YWx1ZS50cmltKCk7XHJcbiAgICAgIC8vICAgaWYgKHZhbCA9PSBcIlwiKSB7XHJcbiAgICAgIC8vICAgICBJc0JyZWFrID0gdHJ1ZTtcclxuICAgICAgLy8gICAgIGxldCBsYWJlbCA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XHJcbiAgICAgIC8vICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKFwiUGxlYXNlIGlucHV0IFwiICsgbGFiZWwpO1xyXG4gICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBjcml0T2JqLkRhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XHJcbiAgICAgIC8vSW5pIGtodXN1cyBrYWxhdSBkYXJpIERyb3AgRG93blxyXG4gICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgncXVlcnktaW4nKSAhPSBudWxsICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ3F1ZXJ5LWluJykgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICBJc1F1ZXJ5SW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIElzUXVlcnlJbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wb25lbnQudmFsdWUgIT0gXCJcIikge1xyXG4gICAgICAgIGlmIChjb21wb25lbnQubm9kZU5hbWUgPT0gJ1NFTEVDVCcpIHtcclxuICAgICAgICAgIGxldCBkZGwgPSBjb21wb25lbnQub3B0aW9ucztcclxuICAgICAgICAgIGxldCB0ZXh0ID0gZGRsW2RkbC5zZWxlY3RlZEluZGV4XS52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICBpZiAodGV4dCA9PSBcIm9uZVwiKSB7XHJcbiAgICAgICAgICAgIElzQnJlYWsgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdsYWJlbCcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKFwiUGxlYXNlIHNlbGVjdCBcIiArIGxhYmVsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmouaXNDcml0ZXJpYURhdGFUYWJsZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwidGFza0RlZmluaXRpb25LZXlcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJwcm9jZXNzS2V5XCIpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJjbGFpbVwiKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IHRleHQ7XHJcbiAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wKSB7XHJcbiAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGV4dCAhPSBcImFsbFwiICYmIHRleHQgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICAgIC8vS2FsYXUgRGFyaSBEcm9wZG93biB1ZGFoIHBhc3RpIHBha2UgRXFcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xyXG4gICAgICAgICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHRleHQ7XHJcbiAgICAgICAgICAgICAgaWYgKCFpc0FkZFRvVGVtcCkge1xyXG4gICAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09IFwiYWxsXCIgJiYgSXNRdWVyeUluID09IHRydWUgJiYgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgZGRsTGlzdC5wdXNoKGNvbXBvbmVudC5vcHRpb25zW3hdLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGRkbExpc3QubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSW47XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLmxpc3RWYWx1ZSA9IGRkbExpc3Q7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvL0thbGF1IGFkYSBQZXJjZW50IG1ha2EgeWFuZyBkaXBha2Ugbm50aSBhZGFsYWggUmVzdHJpY3Rpb25zIExpa2VcclxuICAgICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQubmFtZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBjb21wb25lbnQudmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC52YWx1ZS5pbmNsdWRlcyhcIiVcIikpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25MaWtlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9rYWxhdSBjb21wb25lbnRueWEgRGF0ZSwgcmVzdHJpY3Rpb25zbnlhIGxnc2cgYW1iaWwgZGFyaSBwcm9wZXJ0eSBKU09ObnlhXHJcbiAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJykgIT0gXCJcIiAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXN0cmljdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgPT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHBhcnNlRmxvYXQoY29tcG9uZW50LnZhbHVlLnJlcGxhY2UoLywvZywgJycpKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjcml0T2JqLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMSUtFXCIpIHtcclxuICAgICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gXCIlXCIgKyBjb21wb25lbnQudmFsdWUudHJpbSgpICsgXCIlXCI7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25MaWtlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jcml0LWRhdGF0YWJsZScpICE9IFwiXCIgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jcml0LWRhdGF0YWJsZScpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5pc0NyaXRlcmlhRGF0YVRhYmxlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jcml0LWRhdGF0YWJsZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFpc0FkZFRvVGVtcCkge1xyXG4gICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKElzQnJlYWspIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhZGRDcml0ICE9IG51bGwgJiYgYWRkQ3JpdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGFkZENyaXQubGVuZ3RoICE9IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZENyaXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGFyckNyaXQucHVzaChhZGRDcml0W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gbnVsbCB8fCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhcnJDcml0LnB1c2godGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gbnVsbCB8fCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGFyckNyaXQucHVzaCh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dFtpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNDbGlja1NlYXJjaCkge1xyXG4gICAgICB0aGlzLnBlcnNpc3RDcml0ID0gYXJyQ3JpdDtcclxuICAgIH1cclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSB0aGlzLnBlcnNpc3RDcml0O1xyXG5cclxuICAgIGlmIChpc0FkZFRvVGVtcCkge1xyXG4gICAgICB0aGlzLnBlcnNpc3RBZGRUb1RlbXBDcml0ID0gYWRkVG9UZW1wQ3JpdDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMucGVyc2lzdEFkZFRvVGVtcENyaXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXF1ZXN0LmNyaXRlcmlhID0gcmVxdWVzdC5jcml0ZXJpYS5jb25jYXQodGhpcy5wZXJzaXN0QWRkVG9UZW1wQ3JpdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmlsdGVyIGR1cGxpY2F0ZSBkYXRhIGluIGFycmF5XHJcbiAgICByZXF1ZXN0LmNyaXRlcmlhID0gdGhpcy5maWx0ZXJEdXBsaWNhdGVEYXRhKHJlcXVlc3QuY3JpdGVyaWEpXHJcbiAgICBcclxuICAgIC8vIGZpbHRlciBlbXB0eSB2YWx1ZSBpbiBsaXN0VmFsdWVcclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSB0aGlzLmZpbHRlckxpc3RWYWx1ZUVtcHR5KHJlcXVlc3QuY3JpdGVyaWEpO1xyXG5cclxuICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuaXNKb2luRXhBUEkpIHtcclxuICAgICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCByZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChJc0V4cG9ydEV4Y2VsKSB7XHJcbiAgICAgICAgdGhpcy5FeGNlbERhdGEgPSByZXNwb25zZVtcIkRhdGFcIl07XHJcbiAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5jb25maWd1cmF0aW9uLnRpdGxlICE9IG51bGwgJiYgdGhpcy5jb25maWd1cmF0aW9uLnRpdGxlICE9IFwiXCI/IHRoaXMuY29uZmlndXJhdGlvbi50aXRsZSA6IFwidW50aXRsZWRcIjtcclxuICAgICAgICB0aGlzLmV4Y2VsU2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZSh0aGlzLkV4Y2VsRGF0YSwgdGl0bGUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcXJ5UGFnaW5nID0ge1xyXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcclxuICAgICAgICBwYWdlTm93OiBwYWdlTm9cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhxcnlQYWdpbmcpO1xyXG4gICAgICB0aGlzLnJlc3VsdC5lbWl0KHFyeVBhZ2luZyk7XHJcbiAgICAgIHRoaXMucmVxR2V0QWxsRGF0YS5lbWl0KHJlcXVlc3QpO1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyRHVwbGljYXRlRGF0YShkYXRhKSB7XHJcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBfdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgIHJldHVybiBpbmRleCA9PT0gZGF0YS5maW5kSW5kZXgob2JqID0+IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gX3ZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJMaXN0VmFsdWVFbXB0eShkYXRhKSB7XHJcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZS5saXN0VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xyXG4gICAgICBpZiAodmFsdWUubGlzdFZhbHVlLmxlbmd0aCA9PT0gMCApIHJldHVybjtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBHZW5lcmF0ZVJlcG9ydCgpIHtcclxuICAgIHRoaXMuZ2VuUnB0LmVtaXQoeyBFeHBvcnRUeXBlOiB0aGlzLkV4cG9ydFR5cGUsIEVsUmVmOiB0aGlzLm15Rm9ybSB9KTtcclxuICB9XHJcblxyXG4gIGxlc3NUaGFuRm91cigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvdW50Rm9ybSA+IDMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZU9iamVjdChvYmo6IGFueSwgdXJsOiBzdHJpbmcsIGNyaXQ6IFJlcXVlc3RDcml0ZXJpYU9iaiA9IG51bGwpIHtcclxuICAgIGNvbnN0IHZhbCA9IHRoaXMucG9zdEpTT04odXJsLCBjcml0KTtcclxuICAgIHZhbC5zdWJzY3JpYmUodGVtcERhdGEgPT4ge1xyXG4gICAgICBvYmouaXRlbXNVcmwgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgb2JqLml0ZW1zVXJsID0gdGVtcERhdGEuUmV0dXJuT2JqZWN0O1xyXG5cclxuICAgICAgaWYgKG9iai5leGNsdWRlICE9IHVuZGVmaW5lZCAmJiBvYmouZXhjbHVkZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgb2JqLml0ZW1zVXJsID0gb2JqLml0ZW1zVXJsLmZpbHRlcigodmFsdWUpID0+ICFvYmouZXhjbHVkZS5pbmNsdWRlcyh2YWx1ZS5LZXkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG9iai50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiBvYmouaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcclxuICAgICAgICBvYmoudmFsdWUgPSBvYmouaXRlbXNVcmxbMF0uS2V5O1xyXG4gICAgICAgIG9iai5kZXNjciA9IG9iai5pdGVtc1VybFswXS5WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAob2JqLmFmZmVjdGVkRmlsdGVyICYmIG9iai5pdGVtc1VybC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2VFdmVudChvYmouaXRlbXNVcmxbMF0uS2V5LCBvYmopO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoZWNrVmFsdWVHdGVMdGUoY29tcG9uZW50KXtcclxuICAgIC8vY2VrIHlnIHBha2FpIHJlc3RyaWN0aW9uIGd0ZS9sdGUvZ3QvbHRcclxuICAgIGxldCBNaW5Db21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSk7XHJcbiAgICBsZXQgTWF4Q29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRcIikpIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpO1xyXG4gICAgXHJcbiAgICBpZih0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUgPiB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUpe1xyXG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKE1pbkNvbXBvbmVudC5sYWJlbCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiICsgTWF4Q29tcG9uZW50LmxhYmVsKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtQW1vdW50KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgdGhpcy5mb3JtYXR0ZWRBbW91bnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlKS50b0xvY2FsZVN0cmluZygnZW4nKTtcclxuICAgIC8vIHRvIHNob3cgdGhlIGZvcm1hdHRlZCBhbW91bnQgaW4gdGhlIHRleHRib3guXHJcbiAgICBlbGVtZW50LnRhcmdldC52YWx1ZSA9IHRoaXMuZm9ybWF0dGVkQW1vdW50O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVG9EZWNpbWFsKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgZWxlbWVudC50YXJnZXQudmFsdWUgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0QXNYTFNYKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hDbGljayh0cnVlKTtcclxuICAgIC8vIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3RDcml0ZXJpYU9iaigpO1xyXG4gICAgLy8gcmVxdWVzdC5wYWdlTm8gPSAxO1xyXG4gICAgLy8gcmVxdWVzdC5yb3dQZXJQYWdlID0gOTk5OTtcclxuICAgIC8vIHJlcXVlc3Qub3JkZXJCeSA9IG51bGw7XHJcbiAgICAvLyByZXF1ZXN0LmNyaXRlcmlhID0gW107XHJcbiAgICAvLyByZXF1ZXN0LnF1ZXJ5U3RyaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nO1xyXG4gICAgLy8gaWYgKCF0aGlzLnNlYXJjaElucHV0LmlzSm9pbkV4QVBJKSB7XHJcbiAgICAvLyAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gdGhpcy5odHRwLnBvc3QodGhpcy5hcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZShcclxuICAgIC8vICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMuRXhjZWxEYXRhID0gcmVzcG9uc2VbXCJEYXRhXCJdO1xyXG4gICAgLy8gICAgIHRoaXMuZXhjZWxTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHRoaXMuRXhjZWxEYXRhLCAnc2FtcGxlJyk7XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIChlcnJvcikgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUV2ZW50KG9wdFZhbHVlLCBhZkZpbHRlcikge1xyXG4gICAgbGV0IGpzb25Db21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwganNvbkNvbXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAoanNvbkNvbXBbal0ubmFtZSA9PSBhZkZpbHRlci5hZmZlY3RlZEZpbHRlcltpXSkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICBsZXQgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlICE9IFwiYWxsXCIgJiYgb3B0VmFsdWUgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICBsZXQgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgICBjcml0T2JqLkRhdGFUeXBlID0gYWZGaWx0ZXIuZGF0YXR5cGU7XHJcbiAgICAgICAgICAgIGlmIChhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSB1bmRlZmluZWQgfHwgYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBhZkZpbHRlci5uYW1lO1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIubmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcclxuICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBqc29uQ29tcFtqXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5lbnZpcm9ubWVudCA9PSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsganNvbkNvbXBbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSBqc29uQ29tcFtqXS51cmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoanNvbkNvbXBbal0sIGpzb25Db21wW2pdLmZ1bGxwYXRoLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIFNldFByb2Nlc3NLZXkoaWR4OiBudW1iZXIsIHdmS2V5RmlsdGVyOiBzdHJpbmcpIHtcclxuICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2lkeF07XHJcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gZGRsW2RkbC5zZWxlY3RlZEluZGV4XS52YWx1ZS50cmltKCk7XHJcbiAgICBsZXQgbGlzdFZhbHVlID0gdGV4dC5zcGxpdCgnOycpO1xyXG4gICAgbGV0IGxpc3RXZktleSA9IHdmS2V5RmlsdGVyLnNwbGl0KCc7Jyk7XHJcbiAgICBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdFZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmoucmVxdWVzdE9ialtsaXN0V2ZLZXlbaV1dID0gbGlzdFZhbHVlW2ldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XHJcbiAgICBsZXQgY29uZGl0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHggPSB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlLmZpbmRJbmRleCh4ID0+IHgucHJvcGVydHkgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS5wcm9wZXJ0eSk7XHJcbiAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiRVFcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID09IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPT0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIk5FUVwiKSB7XHJcbiAgICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyICE9IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgIT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiR1RcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID4gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVEVcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID49IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkxUXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPCB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTFRFXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDw9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZGl0aW9uO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgRGVjcnlwdFN0cmluZyhjaGlwcGVyVGV4dDogc3RyaW5nLCBjaGlwcGVyS2V5OiBzdHJpbmcpIHtcclxuICAgIGlmIChcclxuICAgICAgY2hpcHBlcktleSA9PSB1bmRlZmluZWQgfHwgY2hpcHBlcktleS50cmltKCkgPT0gJycgfHxcclxuICAgICAgY2hpcHBlclRleHQgPT0gdW5kZWZpbmVkIHx8IGNoaXBwZXJUZXh0LnRyaW0oKSA9PSAnJ1xyXG4gICAgKSByZXR1cm4gY2hpcHBlclRleHQ7XHJcbiAgICBsZXQgY2hpcHBlcktleUFyciA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGNoaXBwZXJLZXkpO1xyXG4gICAgbGV0IGl2ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTtcclxuICAgIGxldCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChjaGlwcGVyVGV4dCwgY2hpcHBlcktleUFyciwgeyBpdjogaXYgfSk7XHJcbiAgICBsZXQgcGxhaW5UZXh0ID0gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcclxuICAgIHJldHVybiBwbGFpblRleHQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lucHV0RGF0ZShjb21wb25lbnQ6IGFueSkge1xyXG4gICAgbGV0IG1pbkRhdGVWYWw7XHJcbiAgICBsZXQgbWF4RGF0ZVZhbDtcclxuICAgIGxldCBsYWJlbDtcclxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgIGxldCBNaW5Db21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSk7XHJcbiAgICBpZiAoTWluQ29tcG9uZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBtaW5EYXRlVmFsID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNaW5Db21wb25lbnQuaWRdLm1pbiA9PSBcIlwiID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWluQ29tcG9uZW50LmlkXS5taW4pO1xyXG4gICAgICBsYWJlbCA9IE1pbkNvbXBvbmVudC5sYWJlbC5zcGxpdChcIj5cIiwgMik7XHJcbiAgICAgIGlmIChtaW5EYXRlVmFsICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoTWluQ29tcG9uZW50LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgICBtaW5EYXRlVmFsLnNldERhdGUobWluRGF0ZVZhbC5nZXREYXRlKCkgLSAxKTtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgZ3JlYXRlciB0aGFuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKE1pbkNvbXBvbmVudC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpIHtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFscyB0byBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IE1heENvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpKSA9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKSA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpKTtcclxuICAgIGlmIChNYXhDb21wb25lbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIG1heERhdGVWYWwgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0ubWF4ID09IFwiXCIgPyBudWxsIDogbmV3IERhdGUodGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLm1heCk7XHJcbiAgICAgIGxhYmVsID0gTWF4Q29tcG9uZW50LmxhYmVsLnNwbGl0KFwiPFwiLCAyKTtcclxuICAgICAgaWYgKG1heERhdGVWYWwgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChNYXhDb21wb25lbnQucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpIHtcclxuICAgICAgICAgIG1heERhdGVWYWwuc2V0RGF0ZShtYXhEYXRlVmFsLmdldERhdGUoKSArIDEpO1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXCIgbXVzdCBiZSBsZXNzIHRoYW4gXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTWF4Q29tcG9uZW50LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikge1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXCIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWxzIHRvIFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobWluRGF0ZVZhbCAhPSBudWxsICYmIG1heERhdGVWYWwgPT0gbnVsbCAmJiBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUpIDwgbWluRGF0ZVZhbCkge1xyXG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtaW5EYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIilcclxuICAgICAgdGhpcy5kYXRlV3JvbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChtYXhEYXRlVmFsICE9IG51bGwgJiYgbWluRGF0ZVZhbCA9PSBudWxsICYmIG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWF4Q29tcG9uZW50LmlkXS52YWx1ZSkgPiBtYXhEYXRlVmFsKSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcobGFiZWxbMF0gKyBlcnJvck1lc3NhZ2VbMF0gKyBmb3JtYXREYXRlKG1heERhdGVWYWwsICdkZCBNTU1NIHl5eXknLCAnZW4tVVMnKSArIFwiLlwiKVxyXG4gICAgICB0aGlzLmRhdGVXcm9uZyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKG1pbkRhdGVWYWwgIT0gbnVsbCAmJiBtYXhEYXRlVmFsICE9IG51bGwpIHtcclxuICAgICAgaWYgKG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWF4Q29tcG9uZW50LmlkXS52YWx1ZSkgPiBtYXhEYXRlVmFsIHx8IG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWluQ29tcG9uZW50LmlkXS52YWx1ZSkgPCBtaW5EYXRlVmFsKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhsYWJlbFswXSArIGVycm9yTWVzc2FnZVswXSArIGZvcm1hdERhdGUobWluRGF0ZVZhbCwgJ2RkIE1NTU0geXl5eScsICdlbi1VUycpICsgXCIgYW5kXCIgKyBlcnJvck1lc3NhZ2VbMV0gKyBmb3JtYXREYXRlKG1heERhdGVWYWwsICdkZCBNTU1NIHl5eXknLCAnZW4tVVMnKSArIFwiLlwiKVxyXG4gICAgICAgIHRoaXMuZGF0ZVdyb25nID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGVXcm9uZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGVXcm9uZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRPcHRpb24oaXRlbTogeyBLZXk6IHN0cmluZywgVmFsdWU6IHN0cmluZyB9LCBjcml0OiBhbnkpIHtcclxuICAgIGNyaXQuZGVzY3IgPSBpdGVtLlZhbHVlO1xyXG4gICAgY3JpdC5pc0xpc3RIaWRlID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19