@envive-ai/react-hooks 0.3.55 → 0.3.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/application/commerce-api.cjs +11 -12
  2. package/dist/application/commerce-api.js +11 -12
  3. package/dist/application/logging/index.cjs +13 -0
  4. package/dist/application/logging/index.d.cts +3 -0
  5. package/dist/application/logging/index.d.ts +3 -0
  6. package/dist/application/logging/index.js +4 -0
  7. package/dist/application/logging/logLevel.cjs +123 -0
  8. package/dist/application/logging/logLevel.d.cts +47 -0
  9. package/dist/application/logging/logLevel.d.ts +47 -0
  10. package/dist/application/logging/logLevel.js +115 -0
  11. package/dist/application/logging/logger.cjs +6 -1
  12. package/dist/application/logging/logger.d.cts +13 -0
  13. package/dist/application/logging/logger.d.ts +13 -0
  14. package/dist/application/logging/logger.js +7 -1
  15. package/dist/atoms/app/index.d.cts +7 -7
  16. package/dist/atoms/app/index.d.ts +7 -7
  17. package/dist/atoms/app/variant.d.cts +6 -6
  18. package/dist/atoms/chat/chatState.d.cts +19 -19
  19. package/dist/atoms/chat/chatState.d.ts +19 -19
  20. package/dist/atoms/chat/form.d.cts +2 -2
  21. package/dist/atoms/chat/form.d.ts +2 -2
  22. package/dist/atoms/chat/index.d.cts +3 -3
  23. package/dist/atoms/chat/index.d.ts +3 -3
  24. package/dist/atoms/chat/lastMessage.d.cts +2 -2
  25. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  26. package/dist/atoms/chat/messageQueue.d.cts +6 -6
  27. package/dist/atoms/chat/messageQueue.d.ts +6 -6
  28. package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
  29. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  30. package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
  31. package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
  32. package/dist/atoms/chat/replies.d.cts +3 -3
  33. package/dist/atoms/chat/replies.d.ts +3 -3
  34. package/dist/atoms/chat/suggestions.d.cts +2 -2
  35. package/dist/atoms/chat/suggestions.d.ts +2 -2
  36. package/dist/atoms/envive/enviveConfig.d.cts +14 -14
  37. package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
  38. package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
  39. package/dist/atoms/org/customerService.d.cts +6 -6
  40. package/dist/atoms/org/customerService.d.ts +6 -6
  41. package/dist/atoms/org/graphqlConfig.d.cts +4 -4
  42. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  43. package/dist/atoms/org/orgAnalyticsConfig.d.cts +4 -4
  44. package/dist/atoms/org/orgAnalyticsConfig.d.ts +4 -4
  45. package/dist/atoms/search/chatSearch.d.cts +17 -17
  46. package/dist/atoms/search/chatSearch.d.ts +17 -17
  47. package/dist/atoms/search/searchAPI.d.cts +13 -13
  48. package/dist/atoms/search/searchAPI.d.ts +13 -13
  49. package/dist/atoms/search/types.d.cts +1 -1
  50. package/dist/atoms/search/utils.d.cts +1 -1
  51. package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
  52. package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
  53. package/dist/contexts/salesAgentContext/salesAgentService.cjs +2 -2
  54. package/dist/contexts/salesAgentContext/salesAgentService.js +2 -2
  55. package/dist/contexts/systemSettingsContext/systemSettingsContext.d.ts +2 -2
  56. package/dist/contexts/types.d.cts +1 -1
  57. package/dist/contexts/types.d.ts +1 -1
  58. package/dist/contexts/typesV3.d.ts +1 -1
  59. package/dist/hooks/ChatToggle/useChatToggle.cjs +10 -8
  60. package/dist/hooks/ChatToggle/useChatToggle.d.cts +4 -3
  61. package/dist/hooks/ChatToggle/useChatToggle.d.ts +4 -3
  62. package/dist/hooks/ChatToggle/useChatToggle.js +11 -9
  63. package/dist/hooks/Intersection/useIntersection.cjs +7 -5
  64. package/dist/hooks/Intersection/useIntersection.js +7 -5
  65. package/dist/hooks/ShopifyUrlOperations/useShopifyUrlOperations.d.cts +2 -2
  66. package/dist/hooks/ShopifyUrlOperations/useShopifyUrlOperations.d.ts +2 -2
  67. package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.cjs +8 -6
  68. package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.js +8 -6
  69. package/dist/hooks/WidgetInteraction/types.cjs +40 -1
  70. package/dist/hooks/WidgetInteraction/types.d.cts +16 -2
  71. package/dist/hooks/WidgetInteraction/types.d.ts +16 -2
  72. package/dist/hooks/WidgetInteraction/types.js +41 -2
  73. package/dist/services/amplitudeService/amplitudeService.cjs +14 -5
  74. package/dist/services/amplitudeService/amplitudeService.js +14 -5
  75. package/package.json +6 -2
  76. package/src/application/__tests__/commerceApiStreaming.test.ts +171 -0
  77. package/src/application/commerce-api.ts +21 -21
  78. package/src/application/logging/__tests__/logger.test.ts +159 -0
  79. package/src/application/logging/index.ts +12 -0
  80. package/src/application/logging/logLevel.ts +162 -0
  81. package/src/application/logging/logger.ts +13 -0
  82. package/src/application/utils/__tests__/widgetTextFromApiWidgetTextResponse.test.ts +55 -0
  83. package/src/contexts/salesAgentContext/salesAgentService.ts +1 -1
  84. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +4 -5
  85. package/src/hooks/ChatToggle/__tests__/useChatToggle.test.ts +273 -0
  86. package/src/hooks/ChatToggle/useChatToggle.ts +39 -12
  87. package/src/hooks/Intersection/useIntersection.ts +7 -4
  88. package/src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts +8 -5
  89. package/src/hooks/WidgetInteraction/__tests__/chatTriggerWidget.test.ts +51 -0
  90. package/src/hooks/WidgetInteraction/types.ts +53 -0
  91. package/src/services/amplitudeService/__tests__/amplitudeService.test.ts +76 -0
  92. package/src/services/amplitudeService/amplitudeService.ts +37 -5
  93. package/src/services/hardcopyService/__tests__/hardcopyService.test.ts +9 -0
@@ -154,26 +154,25 @@ var CommerceApiClient = class CommerceApiClient {
154
154
  try {
155
155
  return JSON.parse(line);
156
156
  } catch (err) {
157
- logger.logError("Error parsing streamed line", err, {
158
- line,
159
- partial
160
- });
161
- partial = line;
162
- return partial;
157
+ logger.logError("Error parsing streamed line", err, { line });
158
+ return null;
163
159
  }
164
160
  };
165
- const processChunk = (chunk) => {
166
- return `${partial}${chunk}`.split("\n").map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v);
167
- };
161
+ const parseLines = (lines) => lines.map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v != null);
168
162
  while (true) {
169
163
  const { done, value } = await reader.read();
170
164
  if (done) break;
171
- const parsedLines = processChunk(decoder.decode(value));
172
- for (const parsedLine of parsedLines) {
165
+ const lines = `${partial}${decoder.decode(value, { stream: true })}`.split("\n");
166
+ partial = lines.pop() ?? "";
167
+ for (const parsedLine of parseLines(lines)) {
173
168
  const validatedResponse = require_validateResponse.validateResponse(parsedLine);
174
169
  if (validatedResponse) yield validatedResponse;
175
170
  }
176
171
  }
172
+ for (const parsedLine of parseLines([`${partial}${decoder.decode()}`])) {
173
+ const validatedResponse = require_validateResponse.validateResponse(parsedLine);
174
+ if (validatedResponse) yield validatedResponse;
175
+ }
177
176
  } catch (error) {
178
177
  logger.logError("Failed to get next streaming responses", error, {
179
178
  payloadContext: payload?.context,
@@ -415,4 +414,4 @@ var commerce_api_default = CommerceApiClient;
415
414
 
416
415
  //#endregion
417
416
  module.exports = commerce_api_default;
418
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2UtYXBpLmNqcyIsIm5hbWVzIjpbIkxvZ2dlciIsIlJlc3BvbnNlRXJyb3IiLCJVbnN1cHBvcnRlZFByb2R1Y3RFeGNlcHRpb24iLCJTZXNzaW9uUmVzdGFydFJlcXVpcmVkIiwiZ2V0QXRvbVN0b3JlIiwiYmFzZVVybEF0b20iLCJjb25maWc6IENvbmZpZ3VyYXRpb24iLCJDb25maWd1cmF0aW9uIiwib3JnTGV2ZWxBcGlLZXlBdG9tIiwiRGVmYXVsdEFwaSIsIkluZmVyZW5jZUFwaSIsIkN1c3RvbWVyU2VydmljZUFwaSIsIlByb2R1Y3RzQXBpIiwib3JnU2hvcnROYW1lQXRvbSIsIm9yZ0lkQXRvbSIsInVzZXJJZEF0b20iLCJjaGF0SWRBdG9tIiwiY29udGV4dFNvdXJjZUF0b20iLCJlbnZBdG9tIiwiZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSIsImNvbnRleHQ6IENvbnRleHQiLCJDb250ZXh0U291cmNlRW51bSIsIkNvbnRleHRFbnZFbnVtIiwiZ2V0UXVlcnlQYXJhbSIsInJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIiwibWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwibWVzc2FnZUZyb21SZXNwb25zZSIsImVycjogdW5rbm93biIsImVycm9yOiB1bmtub3duIiwidmFsaWRhdGVTdWdnZXN0aW9uIiwiZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSIsInJlc3BvbnNlczogUmVzcG9uc2VbXVtdIiwic3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSIsInVzZXJFdmVudHM6IFVzZXJFdmVudFtdIiwidmFsaWRhdGVVc2VyRXZlbnQiLCJVc2VyRXZlbnRDYXRlZ29yeSIsImFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsIlJlc3BvbnNlQ2F0ZWdvcnkiLCJ1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdIiwibWVzc2FnZUZyb21RdWVyeUV2ZW50IiwibWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQiLCJtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50IiwiRm9ybVR5cGUiLCJtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCIsImNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCIsImFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQiLCJwcm9kdWN0UmV0cmlldmFsUmVzcG9uc2VUb1Byb2R1Y3RSZXRyaWV2YWxSZXN1bHQiLCJnZXRQcm9kdWN0T3B0aW9uc1F1ZXJ5IiwiY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdCIsIlYxT3JnQ29uZmlnR2V0U291cmNlRW51bSIsInJlYWN0QXBwTmFtZUF0b20iLCJyZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QiLCJQcm9kdWN0RXhwZXJpbWVudCIsInZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbixcbiAgQ29udGV4dEVudkVudW0sXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBEZWZhdWx0QXBpLFxuICBGb3JtVHlwZSxcbiAgSW5mZXJlbmNlQXBpLFxuICBQcm9kdWN0c0FwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlQ2F0ZWdvcnksXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudC9kaXN0L21vZGVscy9Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJ3NyYy9hdG9tcy9zZWFyY2gvdHlwZXMnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgT3JnQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQge1xuICBQcm9kdWN0RGV0YWlscyxcbiAgZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSxcbn0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsL3F1ZXJpZXMvZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvcHJvZHVjdEV4cGVyaW1lbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudCc7XG5pbXBvcnQge1xuICBnZXRRdWVyeVBhcmFtLFxuICBtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50LFxuICBtZXNzYWdlRnJvbVF1ZXJ5RXZlbnQsXG4gIG1lc3NhZ2VGcm9tUmVzcG9uc2UsXG4gIG1lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQnO1xuaW1wb3J0IHsgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNoYXRJZEF0b20sIHVzZXJJZEF0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwJzsgLy8gSW1wb3J0IHVzZXJJZEF0b20gYW5kIGNoYXRJZEF0b21cbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50IH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IGdldEF0b21TdG9yZSB9IGZyb20gJ3NyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlJztcbmltcG9ydCB7IHJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2Vudml2ZS9yZXNvbHZlZEJhc2VDb25maWdWZXJzaW9uJztcbmltcG9ydCB7XG4gIGJhc2VVcmxBdG9tLFxuICBjb250ZXh0U291cmNlQXRvbSxcbiAgZW52QXRvbSxcbiAgb3JnSWRBdG9tLFxuICBvcmdMZXZlbEFwaUtleUF0b20sXG4gIG9yZ1Nob3J0TmFtZUF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sIC8vIEltcG9ydCBlbnZBdG9tXG59IGZyb20gJ3NyYy9hdG9tcy9lbnZpdmUvZW52aXZlQ29uZmlnJztcbmltcG9ydCB7IGZlYXR1cmVGbGFnU2VydmljZUF0b20gfSBmcm9tICdzcmMvYXRvbXMvb3JnL2dyYXBocWxDb25maWcnOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuaW1wb3J0IHsgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Vuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgV2lkZ2V0VGV4dCB9IGZyb20gJy4vbW9kZWxzL2FwaS93aWRnZXRUZXh0JztcbmltcG9ydCB7IFdpZGdldFRleHRSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBpL3dpZGdldFRleHRSZXF1ZXN0JztcbmltcG9ydCB7IHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJy4vdXRpbHMvcHJvZHVjdFJldHJpZXZhbFJlc3BvbnNlVG9Qcm9kdWN0UmV0cmlldmFsUmVzdWx0JztcbmltcG9ydCB7IGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQgfSBmcm9tICcuL3V0aWxzL3dpZGdldFRleHRGcm9tQXBpV2lkZ2V0VGV4dFJlc3BvbnNlJztcbmltcG9ydCB7IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCB9IGZyb20gJy4vdXRpbHMvd2lkZ2V0VGV4dFJlcXVlc3RUb0FwaVJlcXVlc3QnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdjb21tZXJjZS1hcGknKTtcblxuYXN5bmMgZnVuY3Rpb24gZXJyb3JSZXNwb25zZUJvZHkoZXJyb3I6IFJlc3BvbnNlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3IucmVzcG9uc2UuanNvbigpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoZXJyb3JNc2c6IHN0cmluZywgZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yKSkge1xuICAgIGxvZ2dlci5sb2dJbmZvKGVycm9yTXNnLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBjb25zdCBlcnJvclJlc3BvbnNlID0gYXdhaXQgZXJyb3JSZXNwb25zZUJvZHkoZXJyb3IpO1xuICBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3Vuc3VwcG9ydGVkIHByb2R1Y3QnIHx8IC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgQVBJIHJldHVybiBzdWJfY29kZSBpbnN0ZWFkIG9mIG1lc3NhZ2VcbiAgICBlcnJvclJlc3BvbnNlPy5hcHBfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gJ1BST0RVQ1RfTk9UX0ZPVU5EJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdSRVNUQVJUX1NFU1NJT04nIHx8XG4gICAgZXJyb3JSZXNwb25zZT8uc3ViX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdOT1RfRk9VTkQnIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXcgQVBJIHJlc3BvbnNlcyB3aWxsIGNvbnRhaW4gXCJhcHBfY29kZVwiXG4gICkge1xuICAgIGxvZ2dlci5sb2dJbmZvKFxuICAgICAgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QuIFJlLXN0YXJ0IHNlc3Npb24nLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2UsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCgpO1xuICB9XG5cbiAgbG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbmNsYXNzIENvbW1lcmNlQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBpOiBEZWZhdWx0QXBpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tZXJTZXJ2aWNlQXBpOiBDdXN0b21lclNlcnZpY2VBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZlcmVuY2VBcGk6IEluZmVyZW5jZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQXBpOiBQcm9kdWN0c0FwaTtcblxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tbWVyY2VBcGlDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSA9ICgpOiBDb21tZXJjZUFwaUNsaWVudCA9PiB7XG4gICAgaWYgKCFDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2UgPSBuZXcgQ29tbWVyY2VBcGlDbGllbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihiYXNlUGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG4gICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoIHx8IGJhc2VVcmw7XG4gICAgLy8gQVBJIEtleSBpcyBub3cgaGFuZGxlZCBhdCB0aGUgRW52aXZlQ29uZmlnUHJvdmlkZXIgbGV2ZWxcbiAgICBjb25zdCBjb25maWc6IENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gICAgICBhY2Nlc3NUb2tlbjogYXBpS2V5LFxuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICAgIHRoaXMucHJvZHVjdHNBcGkgPSBuZXcgUHJvZHVjdHNBcGkoY29uZmlnKTtcbiAgfVxuXG4gIC8vIERlZHVwZXMgY29uY3VycmVudCByZXNvbHV0aW9ucyBvZiB0aGUgc2FtZSBVUkw6IHRoZSBpbmplY3Rpb24gYnVuZGxlXG4gIC8vIHdhcm1zIHRoaXMgY2FsbCBiZWZvcmUgUmVhY3QgbW91bnRzLCBhbmQgUGFnZVByb3ZpZGVyIG1heSByZXF1ZXN0IHRoZVxuICAvLyBzYW1lIFVSTCB3aGlsZSB0aGUgd2FybS11cCBpcyBzdGlsbCBpbiBmbGlnaHQuXG4gIHByaXZhdGUgc3RhdGljIGluRmxpZ2h0VXJsUmVzb2x1dGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICBzdGF0aWMgcmVzb2x2ZVVybCA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gQ29tbWVyY2VBcGlDbGllbnQuaW5GbGlnaHRVcmxSZXNvbHV0aW9ucy5nZXQodXJsKTtcbiAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgIHJldHVybiBpbkZsaWdodDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJlc29sdmVVcmxVbmNhY2hlZCh1cmwpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmluRmxpZ2h0VXJsUmVzb2x1dGlvbnMuc2V0KHVybCwgcmVxdWVzdCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbkZsaWdodFVybFJlc29sdXRpb25zLmRlbGV0ZSh1cmwpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlVXJsVW5jYWNoZWQgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gJycsXG4gICAgICBvcmdfaWQ6IG9yZ0lkID8/ICcnLFxuICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyAnJyxcbiAgICAgIHNvdXJjZTogc291cmNlID8/IENvbnRleHRTb3VyY2VFbnVtLkFwcCxcbiAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LCAvLyBDYXN0IGVudiB0byBDb250ZXh0RW52RW51bVxuICAgIH07XG5cbiAgICBjb25zdCBvdmVycmlkZUNvbmZpZ1ZlcnNpb24gPVxuICAgICAgZ2V0UXVlcnlQYXJhbSgnc3BpZmZ5X2NvbmZpZ192ZXJzaW9uJykgfHxcbiAgICAgIGdldFF1ZXJ5UGFyYW0oJ2Vudml2ZV9jb25maWdfdmVyc2lvbicpIHx8XG4gICAgICBnZXRBdG9tU3RvcmUoKS5nZXQocmVzb2x2ZWRCYXNlQ29uZmlnVmVyc2lvbkF0b20pIHx8XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmZWF0dXJlR2F0ZXMgPSBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgICBvdmVycmlkZV9jb25maWdfdmVyc2lvbjogb3ZlcnJpZGVDb25maWdWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICBVcmxSZXNvbHZpbmdSZXF1ZXN0OiB1cmxSZXNvbHZpbmdSZXF1ZXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmF3UmVzcG9uc2UucmF3Lmpzb24oKTtcblxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gIH07XG5cbiAgc3RhdGljIHJlcG9ydFNlc3Npb24gPSBhc3luYyAocmVwb3J0UmVxdWVzdDogUmVwb3J0U2Vzc2lvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFDaGF0c1JlcG9ydFNlc3Npb25JZFBvc3Qoe1xuICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgfSk7XG4gIH07XG5cbiAgc3RhdGljIGdldE5leHRSZXNwb25zZXMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKHJlc3AgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcChyZXNwID0+IG1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzcCkpO1xuXG4gICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKChtKTogbSBpcyBNZXNzYWdlID0+IG0gIT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBsb2dnZXIubG9nSW5mbygnRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlcycsIGVyciwge1xuICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgbmV4dCByZXNwb25zZXMnLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UmVzcG9uc2UsIHZvaWQsIHVua25vd24+ID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiogZ2VuZXJhdGUoaW5mZXJlbmNlQXBpOiBJbmZlcmVuY2VBcGksIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtaW5nIGlzIGVuYWJsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW5mZXJlbmNlQXBpLnYxTmV4dFJlc3BvbnNlc1Bvc3RSYXcoXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgYXMgYSBzdHJlYW0gb2YgZGF0YVxuICAgICAgICBpZiAoIXJlc3BvbnNlLnJhdy5ib2R5KSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdObyBib2R5IGluIHRoZSBzdHJlYW1lZCByZXNwb25zZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5yYXcuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcblxuICAgICAgICBsZXQgcGFydGlhbCA9ICcnO1xuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBzYWZlUGFyc2UgPSAobGluZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpOyAvLyBQYXJzZSB0aGUgSlNPTiBzdHJpbmdcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5sb2dFcnJvcignRXJyb3IgcGFyc2luZyBzdHJlYW1lZCBsaW5lJywgZXJyLCB7XG4gICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgIHBhcnRpYWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHN3YWxsb3cgdGhlIGVycm9yIGFuZCBzZXQgdGhlIHBhcnRpYWwgdG8gb3VyIGN1cnJlbnQgY2h1bmtcbiAgICAgICAgICAgIHBhcnRpYWwgPSBsaW5lO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRPRE8gdGhpcyBmdW5jdGlvbiBpcyByZWNyZWF0ZWQgZXZlcnkgdGltZSBuZXcgZGF0YSBjb21lcyBmcm9tIHRoZSBzdHJlYW0gLSBkZWZpbmUgaXQgb3V0c2lkZSBvZiB0aGUgZ2VuZXJhdG9yXG4gICAgICAgIGNvbnN0IHByb2Nlc3NDaHVuayA9IChjaHVuazogc3RyaW5nKTogdW5rbm93bltdID0+IHtcbiAgICAgICAgICAvLyBtZXJnZSB0aGUgcGFydGlhbCB3aXRoIHRoZSBpbmNvbWluZyBjaHVua1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gYCR7cGFydGlhbH0ke2NodW5rfWAuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBsaW5lc1xuICAgICAgICAgICAgLm1hcChsaW5lID0+IGxpbmUucmVwbGFjZSgvXmRhdGE6IC8sICcnKS50cmltKCkpIC8vIFJlbW92ZSB0aGUgXCJkYXRhOiBcIiBwcmVmaXhcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lICE9PSAnJyAmJiBsaW5lICE9PSAnW0RPTkVdJykgLy8gUmVtb3ZlIGVtcHR5IGxpbmVzIGFuZCBcIltET05FXVwiXG4gICAgICAgICAgICAubWFwKHNhZmVQYXJzZSlcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2KTsgLy8gYW5kIGZpbHRlciBvdXQgdGhlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgICAgICByZXR1cm4gcGFyc2VkTGluZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWFzc2FnZSBhbmQgcGFyc2UgdGhlIGNodW5rIG9mIGRhdGFcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGRlY29kZXIuZGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICBjb25zdCBwYXJzZWRMaW5lcyA9IHByb2Nlc3NDaHVuayhjaHVuayk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZExpbmUgb2YgcGFyc2VkTGluZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gdmFsaWRhdGVSZXNwb25zZShwYXJzZWRMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yLCB7XG4gICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlKFxuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGksXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlcixcbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0U3VnZ2VzdGlvbnMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxTdWdnZXN0aW9uW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRTdWdnZXN0aW9uc1Bvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbmFsOiBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcChyZXNwID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihyZXNwKSlcbiAgICAgICAgLmZpbHRlcigoc3VnZ2VzdGlvbik6IHN1Z2dlc3Rpb24gaXMgU3VnZ2VzdGlvbiA9PiBzdWdnZXN0aW9uICE9IG51bGwpO1xuXG4gICAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZ2dlci5sb2dJbmZvKCdGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zJywgZXJyb3IsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgc3VnZ2VzdGlvbnMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIHJlc3BvbnNlczogUmVzcG9uc2VbXVtdO1xuICAgIHVzZXJFdmVudHM6IFVzZXJFdmVudFtdO1xuICAgIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW107XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXVtdO1xuICB9PiA9PiB7XG4gICAgbGV0IGRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UgPSB7XG4gICAgICByZXNwb25zZXM6IFtdLFxuICAgICAgc3VnZ2VzdGlvbnM6IFtdLFxuICAgICAgdXNlcl9ldmVudHM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yZ19pZDogb3JnSWQsXG4gICAgICBjaGF0X2lkOiBjaGF0SWQsXG4gICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUdldFNlc3Npb25NZXNzYWdlcyhyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgY2hhdCByZXNwb25zZXMnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdW10gPSBkYXRhPy5yZXNwb25zZXM/Lm1hcCh0dXJuID0+XG4gICAgICB0dXJuXG4gICAgICAgIC5tYXAocmVzcG9uc2UgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbCksXG4gICAgKTtcblxuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10gPSBkYXRhPy5zdWdnZXN0aW9uc1xuICAgICAgLm1hcChzdWdnZXN0aW9uID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihzdWdnZXN0aW9uKSlcbiAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgIGNvbnN0IHVzZXJFdmVudHM6IFVzZXJFdmVudFtdID0gZGF0YT8udXNlcl9ldmVudHNcbiAgICAgIC5tYXAoZXZlbnQgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoZXZlbnQgPT4gZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpXG4gICAgICAubWFwKGV2ZW50ID0+IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQpO1xuXG4gICAgY29uc3QgYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gcmVzcG9uc2VzXG4gICAgICAubWFwKHR1cm4gPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiZcbiAgICAgICAgICAgICAgICBmb3JtU3VibWl0dGVkVXNlckV2ZW50c0Zvcm1JZHMuaW5jbHVkZXMocmVzcG9uc2UuaWQpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAocmVzcG9uc2UgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcih0dXJuID0+IHR1cm4ubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJFdmVudHMubWFwKGFzeW5jIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoW1VzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsIFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaF0uaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnQpIHtcbiAgICAgICAgICAgIC8vIEhpc3RvcmljYWwgZXZlbnRzIG5ldmVyIGNhcnJpZWQgYSBjbGllbnQtbG9jYWwgcHJvZHVjdFRpdGxlIChpdCdzXG4gICAgICAgICAgICAvLyBkcm9wcGVkIGJlZm9yZSBoaXR0aW5nIHRoZSBiYWNrZW5kKSwgc28gcmVzb2x2ZSBpdCBoZXJlOiBmaXJzdCBmb3JcbiAgICAgICAgICAgIC8vIGZyZWUgZnJvbSBhIG1hdGNoaW5nIFByb2R1Y3QgcmVzcG9uc2UgYWxyZWFkeSBmZXRjaGVkIGFib3ZlLCB0aGVuXG4gICAgICAgICAgICAvLyBhcyBhIGZhbGxiYWNrIHZpYSB0aGUgY2FjaGVkIHByb2R1Y3QtZGV0YWlscyBjYWxsLlxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y3QgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlcy5pZCA9PT0gZXZlbnQuYXR0cmlidXRlcy5wcm9kdWN0SWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdFRpdGxlID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFByb2R1Y3Q/LmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IG1hdGNoZWRQcm9kdWN0LmF0dHJpYnV0ZXMudGl0bGVcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHMoXG4gICAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RUaXRsZSA9IGRldGFpbHM/LnRpdGxlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0VGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21BZGRUb0NhcnRFdmVudChldmVudCwgcHJvZHVjdFRpdGxlKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVR5cGUgIT09IEZvcm1UeXBlLkVzY2FsYXRpb24sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtUmVzcG9uc2UgJiYgZm9ybVJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFttZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudChldmVudCwgZm9ybVJlc3BvbnNlLmF0dHJpYnV0ZXMpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICkuZmlsdGVyKChtZXNzYWdlKTogbWVzc2FnZSBpcyBNZXNzYWdlW10gPT4gbWVzc2FnZS5sZW5ndGggPiAwKTtcblxuICAgIC8vIFNvcnQgdGhlIG1lc3NhZ2VzIGNocm9ub2xvZ2ljYWxseSB0byByZWNvbnN0cnVjdCB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3Qgc29ydGVkTWVzc2FnZXMgPSBbLi4uYXNzaXN0YW50TWVzc2FnZXMsIC4uLnVzZXJNZXNzYWdlc10uc29ydChcbiAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShhWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYlswXS5jcmVhdGVkQXQpLmdldFRpbWUoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2VzLCB1c2VyRXZlbnRzLCBzdWdnZXN0aW9ucywgbWVzc2FnZXM6IHNvcnRlZE1lc3NhZ2VzIH07XG4gIH07XG5cbiAgc3RhdGljIGdldEhhcmRjb3B5ID0gYXN5bmMgKHJlcXVlc3Q6IFdpZGdldFRleHRSZXF1ZXN0KTogUHJvbWlzZTxXaWRnZXRUZXh0PiA9PiB7XG4gICAgY29uc3QgYXBpUmVxdWVzdCA9IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxV2lkZ2V0VGV4dFBvc3Qoe1xuICAgICAgV2lkZ2V0VGV4dFJlcXVlc3Q6IGFwaVJlcXVlc3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQoYXBpUmVxdWVzdCwgcmVzcG9uc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvZHVjdCBkZXRhaWxzIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdCBJRHMgdmlhIFBPU1QgL3YxL3Byb2R1Y3RzL3JldHJpZXZlLlxuICAgKiBCdWlsZHMgY29udGV4dCBmcm9tIHRoZSBjdXJyZW50IGF0b20gc3RvcmUgKG9yZywgdXNlciwgY2hhdCwgZXRjLikgYW5kIHJldHVybnNcbiAgICogcHJvZHVjdHMgaW4gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgKGNhbWVsQ2FzZSBhdHRyaWJ1dGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZHMgLSBMaXN0IG9mIHByb2R1Y3QgSURzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgd2l0aCBwcm9kdWN0cyBhbmQgdG90YWxQcm9kdWN0Q291bnRcbiAgICovXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3RzID0gYXN5bmMgKHByb2R1Y3RJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PiA9PiB7XG4gICAgaWYgKHByb2R1Y3RJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBwcm9kdWN0czogW10sIHRvdGFsUHJvZHVjdENvdW50OiAwIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3Qgb3JnU2hvcnROYW1lID0gYXRvbVN0b3JlLmdldChvcmdTaG9ydE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgICAgY29uc3QgdXNlcklkID0gYXRvbVN0b3JlLmdldCh1c2VySWRBdG9tKTtcbiAgICAgIGNvbnN0IGNoYXRJZCA9IGF0b21TdG9yZS5nZXQoY2hhdElkQXRvbSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGVudiA9IGF0b21TdG9yZS5nZXQoZW52QXRvbSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCA/PyAnJyxcbiAgICAgICAgb3JnX2lkOiBvcmdJZCA/PyAnJyxcbiAgICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgICAgY2hhdF9pZDogY2hhdElkID8/ICcnLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSA/PyBDb250ZXh0U291cmNlRW51bS5BcHAsXG4gICAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnByb2R1Y3RzQXBpLnYxUHJvZHVjdHNSZXRyaWV2ZVBvc3Qoe1xuICAgICAgICBQcm9kdWN0UmV0cmlldmFsUmVxdWVzdDoge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgcHJvZHVjdF9pZHM6IHByb2R1Y3RJZHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdChyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZignRmFpbGVkIHRvIHJldHJpZXZlIHByb2R1Y3RzJywgZXJyKTtcbiAgICAgIHJldHVybiB7IHByb2R1Y3RzOiBbXSwgdG90YWxQcm9kdWN0Q291bnQ6IDAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2FjaGVzIHJlc29sdmVkIHByb2R1Y3QgZGV0YWlscyBieSBwcm9kdWN0SWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGVcbiAgLy8gc2Vzc2lvbjogdmFyaWFudCBzZWxlY3Rpb24sIHRoZSBkaXNwbGF5IG9mIHRoZSBhZGQtdG8tY2FydCBjaGF0IG1lc3NhZ2UsXG4gIC8vIGFuZCB1c2VQcm9kdWN0RGV0YWlscyBhbGwgcmVzb2x2ZSB0aGUgc2FtZSBwcm9kdWN0IHJlcGVhdGVkbHkuIEZhaWxlZFxuICAvLyByZXF1ZXN0cyBhcmUgZXZpY3RlZCBzbyBhIGxhdGVyIGNhbGwgY2FuIHJldHJ5LlxuICBwcml2YXRlIHN0YXRpYyBwcm9kdWN0RGV0YWlsc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UHJvZHVjdERldGFpbHMgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3REZXRhaWxzID0gKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuZ2V0KHByb2R1Y3RJZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZChwcm9kdWN0SWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5wcm9kdWN0RGV0YWlsc0NhY2hlLmRlbGV0ZShwcm9kdWN0SWQpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuc2V0KHByb2R1Y3RJZCwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB2YXJpYW50LWxldmVsIHByb2R1Y3QgZGV0YWlscyBmb3IgYSBzaW5nbGUgcHJvZHVjdCB2aWEgdGhlIEdyYXBoUUxcbiAgICogYG1lLnByb2R1Y3RPcHRpb25zYCBxdWVyeSBvbiBQT1NUIC92MS9ncmFwaHFsLiBPbmx5IG1lYW5pbmdmdWwgZm9yIHByb2R1Y3RzXG4gICAqIHRoYXQgb2ZmZXIgdmFyaWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZCAtIFRoZSBwcm9kdWN0IElEIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yXG4gICAqIEByZXR1cm5zIFByb2R1Y3REZXRhaWxzLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcHJvZHVjdCBoYXMgbm8gb3B0aW9ucyBkYXRhXG4gICAqIEB0aHJvd3Mgb24gbmV0d29yay9IVFRQIGZhaWx1cmUgb3IgR3JhcGhRTCBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZCA9IGFzeW5jIChcbiAgICBwcm9kdWN0SWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS92MS9ncmFwaHFsYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcXVlcnk6IGdldFByb2R1Y3RPcHRpb25zUXVlcnkoKSxcbiAgICAgICAgICB2YXJpYWJsZXM6IHsgcHJvZHVjdElkIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IocmVzcG9uc2UsIGBHcmFwaFFMIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGhRTCBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuZGF0YT8ubWU/LnByb2R1Y3RPcHRpb25zID8/IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gcmV0cmlldmUgcHJvZHVjdCBkZXRhaWxzJywgZXJyKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAocGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0KTogUHJvbWlzZTxTdXBwb3J0ZWRFdmVudD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxU3VwcG9ydGVkRXZlbnRQb3N0UmF3KHtcbiAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3IgdjFTdXBwb3J0ZWRFdmVudFBvc3QnLCB7XG4gICAgICAgIGVycixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBjb2xsZWN0aW9uczogW10sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICB0b3BfY2F0ZWdvcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkLFxuICApOiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5Gb3JrOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkZvcms7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLlBsYXlncm91bmQ6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uUGxheWdyb3VuZDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uQXBwOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkFwcDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uVGVzdDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5UZXN0O1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5FdmFsOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKHVzZXJfaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnQ29uZmlnIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3QgcmVhY3RBcHBOYW1lID0gYXRvbVN0b3JlLmdldChyZWFjdEFwcE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IGNvbnRleHRTb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFnU2VydmljZSA9IGF0b21TdG9yZS5nZXQoZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSk7IC8vIEdldCBmZWF0dXJlRmxhZ1NlcnZpY2VcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiByZWFjdEFwcE5hbWUsXG4gICAgICAgIHVzZXJfaWQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5tYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZShjb250ZXh0U291cmNlKSxcbiAgICAgICAgaW5jbHVkZV9leHBlcmltZW50czogT2JqZWN0LnZhbHVlcyhQcm9kdWN0RXhwZXJpbWVudCksXG4gICAgICAgIGluY2x1ZGVfZmVhdHVyZV9nYXRlczogT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZmVhdHVyZUZsYWdTZXJ2aWNlPy5mZWF0dXJlRmxhZ1NlcnZpY2U/LmdldEZlYXR1cmVGbGFncygpIHx8IHt9LFxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQocmVxdWVzdCk7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmxvZ0Vycm9yKGBGYWlsZWQgdG8gZ2V0IG9yZyBjb25maWdgLCBlcnIsIHsgZXJyIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgICBzcGlmZnlVc2VySWQ6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGN1c3RvbWVyU2VydmljZVByb3ZpZGVyOiBDdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgKSA9PiB7XG4gICAgbG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWAsXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGkudjFDdXN0c2VydmljZUFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblBvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBBZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb25SZXF1ZXN0OiB7XG4gICAgICAgICAgICBzcGlmZnlfdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICBjdXN0b21lcl9zZXJ2aWNlX3Byb3ZpZGVyOiBjdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGFkZCBub3RlIHRvIGxhdGVzdCBjb252ZXJzYXRpb24nLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuY3VzdG9tZXJTZXJ2aWNlQXBpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tZXJjZUFwaUNsaWVudDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUVBLE1BQU0sU0FBUyxJQUFJQSx1QkFBTyxlQUFlO0FBRXpDLGVBQWUsa0JBQWtCLE9BQXNCO0FBQ3JELEtBQUk7QUFDRixTQUFPLE1BQU0sTUFBTSxTQUFTLE1BQU07U0FDNUI7QUFDTixTQUFPLEVBQUU7OztBQUliLGVBQWUsOEJBQThCLFVBQWtCLE9BQWdCO0FBQzdFLEtBQUksRUFBRSxpQkFBaUJDLGdEQUFnQjtBQUNyQyxTQUFPLFFBQVEsVUFBVSxNQUFNO0FBQy9CLFFBQU07O0NBR1IsTUFBTSxnQkFBZ0IsTUFBTSxrQkFBa0IsTUFBTTtBQUNwRCxL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
417
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2UtYXBpLmNqcyIsIm5hbWVzIjpbIkxvZ2dlciIsIlJlc3BvbnNlRXJyb3IiLCJVbnN1cHBvcnRlZFByb2R1Y3RFeGNlcHRpb24iLCJTZXNzaW9uUmVzdGFydFJlcXVpcmVkIiwiZ2V0QXRvbVN0b3JlIiwiYmFzZVVybEF0b20iLCJjb25maWc6IENvbmZpZ3VyYXRpb24iLCJDb25maWd1cmF0aW9uIiwib3JnTGV2ZWxBcGlLZXlBdG9tIiwiRGVmYXVsdEFwaSIsIkluZmVyZW5jZUFwaSIsIkN1c3RvbWVyU2VydmljZUFwaSIsIlByb2R1Y3RzQXBpIiwib3JnU2hvcnROYW1lQXRvbSIsIm9yZ0lkQXRvbSIsInVzZXJJZEF0b20iLCJjaGF0SWRBdG9tIiwiY29udGV4dFNvdXJjZUF0b20iLCJlbnZBdG9tIiwiZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSIsImNvbnRleHQ6IENvbnRleHQiLCJDb250ZXh0U291cmNlRW51bSIsIkNvbnRleHRFbnZFbnVtIiwiZ2V0UXVlcnlQYXJhbSIsInJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIiwibWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwibWVzc2FnZUZyb21SZXNwb25zZSIsImVycjogdW5rbm93biIsImVycm9yOiB1bmtub3duIiwidmFsaWRhdGVTdWdnZXN0aW9uIiwiZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSIsInJlc3BvbnNlczogUmVzcG9uc2VbXVtdIiwic3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSIsInVzZXJFdmVudHM6IFVzZXJFdmVudFtdIiwidmFsaWRhdGVVc2VyRXZlbnQiLCJVc2VyRXZlbnRDYXRlZ29yeSIsImFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsIlJlc3BvbnNlQ2F0ZWdvcnkiLCJ1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdIiwibWVzc2FnZUZyb21RdWVyeUV2ZW50IiwibWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQiLCJtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50IiwiRm9ybVR5cGUiLCJtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCIsImNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCIsImFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQiLCJwcm9kdWN0UmV0cmlldmFsUmVzcG9uc2VUb1Byb2R1Y3RSZXRyaWV2YWxSZXN1bHQiLCJnZXRQcm9kdWN0T3B0aW9uc1F1ZXJ5IiwiY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdCIsIlYxT3JnQ29uZmlnR2V0U291cmNlRW51bSIsInJlYWN0QXBwTmFtZUF0b20iLCJyZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QiLCJQcm9kdWN0RXhwZXJpbWVudCIsInZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbixcbiAgQ29udGV4dEVudkVudW0sXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBEZWZhdWx0QXBpLFxuICBGb3JtVHlwZSxcbiAgSW5mZXJlbmNlQXBpLFxuICBQcm9kdWN0c0FwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlQ2F0ZWdvcnksXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudC9kaXN0L21vZGVscy9Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJ3NyYy9hdG9tcy9zZWFyY2gvdHlwZXMnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgT3JnQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQge1xuICBQcm9kdWN0RGV0YWlscyxcbiAgZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSxcbn0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsL3F1ZXJpZXMvZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvcHJvZHVjdEV4cGVyaW1lbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudCc7XG5pbXBvcnQge1xuICBnZXRRdWVyeVBhcmFtLFxuICBtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50LFxuICBtZXNzYWdlRnJvbVF1ZXJ5RXZlbnQsXG4gIG1lc3NhZ2VGcm9tUmVzcG9uc2UsXG4gIG1lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQnO1xuaW1wb3J0IHsgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNoYXRJZEF0b20sIHVzZXJJZEF0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwJzsgLy8gSW1wb3J0IHVzZXJJZEF0b20gYW5kIGNoYXRJZEF0b21cbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50IH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IGdldEF0b21TdG9yZSB9IGZyb20gJ3NyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlJztcbmltcG9ydCB7IHJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2Vudml2ZS9yZXNvbHZlZEJhc2VDb25maWdWZXJzaW9uJztcbmltcG9ydCB7XG4gIGJhc2VVcmxBdG9tLFxuICBjb250ZXh0U291cmNlQXRvbSxcbiAgZW52QXRvbSxcbiAgb3JnSWRBdG9tLFxuICBvcmdMZXZlbEFwaUtleUF0b20sXG4gIG9yZ1Nob3J0TmFtZUF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sIC8vIEltcG9ydCBlbnZBdG9tXG59IGZyb20gJ3NyYy9hdG9tcy9lbnZpdmUvZW52aXZlQ29uZmlnJztcbmltcG9ydCB7IGZlYXR1cmVGbGFnU2VydmljZUF0b20gfSBmcm9tICdzcmMvYXRvbXMvb3JnL2dyYXBocWxDb25maWcnOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuaW1wb3J0IHsgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Vuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgV2lkZ2V0VGV4dCB9IGZyb20gJy4vbW9kZWxzL2FwaS93aWRnZXRUZXh0JztcbmltcG9ydCB7IFdpZGdldFRleHRSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBpL3dpZGdldFRleHRSZXF1ZXN0JztcbmltcG9ydCB7IHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJy4vdXRpbHMvcHJvZHVjdFJldHJpZXZhbFJlc3BvbnNlVG9Qcm9kdWN0UmV0cmlldmFsUmVzdWx0JztcbmltcG9ydCB7IGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQgfSBmcm9tICcuL3V0aWxzL3dpZGdldFRleHRGcm9tQXBpV2lkZ2V0VGV4dFJlc3BvbnNlJztcbmltcG9ydCB7IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCB9IGZyb20gJy4vdXRpbHMvd2lkZ2V0VGV4dFJlcXVlc3RUb0FwaVJlcXVlc3QnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdjb21tZXJjZS1hcGknKTtcblxuYXN5bmMgZnVuY3Rpb24gZXJyb3JSZXNwb25zZUJvZHkoZXJyb3I6IFJlc3BvbnNlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3IucmVzcG9uc2UuanNvbigpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoZXJyb3JNc2c6IHN0cmluZywgZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yKSkge1xuICAgIGxvZ2dlci5sb2dJbmZvKGVycm9yTXNnLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBjb25zdCBlcnJvclJlc3BvbnNlID0gYXdhaXQgZXJyb3JSZXNwb25zZUJvZHkoZXJyb3IpO1xuICBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3Vuc3VwcG9ydGVkIHByb2R1Y3QnIHx8IC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgQVBJIHJldHVybiBzdWJfY29kZSBpbnN0ZWFkIG9mIG1lc3NhZ2VcbiAgICBlcnJvclJlc3BvbnNlPy5hcHBfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gJ1BST0RVQ1RfTk9UX0ZPVU5EJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdSRVNUQVJUX1NFU1NJT04nIHx8XG4gICAgZXJyb3JSZXNwb25zZT8uc3ViX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdOT1RfRk9VTkQnIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXcgQVBJIHJlc3BvbnNlcyB3aWxsIGNvbnRhaW4gXCJhcHBfY29kZVwiXG4gICkge1xuICAgIGxvZ2dlci5sb2dJbmZvKFxuICAgICAgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QuIFJlLXN0YXJ0IHNlc3Npb24nLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2UsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCgpO1xuICB9XG5cbiAgbG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbmNsYXNzIENvbW1lcmNlQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBpOiBEZWZhdWx0QXBpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tZXJTZXJ2aWNlQXBpOiBDdXN0b21lclNlcnZpY2VBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZlcmVuY2VBcGk6IEluZmVyZW5jZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQXBpOiBQcm9kdWN0c0FwaTtcblxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tbWVyY2VBcGlDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSA9ICgpOiBDb21tZXJjZUFwaUNsaWVudCA9PiB7XG4gICAgaWYgKCFDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2UgPSBuZXcgQ29tbWVyY2VBcGlDbGllbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihiYXNlUGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG4gICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoIHx8IGJhc2VVcmw7XG4gICAgLy8gQVBJIEtleSBpcyBub3cgaGFuZGxlZCBhdCB0aGUgRW52aXZlQ29uZmlnUHJvdmlkZXIgbGV2ZWxcbiAgICBjb25zdCBjb25maWc6IENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gICAgICBhY2Nlc3NUb2tlbjogYXBpS2V5LFxuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICAgIHRoaXMucHJvZHVjdHNBcGkgPSBuZXcgUHJvZHVjdHNBcGkoY29uZmlnKTtcbiAgfVxuXG4gIC8vIERlZHVwZXMgY29uY3VycmVudCByZXNvbHV0aW9ucyBvZiB0aGUgc2FtZSBVUkw6IHRoZSBpbmplY3Rpb24gYnVuZGxlXG4gIC8vIHdhcm1zIHRoaXMgY2FsbCBiZWZvcmUgUmVhY3QgbW91bnRzLCBhbmQgUGFnZVByb3ZpZGVyIG1heSByZXF1ZXN0IHRoZVxuICAvLyBzYW1lIFVSTCB3aGlsZSB0aGUgd2FybS11cCBpcyBzdGlsbCBpbiBmbGlnaHQuXG4gIHByaXZhdGUgc3RhdGljIGluRmxpZ2h0VXJsUmVzb2x1dGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICBzdGF0aWMgcmVzb2x2ZVVybCA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gQ29tbWVyY2VBcGlDbGllbnQuaW5GbGlnaHRVcmxSZXNvbHV0aW9ucy5nZXQodXJsKTtcbiAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgIHJldHVybiBpbkZsaWdodDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJlc29sdmVVcmxVbmNhY2hlZCh1cmwpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmluRmxpZ2h0VXJsUmVzb2x1dGlvbnMuc2V0KHVybCwgcmVxdWVzdCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbkZsaWdodFVybFJlc29sdXRpb25zLmRlbGV0ZSh1cmwpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlVXJsVW5jYWNoZWQgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gJycsXG4gICAgICBvcmdfaWQ6IG9yZ0lkID8/ICcnLFxuICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyAnJyxcbiAgICAgIHNvdXJjZTogc291cmNlID8/IENvbnRleHRTb3VyY2VFbnVtLkFwcCxcbiAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LCAvLyBDYXN0IGVudiB0byBDb250ZXh0RW52RW51bVxuICAgIH07XG5cbiAgICBjb25zdCBvdmVycmlkZUNvbmZpZ1ZlcnNpb24gPVxuICAgICAgZ2V0UXVlcnlQYXJhbSgnc3BpZmZ5X2NvbmZpZ192ZXJzaW9uJykgfHxcbiAgICAgIGdldFF1ZXJ5UGFyYW0oJ2Vudml2ZV9jb25maWdfdmVyc2lvbicpIHx8XG4gICAgICBnZXRBdG9tU3RvcmUoKS5nZXQocmVzb2x2ZWRCYXNlQ29uZmlnVmVyc2lvbkF0b20pIHx8XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmZWF0dXJlR2F0ZXMgPSBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgICBvdmVycmlkZV9jb25maWdfdmVyc2lvbjogb3ZlcnJpZGVDb25maWdWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICBVcmxSZXNvbHZpbmdSZXF1ZXN0OiB1cmxSZXNvbHZpbmdSZXF1ZXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmF3UmVzcG9uc2UucmF3Lmpzb24oKTtcblxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gIH07XG5cbiAgc3RhdGljIHJlcG9ydFNlc3Npb24gPSBhc3luYyAocmVwb3J0UmVxdWVzdDogUmVwb3J0U2Vzc2lvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFDaGF0c1JlcG9ydFNlc3Npb25JZFBvc3Qoe1xuICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgfSk7XG4gIH07XG5cbiAgc3RhdGljIGdldE5leHRSZXNwb25zZXMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKHJlc3AgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcChyZXNwID0+IG1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzcCkpO1xuXG4gICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKChtKTogbSBpcyBNZXNzYWdlID0+IG0gIT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBsb2dnZXIubG9nSW5mbygnRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlcycsIGVyciwge1xuICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgbmV4dCByZXNwb25zZXMnLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UmVzcG9uc2UsIHZvaWQsIHVua25vd24+ID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiogZ2VuZXJhdGUoaW5mZXJlbmNlQXBpOiBJbmZlcmVuY2VBcGksIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtaW5nIGlzIGVuYWJsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW5mZXJlbmNlQXBpLnYxTmV4dFJlc3BvbnNlc1Bvc3RSYXcoXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgYXMgYSBzdHJlYW0gb2YgZGF0YVxuICAgICAgICBpZiAoIXJlc3BvbnNlLnJhdy5ib2R5KSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdObyBib2R5IGluIHRoZSBzdHJlYW1lZCByZXNwb25zZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5yYXcuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcblxuICAgICAgICAvLyBCdWZmZXIgaG9sZGluZyB0aGUgdHJhaWxpbmcgaW5jb21wbGV0ZSBsaW5lIG9mIHRoZSBwcmV2aW91cyBjaHVua1xuICAgICAgICBsZXQgcGFydGlhbCA9ICcnO1xuXG4gICAgICAgIGNvbnN0IHNhZmVQYXJzZSA9IChsaW5lOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobGluZSk7IC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZ1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBwYXJzaW5nIHN0cmVhbWVkIGxpbmUnLCBlcnIsIHsgbGluZSB9KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJzZUxpbmVzID0gKGxpbmVzOiBzdHJpbmdbXSk6IHVua25vd25bXSA9PlxuICAgICAgICAgIGxpbmVzXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKC9eZGF0YTogLywgJycpLnRyaW0oKSkgLy8gUmVtb3ZlIHRoZSBcImRhdGE6IFwiIHByZWZpeFxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUgIT09ICcnICYmIGxpbmUgIT09ICdbRE9ORV0nKSAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYW5kIFwiW0RPTkVdXCJcbiAgICAgICAgICAgIC5tYXAoc2FmZVBhcnNlKVxuICAgICAgICAgICAgLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQSBjaHVuayBib3VuZGFyeSBjYW4gZmFsbCBtaWQtbGluZSwgc28gb25seSBwYXJzZSB0aGUgbGluZXMgdGhhdFxuICAgICAgICAgIC8vIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgbmV3bGluZSBhbmQgaG9sZCB0aGUgcmVzdCB1bnRpbCB0aGUgbmV4dCBjaHVua1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gYCR7cGFydGlhbH0ke2RlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KX1gLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICBwYXJ0aWFsID0gbGluZXMucG9wKCkgPz8gJyc7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZExpbmUgb2YgcGFyc2VMaW5lcyhsaW5lcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gdmFsaWRhdGVSZXNwb25zZShwYXJzZWRMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZsdXNoIHRoZSByZW1haW5kZXIgb2YgYSBzdHJlYW0gdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSBuZXdsaW5lXG4gICAgICAgIGZvciAoY29uc3QgcGFyc2VkTGluZSBvZiBwYXJzZUxpbmVzKFtgJHtwYXJ0aWFsfSR7ZGVjb2Rlci5kZWNvZGUoKX1gXSkpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXNwb25zZSA9IHZhbGlkYXRlUmVzcG9uc2UocGFyc2VkTGluZSk7XG5cbiAgICAgICAgICBpZiAodmFsaWRhdGVkUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yLCB7XG4gICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlKFxuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGksXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlcixcbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0U3VnZ2VzdGlvbnMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxTdWdnZXN0aW9uW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRTdWdnZXN0aW9uc1Bvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbmFsOiBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcChyZXNwID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihyZXNwKSlcbiAgICAgICAgLmZpbHRlcigoc3VnZ2VzdGlvbik6IHN1Z2dlc3Rpb24gaXMgU3VnZ2VzdGlvbiA9PiBzdWdnZXN0aW9uICE9IG51bGwpO1xuXG4gICAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZ2dlci5sb2dJbmZvKCdGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zJywgZXJyb3IsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgc3VnZ2VzdGlvbnMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIHJlc3BvbnNlczogUmVzcG9uc2VbXVtdO1xuICAgIHVzZXJFdmVudHM6IFVzZXJFdmVudFtdO1xuICAgIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW107XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXVtdO1xuICB9PiA9PiB7XG4gICAgbGV0IGRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UgPSB7XG4gICAgICByZXNwb25zZXM6IFtdLFxuICAgICAgc3VnZ2VzdGlvbnM6IFtdLFxuICAgICAgdXNlcl9ldmVudHM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yZ19pZDogb3JnSWQsXG4gICAgICBjaGF0X2lkOiBjaGF0SWQsXG4gICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUdldFNlc3Npb25NZXNzYWdlcyhyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgY2hhdCByZXNwb25zZXMnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdW10gPSBkYXRhPy5yZXNwb25zZXM/Lm1hcCh0dXJuID0+XG4gICAgICB0dXJuXG4gICAgICAgIC5tYXAocmVzcG9uc2UgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbCksXG4gICAgKTtcblxuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10gPSBkYXRhPy5zdWdnZXN0aW9uc1xuICAgICAgLm1hcChzdWdnZXN0aW9uID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihzdWdnZXN0aW9uKSlcbiAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgIGNvbnN0IHVzZXJFdmVudHM6IFVzZXJFdmVudFtdID0gZGF0YT8udXNlcl9ldmVudHNcbiAgICAgIC5tYXAoZXZlbnQgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoZXZlbnQgPT4gZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpXG4gICAgICAubWFwKGV2ZW50ID0+IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQpO1xuXG4gICAgY29uc3QgYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gcmVzcG9uc2VzXG4gICAgICAubWFwKHR1cm4gPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiZcbiAgICAgICAgICAgICAgICBmb3JtU3VibWl0dGVkVXNlckV2ZW50c0Zvcm1JZHMuaW5jbHVkZXMocmVzcG9uc2UuaWQpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAocmVzcG9uc2UgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcih0dXJuID0+IHR1cm4ubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJFdmVudHMubWFwKGFzeW5jIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoW1VzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsIFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaF0uaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnQpIHtcbiAgICAgICAgICAgIC8vIEhpc3RvcmljYWwgZXZlbnRzIG5ldmVyIGNhcnJpZWQgYSBjbGllbnQtbG9jYWwgcHJvZHVjdFRpdGxlIChpdCdzXG4gICAgICAgICAgICAvLyBkcm9wcGVkIGJlZm9yZSBoaXR0aW5nIHRoZSBiYWNrZW5kKSwgc28gcmVzb2x2ZSBpdCBoZXJlOiBmaXJzdCBmb3JcbiAgICAgICAgICAgIC8vIGZyZWUgZnJvbSBhIG1hdGNoaW5nIFByb2R1Y3QgcmVzcG9uc2UgYWxyZWFkeSBmZXRjaGVkIGFib3ZlLCB0aGVuXG4gICAgICAgICAgICAvLyBhcyBhIGZhbGxiYWNrIHZpYSB0aGUgY2FjaGVkIHByb2R1Y3QtZGV0YWlscyBjYWxsLlxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y3QgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlcy5pZCA9PT0gZXZlbnQuYXR0cmlidXRlcy5wcm9kdWN0SWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdFRpdGxlID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFByb2R1Y3Q/LmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IG1hdGNoZWRQcm9kdWN0LmF0dHJpYnV0ZXMudGl0bGVcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHMoXG4gICAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RUaXRsZSA9IGRldGFpbHM/LnRpdGxlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0VGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21BZGRUb0NhcnRFdmVudChldmVudCwgcHJvZHVjdFRpdGxlKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVR5cGUgIT09IEZvcm1UeXBlLkVzY2FsYXRpb24sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtUmVzcG9uc2UgJiYgZm9ybVJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFttZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudChldmVudCwgZm9ybVJlc3BvbnNlLmF0dHJpYnV0ZXMpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICkuZmlsdGVyKChtZXNzYWdlKTogbWVzc2FnZSBpcyBNZXNzYWdlW10gPT4gbWVzc2FnZS5sZW5ndGggPiAwKTtcblxuICAgIC8vIFNvcnQgdGhlIG1lc3NhZ2VzIGNocm9ub2xvZ2ljYWxseSB0byByZWNvbnN0cnVjdCB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3Qgc29ydGVkTWVzc2FnZXMgPSBbLi4uYXNzaXN0YW50TWVzc2FnZXMsIC4uLnVzZXJNZXNzYWdlc10uc29ydChcbiAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShhWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYlswXS5jcmVhdGVkQXQpLmdldFRpbWUoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2VzLCB1c2VyRXZlbnRzLCBzdWdnZXN0aW9ucywgbWVzc2FnZXM6IHNvcnRlZE1lc3NhZ2VzIH07XG4gIH07XG5cbiAgc3RhdGljIGdldEhhcmRjb3B5ID0gYXN5bmMgKHJlcXVlc3Q6IFdpZGdldFRleHRSZXF1ZXN0KTogUHJvbWlzZTxXaWRnZXRUZXh0PiA9PiB7XG4gICAgY29uc3QgYXBpUmVxdWVzdCA9IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxV2lkZ2V0VGV4dFBvc3Qoe1xuICAgICAgV2lkZ2V0VGV4dFJlcXVlc3Q6IGFwaVJlcXVlc3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQoYXBpUmVxdWVzdCwgcmVzcG9uc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvZHVjdCBkZXRhaWxzIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdCBJRHMgdmlhIFBPU1QgL3YxL3Byb2R1Y3RzL3JldHJpZXZlLlxuICAgKiBCdWlsZHMgY29udGV4dCBmcm9tIHRoZSBjdXJyZW50IGF0b20gc3RvcmUgKG9yZywgdXNlciwgY2hhdCwgZXRjLikgYW5kIHJldHVybnNcbiAgICogcHJvZHVjdHMgaW4gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgKGNhbWVsQ2FzZSBhdHRyaWJ1dGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZHMgLSBMaXN0IG9mIHByb2R1Y3QgSURzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgd2l0aCBwcm9kdWN0cyBhbmQgdG90YWxQcm9kdWN0Q291bnRcbiAgICovXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3RzID0gYXN5bmMgKHByb2R1Y3RJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PiA9PiB7XG4gICAgaWYgKHByb2R1Y3RJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBwcm9kdWN0czogW10sIHRvdGFsUHJvZHVjdENvdW50OiAwIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3Qgb3JnU2hvcnROYW1lID0gYXRvbVN0b3JlLmdldChvcmdTaG9ydE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgICAgY29uc3QgdXNlcklkID0gYXRvbVN0b3JlLmdldCh1c2VySWRBdG9tKTtcbiAgICAgIGNvbnN0IGNoYXRJZCA9IGF0b21TdG9yZS5nZXQoY2hhdElkQXRvbSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGVudiA9IGF0b21TdG9yZS5nZXQoZW52QXRvbSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCA/PyAnJyxcbiAgICAgICAgb3JnX2lkOiBvcmdJZCA/PyAnJyxcbiAgICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgICAgY2hhdF9pZDogY2hhdElkID8/ICcnLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSA/PyBDb250ZXh0U291cmNlRW51bS5BcHAsXG4gICAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnByb2R1Y3RzQXBpLnYxUHJvZHVjdHNSZXRyaWV2ZVBvc3Qoe1xuICAgICAgICBQcm9kdWN0UmV0cmlldmFsUmVxdWVzdDoge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgcHJvZHVjdF9pZHM6IHByb2R1Y3RJZHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdChyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZignRmFpbGVkIHRvIHJldHJpZXZlIHByb2R1Y3RzJywgZXJyKTtcbiAgICAgIHJldHVybiB7IHByb2R1Y3RzOiBbXSwgdG90YWxQcm9kdWN0Q291bnQ6IDAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2FjaGVzIHJlc29sdmVkIHByb2R1Y3QgZGV0YWlscyBieSBwcm9kdWN0SWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGVcbiAgLy8gc2Vzc2lvbjogdmFyaWFudCBzZWxlY3Rpb24sIHRoZSBkaXNwbGF5IG9mIHRoZSBhZGQtdG8tY2FydCBjaGF0IG1lc3NhZ2UsXG4gIC8vIGFuZCB1c2VQcm9kdWN0RGV0YWlscyBhbGwgcmVzb2x2ZSB0aGUgc2FtZSBwcm9kdWN0IHJlcGVhdGVkbHkuIEZhaWxlZFxuICAvLyByZXF1ZXN0cyBhcmUgZXZpY3RlZCBzbyBhIGxhdGVyIGNhbGwgY2FuIHJldHJ5LlxuICBwcml2YXRlIHN0YXRpYyBwcm9kdWN0RGV0YWlsc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UHJvZHVjdERldGFpbHMgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3REZXRhaWxzID0gKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuZ2V0KHByb2R1Y3RJZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZChwcm9kdWN0SWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5wcm9kdWN0RGV0YWlsc0NhY2hlLmRlbGV0ZShwcm9kdWN0SWQpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuc2V0KHByb2R1Y3RJZCwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB2YXJpYW50LWxldmVsIHByb2R1Y3QgZGV0YWlscyBmb3IgYSBzaW5nbGUgcHJvZHVjdCB2aWEgdGhlIEdyYXBoUUxcbiAgICogYG1lLnByb2R1Y3RPcHRpb25zYCBxdWVyeSBvbiBQT1NUIC92MS9ncmFwaHFsLiBPbmx5IG1lYW5pbmdmdWwgZm9yIHByb2R1Y3RzXG4gICAqIHRoYXQgb2ZmZXIgdmFyaWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZCAtIFRoZSBwcm9kdWN0IElEIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yXG4gICAqIEByZXR1cm5zIFByb2R1Y3REZXRhaWxzLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcHJvZHVjdCBoYXMgbm8gb3B0aW9ucyBkYXRhXG4gICAqIEB0aHJvd3Mgb24gbmV0d29yay9IVFRQIGZhaWx1cmUgb3IgR3JhcGhRTCBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZCA9IGFzeW5jIChcbiAgICBwcm9kdWN0SWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS92MS9ncmFwaHFsYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcXVlcnk6IGdldFByb2R1Y3RPcHRpb25zUXVlcnkoKSxcbiAgICAgICAgICB2YXJpYWJsZXM6IHsgcHJvZHVjdElkIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IocmVzcG9uc2UsIGBHcmFwaFFMIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGhRTCBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuZGF0YT8ubWU/LnByb2R1Y3RPcHRpb25zID8/IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gcmV0cmlldmUgcHJvZHVjdCBkZXRhaWxzJywgZXJyKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAocGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0KTogUHJvbWlzZTxTdXBwb3J0ZWRFdmVudD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxU3VwcG9ydGVkRXZlbnRQb3N0UmF3KHtcbiAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3IgdjFTdXBwb3J0ZWRFdmVudFBvc3QnLCB7XG4gICAgICAgIGVycixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBjb2xsZWN0aW9uczogW10sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICB0b3BfY2F0ZWdvcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkLFxuICApOiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5Gb3JrOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkZvcms7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLlBsYXlncm91bmQ6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uUGxheWdyb3VuZDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uQXBwOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkFwcDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uVGVzdDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5UZXN0O1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5FdmFsOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKHVzZXJfaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnQ29uZmlnIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3QgcmVhY3RBcHBOYW1lID0gYXRvbVN0b3JlLmdldChyZWFjdEFwcE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IGNvbnRleHRTb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFnU2VydmljZSA9IGF0b21TdG9yZS5nZXQoZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSk7IC8vIEdldCBmZWF0dXJlRmxhZ1NlcnZpY2VcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiByZWFjdEFwcE5hbWUsXG4gICAgICAgIHVzZXJfaWQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5tYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZShjb250ZXh0U291cmNlKSxcbiAgICAgICAgaW5jbHVkZV9leHBlcmltZW50czogT2JqZWN0LnZhbHVlcyhQcm9kdWN0RXhwZXJpbWVudCksXG4gICAgICAgIGluY2x1ZGVfZmVhdHVyZV9nYXRlczogT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZmVhdHVyZUZsYWdTZXJ2aWNlPy5mZWF0dXJlRmxhZ1NlcnZpY2U/LmdldEZlYXR1cmVGbGFncygpIHx8IHt9LFxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQocmVxdWVzdCk7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmxvZ0Vycm9yKGBGYWlsZWQgdG8gZ2V0IG9yZyBjb25maWdgLCBlcnIsIHsgZXJyIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgICBzcGlmZnlVc2VySWQ6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGN1c3RvbWVyU2VydmljZVByb3ZpZGVyOiBDdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgKSA9PiB7XG4gICAgbG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWAsXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGkudjFDdXN0c2VydmljZUFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblBvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBBZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb25SZXF1ZXN0OiB7XG4gICAgICAgICAgICBzcGlmZnlfdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICBjdXN0b21lcl9zZXJ2aWNlX3Byb3ZpZGVyOiBjdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGFkZCBub3RlIHRvIGxhdGVzdCBjb252ZXJzYXRpb24nLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuY3VzdG9tZXJTZXJ2aWNlQXBpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tZXJjZUFwaUNsaWVudDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUVBLE1BQU0sU0FBUyxJQUFJQSx1QkFBTyxlQUFlO0FBRXpDLGVBQWUsa0JBQWtCLE9BQXNCO0FBQ3JELEtBQUk7QUFDRixTQUFPLE1BQU0sTUFBTSxTQUFTLE1BQU07U0FDNUI7QUFDTixTQUFPLEVBQUU7OztBQUliLGVBQWUsOEJBQThCLFVBQWtCLE9BQWdCO0FBQzdFLEtBQUksRUFBRSxpQkFBaUJDLGdEQUFnQjtBQUNyQyxTQUFPLFFBQVEsVUFBVSxNQUFNO0FBQy9CLFFBQU07O0NBR1IsTUFBTSxnQkFBZ0IsTUFBTSxrQkFBa0IsTUFBTTtBQUNwRCxLQUNFLGVBQWUsU0FBUyxhQUFhLEtBQUsseUJBQzFDLGVBQWUsVUFBVSxhQUFhLEtBQUssb0JBRTNDLE9BQU0s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
@@ -153,26 +153,25 @@ var CommerceApiClient = class CommerceApiClient {
153
153
  try {
154
154
  return JSON.parse(line);
155
155
  } catch (err) {
156
- logger.logError("Error parsing streamed line", err, {
157
- line,
158
- partial
159
- });
160
- partial = line;
161
- return partial;
156
+ logger.logError("Error parsing streamed line", err, { line });
157
+ return null;
162
158
  }
163
159
  };
164
- const processChunk = (chunk) => {
165
- return `${partial}${chunk}`.split("\n").map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v);
166
- };
160
+ const parseLines = (lines) => lines.map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v != null);
167
161
  while (true) {
168
162
  const { done, value } = await reader.read();
169
163
  if (done) break;
170
- const parsedLines = processChunk(decoder.decode(value));
171
- for (const parsedLine of parsedLines) {
164
+ const lines = `${partial}${decoder.decode(value, { stream: true })}`.split("\n");
165
+ partial = lines.pop() ?? "";
166
+ for (const parsedLine of parseLines(lines)) {
172
167
  const validatedResponse = validateResponse(parsedLine);
173
168
  if (validatedResponse) yield validatedResponse;
174
169
  }
175
170
  }
171
+ for (const parsedLine of parseLines([`${partial}${decoder.decode()}`])) {
172
+ const validatedResponse = validateResponse(parsedLine);
173
+ if (validatedResponse) yield validatedResponse;
174
+ }
176
175
  } catch (error) {
177
176
  logger.logError("Failed to get next streaming responses", error, {
178
177
  payloadContext: payload?.context,
@@ -414,4 +413,4 @@ var commerce_api_default = CommerceApiClient;
414
413
 
415
414
  //#endregion
416
415
  export { commerce_api_default as default };
417
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2UtYXBpLmpzIiwibmFtZXMiOlsiTG9nZ2VyIiwiY29uZmlnOiBDb25maWd1cmF0aW9uIiwiY29udGV4dDogQ29udGV4dCIsImVycjogdW5rbm93biIsImVycm9yOiB1bmtub3duIiwiZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSIsInJlc3BvbnNlczogUmVzcG9uc2VbXVtdIiwic3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSIsInVzZXJFdmVudHM6IFVzZXJFdmVudFtdIiwiYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdIiwidXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsInJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbixcbiAgQ29udGV4dEVudkVudW0sXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBEZWZhdWx0QXBpLFxuICBGb3JtVHlwZSxcbiAgSW5mZXJlbmNlQXBpLFxuICBQcm9kdWN0c0FwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlQ2F0ZWdvcnksXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudC9kaXN0L21vZGVscy9Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJ3NyYy9hdG9tcy9zZWFyY2gvdHlwZXMnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgT3JnQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQge1xuICBQcm9kdWN0RGV0YWlscyxcbiAgZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSxcbn0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsL3F1ZXJpZXMvZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvcHJvZHVjdEV4cGVyaW1lbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudCc7XG5pbXBvcnQge1xuICBnZXRRdWVyeVBhcmFtLFxuICBtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50LFxuICBtZXNzYWdlRnJvbVF1ZXJ5RXZlbnQsXG4gIG1lc3NhZ2VGcm9tUmVzcG9uc2UsXG4gIG1lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQnO1xuaW1wb3J0IHsgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNoYXRJZEF0b20sIHVzZXJJZEF0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwJzsgLy8gSW1wb3J0IHVzZXJJZEF0b20gYW5kIGNoYXRJZEF0b21cbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50IH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IGdldEF0b21TdG9yZSB9IGZyb20gJ3NyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlJztcbmltcG9ydCB7IHJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2Vudml2ZS9yZXNvbHZlZEJhc2VDb25maWdWZXJzaW9uJztcbmltcG9ydCB7XG4gIGJhc2VVcmxBdG9tLFxuICBjb250ZXh0U291cmNlQXRvbSxcbiAgZW52QXRvbSxcbiAgb3JnSWRBdG9tLFxuICBvcmdMZXZlbEFwaUtleUF0b20sXG4gIG9yZ1Nob3J0TmFtZUF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sIC8vIEltcG9ydCBlbnZBdG9tXG59IGZyb20gJ3NyYy9hdG9tcy9lbnZpdmUvZW52aXZlQ29uZmlnJztcbmltcG9ydCB7IGZlYXR1cmVGbGFnU2VydmljZUF0b20gfSBmcm9tICdzcmMvYXRvbXMvb3JnL2dyYXBocWxDb25maWcnOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuaW1wb3J0IHsgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Vuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgV2lkZ2V0VGV4dCB9IGZyb20gJy4vbW9kZWxzL2FwaS93aWRnZXRUZXh0JztcbmltcG9ydCB7IFdpZGdldFRleHRSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBpL3dpZGdldFRleHRSZXF1ZXN0JztcbmltcG9ydCB7IHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJy4vdXRpbHMvcHJvZHVjdFJldHJpZXZhbFJlc3BvbnNlVG9Qcm9kdWN0UmV0cmlldmFsUmVzdWx0JztcbmltcG9ydCB7IGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQgfSBmcm9tICcuL3V0aWxzL3dpZGdldFRleHRGcm9tQXBpV2lkZ2V0VGV4dFJlc3BvbnNlJztcbmltcG9ydCB7IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCB9IGZyb20gJy4vdXRpbHMvd2lkZ2V0VGV4dFJlcXVlc3RUb0FwaVJlcXVlc3QnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdjb21tZXJjZS1hcGknKTtcblxuYXN5bmMgZnVuY3Rpb24gZXJyb3JSZXNwb25zZUJvZHkoZXJyb3I6IFJlc3BvbnNlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3IucmVzcG9uc2UuanNvbigpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoZXJyb3JNc2c6IHN0cmluZywgZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yKSkge1xuICAgIGxvZ2dlci5sb2dJbmZvKGVycm9yTXNnLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBjb25zdCBlcnJvclJlc3BvbnNlID0gYXdhaXQgZXJyb3JSZXNwb25zZUJvZHkoZXJyb3IpO1xuICBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3Vuc3VwcG9ydGVkIHByb2R1Y3QnIHx8IC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgQVBJIHJldHVybiBzdWJfY29kZSBpbnN0ZWFkIG9mIG1lc3NhZ2VcbiAgICBlcnJvclJlc3BvbnNlPy5hcHBfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gJ1BST0RVQ1RfTk9UX0ZPVU5EJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdSRVNUQVJUX1NFU1NJT04nIHx8XG4gICAgZXJyb3JSZXNwb25zZT8uc3ViX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdOT1RfRk9VTkQnIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXcgQVBJIHJlc3BvbnNlcyB3aWxsIGNvbnRhaW4gXCJhcHBfY29kZVwiXG4gICkge1xuICAgIGxvZ2dlci5sb2dJbmZvKFxuICAgICAgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QuIFJlLXN0YXJ0IHNlc3Npb24nLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2UsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCgpO1xuICB9XG5cbiAgbG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbmNsYXNzIENvbW1lcmNlQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBpOiBEZWZhdWx0QXBpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tZXJTZXJ2aWNlQXBpOiBDdXN0b21lclNlcnZpY2VBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZlcmVuY2VBcGk6IEluZmVyZW5jZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQXBpOiBQcm9kdWN0c0FwaTtcblxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tbWVyY2VBcGlDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSA9ICgpOiBDb21tZXJjZUFwaUNsaWVudCA9PiB7XG4gICAgaWYgKCFDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2UgPSBuZXcgQ29tbWVyY2VBcGlDbGllbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihiYXNlUGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG4gICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoIHx8IGJhc2VVcmw7XG4gICAgLy8gQVBJIEtleSBpcyBub3cgaGFuZGxlZCBhdCB0aGUgRW52aXZlQ29uZmlnUHJvdmlkZXIgbGV2ZWxcbiAgICBjb25zdCBjb25maWc6IENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gICAgICBhY2Nlc3NUb2tlbjogYXBpS2V5LFxuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICAgIHRoaXMucHJvZHVjdHNBcGkgPSBuZXcgUHJvZHVjdHNBcGkoY29uZmlnKTtcbiAgfVxuXG4gIC8vIERlZHVwZXMgY29uY3VycmVudCByZXNvbHV0aW9ucyBvZiB0aGUgc2FtZSBVUkw6IHRoZSBpbmplY3Rpb24gYnVuZGxlXG4gIC8vIHdhcm1zIHRoaXMgY2FsbCBiZWZvcmUgUmVhY3QgbW91bnRzLCBhbmQgUGFnZVByb3ZpZGVyIG1heSByZXF1ZXN0IHRoZVxuICAvLyBzYW1lIFVSTCB3aGlsZSB0aGUgd2FybS11cCBpcyBzdGlsbCBpbiBmbGlnaHQuXG4gIHByaXZhdGUgc3RhdGljIGluRmxpZ2h0VXJsUmVzb2x1dGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICBzdGF0aWMgcmVzb2x2ZVVybCA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gQ29tbWVyY2VBcGlDbGllbnQuaW5GbGlnaHRVcmxSZXNvbHV0aW9ucy5nZXQodXJsKTtcbiAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgIHJldHVybiBpbkZsaWdodDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJlc29sdmVVcmxVbmNhY2hlZCh1cmwpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmluRmxpZ2h0VXJsUmVzb2x1dGlvbnMuc2V0KHVybCwgcmVxdWVzdCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbkZsaWdodFVybFJlc29sdXRpb25zLmRlbGV0ZSh1cmwpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlVXJsVW5jYWNoZWQgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gJycsXG4gICAgICBvcmdfaWQ6IG9yZ0lkID8/ICcnLFxuICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyAnJyxcbiAgICAgIHNvdXJjZTogc291cmNlID8/IENvbnRleHRTb3VyY2VFbnVtLkFwcCxcbiAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LCAvLyBDYXN0IGVudiB0byBDb250ZXh0RW52RW51bVxuICAgIH07XG5cbiAgICBjb25zdCBvdmVycmlkZUNvbmZpZ1ZlcnNpb24gPVxuICAgICAgZ2V0UXVlcnlQYXJhbSgnc3BpZmZ5X2NvbmZpZ192ZXJzaW9uJykgfHxcbiAgICAgIGdldFF1ZXJ5UGFyYW0oJ2Vudml2ZV9jb25maWdfdmVyc2lvbicpIHx8XG4gICAgICBnZXRBdG9tU3RvcmUoKS5nZXQocmVzb2x2ZWRCYXNlQ29uZmlnVmVyc2lvbkF0b20pIHx8XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmZWF0dXJlR2F0ZXMgPSBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgICBvdmVycmlkZV9jb25maWdfdmVyc2lvbjogb3ZlcnJpZGVDb25maWdWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICBVcmxSZXNvbHZpbmdSZXF1ZXN0OiB1cmxSZXNvbHZpbmdSZXF1ZXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmF3UmVzcG9uc2UucmF3Lmpzb24oKTtcblxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gIH07XG5cbiAgc3RhdGljIHJlcG9ydFNlc3Npb24gPSBhc3luYyAocmVwb3J0UmVxdWVzdDogUmVwb3J0U2Vzc2lvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFDaGF0c1JlcG9ydFNlc3Npb25JZFBvc3Qoe1xuICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgfSk7XG4gIH07XG5cbiAgc3RhdGljIGdldE5leHRSZXNwb25zZXMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKHJlc3AgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcChyZXNwID0+IG1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzcCkpO1xuXG4gICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKChtKTogbSBpcyBNZXNzYWdlID0+IG0gIT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBsb2dnZXIubG9nSW5mbygnRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlcycsIGVyciwge1xuICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgbmV4dCByZXNwb25zZXMnLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UmVzcG9uc2UsIHZvaWQsIHVua25vd24+ID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiogZ2VuZXJhdGUoaW5mZXJlbmNlQXBpOiBJbmZlcmVuY2VBcGksIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtaW5nIGlzIGVuYWJsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW5mZXJlbmNlQXBpLnYxTmV4dFJlc3BvbnNlc1Bvc3RSYXcoXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgYXMgYSBzdHJlYW0gb2YgZGF0YVxuICAgICAgICBpZiAoIXJlc3BvbnNlLnJhdy5ib2R5KSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdObyBib2R5IGluIHRoZSBzdHJlYW1lZCByZXNwb25zZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5yYXcuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcblxuICAgICAgICBsZXQgcGFydGlhbCA9ICcnO1xuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBzYWZlUGFyc2UgPSAobGluZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpOyAvLyBQYXJzZSB0aGUgSlNPTiBzdHJpbmdcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5sb2dFcnJvcignRXJyb3IgcGFyc2luZyBzdHJlYW1lZCBsaW5lJywgZXJyLCB7XG4gICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgIHBhcnRpYWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHN3YWxsb3cgdGhlIGVycm9yIGFuZCBzZXQgdGhlIHBhcnRpYWwgdG8gb3VyIGN1cnJlbnQgY2h1bmtcbiAgICAgICAgICAgIHBhcnRpYWwgPSBsaW5lO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRPRE8gdGhpcyBmdW5jdGlvbiBpcyByZWNyZWF0ZWQgZXZlcnkgdGltZSBuZXcgZGF0YSBjb21lcyBmcm9tIHRoZSBzdHJlYW0gLSBkZWZpbmUgaXQgb3V0c2lkZSBvZiB0aGUgZ2VuZXJhdG9yXG4gICAgICAgIGNvbnN0IHByb2Nlc3NDaHVuayA9IChjaHVuazogc3RyaW5nKTogdW5rbm93bltdID0+IHtcbiAgICAgICAgICAvLyBtZXJnZSB0aGUgcGFydGlhbCB3aXRoIHRoZSBpbmNvbWluZyBjaHVua1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gYCR7cGFydGlhbH0ke2NodW5rfWAuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBsaW5lc1xuICAgICAgICAgICAgLm1hcChsaW5lID0+IGxpbmUucmVwbGFjZSgvXmRhdGE6IC8sICcnKS50cmltKCkpIC8vIFJlbW92ZSB0aGUgXCJkYXRhOiBcIiBwcmVmaXhcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lICE9PSAnJyAmJiBsaW5lICE9PSAnW0RPTkVdJykgLy8gUmVtb3ZlIGVtcHR5IGxpbmVzIGFuZCBcIltET05FXVwiXG4gICAgICAgICAgICAubWFwKHNhZmVQYXJzZSlcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2KTsgLy8gYW5kIGZpbHRlciBvdXQgdGhlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgICAgICByZXR1cm4gcGFyc2VkTGluZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWFzc2FnZSBhbmQgcGFyc2UgdGhlIGNodW5rIG9mIGRhdGFcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGRlY29kZXIuZGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICBjb25zdCBwYXJzZWRMaW5lcyA9IHByb2Nlc3NDaHVuayhjaHVuayk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZExpbmUgb2YgcGFyc2VkTGluZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gdmFsaWRhdGVSZXNwb25zZShwYXJzZWRMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yLCB7XG4gICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlKFxuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGksXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlcixcbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0U3VnZ2VzdGlvbnMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxTdWdnZXN0aW9uW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRTdWdnZXN0aW9uc1Bvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbmFsOiBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcChyZXNwID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihyZXNwKSlcbiAgICAgICAgLmZpbHRlcigoc3VnZ2VzdGlvbik6IHN1Z2dlc3Rpb24gaXMgU3VnZ2VzdGlvbiA9PiBzdWdnZXN0aW9uICE9IG51bGwpO1xuXG4gICAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZ2dlci5sb2dJbmZvKCdGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zJywgZXJyb3IsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgc3VnZ2VzdGlvbnMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIHJlc3BvbnNlczogUmVzcG9uc2VbXVtdO1xuICAgIHVzZXJFdmVudHM6IFVzZXJFdmVudFtdO1xuICAgIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW107XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXVtdO1xuICB9PiA9PiB7XG4gICAgbGV0IGRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UgPSB7XG4gICAgICByZXNwb25zZXM6IFtdLFxuICAgICAgc3VnZ2VzdGlvbnM6IFtdLFxuICAgICAgdXNlcl9ldmVudHM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yZ19pZDogb3JnSWQsXG4gICAgICBjaGF0X2lkOiBjaGF0SWQsXG4gICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUdldFNlc3Npb25NZXNzYWdlcyhyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgY2hhdCByZXNwb25zZXMnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdW10gPSBkYXRhPy5yZXNwb25zZXM/Lm1hcCh0dXJuID0+XG4gICAgICB0dXJuXG4gICAgICAgIC5tYXAocmVzcG9uc2UgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbCksXG4gICAgKTtcblxuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10gPSBkYXRhPy5zdWdnZXN0aW9uc1xuICAgICAgLm1hcChzdWdnZXN0aW9uID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihzdWdnZXN0aW9uKSlcbiAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgIGNvbnN0IHVzZXJFdmVudHM6IFVzZXJFdmVudFtdID0gZGF0YT8udXNlcl9ldmVudHNcbiAgICAgIC5tYXAoZXZlbnQgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoZXZlbnQgPT4gZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpXG4gICAgICAubWFwKGV2ZW50ID0+IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQpO1xuXG4gICAgY29uc3QgYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gcmVzcG9uc2VzXG4gICAgICAubWFwKHR1cm4gPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiZcbiAgICAgICAgICAgICAgICBmb3JtU3VibWl0dGVkVXNlckV2ZW50c0Zvcm1JZHMuaW5jbHVkZXMocmVzcG9uc2UuaWQpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAocmVzcG9uc2UgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcih0dXJuID0+IHR1cm4ubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJFdmVudHMubWFwKGFzeW5jIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoW1VzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsIFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaF0uaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnQpIHtcbiAgICAgICAgICAgIC8vIEhpc3RvcmljYWwgZXZlbnRzIG5ldmVyIGNhcnJpZWQgYSBjbGllbnQtbG9jYWwgcHJvZHVjdFRpdGxlIChpdCdzXG4gICAgICAgICAgICAvLyBkcm9wcGVkIGJlZm9yZSBoaXR0aW5nIHRoZSBiYWNrZW5kKSwgc28gcmVzb2x2ZSBpdCBoZXJlOiBmaXJzdCBmb3JcbiAgICAgICAgICAgIC8vIGZyZWUgZnJvbSBhIG1hdGNoaW5nIFByb2R1Y3QgcmVzcG9uc2UgYWxyZWFkeSBmZXRjaGVkIGFib3ZlLCB0aGVuXG4gICAgICAgICAgICAvLyBhcyBhIGZhbGxiYWNrIHZpYSB0aGUgY2FjaGVkIHByb2R1Y3QtZGV0YWlscyBjYWxsLlxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y3QgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlcy5pZCA9PT0gZXZlbnQuYXR0cmlidXRlcy5wcm9kdWN0SWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdFRpdGxlID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFByb2R1Y3Q/LmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IG1hdGNoZWRQcm9kdWN0LmF0dHJpYnV0ZXMudGl0bGVcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHMoXG4gICAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RUaXRsZSA9IGRldGFpbHM/LnRpdGxlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0VGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21BZGRUb0NhcnRFdmVudChldmVudCwgcHJvZHVjdFRpdGxlKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVR5cGUgIT09IEZvcm1UeXBlLkVzY2FsYXRpb24sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtUmVzcG9uc2UgJiYgZm9ybVJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFttZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudChldmVudCwgZm9ybVJlc3BvbnNlLmF0dHJpYnV0ZXMpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICkuZmlsdGVyKChtZXNzYWdlKTogbWVzc2FnZSBpcyBNZXNzYWdlW10gPT4gbWVzc2FnZS5sZW5ndGggPiAwKTtcblxuICAgIC8vIFNvcnQgdGhlIG1lc3NhZ2VzIGNocm9ub2xvZ2ljYWxseSB0byByZWNvbnN0cnVjdCB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3Qgc29ydGVkTWVzc2FnZXMgPSBbLi4uYXNzaXN0YW50TWVzc2FnZXMsIC4uLnVzZXJNZXNzYWdlc10uc29ydChcbiAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShhWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYlswXS5jcmVhdGVkQXQpLmdldFRpbWUoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2VzLCB1c2VyRXZlbnRzLCBzdWdnZXN0aW9ucywgbWVzc2FnZXM6IHNvcnRlZE1lc3NhZ2VzIH07XG4gIH07XG5cbiAgc3RhdGljIGdldEhhcmRjb3B5ID0gYXN5bmMgKHJlcXVlc3Q6IFdpZGdldFRleHRSZXF1ZXN0KTogUHJvbWlzZTxXaWRnZXRUZXh0PiA9PiB7XG4gICAgY29uc3QgYXBpUmVxdWVzdCA9IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxV2lkZ2V0VGV4dFBvc3Qoe1xuICAgICAgV2lkZ2V0VGV4dFJlcXVlc3Q6IGFwaVJlcXVlc3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQoYXBpUmVxdWVzdCwgcmVzcG9uc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvZHVjdCBkZXRhaWxzIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdCBJRHMgdmlhIFBPU1QgL3YxL3Byb2R1Y3RzL3JldHJpZXZlLlxuICAgKiBCdWlsZHMgY29udGV4dCBmcm9tIHRoZSBjdXJyZW50IGF0b20gc3RvcmUgKG9yZywgdXNlciwgY2hhdCwgZXRjLikgYW5kIHJldHVybnNcbiAgICogcHJvZHVjdHMgaW4gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgKGNhbWVsQ2FzZSBhdHRyaWJ1dGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZHMgLSBMaXN0IG9mIHByb2R1Y3QgSURzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgd2l0aCBwcm9kdWN0cyBhbmQgdG90YWxQcm9kdWN0Q291bnRcbiAgICovXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3RzID0gYXN5bmMgKHByb2R1Y3RJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PiA9PiB7XG4gICAgaWYgKHByb2R1Y3RJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBwcm9kdWN0czogW10sIHRvdGFsUHJvZHVjdENvdW50OiAwIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3Qgb3JnU2hvcnROYW1lID0gYXRvbVN0b3JlLmdldChvcmdTaG9ydE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgICAgY29uc3QgdXNlcklkID0gYXRvbVN0b3JlLmdldCh1c2VySWRBdG9tKTtcbiAgICAgIGNvbnN0IGNoYXRJZCA9IGF0b21TdG9yZS5nZXQoY2hhdElkQXRvbSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGVudiA9IGF0b21TdG9yZS5nZXQoZW52QXRvbSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCA/PyAnJyxcbiAgICAgICAgb3JnX2lkOiBvcmdJZCA/PyAnJyxcbiAgICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgICAgY2hhdF9pZDogY2hhdElkID8/ICcnLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSA/PyBDb250ZXh0U291cmNlRW51bS5BcHAsXG4gICAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnByb2R1Y3RzQXBpLnYxUHJvZHVjdHNSZXRyaWV2ZVBvc3Qoe1xuICAgICAgICBQcm9kdWN0UmV0cmlldmFsUmVxdWVzdDoge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgcHJvZHVjdF9pZHM6IHByb2R1Y3RJZHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdChyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZignRmFpbGVkIHRvIHJldHJpZXZlIHByb2R1Y3RzJywgZXJyKTtcbiAgICAgIHJldHVybiB7IHByb2R1Y3RzOiBbXSwgdG90YWxQcm9kdWN0Q291bnQ6IDAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2FjaGVzIHJlc29sdmVkIHByb2R1Y3QgZGV0YWlscyBieSBwcm9kdWN0SWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGVcbiAgLy8gc2Vzc2lvbjogdmFyaWFudCBzZWxlY3Rpb24sIHRoZSBkaXNwbGF5IG9mIHRoZSBhZGQtdG8tY2FydCBjaGF0IG1lc3NhZ2UsXG4gIC8vIGFuZCB1c2VQcm9kdWN0RGV0YWlscyBhbGwgcmVzb2x2ZSB0aGUgc2FtZSBwcm9kdWN0IHJlcGVhdGVkbHkuIEZhaWxlZFxuICAvLyByZXF1ZXN0cyBhcmUgZXZpY3RlZCBzbyBhIGxhdGVyIGNhbGwgY2FuIHJldHJ5LlxuICBwcml2YXRlIHN0YXRpYyBwcm9kdWN0RGV0YWlsc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UHJvZHVjdERldGFpbHMgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3REZXRhaWxzID0gKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuZ2V0KHByb2R1Y3RJZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZChwcm9kdWN0SWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5wcm9kdWN0RGV0YWlsc0NhY2hlLmRlbGV0ZShwcm9kdWN0SWQpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuc2V0KHByb2R1Y3RJZCwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB2YXJpYW50LWxldmVsIHByb2R1Y3QgZGV0YWlscyBmb3IgYSBzaW5nbGUgcHJvZHVjdCB2aWEgdGhlIEdyYXBoUUxcbiAgICogYG1lLnByb2R1Y3RPcHRpb25zYCBxdWVyeSBvbiBQT1NUIC92MS9ncmFwaHFsLiBPbmx5IG1lYW5pbmdmdWwgZm9yIHByb2R1Y3RzXG4gICAqIHRoYXQgb2ZmZXIgdmFyaWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZCAtIFRoZSBwcm9kdWN0IElEIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yXG4gICAqIEByZXR1cm5zIFByb2R1Y3REZXRhaWxzLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcHJvZHVjdCBoYXMgbm8gb3B0aW9ucyBkYXRhXG4gICAqIEB0aHJvd3Mgb24gbmV0d29yay9IVFRQIGZhaWx1cmUgb3IgR3JhcGhRTCBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZCA9IGFzeW5jIChcbiAgICBwcm9kdWN0SWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS92MS9ncmFwaHFsYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcXVlcnk6IGdldFByb2R1Y3RPcHRpb25zUXVlcnkoKSxcbiAgICAgICAgICB2YXJpYWJsZXM6IHsgcHJvZHVjdElkIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IocmVzcG9uc2UsIGBHcmFwaFFMIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGhRTCBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuZGF0YT8ubWU/LnByb2R1Y3RPcHRpb25zID8/IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gcmV0cmlldmUgcHJvZHVjdCBkZXRhaWxzJywgZXJyKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAocGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0KTogUHJvbWlzZTxTdXBwb3J0ZWRFdmVudD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxU3VwcG9ydGVkRXZlbnRQb3N0UmF3KHtcbiAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3IgdjFTdXBwb3J0ZWRFdmVudFBvc3QnLCB7XG4gICAgICAgIGVycixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBjb2xsZWN0aW9uczogW10sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICB0b3BfY2F0ZWdvcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkLFxuICApOiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5Gb3JrOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkZvcms7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLlBsYXlncm91bmQ6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uUGxheWdyb3VuZDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uQXBwOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkFwcDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uVGVzdDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5UZXN0O1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5FdmFsOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKHVzZXJfaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnQ29uZmlnIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3QgcmVhY3RBcHBOYW1lID0gYXRvbVN0b3JlLmdldChyZWFjdEFwcE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IGNvbnRleHRTb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFnU2VydmljZSA9IGF0b21TdG9yZS5nZXQoZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSk7IC8vIEdldCBmZWF0dXJlRmxhZ1NlcnZpY2VcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiByZWFjdEFwcE5hbWUsXG4gICAgICAgIHVzZXJfaWQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5tYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZShjb250ZXh0U291cmNlKSxcbiAgICAgICAgaW5jbHVkZV9leHBlcmltZW50czogT2JqZWN0LnZhbHVlcyhQcm9kdWN0RXhwZXJpbWVudCksXG4gICAgICAgIGluY2x1ZGVfZmVhdHVyZV9nYXRlczogT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZmVhdHVyZUZsYWdTZXJ2aWNlPy5mZWF0dXJlRmxhZ1NlcnZpY2U/LmdldEZlYXR1cmVGbGFncygpIHx8IHt9LFxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQocmVxdWVzdCk7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmxvZ0Vycm9yKGBGYWlsZWQgdG8gZ2V0IG9yZyBjb25maWdgLCBlcnIsIHsgZXJyIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgICBzcGlmZnlVc2VySWQ6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGN1c3RvbWVyU2VydmljZVByb3ZpZGVyOiBDdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgKSA9PiB7XG4gICAgbG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWAsXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGkudjFDdXN0c2VydmljZUFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblBvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBBZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb25SZXF1ZXN0OiB7XG4gICAgICAgICAgICBzcGlmZnlfdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICBjdXN0b21lcl9zZXJ2aWNlX3Byb3ZpZGVyOiBjdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGFkZCBub3RlIHRvIGxhdGVzdCBjb252ZXJzYXRpb24nLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuY3VzdG9tZXJTZXJ2aWNlQXBpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tZXJjZUFwaUNsaWVudDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RUEsTUFBTSxTQUFTLElBQUlBLGVBQU8sZUFBZTtBQUV6QyxlQUFlLGtCQUFrQixPQUFzQjtBQUNyRCxLQUFJO0FBQ0YsU0FBTyxNQUFNLE1BQU0sU0FBUyxNQUFNO1NBQzVCO0FBQ04sU0FBTyxFQUFFOzs7QUFJYixlQUFlLDhCQUE4QixVQUFrQixPQUFnQjtBQUM3RSxLQUFJLEVBQUUsaUJBQWlCLGdCQUFnQjtBQUNyQyxTQUFPLFFBQVEsVUFBVSxNQUFNO0FBQy9CLFFBQU07O0NBR1IsTUFBTSxnQkFBZ0IsTUFBTSxrQkFBa0IsTUFBTTtBQUNwRCxLQUNFLGVBQWUsU0FBUyxhQUFhLEtBQUsseUJBQzFDLGVBQWUsVUFBVSxhQUFhLEtBQUssb0JBRTNDLE9BQU0sSUFBSSw2QkFB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
416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2UtYXBpLmpzIiwibmFtZXMiOlsiTG9nZ2VyIiwiY29uZmlnOiBDb25maWd1cmF0aW9uIiwiY29udGV4dDogQ29udGV4dCIsImVycjogdW5rbm93biIsImVycm9yOiB1bmtub3duIiwiZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSIsInJlc3BvbnNlczogUmVzcG9uc2VbXVtdIiwic3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSIsInVzZXJFdmVudHM6IFVzZXJFdmVudFtdIiwiYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdIiwidXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsInJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbixcbiAgQ29udGV4dEVudkVudW0sXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBEZWZhdWx0QXBpLFxuICBGb3JtVHlwZSxcbiAgSW5mZXJlbmNlQXBpLFxuICBQcm9kdWN0c0FwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlQ2F0ZWdvcnksXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudC9kaXN0L21vZGVscy9Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJ3NyYy9hdG9tcy9zZWFyY2gvdHlwZXMnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgT3JnQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQge1xuICBQcm9kdWN0RGV0YWlscyxcbiAgZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSxcbn0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsL3F1ZXJpZXMvZ2V0UHJvZHVjdE9wdGlvbnNRdWVyeSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvcHJvZHVjdEV4cGVyaW1lbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudCc7XG5pbXBvcnQge1xuICBnZXRRdWVyeVBhcmFtLFxuICBtZXNzYWdlRnJvbUFkZFRvQ2FydEV2ZW50LFxuICBtZXNzYWdlRnJvbVF1ZXJ5RXZlbnQsXG4gIG1lc3NhZ2VGcm9tUmVzcG9uc2UsXG4gIG1lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQnO1xuaW1wb3J0IHsgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0JztcbmltcG9ydCB7IGNoYXRJZEF0b20sIHVzZXJJZEF0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwJzsgLy8gSW1wb3J0IHVzZXJJZEF0b20gYW5kIGNoYXRJZEF0b21cbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50IH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IGdldEF0b21TdG9yZSB9IGZyb20gJ3NyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlJztcbmltcG9ydCB7IHJlc29sdmVkQmFzZUNvbmZpZ1ZlcnNpb25BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2Vudml2ZS9yZXNvbHZlZEJhc2VDb25maWdWZXJzaW9uJztcbmltcG9ydCB7XG4gIGJhc2VVcmxBdG9tLFxuICBjb250ZXh0U291cmNlQXRvbSxcbiAgZW52QXRvbSxcbiAgb3JnSWRBdG9tLFxuICBvcmdMZXZlbEFwaUtleUF0b20sXG4gIG9yZ1Nob3J0TmFtZUF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sIC8vIEltcG9ydCBlbnZBdG9tXG59IGZyb20gJ3NyYy9hdG9tcy9lbnZpdmUvZW52aXZlQ29uZmlnJztcbmltcG9ydCB7IGZlYXR1cmVGbGFnU2VydmljZUF0b20gfSBmcm9tICdzcmMvYXRvbXMvb3JnL2dyYXBocWxDb25maWcnOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuaW1wb3J0IHsgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gJ3NyYy90eXBlcy9leGNlcHRpb25zL3Vuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgV2lkZ2V0VGV4dCB9IGZyb20gJy4vbW9kZWxzL2FwaS93aWRnZXRUZXh0JztcbmltcG9ydCB7IFdpZGdldFRleHRSZXF1ZXN0IH0gZnJvbSAnLi9tb2RlbHMvYXBpL3dpZGdldFRleHRSZXF1ZXN0JztcbmltcG9ydCB7IHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gJy4vdXRpbHMvcHJvZHVjdFJldHJpZXZhbFJlc3BvbnNlVG9Qcm9kdWN0UmV0cmlldmFsUmVzdWx0JztcbmltcG9ydCB7IGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQgfSBmcm9tICcuL3V0aWxzL3dpZGdldFRleHRGcm9tQXBpV2lkZ2V0VGV4dFJlc3BvbnNlJztcbmltcG9ydCB7IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdCB9IGZyb20gJy4vdXRpbHMvd2lkZ2V0VGV4dFJlcXVlc3RUb0FwaVJlcXVlc3QnO1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdjb21tZXJjZS1hcGknKTtcblxuYXN5bmMgZnVuY3Rpb24gZXJyb3JSZXNwb25zZUJvZHkoZXJyb3I6IFJlc3BvbnNlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3IucmVzcG9uc2UuanNvbigpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoZXJyb3JNc2c6IHN0cmluZywgZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yKSkge1xuICAgIGxvZ2dlci5sb2dJbmZvKGVycm9yTXNnLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBjb25zdCBlcnJvclJlc3BvbnNlID0gYXdhaXQgZXJyb3JSZXNwb25zZUJvZHkoZXJyb3IpO1xuICBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3Vuc3VwcG9ydGVkIHByb2R1Y3QnIHx8IC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgQVBJIHJldHVybiBzdWJfY29kZSBpbnN0ZWFkIG9mIG1lc3NhZ2VcbiAgICBlcnJvclJlc3BvbnNlPy5hcHBfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gJ1BST0RVQ1RfTk9UX0ZPVU5EJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdSRVNUQVJUX1NFU1NJT04nIHx8XG4gICAgZXJyb3JSZXNwb25zZT8uc3ViX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09ICdOT1RfRk9VTkQnIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBuZXcgQVBJIHJlc3BvbnNlcyB3aWxsIGNvbnRhaW4gXCJhcHBfY29kZVwiXG4gICkge1xuICAgIGxvZ2dlci5sb2dJbmZvKFxuICAgICAgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QuIFJlLXN0YXJ0IHNlc3Npb24nLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2UsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCgpO1xuICB9XG5cbiAgbG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbmNsYXNzIENvbW1lcmNlQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBpOiBEZWZhdWx0QXBpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tZXJTZXJ2aWNlQXBpOiBDdXN0b21lclNlcnZpY2VBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZlcmVuY2VBcGk6IEluZmVyZW5jZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQXBpOiBQcm9kdWN0c0FwaTtcblxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tbWVyY2VBcGlDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSA9ICgpOiBDb21tZXJjZUFwaUNsaWVudCA9PiB7XG4gICAgaWYgKCFDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2UgPSBuZXcgQ29tbWVyY2VBcGlDbGllbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29tbWVyY2VBcGlDbGllbnQuaW5zdGFuY2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihiYXNlUGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG4gICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoIHx8IGJhc2VVcmw7XG4gICAgLy8gQVBJIEtleSBpcyBub3cgaGFuZGxlZCBhdCB0aGUgRW52aXZlQ29uZmlnUHJvdmlkZXIgbGV2ZWxcbiAgICBjb25zdCBjb25maWc6IENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbih7XG4gICAgICBhY2Nlc3NUb2tlbjogYXBpS2V5LFxuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICAgIHRoaXMucHJvZHVjdHNBcGkgPSBuZXcgUHJvZHVjdHNBcGkoY29uZmlnKTtcbiAgfVxuXG4gIC8vIERlZHVwZXMgY29uY3VycmVudCByZXNvbHV0aW9ucyBvZiB0aGUgc2FtZSBVUkw6IHRoZSBpbmplY3Rpb24gYnVuZGxlXG4gIC8vIHdhcm1zIHRoaXMgY2FsbCBiZWZvcmUgUmVhY3QgbW91bnRzLCBhbmQgUGFnZVByb3ZpZGVyIG1heSByZXF1ZXN0IHRoZVxuICAvLyBzYW1lIFVSTCB3aGlsZSB0aGUgd2FybS11cCBpcyBzdGlsbCBpbiBmbGlnaHQuXG4gIHByaXZhdGUgc3RhdGljIGluRmxpZ2h0VXJsUmVzb2x1dGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICBzdGF0aWMgcmVzb2x2ZVVybCA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gQ29tbWVyY2VBcGlDbGllbnQuaW5GbGlnaHRVcmxSZXNvbHV0aW9ucy5nZXQodXJsKTtcbiAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgIHJldHVybiBpbkZsaWdodDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJlc29sdmVVcmxVbmNhY2hlZCh1cmwpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmluRmxpZ2h0VXJsUmVzb2x1dGlvbnMuc2V0KHVybCwgcmVxdWVzdCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbkZsaWdodFVybFJlc29sdXRpb25zLmRlbGV0ZSh1cmwpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlVXJsVW5jYWNoZWQgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gJycsXG4gICAgICBvcmdfaWQ6IG9yZ0lkID8/ICcnLFxuICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyAnJyxcbiAgICAgIHNvdXJjZTogc291cmNlID8/IENvbnRleHRTb3VyY2VFbnVtLkFwcCxcbiAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LCAvLyBDYXN0IGVudiB0byBDb250ZXh0RW52RW51bVxuICAgIH07XG5cbiAgICBjb25zdCBvdmVycmlkZUNvbmZpZ1ZlcnNpb24gPVxuICAgICAgZ2V0UXVlcnlQYXJhbSgnc3BpZmZ5X2NvbmZpZ192ZXJzaW9uJykgfHxcbiAgICAgIGdldFF1ZXJ5UGFyYW0oJ2Vudml2ZV9jb25maWdfdmVyc2lvbicpIHx8XG4gICAgICBnZXRBdG9tU3RvcmUoKS5nZXQocmVzb2x2ZWRCYXNlQ29uZmlnVmVyc2lvbkF0b20pIHx8XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmZWF0dXJlR2F0ZXMgPSBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgICBvdmVycmlkZV9jb25maWdfdmVyc2lvbjogb3ZlcnJpZGVDb25maWdWZXJzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICBVcmxSZXNvbHZpbmdSZXF1ZXN0OiB1cmxSZXNvbHZpbmdSZXF1ZXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmF3UmVzcG9uc2UucmF3Lmpzb24oKTtcblxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gIH07XG5cbiAgc3RhdGljIHJlcG9ydFNlc3Npb24gPSBhc3luYyAocmVwb3J0UmVxdWVzdDogUmVwb3J0U2Vzc2lvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFDaGF0c1JlcG9ydFNlc3Npb25JZFBvc3Qoe1xuICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgfSk7XG4gIH07XG5cbiAgc3RhdGljIGdldE5leHRSZXNwb25zZXMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKHJlc3AgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcChyZXNwID0+IG1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzcCkpO1xuXG4gICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKChtKTogbSBpcyBNZXNzYWdlID0+IG0gIT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBsb2dnZXIubG9nSW5mbygnRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlcycsIGVyciwge1xuICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgbmV4dCByZXNwb25zZXMnLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UmVzcG9uc2UsIHZvaWQsIHVua25vd24+ID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiogZ2VuZXJhdGUoaW5mZXJlbmNlQXBpOiBJbmZlcmVuY2VBcGksIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtaW5nIGlzIGVuYWJsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW5mZXJlbmNlQXBpLnYxTmV4dFJlc3BvbnNlc1Bvc3RSYXcoXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmV4dE1lc3NhZ2VSZXF1ZXN0OiBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgYXMgYSBzdHJlYW0gb2YgZGF0YVxuICAgICAgICBpZiAoIXJlc3BvbnNlLnJhdy5ib2R5KSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdObyBib2R5IGluIHRoZSBzdHJlYW1lZCByZXNwb25zZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5yYXcuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcblxuICAgICAgICAvLyBCdWZmZXIgaG9sZGluZyB0aGUgdHJhaWxpbmcgaW5jb21wbGV0ZSBsaW5lIG9mIHRoZSBwcmV2aW91cyBjaHVua1xuICAgICAgICBsZXQgcGFydGlhbCA9ICcnO1xuXG4gICAgICAgIGNvbnN0IHNhZmVQYXJzZSA9IChsaW5lOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobGluZSk7IC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZ1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBwYXJzaW5nIHN0cmVhbWVkIGxpbmUnLCBlcnIsIHsgbGluZSB9KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJzZUxpbmVzID0gKGxpbmVzOiBzdHJpbmdbXSk6IHVua25vd25bXSA9PlxuICAgICAgICAgIGxpbmVzXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKC9eZGF0YTogLywgJycpLnRyaW0oKSkgLy8gUmVtb3ZlIHRoZSBcImRhdGE6IFwiIHByZWZpeFxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUgIT09ICcnICYmIGxpbmUgIT09ICdbRE9ORV0nKSAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYW5kIFwiW0RPTkVdXCJcbiAgICAgICAgICAgIC5tYXAoc2FmZVBhcnNlKVxuICAgICAgICAgICAgLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQSBjaHVuayBib3VuZGFyeSBjYW4gZmFsbCBtaWQtbGluZSwgc28gb25seSBwYXJzZSB0aGUgbGluZXMgdGhhdFxuICAgICAgICAgIC8vIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgbmV3bGluZSBhbmQgaG9sZCB0aGUgcmVzdCB1bnRpbCB0aGUgbmV4dCBjaHVua1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gYCR7cGFydGlhbH0ke2RlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KX1gLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICBwYXJ0aWFsID0gbGluZXMucG9wKCkgPz8gJyc7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZExpbmUgb2YgcGFyc2VMaW5lcyhsaW5lcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gdmFsaWRhdGVSZXNwb25zZShwYXJzZWRMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZsdXNoIHRoZSByZW1haW5kZXIgb2YgYSBzdHJlYW0gdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSBuZXdsaW5lXG4gICAgICAgIGZvciAoY29uc3QgcGFyc2VkTGluZSBvZiBwYXJzZUxpbmVzKFtgJHtwYXJ0aWFsfSR7ZGVjb2Rlci5kZWNvZGUoKX1gXSkpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXNwb25zZSA9IHZhbGlkYXRlUmVzcG9uc2UocGFyc2VkTGluZSk7XG5cbiAgICAgICAgICBpZiAodmFsaWRhdGVkUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nZ2VyLmxvZ0Vycm9yKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yLCB7XG4gICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlcycsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlKFxuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGksXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlcixcbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0U3VnZ2VzdGlvbnMgPSBhc3luYyAocGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxTdWdnZXN0aW9uW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5zdWdnZXN0aW9uc0Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRTdWdnZXN0aW9uc1Bvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbmFsOiBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcChyZXNwID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihyZXNwKSlcbiAgICAgICAgLmZpbHRlcigoc3VnZ2VzdGlvbik6IHN1Z2dlc3Rpb24gaXMgU3VnZ2VzdGlvbiA9PiBzdWdnZXN0aW9uICE9IG51bGwpO1xuXG4gICAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZ2dlci5sb2dJbmZvKCdGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zJywgZXJyb3IsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgc3VnZ2VzdGlvbnMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIHJlc3BvbnNlczogUmVzcG9uc2VbXVtdO1xuICAgIHVzZXJFdmVudHM6IFVzZXJFdmVudFtdO1xuICAgIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW107XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXVtdO1xuICB9PiA9PiB7XG4gICAgbGV0IGRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UgPSB7XG4gICAgICByZXNwb25zZXM6IFtdLFxuICAgICAgc3VnZ2VzdGlvbnM6IFtdLFxuICAgICAgdXNlcl9ldmVudHM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yZ19pZDogb3JnSWQsXG4gICAgICBjaGF0X2lkOiBjaGF0SWQsXG4gICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUdldFNlc3Npb25NZXNzYWdlcyhyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoJ0ZhaWxlZCB0byBnZXQgY2hhdCByZXNwb25zZXMnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdW10gPSBkYXRhPy5yZXNwb25zZXM/Lm1hcCh0dXJuID0+XG4gICAgICB0dXJuXG4gICAgICAgIC5tYXAocmVzcG9uc2UgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbCksXG4gICAgKTtcblxuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10gPSBkYXRhPy5zdWdnZXN0aW9uc1xuICAgICAgLm1hcChzdWdnZXN0aW9uID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihzdWdnZXN0aW9uKSlcbiAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgIGNvbnN0IHVzZXJFdmVudHM6IFVzZXJFdmVudFtdID0gZGF0YT8udXNlcl9ldmVudHNcbiAgICAgIC5tYXAoZXZlbnQgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoZXZlbnQgPT4gZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpXG4gICAgICAubWFwKGV2ZW50ID0+IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQpO1xuXG4gICAgY29uc3QgYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gcmVzcG9uc2VzXG4gICAgICAubWFwKHR1cm4gPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiZcbiAgICAgICAgICAgICAgICBmb3JtU3VibWl0dGVkVXNlckV2ZW50c0Zvcm1JZHMuaW5jbHVkZXMocmVzcG9uc2UuaWQpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAocmVzcG9uc2UgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcih0dXJuID0+IHR1cm4ubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJFdmVudHMubWFwKGFzeW5jIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoW1VzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsIFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaF0uaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnQpIHtcbiAgICAgICAgICAgIC8vIEhpc3RvcmljYWwgZXZlbnRzIG5ldmVyIGNhcnJpZWQgYSBjbGllbnQtbG9jYWwgcHJvZHVjdFRpdGxlIChpdCdzXG4gICAgICAgICAgICAvLyBkcm9wcGVkIGJlZm9yZSBoaXR0aW5nIHRoZSBiYWNrZW5kKSwgc28gcmVzb2x2ZSBpdCBoZXJlOiBmaXJzdCBmb3JcbiAgICAgICAgICAgIC8vIGZyZWUgZnJvbSBhIG1hdGNoaW5nIFByb2R1Y3QgcmVzcG9uc2UgYWxyZWFkeSBmZXRjaGVkIGFib3ZlLCB0aGVuXG4gICAgICAgICAgICAvLyBhcyBhIGZhbGxiYWNrIHZpYSB0aGUgY2FjaGVkIHByb2R1Y3QtZGV0YWlscyBjYWxsLlxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y3QgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlcy5pZCA9PT0gZXZlbnQuYXR0cmlidXRlcy5wcm9kdWN0SWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdFRpdGxlID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFByb2R1Y3Q/LmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IG1hdGNoZWRQcm9kdWN0LmF0dHJpYnV0ZXMudGl0bGVcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHMoXG4gICAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RUaXRsZSA9IGRldGFpbHM/LnRpdGxlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0VGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21BZGRUb0NhcnRFdmVudChldmVudCwgcHJvZHVjdFRpdGxlKV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PlxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVR5cGUgIT09IEZvcm1UeXBlLkVzY2FsYXRpb24sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtUmVzcG9uc2UgJiYgZm9ybVJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFttZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudChldmVudCwgZm9ybVJlc3BvbnNlLmF0dHJpYnV0ZXMpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICkuZmlsdGVyKChtZXNzYWdlKTogbWVzc2FnZSBpcyBNZXNzYWdlW10gPT4gbWVzc2FnZS5sZW5ndGggPiAwKTtcblxuICAgIC8vIFNvcnQgdGhlIG1lc3NhZ2VzIGNocm9ub2xvZ2ljYWxseSB0byByZWNvbnN0cnVjdCB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3Qgc29ydGVkTWVzc2FnZXMgPSBbLi4uYXNzaXN0YW50TWVzc2FnZXMsIC4uLnVzZXJNZXNzYWdlc10uc29ydChcbiAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShhWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYlswXS5jcmVhdGVkQXQpLmdldFRpbWUoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2VzLCB1c2VyRXZlbnRzLCBzdWdnZXN0aW9ucywgbWVzc2FnZXM6IHNvcnRlZE1lc3NhZ2VzIH07XG4gIH07XG5cbiAgc3RhdGljIGdldEhhcmRjb3B5ID0gYXN5bmMgKHJlcXVlc3Q6IFdpZGdldFRleHRSZXF1ZXN0KTogUHJvbWlzZTxXaWRnZXRUZXh0PiA9PiB7XG4gICAgY29uc3QgYXBpUmVxdWVzdCA9IGNvcmVXaWRnZXRUZXh0UmVxdWVzdFRvQXBpUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxV2lkZ2V0VGV4dFBvc3Qoe1xuICAgICAgV2lkZ2V0VGV4dFJlcXVlc3Q6IGFwaVJlcXVlc3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFwaVdpZGdldFRleHRSZXNwb25zZVRvQ29yZVdpZGdldFRleHQoYXBpUmVxdWVzdCwgcmVzcG9uc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvZHVjdCBkZXRhaWxzIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdCBJRHMgdmlhIFBPU1QgL3YxL3Byb2R1Y3RzL3JldHJpZXZlLlxuICAgKiBCdWlsZHMgY29udGV4dCBmcm9tIHRoZSBjdXJyZW50IGF0b20gc3RvcmUgKG9yZywgdXNlciwgY2hhdCwgZXRjLikgYW5kIHJldHVybnNcbiAgICogcHJvZHVjdHMgaW4gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgKGNhbWVsQ2FzZSBhdHRyaWJ1dGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZHMgLSBMaXN0IG9mIHByb2R1Y3QgSURzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgd2l0aCBwcm9kdWN0cyBhbmQgdG90YWxQcm9kdWN0Q291bnRcbiAgICovXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3RzID0gYXN5bmMgKHByb2R1Y3RJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PiA9PiB7XG4gICAgaWYgKHByb2R1Y3RJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBwcm9kdWN0czogW10sIHRvdGFsUHJvZHVjdENvdW50OiAwIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3Qgb3JnU2hvcnROYW1lID0gYXRvbVN0b3JlLmdldChvcmdTaG9ydE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgICAgY29uc3QgdXNlcklkID0gYXRvbVN0b3JlLmdldCh1c2VySWRBdG9tKTtcbiAgICAgIGNvbnN0IGNoYXRJZCA9IGF0b21TdG9yZS5nZXQoY2hhdElkQXRvbSk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGVudiA9IGF0b21TdG9yZS5nZXQoZW52QXRvbSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCA/PyAnJyxcbiAgICAgICAgb3JnX2lkOiBvcmdJZCA/PyAnJyxcbiAgICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyAnJyxcbiAgICAgICAgY2hhdF9pZDogY2hhdElkID8/ICcnLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSA/PyBDb250ZXh0U291cmNlRW51bS5BcHAsXG4gICAgICAgIGVudjogKGVudiBhcyBDb250ZXh0RW52RW51bSkgPz8gQ29udGV4dEVudkVudW0uRGV2LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnByb2R1Y3RzQXBpLnYxUHJvZHVjdHNSZXRyaWV2ZVBvc3Qoe1xuICAgICAgICBQcm9kdWN0UmV0cmlldmFsUmVxdWVzdDoge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgcHJvZHVjdF9pZHM6IHByb2R1Y3RJZHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb2R1Y3RSZXRyaWV2YWxSZXNwb25zZVRvUHJvZHVjdFJldHJpZXZhbFJlc3VsdChyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZignRmFpbGVkIHRvIHJldHJpZXZlIHByb2R1Y3RzJywgZXJyKTtcbiAgICAgIHJldHVybiB7IHByb2R1Y3RzOiBbXSwgdG90YWxQcm9kdWN0Q291bnQ6IDAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2FjaGVzIHJlc29sdmVkIHByb2R1Y3QgZGV0YWlscyBieSBwcm9kdWN0SWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGVcbiAgLy8gc2Vzc2lvbjogdmFyaWFudCBzZWxlY3Rpb24sIHRoZSBkaXNwbGF5IG9mIHRoZSBhZGQtdG8tY2FydCBjaGF0IG1lc3NhZ2UsXG4gIC8vIGFuZCB1c2VQcm9kdWN0RGV0YWlscyBhbGwgcmVzb2x2ZSB0aGUgc2FtZSBwcm9kdWN0IHJlcGVhdGVkbHkuIEZhaWxlZFxuICAvLyByZXF1ZXN0cyBhcmUgZXZpY3RlZCBzbyBhIGxhdGVyIGNhbGwgY2FuIHJldHJ5LlxuICBwcml2YXRlIHN0YXRpYyBwcm9kdWN0RGV0YWlsc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UHJvZHVjdERldGFpbHMgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHN0YXRpYyByZXRyaWV2ZVByb2R1Y3REZXRhaWxzID0gKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuZ2V0KHByb2R1Y3RJZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IENvbW1lcmNlQXBpQ2xpZW50LnJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZChwcm9kdWN0SWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5wcm9kdWN0RGV0YWlsc0NhY2hlLmRlbGV0ZShwcm9kdWN0SWQpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LnByb2R1Y3REZXRhaWxzQ2FjaGUuc2V0KHByb2R1Y3RJZCwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB2YXJpYW50LWxldmVsIHByb2R1Y3QgZGV0YWlscyBmb3IgYSBzaW5nbGUgcHJvZHVjdCB2aWEgdGhlIEdyYXBoUUxcbiAgICogYG1lLnByb2R1Y3RPcHRpb25zYCBxdWVyeSBvbiBQT1NUIC92MS9ncmFwaHFsLiBPbmx5IG1lYW5pbmdmdWwgZm9yIHByb2R1Y3RzXG4gICAqIHRoYXQgb2ZmZXIgdmFyaWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RJZCAtIFRoZSBwcm9kdWN0IElEIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yXG4gICAqIEByZXR1cm5zIFByb2R1Y3REZXRhaWxzLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcHJvZHVjdCBoYXMgbm8gb3B0aW9ucyBkYXRhXG4gICAqIEB0aHJvd3Mgb24gbmV0d29yay9IVFRQIGZhaWx1cmUgb3IgR3JhcGhRTCBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldHJpZXZlUHJvZHVjdERldGFpbHNVbmNhY2hlZCA9IGFzeW5jIChcbiAgICBwcm9kdWN0SWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0RGV0YWlscyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhdG9tU3RvcmUuZ2V0KGJhc2VVcmxBdG9tKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhdG9tU3RvcmUuZ2V0KG9yZ0xldmVsQXBpS2V5QXRvbSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS92MS9ncmFwaHFsYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcXVlcnk6IGdldFByb2R1Y3RPcHRpb25zUXVlcnkoKSxcbiAgICAgICAgICB2YXJpYWJsZXM6IHsgcHJvZHVjdElkIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IocmVzcG9uc2UsIGBHcmFwaFFMIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGhRTCBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuZGF0YT8ubWU/LnByb2R1Y3RPcHRpb25zID8/IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKCdGYWlsZWQgdG8gcmV0cmlldmUgcHJvZHVjdCBkZXRhaWxzJywgZXJyKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAocGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0KTogUHJvbWlzZTxTdXBwb3J0ZWRFdmVudD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxU3VwcG9ydGVkRXZlbnRQb3N0UmF3KHtcbiAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6IGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3IgdjFTdXBwb3J0ZWRFdmVudFBvc3QnLCB7XG4gICAgICAgIGVycixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBjb2xsZWN0aW9uczogW10sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICB0b3BfY2F0ZWdvcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkLFxuICApOiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5Gb3JrOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkZvcms7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLlBsYXlncm91bmQ6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uUGxheWdyb3VuZDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uQXBwOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLkFwcDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uVGVzdDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5UZXN0O1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5FdmFsOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKHVzZXJfaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnQ29uZmlnIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICAgICAgY29uc3QgcmVhY3RBcHBOYW1lID0gYXRvbVN0b3JlLmdldChyZWFjdEFwcE5hbWVBdG9tKTtcbiAgICAgIGNvbnN0IGNvbnRleHRTb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVGbGFnU2VydmljZSA9IGF0b21TdG9yZS5nZXQoZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbSk7IC8vIEdldCBmZWF0dXJlRmxhZ1NlcnZpY2VcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiByZWFjdEFwcE5hbWUsXG4gICAgICAgIHVzZXJfaWQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5tYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZShjb250ZXh0U291cmNlKSxcbiAgICAgICAgaW5jbHVkZV9leHBlcmltZW50czogT2JqZWN0LnZhbHVlcyhQcm9kdWN0RXhwZXJpbWVudCksXG4gICAgICAgIGluY2x1ZGVfZmVhdHVyZV9nYXRlczogT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZmVhdHVyZUZsYWdTZXJ2aWNlPy5mZWF0dXJlRmxhZ1NlcnZpY2U/LmdldEZlYXR1cmVGbGFncygpIHx8IHt9LFxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQocmVxdWVzdCk7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmxvZ0Vycm9yKGBGYWlsZWQgdG8gZ2V0IG9yZyBjb25maWdgLCBlcnIsIHsgZXJyIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgICBzcGlmZnlVc2VySWQ6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGN1c3RvbWVyU2VydmljZVByb3ZpZGVyOiBDdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgKSA9PiB7XG4gICAgbG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWAsXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGkudjFDdXN0c2VydmljZUFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblBvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBBZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb25SZXF1ZXN0OiB7XG4gICAgICAgICAgICBzcGlmZnlfdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICBjdXN0b21lcl9zZXJ2aWNlX3Byb3ZpZGVyOiBjdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5sb2dFcnJvcignRmFpbGVkIHRvIGFkZCBub3RlIHRvIGxhdGVzdCBjb252ZXJzYXRpb24nLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuY3VzdG9tZXJTZXJ2aWNlQXBpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tZXJjZUFwaUNsaWVudDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RUEsTUFBTSxTQUFTLElBQUlBLGVBQU8sZUFBZTtBQUV6QyxlQUFlLGtCQUFrQixPQUFzQjtBQUNyRCxLQUFJO0FBQ0YsU0FBTyxNQUFNLE1BQU0sU0FBUyxNQUFNO1NBQzVCO0FBQ04sU0FBTyxFQUFFOzs7QUFJYixlQUFlLDhCQUE4QixVQUFrQixPQUFnQjtBQUM3RSxLQUFJLEVBQUUsaUJBQWlCLGdCQUFnQjtBQUNyQyxTQUFPLFFBQVEsVUFBVSxNQUFNO0FBQy9CLFFBQU07O0NBR1IsTUFBTSxnQkFBZ0IsTUFBTSxrQkFBa0IsTUFBTTtBQUNwRCxLQUNFLGVBQWUsU0FBUyxhQUFhLEtBQUsseUJBQzFDLGVBQWUsVUFBVSxhQUFhLEtBQUssb0JBRTNDLE9BQU0sSUFBSSw2QkFBNkI7VUFFdkMsZUFBZSxVQUFVLGFBQWEsS0FBSyxxQkFDM0MsZUFBZSxVQUFVLGFBQWEsS0FBSyxhQUMzQztB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
@@ -0,0 +1,13 @@
1
+ Object.defineProperty(exports, '__esModule', { value: true });
2
+ const require_logLevel = require('./logLevel.cjs');
3
+ const require_logger = require('./logger.cjs');
4
+
5
+ exports.DEFAULT_LOG_LEVEL = require_logLevel.DEFAULT_LOG_LEVEL;
6
+ exports.LOG_LEVELS = require_logLevel.LOG_LEVELS;
7
+ exports.LOG_LEVEL_QUERY_PARAM = require_logLevel.LOG_LEVEL_QUERY_PARAM;
8
+ exports.LOG_LEVEL_STORAGE_KEY = require_logLevel.LOG_LEVEL_STORAGE_KEY;
9
+ exports.default = require_logger.default;
10
+ exports.getLogLevel = require_logLevel.getLogLevel;
11
+ exports.isLevelEnabled = require_logLevel.isLevelEnabled;
12
+ exports.resetLogLevelForTesting = require_logLevel.resetLogLevelForTesting;
13
+ exports.setLogLevel = require_logLevel.setLogLevel;
@@ -0,0 +1,3 @@
1
+ import { Logger } from "./logger.cjs";
2
+ import { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, LogLevel, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel } from "./logLevel.cjs";
3
+ export { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, type LogLevel, Logger as default, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel };
@@ -0,0 +1,3 @@
1
+ import { Logger } from "./logger.js";
2
+ import { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, LogLevel, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel } from "./logLevel.js";
3
+ export { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, type LogLevel, Logger as default, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel };
@@ -0,0 +1,4 @@
1
+ import { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel } from "./logLevel.js";
2
+ import logger_default from "./logger.js";
3
+
4
+ export { DEFAULT_LOG_LEVEL, LOG_LEVELS, LOG_LEVEL_QUERY_PARAM, LOG_LEVEL_STORAGE_KEY, logger_default as default, getLogLevel, isLevelEnabled, resetLogLevelForTesting, setLogLevel };