@sinequa/assistant 3.6.2 → 3.7.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/chat/chat-message/chat-message.component.d.ts +4 -2
- package/chat/chat.component.d.ts +56 -17
- package/chat/chat.service.d.ts +23 -1
- package/chat/rest-chat.service.d.ts +1 -0
- package/chat/saved-chats/saved-chats.component.d.ts +2 -2
- package/chat/styles/assistant.scss +5 -0
- package/chat/types.d.ts +128 -3
- package/chat/websocket-chat.service.d.ts +6 -6
- package/esm2020/chat/chat-message/chat-message.component.mjs +9 -4
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
- package/esm2020/chat/chat.component.mjs +262 -60
- package/esm2020/chat/chat.service.mjs +49 -3
- package/esm2020/chat/debug-message/debug-message.component.mjs +3 -3
- package/esm2020/chat/rest-chat.service.mjs +8 -3
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +16 -5
- package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +3 -3
- package/esm2020/chat/types.mjs +11 -3
- package/esm2020/chat/websocket-chat.service.mjs +191 -99
- package/fesm2015/sinequa-assistant-chat.mjs +552 -178
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +542 -175
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -20,7 +20,11 @@ export class ChatService {
|
|
|
20
20
|
this.initConfig$ = new BehaviorSubject(false);
|
|
21
21
|
/** Global configuration of the chat. */
|
|
22
22
|
this.chatConfig$ = new BehaviorSubject(undefined);
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Emit true if the fetch of an assistant's response is ongoing (it includes Streaming status of the chat endpoint AND saving the discussion if save Chat is enabled).
|
|
25
|
+
* This is used to prevent multiple fetches at the same time.
|
|
26
|
+
* Typically, there is no problem chaining fetches, but when forcing a reload after query changes cases, it can't be allowed because it breaks the whole business logic.
|
|
27
|
+
*/
|
|
24
28
|
this.streaming$ = new BehaviorSubject(false);
|
|
25
29
|
/** List of saved chats. */
|
|
26
30
|
this.savedChats$ = new BehaviorSubject([]);
|
|
@@ -34,6 +38,8 @@ export class ChatService {
|
|
|
34
38
|
this.chatUsageMetrics$ = new BehaviorSubject(undefined);
|
|
35
39
|
/** Emit the calculated chat's token consumption based on the chat usage metrics. */
|
|
36
40
|
this.chatTokenConsumption$ = new BehaviorSubject(undefined);
|
|
41
|
+
/** Emit true if "CancelTasks" is ongoing. */
|
|
42
|
+
this.stoppingGeneration$ = new BehaviorSubject(false);
|
|
37
43
|
this.userSettingsService = inject(UserSettingsWebService);
|
|
38
44
|
this.notificationsService = inject(NotificationsService);
|
|
39
45
|
this.auditService = inject(AuditWebService);
|
|
@@ -160,7 +166,7 @@ export class ChatService {
|
|
|
160
166
|
}
|
|
161
167
|
}
|
|
162
168
|
catch (error) {
|
|
163
|
-
this.notificationsService.error(`Missing valid configuration for the assistant instance '${key}'
|
|
169
|
+
this.notificationsService.error(`Missing valid configuration for the assistant instance '${key}'. See the browser console messages for details on the missing or incorrect properties.`);
|
|
164
170
|
throw new Error(`Missing valid configuration for the assistant instance '${key}' . \n ${JSON.stringify(error.issues, null, 2)}`);
|
|
165
171
|
}
|
|
166
172
|
}
|
|
@@ -201,6 +207,7 @@ export class ChatService {
|
|
|
201
207
|
const consumptionPercentage = Math.round((quota.tokenCount * 100 / quota.periodTokens) * 100) / 100;
|
|
202
208
|
this.userTokenConsumption$.next({ percentage: consumptionPercentage, nextResetDate });
|
|
203
209
|
if (quota.maxQuotaReached) {
|
|
210
|
+
this.generateAuditEvent('quota.exceeded', {});
|
|
204
211
|
const msg = `Sorry, you have exceeded the allowed quota. Please retry starting from ${nextResetDate}.`;
|
|
205
212
|
this.notificationsService.error(msg);
|
|
206
213
|
if (propagateError)
|
|
@@ -259,6 +266,45 @@ export class ChatService {
|
|
|
259
266
|
};
|
|
260
267
|
this.auditService.notify(audit);
|
|
261
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Traverse the array from the end and track the first 'assistant' message among the last group of "assistant" messages where display is true
|
|
271
|
+
* @param array The array of ChatMessage to traverse
|
|
272
|
+
* @returns The index of the first visible assistant message among the last group of "assistant" messages in the array
|
|
273
|
+
*/
|
|
274
|
+
firstVisibleAssistantMessageIndex(array) {
|
|
275
|
+
if (!array) {
|
|
276
|
+
return -1;
|
|
277
|
+
}
|
|
278
|
+
let index = array.length - 1;
|
|
279
|
+
let firstVisibleAssistantMessageIndex = -1;
|
|
280
|
+
while (index >= 0 && array[index].role === 'assistant') {
|
|
281
|
+
if (array[index].additionalProperties.display === true) {
|
|
282
|
+
firstVisibleAssistantMessageIndex = index;
|
|
283
|
+
}
|
|
284
|
+
index--;
|
|
285
|
+
}
|
|
286
|
+
return firstVisibleAssistantMessageIndex;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Traverse the array from the end and pick the last 'assistant' message among the last group of "assistant" messages where display is true
|
|
290
|
+
* @param array The array of ChatMessage to traverse
|
|
291
|
+
* @returns The index of the last visible assistant message among the last group of "assistant" messages in the array
|
|
292
|
+
*/
|
|
293
|
+
lastVisibleAssistantMessageIndex(array) {
|
|
294
|
+
if (!array) {
|
|
295
|
+
return -1;
|
|
296
|
+
}
|
|
297
|
+
let index = array.length - 1;
|
|
298
|
+
let lastVisibleAssistantMessageIndex = -1;
|
|
299
|
+
while (index >= 0 && array[index].role === 'assistant') {
|
|
300
|
+
if (array[index].additionalProperties.display === true) {
|
|
301
|
+
lastVisibleAssistantMessageIndex = index;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
index--;
|
|
305
|
+
}
|
|
306
|
+
return lastVisibleAssistantMessageIndex;
|
|
307
|
+
}
|
|
262
308
|
/**
|
|
263
309
|
* Format a date string in UTC to a local date string
|
|
264
310
|
* @param value Date string in UTC to format
|
|
@@ -282,4 +328,4 @@ ChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version:
|
|
|
282
328
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatService, decorators: [{
|
|
283
329
|
type: Injectable
|
|
284
330
|
}] });
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUEySyxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwTixPQUFPLEVBQUUsVUFBVSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFlLFdBQVcsRUFBZSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFHNUMsTUFBTSxPQUFnQixXQUFXO0lBRGpDO1FBSUUscUVBQXFFO1FBQ3JFLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbkQsb0VBQW9FO1FBQ3BFLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEQsd0NBQXdD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WUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDN0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxPQUFZO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FDbkIsWUFBWSxFQUNaLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQzdDLENBQUM7SUFDSixDQUFDOzt3R0FsV21CLFdBQVc7NEdBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlcyB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3VzZXItc2V0dGluZ3NcIjtcbmltcG9ydCB7IExvZ2luU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL25vdGlmaWNhdGlvblwiO1xuaW1wb3J0IHsgQXVkaXRXZWJTZXJ2aWNlLCBVc2VyU2V0dGluZ3NXZWJTZXJ2aWNlLCBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZywgQ2hhdE1lc3NhZ2UsIENoYXRSZXNwb25zZSwgQ2hhdFVzYWdlTWV0cmljcywgR2xsbUZ1bmN0aW9uLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiwgUXVvdGEsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSwgVG9rZW5Db25zdW1wdGlvbiwgVXNlclRva2VuQ29uc3VtcHRpb24sIGNoYXRDb25maWdTY2hlbWEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU2VydmljZSwgUXVlcnkgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9hcHAtdXRpbHNcIjtcbmltcG9ydCB7IEludGxTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvaW50bFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9iYXNlXCI7XG5pbXBvcnQgeyBDb25maXJtVHlwZSwgTW9kYWxCdXR0b24sIE1vZGFsUmVzdWx0LCBNb2RhbFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9tb2RhbFwiO1xuaW1wb3J0IHsgcGFyc2VJU08sIHRvRGF0ZSB9IGZyb20gXCJkYXRlLWZuc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2hhdFNlcnZpY2Uge1xuICAvKiogTmFtZSBvZiB0aGUgYXNzaXN0YW50IHBsdWdpbiBPUiB3ZWJzb2NrZXQgZW5kcG9pbnQuICovXG4gIFJFUVVFU1RfVVJMOiBzdHJpbmc7XG4gIC8qKiBFbWl0IHRydWUgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNoYXQgcHJvY2VzcyBpcyBkb25lLiAqL1xuICBpbml0UHJvY2VzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXQgdHJ1ZSBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2hhdCBjb25maWcgaXMgZG9uZS4gKi9cbiAgaW5pdENvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEdsb2JhbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGF0LiAqL1xuICBjaGF0Q29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIFN0cmVhbWluZyBzdGF0dXMgb2YgdGhlIGNoYXQgZW5kcG9pbnQuICovXG4gIHN0cmVhbWluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFN0b3JlIHRoZSBtZXNzYWdlcyBoaXN0b3J5IG9mIHRoZSBjdXJyZW50IGNoYXQuICovXG4gIGNoYXRIaXN0b3J5OiBDaGF0TWVzc2FnZVtdIHwgdW5kZWZpbmVkO1xuICAvKiogTGlzdCBvZiBtb2RlbHMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuICovXG4gIG1vZGVsczogR2xsbU1vZGVsRGVzY3JpcHRpb25bXSB8IHVuZGVmaW5lZDtcbiAgLyoqIExpc3Qgb2YgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyLiAqL1xuICBmdW5jdGlvbnM6IEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkO1xuICAvKiogTGlzdCBvZiBzYXZlZCBjaGF0cy4gKi9cbiAgc2F2ZWRDaGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhdmVkQ2hhdFtdPihbXSk7XG4gIC8qKiBFbWl0IHRoZSBzYXZlZCBjaGF0IHRvIGxvYWQuICovXG4gIGxvYWRTYXZlZENoYXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYXZlZENoYXQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKiBFbWl0IHRoZSBxdW90YSBlYWNoIHRpbWUgdGhlIGNoYXQgaXMgaW52b2tlZC4gKi9cbiAgcXVvdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdW90YSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNhbGN1bGF0ZWQgdXNlcidzIHRva2VuIGNvbnN1bXB0aW9uIGJhc2VkIG9uIHRoZSBxdW90YS4gKi9cbiAgdXNlclRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyVG9rZW5Db25zdW1wdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIGNoYXQgdXNhZ2UgbWV0cmljcyBlYWNoIHRpbWUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGFzc2lzdGFudCByZXNwb25zZSBpcyBjb21wbGV0ZWQuICovXG4gIGNoYXRVc2FnZU1ldHJpY3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGF0VXNhZ2VNZXRyaWNzIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0aGUgY2FsY3VsYXRlZCBjaGF0J3MgdG9rZW4gY29uc3VtcHRpb24gYmFzZWQgb24gdGhlIGNoYXQgdXNhZ2UgbWV0cmljcy4gKi9cbiAgY2hhdFRva2VuQ29uc3VtcHRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUb2tlbkNvbnN1bXB0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogSW5zdGFuY2UgSUQgb2YgdGhlIGNoYXQgc2VydmljZSBkZWZpbmluZyB0aGUgYXNzaXN0YW50IGluc3RhbmNlLiAqL1xuICBwcml2YXRlIF9jaGF0SW5zdGFuY2VJZDogc3RyaW5nO1xuICAvKiogSUQgb2YgdGhlIGN1cnJlbnQgKipzYXZlZCBjaGF0KiogZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIHVwZGF0ZS9nZXQvZGVsZXRlIGl0LiAqL1xuICBwcml2YXRlIF9zYXZlZENoYXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogR2VuZXJhdGVkIEdVSUQgZm9yIHRoZSBjdXJyZW50IG5vbi1zYXZlZCBjaGF0IGRpc2N1c3Npb24gdXNlZCB0byBpZGVudGlmeSBhdWRpdCBldmVudHMuXG4gICAqIElmIHRoZSBjaGF0IGlzIHNhdmVkLCB0aGUgc2F2ZWRDaGF0SWQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhpcyBjaGF0SWQuXG4gICAqL1xuICBwcml2YXRlIF9jaGF0SWQ6IHN0cmluZztcblxuICBwdWJsaWMgdXNlclNldHRpbmdzU2VydmljZSA9IGluamVjdChVc2VyU2V0dGluZ3NXZWJTZXJ2aWNlKTtcbiAgcHVibGljIG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgcHVibGljIGF1ZGl0U2VydmljZSA9IGluamVjdChBdWRpdFdlYlNlcnZpY2UpO1xuICBwdWJsaWMgcHJlZnMgPSBpbmplY3QoVXNlclByZWZlcmVuY2VzKTtcbiAgcHVibGljIGxvZ2luU2VydmljZSA9IGluamVjdChMb2dpblNlcnZpY2UpO1xuICBwdWJsaWMgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKTtcbiAgcHVibGljIGludGxTZXJ2aWNlID0gaW5qZWN0KEludGxTZXJ2aWNlKTtcbiAgcHVibGljIG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuICBwdWJsaWMgcHJpbmNpcGFsU2VydmljZSA9IGluamVjdChQcmluY2lwYWxXZWJTZXJ2aWNlKTtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNoYXQgcHJvY2Vzc1xuICAgKi9cbiAgYWJzdHJhY3QgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBSRVFVRVNUX1VSTFxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0UmVxdWVzdHNVcmwoKTogdm9pZDtcblxuICBnZXQgYXNzaXN0YW50cygpOiBhbnkge1xuICAgIGlmICghdGhpcy51c2VyU2V0dGluZ3NTZXJ2aWNlLnVzZXJTZXR0aW5ncylcbiAgICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3MgPSB7fTtcbiAgICBpZiAoIXRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3NbXCJhc3Npc3RhbnRzXCJdKVxuICAgICAgdGhpcy51c2VyU2V0dGluZ3NTZXJ2aWNlLnVzZXJTZXR0aW5nc1tcImFzc2lzdGFudHNcIl0gPSB7fTtcbiAgICByZXR1cm4gIHRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3NbXCJhc3Npc3RhbnRzXCJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaW5zdGFuY2UgSUQgb2YgdGhlIGNoYXQgc2VydmljZVxuICAgKiBAcmV0dXJucyBUaGUgaW5zdGFuY2UgSUQgb2YgdGhlIGNoYXQgc2VydmljZVxuICAgKi9cbiAgZ2V0IGNoYXRJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXRJbnN0YW5jZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgdGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICogQHBhcmFtIGluc3RhbmNlSWQgVGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICovXG4gIHNldENoYXRJbnN0YW5jZUlkKGluc3RhbmNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2NoYXRJbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIHNhdmUvZ2V0L2RlbGV0ZSBpdFxuICAgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uXG4gICAqL1xuICBnZXQgc2F2ZWRDaGF0SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2F2ZWRDaGF0SWQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIGl0XG4gICAqIEBwYXJhbSBzYXZlZENoYXRJZCBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gc2F2ZS9nZXQvZGVsZXRlIGl0XG4gICAqL1xuICBzZXRTYXZlZENoYXRJZChzYXZlZENoYXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2F2ZWRDaGF0SWQgPSBzYXZlZENoYXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IGF1ZGl0IGV2ZW50c1xuICAgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uXG4gICAqL1xuICBnZXQgY2hhdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBHVUlEIGZvciB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICogSWYgdGhlIGRpc2N1c3Npb24gaXMgc2F2ZWQsIHRoZSBzYXZlZENoYXRJZCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGlzIGNoYXRJZFxuICAgKiBAcGFyYW0gY2hhdElkIGlmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgdGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IGF1ZGl0IGV2ZW50c1xuICAgKi9cbiAgZ2VuZXJhdGVDaGF0SWQoY2hhdElkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2hhdElkID0gY2hhdElkIHx8IFV0aWxzLmd1aWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IGNvbmZpZyBieSBtYW5hZ2luZyBPTkxZIHN1Yi1vYmplY3QgKipkZWZhdWx0VmFsdWVzKiogY29uZmlncyBvZiB0aGUgc3RhbmRhcmQgYXBwIGNvbmZpZyAoZGVmaW5lZCBpbiB0aGUgY3VzdG9taXphdGlvbiBqc29uIHRhYiApIGFuZCB0aGUgdXNlciBwcmVmZXJlbmNlcy5cbiAgICogVG8gZG8gc28sIGEgdHJhY2tpbmcgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dCB0aGUgYXZhaWxhYmxlIHVwZGF0ZXMgaW4gdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0IG9mIHRoZSBzdGFuZGFyZCBhcHAgY29uZmlnLlxuICAgKiBUaGUgcmVzdCBvZiB0aGUgY29uZmlnIG9iamVjdCBjb21pbmcgZnJvbSBcInN0YW5kYXJkIGFwcCBjb25maWdcIiBpcyB1c2VkIGFzIGl0IGlzIHdpdGhvdXQgYW55IG92ZXJyaWRlLlxuICAgKiBUaHVzLCB0aGUgdXNlciBwcmVmZXJlbmNlcyBhcmUgdXNlZCBvbmx5IGZvciB0aGUgZGVmYXVsdFZhbHVlcyBvYmplY3QuXG4gICAqIFRoaXMgcHJvdmlkZSBhIGNlbnRyYWxpemVkIHdheSB0byBtYW5hZ2UgdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBvYmplY3QgYnkgYWRtaW5zIGFuZCBlbnN1cmUgYSB1bmlxdWUgY29tbW9uIGJlaGF2aW9yIGZvciBhbGwgdXNlcnMuXG4gICAqL1xuICBpbml0Q2hhdENvbmZpZygpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNoYXRJbnN0YW5jZUlkO1xuICAgIGNvbnN0IHVzZXJTZXR0aW5nc0NvbmZpZyA9IHRoaXMuYXNzaXN0YW50c1trZXldIHx8IHt9O1xuICAgIGNvbnN0IHN0YW5kYXJkQ2hhdENvbmZpZyA9IHRoaXMuYXBwU2VydmljZS5hcHA/LmRhdGE/LmFzc2lzdGFudHM/LltrZXldO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSB3aG9sZSBjb25maWcgb2JqZWN0IGFnYWluc3QgdGhlIHNjaGVtYVxuICAgICAgY2hhdENvbmZpZ1NjaGVtYS5wYXJzZShzdGFuZGFyZENoYXRDb25maWcpO1xuICAgICAgLy8gSWYgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZG8gbm90IGNvbnRhaW4gYSBjb25maWcncyBkZWZhdWx0VmFsdWVzIG9iamVjdCwga2VlcCB1c2luZyB0aGUgc3RhbmRhcmQgYXBwIGNvbmZpZyBhbmQgbm90aGluZyB0byBzdG9yZSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlc1xuICAgICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykge1xuICAgICAgICB0aGlzLmNoYXRDb25maWckLm5leHQoey4uLnN0YW5kYXJkQ2hhdENvbmZpZ30pO1xuICAgICAgICB0aGlzLmluaXRDb25maWckLm5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2UgeyAvLyBJZiB0aGUgdXNlciBoYXMgaXRzIG93biBkZWZhdWx0VmFsdWVzIGluIGl0cyB1c2VyU2V0dGluZ3MsIHRoZW4gd2UgbmVlZCB0byBjaGVjayBmb3IgcG90ZW50aWFsIHVwZGF0ZXMgbWFkZSBieSBhZG1pbnMgaW4gdGhlIG1lYW50aW1lIGFuZCBob3cgaGUgd2FudHMgdG8gbWFuYWdlIHRoZW1cblxuICAgICAgICAvLyBSZXRyaWV2ZSBhbHJlYWR5IHN0b3JlZCBoYXNoZXMgaW4gdGhlIHVzZXIgc2V0dGluZ3MgaWYgZXhpc3RzXG4gICAgICAgIGNvbnN0IGFwcGxpZWREZWZhdWx0VmFsdWVzSGFzaCA9IHVzZXJTZXR0aW5nc0NvbmZpZy5oYXNoZXM/LltcImFwcGxpZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCJdO1xuICAgICAgICBjb25zdCBza2lwcGVkRGVmYXVsdFZhbHVlc0hhc2ggPSB1c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzPy5bXCJza2lwcGVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiXTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgaGFzaCBvZiB0aGUgY3VycmVudCBkZWZhdWx0VmFsdWVzIG9mIHRoZSBzdGFuZGFyZENoYXRDb25maWdcbiAgICAgICAgY29uc3QgY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoID0gVXRpbHMuc2hhNTEyKEpTT04uc3RyaW5naWZ5KHN0YW5kYXJkQ2hhdENvbmZpZy5kZWZhdWx0VmFsdWVzKSk7XG5cbiAgICAgICAgLy8gSW1wbGVtZW50IHRoZSB0cmFja2luZyBtZWNoYW5pc20gdG8gbm90aWZ5IHRoZSB1c2VyIGFib3V0IHRoZSBhdmFpbGFibGUgdXBkYXRlcyBpbiB0aGUgZGVmYXVsdFZhbHVlcyBvYmplY3Qgb2YgdGhlIHN0YW5kYXJkIGFwcCBjb25maWdcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gKGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCAhPT0gYXBwbGllZERlZmF1bHRWYWx1ZXNIYXNoKSAmJiAoY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoICE9PSBza2lwcGVkRGVmYXVsdFZhbHVlc0hhc2gpO1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcbiAgICAgICAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICAgICAgdGl0bGU6IFwiQXZhaWxhYmxlIHVwZGF0ZXMgIVwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcIkNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gRG8geW91IHdhbnQgdG8gdXBkYXRlIHlvdXIgb3duIHZlcnNpb24gP1wiLFxuICAgICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgICAgICBuZXcgTW9kYWxCdXR0b24oe3Jlc3VsdDogTW9kYWxSZXN1bHQuTm8sIHRleHQ6IFwiU2VlIG5vIG1vcmVcIn0pLFxuICAgICAgICAgICAgICAgICAgbmV3IE1vZGFsQnV0dG9uKHtyZXN1bHQ6IE1vZGFsUmVzdWx0Lklnbm9yZSwgdGV4dDogXCJSZW1pbmQgbWUgbGF0ZXJcIn0pLFxuICAgICAgICAgICAgICAgICAgbmV3IE1vZGFsQnV0dG9uKHtyZXN1bHQ6IE1vZGFsUmVzdWx0Lk9LLCB0ZXh0OiBcIlVwZGF0ZVwiLCBwcmltYXJ5OiB0cnVlfSlcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY29uZmlybVR5cGU6IENvbmZpcm1UeXBlLldhcm5pbmdcbiAgICAgICAgICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZihyZXMgPT09IE1vZGFsUmVzdWx0Lk9LKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXMgPSB7IC4uLnVzZXJTZXR0aW5nc0NvbmZpZy5oYXNoZXMsIFwiYXBwbGllZC1kZWZhdWx0VmFsdWVzLWhhc2hcIjogY3VycmVudERlZmF1bHRWYWx1ZXNIYXNoLCBcInNraXBwZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjaGF0IGNvbmZpZyBhbmQgc3RvcmUgaXRzIGRlZmF1bHRWYWx1ZXMgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhdENvbmZpZyh7Li4uc3RhbmRhcmRDaGF0Q29uZmlnfSwgaGFzaGVzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbmZpZyQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KFwiY29uZmlndXJhdGlvbi5lZGl0XCIsIHsgJ2NvbmZpZ3VyYXRpb24nOiBKU09OLnN0cmluZ2lmeSh7Li4uc3RhbmRhcmRDaGF0Q29uZmlnfSkgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlcyA9PT0gTW9kYWxSZXN1bHQuTm8pIHtcbiAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBub3RpZnkgdGhlIHVzZXIgYWJvdXQgY2hhbmdlcyB3aGlsZSB0aGlzIHNraXBwZWQgdmVyc2lvbiBpcyBub3QgdXBkYXRlZFxuICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVzID0geyAuLi51c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzLCBcInNraXBwZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI6IGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCB9O1xuICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDaGF0Q29uZmlnKHsuLi5zdGFuZGFyZENoYXRDb25maWcsIGRlZmF1bHRWYWx1ZXM6IHVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzfSwgaGFzaGVzLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb25maWckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEp1c3QgcGljayB0aGUgdmVyc2lvbiBpbiB0aGUgdXNlciBzZXR0aW5ncywgbm90aGluZyB0byBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYXRDb25maWckLm5leHQoey4uLnN0YW5kYXJkQ2hhdENvbmZpZywgZGVmYXVsdFZhbHVlczogdXNlclNldHRpbmdzQ29uZmlnLmRlZmF1bHRWYWx1ZXN9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbmZpZyQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHsgLy8gTm8gYXZhaWxhYmxlIHVwZGF0ZXMgT3IgdXBkYXRlcyBoYXMgYmVlbiBhbHJlYWR5IHNraXBwZWQsIHRoZW4ganVzdCBwaWNrIHRoZSB2ZXJzaW9uIGluIHRoZSB1c2VyIHNldHRpbmdzXG4gICAgICAgICAgdGhpcy5jaGF0Q29uZmlnJC5uZXh0KHsuLi5zdGFuZGFyZENoYXRDb25maWcsIGRlZmF1bHRWYWx1ZXM6IHVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzfSk7XG4gICAgICAgICAgdGhpcy5pbml0Q29uZmlnJC5uZXh0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoYE1pc3NpbmcgdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFzc2lzdGFudCBpbnN0YW5jZSAnJHtrZXl9J2ApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UgJyR7a2V5fScgLiBcXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvci5pc3N1ZXMsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNoYXQgY29uZmlnIGFuZCBzdG9yZSBpdHMgZGVmYXVsdFZhbHVlcyBpbiB0aGUgdXNlciBwcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gY29uZmlnICBUaGUgdXBkYXRlZCBjaGF0IGNvbmZpZ1xuICAgKiBAcGFyYW0gaGFzaGVzICBUaGUgdXBkYXRlZCBoYXNoZXMgdG8gc3RvcmUgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogQHBhcmFtIG5vdGlmeSAgV2hldGhlciB0byBub3RpZnkgdGhlIHVzZXIgYWJvdXQgdGhlIHVwZGF0ZVxuICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrICBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBpZiB0aGUgdXBkYXRlIGlzIHN1Y2Nlc3NmdWxcbiAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIGlmIHRoZSB1cGRhdGUgZmFpbHNcbiAgICovXG4gIHVwZGF0ZUNoYXRDb25maWcoY29uZmlnOiBDaGF0Q29uZmlnLCBoYXNoZXM/OiB7XCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiPzogc3RyaW5nLCBcInNraXBwZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI/OiBzdHJpbmd9LCAgbm90aWZ5ID0gdHJ1ZSwgc3VjY2Vzc0NhbGxiYWNrPzogKCkgPT4gYW55LCBlcnJvckNhbGxiYWNrPzogKCkgPT4gYW55KSB7XG4gICAgdGhpcy5jaGF0Q29uZmlnJC5uZXh0KGNvbmZpZyk7XG4gICAgY29uc3QgYXNzaXN0YW50cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXNzaXN0YW50cyk7XG4gICAgYXNzaXN0YW50c1t0aGlzLmNoYXRJbnN0YW5jZUlkXSA9IHsgLi4uYXNzaXN0YW50c1t0aGlzLmNoYXRJbnN0YW5jZUlkXSwgZGVmYXVsdFZhbHVlczogY29uZmlnLmRlZmF1bHRWYWx1ZXMgfTtcbiAgICBpZihoYXNoZXMpIGFzc2lzdGFudHNbdGhpcy5jaGF0SW5zdGFuY2VJZF0uaGFzaGVzID0gaGFzaGVzO1xuICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS5wYXRjaCh7IGFzc2lzdGFudHMgfSkuc3Vic2NyaWJlKFxuICAgICAgbmV4dCA9PiB7fSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgaWYobm90aWZ5KSB7XG4gICAgICAgICAgZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2soKSA6IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoYFRoZSB1cGRhdGUgb2YgdGhlIGFzc2lzdGFudCBpbnN0YW5jZSAnJHt0aGlzLmNoYXRJbnN0YW5jZUlkfScgY29uZmlndXJhdGlvbiBmYWlsZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHBhdGNoIGFzc2lzdGFudHMhXCIsIGVycm9yKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmKG5vdGlmeSkge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayA/IHN1Y2Nlc3NDYWxsYmFjaygpIDogdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5zdWNjZXNzKGBUaGUgYXNzaXN0YW50IGluc3RhbmNlICcke3RoaXMuY2hhdEluc3RhbmNlSWR9JyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1cGRhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBGZXRjaCBBUEkgdG8gcmV0cmlldmUgYSBuZXcgbWVzc2FnZSBnaXZlbiBhbGwgcHJldmlvdXMgbWVzc2FnZXNcbiAgICovXG4gIGFic3RyYWN0IGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBxdWVyeTogUXVlcnkpOiBPYnNlcnZhYmxlPENoYXRSZXNwb25zZT5cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIG1vZGVscyBhdmFpbGFibGUgb24gdGhlIHNlcnZlclxuICAgKi9cbiAgYWJzdHJhY3QgbGlzdE1vZGVscygpOiBPYnNlcnZhYmxlPEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyIEFORCBtYXRjaGluZyBlbmFibGVkIGZ1bmN0aW9ucyBpbiB0aGUgY2hhdCBjb25maWdcbiAgICovXG4gIGFic3RyYWN0IGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIEEgaGFuZGxlciBmb3IgcXVvdGEgdXBkYXRlcyBlYWNoIHRpbWUgdGhlIGNoYXQgaXMgaW52b2tlZC5cbiAgICogSXQgZW1pdHMgdGhlIHVwZGF0ZWQgcXVvdGEgdG8gdGhlIHF1b3RhJCBzdWJqZWN0LCBlbWl0cyBhY2NvcmRpbmdseSB0aGUgdXBkYXRlZCB1c2VyJ3MgdG9rZW5zIGNvbnN1bXB0aW9uIGFuZCBub3RpZmllcyB0aGUgdXNlciBpZiB0aGUgbWF4IHF1b3RhIGlzIHJlYWNoZWQuXG4gICAqIEBwYXJhbSBxdW90YSBUaGUgdXBkYXRlZCBxdW90YVxuICAgKiBAcGFyYW0gcHJvcGFnYXRlRXJyb3IgV2hldGhlciB0byBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBjYWxsZXJcbiAgICovXG4gIHVwZGF0ZVF1b3RhKHF1b3RhOiBRdW90YSwgcHJvcGFnYXRlRXJyb3IgPSBmYWxzZSkge1xuICAgIHRoaXMucXVvdGEkLm5leHQocXVvdGEpO1xuICAgIGNvbnN0IG5leHRSZXNldERhdGUgPSB0aGlzLmZvcm1hdERhdGVUaW1lKHF1b3RhLm5leHRSZXNldFVUQytcIiswMDowMFwiKTsgLy8gVGhpcyArMDA6MDAgaXMgdG8gZW5zdXJlIGRhdGVzIHdpbGwgYmUgcHJvcGVybHkgY29udmVydGVkIHRvIGxvY2FsIHRpbWVcbiAgICBjb25zdCBjb25zdW1wdGlvblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKChxdW90YS50b2tlbkNvdW50ICogMTAwIC8gcXVvdGEucGVyaW9kVG9rZW5zKSAqIDEwMCkgLyAxMDA7XG4gICAgdGhpcy51c2VyVG9rZW5Db25zdW1wdGlvbiQubmV4dCh7cGVyY2VudGFnZTogY29uc3VtcHRpb25QZXJjZW50YWdlLCBuZXh0UmVzZXREYXRlfSk7XG4gICAgaWYocXVvdGEubWF4UXVvdGFSZWFjaGVkKSB7XG4gICAgICBjb25zdCBtc2cgPSBgU29ycnksIHlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHF1b3RhLiBQbGVhc2UgcmV0cnkgc3RhcnRpbmcgZnJvbSAke25leHRSZXNldERhdGV9LmA7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKG1zZyk7XG4gICAgICBpZihwcm9wYWdhdGVFcnJvcikgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgaGFuZGxlciBmb3IgY2hhdCB1c2FnZSBtZXRyaWNzIGVhY2ggdGltZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlIGlzIGNvbXBsZXRlZC5cbiAgICogSXQgZW1pdHMgdGhlIGNoYXQgdXNhZ2UgbWV0cmljcyB0byB0aGUgY2hhdFVzYWdlTWV0cmljcyQgc3ViamVjdCwgZW1pdHMgYWNjb3JkaW5nbHkgdGhlIHVwZGF0ZWQgY2hhdCdzIHRva2VucyBjb25zdW1wdGlvblxuICAgKiBAcGFyYW0gY2hhdFVzYWdlTWV0cmljcyBUaGUgY2hhdCB1c2FnZSBtZXRyaWNzXG4gICAqL1xuICB1cGRhdGVDaGF0VXNhZ2VNZXRyaWNzKGNoYXRVc2FnZU1ldHJpY3M6IENoYXRVc2FnZU1ldHJpY3MpIHtcbiAgICB0aGlzLmNoYXRVc2FnZU1ldHJpY3MkLm5leHQoY2hhdFVzYWdlTWV0cmljcyk7XG4gICAgY29uc3QgY3VycmVudE1vZGVsID0gdGhpcy5nZXRNb2RlbCh0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnNlcnZpY2VfaWQsIHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQpO1xuICAgIGNvbnN0IGNvbnN1bXB0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKGNoYXRVc2FnZU1ldHJpY3MudG90YWxUb2tlbkNvdW50ICogMTAwIC8gKGN1cnJlbnRNb2RlbCEuY29udGV4dFdpbmRvd1NpemUgLSBjdXJyZW50TW9kZWwhLm1heEdlbmVyYXRpb25TaXplKSkgKiAxMDApIC8gMTAwO1xuICAgIHRoaXMuY2hhdFRva2VuQ29uc3VtcHRpb24kLm5leHQoe3BlcmNlbnRhZ2U6IGNvbnN1bXB0aW9uUGVyY2VudGFnZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbW9kZWwgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiAoc2VydmljZUlkICsgbW9kZWxJZClcbiAgICogSWYgYSBtb2RlbCBpcyBub3QgZm91bmQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWRcbiAgICogQHBhcmFtIHNlcnZpY2VJZCBUaGUgc2VydmljZUlkIG9mIHRoZSBtb2RlbFxuICAgKiBAcGFyYW0gbW9kZWxJZCBUaGUgbW9kZWxJZCBvZiB0aGUgbW9kZWxcbiAgICogQHJldHVybnMgVGhlIG1vZGVsIGRlc2NyaXB0aW9uXG4gICAqL1xuICBnZXRNb2RlbChzZXJ2aWNlSWQ6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nKTogR2xsbU1vZGVsRGVzY3JpcHRpb24gfCB1bmRlZmluZWR7XG4gICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbHM/LmZpbmQobSA9PiBtLnNlcnZpY2VJZCA9PT0gc2VydmljZUlkICYmIG0ubW9kZWxJZCA9PT0gbW9kZWxJZCk7XG4gICAgLy8gSGFuZGxlIG9ic29sZXRlIGNvbmZpZ1xuICAgIGlmKCFtb2RlbCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihgRkFUQUwgRVJST1IgOiBUaGUgbW9kZWwgKHNlcnZpY2VJZCA9ICcke3NlcnZpY2VJZH0nLCBtb2RlbElkID0gJyR7bW9kZWxJZH0nKSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLiBQbGVhc2UgY29udGFjdCBhbiBhZG1pbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRkFUQUwgRVJST1IgOiBUaGUgbW9kZWwgKHNlcnZpY2VJZCA9ICcke3NlcnZpY2VJZH0nLCBtb2RlbElkID0gJyR7bW9kZWxJZH0nKSBpcyBubyBsb25nZXIgYXZhaWxhYmxlYCk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbGlzdCBzYXZlZCBjaGF0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgYXNzaXN0YW50XG4gICAqL1xuICBhYnN0cmFjdCBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2F2ZWQgY2hhdCB3aXRoIHRoZSBnaXZlbiBpZCwgaWYgZXhpc3RzLiBPdGhlcndpc2UsIHJldHVybiB1bmRlZmluZWRcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2F2ZWQgY2hhdFxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0U2F2ZWRDaGF0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+O1xuXG4gIC8qKlxuICAgKiBTYXZlIGEgY2hhdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIHRvIGFkZCB0byB0aGUgc2F2ZWQgY2hhdCBpbmRleFxuICAgKiBAcmV0dXJucyBUaGUgc2F2ZWQgY2hhdFxuICAgKi9cbiAgYWJzdHJhY3QgYWRkU2F2ZWRDaGF0KG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKTogT2JzZXJ2YWJsZTxTYXZlZENoYXQ+O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBzYXZlZCBjaGF0IHdpdGggdGhlIGdpdmVuIGlkLlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBzYXZlZCBjaGF0XG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBvZiB0aGUgc2F2ZWQgY2hhdCwgaWYgcHJvdmlkZWRcbiAgICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBtZXNzYWdlcyB0byB1cGRhdGUgdGhlIHNhdmVkIGNoYXQgaGlzdG9yeSwgaWYgcHJvdmlkZWRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc2F2ZWQgY2hhdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBkYXRlZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlU2F2ZWRDaGF0KGlkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2VzPzogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PjtcblxuICAvKipcbiAgICogQnVsayBkZWxldGUgb2Ygc2F2ZWQgY2hhdHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGlkc1xuICAgKiBAcGFyYW0gaWRzIExpc3Qgb2YgaWRzIG9mIHRoZSBzYXZlZCBjaGF0cyB0byBkZWxldGVcbiAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkZWxldGVkIGNoYXRzXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGVTYXZlZENoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gYXVkaXQgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgZGV0YWlscy4gVGhlIGdlbmVyYXRlZCBhdWRpdCBldmVudCBpcyBzZW50IGFmdGVyd2FyZHMgdmlhIHRoZSBBdWRpdFdlYlNlcnZpY2VcbiAgICogQHBhcmFtIHR5cGUgQXVkaXQgZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0gZGV0YWlscyBBdWRpdCBldmVudCBkZXRhaWxzXG4gICAqIEBwYXJhbSBpZCBBY3Rpb25zIChzYXZlZENoYXQgZGVsZXRlL3JlbmFtZS8uLi4pIG1heSBvY2N1ciBvbiBhIHNwZWNpZmljIGNoYXQgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHN0b3JlZCBpbiB0aGlzIHNlcnZpY2UsIHNvIHRoZSBjaGF0IGlkIGNhbiBiZSBwcm92aWRlZFxuICAgKi9cbiAgZ2VuZXJhdGVBdWRpdEV2ZW50KHR5cGU6IHN0cmluZywgZGV0YWlsczogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlRGV0YWlscyA9IHtcbiAgICAgIFwidXJsXCI6IGRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZiksXG4gICAgICBcImFwcFwiOiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZSxcbiAgICAgIFwidXNlci1pZFwiOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsPy51c2VySWQsXG4gICAgICBcImluc3RhbmNlLWlkXCI6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBcImNoYXQtaWRcIjogaWQgfHwgdGhpcy5jaGF0SWQsXG4gICAgICBcInNlcnZpY2UtaWRcIjogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxuICAgICAgXCJtb2RlbC1pZFwiOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkLFxuICAgIH07XG4gICAgY29uc3QgYXVkaXQgPSB7XG4gICAgICB0eXBlLFxuICAgICAgZGV0YWlsOiB7XG4gICAgICAgIC4uLmJhc2VEZXRhaWxzLFxuICAgICAgICAuLi5kZXRhaWxzXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXVkaXRTZXJ2aWNlLm5vdGlmeShhdWRpdCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgZGF0ZSBzdHJpbmcgaW4gVVRDIHRvIGEgbG9jYWwgZGF0ZSBzdHJpbmdcbiAgICogQHBhcmFtIHZhbHVlIERhdGUgc3RyaW5nIGluIFVUQyB0byBmb3JtYXRcbiAgICogQHJldHVybnMgQSBmb3JtYXR0ZWQgbG9jYWwgZGF0ZSBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBmb3JtYXREYXRlVGltZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbERhdGUgPSB0b0RhdGUocGFyc2VJU08odmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcy5pbnRsU2VydmljZVtcImZvcm1hdFRpbWVcIl0obG9jYWxEYXRlLCB7ZGF5OiBcIm51bWVyaWNcIiwgbW9udGg6IFwic2hvcnRcIiwgeWVhcjogXCJudW1lcmljXCIsIHRpbWVab25lTmFtZTogJ3Nob3J0J30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgdGV4dCBwcm9tcHQgdGhhdCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMgZm9yIHZhcmlhYmxlc1xuICAgKiBhbmQgcmVwbGFjZXMgdGhlc2UgcGxhY2Vob2xkZXJzIGlmIGl0IGZpbmRzIGEgbWF0Y2ggaW4gdGhlIGdpdmVuXG4gICAqIGNvbnRleHQgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGZvcm1hdFByb21wdChwcm9tcHQ6IHN0cmluZywgY29udGV4dDogYW55KSB7XG4gICAgcmV0dXJuIHByb21wdC5yZXBsYWNlKFxuICAgICAgL3t7KC4qPyl9fS9nLFxuICAgICAgKG1hdGNoLCBleHByKSA9PiBnZXQoY29udGV4dCwgZXhwcikgPz8gbWF0Y2hcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==
|
|
331
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUEySyxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwTixPQUFPLEVBQUUsVUFBVSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFlLFdBQVcsRUFBZSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFHNUMsTUFBTSxPQUFnQixXQUFXO0lBRGpDO1FBSUUscUVBQXFFO1FBQ3JFLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbkQsb0VBQW9FO1FBQ3BFLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEQsd0NBQXdD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RUFBRTtnQkFDdEQsZ0NBQWdDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QyxNQUFNO2FBQ1A7WUFDRCxLQUFLLEVBQUUsQ0FBQztTQUNUO1FBQ0QsT0FBTyxnQ0FBZ0MsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDN0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxPQUFZO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FDbkIsWUFBWSxFQUNaLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQzdDLENBQUM7SUFDSixDQUFDOzt3R0F6Wm1CLFdBQVc7NEdBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlcyB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3VzZXItc2V0dGluZ3NcIjtcbmltcG9ydCB7IExvZ2luU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL25vdGlmaWNhdGlvblwiO1xuaW1wb3J0IHsgQXVkaXRXZWJTZXJ2aWNlLCBVc2VyU2V0dGluZ3NXZWJTZXJ2aWNlLCBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZywgQ2hhdE1lc3NhZ2UsIENoYXRSZXNwb25zZSwgQ2hhdFVzYWdlTWV0cmljcywgR2xsbUZ1bmN0aW9uLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiwgUXVvdGEsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSwgVG9rZW5Db25zdW1wdGlvbiwgVXNlclRva2VuQ29uc3VtcHRpb24sIGNoYXRDb25maWdTY2hlbWEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU2VydmljZSwgUXVlcnkgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9hcHAtdXRpbHNcIjtcbmltcG9ydCB7IEludGxTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvaW50bFwiO1xuaW1wb3J0IGdldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9iYXNlXCI7XG5pbXBvcnQgeyBDb25maXJtVHlwZSwgTW9kYWxCdXR0b24sIE1vZGFsUmVzdWx0LCBNb2RhbFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9tb2RhbFwiO1xuaW1wb3J0IHsgcGFyc2VJU08sIHRvRGF0ZSB9IGZyb20gXCJkYXRlLWZuc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2hhdFNlcnZpY2Uge1xuICAvKiogTmFtZSBvZiB0aGUgYXNzaXN0YW50IHBsdWdpbiBPUiB3ZWJzb2NrZXQgZW5kcG9pbnQuICovXG4gIFJFUVVFU1RfVVJMOiBzdHJpbmc7XG4gIC8qKiBFbWl0IHRydWUgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNoYXQgcHJvY2VzcyBpcyBkb25lLiAqL1xuICBpbml0UHJvY2VzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXQgdHJ1ZSBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2hhdCBjb25maWcgaXMgZG9uZS4gKi9cbiAgaW5pdENvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEdsb2JhbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGF0LiAqL1xuICBjaGF0Q29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqXG4gICAqIEVtaXQgdHJ1ZSBpZiB0aGUgZmV0Y2ggb2YgYW4gYXNzaXN0YW50J3MgcmVzcG9uc2UgaXMgb25nb2luZyAoaXQgaW5jbHVkZXMgU3RyZWFtaW5nIHN0YXR1cyBvZiB0aGUgY2hhdCBlbmRwb2ludCBBTkQgc2F2aW5nIHRoZSBkaXNjdXNzaW9uIGlmIHNhdmUgQ2hhdCBpcyBlbmFibGVkKS5cbiAgICogVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgbXVsdGlwbGUgZmV0Y2hlcyBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKiBUeXBpY2FsbHksIHRoZXJlIGlzIG5vIHByb2JsZW0gY2hhaW5pbmcgZmV0Y2hlcywgYnV0IHdoZW4gZm9yY2luZyBhIHJlbG9hZCBhZnRlciBxdWVyeSBjaGFuZ2VzIGNhc2VzLCBpdCBjYW4ndCBiZSBhbGxvd2VkIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSB3aG9sZSBidXNpbmVzcyBsb2dpYy5cbiAgKi9cbiAgc3RyZWFtaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogU3RvcmUgdGhlIG1lc3NhZ2VzIGhpc3Rvcnkgb2YgdGhlIGN1cnJlbnQgY2hhdC4gKi9cbiAgY2hhdEhpc3Rvcnk6IENoYXRNZXNzYWdlW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBMaXN0IG9mIG1vZGVscyBhdmFpbGFibGUgb24gdGhlIHNlcnZlci4gKi9cbiAgbW9kZWxzOiBHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkO1xuICAvKiogTGlzdCBvZiBmdW5jdGlvbnMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuICovXG4gIGZ1bmN0aW9uczogR2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBMaXN0IG9mIHNhdmVkIGNoYXRzLiAqL1xuICBzYXZlZENoYXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2F2ZWRDaGF0W10+KFtdKTtcbiAgLyoqIEVtaXQgdGhlIHNhdmVkIGNoYXQgdG8gbG9hZC4gKi9cbiAgbG9hZFNhdmVkQ2hhdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhdmVkQ2hhdCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgLyoqIEVtaXQgdGhlIHF1b3RhIGVhY2ggdGltZSB0aGUgY2hhdCBpcyBpbnZva2VkLiAqL1xuICBxdW90YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1b3RhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0aGUgY2FsY3VsYXRlZCB1c2VyJ3MgdG9rZW4gY29uc3VtcHRpb24gYmFzZWQgb24gdGhlIHF1b3RhLiAqL1xuICB1c2VyVG9rZW5Db25zdW1wdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJUb2tlbkNvbnN1bXB0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvKiogRW1pdCB0aGUgY2hhdCB1c2FnZSBtZXRyaWNzIGVhY2ggdGltZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlIGlzIGNvbXBsZXRlZC4gKi9cbiAgY2hhdFVzYWdlTWV0cmljcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXRVc2FnZU1ldHJpY3MgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKiBFbWl0IHRoZSBjYWxjdWxhdGVkIGNoYXQncyB0b2tlbiBjb25zdW1wdGlvbiBiYXNlZCBvbiB0aGUgY2hhdCB1c2FnZSBtZXRyaWNzLiAqL1xuICBjaGF0VG9rZW5Db25zdW1wdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRva2VuQ29uc3VtcHRpb24gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8qKiBFbWl0IHRydWUgaWYgXCJDYW5jZWxUYXNrc1wiIGlzIG9uZ29pbmcuICovXG4gIHN0b3BwaW5nR2VuZXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2UgZGVmaW5pbmcgdGhlIGFzc2lzdGFudCBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSBfY2hhdEluc3RhbmNlSWQ6IHN0cmluZztcbiAgLyoqIElEIG9mIHRoZSBjdXJyZW50ICoqc2F2ZWQgY2hhdCoqIGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byB1cGRhdGUvZ2V0L2RlbGV0ZSBpdC4gKi9cbiAgcHJpdmF0ZSBfc2F2ZWRDaGF0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEdlbmVyYXRlZCBHVUlEIGZvciB0aGUgY3VycmVudCBub24tc2F2ZWQgY2hhdCBkaXNjdXNzaW9uIHVzZWQgdG8gaWRlbnRpZnkgYXVkaXQgZXZlbnRzLlxuICAgKiBJZiB0aGUgY2hhdCBpcyBzYXZlZCwgdGhlIHNhdmVkQ2hhdElkIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIG9mIHRoaXMgY2hhdElkLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hhdElkOiBzdHJpbmc7XG5cbiAgcHVibGljIHVzZXJTZXR0aW5nc1NlcnZpY2UgPSBpbmplY3QoVXNlclNldHRpbmdzV2ViU2VydmljZSk7XG4gIHB1YmxpYyBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gIHB1YmxpYyBhdWRpdFNlcnZpY2UgPSBpbmplY3QoQXVkaXRXZWJTZXJ2aWNlKTtcbiAgcHVibGljIHByZWZzID0gaW5qZWN0KFVzZXJQcmVmZXJlbmNlcyk7XG4gIHB1YmxpYyBsb2dpblNlcnZpY2UgPSBpbmplY3QoTG9naW5TZXJ2aWNlKTtcbiAgcHVibGljIGFwcFNlcnZpY2UgPSBpbmplY3QoQXBwU2VydmljZSk7XG4gIHB1YmxpYyBpbnRsU2VydmljZSA9IGluamVjdChJbnRsU2VydmljZSk7XG4gIHB1YmxpYyBtb2RhbFNlcnZpY2UgPSBpbmplY3QoTW9kYWxTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsV2ViU2VydmljZSk7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3NcbiAgICovXG4gIGFic3RyYWN0IGluaXQoKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgUkVRVUVTVF9VUkxcbiAgICovXG4gIGFic3RyYWN0IGdldFJlcXVlc3RzVXJsKCk6IHZvaWQ7XG5cbiAgZ2V0IGFzc2lzdGFudHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3MpXG4gICAgICB0aGlzLnVzZXJTZXR0aW5nc1NlcnZpY2UudXNlclNldHRpbmdzID0ge307XG4gICAgaWYgKCF0aGlzLnVzZXJTZXR0aW5nc1NlcnZpY2UudXNlclNldHRpbmdzW1wiYXNzaXN0YW50c1wiXSlcbiAgICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3NbXCJhc3Npc3RhbnRzXCJdID0ge307XG4gICAgcmV0dXJuICB0aGlzLnVzZXJTZXR0aW5nc1NlcnZpY2UudXNlclNldHRpbmdzW1wiYXNzaXN0YW50c1wiXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICogQHJldHVybnMgVGhlIGluc3RhbmNlIElEIG9mIHRoZSBjaGF0IHNlcnZpY2VcbiAgICovXG4gIGdldCBjaGF0SW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGF0SW5zdGFuY2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IHRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqIEBwYXJhbSBpbnN0YW5jZUlkIFRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAqL1xuICBzZXRDaGF0SW5zdGFuY2VJZChpbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaGF0SW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBJRCBvZiB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBzYXZlL2dldC9kZWxldGUgaXRcbiAgICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvblxuICAgKi9cbiAgZ2V0IHNhdmVkQ2hhdElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVkQ2hhdElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgdGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIHNhdmUvZ2V0L2RlbGV0ZSBpdFxuICAgKiBAcGFyYW0gc2F2ZWRDaGF0SWQgVGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvbiB3aGljaCBpcyB1c2VkIHRvIHNhdmUvZ2V0L2RlbGV0ZSBpdFxuICAgKi9cbiAgc2V0U2F2ZWRDaGF0SWQoc2F2ZWRDaGF0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NhdmVkQ2hhdElkID0gc2F2ZWRDaGF0SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBJRCBvZiB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBjdXJyZW50IGNoYXQgZGlzY3Vzc2lvblxuICAgKi9cbiAgZ2V0IGNoYXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGF0SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gR1VJRCBmb3IgdGhlIGN1cnJlbnQgY2hhdCBkaXNjdXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgYXVkaXQgZXZlbnRzXG4gICAqIElmIHRoZSBkaXNjdXNzaW9uIGlzIHNhdmVkLCB0aGUgc2F2ZWRDaGF0SWQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhpcyBjaGF0SWRcbiAgICogQHBhcmFtIGNoYXRJZCBpZiBwcm92aWRlZCwgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBJRCBvZiB0aGUgY3VycmVudCBjaGF0IGRpc2N1c3Npb24gd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBhdWRpdCBldmVudHNcbiAgICovXG4gIGdlbmVyYXRlQ2hhdElkKGNoYXRJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2NoYXRJZCA9IGNoYXRJZCB8fCBVdGlscy5ndWlkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY2hhdCBjb25maWcgYnkgbWFuYWdpbmcgT05MWSBzdWItb2JqZWN0ICoqZGVmYXVsdFZhbHVlcyoqIGNvbmZpZ3Mgb2YgdGhlIHN0YW5kYXJkIGFwcCBjb25maWcgKGRlZmluZWQgaW4gdGhlIGN1c3RvbWl6YXRpb24ganNvbiB0YWIgKSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXMuXG4gICAqIFRvIGRvIHNvLCBhIHRyYWNraW5nIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCB0byBub3RpZnkgdGhlIHVzZXIgYWJvdXQgdGhlIGF2YWlsYWJsZSB1cGRhdGVzIGluIHRoZSBkZWZhdWx0VmFsdWVzIG9iamVjdCBvZiB0aGUgc3RhbmRhcmQgYXBwIGNvbmZpZy5cbiAgICogVGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBvYmplY3QgY29taW5nIGZyb20gXCJzdGFuZGFyZCBhcHAgY29uZmlnXCIgaXMgdXNlZCBhcyBpdCBpcyB3aXRob3V0IGFueSBvdmVycmlkZS5cbiAgICogVGh1cywgdGhlIHVzZXIgcHJlZmVyZW5jZXMgYXJlIHVzZWQgb25seSBmb3IgdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0LlxuICAgKiBUaGlzIHByb3ZpZGUgYSBjZW50cmFsaXplZCB3YXkgdG8gbWFuYWdlIHRoZSByZXN0IG9mIHRoZSBjb25maWcgb2JqZWN0IGJ5IGFkbWlucyBhbmQgZW5zdXJlIGEgdW5pcXVlIGNvbW1vbiBiZWhhdmlvciBmb3IgYWxsIHVzZXJzLlxuICAgKi9cbiAgaW5pdENoYXRDb25maWcoKSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NDb25maWcgPSB0aGlzLmFzc2lzdGFudHNba2V5XSB8fCB7fTtcbiAgICBjb25zdCBzdGFuZGFyZENoYXRDb25maWcgPSB0aGlzLmFwcFNlcnZpY2UuYXBwPy5kYXRhPy5hc3Npc3RhbnRzPy5ba2V5XTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgd2hvbGUgY29uZmlnIG9iamVjdCBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICAgIGNoYXRDb25maWdTY2hlbWEucGFyc2Uoc3RhbmRhcmRDaGF0Q29uZmlnKTtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHByZWZlcmVuY2VzIGRvIG5vdCBjb250YWluIGEgY29uZmlnJ3MgZGVmYXVsdFZhbHVlcyBvYmplY3QsIGtlZXAgdXNpbmcgdGhlIHN0YW5kYXJkIGFwcCBjb25maWcgYW5kIG5vdGhpbmcgdG8gc3RvcmUgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICAgIGlmICghdXNlclNldHRpbmdzQ29uZmlnLmRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgdGhpcy5jaGF0Q29uZmlnJC5uZXh0KHsuLi5zdGFuZGFyZENoYXRDb25maWd9KTtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnJC5uZXh0KHRydWUpO1xuICAgICAgfSBlbHNlIHsgLy8gSWYgdGhlIHVzZXIgaGFzIGl0cyBvd24gZGVmYXVsdFZhbHVlcyBpbiBpdHMgdXNlclNldHRpbmdzLCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCB1cGRhdGVzIG1hZGUgYnkgYWRtaW5zIGluIHRoZSBtZWFudGltZSBhbmQgaG93IGhlIHdhbnRzIHRvIG1hbmFnZSB0aGVtXG5cbiAgICAgICAgLy8gUmV0cmlldmUgYWxyZWFkeSBzdG9yZWQgaGFzaGVzIGluIHRoZSB1c2VyIHNldHRpbmdzIGlmIGV4aXN0c1xuICAgICAgICBjb25zdCBhcHBsaWVkRGVmYXVsdFZhbHVlc0hhc2ggPSB1c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzPy5bXCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiXTtcbiAgICAgICAgY29uc3Qgc2tpcHBlZERlZmF1bHRWYWx1ZXNIYXNoID0gdXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcz8uW1wic2tpcHBlZC1kZWZhdWx0VmFsdWVzLWhhc2hcIl07XG4gICAgICAgIC8vIENyZWF0ZSBhIGhhc2ggb2YgdGhlIGN1cnJlbnQgZGVmYXVsdFZhbHVlcyBvZiB0aGUgc3RhbmRhcmRDaGF0Q29uZmlnXG4gICAgICAgIGNvbnN0IGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCA9IFV0aWxzLnNoYTUxMihKU09OLnN0cmluZ2lmeShzdGFuZGFyZENoYXRDb25maWcuZGVmYXVsdFZhbHVlcykpO1xuXG4gICAgICAgIC8vIEltcGxlbWVudCB0aGUgdHJhY2tpbmcgbWVjaGFuaXNtIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dCB0aGUgYXZhaWxhYmxlIHVwZGF0ZXMgaW4gdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0IG9mIHRoZSBzdGFuZGFyZCBhcHAgY29uZmlnXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IChjdXJyZW50RGVmYXVsdFZhbHVlc0hhc2ggIT09IGFwcGxpZWREZWZhdWx0VmFsdWVzSGFzaCkgJiYgKGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCAhPT0gc2tpcHBlZERlZmF1bHRWYWx1ZXNIYXNoKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlXG4gICAgICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAgICAgIHRpdGxlOiBcIkF2YWlsYWJsZSB1cGRhdGVzICFcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIERvIHlvdSB3YW50IHRvIHVwZGF0ZSB5b3VyIG93biB2ZXJzaW9uID9cIixcbiAgICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgICAgbmV3IE1vZGFsQnV0dG9uKHtyZXN1bHQ6IE1vZGFsUmVzdWx0Lk5vLCB0ZXh0OiBcIlNlZSBubyBtb3JlXCJ9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBNb2RhbEJ1dHRvbih7cmVzdWx0OiBNb2RhbFJlc3VsdC5JZ25vcmUsIHRleHQ6IFwiUmVtaW5kIG1lIGxhdGVyXCJ9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBNb2RhbEJ1dHRvbih7cmVzdWx0OiBNb2RhbFJlc3VsdC5PSywgdGV4dDogXCJVcGRhdGVcIiwgcHJpbWFyeTogdHJ1ZX0pXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGNvbmZpcm1UeXBlOiBDb25maXJtVHlwZS5XYXJuaW5nXG4gICAgICAgICAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYocmVzID09PSBNb2RhbFJlc3VsdC5PSykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVzID0geyAuLi51c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzLCBcImFwcGxpZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI6IGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCwgXCJza2lwcGVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY2hhdCBjb25maWcgYW5kIHN0b3JlIGl0cyBkZWZhdWx0VmFsdWVzIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRDb25maWcoey4uLnN0YW5kYXJkQ2hhdENvbmZpZ30sIGhhc2hlcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb25maWckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudChcImNvbmZpZ3VyYXRpb24uZWRpdFwiLCB7ICdjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkoey4uLnN0YW5kYXJkQ2hhdENvbmZpZ30pIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXMgPT09IE1vZGFsUmVzdWx0Lk5vKSB7XG4gICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHRoZSB1c2VyIGFib3V0IGNoYW5nZXMgd2hpbGUgdGhpcyBza2lwcGVkIHZlcnNpb24gaXMgbm90IHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlcyA9IHsgLi4udXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcywgXCJza2lwcGVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiOiBjdXJyZW50RGVmYXVsdFZhbHVlc0hhc2ggfTtcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhdENvbmZpZyh7Li4uc3RhbmRhcmRDaGF0Q29uZmlnLCBkZWZhdWx0VmFsdWVzOiB1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlc30sIGhhc2hlcywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29uZmlnJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBKdXN0IHBpY2sgdGhlIHZlcnNpb24gaW4gdGhlIHVzZXIgc2V0dGluZ3MsIG5vdGhpbmcgdG8gYmUgdXBkYXRlZFxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGF0Q29uZmlnJC5uZXh0KHsuLi5zdGFuZGFyZENoYXRDb25maWcsIGRlZmF1bHRWYWx1ZXM6IHVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb25maWckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7IC8vIE5vIGF2YWlsYWJsZSB1cGRhdGVzIE9yIHVwZGF0ZXMgaGFzIGJlZW4gYWxyZWFkeSBza2lwcGVkLCB0aGVuIGp1c3QgcGljayB0aGUgdmVyc2lvbiBpbiB0aGUgdXNlciBzZXR0aW5nc1xuICAgICAgICAgIHRoaXMuY2hhdENvbmZpZyQubmV4dCh7Li4uc3RhbmRhcmRDaGF0Q29uZmlnLCBkZWZhdWx0VmFsdWVzOiB1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlc30pO1xuICAgICAgICAgIHRoaXMuaW5pdENvbmZpZyQubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGBNaXNzaW5nIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UgJyR7a2V5fScuIFNlZSB0aGUgYnJvd3NlciBjb25zb2xlIG1lc3NhZ2VzIGZvciBkZXRhaWxzIG9uIHRoZSBtaXNzaW5nIG9yIGluY29ycmVjdCBwcm9wZXJ0aWVzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UgJyR7a2V5fScgLiBcXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvci5pc3N1ZXMsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNoYXQgY29uZmlnIGFuZCBzdG9yZSBpdHMgZGVmYXVsdFZhbHVlcyBpbiB0aGUgdXNlciBwcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gY29uZmlnICBUaGUgdXBkYXRlZCBjaGF0IGNvbmZpZ1xuICAgKiBAcGFyYW0gaGFzaGVzICBUaGUgdXBkYXRlZCBoYXNoZXMgdG8gc3RvcmUgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogQHBhcmFtIG5vdGlmeSAgV2hldGhlciB0byBub3RpZnkgdGhlIHVzZXIgYWJvdXQgdGhlIHVwZGF0ZVxuICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrICBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBpZiB0aGUgdXBkYXRlIGlzIHN1Y2Nlc3NmdWxcbiAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIGlmIHRoZSB1cGRhdGUgZmFpbHNcbiAgICovXG4gIHVwZGF0ZUNoYXRDb25maWcoY29uZmlnOiBDaGF0Q29uZmlnLCBoYXNoZXM/OiB7XCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiPzogc3RyaW5nLCBcInNraXBwZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI/OiBzdHJpbmd9LCAgbm90aWZ5ID0gdHJ1ZSwgc3VjY2Vzc0NhbGxiYWNrPzogKCkgPT4gYW55LCBlcnJvckNhbGxiYWNrPzogKCkgPT4gYW55KSB7XG4gICAgdGhpcy5jaGF0Q29uZmlnJC5uZXh0KGNvbmZpZyk7XG4gICAgY29uc3QgYXNzaXN0YW50cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXNzaXN0YW50cyk7XG4gICAgYXNzaXN0YW50c1t0aGlzLmNoYXRJbnN0YW5jZUlkXSA9IHsgLi4uYXNzaXN0YW50c1t0aGlzLmNoYXRJbnN0YW5jZUlkXSwgZGVmYXVsdFZhbHVlczogY29uZmlnLmRlZmF1bHRWYWx1ZXMgfTtcbiAgICBpZihoYXNoZXMpIGFzc2lzdGFudHNbdGhpcy5jaGF0SW5zdGFuY2VJZF0uaGFzaGVzID0gaGFzaGVzO1xuICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS5wYXRjaCh7IGFzc2lzdGFudHMgfSkuc3Vic2NyaWJlKFxuICAgICAgbmV4dCA9PiB7fSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgaWYobm90aWZ5KSB7XG4gICAgICAgICAgZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2soKSA6IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoYFRoZSB1cGRhdGUgb2YgdGhlIGFzc2lzdGFudCBpbnN0YW5jZSAnJHt0aGlzLmNoYXRJbnN0YW5jZUlkfScgY29uZmlndXJhdGlvbiBmYWlsZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHBhdGNoIGFzc2lzdGFudHMhXCIsIGVycm9yKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmKG5vdGlmeSkge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayA/IHN1Y2Nlc3NDYWxsYmFjaygpIDogdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5zdWNjZXNzKGBUaGUgYXNzaXN0YW50IGluc3RhbmNlICcke3RoaXMuY2hhdEluc3RhbmNlSWR9JyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1cGRhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBGZXRjaCBBUEkgdG8gcmV0cmlldmUgYSBuZXcgbWVzc2FnZSBnaXZlbiBhbGwgcHJldmlvdXMgbWVzc2FnZXNcbiAgICovXG4gIGFic3RyYWN0IGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBxdWVyeTogUXVlcnkpOiBPYnNlcnZhYmxlPENoYXRSZXNwb25zZT5cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIG1vZGVscyBhdmFpbGFibGUgb24gdGhlIHNlcnZlclxuICAgKi9cbiAgYWJzdHJhY3QgbGlzdE1vZGVscygpOiBPYnNlcnZhYmxlPEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyIEFORCBtYXRjaGluZyBlbmFibGVkIGZ1bmN0aW9ucyBpbiB0aGUgY2hhdCBjb25maWdcbiAgICovXG4gIGFic3RyYWN0IGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBhc3Npc3RhbnQgYW5zd2VyIGdlbmVyYXRpb24gYW5kIGNhbmNlbHMgYWxsIHRoZSBvbmdvaW5nIGFuZCBwZW5kaW5nIHJlbGF0ZWQgdGFza3NcbiAgICovXG4gIGFic3RyYWN0IHN0b3BHZW5lcmF0aW9uKCk6IE9ic2VydmFibGU8YW55PlxuXG4gIC8qKlxuICAgKiBBIGhhbmRsZXIgZm9yIHF1b3RhIHVwZGF0ZXMgZWFjaCB0aW1lIHRoZSBjaGF0IGlzIGludm9rZWQuXG4gICAqIEl0IGVtaXRzIHRoZSB1cGRhdGVkIHF1b3RhIHRvIHRoZSBxdW90YSQgc3ViamVjdCwgZW1pdHMgYWNjb3JkaW5nbHkgdGhlIHVwZGF0ZWQgdXNlcidzIHRva2VucyBjb25zdW1wdGlvbiBhbmQgbm90aWZpZXMgdGhlIHVzZXIgaWYgdGhlIG1heCBxdW90YSBpcyByZWFjaGVkLlxuICAgKiBAcGFyYW0gcXVvdGEgVGhlIHVwZGF0ZWQgcXVvdGFcbiAgICogQHBhcmFtIHByb3BhZ2F0ZUVycm9yIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBlcnJvciB0byB0aGUgY2FsbGVyXG4gICAqL1xuICB1cGRhdGVRdW90YShxdW90YTogUXVvdGEsIHByb3BhZ2F0ZUVycm9yID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1b3RhJC5uZXh0KHF1b3RhKTtcbiAgICBjb25zdCBuZXh0UmVzZXREYXRlID0gdGhpcy5mb3JtYXREYXRlVGltZShxdW90YS5uZXh0UmVzZXRVVEMrXCIrMDA6MDBcIik7IC8vIFRoaXMgKzAwOjAwIGlzIHRvIGVuc3VyZSBkYXRlcyB3aWxsIGJlIHByb3Blcmx5IGNvbnZlcnRlZCB0byBsb2NhbCB0aW1lXG4gICAgY29uc3QgY29uc3VtcHRpb25QZXJjZW50YWdlID0gTWF0aC5yb3VuZCgocXVvdGEudG9rZW5Db3VudCAqIDEwMCAvIHF1b3RhLnBlcmlvZFRva2VucykgKiAxMDApIC8gMTAwO1xuICAgIHRoaXMudXNlclRva2VuQ29uc3VtcHRpb24kLm5leHQoe3BlcmNlbnRhZ2U6IGNvbnN1bXB0aW9uUGVyY2VudGFnZSwgbmV4dFJlc2V0RGF0ZX0pO1xuICAgIGlmKHF1b3RhLm1heFF1b3RhUmVhY2hlZCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3F1b3RhLmV4Y2VlZGVkJywge30pO1xuICAgICAgY29uc3QgbXNnID0gYFNvcnJ5LCB5b3UgaGF2ZSBleGNlZWRlZCB0aGUgYWxsb3dlZCBxdW90YS4gUGxlYXNlIHJldHJ5IHN0YXJ0aW5nIGZyb20gJHtuZXh0UmVzZXREYXRlfS5gO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihtc2cpO1xuICAgICAgaWYocHJvcGFnYXRlRXJyb3IpIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhhbmRsZXIgZm9yIGNoYXQgdXNhZ2UgbWV0cmljcyBlYWNoIHRpbWUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGFzc2lzdGFudCByZXNwb25zZSBpcyBjb21wbGV0ZWQuXG4gICAqIEl0IGVtaXRzIHRoZSBjaGF0IHVzYWdlIG1ldHJpY3MgdG8gdGhlIGNoYXRVc2FnZU1ldHJpY3MkIHN1YmplY3QsIGVtaXRzIGFjY29yZGluZ2x5IHRoZSB1cGRhdGVkIGNoYXQncyB0b2tlbnMgY29uc3VtcHRpb25cbiAgICogQHBhcmFtIGNoYXRVc2FnZU1ldHJpY3MgVGhlIGNoYXQgdXNhZ2UgbWV0cmljc1xuICAgKi9cbiAgdXBkYXRlQ2hhdFVzYWdlTWV0cmljcyhjaGF0VXNhZ2VNZXRyaWNzOiBDaGF0VXNhZ2VNZXRyaWNzKSB7XG4gICAgdGhpcy5jaGF0VXNhZ2VNZXRyaWNzJC5uZXh0KGNoYXRVc2FnZU1ldHJpY3MpO1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcbiAgICBjb25zdCBjb25zdW1wdGlvblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKChjaGF0VXNhZ2VNZXRyaWNzLnRvdGFsVG9rZW5Db3VudCAqIDEwMCAvIChjdXJyZW50TW9kZWwhLmNvbnRleHRXaW5kb3dTaXplIC0gY3VycmVudE1vZGVsIS5tYXhHZW5lcmF0aW9uU2l6ZSkpICogMTAwKSAvIDEwMDtcbiAgICB0aGlzLmNoYXRUb2tlbkNvbnN1bXB0aW9uJC5uZXh0KHtwZXJjZW50YWdlOiBjb25zdW1wdGlvblBlcmNlbnRhZ2V9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vZGVsIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gKHNlcnZpY2VJZCArIG1vZGVsSWQpXG4gICAqIElmIGEgbW9kZWwgaXMgbm90IGZvdW5kLCBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkXG4gICAqIEBwYXJhbSBzZXJ2aWNlSWQgVGhlIHNlcnZpY2VJZCBvZiB0aGUgbW9kZWxcbiAgICogQHBhcmFtIG1vZGVsSWQgVGhlIG1vZGVsSWQgb2YgdGhlIG1vZGVsXG4gICAqIEByZXR1cm5zIFRoZSBtb2RlbCBkZXNjcmlwdGlvblxuICAgKi9cbiAgZ2V0TW9kZWwoc2VydmljZUlkOiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZyk6IEdsbG1Nb2RlbERlc2NyaXB0aW9uIHwgdW5kZWZpbmVke1xuICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWxzPy5maW5kKG0gPT4gbS5zZXJ2aWNlSWQgPT09IHNlcnZpY2VJZCAmJiBtLm1vZGVsSWQgPT09IG1vZGVsSWQpO1xuICAgIC8vIEhhbmRsZSBvYnNvbGV0ZSBjb25maWdcbiAgICBpZighbW9kZWwpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoYEZBVEFMIEVSUk9SIDogVGhlIG1vZGVsIChzZXJ2aWNlSWQgPSAnJHtzZXJ2aWNlSWR9JywgbW9kZWxJZCA9ICcke21vZGVsSWR9JykgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gUGxlYXNlIGNvbnRhY3QgYW4gYWRtaW4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZBVEFMIEVSUk9SIDogVGhlIG1vZGVsIChzZXJ2aWNlSWQgPSAnJHtzZXJ2aWNlSWR9JywgbW9kZWxJZCA9ICcke21vZGVsSWR9JykgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGxpc3Qgc2F2ZWQgY2hhdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIGFzc2lzdGFudFxuICAgKi9cbiAgYWJzdHJhY3QgbGlzdFNhdmVkQ2hhdCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNhdmVkIGNoYXQgd2l0aCB0aGUgZ2l2ZW4gaWQsIGlmIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWZpbmVkXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNhdmVkIGNoYXRcbiAgICovXG4gIGFic3RyYWN0IGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogU2F2ZSBhIGNoYXQgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZXNcbiAgICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBtZXNzYWdlcyB0byBhZGQgdG8gdGhlIHNhdmVkIGNoYXQgaW5kZXhcbiAgICogQHJldHVybnMgVGhlIHNhdmVkIGNoYXRcbiAgICovXG4gIGFic3RyYWN0IGFkZFNhdmVkQ2hhdChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PjtcblxuICAvKipcbiAgICogVXBkYXRlIGEgc2F2ZWQgY2hhdCB3aXRoIHRoZSBnaXZlbiBpZC5cbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2F2ZWQgY2hhdFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb2YgdGhlIHNhdmVkIGNoYXQsIGlmIHByb3ZpZGVkXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gdXBkYXRlIHRoZSBzYXZlZCBjaGF0IGhpc3RvcnksIGlmIHByb3ZpZGVkXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHNhdmVkIGNoYXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcbiAgICovXG4gIGFic3RyYWN0IHVwZGF0ZVNhdmVkQ2hhdChpZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBtZXNzYWdlcz86IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD47XG5cbiAgLyoqXG4gICAqIEJ1bGsgZGVsZXRlIG9mIHNhdmVkIGNoYXRzIG1hdGNoaW5nIHRoZSBnaXZlbiBpZHNcbiAgICogQHBhcmFtIGlkcyBMaXN0IG9mIGlkcyBvZiB0aGUgc2F2ZWQgY2hhdHMgdG8gZGVsZXRlXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZGVsZXRlZCBjaGF0c1xuICAgKi9cbiAgYWJzdHJhY3QgZGVsZXRlU2F2ZWRDaGF0KGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGRldGFpbHMuIFRoZSBnZW5lcmF0ZWQgYXVkaXQgZXZlbnQgaXMgc2VudCBhZnRlcndhcmRzIHZpYSB0aGUgQXVkaXRXZWJTZXJ2aWNlXG4gICAqIEBwYXJhbSB0eXBlIEF1ZGl0IGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgQXVkaXQgZXZlbnQgZGV0YWlsc1xuICAgKiBAcGFyYW0gaWQgQWN0aW9ucyAoc2F2ZWRDaGF0IGRlbGV0ZS9yZW5hbWUvLi4uKSBtYXkgb2NjdXIgb24gYSBzcGVjaWZpYyBjaGF0IGRpZmZlcmVudCB0aGFuIHRoZSBjdXJyZW50IG9uZSBzdG9yZWQgaW4gdGhpcyBzZXJ2aWNlLCBzbyB0aGUgY2hhdCBpZCBjYW4gYmUgcHJvdmlkZWRcbiAgICovXG4gIGdlbmVyYXRlQXVkaXRFdmVudCh0eXBlOiBzdHJpbmcsIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZURldGFpbHMgPSB7XG4gICAgICBcInVybFwiOiBkZWNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpLFxuICAgICAgXCJhcHBcIjogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXG4gICAgICBcInVzZXItaWRcIjogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbD8udXNlcklkLFxuICAgICAgXCJpbnN0YW5jZS1pZFwiOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgXCJjaGF0LWlkXCI6IGlkIHx8IHRoaXMuY2hhdElkLFxuICAgICAgXCJzZXJ2aWNlLWlkXCI6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCxcbiAgICAgIFwibW9kZWwtaWRcIjogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCxcbiAgICB9O1xuICAgIGNvbnN0IGF1ZGl0ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIGRldGFpbDoge1xuICAgICAgICAuLi5iYXNlRGV0YWlscyxcbiAgICAgICAgLi4uZGV0YWlsc1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmF1ZGl0U2VydmljZS5ub3RpZnkoYXVkaXQpO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSB0aGUgYXJyYXkgZnJvbSB0aGUgZW5kIGFuZCB0cmFjayB0aGUgZmlyc3QgJ2Fzc2lzdGFudCcgbWVzc2FnZSBhbW9uZyB0aGUgbGFzdCBncm91cCBvZiBcImFzc2lzdGFudFwiIG1lc3NhZ2VzIHdoZXJlIGRpc3BsYXkgaXMgdHJ1ZVxuICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IG9mIENoYXRNZXNzYWdlIHRvIHRyYXZlcnNlXG4gICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdmlzaWJsZSBhc3Npc3RhbnQgbWVzc2FnZSBhbW9uZyB0aGUgbGFzdCBncm91cCBvZiBcImFzc2lzdGFudFwiIG1lc3NhZ2VzIGluIHRoZSBhcnJheVxuICAgKi9cbiAgZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4KGFycmF5OiBDaGF0TWVzc2FnZVtdfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICAgIGlmICghYXJyYXkpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICBsZXQgZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4ID0gLTE7XG4gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgYXJyYXlbaW5kZXhdLnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXkgPT09IHRydWUpIHtcbiAgICAgICAgZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgICBpbmRleC0tO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIHRoZSBhcnJheSBmcm9tIHRoZSBlbmQgYW5kIHBpY2sgdGhlIGxhc3QgJ2Fzc2lzdGFudCcgbWVzc2FnZSBhbW9uZyB0aGUgbGFzdCBncm91cCBvZiBcImFzc2lzdGFudFwiIG1lc3NhZ2VzIHdoZXJlIGRpc3BsYXkgaXMgdHJ1ZVxuICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IG9mIENoYXRNZXNzYWdlIHRvIHRyYXZlcnNlXG4gICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCB2aXNpYmxlIGFzc2lzdGFudCBtZXNzYWdlIGFtb25nIHRoZSBsYXN0IGdyb3VwIG9mIFwiYXNzaXN0YW50XCIgbWVzc2FnZXMgaW4gdGhlIGFycmF5XG4gICAqL1xuICBsYXN0VmlzaWJsZUFzc2lzdGFudE1lc3NhZ2VJbmRleChhcnJheTogQ2hhdE1lc3NhZ2VbXXwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgICBpZiAoIWFycmF5KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGxldCBpbmRleCA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgbGV0IGxhc3RWaXNpYmxlQXNzaXN0YW50TWVzc2FnZUluZGV4ID0gLTE7XG4gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgYXJyYXlbaW5kZXhdLnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXkgPT09IHRydWUpIHtcbiAgICAgICAgbGFzdFZpc2libGVBc3Npc3RhbnRNZXNzYWdlSW5kZXggPSBpbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleC0tO1xuICAgIH1cbiAgICByZXR1cm4gbGFzdFZpc2libGVBc3Npc3RhbnRNZXNzYWdlSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgZGF0ZSBzdHJpbmcgaW4gVVRDIHRvIGEgbG9jYWwgZGF0ZSBzdHJpbmdcbiAgICogQHBhcmFtIHZhbHVlIERhdGUgc3RyaW5nIGluIFVUQyB0byBmb3JtYXRcbiAgICogQHJldHVybnMgQSBmb3JtYXR0ZWQgbG9jYWwgZGF0ZSBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBmb3JtYXREYXRlVGltZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbERhdGUgPSB0b0RhdGUocGFyc2VJU08odmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcy5pbnRsU2VydmljZVtcImZvcm1hdFRpbWVcIl0obG9jYWxEYXRlLCB7ZGF5OiBcIm51bWVyaWNcIiwgbW9udGg6IFwic2hvcnRcIiwgeWVhcjogXCJudW1lcmljXCIsIHRpbWVab25lTmFtZTogJ3Nob3J0J30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgdGV4dCBwcm9tcHQgdGhhdCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMgZm9yIHZhcmlhYmxlc1xuICAgKiBhbmQgcmVwbGFjZXMgdGhlc2UgcGxhY2Vob2xkZXJzIGlmIGl0IGZpbmRzIGEgbWF0Y2ggaW4gdGhlIGdpdmVuXG4gICAqIGNvbnRleHQgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGZvcm1hdFByb21wdChwcm9tcHQ6IHN0cmluZywgY29udGV4dDogYW55KSB7XG4gICAgcmV0dXJuIHByb21wdC5yZXBsYWNlKFxuICAgICAgL3t7KC4qPyl9fS9nLFxuICAgICAgKG1hdGNoLCBleHByKSA9PiBnZXQoY29udGV4dCwgZXhwcikgPz8gbWF0Y2hcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -29,10 +29,10 @@ export class DebugMessageComponent {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
DebugMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DebugMessageComponent, deps: [{ token: i1.UIService }], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
-
DebugMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DebugMessageComponent, isStandalone: true, selector: "sq-debug-message", inputs: { data: "data", level: "level", parentColor: "parentColor" }, ngImport: i0, template: "<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue>{{ item.data.value }}</ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name\" [class.
|
|
32
|
+
DebugMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DebugMessageComponent, isStandalone: true, selector: "sq-debug-message", inputs: { data: "data", level: "level", parentColor: "parentColor" }, ngImport: i0, template: "<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue><div class=\"data-value\">{{ item.data.value }}</div></ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name w-100\" [class.fw-bold]=\"level === 0\" (click)=\"item.expanded=!item.expanded\">\n <i class=\"fas\" [class.fa-chevron-up]=\"item.expanded\" [class.fa-chevron-down]=\"!item.expanded\"></i>\n {{ item.name }}\n </div>\n <div class=\"list-items w-100\" *ngIf=\"item.expanded\">\n <sq-debug-message [data]=\"item.items\" [level]=\"level + 1\" [parentColor]=\"getRowClass(item, i)\"></sq-debug-message>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [".table-root{display:flex;flex-direction:column;border:1px solid #ccc;width:100%;border-spacing:0}.table-row{display:flex;width:100%}.list-name{width:15%;cursor:pointer}.list-items{width:85%}.kv-key,.kv-value,.list-name{padding:8px;border:1px solid #ccc;box-sizing:border-box;word-wrap:break-word}.kv-key{width:20%}.kv-value{width:80%}.kv-value .data-value{white-space:pre-line}.kv-object,.list-object{display:flex;flex:1}.list-object{flex-direction:column}.row-even{background-color:#fff}.row-odd{background-color:#f2f8fe}.row-error{background-color:#f08080}.table-row:not(:last-child){border-bottom:1px solid #ccc}.kv-key:last-child,.kv-value:last-child,.list-name:last-child{border-right:none}\n"], dependencies: [{ kind: "component", type: DebugMessageComponent, selector: "sq-debug-message", inputs: ["data", "level", "parentColor"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.JsonPipe, name: "json" }] });
|
|
33
33
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DebugMessageComponent, decorators: [{
|
|
34
34
|
type: Component,
|
|
35
|
-
args: [{ selector: "sq-debug-message", standalone: true, imports: [CommonModule], template: "<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue>{{ item.data.value }}</ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name\" [class.
|
|
35
|
+
args: [{ selector: "sq-debug-message", standalone: true, imports: [CommonModule], template: "<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue><div class=\"data-value\">{{ item.data.value }}</div></ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name w-100\" [class.fw-bold]=\"level === 0\" (click)=\"item.expanded=!item.expanded\">\n <i class=\"fas\" [class.fa-chevron-up]=\"item.expanded\" [class.fa-chevron-down]=\"!item.expanded\"></i>\n {{ item.name }}\n </div>\n <div class=\"list-items w-100\" *ngIf=\"item.expanded\">\n <sq-debug-message [data]=\"item.items\" [level]=\"level + 1\" [parentColor]=\"getRowClass(item, i)\"></sq-debug-message>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [".table-root{display:flex;flex-direction:column;border:1px solid #ccc;width:100%;border-spacing:0}.table-row{display:flex;width:100%}.list-name{width:15%;cursor:pointer}.list-items{width:85%}.kv-key,.kv-value,.list-name{padding:8px;border:1px solid #ccc;box-sizing:border-box;word-wrap:break-word}.kv-key{width:20%}.kv-value{width:80%}.kv-value .data-value{white-space:pre-line}.kv-object,.list-object{display:flex;flex:1}.list-object{flex-direction:column}.row-even{background-color:#fff}.row-odd{background-color:#f2f8fe}.row-error{background-color:#f08080}.table-row:not(:last-child){border-bottom:1px solid #ccc}.kv-key:last-child,.kv-value:last-child,.list-name:last-child{border-right:none}\n"] }]
|
|
36
36
|
}], ctorParameters: function () { return [{ type: i1.UIService }]; }, propDecorators: { data: [{
|
|
37
37
|
type: Input
|
|
38
38
|
}], level: [{
|
|
@@ -40,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
40
40
|
}], parentColor: [{
|
|
41
41
|
type: Input
|
|
42
42
|
}] } });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctbWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kZWJ1Zy1tZXNzYWdlL2RlYnVnLW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZGVidWctbWVzc2FnZS9kZWJ1Zy1tZXNzYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWtCLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDOzs7O0FBVWpDLE1BQU0sT0FBTyxxQkFBcUI7SUFLaEMsWUFBbUIsRUFBYTtRQUFiLE9BQUUsR0FBRixFQUFFLENBQVc7UUFIdkIsVUFBSyxHQUFXLENBQUMsQ0FBQyxDQUFFLDBCQUEwQjtRQUM5QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQyxDQUFFLDZCQUE2QjtJQUU3QixDQUFDO0lBRXJDLGVBQWU7UUFDYixLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVO1FBQ2pCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVyxDQUFDLElBQWtCLEVBQUUsS0FBYTtRQUMzQyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFTO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7O2tIQXZCVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixrSkNkbEMsa2lEQTJCQSxtdkJEYmEscUJBQXFCLHNHQUZ0QixZQUFZOzJGQUVYLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxrQkFBa0IsY0FHaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDO2dHQUdkLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7ICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERlYnVnTWVzc2FnZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9iYXNlXCI7XG5pbXBvcnQgKiBhcyBQcmlzbSBmcm9tICdwcmlzbWpzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzcS1kZWJ1Zy1tZXNzYWdlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZGVidWctbWVzc2FnZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZGVidWctbWVzc2FnZS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgRGVidWdNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGRhdGE6IERlYnVnTWVzc2FnZVtdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBsZXZlbDogbnVtYmVyID0gMDsgIC8vIFRyYWNrIHRoZSBuZXN0aW5nIGxldmVsXG4gIEBJbnB1dCgpIHBhcmVudENvbG9yOiBzdHJpbmcgPSAnJzsgIC8vIFRyYWNrIHRoZSBwYXJlbnQgcm93IGNvbG9yXG5cbiAgY29uc3RydWN0b3IocHVibGljIHVpOiBVSVNlcnZpY2UpIHsgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBQcmlzbS5oaWdobGlnaHRBbGwoKTtcbiAgfVxuXG4gIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbHMuaXNPYmplY3QodmFsdWUpO1xuICB9XG5cbiAgZ2V0Um93Q2xhc3MoaXRlbTogRGVidWdNZXNzYWdlLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbS5pc0Vycm9yKSByZXR1cm4gJ3Jvdy1lcnJvcic7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IDApIHJldHVybiBpbmRleCAlIDIgPT09IDAgPyAncm93LWV2ZW4nIDogJ3Jvdy1vZGQnO1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvbG9yO1xuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKGNvZGU6IGFueSkge1xuICAgIHRoaXMudWkuY29weVRvQ2xpcGJvYXJkKEpTT04uc3RyaW5naWZ5KGNvZGUsIG51bGwsIDIpKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cInRhYmxlLXJvb3RcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ0tWJ1wiIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzKGl0ZW0sIGkpXCIgY2xhc3M9XCJ0YWJsZS1yb3cga3Ytb2JqZWN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwia3Yta2V5XCI+e3sgaXRlbS5kYXRhLmtleSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImt2LXZhbHVlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09iamVjdChpdGVtLmRhdGEudmFsdWUpOyBlbHNlIG5vcm1hbFZhbHVlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoaXRlbS5kYXRhLnZhbHVlKVwiPjxpIGNsYXNzPVwiZmFyIGZhLWZ3IGZhLWNsaXBib2FyZFwiPjwvaT4gQ29weSBjb2RlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJsYW5ndWFnZS1qc29uIG15LTAgcm91bmRlZC0wIHJvdW5kZWQtYm90dG9tXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS1qc29uXCI+e3sgaXRlbS5kYXRhLnZhbHVlIHwganNvbiB9fTwvY29kZT48L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsVmFsdWU+PGRpdiBjbGFzcz1cImRhdGEtdmFsdWVcIj57eyBpdGVtLmRhdGEudmFsdWUgfX08L2Rpdj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ0xJU1QnXCIgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3MoaXRlbSwgaSlcIiBjbGFzcz1cInRhYmxlLXJvdyBsaXN0LW9iamVjdFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxpc3QtbmFtZSB3LTEwMFwiIFtjbGFzcy5mdy1ib2xkXT1cImxldmVsID09PSAwXCIgKGNsaWNrKT1cIml0ZW0uZXhwYW5kZWQ9IWl0ZW0uZXhwYW5kZWRcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXNcIiBbY2xhc3MuZmEtY2hldnJvbi11cF09XCJpdGVtLmV4cGFuZGVkXCIgW2NsYXNzLmZhLWNoZXZyb24tZG93bl09XCIhaXRlbS5leHBhbmRlZFwiPjwvaT5cbiAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1zIHctMTAwXCIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkXCI+XG4gICAgICAgIDxzcS1kZWJ1Zy1tZXNzYWdlIFtkYXRhXT1cIml0ZW0uaXRlbXNcIiBbbGV2ZWxdPVwibGV2ZWwgKyAxXCIgW3BhcmVudENvbG9yXT1cImdldFJvd0NsYXNzKGl0ZW0sIGkpXCI+PC9zcS1kZWJ1Zy1tZXNzYWdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
|
|
@@ -135,8 +135,8 @@ export class RestChatService extends ChatService {
|
|
|
135
135
|
'text': response.content,
|
|
136
136
|
'role': response.role,
|
|
137
137
|
'rank': this.chatHistory.length - 1,
|
|
138
|
-
'generation-tokencount': response.additionalProperties.usageMetrics
|
|
139
|
-
'prompt-tokencount': response.additionalProperties.usageMetrics
|
|
138
|
+
'generation-tokencount': response.additionalProperties.usageMetrics?.completionTokenCount,
|
|
139
|
+
'prompt-tokencount': response.additionalProperties.usageMetrics?.promptTokenCount,
|
|
140
140
|
'attachments': response.additionalProperties.$attachment?.map(({ recordId, contextId, parts, type }) => ({
|
|
141
141
|
recordId,
|
|
142
142
|
contextId,
|
|
@@ -149,6 +149,11 @@ export class RestChatService extends ChatService {
|
|
|
149
149
|
return { history: [...messages, response], executionTime: res.executionTime };
|
|
150
150
|
}), finalize(() => this.streaming$.next(false)));
|
|
151
151
|
}
|
|
152
|
+
stopGeneration() {
|
|
153
|
+
const error = new Error('Not supported in REST');
|
|
154
|
+
console.error(error);
|
|
155
|
+
return throwError(() => error);
|
|
156
|
+
}
|
|
152
157
|
listSavedChat() {
|
|
153
158
|
if (!this.chatConfig$.value.savedChatSettings.enabled) {
|
|
154
159
|
return;
|
|
@@ -229,4 +234,4 @@ RestChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", vers
|
|
|
229
234
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService, decorators: [{
|
|
230
235
|
type: Injectable
|
|
231
236
|
}], ctorParameters: function () { return []; } });
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1jaGF0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9yZXN0LWNoYXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5SCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFJckUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsV0FBVztJQUk5QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBSEgseUJBQW9CLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFJOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxFQUMxQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLHFEQUFxRDtRQUNyRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ2IsUUFBUSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3JCLENBQUMsQ0FDSDtRQUNELHVFQUF1RTtRQUN2RSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFB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QUMsdURBQXVELEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkgsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzRHQXhRVSxlQUFlO2dIQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuL2NoYXQuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZpbmFsaXplLCBmb3JrSm9pbiwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjdGlvbk1lc3NhZ2UsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFByb2dyZXNzLCBDaGF0UmVzcG9uc2UsIEdsbG1GdW5jdGlvbiwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIEh0dHBDaGF0UmVzcG9uc2UsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSnNvbk1ldGhvZFBsdWdpblNlcnZpY2UgfSBmcm9tICdAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzdENoYXRTZXJ2aWNlIGV4dGVuZHMgQ2hhdFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBqc29uTWV0aG9kV2ViU2VydmljZSA9IGluamVjdChKc29uTWV0aG9kUGx1Z2luU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3MgYWZ0ZXIgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKiBJdCBsaXN0ZW5zIGZvciB0aGUgJ2xvZ2luLWNvbXBsZXRlJyBldmVudCwgaW5pdGlhbGl6ZXMgbmVjZXNzYXJ5IFVSTCwgYW5kIHBlcmZvcm1zIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMsIGZ1bmN0aW9ucyBhbmQgcXVvdGEgZGF0YS5cbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5nZXRSZXF1ZXN0c1VybCgpKSxcbiAgICAgIC8vIEV4ZWN1dGUgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgZm9ya0pvaW4oW1xuICAgICAgICAgIHRoaXMubGlzdE1vZGVscygpLFxuICAgICAgICAgIHRoaXMubGlzdEZ1bmN0aW9ucygpXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3NcbiAgICAgIG1hcCgoW21vZGVscywgZnVuY3Rpb25zXSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAhIW1vZGVscyAmJiAhIWZ1bmN0aW9ucztcbiAgICAgICAgdGhpcy5pbml0UHJvY2VzcyQubmV4dChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gY2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVycywgZW5zdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgR0xMTSBwbHVnaW4gdG8gdXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy5yZXN0RW5kcG9pbnQpIHtcbiAgICAgIHRoaXMuUkVRVUVTVF9VUkwgPSB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5jb25uZWN0aW9uU2V0dGluZ3MucmVzdEVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSAncmVzdEVuZHBvaW50JyBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgJ1JFU1QnIGluIGFzc2lzdGFudCBpbnN0YW5jZWApO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJsaXN0bW9kZWxzXCIsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5tb2RlbHMpLFxuICAgICAgdGFwKG1vZGVscyA9PiB0aGlzLm1vZGVscyA9IG1vZGVscz8uZmlsdGVyKG1vZGVsID0+ICEhbW9kZWwuZW5hYmxlKSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0bW9kZWxzOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdEZ1bmN0aW9ucygpOiBPYnNlcnZhYmxlPEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJsaXN0ZnVuY3Rpb25zXCIsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5mdW5jdGlvbnMpLFxuICAgICAgdGFwKChmdW5jdGlvbnM6IEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkKSA9PiB0aGlzLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkICYmICAhIXRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbmQoZm4gPT4gZm4ubmFtZSA9PT0gZnVuYy5mdW5jdGlvbk5hbWUpKSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0ZnVuY3Rpb25zOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5OiBRdWVyeSk6IE9ic2VydmFibGU8Q2hhdFJlc3BvbnNlPiB7XG4gICAgLy8gU3RhcnQgc3RyZWFtaW5nIGJ5IGludm9raW5nIHRoZSBDaGF0IG1ldGhvZFxuICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBDaGF0IG1ldGhvZFxuICAgIGNvbnN0IGRhdGE6IENoYXRQYXlsb2FkICYge2FjdGlvbjogXCJjaGF0XCJ9ID0ge1xuICAgICAgYWN0aW9uOiBcImNoYXRcIixcbiAgICAgIGhpc3Rvcnk6IG1lc3NhZ2VzLFxuICAgICAgZnVuY3Rpb25zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcsXG4gICAgICBzZXJ2aWNlU2V0dGluZ3M6IHtcbiAgICAgICAgc2VydmljZV9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxuICAgICAgICBtb2RlbF9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCxcbiAgICAgICAgdG9wX3A6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMudG9wX3AsXG4gICAgICAgIHRlbXBlcmF0dXJlOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlLFxuICAgICAgICBtYXhfdG9rZW5zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnMsXG4gICAgICAgIC4uLnRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmFkZGl0aW9uYWxTZXJ2aWNlU2V0dGluZ3NcbiAgICAgIH0sXG4gICAgICBhcHBRdWVyeToge1xuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfSxcbiAgICAgIGdlbmVyaWNDaGF0RXJyb3JNZXNzYWdlOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5nbG9iYWxTZXR0aW5ncy5nZW5lcmljQ2hhdEVycm9yTWVzc2FnZVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICAgIGRhdGEuc2F2ZWRDaGF0SWQgPSB0aGlzLnNhdmVkQ2hhdElkO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgdGhlIENoYXQgZW5kcG9pbnRcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICB0YXAoKHJlczogSHR0cENoYXRSZXNwb25zZSkgPT4gdGhpcy51cGRhdGVRdW90YShyZXMucXVvdGEsIHRydWUpKSxcbiAgICAgIG1hcCgocmVzOiBIdHRwQ2hhdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIERlZmluZSAkcHJvZ3Jlc3MgZnJvbSB0aGUgYWN0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgICAgbGV0ICRwcm9ncmVzczogQ2hhdFByb2dyZXNzW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmKCByZXMuYWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnM6IEFjdGlvbk1lc3NhZ2VbXSA9IE9iamVjdC52YWx1ZXMocmVzLmFjdGlvbnMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGFjY1tpdGVtLmd1aWRdID0geyAuLi4oYWNjW2l0ZW0uZ3VpZF0gfHwge30pLCAuLi5pdGVtIH07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KSk7XG4gICAgICAgICAgJHByb2dyZXNzID0gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTogYS5kaXNwbGF5TmFtZSA/PyBcIlwiLFxuICAgICAgICAgICAgY29udGVudDogYS5kaXNwbGF5VmFsdWUgPz8gXCJcIixcbiAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGltZTogYS5leGVjdXRpb25UaW1lLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlLWF0dGFjaCB0aGUgJHByb2dyZXNzIGFuZCAkYXR0YWNobWVudCBvZiB0aGUgbGFzdCByZXNwb25zZSB0byB0aGUgbGFzdCBhc3Npc3RhbnQncyByZXNwb25zZSBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gey4uLihyZXMuaGlzdG9yeSBhcyBBcnJheTxDaGF0TWVzc2FnZT4pLmF0KC0xKX0gYXMgQ2hhdE1lc3NhZ2U7XG4gICAgICAgIGlmKCRwcm9ncmVzcykgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzID0gJHByb2dyZXNzO1xuICAgICAgICBpZihyZXMuY29udGV4dCkgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSByZXMuY29udGV4dC5tYXAoKGN0eCkgPT4gY3R4LmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYocmVzLnN1Z2dlc3RlZEFjdGlvbnMpIHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gPSByZXMuc3VnZ2VzdGVkQWN0aW9ucztcbiAgICAgICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBjaGF0IHVzYWdlIG1ldHJpY3Mgb25jZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlIGlzIGNvbXBsZXRlZFxuICAgICAgICBpZiAoISFyZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3MpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MocmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMudXNhZ2VNZXRyaWNzISk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjaGF0IGhpc3Rvcnkgd2l0aCB0aGUgaW5jb21pbmcgaGlzdG9yeSBwcm9wZXJ0eSBvZiB0aGUgcmVzIEFORCB0aGUgcHJvY2Vzc2VkIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSA9IHJlcy5oaXN0b3J5O1xuICAgICAgICB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gU2F2ZS91cGRhdGUgdGhlIGNoYXQgaWYgc2F2ZWRDaGF0IGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQgJiYgdGhpcy5jaGF0SGlzdG9yeS5zb21lKChtc2cpID0+IG1zZy5hZGRpdGlvbmFsUHJvcGVydGllcz8uaXNVc2VySW5wdXQgPT09IHRydWUpKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gIXRoaXMuc2F2ZWRDaGF0SWQgPyB0aGlzLmFkZFNhdmVkQ2hhdCh0aGlzLmNoYXRIaXN0b3J5KSA6IHRoaXMudXBkYXRlU2F2ZWRDaGF0KHRoaXMuc2F2ZWRDaGF0SWQsIHVuZGVmaW5lZCwgdGhpcy5jaGF0SGlzdG9yeSk7XG4gICAgICAgICAgYWN0aW9uLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2VuZXJhdGUgYXVkaXQgZXZlbnRcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAnZHVyYXRpb24nOiByZXMuZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICAndGV4dCc6IHJlc3BvbnNlLmNvbnRlbnQsXG4gICAgICAgICAgJ3JvbGUnOiByZXNwb25zZS5yb2xlLCAvLyAnYXNzaXN0YW50J1xuICAgICAgICAgICdyYW5rJzogdGhpcy5jaGF0SGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICdnZW5lcmF0aW9uLXRva2VuY291bnQnOiByZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3MhLmNvbXBsZXRpb25Ub2tlbkNvdW50LFxuICAgICAgICAgICdwcm9tcHQtdG9rZW5jb3VudCc6IHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcyEucHJvbXB0VG9rZW5Db3VudCxcbiAgICAgICAgICAnYXR0YWNobWVudHMnOiByZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudD8ubWFwKCh7IHJlY29yZElkLCBjb250ZXh0SWQsIHBhcnRzLCB0eXBlIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzOiBwYXJ0cy5tYXAoKHsgcGFydElkLCB0ZXh0IH0pID0+ICh7IHBhcnRJZCwgdGV4dCB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIGRldGFpbHMpO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgICAgICByZXR1cm4geyBoaXN0b3J5OiBbLi4ubWVzc2FnZXMsIHJlc3BvbnNlXSwgZXhlY3V0aW9uVGltZTogcmVzLmV4ZWN1dGlvblRpbWUgfTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5zdHJlYW1pbmckLm5leHQoZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0TGlzdFwiLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4gdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhZGRTYXZlZENoYXQobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0QWRkXCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IHRoaXMuY2hhdElkLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5zYXZlZENoYXQpLFxuICAgICAgdGFwKChzYXZlZENoYXQ6IFNhdmVkQ2hhdCkgPT4ge1xuICAgICAgICB0aGlzLnNldFNhdmVkQ2hhdElkKHNhdmVkQ2hhdC5pZCk7IC8vIFBlcnNpc3QgdGhlIHNhdmVkQ2hhdElkXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KCdzYXZlZC1jaGF0LmFkZCcsIHt9LCBzYXZlZENoYXQuaWQpOyAvLyBHZW5lcmF0ZSBhdWRpdCBldmVudFxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRBZGQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEFkZCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0U2F2ZWRDaGF0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdEdldFwiLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5nZXQodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRHZXQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEdldCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlU2F2ZWRDaGF0KGlkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2VzPzogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRVcGRhdGVcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICBpZihuYW1lKSBkYXRhW1widGl0bGVcIl0gPSBuYW1lO1xuICAgIGlmKG1lc3NhZ2VzKSBkYXRhW1wiaGlzdG9yeVwiXSA9IG1lc3NhZ2VzO1xuXG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UucG9zdCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMuc2F2ZWRDaGF0KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdFVwZGF0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0VXBkYXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVTYXZlZENoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXREZWxldGVcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZHM6IGlkcyxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5kZWxldGVkQ291bnQpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0RGVsZXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXREZWxldGUgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG59XG4iXX0=
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1jaGF0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9yZXN0LWNoYXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5SCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFJckUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsV0FBVztJQUk5QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBSEgseUJBQW9CLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFJOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxFQUMxQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLHFEQUFxRDtRQUNyRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ2IsUUFBUSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3JCLENBQUMsQ0FDSDtRQUNELHVFQUF1RTtRQUN2RSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFB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SUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNoRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQzVCLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsdURBQXVELEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkgsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzRHQTlRVSxlQUFlO2dIQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuL2NoYXQuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZpbmFsaXplLCBmb3JrSm9pbiwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjdGlvbk1lc3NhZ2UsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFByb2dyZXNzLCBDaGF0UmVzcG9uc2UsIEdsbG1GdW5jdGlvbiwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIEh0dHBDaGF0UmVzcG9uc2UsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSnNvbk1ldGhvZFBsdWdpblNlcnZpY2UgfSBmcm9tICdAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzdENoYXRTZXJ2aWNlIGV4dGVuZHMgQ2hhdFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBqc29uTWV0aG9kV2ViU2VydmljZSA9IGluamVjdChKc29uTWV0aG9kUGx1Z2luU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3MgYWZ0ZXIgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKiBJdCBsaXN0ZW5zIGZvciB0aGUgJ2xvZ2luLWNvbXBsZXRlJyBldmVudCwgaW5pdGlhbGl6ZXMgbmVjZXNzYXJ5IFVSTCwgYW5kIHBlcmZvcm1zIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMsIGZ1bmN0aW9ucyBhbmQgcXVvdGEgZGF0YS5cbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5nZXRSZXF1ZXN0c1VybCgpKSxcbiAgICAgIC8vIEV4ZWN1dGUgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgZm9ya0pvaW4oW1xuICAgICAgICAgIHRoaXMubGlzdE1vZGVscygpLFxuICAgICAgICAgIHRoaXMubGlzdEZ1bmN0aW9ucygpXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3NcbiAgICAgIG1hcCgoW21vZGVscywgZnVuY3Rpb25zXSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAhIW1vZGVscyAmJiAhIWZ1bmN0aW9ucztcbiAgICAgICAgdGhpcy5pbml0UHJvY2VzcyQubmV4dChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gY2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVycywgZW5zdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgR0xMTSBwbHVnaW4gdG8gdXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy5yZXN0RW5kcG9pbnQpIHtcbiAgICAgIHRoaXMuUkVRVUVTVF9VUkwgPSB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5jb25uZWN0aW9uU2V0dGluZ3MucmVzdEVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSAncmVzdEVuZHBvaW50JyBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgJ1JFU1QnIGluIGFzc2lzdGFudCBpbnN0YW5jZWApO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJsaXN0bW9kZWxzXCIsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5tb2RlbHMpLFxuICAgICAgdGFwKG1vZGVscyA9PiB0aGlzLm1vZGVscyA9IG1vZGVscz8uZmlsdGVyKG1vZGVsID0+ICEhbW9kZWwuZW5hYmxlKSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0bW9kZWxzOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdEZ1bmN0aW9ucygpOiBPYnNlcnZhYmxlPEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJsaXN0ZnVuY3Rpb25zXCIsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5mdW5jdGlvbnMpLFxuICAgICAgdGFwKChmdW5jdGlvbnM6IEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkKSA9PiB0aGlzLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkICYmICAhIXRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbmQoZm4gPT4gZm4ubmFtZSA9PT0gZnVuYy5mdW5jdGlvbk5hbWUpKSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0ZnVuY3Rpb25zOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5OiBRdWVyeSk6IE9ic2VydmFibGU8Q2hhdFJlc3BvbnNlPiB7XG4gICAgLy8gU3RhcnQgc3RyZWFtaW5nIGJ5IGludm9raW5nIHRoZSBDaGF0IG1ldGhvZFxuICAgIHRoaXMuc3RyZWFtaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBDaGF0IG1ldGhvZFxuICAgIGNvbnN0IGRhdGE6IENoYXRQYXlsb2FkICYge2FjdGlvbjogXCJjaGF0XCJ9ID0ge1xuICAgICAgYWN0aW9uOiBcImNoYXRcIixcbiAgICAgIGhpc3Rvcnk6IG1lc3NhZ2VzLFxuICAgICAgZnVuY3Rpb25zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcsXG4gICAgICBzZXJ2aWNlU2V0dGluZ3M6IHtcbiAgICAgICAgc2VydmljZV9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxuICAgICAgICBtb2RlbF9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCxcbiAgICAgICAgdG9wX3A6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMudG9wX3AsXG4gICAgICAgIHRlbXBlcmF0dXJlOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlLFxuICAgICAgICBtYXhfdG9rZW5zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnMsXG4gICAgICAgIC4uLnRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmFkZGl0aW9uYWxTZXJ2aWNlU2V0dGluZ3NcbiAgICAgIH0sXG4gICAgICBhcHBRdWVyeToge1xuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfSxcbiAgICAgIGdlbmVyaWNDaGF0RXJyb3JNZXNzYWdlOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5nbG9iYWxTZXR0aW5ncy5nZW5lcmljQ2hhdEVycm9yTWVzc2FnZVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICAgIGRhdGEuc2F2ZWRDaGF0SWQgPSB0aGlzLnNhdmVkQ2hhdElkO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgdGhlIENoYXQgZW5kcG9pbnRcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICB0YXAoKHJlczogSHR0cENoYXRSZXNwb25zZSkgPT4gdGhpcy51cGRhdGVRdW90YShyZXMucXVvdGEsIHRydWUpKSxcbiAgICAgIG1hcCgocmVzOiBIdHRwQ2hhdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIERlZmluZSAkcHJvZ3Jlc3MgZnJvbSB0aGUgYWN0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgICAgbGV0ICRwcm9ncmVzczogQ2hhdFByb2dyZXNzW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmKCByZXMuYWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnM6IEFjdGlvbk1lc3NhZ2VbXSA9IE9iamVjdC52YWx1ZXMocmVzLmFjdGlvbnMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGFjY1tpdGVtLmd1aWRdID0geyAuLi4oYWNjW2l0ZW0uZ3VpZF0gfHwge30pLCAuLi5pdGVtIH07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KSk7XG4gICAgICAgICAgJHByb2dyZXNzID0gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTogYS5kaXNwbGF5TmFtZSA/PyBcIlwiLFxuICAgICAgICAgICAgY29udGVudDogYS5kaXNwbGF5VmFsdWUgPz8gXCJcIixcbiAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGltZTogYS5leGVjdXRpb25UaW1lLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlLWF0dGFjaCB0aGUgJHByb2dyZXNzIGFuZCAkYXR0YWNobWVudCBvZiB0aGUgbGFzdCByZXNwb25zZSB0byB0aGUgbGFzdCBhc3Npc3RhbnQncyByZXNwb25zZSBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gey4uLihyZXMuaGlzdG9yeSBhcyBBcnJheTxDaGF0TWVzc2FnZT4pLmF0KC0xKX0gYXMgQ2hhdE1lc3NhZ2U7XG4gICAgICAgIGlmKCRwcm9ncmVzcykgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzID0gJHByb2dyZXNzO1xuICAgICAgICBpZihyZXMuY29udGV4dCkgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSByZXMuY29udGV4dC5tYXAoKGN0eCkgPT4gY3R4LmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYocmVzLnN1Z2dlc3RlZEFjdGlvbnMpIHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gPSByZXMuc3VnZ2VzdGVkQWN0aW9ucztcbiAgICAgICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBjaGF0IHVzYWdlIG1ldHJpY3Mgb25jZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlIGlzIGNvbXBsZXRlZFxuICAgICAgICBpZiAoISFyZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3MpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MocmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMudXNhZ2VNZXRyaWNzISk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjaGF0IGhpc3Rvcnkgd2l0aCB0aGUgaW5jb21pbmcgaGlzdG9yeSBwcm9wZXJ0eSBvZiB0aGUgcmVzIEFORCB0aGUgcHJvY2Vzc2VkIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSA9IHJlcy5oaXN0b3J5O1xuICAgICAgICB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gU2F2ZS91cGRhdGUgdGhlIGNoYXQgaWYgc2F2ZWRDaGF0IGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQgJiYgdGhpcy5jaGF0SGlzdG9yeS5zb21lKChtc2cpID0+IG1zZy5hZGRpdGlvbmFsUHJvcGVydGllcz8uaXNVc2VySW5wdXQgPT09IHRydWUpKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gIXRoaXMuc2F2ZWRDaGF0SWQgPyB0aGlzLmFkZFNhdmVkQ2hhdCh0aGlzLmNoYXRIaXN0b3J5KSA6IHRoaXMudXBkYXRlU2F2ZWRDaGF0KHRoaXMuc2F2ZWRDaGF0SWQsIHVuZGVmaW5lZCwgdGhpcy5jaGF0SGlzdG9yeSk7XG4gICAgICAgICAgYWN0aW9uLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2VuZXJhdGUgYXVkaXQgZXZlbnRcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAnZHVyYXRpb24nOiByZXMuZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICAndGV4dCc6IHJlc3BvbnNlLmNvbnRlbnQsXG4gICAgICAgICAgJ3JvbGUnOiByZXNwb25zZS5yb2xlLCAvLyAnYXNzaXN0YW50J1xuICAgICAgICAgICdyYW5rJzogdGhpcy5jaGF0SGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICdnZW5lcmF0aW9uLXRva2VuY291bnQnOiByZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3M/LmNvbXBsZXRpb25Ub2tlbkNvdW50LFxuICAgICAgICAgICdwcm9tcHQtdG9rZW5jb3VudCc6IHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcz8ucHJvbXB0VG9rZW5Db3VudCxcbiAgICAgICAgICAnYXR0YWNobWVudHMnOiByZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudD8ubWFwKCh7IHJlY29yZElkLCBjb250ZXh0SWQsIHBhcnRzLCB0eXBlIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzOiBwYXJ0cy5tYXAoKHsgcGFydElkLCB0ZXh0IH0pID0+ICh7IHBhcnRJZCwgdGV4dCB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdlbmVyYXRlQXVkaXRFdmVudCgnbWVzc2FnZScsIGRldGFpbHMpO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgICAgICByZXR1cm4geyBoaXN0b3J5OiBbLi4ubWVzc2FnZXMsIHJlc3BvbnNlXSwgZXhlY3V0aW9uVGltZTogcmVzLmV4ZWN1dGlvblRpbWUgfTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5zdHJlYW1pbmckLm5leHQoZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBzdG9wR2VuZXJhdGlvbigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGluIFJFU1QnKTtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gIH1cblxuICBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0TGlzdFwiLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4gdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhZGRTYXZlZENoYXQobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0QWRkXCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IHRoaXMuY2hhdElkLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5zYXZlZENoYXQpLFxuICAgICAgdGFwKChzYXZlZENoYXQ6IFNhdmVkQ2hhdCkgPT4ge1xuICAgICAgICB0aGlzLnNldFNhdmVkQ2hhdElkKHNhdmVkQ2hhdC5pZCk7IC8vIFBlcnNpc3QgdGhlIHNhdmVkQ2hhdElkXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KCdzYXZlZC1jaGF0LmFkZCcsIHt9LCBzYXZlZENoYXQuaWQpOyAvLyBHZW5lcmF0ZSBhdWRpdCBldmVudFxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRBZGQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEFkZCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0U2F2ZWRDaGF0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdEdldFwiLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5nZXQodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRHZXQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEdldCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlU2F2ZWRDaGF0KGlkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2VzPzogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRVcGRhdGVcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICBpZihuYW1lKSBkYXRhW1widGl0bGVcIl0gPSBuYW1lO1xuICAgIGlmKG1lc3NhZ2VzKSBkYXRhW1wiaGlzdG9yeVwiXSA9IG1lc3NhZ2VzO1xuXG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UucG9zdCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMuc2F2ZWRDaGF0KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdFVwZGF0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0VXBkYXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVTYXZlZENoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXREZWxldGVcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZHM6IGlkcyxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5kZWxldGVkQ291bnQpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0RGVsZXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXREZWxldGUgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG59XG4iXX0=
|