@esfaenza/extensions 15.2.48 → 15.2.50
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/{esm2022 → esm2020}/esfaenza-extensions.mjs +4 -4
- package/esm2020/lib/models/CallResult.mjs +6 -0
- package/esm2020/lib/models/CsvHeaders.mjs +6 -0
- package/{esm2022 → esm2020}/lib/models/ExportConsts.mjs +31 -31
- package/esm2020/lib/models/ExtensionsModuleConfig.mjs +4 -0
- package/esm2020/lib/models/GenericItem.mjs +6 -0
- package/{esm2022 → esm2020}/lib/models/InboundMessageTypes.mjs +6 -6
- package/esm2020/lib/models/InterComMessage.mjs +14 -0
- package/{esm2022 → esm2020}/lib/models/TypeCode.mjs +24 -24
- package/{esm2022 → esm2020}/lib/modules/extensions.module.mjs +32 -32
- package/esm2020/lib/pipes/loc_date.pipe.mjs +37 -0
- package/esm2020/lib/services/extensions.base.mjs +29 -0
- package/esm2020/lib/services/extensions.clipboard.service.mjs +219 -0
- package/esm2020/lib/services/extensions.dates.service.mjs +246 -0
- package/esm2020/lib/services/extensions.embedding.service.mjs +208 -0
- package/esm2020/lib/services/extensions.exports.service.mjs +615 -0
- package/esm2020/lib/services/extensions.hashing.service.mjs +310 -0
- package/esm2020/lib/services/extensions.intercom.service.mjs +54 -0
- package/esm2020/lib/services/extensions.messages.service.mjs +433 -0
- package/esm2020/lib/services/extensions.utilities.service.mjs +252 -0
- package/{esm2022 → esm2020}/lib/tokens.mjs +11 -11
- package/{esm2022 → esm2020}/public-api.mjs +21 -21
- package/fesm2015/esfaenza-extensions.mjs +2517 -0
- package/fesm2015/esfaenza-extensions.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/esfaenza-extensions.mjs +2445 -2509
- package/fesm2020/esfaenza-extensions.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/models/CallResult.d.ts +23 -23
- package/lib/models/CsvHeaders.d.ts +25 -25
- package/lib/models/ExportConsts.d.ts +31 -31
- package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
- package/lib/models/GenericItem.d.ts +9 -9
- package/lib/models/InboundMessageTypes.d.ts +5 -5
- package/lib/models/InterComMessage.d.ts +12 -12
- package/lib/models/TypeCode.d.ts +23 -23
- package/lib/modules/extensions.module.d.ts +11 -11
- package/lib/pipes/loc_date.pipe.d.ts +24 -24
- package/lib/services/extensions.base.d.ts +22 -22
- package/lib/services/extensions.clipboard.service.d.ts +54 -54
- package/lib/services/extensions.dates.service.d.ts +101 -99
- package/lib/services/extensions.embedding.service.d.ts +28 -28
- package/lib/services/extensions.exports.service.d.ts +234 -234
- package/lib/services/extensions.hashing.service.d.ts +121 -121
- package/lib/services/extensions.intercom.service.d.ts +28 -28
- package/lib/services/extensions.messages.service.d.ts +195 -195
- package/lib/services/extensions.utilities.service.d.ts +107 -107
- package/lib/tokens.d.ts +11 -11
- package/package.json +11 -5
- package/public-api.d.ts +18 -18
- package/esm2022/lib/models/CallResult.mjs +0 -24
- package/esm2022/lib/models/CsvHeaders.mjs +0 -26
- package/esm2022/lib/models/ExtensionsModuleConfig.mjs +0 -10
- package/esm2022/lib/models/GenericItem.mjs +0 -10
- package/esm2022/lib/models/InterComMessage.mjs +0 -16
- package/esm2022/lib/pipes/loc_date.pipe.mjs +0 -38
- package/esm2022/lib/services/extensions.base.mjs +0 -30
- package/esm2022/lib/services/extensions.clipboard.service.mjs +0 -221
- package/esm2022/lib/services/extensions.dates.service.mjs +0 -244
- package/esm2022/lib/services/extensions.embedding.service.mjs +0 -213
- package/esm2022/lib/services/extensions.exports.service.mjs +0 -617
- package/esm2022/lib/services/extensions.hashing.service.mjs +0 -308
- package/esm2022/lib/services/extensions.intercom.service.mjs +0 -52
- package/esm2022/lib/services/extensions.messages.service.mjs +0 -450
- package/esm2022/lib/services/extensions.utilities.service.mjs +0 -250
- package/fesm2022/esfaenza-extensions.mjs.map +0 -1
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Injectable } from "@angular/core";
|
|
3
|
-
// Modelli
|
|
4
|
-
import { TypeCode } from '../models/TypeCode';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* Service che fornisce metodi di pubblica utilità
|
|
8
|
-
*/
|
|
9
|
-
export class UtilityService {
|
|
10
|
-
/**
|
|
11
|
-
* Deseleziona il testo eventualmente selezionato
|
|
12
|
-
*/
|
|
13
|
-
clearTextSelection() {
|
|
14
|
-
if (window.getSelection) {
|
|
15
|
-
if (window.getSelection().empty) // Chrome
|
|
16
|
-
window.getSelection().empty();
|
|
17
|
-
else if (window.getSelection().removeAllRanges) // Firefox
|
|
18
|
-
window.getSelection().removeAllRanges();
|
|
19
|
-
}
|
|
20
|
-
else if (document.selection) // IE?
|
|
21
|
-
document.selection.empty();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Partendo da una lista, dato il nome della proprietà chiave e il valore della chiave selezionata,
|
|
25
|
-
* trova e restituisce l'oggetto desiderato
|
|
26
|
-
*
|
|
27
|
-
* @param {T[]} sourceList Lista di oggetti dentro cui cercare
|
|
28
|
-
* @param {string} sourceItemIdField Nome della proprietà che rappresenta la chiave di un oggetto di tipo T
|
|
29
|
-
* @param {string} selectedValue Valore di chiave selezionato
|
|
30
|
-
*
|
|
31
|
-
* @returns {T} Oggetto la cui proprietà **sourceItemIdField** assume il valore **selectedValue**
|
|
32
|
-
*/
|
|
33
|
-
getSelectedItem(sourceList, sourceItemIdField, selectedValue) {
|
|
34
|
-
for (let i = 0; i < sourceList.length; i++) {
|
|
35
|
-
var item = sourceList[i];
|
|
36
|
-
if (item[sourceItemIdField] == selectedValue)
|
|
37
|
-
return item;
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Effettua il reset di un Form di Angular
|
|
43
|
-
*
|
|
44
|
-
* @param {NgForm} form Form da resettare
|
|
45
|
-
* @param {string} exception1 Campo da non resettare
|
|
46
|
-
* @param {string} exception2 Campo da non resettare
|
|
47
|
-
*/
|
|
48
|
-
cleanForm(form, exception1 = null, exception2 = null) {
|
|
49
|
-
for (let name in form.controls) {
|
|
50
|
-
if (name && name != exception1 && name != exception1 + "_internal" && name != exception2 && name != exception2 + "_internal") {
|
|
51
|
-
form.controls[name].reset();
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
form.controls[name].markAsPristine();
|
|
55
|
-
form.controls[name].markAsUntouched();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//Reimposto il submitted
|
|
59
|
-
form.submitted = false;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Helper che permette di scaricare un file dato un URL (Generato da una chiamata ad **window.URL.createObjectURL**)
|
|
63
|
-
*
|
|
64
|
-
* @param {string} url ObjectURL che rappresenta il file da scaricare
|
|
65
|
-
* @param {string} filename Nome del file suggerito in fase di salvataggio
|
|
66
|
-
*/
|
|
67
|
-
fileDownload(url, fileName) {
|
|
68
|
-
var a = document.createElement("a");
|
|
69
|
-
document.body.appendChild(a);
|
|
70
|
-
a.className = "ta-display-none";
|
|
71
|
-
a.href = url;
|
|
72
|
-
a.download = fileName;
|
|
73
|
-
a.click();
|
|
74
|
-
window.URL.revokeObjectURL(url);
|
|
75
|
-
document.body.removeChild(a);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Helper per la formattazione di un numero di millisecondi in una stringa più comprensibile per un umano
|
|
79
|
-
*
|
|
80
|
-
* @param {number} duration Tempo espresso in millisecondi
|
|
81
|
-
*
|
|
82
|
-
* @returns {string} Durata formattata
|
|
83
|
-
*/
|
|
84
|
-
msToTime(duration) {
|
|
85
|
-
if (!duration)
|
|
86
|
-
return "";
|
|
87
|
-
var milliseconds = parseInt(((duration % 1000) / 100).toString()), seconds = parseInt(((duration / 1000) % 60).toString()), minutes = parseInt(((duration / (1000 * 60)) % 60).toString()), hours = parseInt(((duration / (1000 * 60 * 60)) % 24).toString());
|
|
88
|
-
var st_hours = (hours < 10) ? "0" + hours : hours;
|
|
89
|
-
var st_minutes = (minutes < 10) ? "0" + minutes : minutes;
|
|
90
|
-
var st_seconds = (seconds < 10) ? "0" + seconds : seconds;
|
|
91
|
-
return st_hours + ":" + st_minutes + ":" + st_seconds + "." + milliseconds;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Helper che permette di scaricare un file in Base64
|
|
95
|
-
*
|
|
96
|
-
* @param {string} base64Data Base64 che rappresenta il file da scaricare
|
|
97
|
-
* @param {string} filename Nome del file suggerito in fase di salvataggio
|
|
98
|
-
*/
|
|
99
|
-
saveFile(base64Data, filename) {
|
|
100
|
-
var sampleArr = this.base64ToArrayBuffer(base64Data);
|
|
101
|
-
this.saveByteArray(sampleArr, filename);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Trasforma un Base64 in un ArrayBuffer
|
|
105
|
-
*
|
|
106
|
-
* @param {string} base64Data Base64 da trasformare
|
|
107
|
-
*
|
|
108
|
-
* @returns {Uint8Array} Array UTF8
|
|
109
|
-
*/
|
|
110
|
-
base64ToArrayBuffer(base64Data) {
|
|
111
|
-
var binaryString = window.atob(base64Data);
|
|
112
|
-
var binaryLen = binaryString.length;
|
|
113
|
-
var bytes = new Uint8Array(binaryLen);
|
|
114
|
-
for (var i = 0; i < binaryLen; i++) {
|
|
115
|
-
var ascii = binaryString.charCodeAt(i);
|
|
116
|
-
bytes[i] = ascii;
|
|
117
|
-
}
|
|
118
|
-
return bytes;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Helper che permette di scaricare un file dato un array di Byte (**Uint8Array**)
|
|
122
|
-
*
|
|
123
|
-
* @param {Uint8Array} byte Rappresentazione del file da scaricare
|
|
124
|
-
* @param {string} filename Nome del file suggerito in fase di salvataggio
|
|
125
|
-
*/
|
|
126
|
-
saveByteArray(byte, filename) {
|
|
127
|
-
var blob = new Blob([byte]);
|
|
128
|
-
var link = document.createElement("a");
|
|
129
|
-
document.body.appendChild(link);
|
|
130
|
-
link.href = window.URL.createObjectURL(blob);
|
|
131
|
-
var fileName = filename;
|
|
132
|
-
link.download = fileName;
|
|
133
|
-
link.click();
|
|
134
|
-
document.body.removeChild(link);
|
|
135
|
-
}
|
|
136
|
-
;
|
|
137
|
-
/**
|
|
138
|
-
* Utility per lo swap di due elementi di un array
|
|
139
|
-
*
|
|
140
|
-
* @param {any[]} array Array di cui invertire due elementi
|
|
141
|
-
* @param {number} x Indice del primo elemento
|
|
142
|
-
* @param {number} y Indice del secondo elemento
|
|
143
|
-
*/
|
|
144
|
-
swap(array, x, y) {
|
|
145
|
-
var b = array[x];
|
|
146
|
-
array[x] = array[y];
|
|
147
|
-
array[y] = b;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Helper di trascodifica da tipo c# a tipo Typescript
|
|
151
|
-
*
|
|
152
|
-
* @param {TypeCode} type Tipo da trascodificare
|
|
153
|
-
*
|
|
154
|
-
* @returns {"boolean" | "number" | "string" | "date"} Tipo Typescript corrispondente
|
|
155
|
-
*/
|
|
156
|
-
getJsTypeFromTypeCode(type) {
|
|
157
|
-
switch (type) {
|
|
158
|
-
case TypeCode.Boolean:
|
|
159
|
-
return "boolean";
|
|
160
|
-
case TypeCode.Decimal:
|
|
161
|
-
case TypeCode.Double:
|
|
162
|
-
case TypeCode.Single:
|
|
163
|
-
case TypeCode.Int16:
|
|
164
|
-
case TypeCode.Int32:
|
|
165
|
-
case TypeCode.Int64:
|
|
166
|
-
case TypeCode.Byte:
|
|
167
|
-
case TypeCode.SByte:
|
|
168
|
-
case TypeCode.UInt16:
|
|
169
|
-
case TypeCode.UInt32:
|
|
170
|
-
case TypeCode.UInt64:
|
|
171
|
-
return "number";
|
|
172
|
-
case TypeCode.Char:
|
|
173
|
-
case TypeCode.String:
|
|
174
|
-
return "string";
|
|
175
|
-
case TypeCode.DateTime:
|
|
176
|
-
return "date";
|
|
177
|
-
default:
|
|
178
|
-
console.log("Unrecognized input type. Typecode:" + type);
|
|
179
|
-
return "string";
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Effettua la clonazione profonda di un oggetto in maniera molto più performante che JSON.parse(JSON.stringify()).
|
|
184
|
-
*
|
|
185
|
-
* Usare solo per oggetti puri e quantomeno semplici per evitare complicazioni derivanti dalle semplificazioni che questo metodo assume
|
|
186
|
-
*
|
|
187
|
-
* @param {any} source Oggetto da clonare
|
|
188
|
-
*
|
|
189
|
-
* @return {any} Clone dell'oggetto passato
|
|
190
|
-
*/
|
|
191
|
-
deepClone(source, type = null) {
|
|
192
|
-
// Valori semplici
|
|
193
|
-
if (source == null || typeof source !== 'object')
|
|
194
|
-
return source;
|
|
195
|
-
// Pseudo Struct
|
|
196
|
-
switch (toString.call(source)) {
|
|
197
|
-
case '[object Boolean]':
|
|
198
|
-
case '[object Number]':
|
|
199
|
-
case '[object String]':
|
|
200
|
-
case '[object Date]':
|
|
201
|
-
return new source.constructor(source.valueOf());
|
|
202
|
-
// Clonazione di un file -> Restituisco il riferimento al file stesso
|
|
203
|
-
case "[object File]":
|
|
204
|
-
return source;
|
|
205
|
-
default: break;
|
|
206
|
-
}
|
|
207
|
-
// Oggetti Complessi
|
|
208
|
-
return this.recursiveStep(source, Array.isArray(source) || source instanceof Array ? [] : (type == null ? Object.create(Object.getPrototypeOf(source)) : new type()));
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* @ignore
|
|
212
|
-
* Step ricorsivo per la clonatura degli oggetti. Vedere **deepClone**
|
|
213
|
-
*/
|
|
214
|
-
recursiveStep(source, destination) {
|
|
215
|
-
if (Array.isArray(source) || source instanceof Array) {
|
|
216
|
-
for (var i = 0, ii = source.length; i < ii; i++)
|
|
217
|
-
destination.push(this.deepClone(source[i]));
|
|
218
|
-
}
|
|
219
|
-
else if (source && typeof source.hasOwnProperty === 'function') {
|
|
220
|
-
for (let key in source) {
|
|
221
|
-
if (source.hasOwnProperty(key))
|
|
222
|
-
destination[key] = this.deepClone(source[key]);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return destination;
|
|
226
|
-
}
|
|
227
|
-
cast(object, clss) {
|
|
228
|
-
let ret = Object.assign(Object.create(clss.prototype), object);
|
|
229
|
-
return ret;
|
|
230
|
-
}
|
|
231
|
-
// Funzione di throttling per non spammare richieste in caso di animazioni attivate
|
|
232
|
-
//TODO: spostarla in un metodo di utilit� (esfaenza/extensions)
|
|
233
|
-
/** @ignore */
|
|
234
|
-
executionTimers = {};
|
|
235
|
-
/** @ignore */
|
|
236
|
-
throttla(id, func, throttleTime) {
|
|
237
|
-
//Se ho la funzione che vuole eseguire ripulisco quel timeout
|
|
238
|
-
if (this.executionTimers[id])
|
|
239
|
-
clearTimeout(this.executionTimers[id]);
|
|
240
|
-
//Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi
|
|
241
|
-
this.executionTimers[id] = setTimeout(() => { func(); this.executionTimers[id] = null; }, throttleTime);
|
|
242
|
-
}
|
|
243
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
244
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilityService, providedIn: "root" });
|
|
245
|
-
}
|
|
246
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilityService, decorators: [{
|
|
247
|
-
type: Injectable,
|
|
248
|
-
args: [{ providedIn: "root" }]
|
|
249
|
-
}] });
|
|
250
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy51dGlsaXRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9zZXJ2aWNlcy9leHRlbnNpb25zLnV0aWxpdGllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBR2pELFVBQVU7QUFDVixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRTlDOztHQUVHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFFdkI7O09BRUc7SUFDSSxrQkFBa0I7UUFDckIsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBSSxTQUFTO2dCQUN4QyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQzdCLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRyxVQUFVO2dCQUN2RCxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7U0FFL0M7YUFBTSxJQUFVLFFBQVMsQ0FBQyxTQUFTLEVBQUcsTUFBTTtZQUNuQyxRQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxlQUFlLENBQUksVUFBZSxFQUFFLGlCQUF5QixFQUFFLGFBQXFCO1FBQ3ZGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGFB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QyxDQUFDO1FBRTNDLCtFQUErRTtRQUMvRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVHLENBQUM7d0dBblFRLGNBQWM7NEdBQWQsY0FBYyxjQURELE1BQU07OzRGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBUeXBlQ29kZSB9IGZyb20gJy4uL21vZGVscy9UeXBlQ29kZSc7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgbWV0b2RpIGRpIHB1YmJsaWNhIHV0aWxpdMOgXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBVdGlsaXR5U2VydmljZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXNlbGV6aW9uYSBpbCB0ZXN0byBldmVudHVhbG1lbnRlIHNlbGV6aW9uYXRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclRleHRTZWxlY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSkgICAvLyBDaHJvbWVcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKSAgLy8gRmlyZWZveFxyXG4gICAgICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKCg8YW55PmRvY3VtZW50KS5zZWxlY3Rpb24pICAvLyBJRT9cclxuICAgICAgICAgICAgKDxhbnk+ZG9jdW1lbnQpLnNlbGVjdGlvbi5lbXB0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFydGVuZG8gZGEgdW5hIGxpc3RhLCBkYXRvIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGlhdmUgZSBpbCB2YWxvcmUgZGVsbGEgY2hpYXZlIHNlbGV6aW9uYXRhLCBcclxuICAgICAqIHRyb3ZhIGUgcmVzdGl0dWlzY2UgbCdvZ2dldHRvIGRlc2lkZXJhdG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUW119IHNvdXJjZUxpc3QgTGlzdGEgZGkgb2dnZXR0aSBkZW50cm8gY3VpIGNlcmNhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VJdGVtSWRGaWVsZCBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIHJhcHByZXNlbnRhIGxhIGNoaWF2ZSBkaSB1biBvZ2dldHRvIGRpIHRpcG8gVFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdGVkVmFsdWUgVmFsb3JlIGRpIGNoaWF2ZSBzZWxlemlvbmF0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VH0gT2dnZXR0byBsYSBjdWkgcHJvcHJpZXTDoCAqKnNvdXJjZUl0ZW1JZEZpZWxkKiogYXNzdW1lIGlsIHZhbG9yZSAqKnNlbGVjdGVkVmFsdWUqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtPFQ+KHNvdXJjZUxpc3Q6IFRbXSwgc291cmNlSXRlbUlkRmllbGQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKTogVCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gc291cmNlTGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1bc291cmNlSXRlbUlkRmllbGRdID09IHNlbGVjdGVkVmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCByZXNldCBkaSB1biBGb3JtIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ0Zvcm19IGZvcm0gRm9ybSBkYSByZXNldHRhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleGNlcHRpb24xIENhbXBvIGRhIG5vbiByZXNldHRhcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleGNlcHRpb24yIENhbXBvIGRhIG5vbiByZXNldHRhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFuRm9ybShmb3JtOiBOZ0Zvcm0sIGV4Y2VwdGlvbjE6IHN0cmluZyA9IG51bGwsIGV4Y2VwdGlvbjI6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGZvcm0uY29udHJvbHMpIHtcclxuICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPSBleGNlcHRpb24xICYmIG5hbWUgIT0gZXhjZXB0aW9uMSArIFwiX2ludGVybmFsXCIgJiYgbmFtZSAhPSBleGNlcHRpb24yICYmIG5hbWUgIT0gZXhjZXB0aW9uMiArIFwiX2ludGVybmFsXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbmFtZV0ucmVzZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbmFtZV0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbmFtZV0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVpbXBvc3RvIGlsIHN1Ym1pdHRlZFxyXG4gICAgICAgIChmb3JtIGFzIHsgc3VibWl0dGVkOiBib29sZWFuIH0pLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSBwZXJtZXR0ZSBkaSBzY2FyaWNhcmUgdW4gZmlsZSBkYXRvIHVuIFVSTCAoR2VuZXJhdG8gZGEgdW5hIGNoaWFtYXRhIGFkICoqd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwqKilcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBPYmplY3RVUkwgY2hlIHJhcHByZXNlbnRhIGlsIGZpbGUgZGEgc2NhcmljYXJlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgTm9tZSBkZWwgZmlsZSBzdWdnZXJpdG8gaW4gZmFzZSBkaSBzYWx2YXRhZ2dpb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmlsZURvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgICAgIGEuY2xhc3NOYW1lID0gXCJ0YS1kaXNwbGF5LW5vbmVcIjtcclxuICAgICAgICBhLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGxhIGZvcm1hdHRhemlvbmUgZGkgdW4gbnVtZXJvIGRpIG1pbGxpc2Vjb25kaSBpbiB1bmEgc3RyaW5nYSBwacO5IGNvbXByZW5zaWJpbGUgcGVyIHVuIHVtYW5vXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUZW1wbyBlc3ByZXNzbyBpbiBtaWxsaXNlY29uZGlcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gRHVyYXRhIGZvcm1hdHRhdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1zVG9UaW1lKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZHVyYXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gcGFyc2VJbnQoKChkdXJhdGlvbiAlIDEwMDApIC8gMTAwKS50b1N0cmluZygpKSxcclxuICAgICAgICAgICAgc2Vjb25kcyA9IHBhcnNlSW50KCgoZHVyYXRpb24gLyAxMDAwKSAlIDYwKS50b1N0cmluZygpKSxcclxuICAgICAgICAgICAgbWludXRlcyA9IHBhcnNlSW50KCgoZHVyYXRpb24gLyAoMTAwMCAqIDYwKSkgJSA2MCkudG9TdHJpbmcoKSksXHJcbiAgICAgICAgICAgIGhvdXJzID0gcGFyc2VJbnQoKChkdXJhdGlvbiAvICgxMDAwICogNjAgKiA2MCkpICUgMjQpLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICB2YXIgc3RfaG91cnMgPSAoaG91cnMgPCAxMCkgPyBcIjBcIiArIGhvdXJzIDogaG91cnM7XHJcbiAgICAgICAgdmFyIHN0X21pbnV0ZXMgPSAobWludXRlcyA8IDEwKSA/IFwiMFwiICsgbWludXRlcyA6IG1pbnV0ZXM7XHJcbiAgICAgICAgdmFyIHN0X3NlY29uZHMgPSAoc2Vjb25kcyA8IDEwKSA/IFwiMFwiICsgc2Vjb25kcyA6IHNlY29uZHM7XHJcblxyXG4gICAgICAgIHJldHVybiBzdF9ob3VycyArIFwiOlwiICsgc3RfbWludXRlcyArIFwiOlwiICsgc3Rfc2Vjb25kcyArIFwiLlwiICsgbWlsbGlzZWNvbmRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSBwZXJtZXR0ZSBkaSBzY2FyaWNhcmUgdW4gZmlsZSBpbiBCYXNlNjRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGNoZSByYXBwcmVzZW50YSBpbCBmaWxlIGRhIHNjYXJpY2FyZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgc3VnZ2VyaXRvIGluIGZhc2UgZGkgc2FsdmF0YWdnaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNhdmVGaWxlKGJhc2U2NERhdGE6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzYW1wbGVBcnIgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0RGF0YSk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnl0ZUFycmF5KHNhbXBsZUFyciwgZmlsZW5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhc2Zvcm1hIHVuIEJhc2U2NCBpbiB1biBBcnJheUJ1ZmZlclxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSBCYXNlNjQgZGEgdHJhc2Zvcm1hcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IEFycmF5IFVURjhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NERhdGE6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgIHZhciBiaW5hcnlTdHJpbmcgPSB3aW5kb3cuYXRvYihiYXNlNjREYXRhKTtcclxuICAgICAgICB2YXIgYmluYXJ5TGVuID0gYmluYXJ5U3RyaW5nLmxlbmd0aDtcclxuICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlMZW4pO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluYXJ5TGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGFzY2lpID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGJ5dGVzW2ldID0gYXNjaWk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBieXRlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBjaGUgcGVybWV0dGUgZGkgc2NhcmljYXJlIHVuIGZpbGUgZGF0byB1biBhcnJheSBkaSBCeXRlICgqKlVpbnQ4QXJyYXkqKilcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlIFJhcHByZXNlbnRhemlvbmUgZGVsIGZpbGUgZGEgc2NhcmljYXJlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgTm9tZSBkZWwgZmlsZSBzdWdnZXJpdG8gaW4gZmFzZSBkaSBzYWx2YXRhZ2dpb1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNhdmVCeXRlQXJyYXkoYnl0ZTogVWludDhBcnJheSwgZmlsZW5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW2J5dGVdKTtcclxuICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgICAgbGluay5ocmVmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZW5hbWU7XHJcbiAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgcGVyIGxvIHN3YXAgZGkgZHVlIGVsZW1lbnRpIGRpIHVuIGFycmF5XHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGFycmF5IEFycmF5IGRpIGN1aSBpbnZlcnRpcmUgZHVlIGVsZW1lbnRpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBJbmRpY2UgZGVsIHByaW1vIGVsZW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBJbmRpY2UgZGVsIHNlY29uZG8gZWxlbWVudG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN3YXAoYXJyYXk6IGFueVtdLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBiID0gYXJyYXlbeF07XHJcbiAgICAgICAgYXJyYXlbeF0gPSBhcnJheVt5XTtcclxuICAgICAgICBhcnJheVt5XSA9IGI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZGkgdHJhc2NvZGlmaWNhIGRhIHRpcG8gYyMgYSB0aXBvIFR5cGVzY3JpcHRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUeXBlQ29kZX0gdHlwZSBUaXBvIGRhIHRyYXNjb2RpZmljYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtcImJvb2xlYW5cIiB8IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJkYXRlXCJ9IFRpcG8gVHlwZXNjcmlwdCBjb3JyaXNwb25kZW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHR5cGU6IFR5cGVDb2RlKTogXCJib29sZWFuXCIgfCBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiZGF0ZVwiIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5Cb29sZWFuOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5EZWNpbWFsOlxyXG4gICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkRvdWJsZTpcclxuICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5TaW5nbGU6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuSW50MTY6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuSW50MzI6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuSW50NjQ6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuQnl0ZTpcclxuICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5TQnl0ZTpcclxuICAgICAgICAgICAgY2FzZSBUeXBlQ29kZS5VSW50MTY6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuVUludDMyOlxyXG4gICAgICAgICAgICBjYXNlIFR5cGVDb2RlLlVJbnQ2NDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICBjYXNlIFR5cGVDb2RlLkNoYXI6XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuU3RyaW5nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVHlwZUNvZGUuRGF0ZVRpbWU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRlXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVucmVjb2duaXplZCBpbnB1dCB0eXBlLiBUeXBlY29kZTpcIiArIHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgbGEgY2xvbmF6aW9uZSBwcm9mb25kYSBkaSB1biBvZ2dldHRvIGluIG1hbmllcmEgbW9sdG8gcGnDuSBwZXJmb3JtYW50ZSBjaGUgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgpKS5cclxuICAgICAqIFxyXG4gICAgICogVXNhcmUgc29sbyBwZXIgb2dnZXR0aSBwdXJpIGUgcXVhbnRvbWVubyBzZW1wbGljaSBwZXIgZXZpdGFyZSBjb21wbGljYXppb25pIGRlcml2YW50aSBkYWxsZSBzZW1wbGlmaWNhemlvbmkgY2hlIHF1ZXN0byBtZXRvZG8gYXNzdW1lXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBzb3VyY2UgT2dnZXR0byBkYSBjbG9uYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2FueX0gQ2xvbmUgZGVsbCdvZ2dldHRvIHBhc3NhdG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWVwQ2xvbmUoc291cmNlOiBhbnksIHR5cGU6IFR5cGU8YW55PiA9IG51bGwpOiBhbnkge1xyXG5cclxuICAgICAgICAvLyBWYWxvcmkgc2VtcGxpY2lcclxuICAgICAgICBpZiAoc291cmNlID09IG51bGwgfHwgdHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpXHJcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8vIFBzZXVkbyBTdHJ1Y3RcclxuICAgICAgICBzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoc291cmNlKSkge1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgICAgIC8vIENsb25hemlvbmUgZGkgdW4gZmlsZSAtPiBSZXN0aXR1aXNjbyBpbCByaWZlcmltZW50byBhbCBmaWxlIHN0ZXNzb1xyXG4gICAgICAgICAgICBjYXNlIFwiW29iamVjdCBGaWxlXVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBPZ2dldHRpIENvbXBsZXNzaVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2l2ZVN0ZXAoc291cmNlLCBBcnJheS5pc0FycmF5KHNvdXJjZSkgfHwgc291cmNlIGluc3RhbmNlb2YgQXJyYXkgPyBbXSA6ICh0eXBlID09IG51bGwgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKSA6IG5ldyB0eXBlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFN0ZXAgcmljb3JzaXZvIHBlciBsYSBjbG9uYXR1cmEgZGVnbGkgb2dnZXR0aS4gVmVkZXJlICoqZGVlcENsb25lKipcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWN1cnNpdmVTdGVwKHNvdXJjZTogYW55LCBkZXN0aW5hdGlvbjogYW55KSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSB8fCBzb3VyY2UgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzb3VyY2UubGVuZ3RoOyBpIDwgaWk7IGkrKylcclxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLnB1c2godGhpcy5kZWVwQ2xvbmUoc291cmNlW2ldKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgJiYgdHlwZW9mIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHRoaXMuZGVlcENsb25lKHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc3Qob2JqZWN0OiBhbnksIGNsc3M6IFR5cGU8YW55Pikge1xyXG4gICAgICAgIGxldCByZXQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoY2xzcy5wcm90b3R5cGUpLCBvYmplY3QpO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRnVuemlvbmUgZGkgdGhyb3R0bGluZyBwZXIgbm9uIHNwYW1tYXJlIHJpY2hpZXN0ZSBpbiBjYXNvIGRpIGFuaW1hemlvbmkgYXR0aXZhdGVcclxuICAgIC8vVE9ETzogc3Bvc3RhcmxhIGluIHVuIG1ldG9kbyBkaSB1dGlsaXTvv70gKGVzZmFlbnphL2V4dGVuc2lvbnMpXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBleGVjdXRpb25UaW1lcnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyB0aHJvdHRsYShpZDogc3RyaW5nLCBmdW5jOiBGdW5jdGlvbiwgdGhyb3R0bGVUaW1lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAvL1NlIGhvIGxhIGZ1bnppb25lIGNoZSB2dW9sZSBlc2VndWlyZSByaXB1bGlzY28gcXVlbCB0aW1lb3V0XHJcbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSlcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSk7XHJcblxyXG4gICAgICAgIC8vUmljcmVvIGlsIHRpbWVvdXQgcGVyIGVzZWd1aXJlIHF1ZWxsYSBmdW56aW9uZSBkb3BvIHRocm90dGxlVGltZSBtaWxsaXNlY29uZGlcclxuICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0gPSBzZXRUaW1lb3V0KCgpID0+IHsgZnVuYygpOyB0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0gPSBudWxsOyB9LCB0aHJvdHRsZVRpbWUpO1xyXG4gICAgfVxyXG59Il19
|