client-core-services 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Injectable, EventEmitter } from '@angular/core';
|
|
2
|
+
import { json2csv } from 'json-2-csv';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class ChartService {
|
|
6
|
+
constructor(datePipe) {
|
|
7
|
+
this.datePipe = datePipe;
|
|
8
|
+
this.filterRest = new EventEmitter(false);
|
|
9
|
+
}
|
|
10
|
+
async getDownloadData(chart, object) {
|
|
11
|
+
let DataList = [];
|
|
12
|
+
let fileName = object.name;
|
|
13
|
+
let blobUrl = '';
|
|
14
|
+
await chart.getData().then((chartdata) => {
|
|
15
|
+
let data = chartdata.documents;
|
|
16
|
+
let fields = chartdata.fields;
|
|
17
|
+
if (data && data.length > 0) {
|
|
18
|
+
data.forEach((obj) => {
|
|
19
|
+
let modifyObj = {};
|
|
20
|
+
Object.keys(fields).forEach((key) => {
|
|
21
|
+
const value = fields[key];
|
|
22
|
+
const val = obj[key];
|
|
23
|
+
if (val && val.constructor && val.constructor.name == "Date") {
|
|
24
|
+
const format = object.dateFormat ? object.dateFormat : 'dd/MM/yyyy';
|
|
25
|
+
modifyObj[value] = this.datePipe.transform(val, format);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
modifyObj[value] = obj[key];
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
DataList.push(modifyObj);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (DataList && DataList.length > 0) {
|
|
35
|
+
//blobUrl = this.downloadFile(DataList);
|
|
36
|
+
let csvData = json2csv(DataList);
|
|
37
|
+
blobUrl = this.createBlobUrl(csvData);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
url: blobUrl,
|
|
42
|
+
name: fileName
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
downloadFile(data) {
|
|
46
|
+
const replacer = (key, value) => (value === null ? '' : value); // specify how you want to handle null values here
|
|
47
|
+
const header = Object.keys(data[0]);
|
|
48
|
+
const csv = data.map((row) => header
|
|
49
|
+
.map((fieldName) => JSON.stringify(row[fieldName], replacer))
|
|
50
|
+
.join(','));
|
|
51
|
+
csv.unshift(header.join(','));
|
|
52
|
+
const csvArray = csv.join('\r\n');
|
|
53
|
+
return this.createBlobUrl(csvArray);
|
|
54
|
+
}
|
|
55
|
+
createBlobUrl(value) {
|
|
56
|
+
return new Blob([value], { type: 'text/csv' });
|
|
57
|
+
}
|
|
58
|
+
downlodBlobData(blob, fileName) {
|
|
59
|
+
const a = document.createElement('a');
|
|
60
|
+
const url = window.URL.createObjectURL(blob);
|
|
61
|
+
a.href = url;
|
|
62
|
+
a.download = fileName;
|
|
63
|
+
a.click();
|
|
64
|
+
window.URL.revokeObjectURL(url);
|
|
65
|
+
a.remove();
|
|
66
|
+
}
|
|
67
|
+
resetChartFilter() {
|
|
68
|
+
this.filterRest.emit(true);
|
|
69
|
+
}
|
|
70
|
+
getFilterData(dashbord, formValue) {
|
|
71
|
+
let fields = dashbord.fields && dashbord.fields.length > 0 ? dashbord.fields : [];
|
|
72
|
+
let filterValue = this.getMongochartFilterValue(fields, formValue);
|
|
73
|
+
let filterData = this.getMongodbFilterObject(filterValue);
|
|
74
|
+
return filterData;
|
|
75
|
+
}
|
|
76
|
+
getMongochartFilterValue(fields, object) {
|
|
77
|
+
let modifyObject = {};
|
|
78
|
+
let objectCopy = JSON.parse(JSON.stringify(object));
|
|
79
|
+
if (fields && fields.length > 0 && Object.keys(objectCopy).length > 0) {
|
|
80
|
+
fields.forEach((field) => {
|
|
81
|
+
let key = field.field_name;
|
|
82
|
+
if (object && object[key] && object[key] != '') {
|
|
83
|
+
let newDateObjec = {};
|
|
84
|
+
let date = new Date();
|
|
85
|
+
switch (field.type) {
|
|
86
|
+
case 'typeahead':
|
|
87
|
+
if (objectCopy[key] && typeof objectCopy[key] == 'object') {
|
|
88
|
+
modifyObject[key + '._id'] = objectCopy[key]._id;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
modifyObject[key] = objectCopy[key];
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case 'dropdown':
|
|
95
|
+
if (field.datatype == "object") {
|
|
96
|
+
if (field.multi_select) {
|
|
97
|
+
let idList = [];
|
|
98
|
+
if (object[key] && object[key].length > 0) {
|
|
99
|
+
object[key].forEach((data) => {
|
|
100
|
+
idList.push(data._id);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (idList && idList.length > 0) {
|
|
104
|
+
modifyObject[key + '._id'] = idList;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
modifyObject[key + '._id'] = objectCopy[key]._id;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
modifyObject[key] = objectCopy[key];
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
case 'date':
|
|
116
|
+
let formateDate = this.datePipe.transform(objectCopy[key], 'yyyy-MM-dd');
|
|
117
|
+
let selectedDate = new Date(formateDate);
|
|
118
|
+
selectedDate.setTime(selectedDate.getTime() + (24 * 3600000));
|
|
119
|
+
newDateObjec = {};
|
|
120
|
+
date = new Date(formateDate);
|
|
121
|
+
newDateObjec['$gt'] = date;
|
|
122
|
+
newDateObjec['$lte'] = selectedDate;
|
|
123
|
+
modifyObject[key] = newDateObjec;
|
|
124
|
+
break;
|
|
125
|
+
case 'daterange':
|
|
126
|
+
if (object[key].start && object[key].end && object[key].start != '' && object[key].end != '') {
|
|
127
|
+
let startDate = this.datePipe.transform(object[key].start, 'yyyy-MM-dd');
|
|
128
|
+
let endDate = this.datePipe.transform(object[key].end, 'yyyy-MM-dd');
|
|
129
|
+
let modifyEndDate = new Date(endDate);
|
|
130
|
+
modifyEndDate.setTime(modifyEndDate.getTime() + (24 * 3600000));
|
|
131
|
+
newDateObjec = {};
|
|
132
|
+
newDateObjec['$gt'] = new Date(startDate);
|
|
133
|
+
newDateObjec['$lte'] = new Date(modifyEndDate);
|
|
134
|
+
modifyObject[key] = newDateObjec;
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
default:
|
|
138
|
+
modifyObject[key] = objectCopy[key];
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return modifyObject;
|
|
145
|
+
}
|
|
146
|
+
getMongodbFilterObject(data) {
|
|
147
|
+
let object = {};
|
|
148
|
+
if (Object.keys(data).length > 0) {
|
|
149
|
+
Object.keys(data).forEach(key => {
|
|
150
|
+
if (data[key] && data[key] != '') {
|
|
151
|
+
object[key] = data[key];
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return object;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
ChartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
159
|
+
ChartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, providedIn: 'root' });
|
|
160
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, decorators: [{
|
|
161
|
+
type: Injectable,
|
|
162
|
+
args: [{
|
|
163
|
+
providedIn: 'root'
|
|
164
|
+
}]
|
|
165
|
+
}], ctorParameters: function () { return [{ type: i1.DatePipe }]; } });
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvY2hhcnQvY2hhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFDLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFLdEMsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFDVSxRQUFpQjtRQUFqQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBRjNCLGVBQVUsR0FBcUIsSUFBSSxZQUFZLENBQU0sS0FBSyxDQUFDLENBQUM7SUFHeEQsQ0FBQztJQUVMLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBUyxFQUFDLE1BQVU7UUFDeEMsSUFBSSxRQUFRLEdBQU8sRUFBRSxDQUFDO1FBQ3RCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDL0IsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM5QixJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO29CQUN2QixJQUFJLFNBQVMsR0FBTyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDMUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO3dCQUNwQixJQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBQzs0QkFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDOzRCQUNwRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUN4RDs2QkFBSTs0QkFDSCxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUM3QjtvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBRyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ2pDLHdDQUF3QztnQkFDeEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN2QztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLEdBQUcsRUFBRSxPQUFPO1lBQ1osSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFBO0lBRUgsQ0FBQztJQUNELFlBQVksQ0FBQyxJQUFTO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBTyxFQUFFLEtBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0RBQWtEO1FBQzFILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFLENBQy9CLE1BQU07YUFDSCxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDYixDQUFDO1FBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxPQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFTO1FBQ3JCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxlQUFlLENBQUMsSUFBUSxFQUFDLFFBQWU7UUFDdEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsYUFBYSxDQUFDLFFBQVksRUFBQyxTQUFhO1FBQ3RDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEYsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUNELHdCQUF3QixDQUFDLE1BQVUsRUFBQyxNQUFVO1FBQzVDLElBQUksWUFBWSxHQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDbkUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUMzQixJQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBQztvQkFDNUMsSUFBSSxZQUFZLEdBQU8sRUFBRSxDQUFDO29CQUMxQixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN0QixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQ2xCLEtBQUssV0FBVzs0QkFDZCxJQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLEVBQUM7Z0NBQ3ZELFlBQVksQ0FBQyxHQUFHLEdBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs2QkFDaEQ7aUNBQUk7Z0NBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs2QkFDckM7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLFVBQVU7NEJBQ2IsSUFBRyxLQUFLLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBQztnQ0FDNUIsSUFBRyxLQUFLLENBQUMsWUFBWSxFQUFDO29DQUNwQixJQUFJLE1BQU0sR0FBTyxFQUFFLENBQUM7b0NBQ3BCLElBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO3dDQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUSxFQUFFLEVBQUU7NENBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dDQUN4QixDQUFDLENBQUMsQ0FBQztxQ0FDSjtvQ0FDRCxJQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzt3Q0FDN0IsWUFBWSxDQUFDLEdBQUcsR0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7cUNBQ25DO2lDQUNGO3FDQUFJO29DQUNILFlBQVksQ0FBQyxHQUFHLEdBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQ0FDaEQ7NkJBQ0Y7aUNBQUk7Z0NBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs2QkFDckM7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLE1BQU07NEJBQ1QsSUFBSSxXQUFXLEdBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUM3RSxJQUFJLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDekMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUMsQ0FBQyxFQUFFLEdBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs0QkFDMUQsWUFBWSxHQUFHLEVBQUUsQ0FBQzs0QkFDbEIsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUM3QixZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDOzRCQUMzQixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDOzRCQUNwQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUksWUFBWSxDQUFDOzRCQUNsQyxNQUFNO3dCQUNSLEtBQUssV0FBVzs0QkFDZCxJQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBQztnQ0FDMUYsSUFBSSxTQUFTLEdBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBQyxZQUFZLENBQUMsQ0FBQztnQ0FDNUUsSUFBSSxPQUFPLEdBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBQyxZQUFZLENBQUMsQ0FBQztnQ0FDeEUsSUFBSSxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0NBQ3RDLGFBQWEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFDLENBQUMsRUFBRSxHQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0NBQzVELFlBQVksR0FBRyxFQUFFLENBQUM7Z0NBQ2xCLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDMUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dDQUMvQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUksWUFBWSxDQUFDOzZCQUNuQzs0QkFDRCxNQUFNO3dCQUNSOzRCQUNFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3BDLE1BQU07cUJBQ1Q7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUNELHNCQUFzQixDQUFDLElBQVE7UUFDN0IsSUFBSSxNQUFNLEdBQU8sRUFBRSxDQUFDO1FBQ3BCLElBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM5QixJQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFDO29CQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN6QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzswR0F4SlUsWUFBWTs4R0FBWixZQUFZLGNBRlgsTUFBTTs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSxFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsganNvbjJjc3YgfSBmcm9tICdqc29uLTItY3N2JztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXJ0U2VydmljZSB7XHJcblxyXG4gIGZpbHRlclJlc3Q6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oZmFsc2UpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTpEYXRlUGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIGdldERvd25sb2FkRGF0YShjaGFydDphbnksb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgRGF0YUxpc3Q6YW55ID0gW107XHJcbiAgICBsZXQgZmlsZU5hbWUgPSBvYmplY3QubmFtZTtcclxuICAgIGxldCBibG9iVXJsIDphbnkgPSAnJztcclxuICAgIGF3YWl0IGNoYXJ0LmdldERhdGEoKS50aGVuKChjaGFydGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgZGF0YSA9IGNoYXJ0ZGF0YS5kb2N1bWVudHM7XHJcbiAgICAgIGxldCBmaWVsZHMgPSBjaGFydGRhdGEuZmllbGRzO1xyXG4gICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChvYmo6YW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgbW9kaWZ5T2JqOmFueSA9IHt9O1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gb2JqW2tleV1cclxuICAgICAgICAgICAgaWYodmFsICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB2YWwuY29uc3RydWN0b3IubmFtZSA9PSBcIkRhdGVcIil7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gb2JqZWN0LmRhdGVGb3JtYXQgPyBvYmplY3QuZGF0ZUZvcm1hdCA6ICdkZC9NTS95eXl5JztcclxuICAgICAgICAgICAgICBtb2RpZnlPYmpbdmFsdWVdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsLGZvcm1hdCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIG1vZGlmeU9ialt2YWx1ZV0gPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBEYXRhTGlzdC5wdXNoKG1vZGlmeU9iaik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoRGF0YUxpc3QgJiYgRGF0YUxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgLy9ibG9iVXJsID0gdGhpcy5kb3dubG9hZEZpbGUoRGF0YUxpc3QpO1xyXG4gICAgICAgIGxldCBjc3ZEYXRhID0ganNvbjJjc3YoRGF0YUxpc3QpO1xyXG4gICAgICAgIGJsb2JVcmwgPSB0aGlzLmNyZWF0ZUJsb2JVcmwoY3N2RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdXJsOiBibG9iVXJsLFxyXG4gICAgICBuYW1lOiBmaWxlTmFtZVxyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgZG93bmxvYWRGaWxlKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgcmVwbGFjZXIgPSAoa2V5OmFueSwgdmFsdWU6YW55KSA9PiAodmFsdWUgPT09IG51bGwgPyAnJyA6IHZhbHVlKTsgLy8gc3BlY2lmeSBob3cgeW91IHdhbnQgdG8gaGFuZGxlIG51bGwgdmFsdWVzIGhlcmVcclxuICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xyXG4gICAgY29uc3QgY3N2ID0gZGF0YS5tYXAoKHJvdzphbnkpID0+XHJcbiAgICAgIGhlYWRlclxyXG4gICAgICAgIC5tYXAoKGZpZWxkTmFtZSkgPT4gSlNPTi5zdHJpbmdpZnkocm93W2ZpZWxkTmFtZV0sIHJlcGxhY2VyKSlcclxuICAgICAgICAuam9pbignLCcpXHJcbiAgICApO1xyXG4gICAgY3N2LnVuc2hpZnQoaGVhZGVyLmpvaW4oJywnKSk7XHJcbiAgICBjb25zdCBjc3ZBcnJheSA9IGNzdi5qb2luKCdcXHJcXG4nKTtcclxuICAgIHJldHVybiAgdGhpcy5jcmVhdGVCbG9iVXJsKGNzdkFycmF5KTtcclxuICB9XHJcbiAgY3JlYXRlQmxvYlVybCh2YWx1ZTphbnkpe1xyXG4gICAgcmV0dXJuIG5ldyBCbG9iKFt2YWx1ZV0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcclxuICB9XHJcbiAgZG93bmxvZEJsb2JEYXRhKGJsb2I6YW55LGZpbGVOYW1lOnN0cmluZyl7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIGEuaHJlZiA9IHVybDtcclxuICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgICBhLmNsaWNrKCk7XHJcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgICAgIGEucmVtb3ZlKCk7XHJcbiAgfVxyXG4gIHJlc2V0Q2hhcnRGaWx0ZXIoKXtcclxuICAgIHRoaXMuZmlsdGVyUmVzdC5lbWl0KHRydWUpO1xyXG4gIH1cclxuICBnZXRGaWx0ZXJEYXRhKGRhc2hib3JkOmFueSxmb3JtVmFsdWU6YW55KXtcclxuICAgIGxldCBmaWVsZHMgPSBkYXNoYm9yZC5maWVsZHMgJiYgZGFzaGJvcmQuZmllbGRzLmxlbmd0aCA+IDAgPyBkYXNoYm9yZC5maWVsZHMgOiBbXTtcclxuICAgIGxldCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZ2V0TW9uZ29jaGFydEZpbHRlclZhbHVlKGZpZWxkcyxmb3JtVmFsdWUpO1xyXG4gICAgbGV0IGZpbHRlckRhdGEgPSB0aGlzLmdldE1vbmdvZGJGaWx0ZXJPYmplY3QoZmlsdGVyVmFsdWUpO1xyXG4gICAgcmV0dXJuIGZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIGdldE1vbmdvY2hhcnRGaWx0ZXJWYWx1ZShmaWVsZHM6YW55LG9iamVjdDphbnkpe1xyXG4gICAgbGV0IG1vZGlmeU9iamVjdDphbnkgPSB7fTtcclxuICAgIGxldCBvYmplY3RDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhvYmplY3RDb3B5KS5sZW5ndGggPiAwKXtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3Rba2V5XSAmJiBvYmplY3Rba2V5XSAhPSAnJyl7XHJcbiAgICAgICAgICBsZXQgbmV3RGF0ZU9iamVjOmFueSA9IHt9O1xyXG4gICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3R5cGVhaGVhZCc6XHJcbiAgICAgICAgICAgICAgaWYob2JqZWN0Q29weVtrZXldICYmIHR5cGVvZiBvYmplY3RDb3B5W2tleV0gPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgbW9kaWZ5T2JqZWN0W2tleSsnLl9pZCddID0gb2JqZWN0Q29weVtrZXldLl9pZDtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXldID0gb2JqZWN0Q29weVtrZXldO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZHJvcGRvd24nOlxyXG4gICAgICAgICAgICAgIGlmKGZpZWxkLmRhdGF0eXBlID09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQubXVsdGlfc2VsZWN0KXtcclxuICAgICAgICAgICAgICAgICAgbGV0IGlkTGlzdDphbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYob2JqZWN0W2tleV0gJiYgb2JqZWN0W2tleV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0uZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlkTGlzdC5wdXNoKGRhdGEuX2lkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihpZExpc3QgJiYgaWRMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXkrJy5faWQnXSA9IGlkTGlzdDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXkrJy5faWQnXSA9IG9iamVjdENvcHlba2V5XS5faWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9IG9iamVjdENvcHlba2V5XTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgICAgIGxldCBmb3JtYXRlRGF0ZTphbnkgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShvYmplY3RDb3B5W2tleV0sICd5eXl5LU1NLWRkJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGZvcm1hdGVEYXRlKTtcclxuICAgICAgICAgICAgICBzZWxlY3RlZERhdGUuc2V0VGltZShzZWxlY3RlZERhdGUuZ2V0VGltZSgpKygyNCozNjAwMDAwKSk7XHJcbiAgICAgICAgICAgICAgbmV3RGF0ZU9iamVjID0ge307XHJcbiAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGZvcm1hdGVEYXRlKTtcclxuICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRndCddID0gZGF0ZTtcclxuICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRsdGUnXSA9IHNlbGVjdGVkRGF0ZTtcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9ICBuZXdEYXRlT2JqZWM7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGVyYW5nZSc6XHJcbiAgICAgICAgICAgICAgaWYob2JqZWN0W2tleV0uc3RhcnQgJiYgb2JqZWN0W2tleV0uZW5kICYmIG9iamVjdFtrZXldLnN0YXJ0ICE9ICcnICYmIG9iamVjdFtrZXldLmVuZCAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnREYXRlOmFueSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG9iamVjdFtrZXldLnN0YXJ0LCd5eXl5LU1NLWRkJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kRGF0ZTphbnkgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShvYmplY3Rba2V5XS5lbmQsJ3l5eXktTU0tZGQnKTtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RpZnlFbmREYXRlID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBtb2RpZnlFbmREYXRlLnNldFRpbWUobW9kaWZ5RW5kRGF0ZS5nZXRUaW1lKCkrKDI0KjM2MDAwMDApKTtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGVPYmplYyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbmV3RGF0ZU9iamVjWyckZ3QnXSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRsdGUnXSA9IG5ldyBEYXRlKG1vZGlmeUVuZERhdGUpO1xyXG4gICAgICAgICAgICAgICAgbW9kaWZ5T2JqZWN0W2tleV0gPSAgbmV3RGF0ZU9iamVjO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9IG9iamVjdENvcHlba2V5XTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeU9iamVjdDtcclxuICB9XHJcbiAgZ2V0TW9uZ29kYkZpbHRlck9iamVjdChkYXRhOmFueSl7XHJcbiAgICBsZXQgb2JqZWN0OmFueSA9IHt9O1xyXG4gICAgaWYoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCl7XHJcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBpZihkYXRhW2tleV0gJiYgZGF0YVtrZXldICE9ICcnKXtcclxuICAgICAgICAgIG9iamVjdFtrZXldID0gZGF0YVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxufVxyXG4iXX0=
|