genassist-chat-react 1.0.39 → 1.0.41

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.
@@ -91,13 +91,16 @@ export var useChat = function (_a) {
91
91
  var _q = useState(null), inputDisclaimerHtml = _q[0], setInputDisclaimerHtml = _q[1];
92
92
  var _r = useState([]), thinkingPhrases = _r[0], setThinkingPhrases = _r[1];
93
93
  var _s = useState(1000), thinkingDelayMs = _s[0], setThinkingDelayMs = _s[1];
94
- var _t = useState(null), agentId = _t[0], setAgentId = _t[1];
95
- var _u = useState(false), agentLiveVoiceEnabled = _u[0], setAgentLiveVoiceEnabled = _u[1];
96
- var _v = useState(false), agentLiveVoiceReady = _v[0], setAgentLiveVoiceReady = _v[1];
97
- var _w = useState(null), availableLanguages = _w[0], setAvailableLanguages = _w[1];
98
- var _x = useState({}), chatInputMetadata = _x[0], setChatInputMetadata = _x[1];
99
- var _y = useState(false), isTakenOver = _y[0], setIsTakenOver = _y[1];
100
- var _z = useState(false), isFinalized = _z[0], setIsFinalized = _z[1];
94
+ // HITL form strings per locale ({ lang: { nodeId: slice } }) for live form re-localization.
95
+ var _t = useState({}), formNodeLocales = _t[0], setFormNodeLocales = _t[1];
96
+ var _u = useState(null), agentId = _u[0], setAgentId = _u[1];
97
+ var _v = useState(false), agentLiveVoiceEnabled = _v[0], setAgentLiveVoiceEnabled = _v[1];
98
+ var _w = useState(false), agentLiveVoiceReady = _w[0], setAgentLiveVoiceReady = _w[1];
99
+ var _x = useState(null), availableLanguages = _x[0], setAvailableLanguages = _x[1];
100
+ var _y = useState({}), chatInputMetadata = _y[0], setChatInputMetadata = _y[1];
101
+ var _z = useState(false), shouldTriggerStartForm = _z[0], setShouldTriggerStartForm = _z[1];
102
+ var _0 = useState(false), isTakenOver = _0[0], setIsTakenOver = _0[1];
103
+ var _1 = useState(false), isFinalized = _1[0], setIsFinalized = _1[1];
101
104
  var languageRef = useRef(language);
102
105
  languageRef.current = language;
103
106
  // Unified WebSocket connection (reconnect, keep-alive)
@@ -304,16 +307,16 @@ export var useChat = function (_a) {
304
307
  chatServiceRef.current.setServerUnavailableConfig(serverUnavailableMessage, serverUnavailableContactUrl, serverUnavailableContactLabel);
305
308
  var service_1 = chatServiceRef.current;
306
309
  void (function () { return __awaiter(void 0, void 0, void 0, function () {
307
- var info, lang, applied, meta;
308
- var _a, _b, _c, _d, _e, _f;
309
- return __generator(this, function (_g) {
310
- switch (_g.label) {
310
+ var info, lang, applied, nodeLocales, meta;
311
+ var _a, _b, _c, _d, _e, _f, _g;
312
+ return __generator(this, function (_h) {
313
+ switch (_h.label) {
311
314
  case 0: return [4 /*yield*/, Promise.all([
312
315
  (_b = (_a = service_1.fetchAgentInfo) === null || _a === void 0 ? void 0 : _a.call(service_1)) !== null && _b !== void 0 ? _b : Promise.resolve(null),
313
316
  (_d = (_c = service_1.fetchAgentChatLocales) === null || _c === void 0 ? void 0 : _c.call(service_1)) !== null && _d !== void 0 ? _d : Promise.resolve(null),
314
317
  ])];
315
318
  case 1:
316
- info = (_g.sent())[0];
319
+ info = (_h.sent())[0];
317
320
  // set available languages from the agent info
318
321
  if (info && Array.isArray(info.agent_available_languages)) {
319
322
  setAvailableLanguages(info.agent_available_languages);
@@ -334,13 +337,17 @@ export var useChat = function (_a) {
334
337
  setThinkingPhrases(applied.thinkingPhrases);
335
338
  setThinkingDelayMs(applied.thinkingDelayMs);
336
339
  }
337
- meta = (_e = service_1.getChatInputMetadata) === null || _e === void 0 ? void 0 : _e.call(service_1);
340
+ nodeLocales = (_e = service_1.getFormNodeLocales) === null || _e === void 0 ? void 0 : _e.call(service_1);
341
+ if (!cancelled && nodeLocales) {
342
+ setFormNodeLocales(nodeLocales);
343
+ }
344
+ meta = (_f = service_1.getChatInputMetadata) === null || _f === void 0 ? void 0 : _f.call(service_1);
338
345
  if (!cancelled &&
339
346
  meta &&
340
347
  typeof meta === "object" &&
341
348
  Object.keys(meta).length > 0) {
342
349
  setChatInputMetadata(meta);
343
- (_f = onConfigLoadedRef.current) === null || _f === void 0 ? void 0 : _f.call(onConfigLoadedRef, { chatInputMetadata: meta });
350
+ (_g = onConfigLoadedRef.current) === null || _g === void 0 ? void 0 : _g.call(onConfigLoadedRef, { chatInputMetadata: meta });
344
351
  }
345
352
  return [2 /*return*/];
346
353
  }
@@ -627,9 +634,9 @@ export var useChat = function (_a) {
627
634
  // Reset conversation
628
635
  var resetConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
629
636
  var key, convId, queries, welcome, thinking, langs, meta, error_1;
630
- var _a, _b, _c, _d, _e, _f, _g;
631
- return __generator(this, function (_h) {
632
- switch (_h.label) {
637
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
638
+ return __generator(this, function (_l) {
639
+ switch (_l.label) {
633
640
  case 0:
634
641
  if (!chatServiceRef.current) {
635
642
  return [2 /*return*/];
@@ -652,16 +659,16 @@ export var useChat = function (_a) {
652
659
  setIsFinalized(false);
653
660
  setIsTakenOver(false);
654
661
  setIsAgentTyping(false);
655
- _h.label = 1;
662
+ _l.label = 1;
656
663
  case 1:
657
- _h.trys.push([1, 3, 4, 5]);
664
+ _l.trys.push([1, 3, 4, 5]);
658
665
  // Reset the conversation in the chat service
659
666
  chatServiceRef.current.resetChatConversation();
660
667
  setConversationId(null);
661
668
  setGuestToken(null);
662
669
  return [4 /*yield*/, chatServiceRef.current.startConversation(reCaptchaToken)];
663
670
  case 2:
664
- convId = _h.sent();
671
+ convId = _l.sent();
665
672
  setConversationId(convId);
666
673
  setGuestToken(chatServiceRef.current.getGuestToken());
667
674
  setConnectionState("connected");
@@ -695,12 +702,13 @@ export var useChat = function (_a) {
695
702
  if (meta && typeof meta === "object" && Object.keys(meta).length > 0) {
696
703
  setChatInputMetadata(meta);
697
704
  }
698
- (_d = onConfigLoadedRef.current) === null || _d === void 0 ? void 0 : _d.call(onConfigLoadedRef, {
699
- chatInputMetadata: (_g = (_f = (_e = chatServiceRef.current).getChatInputMetadata) === null || _f === void 0 ? void 0 : _f.call(_e)) !== null && _g !== void 0 ? _g : {},
705
+ setShouldTriggerStartForm((_f = (_e = (_d = chatServiceRef.current).shouldTriggerStartForm) === null || _e === void 0 ? void 0 : _e.call(_d)) !== null && _f !== void 0 ? _f : false);
706
+ (_g = onConfigLoadedRef.current) === null || _g === void 0 ? void 0 : _g.call(onConfigLoadedRef, {
707
+ chatInputMetadata: (_k = (_j = (_h = chatServiceRef.current).getChatInputMetadata) === null || _j === void 0 ? void 0 : _j.call(_h)) !== null && _k !== void 0 ? _k : {},
700
708
  });
701
709
  return [3 /*break*/, 5];
702
710
  case 3:
703
- error_1 = _h.sent();
711
+ error_1 = _l.sent();
704
712
  setConnectionState("disconnected");
705
713
  setIsAgentTyping(false);
706
714
  if (onErrorRef.current && error_1 instanceof Error) {
@@ -874,18 +882,48 @@ export var useChat = function (_a) {
874
882
  }
875
883
  });
876
884
  }); }, [isTakenOver, isTokenExpiredError, resetToInitialState]);
885
+ // Invisible trigger that runs the workflow as the conversation opens so a Human In The
886
+ // Loop form (show_on_start, wired after Start) appears without a first user message.
887
+ var triggerStartForm = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
888
+ var error_5;
889
+ return __generator(this, function (_a) {
890
+ switch (_a.label) {
891
+ case 0:
892
+ if (!chatServiceRef.current)
893
+ return [2 /*return*/];
894
+ _a.label = 1;
895
+ case 1:
896
+ _a.trys.push([1, 3, , 4]);
897
+ if (!isTakenOver) {
898
+ setIsAgentTyping(true);
899
+ }
900
+ return [4 /*yield*/, chatServiceRef.current.sendStartFormTrigger(reCaptchaToken)];
901
+ case 2:
902
+ _a.sent();
903
+ return [3 /*break*/, 4];
904
+ case 3:
905
+ error_5 = _a.sent();
906
+ setIsAgentTyping(false);
907
+ if (isTokenExpiredError(error_5)) {
908
+ resetToInitialState();
909
+ }
910
+ return [3 /*break*/, 4];
911
+ case 4: return [2 /*return*/];
912
+ }
913
+ });
914
+ }); }, [isTakenOver, isTokenExpiredError, resetToInitialState]);
877
915
  var startConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
878
- var key, convId, queries, welcome, thinking, meta, error_5;
879
- var _a, _b, _c, _d, _e, _f, _g;
880
- return __generator(this, function (_h) {
881
- switch (_h.label) {
916
+ var key, convId, queries, welcome, thinking, meta, error_6;
917
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
918
+ return __generator(this, function (_l) {
919
+ switch (_l.label) {
882
920
  case 0:
883
921
  if (!chatServiceRef.current) {
884
922
  return [2 /*return*/];
885
923
  }
886
- _h.label = 1;
924
+ _l.label = 1;
887
925
  case 1:
888
- _h.trys.push([1, 3, 4, 5]);
926
+ _l.trys.push([1, 3, 4, 5]);
889
927
  setConnectionState("connecting");
890
928
  setIsLoading(true);
891
929
  // Reset state for new conversation
@@ -903,7 +941,7 @@ export var useChat = function (_a) {
903
941
  setGuestToken(null);
904
942
  return [4 /*yield*/, chatServiceRef.current.startConversation(reCaptchaToken)];
905
943
  case 2:
906
- convId = _h.sent();
944
+ convId = _l.sent();
907
945
  setConversationId(convId);
908
946
  setGuestToken(chatServiceRef.current.getGuestToken());
909
947
  setConnectionState("connected");
@@ -929,16 +967,17 @@ export var useChat = function (_a) {
929
967
  if (meta && typeof meta === "object" && Object.keys(meta).length > 0) {
930
968
  setChatInputMetadata(meta);
931
969
  }
932
- (_d = onConfigLoadedRef.current) === null || _d === void 0 ? void 0 : _d.call(onConfigLoadedRef, {
933
- chatInputMetadata: (_g = (_f = (_e = chatServiceRef.current).getChatInputMetadata) === null || _f === void 0 ? void 0 : _f.call(_e)) !== null && _g !== void 0 ? _g : {},
970
+ setShouldTriggerStartForm((_f = (_e = (_d = chatServiceRef.current).shouldTriggerStartForm) === null || _e === void 0 ? void 0 : _e.call(_d)) !== null && _f !== void 0 ? _f : false);
971
+ (_g = onConfigLoadedRef.current) === null || _g === void 0 ? void 0 : _g.call(onConfigLoadedRef, {
972
+ chatInputMetadata: (_k = (_j = (_h = chatServiceRef.current).getChatInputMetadata) === null || _j === void 0 ? void 0 : _j.call(_h)) !== null && _k !== void 0 ? _k : {},
934
973
  });
935
974
  return [3 /*break*/, 5];
936
975
  case 3:
937
- error_5 = _h.sent();
976
+ error_6 = _l.sent();
938
977
  setConnectionState("disconnected");
939
978
  setIsAgentTyping(false);
940
- if (onErrorRef.current && error_5 instanceof Error) {
941
- onErrorRef.current(error_5);
979
+ if (onErrorRef.current && error_6 instanceof Error) {
980
+ onErrorRef.current(error_6);
942
981
  }
943
982
  else {
944
983
  // ignore
@@ -953,7 +992,7 @@ export var useChat = function (_a) {
953
992
  }); }, []);
954
993
  // Add feedback to an agent message
955
994
  var addFeedback = useCallback(function (messageId, value, feedbackMessage) { return __awaiter(void 0, void 0, void 0, function () {
956
- var newFeedback_1, error_6;
995
+ var newFeedback_1, error_7;
957
996
  return __generator(this, function (_a) {
958
997
  switch (_a.label) {
959
998
  case 0:
@@ -986,9 +1025,9 @@ export var useChat = function (_a) {
986
1025
  });
987
1026
  return [3 /*break*/, 4];
988
1027
  case 3:
989
- error_6 = _a.sent();
1028
+ error_7 = _a.sent();
990
1029
  if (onErrorRef.current) {
991
- onErrorRef.current(error_6);
1030
+ onErrorRef.current(error_7);
992
1031
  }
993
1032
  return [3 /*break*/, 4];
994
1033
  case 4: return [2 /*return*/];
@@ -1003,6 +1042,8 @@ export var useChat = function (_a) {
1003
1042
  uploadFile: uploadFile,
1004
1043
  resetConversation: resetConversation,
1005
1044
  startConversation: startConversation,
1045
+ triggerStartForm: triggerStartForm,
1046
+ shouldTriggerStartForm: shouldTriggerStartForm,
1006
1047
  connectionState: connectionState,
1007
1048
  conversationId: conversationId,
1008
1049
  guestToken: guestToken,
@@ -1017,6 +1058,7 @@ export var useChat = function (_a) {
1017
1058
  inputDisclaimerHtml: inputDisclaimerHtml,
1018
1059
  thinkingPhrases: thinkingPhrases,
1019
1060
  thinkingDelayMs: thinkingDelayMs,
1061
+ formNodeLocales: formNodeLocales,
1020
1062
  availableLanguages: availableLanguages,
1021
1063
  chatInputMetadata: chatInputMetadata,
1022
1064
  agentId: agentId,
@@ -1024,4 +1066,4 @@ export var useChat = function (_a) {
1024
1066
  agentLiveVoiceReady: agentLiveVoiceReady,
1025
1067
  };
1026
1068
  };
1027
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFnQlQ7UUFmYixPQUFPLGFBQUEsRUFDUCxZQUFZLGtC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QUFBO1FBQ2Ysa0JBQWtCLG9CQUFBO1FBQ2xCLGlCQUFpQixtQkFBQTtRQUNqQixPQUFPLFNBQUE7UUFDUCxxQkFBcUIsdUJBQUE7UUFDckIsbUJBQW1CLHFCQUFBO0tBQ3BCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jaGF0U2VydmljZVwiO1xuaW1wb3J0IHsgdXNlQ2hhdFdlYlNvY2tldCB9IGZyb20gXCIuL3VzZUNoYXRXZWJTb2NrZXRcIjtcbmltcG9ydCB7XG4gIENoYXRNZXNzYWdlLFxuICBBdHRhY2htZW50LFxuICBNZXNzYWdlRmVlZGJhY2ssXG4gIEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2hhdFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICB3ZWJzb2NrZXRVcmw/OiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLy8gIElmIGZhbHNlLCB0aGUgY2hhdCB3aWxsIHJ1biBpbiBIVFRQLW9ubHkgbW9kZSAobm8gV2ViU29ja2V0IGNvbm5lY3Rpb24pLlxuICB1c2VXcz86IGJvb2xlYW47XG4gIHVzZVBvbGw/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlPzogc3RyaW5nOyAvLyBDdXN0b20gbWVzc2FnZSB3aGVuIHNlcnZlciBpcyBkb3duXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybD86IHN0cmluZzsgLy8gT3B0aW9uYWwgVVJMIGZvciBjb250YWN0L3N1cHBvcnRcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWw/OiBzdHJpbmc7IC8vIExhYmVsIGZvciB0aGUgY29udGFjdCBsaW5rXG4gIG9uQ29uZmlnTG9hZGVkPzogKHByb3BzOiB7IGNoYXRJbnB1dE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB9KSA9PiB2b2lkOyAvLyBDYWxsYmFjayBmb3Igd2hlbiB0aGUgY2hhdCBpbnB1dCBtZXRhZGF0YSBpcyBsb2FkZWRcbn1cblxuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSA9XG4gIFwiVGhlIHNlcnZpY2UgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCI7XG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9DT05UQUNUX0xBQkVMID0gXCJDb250YWN0IHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gIC8vIE5vIHJlc3BvbnNlID0gbmV0d29yayBlcnJvclxuICBpZiAoIWVycm9yLnJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IFwiRVJSX05FVFdPUktcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFVElNRURPVVRcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFUlJfQ09OTkVDVElPTl9SRUZVU0VEXCJcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IHJlcXVlc3QgZXJyb3Igd2l0aG91dCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHNlcnZlci9uZXR3b3JrIGlzc3VlXG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgc3RhdHVzID49IDUwMDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoe1xuICBiYXNlVXJsLFxuICB3ZWJzb2NrZXRVcmwsXG4gIGFwaUtleSxcbiAgdGVuYW50LFxuICBtZXRhZGF0YSxcbiAgdXNlV3MgPSB0cnVlLFxuICB1c2VQb2xsID0gZmFsc2UsXG4gIGxhbmd1YWdlLFxuICBvbkVycm9yLFxuICBvblRha2VvdmVyLFxuICBvbkZpbmFsaXplLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIG9uQ29uZmlnTG9hZGVkLFxufTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPFxuICAgIEF0dGFjaG1lbnRbXVxuICA+KFtdKTtcbiAgY29uc3QgW2Nvbm5lY3Rpb25TdGF0ZSwgc2V0Q29ubmVjdGlvblN0YXRlXSA9IHVzZVN0YXRlPFxuICAgIFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCJcbiAgPihcImRpc2Nvbm5lY3RlZFwiKTtcbiAgY29uc3QgW2lzQWdlbnRUeXBpbmcsIHNldElzQWdlbnRUeXBpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBjaGF0U2VydmljZVJlZiA9IHVzZVJlZjxDaGF0U2VydmljZSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY29udmVyc2F0aW9uSWQsIHNldENvbnZlcnNhdGlvbklkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZ3Vlc3RUb2tlbiwgc2V0R3Vlc3RUb2tlbl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Bvc3NpYmxlUXVlcmllcywgc2V0UG9zc2libGVRdWVyaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt3ZWxjb21lVGl0bGUsIHNldFdlbGNvbWVUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVJbWFnZVVybCwgc2V0V2VsY29tZUltYWdlVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZU1lc3NhZ2UsIHNldFdlbGNvbWVNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaW5wdXREaXNjbGFpbWVySHRtbCwgc2V0SW5wdXREaXNjbGFpbWVySHRtbF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbYWdlbnRJZCwgc2V0QWdlbnRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2FnZW50TGl2ZVZvaWNlRW5hYmxlZCwgc2V0QWdlbnRMaXZlVm9pY2VFbmFibGVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2FnZW50TGl2ZVZvaWNlUmVhZHksIHNldEFnZW50TGl2ZVZvaWNlUmVhZHldID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbYXZhaWxhYmxlTGFuZ3VhZ2VzLCBzZXRBdmFpbGFibGVMYW5ndWFnZXNdID0gdXNlU3RhdGU8c3RyaW5nW10gfCBudWxsPihcbiAgICBudWxsLFxuICApO1xuICBjb25zdCBbY2hhdElucHV0TWV0YWRhdGEsIHNldENoYXRJbnB1dE1ldGFkYXRhXSA9IHVzZVN0YXRlPFxuICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID4oe30pO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VSZWYgPSB1c2VSZWYobGFuZ3VhZ2UpO1xuICBsYW5ndWFnZVJlZi5jdXJyZW50ID0gbGFuZ3VhZ2U7XG5cbiAgLy8gVW5pZmllZCBXZWJTb2NrZXQgY29ubmVjdGlvbiAocmVjb25uZWN0LCBrZWVwLWFsaXZlKVxuICBjb25zdCBvbldzTWVzc2FnZSA9IHVzZUNhbGxiYWNrKChkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnByb2Nlc3NXZWJTb2NrZXRNZXNzYWdlKGRhdGEpO1xuICB9LCBbXSk7XG5cbiAgdXNlQ2hhdFdlYlNvY2tldCh7XG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHVzZVdzOiB1c2VXcyA/PyB0cnVlLFxuICAgIGxhbmd1YWdlLFxuICAgIG9uTWVzc2FnZTogb25Xc01lc3NhZ2UsXG4gICAgb25Db25uZWN0aW9uU3RhdGU6IHNldENvbm5lY3Rpb25TdGF0ZSxcbiAgICByZWNvbm5lY3Q6IHRydWUsXG4gIH0pO1xuXG4gIC8vIFNjb3BlZCBtZXNzYWdlcyBrZXkgZm9yIGFwaUtleSwgY29udmVyc2F0aW9JZFxuICBjb25zdCBidWlsZE1lc3NhZ2VzS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFwaUtleVZhbDogc3RyaW5nLCBjb252SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgIGlmICghY29udklkKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBgZ2VuYXNzaXN0X2NvbnZlcnNhdGlvbl9tZXNzYWdlczoke2FwaUtleVZhbH06JHtjb252SWR9YDtcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHZhbGlkYXRlTWVzc2FnZXMgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pID0+IHtcbiAgICAgIGNvbnN0IGhhc1Rha2VPdmVyTXNnID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbT8udHlwZSA9PT0gXCJ0YWtlb3ZlclwiKTtcbiAgICAgIGNvbnN0IGhhc0ZpbmFsaXplZE1zZyA9IG1lc3NhZ2VzLnNvbWUoKG0pID0+IG0/LnR5cGUgPT09IFwiZmluYWxpemVkXCIpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoaGFzVGFrZU92ZXJNc2cpO1xuICAgICAgc2V0SXNGaW5hbGl6ZWQoaGFzRmluYWxpemVkTXNnKTtcbiAgICB9LFxuICAgIFtzZXRJc1Rha2VuT3Zlciwgc2V0SXNGaW5hbGl6ZWRdLFxuICApO1xuXG4gIC8vIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgdG9rZW4gZXhwaXJhdGlvbiBlcnJvciAoNDAxICsgXCJUb2tlbiBoYXMgZXhwaXJlZC5cIilcbiAgY29uc3QgaXNUb2tlbkV4cGlyZWRFcnJvciA9IHVzZUNhbGxiYWNrKChlcnJvcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMSAmJlxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5pbmNsdWRlcyhcIlRva2VuIGhhcyBleHBpcmVkXCIpKSlcbiAgICApO1xuICB9LCBbXSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uIHN0YXRlIHRvIGluaXRpYWwgKGUuZy4gYWZ0ZXIgdG9rZW4gZXhwaXJhdGlvbilcbiAgY29uc3QgcmVzZXRUb0luaXRpYWxTdGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRDb252ZXJzYXRpb25JZChudWxsKTtcbiAgICBzZXRHdWVzdFRva2VuKG51bGwpO1xuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbChudWxsKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKHt9KTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gRGVlcCBjb21wYXJlIG1ldGFkYXRhIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtaW5pdGlhbGl6YXRpb25zXG4gIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBpZiBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VzIChieSB2YWx1ZSwgbm90IHJlZmVyZW5jZSlcbiAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB1c2VNZW1vKFxuICAgICgpID0+IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhIHx8IHt9KSxcbiAgICBbbWV0YWRhdGFdLFxuICApO1xuICBjb25zdCBwcmV2QmFzZVVybFJlZiA9IHVzZVJlZjxzdHJpbmc+KGJhc2VVcmwpO1xuICBjb25zdCBwcmV2V2Vic29ja2V0VXJsUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4od2Vic29ja2V0VXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuICBjb25zdCBwcmV2VXNlUG9sbFJlZiA9IHVzZVJlZjxib29sZWFuPih1c2VQb2xsKTtcblxuICAvLyBIZWFydGJlYXQgcG9sbGluZyBzdGF0ZSAod2hlbiBXZWJTb2NrZXQgaXMgZGlzYWJsZWQpXG4gIGNvbnN0IGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBoZWFydGJlYXRJbnRlcnZhbFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICAvLyBSZWZzIHNvIHdlIG9ubHkgcnVuIHRha2VvdmVyL2ZpbmFsaXplZCBvbmNlIHBlciBjb252ZXJzYXRpb24gKGF2b2lkIHN0YWxlIGlzVGFrZW5PdmVyL2lzRmluYWxpemVkIGluIHBvbGwgY2xvc3VyZSlcbiAgY29uc3QgdGFrZW92ZXJQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuICBjb25zdCBvbkNvbmZpZ0xvYWRlZFJlZiA9IHVzZVJlZihvbkNvbmZpZ0xvYWRlZCk7XG5cbiAgLy8gVXBkYXRlIGNhbGxiYWNrIHJlZnMgd2hlbiB0aGV5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRXJyb3JSZWYuY3VycmVudCA9IG9uRXJyb3I7XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQgPSBvblRha2VvdmVyO1xuICB9LCBbb25UYWtlb3Zlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50ID0gb25GaW5hbGl6ZTtcbiAgfSwgW29uRmluYWxpemVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQgPSBvbkNvbmZpZ0xvYWRlZDtcbiAgfSwgW29uQ29uZmlnTG9hZGVkXSk7XG5cbiAgLy8gU3luYyBtZXRhZGF0YSAoZS5nLiBgbGFuZ3VhZ2VgIGZvciBvdXRib3VuZCByZXF1ZXN0cykgd2l0aG91dCBjYW5jZWxsaW5nIGJvb3RzdHJhcCBvciByZWNyZWF0aW5nIHRoZSBzZXJ2aWNlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICB9LCBbbWV0YWRhdGFTdHJpbmcsIG1ldGFkYXRhXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gY29ubmVjdGlvbi1yZWxhdGVkIGlucHV0cyBjaGFuZ2UgKG5vdCBsYW5ndWFnZS9tZXRhZGF0YSDigJQgdGhvc2UgY2FuY2VsIGluLWZsaWdodCBsb2NhbGUgZmV0Y2gpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGJhc2VVcmxDaGFuZ2VkID0gcHJldkJhc2VVcmxSZWYuY3VycmVudCAhPT0gYmFzZVVybDtcbiAgICBjb25zdCB3ZWJzb2NrZXRVcmxDaGFuZ2VkID0gcHJldldlYnNvY2tldFVybFJlZi5jdXJyZW50ICE9PSB3ZWJzb2NrZXRVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgY29uc3QgdXNlUG9sbENoYW5nZWQgPSBwcmV2VXNlUG9sbFJlZi5jdXJyZW50ICE9PSB1c2VQb2xsO1xuICAgIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBmb3IgY29ubmVjdGlvbi1yZWxhdGVkIGNoYW5nZXMsIE5PVCBmb3IgbWV0YWRhdGEgY2hhbmdlc1xuICAgIGNvbnN0IG5lZWRzUmVpbml0ID1cbiAgICAgICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8XG4gICAgICBiYXNlVXJsQ2hhbmdlZCB8fFxuICAgICAgd2Vic29ja2V0VXJsQ2hhbmdlZCB8fFxuICAgICAgYXBpS2V5Q2hhbmdlZCB8fFxuICAgICAgdGVuYW50Q2hhbmdlZCB8fFxuICAgICAgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmICh3ZWJzb2NrZXRVcmxDaGFuZ2VkKSBwcmV2V2Vic29ja2V0VXJsUmVmLmN1cnJlbnQgPSB3ZWJzb2NrZXRVcmw7XG4gICAgICBpZiAoYXBpS2V5Q2hhbmdlZCkgcHJldkFwaUtleVJlZi5jdXJyZW50ID0gYXBpS2V5O1xuICAgICAgaWYgKHRlbmFudENoYW5nZWQpIHByZXZUZW5hbnRSZWYuY3VycmVudCA9IHRlbmFudDtcbiAgICAgIGlmICh1c2VXc0NoYW5nZWQpIHByZXZVc2VXc1JlZi5jdXJyZW50ID0gdXNlV3M7XG4gICAgICBpZiAodXNlUG9sbENoYW5nZWQpIHByZXZVc2VQb2xsUmVmLmN1cnJlbnQgPSB1c2VQb2xsO1xuXG4gICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBzZXJ2aWNlIGlmIGl0IGV4aXN0c1xuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKCgpID0+IHt9KTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50ID0gbmV3IENoYXRTZXJ2aWNlKFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgICB3ZWJzb2NrZXRVcmwsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHVzZVdzLFxuICAgICAgICB1c2VQb2xsLFxuICAgICAgKTtcbiAgICAgIHNldEF2YWlsYWJsZUxhbmd1YWdlcyhudWxsKTtcblxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTpcbiAgICAgICAgICAgICFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYWNrIGxhdGVzdCBjcmVhdGVfdGltZSB3ZSd2ZSBzZWVuIGZyb20gc2VydmVyL3dlYnNvY2tldCAoaW4gc2Vjb25kcylcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lICYmIG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lID4gMCkge1xuICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIG1lc3NhZ2UgdG8gbWVzc2FnZXMgYXJyYXlcbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXZNZXNzYWdlcykgPT4ge1xuICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbWVzc2FnZXMgd2l0aCBzYW1lIG1lc3NhZ2VfaWQgYW5kIHR5cGVcbiAgICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gcHJldk1lc3NhZ2VzLnNvbWUoKG0pID0+IG0ubWVzc2FnZV9pZCA9PT0gbm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2TWVzc2FnZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwiYWdlbnRcIiB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwic3BlY2lhbFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKGRhdGEuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgaWYgKGRhdGEucG9zc2libGVRdWVyaWVzICYmIGRhdGEucG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoZGF0YS5wb3NzaWJsZVF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRTZXJ2ZXJVbmF2YWlsYWJsZUNvbmZpZyhcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VydmljZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtpbmZvXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBzZXJ2aWNlLmZldGNoQWdlbnRJbmZvPy4oKSA/PyBQcm9taXNlLnJlc29sdmUobnVsbCksXG4gICAgICAgICAgc2VydmljZS5mZXRjaEFnZW50Q2hhdExvY2FsZXM/LigpID8/IFByb21pc2UucmVzb2x2ZShudWxsKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gc2V0IGF2YWlsYWJsZSBsYW5ndWFnZXMgZnJvbSB0aGUgYWdlbnQgaW5mb1xuICAgICAgICBpZiAoaW5mbyAmJiBBcnJheS5pc0FycmF5KGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcykpIHtcbiAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mbz8uYWdlbnRfaWQpIHtcbiAgICAgICAgICBzZXRBZ2VudElkKGluZm8uYWdlbnRfaWQpO1xuICAgICAgICB9XG4gICAgICAgIHNldEFnZW50TGl2ZVZvaWNlRW5hYmxlZChpbmZvPy5saXZlX3ZvaWNlX2VuYWJsZWQgPT09IHRydWUpO1xuICAgICAgICBzZXRBZ2VudExpdmVWb2ljZVJlYWR5KGluZm8/LmxpdmVfdm9pY2VfcmVhZHkgPT09IHRydWUpO1xuXG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGluZm8gJiYgQXJyYXkuaXNBcnJheShpbmZvLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpKSB7XG4gICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlUmVmLmN1cnJlbnQgfHwgXCJlblwiO1xuICAgICAgICBjb25zdCBhcHBsaWVkID0gc2VydmljZS5hcHBseUxhbmd1YWdlRnJvbUxvY2FsZXMobGFuZyk7XG4gICAgICAgIGlmICghY2FuY2VsbGVkICYmIGFwcGxpZWQpIHtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXMoYXBwbGllZC50aGlua2luZ1BocmFzZXMpO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyhhcHBsaWVkLnRoaW5raW5nRGVsYXlNcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHNlcnZpY2UuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWNhbmNlbGxlZCAmJlxuICAgICAgICAgIG1ldGEgJiZcbiAgICAgICAgICB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHsgY2hhdElucHV0TWV0YWRhdGE6IG1ldGEgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBhIHNhdmVkIGNvbnZlcnNhdGlvblxuICAgICAgY29uc3QgY29udklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDb252ZXJzYXRpb25JZCgpO1xuICAgICAgaWYgKGNvbnZJZCkge1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0R3Vlc3RUb2tlbigpKTtcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuaXNDb252ZXJzYXRpb25GaW5hbGl6ZWQoKSkge1xuICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VXcykge1xuICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUHVsbCBpbml0aWFsIHN0YXRpYyBkYXRhXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAocXVlcmllcy5sZW5ndGgpIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGE/LigpO1xuICAgICAgICBpZiAod2VsY29tZSkge1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKHdlbGNvbWUuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWc/LigpO1xuICAgICAgICBpZiAodGhpbmtpbmcpIHtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFuZ3MgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldEF2YWlsYWJsZUxhbmd1YWdlcz8uKCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhbmdzKSkge1xuICAgICAgICAgIHNldEF2YWlsYWJsZUxhbmd1YWdlcyhsYW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHsgY2hhdElucHV0TWV0YWRhdGE6IG1ldGEgPz8ge30gfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIHVwZGF0ZSBoYW5kbGVycyB3aGVuIGNhbGxiYWNrcyBjaGFuZ2UgKHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nKVxuICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFRha2VvdmVySGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uVGFrZW92ZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRGaW5hbGl6ZWRIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25GaW5hbGl6ZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsZWFudXAgb25seSBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgfSwgW1xuICAgIGJhc2VVcmwsXG4gICAgd2Vic29ja2V0VXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgdXNlV3MsXG4gICAgdXNlUG9sbCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBdKTtcblxuICAvLyBXaGVuIHRoZSBwbHVnaW4gbGFuZ3VhZ2UgY2hhbmdlczogdXBkYXRlIEFjY2VwdC1MYW5ndWFnZSBhbmQgYXBwbHkgdGhlIGFnZW50IGxvY2FsZSBidW5kbGUgKGZyb20gZmV0Y2hBZ2VudENoYXRMb2NhbGVzKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHN2YyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFzdmMpIHJldHVybjtcbiAgICBzdmMuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIGNvbnN0IGxhbmcgPSBsYW5ndWFnZSB8fCBcImVuXCI7XG4gICAgY29uc3QgYXBwbGllZCA9IHN2Yy5hcHBseUxhbmd1YWdlRnJvbUxvY2FsZXMobGFuZyk7XG4gICAgaWYgKGFwcGxpZWQpIHtcbiAgICAgIHNldFRoaW5raW5nUGhyYXNlcyhhcHBsaWVkLnRoaW5raW5nUGhyYXNlcyk7XG4gICAgICBzZXRUaGlua2luZ0RlbGF5TXMoYXBwbGllZC50aGlua2luZ0RlbGF5TXMpO1xuICAgIH1cbiAgfSwgW2xhbmd1YWdlXSk7XG5cbiAgLy8gTG9hZCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyIHdoZW4gYXZhaWxhYmxlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgY29uc3QgcGFyc2VkOiBDaGF0TWVzc2FnZVtdID0gc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogW107XG5cbiAgICAgIHNldE1lc3NhZ2VzKHBhcnNlZCk7XG4gICAgICAvLyBJbml0aWFsaXplIGxhc3Qgc2VlbiBjcmVhdGVfdGltZSBmcm9tIGNhY2hlZCBtZXNzYWdlc1xuICAgICAgaWYgKHBhcnNlZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWF4Q3JlYXRlVGltZSA9IE1hdGgubWF4KFxuICAgICAgICAgIC4uLnBhcnNlZC5tYXAoKG0pID0+IChtLmNyZWF0ZV90aW1lID8gbS5jcmVhdGVfdGltZSA6IDApKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGxhc3Qgc2VlbiBjcmVhdGVfdGltZSBmcm9tIGNhY2hlZCBtZXNzYWdlc1xuICAgICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gTWF0aC5yb3VuZChtYXhDcmVhdGVUaW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gVmFsaWRhdGUgbWVzc2FnZXMgZm9yIHRha2VvdmVyIGFuZCBmaW5hbGl6ZWRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzKTtcbiAgfSwgW21lc3NhZ2VzXSk7XG5cbiAgLy8gUGVyc2lzdCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBhcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gSGVhcnRiZWF0IGxvbmcgcG9sbGluZyB3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZCBhbmQgd2UgaGF2ZSBhbiBpbi1wcm9ncmVzcyBjb252ZXJzYXRpb24uXG4gIC8vIC0gU3RhcnRzIHdpdGggYSBzaG9ydCBpbnRlcnZhbFxuICAvLyAtIEluY3JlYXNlcyB0aGUgaW50ZXJ2YWwgb3ZlciB0aW1lIChldmVyeSBzdWNjZXNzZnVsIHBvbGwpXG4gIC8vIC0gUmV0cmllcyB1cCB0byA1IHRpbWVzIG9uIGVycm9ycywgdGhlbiBzdG9wc1xuICBjb25zdCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUyA9IDIwMDA7XG4gIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TID0gNTAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyA9IDMwMDAwO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHVzZVdzIHx8ICFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCkgcmV0dXJuO1xuICAgIGNvbnN0IHN2YyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFzdmMpIHJldHVybjtcblxuICAgIC8vIFJlc2V0IHBlci1jb252ZXJzYXRpb24gZmxhZ3Mgc28gd2Ugb25seSBub3RpZnkgdGFrZW92ZXIvZmluYWxpemVkIG9uY2VcbiAgICB0YWtlb3ZlclByb2Nlc3NlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZW91dElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHNjaGVkdWxlTmV4dCA9IChkZWxheU1zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHBvbGwsIGRlbGF5TXMpO1xuICAgIH07XG5cbiAgICBjb25zdCBwb2xsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIHBvbGxNZXNzYWdlcyB9ID0gYXdhaXQgc3ZjLnBvbGxJblByb2dyZXNzQ29udmVyc2F0aW9uKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcblxuICAgICAgICAvLyBSZXNldCBmYWlsdXJlIGNvdW50ZXIgb24gc3VjY2Vzc1xuICAgICAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA9IDA7XG5cbiAgICAgICAgLy8gT25seSB0YWtlIG1lc3NhZ2VzIG5ld2VyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdCBzZWVuIGNyZWF0ZV90aW1lIChzZWNvbmRzKS5cbiAgICAgICAgLy8gVXNlIHNlY29uZHMgY29uc2lzdGVudGx5OiBwb2xsIG1lc3NhZ2VzIGFyZSBub3JtYWxpemVkIHRvIHNlY29uZHMgaW4gY2hhdFNlcnZpY2UuXG4gICAgICAgIGNvbnN0IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lID0gTWF0aC5mbG9vcihOdW1iZXIobGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCkgfHwgMCk7XG5cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXNSYXcgPSAocG9sbE1lc3NhZ2VzIHx8IFtdKS5maWx0ZXIoKG0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdCA9IE51bWJlcigobSBhcyBhbnkpLmNyZWF0ZV90aW1lKTtcbiAgICAgICAgICBpZiAoY3QgPT09IDAgfHwgIU51bWJlci5pc0Zpbml0ZShjdCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gY3QgPiBsYXN0U2VydmVyQ3JlYXRlVGltZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5ld01lc3NhZ2VzUmF3Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzcGVha2VyVHlwZSA9IChzcGVha2VyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImN1c3RvbWVyXCIpIHJldHVybiBcImN1c3RvbWVyXCI7XG4gICAgICAgICAgICBpZiAoc3BlYWtlciA9PT0gXCJhZ2VudFwiKSByZXR1cm4gXCJhZ2VudFwiO1xuICAgICAgICAgICAgcmV0dXJuIFwic3BlY2lhbFwiO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gKG06IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG0udHlwZSA9PT0gXCJ0YWtlb3ZlclwiKSByZXR1cm4gXCJTdXBlcnZpc29yIHRvb2sgb3ZlclwiO1xuICAgICAgICAgICAgaWYgKG0udHlwZSA9PT0gXCJmaW5hbGl6ZWRcIikgcmV0dXJuIFwiQ29udmVyc2F0aW9uIEZpbmFsaXplZFwiO1xuICAgICAgICAgICAgcmV0dXJuIChtIGFzIGFueSkudGV4dDtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXM6IENoYXRNZXNzYWdlW10gPSBuZXdNZXNzYWdlc1Jhdy5tYXAoKG0pID0+ICh7XG4gICAgICAgICAgICBtZXNzYWdlX2lkOiAobSBhcyBhbnkpLmlkLFxuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IE51bWJlcigobSBhcyBhbnkpLmNyZWF0ZV90aW1lKSxcbiAgICAgICAgICAgIHN0YXJ0X3RpbWU6IE51bWJlcigobSBhcyBhbnkpLnN0YXJ0X3RpbWUgPz8gMCksXG4gICAgICAgICAgICBlbmRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuZW5kX3RpbWUgPz8gMCksXG4gICAgICAgICAgICBzcGVha2VyOiBzcGVha2VyVHlwZSgobSBhcyBhbnkpLnNwZWFrZXIpLFxuICAgICAgICAgICAgdGV4dDogdGV4dChtKSxcbiAgICAgICAgICAgIHR5cGU6IChtIGFzIGFueSkudHlwZSxcbiAgICAgICAgICAgIGZlZWRiYWNrOiAobSBhcyBhbnkpLmZlZWRiYWNrLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIC8vIEFwcGVuZCBvbmx5IG1lc3NhZ2VzIHdlIGRvbid0IGFscmVhZHkgaGF2ZSAoZGVkdXBlIGJ5IG1lc3NhZ2VfaWQ7IHNhbWUgY3JlYXRlX3RpbWUgY2FuIHJlcGVhdCBldmVyeSBwb2xsKVxuICAgICAgICAgIGlmIChuZXdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRNZXNzYWdlcygocHJldk1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICBwcmV2TWVzc2FnZXMubWFwKChtKSA9PiBtLm1lc3NhZ2VfaWQpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgdG9BZGQgPSBuZXdNZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0ubWVzc2FnZV9pZCA9PSBudWxsIHx8ICFleGlzdGluZ0lkcy5oYXMobS5tZXNzYWdlX2lkKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHRvQWRkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHByZXZNZXNzYWdlcztcbiAgICAgICAgICAgICAgY29uc3QgbWF4Q3JlYXRlVGltZUZyb21Qb2xsID0gdG9BZGQucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXgsIG1zZykgPT5cbiAgICAgICAgICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtc2cuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgICAgICAgID8gTWF0aC5tYXgobWF4LCBtc2cuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgICAgICAgIDogbWF4LFxuICAgICAgICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBtYXhDcmVhdGVUaW1lRnJvbVBvbGw7XG4gICAgICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCAuLi50b0FkZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBuZXcgbWVzc2FnZXMgZm9yIHRha2VvdmVyL2ZpbmFsaXplIG1hcmtlcnNcbiAgICAgICAgICBjb25zdCBoYXNUYWtlb3Zlck1lc3NhZ2UgPSBuZXdNZXNzYWdlcy5zb21lKFxuICAgICAgICAgICAgKG0pID0+IG0udHlwZSA9PT0gXCJ0YWtlb3ZlclwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaGFzRmluYWxpemVkTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcImZpbmFsaXplZFwiLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIiB8fCBoYXNGaW5hbGl6ZWRNZXNzYWdlKSAmJiAhZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZpbmFsaXplZFByb2Nlc3NlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKHN0YXR1cyA9PT0gXCJ0YWtlb3ZlclwiIHx8IGhhc1Rha2VvdmVyTWVzc2FnZSkgJiYgIXRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIG5ldyBtZXNzYWdlczsgc3RpbGwgaG9ub3Igc3RhdHVzIGlmIGl0IGluZGljYXRlcyBhIHRlcm1pbmFsIHN0YXRlIChvbmNlIHBlciBjb252ZXJzYXRpb24pXG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIiAmJiAhZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZpbmFsaXplZFByb2Nlc3NlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHN2Yy5oYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTtcbiAgICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcInRha2VvdmVyXCIgJiYgIXRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLm5vdGlmeVRha2VvdmVyRnJvbVBvbGwoKTtcbiAgICAgICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwiZmluYWxpemVkXCIpIHtcbiAgICAgICAgICAvLyBNYXJrIGZpbmFsaXplZCBhbmQgbGV0IHRoZSBlZmZlY3QgY2xlYW51cCBwcmV2ZW50IGZ1cnRoZXIgc2NoZWR1bGluZ1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlYXNlIHBvbGxpbmcgaW50ZXJ2YWwgb3ZlciB0aW1lIG9uIHN1Y2Nlc3NcbiAgICAgICAgLy8gY29uc3QgbmV4dEludGVydmFsID0gTWF0aC5taW4oXG4gICAgICAgIC8vICAgKGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVMpICtcbiAgICAgICAgLy8gICAgIEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TLFxuICAgICAgICAvLyAgIEhFQVJUQkVBVF9NQVhfSU5URVJWQUxfTVMsXG4gICAgICAgIC8vICk7XG4gICAgICAgIGNvbnN0IG5leHRJbnRlcnZhbCA9IEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TO1xuICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gbmV4dEludGVydmFsO1xuICAgICAgICBzY2hlZHVsZU5leHQobmV4dEludGVydmFsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIC8vIEluY3JlbWVudCBmYWlsdXJlIGNvdW50ZXIgYW5kIHN0b3AgYWZ0ZXIgNSBjb25zZWN1dGl2ZSBmYWlsdXJlc1xuICAgICAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCArPSAxO1xuICAgICAgICBpZiAoaGVhcnRiZWF0RmFpbHVyZUNvdW50UmVmLmN1cnJlbnQgPj0gNSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXRyeURlbGF5ID1cbiAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50IHx8IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TO1xuICAgICAgICBzY2hlZHVsZU5leHQocmV0cnlEZWxheSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzIGZvciB0aGlzIGNvbnZlcnNhdGlvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHlcbiAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA9IDA7XG4gICAgaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCA9IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TO1xuXG4gICAgaWYgKHVzZVBvbGwgJiYgIXVzZVdzKSB7XG4gICAgICBwb2xsKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICBpZiAodGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFt1c2VXcywgY29udmVyc2F0aW9uSWQsIGlzRmluYWxpemVkLCB1c2VQb2xsXSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uXG4gIGNvbnN0IHJlc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICAgIHNldFdlbGNvbWVNZXNzYWdlKG51bGwpO1xuICAgICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbChudWxsKTtcbiAgICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9XG4gICAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIGNvbnZlcnNhdGlvbiBpbiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKG51bGwpO1xuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgICBjb25zdCBjb252SWQgPVxuICAgICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0R3Vlc3RUb2tlbigpKTtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuXG4gICAgICAgIC8vIEdldCBwb3NzaWJsZSBxdWVyaWVzIGZyb20gQVBJIHJlc3BvbnNlXG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB3ZWxjb21lIGFuZCB0aGlua2luZyBkYXRhXG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbCh3ZWxjb21lLmlucHV0RGlzY2xhaW1lckh0bWwgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgY29uc3QgbGFuZ3MgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldEF2YWlsYWJsZUxhbmd1YWdlcygpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhbmdzKSkge1xuICAgICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGxhbmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICBjaGF0SW5wdXRNZXRhZGF0YTpcbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpID8/IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCB1cGxvYWRGaWxlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPEF0dGFjaG1lbnQgfCBudWxsPiA9PiB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50Py51cGxvYWRGaWxlKFxuICAgICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHRoZSBmaWxlIHVybCB3aXRoIHRoZSBiYXNlIHVybFxuICAgICAgICBjb25zdCBmaWxlX3VybCA9IG5ldyBVUkwodXBsb2FkUmVzdWx0IS5maWxlX3VybCEsIGJhc2VVcmwpLmhyZWY7XG5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudDogQXR0YWNobWVudCA9IHtcbiAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICB1cmw6IGZpbGVfdXJsLFxuICAgICAgICAgIGZpbGVfaWQ6IHVwbG9hZFJlc3VsdD8uZmlsZV9pZCxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cygocHJldikgPT4gWy4uLnByZXYsIGF0dGFjaG1lbnRdKTtcbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGFwaUtleSxcbiAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgYnVpbGRNZXNzYWdlc0tleSxcbiAgICAgIGlzVG9rZW5FeHBpcmVkRXJyb3IsXG4gICAgICByZXNldFRvSW5pdGlhbFN0YXRlLFxuICAgIF0sXG4gICk7XG5cbiAgLy8gU2VuZCBtZXNzYWdlXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgZmlsZXM6IEZpbGVbXSA9IFtdLFxuICAgICAgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICByZUNhcHRjaGFUb2tlbj86IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlcyA9IGZpbGVzXG4gICAgICAgICAgICAubWFwKChmKSA9PlxuICAgICAgICAgICAgICBwcmVsb2FkZWRBdHRhY2htZW50cy5maW5kKFxuICAgICAgICAgICAgICAgIChwYSkgPT4gcGEubmFtZSA9PT0gZi5uYW1lICYmIHBhLnNpemUgPT09IGYuc2l6ZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgQXR0YWNobWVudFtdO1xuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLnB1c2goLi4udXBsb2FkZWRGaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB0eXBpbmcgaW1tZWRpYXRlbHkgd2hlbiB1c2VyIHNlbmRzLCB1bmxlc3MgY29udmVyc2F0aW9uIGlzIHRha2VuIG92ZXIgYnkgYSBodW1hblxuICAgICAgICBpZiAoIWlzVGFrZW5PdmVyKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2VuZE1lc3NhZ2UoXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBuZXdBdHRhY2htZW50cyxcbiAgICAgICAgICBleHRyYU1ldGFkYXRhLFxuICAgICAgICAgIHJlQ2FwdGNoYVRva2VuLFxuICAgICAgICApO1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKFtdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yKSkge1xuICAgICAgICAgIC8vIFNob3cgY3VzdG9tIHNlcnZlci11bmF2YWlsYWJsZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3JlYXRlVGltZSA9XG4gICAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5nZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk7XG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gY3JlYXRlVGltZSAhPSBudWxsID8gbm93IC0gY3JlYXRlVGltZSA6IDA7XG4gICAgICAgICAgY29uc3QgZW5kVGltZSA9IHN0YXJ0VGltZSArIDAuMDE7XG4gICAgICAgICAgY29uc3Qgc3BlY2lhbE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgIHN0YXJ0X3RpbWU6IHN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBlbmRUaW1lLFxuICAgICAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSxcbiAgICAgICAgICAgIC4uLihzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgJiYge1xuICAgICAgICAgICAgICBsaW5rVXJsOiBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICAgICAgICAgIGxpbmtMYWJlbDpcbiAgICAgICAgICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX0NPTlRBQ1RfTEFCRUwsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2V0TWVzc2FnZXMoKHByZXYpID0+IFsuLi5wcmV2LCBzcGVjaWFsTWVzc2FnZV0pO1xuICAgICAgICAgIC8vIERvbid0IGNhbGwgb25FcnJvciBzbyB0aGUgdXNlciBvbmx5IHNlZXMgb3VyIGN1c3RvbSBtZXNzYWdlXG4gICAgICAgIH0gZWxzZSBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgcHJlbG9hZGVkQXR0YWNobWVudHMsXG4gICAgICBpc1Rha2VuT3ZlcixcbiAgICAgIGlzVG9rZW5FeHBpcmVkRXJyb3IsXG4gICAgICByZXNldFRvSW5pdGlhbFN0YXRlLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgXSxcbiAgKTtcblxuICBjb25zdCBzZW5kQXVkaW9NZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGF1ZGlvQmxvYjogQmxvYiwgYXVkaW9Gb3JtYXQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgaWYgKCFpc1Rha2VuT3Zlcikge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kQXVkaW9NZXNzYWdlKGF1ZGlvQmxvYiwgYXVkaW9Gb3JtYXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtpc1Rha2VuT3ZlciwgaXNUb2tlbkV4cGlyZWRFcnJvciwgcmVzZXRUb0luaXRpYWxTdGF0ZV0sXG4gICk7XG5cbiAgY29uc3Qgc3RhcnRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdGUgZm9yIG5ldyBjb252ZXJzYXRpb25cbiAgICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbCh3ZWxjb21lLmlucHV0RGlzY2xhaW1lckh0bWwgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICBjaGF0SW5wdXRNZXRhZGF0YTpcbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpID8/IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICAvLyBBZGQgZmVlZGJhY2sgdG8gYW4gYWdlbnQgbWVzc2FnZVxuICBjb25zdCBhZGRGZWVkYmFjayA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgICAgdmFsdWU6IFwiZ29vZFwiIHwgXCJiYWRcIixcbiAgICAgIGZlZWRiYWNrTWVzc2FnZT86IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IENoYXRTZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBzZW5kIGZlZWRiYWNrOiBtZXNzYWdlSWQgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5hZGRGZWVkYmFjayhcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZlZWRiYWNrOiBNZXNzYWdlRmVlZGJhY2sgPSB7XG4gICAgICAgICAgZmVlZGJhY2s6IHZhbHVlLFxuICAgICAgICAgIGZlZWRiYWNrX21lc3NhZ2U6IGZlZWRiYWNrTWVzc2FnZSxcbiAgICAgICAgICBmZWVkYmFja190aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT5cbiAgICAgICAgICBwcmV2Lm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgLy8gTWF0Y2ggYnkgbWVzc2FnZV9pZCBvciBpZCBmaWVsZFxuICAgICAgICAgICAgY29uc3QgbXNnSWQgPSBtLm1lc3NhZ2VfaWQgfHwgKG0gYXMgYW55KS5pZDtcbiAgICAgICAgICAgIHJldHVybiBtc2dJZCA9PT0gbWVzc2FnZUlkXG4gICAgICAgICAgICAgID8geyAuLi5tLCBmZWVkYmFjazogWy4uLihtLmZlZWRiYWNrIHx8IFtdKSwgbmV3RmVlZGJhY2tdIH1cbiAgICAgICAgICAgICAgOiBtO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvciBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHNlbmRBdWRpb01lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb25uZWN0aW9uU3RhdGUsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgZ3Vlc3RUb2tlbixcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNUYWtlbk92ZXIsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIGlucHV0RGlzY2xhaW1lckh0bWwsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgICBhdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgY2hhdElucHV0TWV0YWRhdGEsXG4gICAgYWdlbnRJZCxcbiAgICBhZ2VudExpdmVWb2ljZUVuYWJsZWQsXG4gICAgYWdlbnRMaXZlVm9pY2VSZWFkeSxcbiAgfTtcbn07XG4iXX0=
1069
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNEJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFnQlQ7UUFmYixPQUFPLGFBQUEsRUFDUCxZQUFZLGtC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WixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLG1CQUFtQixxQkFBQTtRQUNuQixlQUFlLGlCQUFBO1FBQ2YsZUFBZSxpQkFBQTtRQUNmLGVBQWUsaUJBQUE7UUFDZixrQkFBa0Isb0JBQUE7UUFDbEIsaUJBQWlCLG1CQUFBO1FBQ2pCLE9BQU8sU0FBQTtRQUNQLHFCQUFxQix1QkFBQTtRQUNyQixtQkFBbUIscUJBQUE7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NoYXRTZXJ2aWNlXCI7XG5pbXBvcnQgeyB1c2VDaGF0V2ViU29ja2V0IH0gZnJvbSBcIi4vdXNlQ2hhdFdlYlNvY2tldFwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxuICBGb3JtTm9kZUxvY2FsZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2hhdFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICB3ZWJzb2NrZXRVcmw/OiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLy8gIElmIGZhbHNlLCB0aGUgY2hhdCB3aWxsIHJ1biBpbiBIVFRQLW9ubHkgbW9kZSAobm8gV2ViU29ja2V0IGNvbm5lY3Rpb24pLlxuICB1c2VXcz86IGJvb2xlYW47XG4gIHVzZVBvbGw/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlPzogc3RyaW5nOyAvLyBDdXN0b20gbWVzc2FnZSB3aGVuIHNlcnZlciBpcyBkb3duXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybD86IHN0cmluZzsgLy8gT3B0aW9uYWwgVVJMIGZvciBjb250YWN0L3N1cHBvcnRcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWw/OiBzdHJpbmc7IC8vIExhYmVsIGZvciB0aGUgY29udGFjdCBsaW5rXG4gIG9uQ29uZmlnTG9hZGVkPzogKHByb3BzOiB7IGNoYXRJbnB1dE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB9KSA9PiB2b2lkOyAvLyBDYWxsYmFjayBmb3Igd2hlbiB0aGUgY2hhdCBpbnB1dCBtZXRhZGF0YSBpcyBsb2FkZWRcbn1cblxuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSA9XG4gIFwiVGhlIHNlcnZpY2UgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCI7XG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9DT05UQUNUX0xBQkVMID0gXCJDb250YWN0IHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gIC8vIE5vIHJlc3BvbnNlID0gbmV0d29yayBlcnJvclxuICBpZiAoIWVycm9yLnJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IFwiRVJSX05FVFdPUktcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFVElNRURPVVRcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFUlJfQ09OTkVDVElPTl9SRUZVU0VEXCJcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IHJlcXVlc3QgZXJyb3Igd2l0aG91dCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHNlcnZlci9uZXR3b3JrIGlzc3VlXG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgc3RhdHVzID49IDUwMDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoe1xuICBiYXNlVXJsLFxuICB3ZWJzb2NrZXRVcmwsXG4gIGFwaUtleSxcbiAgdGVuYW50LFxuICBtZXRhZGF0YSxcbiAgdXNlV3MgPSB0cnVlLFxuICB1c2VQb2xsID0gZmFsc2UsXG4gIGxhbmd1YWdlLFxuICBvbkVycm9yLFxuICBvblRha2VvdmVyLFxuICBvbkZpbmFsaXplLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIG9uQ29uZmlnTG9hZGVkLFxufTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPFxuICAgIEF0dGFjaG1lbnRbXVxuICA+KFtdKTtcbiAgY29uc3QgW2Nvbm5lY3Rpb25TdGF0ZSwgc2V0Q29ubmVjdGlvblN0YXRlXSA9IHVzZVN0YXRlPFxuICAgIFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCJcbiAgPihcImRpc2Nvbm5lY3RlZFwiKTtcbiAgY29uc3QgW2lzQWdlbnRUeXBpbmcsIHNldElzQWdlbnRUeXBpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBjaGF0U2VydmljZVJlZiA9IHVzZVJlZjxDaGF0U2VydmljZSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY29udmVyc2F0aW9uSWQsIHNldENvbnZlcnNhdGlvbklkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZ3Vlc3RUb2tlbiwgc2V0R3Vlc3RUb2tlbl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Bvc3NpYmxlUXVlcmllcywgc2V0UG9zc2libGVRdWVyaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt3ZWxjb21lVGl0bGUsIHNldFdlbGNvbWVUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVJbWFnZVVybCwgc2V0V2VsY29tZUltYWdlVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZU1lc3NhZ2UsIHNldFdlbGNvbWVNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaW5wdXREaXNjbGFpbWVySHRtbCwgc2V0SW5wdXREaXNjbGFpbWVySHRtbF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICAvLyBISVRMIGZvcm0gc3RyaW5ncyBwZXIgbG9jYWxlICh7IGxhbmc6IHsgbm9kZUlkOiBzbGljZSB9IH0pIGZvciBsaXZlIGZvcm0gcmUtbG9jYWxpemF0aW9uLlxuICBjb25zdCBbZm9ybU5vZGVMb2NhbGVzLCBzZXRGb3JtTm9kZUxvY2FsZXNdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRm9ybU5vZGVMb2NhbGU+PlxuICA+KHt9KTtcbiAgY29uc3QgW2FnZW50SWQsIHNldEFnZW50SWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFthZ2VudExpdmVWb2ljZUVuYWJsZWQsIHNldEFnZW50TGl2ZVZvaWNlRW5hYmxlZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFthZ2VudExpdmVWb2ljZVJlYWR5LCBzZXRBZ2VudExpdmVWb2ljZVJlYWR5XSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2F2YWlsYWJsZUxhbmd1YWdlcywgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdIHwgbnVsbD4oXG4gICAgbnVsbCxcbiAgKTtcbiAgY29uc3QgW2NoYXRJbnB1dE1ldGFkYXRhLCBzZXRDaGF0SW5wdXRNZXRhZGF0YV0gPSB1c2VTdGF0ZTxcbiAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICA+KHt9KTtcbiAgY29uc3QgW3Nob3VsZFRyaWdnZXJTdGFydEZvcm0sIHNldFNob3VsZFRyaWdnZXJTdGFydEZvcm1dID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VSZWYgPSB1c2VSZWYobGFuZ3VhZ2UpO1xuICBsYW5ndWFnZVJlZi5jdXJyZW50ID0gbGFuZ3VhZ2U7XG5cbiAgLy8gVW5pZmllZCBXZWJTb2NrZXQgY29ubmVjdGlvbiAocmVjb25uZWN0LCBrZWVwLWFsaXZlKVxuICBjb25zdCBvbldzTWVzc2FnZSA9IHVzZUNhbGxiYWNrKChkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnByb2Nlc3NXZWJTb2NrZXRNZXNzYWdlKGRhdGEpO1xuICB9LCBbXSk7XG5cbiAgdXNlQ2hhdFdlYlNvY2tldCh7XG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHVzZVdzOiB1c2VXcyA/PyB0cnVlLFxuICAgIGxhbmd1YWdlLFxuICAgIG9uTWVzc2FnZTogb25Xc01lc3NhZ2UsXG4gICAgb25Db25uZWN0aW9uU3RhdGU6IHNldENvbm5lY3Rpb25TdGF0ZSxcbiAgICByZWNvbm5lY3Q6IHRydWUsXG4gIH0pO1xuXG4gIC8vIFNjb3BlZCBtZXNzYWdlcyBrZXkgZm9yIGFwaUtleSwgY29udmVyc2F0aW9JZFxuICBjb25zdCBidWlsZE1lc3NhZ2VzS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFwaUtleVZhbDogc3RyaW5nLCBjb252SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgIGlmICghY29udklkKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBgZ2VuYXNzaXN0X2NvbnZlcnNhdGlvbl9tZXNzYWdlczoke2FwaUtleVZhbH06JHtjb252SWR9YDtcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHZhbGlkYXRlTWVzc2FnZXMgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pID0+IHtcbiAgICAgIGNvbnN0IGhhc1Rha2VPdmVyTXNnID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbT8udHlwZSA9PT0gXCJ0YWtlb3ZlclwiKTtcbiAgICAgIGNvbnN0IGhhc0ZpbmFsaXplZE1zZyA9IG1lc3NhZ2VzLnNvbWUoKG0pID0+IG0/LnR5cGUgPT09IFwiZmluYWxpemVkXCIpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoaGFzVGFrZU92ZXJNc2cpO1xuICAgICAgc2V0SXNGaW5hbGl6ZWQoaGFzRmluYWxpemVkTXNnKTtcbiAgICB9LFxuICAgIFtzZXRJc1Rha2VuT3Zlciwgc2V0SXNGaW5hbGl6ZWRdLFxuICApO1xuXG4gIC8vIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgdG9rZW4gZXhwaXJhdGlvbiBlcnJvciAoNDAxICsgXCJUb2tlbiBoYXMgZXhwaXJlZC5cIilcbiAgY29uc3QgaXNUb2tlbkV4cGlyZWRFcnJvciA9IHVzZUNhbGxiYWNrKChlcnJvcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMSAmJlxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5pbmNsdWRlcyhcIlRva2VuIGhhcyBleHBpcmVkXCIpKSlcbiAgICApO1xuICB9LCBbXSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uIHN0YXRlIHRvIGluaXRpYWwgKGUuZy4gYWZ0ZXIgdG9rZW4gZXhwaXJhdGlvbilcbiAgY29uc3QgcmVzZXRUb0luaXRpYWxTdGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRDb252ZXJzYXRpb25JZChudWxsKTtcbiAgICBzZXRHdWVzdFRva2VuKG51bGwpO1xuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbChudWxsKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKHt9KTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gRGVlcCBjb21wYXJlIG1ldGFkYXRhIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtaW5pdGlhbGl6YXRpb25zXG4gIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBpZiBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VzIChieSB2YWx1ZSwgbm90IHJlZmVyZW5jZSlcbiAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB1c2VNZW1vKFxuICAgICgpID0+IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhIHx8IHt9KSxcbiAgICBbbWV0YWRhdGFdLFxuICApO1xuICBjb25zdCBwcmV2QmFzZVVybFJlZiA9IHVzZVJlZjxzdHJpbmc+KGJhc2VVcmwpO1xuICBjb25zdCBwcmV2V2Vic29ja2V0VXJsUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4od2Vic29ja2V0VXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuICBjb25zdCBwcmV2VXNlUG9sbFJlZiA9IHVzZVJlZjxib29sZWFuPih1c2VQb2xsKTtcblxuICAvLyBIZWFydGJlYXQgcG9sbGluZyBzdGF0ZSAod2hlbiBXZWJTb2NrZXQgaXMgZGlzYWJsZWQpXG4gIGNvbnN0IGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBoZWFydGJlYXRJbnRlcnZhbFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICAvLyBSZWZzIHNvIHdlIG9ubHkgcnVuIHRha2VvdmVyL2ZpbmFsaXplZCBvbmNlIHBlciBjb252ZXJzYXRpb24gKGF2b2lkIHN0YWxlIGlzVGFrZW5PdmVyL2lzRmluYWxpemVkIGluIHBvbGwgY2xvc3VyZSlcbiAgY29uc3QgdGFrZW92ZXJQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuICBjb25zdCBvbkNvbmZpZ0xvYWRlZFJlZiA9IHVzZVJlZihvbkNvbmZpZ0xvYWRlZCk7XG5cbiAgLy8gVXBkYXRlIGNhbGxiYWNrIHJlZnMgd2hlbiB0aGV5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRXJyb3JSZWYuY3VycmVudCA9IG9uRXJyb3I7XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQgPSBvblRha2VvdmVyO1xuICB9LCBbb25UYWtlb3Zlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50ID0gb25GaW5hbGl6ZTtcbiAgfSwgW29uRmluYWxpemVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQgPSBvbkNvbmZpZ0xvYWRlZDtcbiAgfSwgW29uQ29uZmlnTG9hZGVkXSk7XG5cbiAgLy8gU3luYyBtZXRhZGF0YSAoZS5nLiBgbGFuZ3VhZ2VgIGZvciBvdXRib3VuZCByZXF1ZXN0cykgd2l0aG91dCBjYW5jZWxsaW5nIGJvb3RzdHJhcCBvciByZWNyZWF0aW5nIHRoZSBzZXJ2aWNlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICB9LCBbbWV0YWRhdGFTdHJpbmcsIG1ldGFkYXRhXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gY29ubmVjdGlvbi1yZWxhdGVkIGlucHV0cyBjaGFuZ2UgKG5vdCBsYW5ndWFnZS9tZXRhZGF0YSDigJQgdGhvc2UgY2FuY2VsIGluLWZsaWdodCBsb2NhbGUgZmV0Y2gpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGJhc2VVcmxDaGFuZ2VkID0gcHJldkJhc2VVcmxSZWYuY3VycmVudCAhPT0gYmFzZVVybDtcbiAgICBjb25zdCB3ZWJzb2NrZXRVcmxDaGFuZ2VkID0gcHJldldlYnNvY2tldFVybFJlZi5jdXJyZW50ICE9PSB3ZWJzb2NrZXRVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgY29uc3QgdXNlUG9sbENoYW5nZWQgPSBwcmV2VXNlUG9sbFJlZi5jdXJyZW50ICE9PSB1c2VQb2xsO1xuICAgIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBmb3IgY29ubmVjdGlvbi1yZWxhdGVkIGNoYW5nZXMsIE5PVCBmb3IgbWV0YWRhdGEgY2hhbmdlc1xuICAgIGNvbnN0IG5lZWRzUmVpbml0ID1cbiAgICAgICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8XG4gICAgICBiYXNlVXJsQ2hhbmdlZCB8fFxuICAgICAgd2Vic29ja2V0VXJsQ2hhbmdlZCB8fFxuICAgICAgYXBpS2V5Q2hhbmdlZCB8fFxuICAgICAgdGVuYW50Q2hhbmdlZCB8fFxuICAgICAgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmICh3ZWJzb2NrZXRVcmxDaGFuZ2VkKSBwcmV2V2Vic29ja2V0VXJsUmVmLmN1cnJlbnQgPSB3ZWJzb2NrZXRVcmw7XG4gICAgICBpZiAoYXBpS2V5Q2hhbmdlZCkgcHJldkFwaUtleVJlZi5jdXJyZW50ID0gYXBpS2V5O1xuICAgICAgaWYgKHRlbmFudENoYW5nZWQpIHByZXZUZW5hbnRSZWYuY3VycmVudCA9IHRlbmFudDtcbiAgICAgIGlmICh1c2VXc0NoYW5nZWQpIHByZXZVc2VXc1JlZi5jdXJyZW50ID0gdXNlV3M7XG4gICAgICBpZiAodXNlUG9sbENoYW5nZWQpIHByZXZVc2VQb2xsUmVmLmN1cnJlbnQgPSB1c2VQb2xsO1xuXG4gICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBzZXJ2aWNlIGlmIGl0IGV4aXN0c1xuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKCgpID0+IHt9KTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50ID0gbmV3IENoYXRTZXJ2aWNlKFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgICB3ZWJzb2NrZXRVcmwsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHVzZVdzLFxuICAgICAgICB1c2VQb2xsLFxuICAgICAgKTtcbiAgICAgIHNldEF2YWlsYWJsZUxhbmd1YWdlcyhudWxsKTtcblxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTpcbiAgICAgICAgICAgICFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYWNrIGxhdGVzdCBjcmVhdGVfdGltZSB3ZSd2ZSBzZWVuIGZyb20gc2VydmVyL3dlYnNvY2tldCAoaW4gc2Vjb25kcylcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lICYmIG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lID4gMCkge1xuICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIG1lc3NhZ2UgdG8gbWVzc2FnZXMgYXJyYXlcbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXZNZXNzYWdlcykgPT4ge1xuICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbWVzc2FnZXMgd2l0aCBzYW1lIG1lc3NhZ2VfaWQgYW5kIHR5cGVcbiAgICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gcHJldk1lc3NhZ2VzLnNvbWUoKG0pID0+IG0ubWVzc2FnZV9pZCA9PT0gbm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2TWVzc2FnZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwiYWdlbnRcIiB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwic3BlY2lhbFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKGRhdGEuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgaWYgKGRhdGEucG9zc2libGVRdWVyaWVzICYmIGRhdGEucG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoZGF0YS5wb3NzaWJsZVF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRTZXJ2ZXJVbmF2YWlsYWJsZUNvbmZpZyhcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VydmljZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtpbmZvXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBzZXJ2aWNlLmZldGNoQWdlbnRJbmZvPy4oKSA/PyBQcm9taXNlLnJlc29sdmUobnVsbCksXG4gICAgICAgICAgc2VydmljZS5mZXRjaEFnZW50Q2hhdExvY2FsZXM/LigpID8/IFByb21pc2UucmVzb2x2ZShudWxsKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gc2V0IGF2YWlsYWJsZSBsYW5ndWFnZXMgZnJvbSB0aGUgYWdlbnQgaW5mb1xuICAgICAgICBpZiAoaW5mbyAmJiBBcnJheS5pc0FycmF5KGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcykpIHtcbiAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5mbz8uYWdlbnRfaWQpIHtcbiAgICAgICAgICBzZXRBZ2VudElkKGluZm8uYWdlbnRfaWQpO1xuICAgICAgICB9XG4gICAgICAgIHNldEFnZW50TGl2ZVZvaWNlRW5hYmxlZChpbmZvPy5saXZlX3ZvaWNlX2VuYWJsZWQgPT09IHRydWUpO1xuICAgICAgICBzZXRBZ2VudExpdmVWb2ljZVJlYWR5KGluZm8/LmxpdmVfdm9pY2VfcmVhZHkgPT09IHRydWUpO1xuXG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGluZm8gJiYgQXJyYXkuaXNBcnJheShpbmZvLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpKSB7XG4gICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlUmVmLmN1cnJlbnQgfHwgXCJlblwiO1xuICAgICAgICBjb25zdCBhcHBsaWVkID0gc2VydmljZS5hcHBseUxhbmd1YWdlRnJvbUxvY2FsZXMobGFuZyk7XG4gICAgICAgIGlmICghY2FuY2VsbGVkICYmIGFwcGxpZWQpIHtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXMoYXBwbGllZC50aGlua2luZ1BocmFzZXMpO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyhhcHBsaWVkLnRoaW5raW5nRGVsYXlNcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZUxvY2FsZXMgPSBzZXJ2aWNlLmdldEZvcm1Ob2RlTG9jYWxlcz8uKCk7XG4gICAgICAgIGlmICghY2FuY2VsbGVkICYmIG5vZGVMb2NhbGVzKSB7XG4gICAgICAgICAgc2V0Rm9ybU5vZGVMb2NhbGVzKG5vZGVMb2NhbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gc2VydmljZS5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhY2FuY2VsbGVkICYmXG4gICAgICAgICAgbWV0YSAmJlxuICAgICAgICAgIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5pc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpKSB7XG4gICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVdzKSB7XG4gICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQdWxsIGluaXRpYWwgc3RhdGljIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCkgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YT8uKCk7XG4gICAgICAgIGlmICh3ZWxjb21lKSB7XG4gICAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwod2VsY29tZS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZz8uKCk7XG4gICAgICAgIGlmICh0aGlua2luZykge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzPy4oKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGxhbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSA/PyB7fSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICB1c2VXcyxcbiAgICB1c2VQb2xsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIF0pO1xuXG4gIC8vIFdoZW4gdGhlIHBsdWdpbiBsYW5ndWFnZSBjaGFuZ2VzOiB1cGRhdGUgQWNjZXB0LUxhbmd1YWdlIGFuZCBhcHBseSB0aGUgYWdlbnQgbG9jYWxlIGJ1bmRsZSAoZnJvbSBmZXRjaEFnZW50Q2hhdExvY2FsZXMpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuICAgIHN2Yy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlIHx8IFwiZW5cIjtcbiAgICBjb25zdCBhcHBsaWVkID0gc3ZjLmFwcGx5TGFuZ3VhZ2VGcm9tTG9jYWxlcyhsYW5nKTtcbiAgICBpZiAoYXBwbGllZCkge1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKGFwcGxpZWQudGhpbmtpbmdQaHJhc2VzKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcyhhcHBsaWVkLnRoaW5raW5nRGVsYXlNcyk7XG4gICAgfVxuICB9LCBbbGFuZ3VhZ2VdKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjb25zdCBwYXJzZWQ6IENoYXRNZXNzYWdlW10gPSBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcblxuICAgICAgc2V0TWVzc2FnZXMocGFyc2VkKTtcbiAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICBpZiAocGFyc2VkLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgICAgLi4ucGFyc2VkLm1hcCgobSkgPT4gKG0uY3JlYXRlX3RpbWUgPyBtLmNyZWF0ZV90aW1lIDogMCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG1heENyZWF0ZVRpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlcyBmb3IgdGFrZW92ZXIgYW5kIGZpbmFsaXplZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBIZWFydGJlYXQgbG9uZyBwb2xsaW5nIHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkIGFuZCB3ZSBoYXZlIGFuIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbi5cbiAgLy8gLSBTdGFydHMgd2l0aCBhIHNob3J0IGludGVydmFsXG4gIC8vIC0gSW5jcmVhc2VzIHRoZSBpbnRlcnZhbCBvdmVyIHRpbWUgKGV2ZXJ5IHN1Y2Nlc3NmdWwgcG9sbClcbiAgLy8gLSBSZXRyaWVzIHVwIHRvIDUgdGltZXMgb24gZXJyb3JzLCB0aGVuIHN0b3BzXG4gIGNvbnN0IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TID0gMjAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMgPSA1MDAwO1xuICBjb25zdCBIRUFSVEJFQVRfTUFYX0lOVEVSVkFMX01TID0gMzAwMDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodXNlV3MgfHwgIWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgcGVyLWNvbnZlcnNhdGlvbiBmbGFncyBzbyB3ZSBvbmx5IG5vdGlmeSB0YWtlb3Zlci9maW5hbGl6ZWQgb25jZVxuICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKGRlbGF5TXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgZGVsYXlNcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcG9sbE1lc3NhZ2VzIH0gPSBhd2FpdCBzdmMucG9sbEluUHJvZ3Jlc3NDb252ZXJzYXRpb24oKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc2V0IGZhaWx1cmUgY291bnRlciBvbiBzdWNjZXNzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcblxuICAgICAgICAvLyBPbmx5IHRha2UgbWVzc2FnZXMgbmV3ZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IHNlZW4gY3JlYXRlX3RpbWUgKHNlY29uZHMpLlxuICAgICAgICAvLyBVc2Ugc2Vjb25kcyBjb25zaXN0ZW50bHk6IHBvbGwgbWVzc2FnZXMgYXJlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcyBpbiBjaGF0U2VydmljZS5cbiAgICAgICAgY29uc3QgbGFzdFNlcnZlckNyZWF0ZVRpbWUgPSBNYXRoLmZsb29yKE51bWJlcihsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50KSB8fCAwKTtcblxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlc1JhdyA9IChwb2xsTWVzc2FnZXMgfHwgW10pLmZpbHRlcigobSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN0ID0gTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpO1xuICAgICAgICAgIGlmIChjdCA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKGN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBjdCA+IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV3TWVzc2FnZXNSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNwZWFrZXJUeXBlID0gKHNwZWFrZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWFrZXIgPT09IFwiY3VzdG9tZXJcIikgcmV0dXJuIFwiY3VzdG9tZXJcIjtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImFnZW50XCIpIHJldHVybiBcImFnZW50XCI7XG4gICAgICAgICAgICByZXR1cm4gXCJzcGVjaWFsXCI7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRleHQgPSAobTogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcInRha2VvdmVyXCIpIHJldHVybiBcIlN1cGVydmlzb3IgdG9vayBvdmVyXCI7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcImZpbmFsaXplZFwiKSByZXR1cm4gXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCI7XG4gICAgICAgICAgICByZXR1cm4gKG0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IG5ld01lc3NhZ2VzUmF3Lm1hcCgobSkgPT4gKHtcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IChtIGFzIGFueSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpLFxuICAgICAgICAgICAgc3RhcnRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuc3RhcnRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBOdW1iZXIoKG0gYXMgYW55KS5lbmRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIHNwZWFrZXI6IHNwZWFrZXJUeXBlKChtIGFzIGFueSkuc3BlYWtlciksXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0KG0pLFxuICAgICAgICAgICAgdHlwZTogKG0gYXMgYW55KS50eXBlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IChtIGFzIGFueSkuZmVlZGJhY2ssXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIG9ubHkgbWVzc2FnZXMgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIChkZWR1cGUgYnkgbWVzc2FnZV9pZDsgc2FtZSBjcmVhdGVfdGltZSBjYW4gcmVwZWF0IGV2ZXJ5IHBvbGwpXG4gICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2TWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIHByZXZNZXNzYWdlcy5tYXAoKG0pID0+IG0ubWVzc2FnZV9pZCkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0b0FkZCA9IG5ld01lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5tZXNzYWdlX2lkID09IG51bGwgfHwgIWV4aXN0aW5nSWRzLmhhcyhtLm1lc3NhZ2VfaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSByZXR1cm4gcHJldk1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lRnJvbVBvbGwgPSB0b0FkZC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1heCwgbXNnKSA9PlxuICAgICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChtYXgsIG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgOiBtYXgsXG4gICAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IG1heENyZWF0ZVRpbWVGcm9tUG9sbDtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIG5ldyBtZXNzYWdlcyBmb3IgdGFrZW92ZXIvZmluYWxpemUgbWFya2Vyc1xuICAgICAgICAgIGNvbnN0IGhhc1Rha2VvdmVyTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcInRha2VvdmVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNZXNzYWdlID0gbmV3TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09IFwiZmluYWxpemVkXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICgoc3RhdHVzID09PSBcImZpbmFsaXplZFwiIHx8IGhhc0ZpbmFsaXplZE1lc3NhZ2UpICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09PSBcInRha2VvdmVyXCIgfHwgaGFzVGFrZW92ZXJNZXNzYWdlKSAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbmV3IG1lc3NhZ2VzOyBzdGlsbCBob25vciBzdGF0dXMgaWYgaXQgaW5kaWNhdGVzIGEgdGVybWluYWwgc3RhdGUgKG9uY2UgcGVyIGNvbnZlcnNhdGlvbilcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImZpbmFsaXplZFwiICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFwidGFrZW92ZXJcIiAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzdmMubm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIikge1xuICAgICAgICAgIC8vIE1hcmsgZmluYWxpemVkIGFuZCBsZXQgdGhlIGVmZmVjdCBjbGVhbnVwIHByZXZlbnQgZnVydGhlciBzY2hlZHVsaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbCBvdmVyIHRpbWUgb24gc3VjY2Vzc1xuICAgICAgICAvLyBjb25zdCBuZXh0SW50ZXJ2YWwgPSBNYXRoLm1pbihcbiAgICAgICAgLy8gICAoaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCB8fCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUykgK1xuICAgICAgICAvLyAgICAgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMsXG4gICAgICAgIC8vICAgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgY29uc3QgbmV4dEludGVydmFsID0gSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVM7XG4gICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgPSBuZXh0SW50ZXJ2YWw7XG4gICAgICAgIHNjaGVkdWxlTmV4dChuZXh0SW50ZXJ2YWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgLy8gSW5jcmVtZW50IGZhaWx1cmUgY291bnRlciBhbmQgc3RvcCBhZnRlciA1IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICAgIGlmIChoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA+PSA1KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPVxuICAgICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG4gICAgICAgIHNjaGVkdWxlTmV4dChyZXRyeURlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUmVzZXQgY291bnRlcnMgZm9yIHRoaXMgY29udmVyc2F0aW9uIGFuZCBzdGFydCBpbW1lZGlhdGVseVxuICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcbiAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAodXNlUG9sbCAmJiAhdXNlV3MpIHtcbiAgICAgIHBvbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3VzZVdzLCBjb252ZXJzYXRpb25JZCwgaXNGaW5hbGl6ZWQsIHVzZVBvbGxdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKG51bGwpO1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH1cbiAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKHdlbGNvbWUuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRBdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMobGFuZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaG91bGRUcmlnZ2VyU3RhcnRGb3JtKFxuICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybT8uKCkgPz8gZmFsc2UsXG4gICAgICAgICk7XG4gICAgICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgY2hhdElucHV0TWV0YWRhdGE6XG4gICAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKSA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgY29uc3QgdXBsb2FkRmlsZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChmaWxlOiBGaWxlKTogUHJvbWlzZTxBdHRhY2htZW50IHwgbnVsbD4gPT4ge1xuICAgICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5nZXRDb252ZXJzYXRpb25JZCgpO1xuICAgICAgaWYgKCFjb252ZXJzYXRpb25JZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXBsb2FkUmVzdWx0ID0gYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8udXBsb2FkRmlsZShcbiAgICAgICAgICBjb252ZXJzYXRpb25JZCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgZmlsZSB1cmwgd2l0aCB0aGUgYmFzZSB1cmxcbiAgICAgICAgY29uc3QgZmlsZV91cmwgPSBuZXcgVVJMKHVwbG9hZFJlc3VsdCEuZmlsZV91cmwhLCBiYXNlVXJsKS5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgPSB7XG4gICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgdXJsOiBmaWxlX3VybCxcbiAgICAgICAgICBmaWxlX2lkOiB1cGxvYWRSZXN1bHQ/LmZpbGVfaWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoKHByZXYpID0+IFsuLi5wcmV2LCBhdHRhY2htZW50XSk7XG4gICAgICAgIHJldHVybiBhdHRhY2htZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICByZXNldFRvSW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvciBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhcGlLZXksXG4gICAgICBjb252ZXJzYXRpb25JZCxcbiAgICAgIGJ1aWxkTWVzc2FnZXNLZXksXG4gICAgICBpc1Rva2VuRXhwaXJlZEVycm9yLFxuICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSxcbiAgICBdLFxuICApO1xuXG4gIC8vIFNlbmQgbWVzc2FnZVxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgIGZpbGVzOiBGaWxlW10gPSBbXSxcbiAgICAgIGV4dHJhTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgcmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2hhdCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gPSBbXTtcblxuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZGVkRmlsZXMgPSBmaWxlc1xuICAgICAgICAgICAgLm1hcCgoZikgPT5cbiAgICAgICAgICAgICAgcHJlbG9hZGVkQXR0YWNobWVudHMuZmluZChcbiAgICAgICAgICAgICAgICAocGEpID0+IHBhLm5hbWUgPT09IGYubmFtZSAmJiBwYS5zaXplID09PSBmLnNpemUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIEF0dGFjaG1lbnRbXTtcbiAgICAgICAgICBuZXdBdHRhY2htZW50cy5wdXNoKC4uLnVwbG9hZGVkRmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgdHlwaW5nIGltbWVkaWF0ZWx5IHdoZW4gdXNlciBzZW5kcywgdW5sZXNzIGNvbnZlcnNhdGlvbiBpcyB0YWtlbiBvdmVyIGJ5IGEgaHVtYW5cbiAgICAgICAgaWYgKCFpc1Rha2VuT3Zlcikge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNlbmRNZXNzYWdlKFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgbmV3QXR0YWNobWVudHMsXG4gICAgICAgICAgZXh0cmFNZXRhZGF0YSxcbiAgICAgICAgICByZUNhcHRjaGFUb2tlbixcbiAgICAgICAgKTtcblxuICAgICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cyhbXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAoaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICByZXNldFRvSW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAvLyBTaG93IGN1c3RvbSBzZXJ2ZXItdW5hdmFpbGFibGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZVRpbWUgPVxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uZ2V0Q29udmVyc2F0aW9uQ3JlYXRlVGltZSgpO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGNyZWF0ZVRpbWUgIT0gbnVsbCA/IG5vdyAtIGNyZWF0ZVRpbWUgOiAwO1xuICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBzdGFydFRpbWUgKyAwLjAxO1xuICAgICAgICAgIGNvbnN0IHNwZWNpYWxNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgICBzdGFydF90aW1lOiBzdGFydFRpbWUsXG4gICAgICAgICAgICBlbmRfdGltZTogZW5kVGltZSxcbiAgICAgICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlID8/IERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX01FU1NBR0UsXG4gICAgICAgICAgICAuLi4oc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsICYmIHtcbiAgICAgICAgICAgICAgbGlua1VybDogc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICAgICAgICBsaW5rTGFiZWw6XG4gICAgICAgICAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwgPz9cbiAgICAgICAgICAgICAgICBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9DT05UQUNUX0xBQkVMLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PiBbLi4ucHJldiwgc3BlY2lhbE1lc3NhZ2VdKTtcbiAgICAgICAgICAvLyBEb24ndCBjYWxsIG9uRXJyb3Igc28gdGhlIHVzZXIgb25seSBzZWVzIG91ciBjdXN0b20gbWVzc2FnZVxuICAgICAgICB9IGVsc2UgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHByZWxvYWRlZEF0dGFjaG1lbnRzLFxuICAgICAgaXNUYWtlbk92ZXIsXG4gICAgICBpc1Rva2VuRXhwaXJlZEVycm9yLFxuICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSxcbiAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICAgIF0sXG4gICk7XG5cbiAgY29uc3Qgc2VuZEF1ZGlvTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChhdWRpb0Jsb2I6IEJsb2IsIGF1ZGlvRm9ybWF0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2VuZEF1ZGlvTWVzc2FnZShhdWRpb0Jsb2IsIGF1ZGlvRm9ybWF0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbaXNUYWtlbk92ZXIsIGlzVG9rZW5FeHBpcmVkRXJyb3IsIHJlc2V0VG9Jbml0aWFsU3RhdGVdLFxuICApO1xuXG4gIC8vIEludmlzaWJsZSB0cmlnZ2VyIHRoYXQgcnVucyB0aGUgd29ya2Zsb3cgYXMgdGhlIGNvbnZlcnNhdGlvbiBvcGVucyBzbyBhIEh1bWFuIEluIFRoZVxuICAvLyBMb29wIGZvcm0gKHNob3dfb25fc3RhcnQsIHdpcmVkIGFmdGVyIFN0YXJ0KSBhcHBlYXJzIHdpdGhvdXQgYSBmaXJzdCB1c2VyIG1lc3NhZ2UuXG4gIGNvbnN0IHRyaWdnZXJTdGFydEZvcm0gPSB1c2VDYWxsYmFjayhhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgaWYgKCFpc1Rha2VuT3Zlcikge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kU3RhcnRGb3JtVHJpZ2dlcihyZUNhcHRjaGFUb2tlbik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAoaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgfVxuICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGl0IGZhaWxzIHRoZSB2aXNpdG9yIGNhbiBzdGlsbCB0eXBlIG5vcm1hbGx5LlxuICAgIH1cbiAgfSwgW2lzVGFrZW5PdmVyLCBpc1Rva2VuRXhwaXJlZEVycm9yLCByZXNldFRvSW5pdGlhbFN0YXRlXSk7XG5cbiAgY29uc3Qgc3RhcnRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdGUgZm9yIG5ldyBjb252ZXJzYXRpb25cbiAgICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0SW5wdXREaXNjbGFpbWVySHRtbCh3ZWxjb21lLmlucHV0RGlzY2xhaW1lckh0bWwgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybShcbiAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNob3VsZFRyaWdnZXJTdGFydEZvcm0/LigpID8/IGZhbHNlLFxuICAgICAgICApO1xuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgICB2YWx1ZTogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgICAgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2VuZCBmZWVkYmFjazogQ2hhdFNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LmFkZEZlZWRiYWNrKFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmVlZGJhY2s6IE1lc3NhZ2VGZWVkYmFjayA9IHtcbiAgICAgICAgICBmZWVkYmFjazogdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tfbWVzc2FnZTogZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICAgIGZlZWRiYWNrX3RpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PlxuICAgICAgICAgIHByZXYubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgc2VuZEF1ZGlvTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIHRyaWdnZXJTdGFydEZvcm0sXG4gICAgc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSxcbiAgICBjb25uZWN0aW9uU3RhdGUsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgZ3Vlc3RUb2tlbixcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNUYWtlbk92ZXIsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIGlucHV0RGlzY2xhaW1lckh0bWwsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgICBmb3JtTm9kZUxvY2FsZXMsXG4gICAgYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgIGNoYXRJbnB1dE1ldGFkYXRhLFxuICAgIGFnZW50SWQsXG4gICAgYWdlbnRMaXZlVm9pY2VFbmFibGVkLFxuICAgIGFnZW50TGl2ZVZvaWNlUmVhZHksXG4gIH07XG59O1xuIl19