@sapui5/sap.fe.core 1.136.1 → 1.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +76 -28
  4. package/src/sap/fe/core/ActionRuntime.ts +106 -30
  5. package/src/sap/fe/core/AppComponent.js +11 -1
  6. package/src/sap/fe/core/AppComponent.ts +10 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -2
  8. package/src/sap/fe/core/AppStateHandler.ts +8 -2
  9. package/src/sap/fe/core/CommonUtils.js +15 -3
  10. package/src/sap/fe/core/CommonUtils.ts +13 -2
  11. package/src/sap/fe/core/PageController.controller.js +10 -0
  12. package/src/sap/fe/core/PageController.controller.ts +3 -0
  13. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
  14. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
  15. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
  16. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
  17. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -12
  18. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -16
  19. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
  20. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
  21. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
  22. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -1
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -0
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
  27. package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
  28. package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
  29. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
  30. package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
  33. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
  34. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
  35. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
  37. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +178 -125
  38. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +222 -174
  39. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +5 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -3
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +39 -5
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +51 -11
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
  47. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
  49. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
  50. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
  51. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +11 -8
  52. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +13 -10
  53. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
  54. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
  55. package/src/sap/fe/core/controls/DataWatcher.js +2 -2
  56. package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
  57. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
  58. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
  59. package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
  60. package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  62. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  63. package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
  64. package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
  65. package/src/sap/fe/core/converters/controls/Common/Action.js +42 -5
  66. package/src/sap/fe/core/converters/controls/Common/Action.ts +42 -5
  67. package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
  68. package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
  69. package/src/sap/fe/core/converters/controls/Common/Table.js +46 -13
  70. package/src/sap/fe/core/converters/controls/Common/Table.ts +50 -11
  71. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
  72. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
  73. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
  74. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
  75. package/src/sap/fe/core/fpm/manifest.json +1 -1
  76. package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
  77. package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
  78. package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
  79. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  80. package/src/sap/fe/core/helpers/ModelHelper.js +4 -4
  81. package/src/sap/fe/core/helpers/ModelHelper.ts +8 -4
  82. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  83. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  84. package/src/sap/fe/core/library.js +33 -4
  85. package/src/sap/fe/core/library.ts +33 -2
  86. package/src/sap/fe/core/messagebundle.properties +18 -2
  87. package/src/sap/fe/core/messagebundle_ar.properties +3 -2
  88. package/src/sap/fe/core/messagebundle_bg.properties +2 -1
  89. package/src/sap/fe/core/messagebundle_ca.properties +2 -1
  90. package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
  91. package/src/sap/fe/core/messagebundle_cs.properties +4 -3
  92. package/src/sap/fe/core/messagebundle_cy.properties +2 -1
  93. package/src/sap/fe/core/messagebundle_da.properties +2 -1
  94. package/src/sap/fe/core/messagebundle_de.properties +8 -7
  95. package/src/sap/fe/core/messagebundle_el.properties +2 -1
  96. package/src/sap/fe/core/messagebundle_en.properties +2 -1
  97. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
  98. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
  99. package/src/sap/fe/core/messagebundle_es.properties +5 -4
  100. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
  101. package/src/sap/fe/core/messagebundle_et.properties +2 -1
  102. package/src/sap/fe/core/messagebundle_fi.properties +2 -1
  103. package/src/sap/fe/core/messagebundle_fr.properties +2 -1
  104. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
  105. package/src/sap/fe/core/messagebundle_hi.properties +2 -1
  106. package/src/sap/fe/core/messagebundle_hr.properties +2 -1
  107. package/src/sap/fe/core/messagebundle_hu.properties +2 -1
  108. package/src/sap/fe/core/messagebundle_id.properties +2 -1
  109. package/src/sap/fe/core/messagebundle_it.properties +2 -1
  110. package/src/sap/fe/core/messagebundle_iw.properties +2 -1
  111. package/src/sap/fe/core/messagebundle_ja.properties +3 -2
  112. package/src/sap/fe/core/messagebundle_kk.properties +2 -1
  113. package/src/sap/fe/core/messagebundle_ko.properties +2 -1
  114. package/src/sap/fe/core/messagebundle_lt.properties +2 -1
  115. package/src/sap/fe/core/messagebundle_lv.properties +2 -1
  116. package/src/sap/fe/core/messagebundle_mk.properties +2 -1
  117. package/src/sap/fe/core/messagebundle_ms.properties +2 -1
  118. package/src/sap/fe/core/messagebundle_nl.properties +2 -1
  119. package/src/sap/fe/core/messagebundle_no.properties +3 -2
  120. package/src/sap/fe/core/messagebundle_pl.properties +2 -1
  121. package/src/sap/fe/core/messagebundle_pt.properties +2 -1
  122. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
  123. package/src/sap/fe/core/messagebundle_ro.properties +2 -1
  124. package/src/sap/fe/core/messagebundle_ru.properties +2 -1
  125. package/src/sap/fe/core/messagebundle_sh.properties +2 -1
  126. package/src/sap/fe/core/messagebundle_sk.properties +2 -1
  127. package/src/sap/fe/core/messagebundle_sl.properties +2 -1
  128. package/src/sap/fe/core/messagebundle_sr.properties +2 -1
  129. package/src/sap/fe/core/messagebundle_sv.properties +2 -1
  130. package/src/sap/fe/core/messagebundle_th.properties +2 -1
  131. package/src/sap/fe/core/messagebundle_tr.properties +2 -1
  132. package/src/sap/fe/core/messagebundle_uk.properties +2 -1
  133. package/src/sap/fe/core/messagebundle_vi.properties +2 -1
  134. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
  135. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
  136. package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
  137. package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
  138. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
  139. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
  140. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
  141. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
  142. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
  143. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
  144. package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
  145. package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
  146. package/src/sap/fe/core/templating/UIFormatters.js +3 -3
  147. package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
  148. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
  149. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
  150. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
  151. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
  152. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
  153. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
  154. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/buildingBlocks/templating/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "../TraceInfo"], function (Log, deepClone, uid, BindingToolkit, jsx, AttributeModel, ConfigurableObject, TypeGuards, BindingParser, XMLPreprocessor, JSONModel, TraceInfo) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/buildingBlocks/templating/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/BindingInfo", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "../TraceInfo"], function (Log, deepClone, uid, BindingToolkit, jsx, AttributeModel, ConfigurableObject, TypeGuards, BindingInfo, XMLPreprocessor, JSONModel, TraceInfo) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -193,7 +193,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
193
193
  let oMetadataContext;
194
194
  if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
195
195
  let sAttributeValue = oNode.getAttribute(sAttributeName);
196
- oMetadataContext = BindingParser.complexParser(sAttributeValue);
196
+ oMetadataContext = BindingInfo.parse(sAttributeValue);
197
197
  if (oMetadataContext && sAttributeName === "metaPath" && oMetadataContext.model && oMetadataContext.path) {
198
198
  // if the metaPath is filled through a JSON model, we can't use this context as the metadataContext,
199
199
  // but instead we have to create a new one with the actual value
@@ -992,4 +992,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
992
992
  _exports.addAttributeToXML = addAttributeToXML;
993
993
  return _exports;
994
994
  }, false);
995
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJfZXhwb3J0cyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsInRyYW5zZm9ybU1ldGFkYXRhIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwiY2xhc3MiLCJ0eXBlIiwiaXNQdWJsaWMiLCJhZ2dyZWdhdGlvbnMiLCJkZXBlbmRlbnRzIiwic2xvdCIsImN1c3RvbURhdGEiLCJsYXlvdXREYXRhIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlUeXBlIiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJvU2V0dGluZ3MiLCJzQXR0cmlidXRlVmFsdWUiLCJzTWV0YVBhdGgiLCJzQ29udGV4dFBhdGgiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0Iiwic0F0dHJpYnV0ZU5hbWUiLCJyZXR1cm5Db250ZXh0IiwibW9kZWxzIiwiY29udmVydGVyQ29udGV4dCIsImdldFByb3BlcnR5IiwiZGF0YSIsInVuc3RvcmVPYmplY3RWYWx1ZSIsInNldFByb3BlcnR5IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsIm9WaXNpdG9yIiwiYkRvTm90UmVzb2x2ZSIsImlzT3BlbiIsIm9NZXRhZGF0YUNvbnRleHQiLCJnZXRBdHRyaWJ1dGUiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsIm1ldGFDb250ZXh0UGF0aCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2V0TW9kZWwiLCJpc0EiLCJlIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJkZWZpbml0aW9uUHJvcGVydGllcyIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJwcm9wZXJ0eVZhbHVlcyIsInNLZXlWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImRlZXBDbG9uZSIsImVycm9yIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidmFsdWUiLCJOdW1iZXIiLCJwcm9jZXNzQ29udGV4dHMiLCJjb250ZXh0UGF0aCIsIm1NaXNzaW5nQ29udGV4dCIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsImNvbnRleHRQYXRoSW5kZXgiLCJpbmRleE9mIiwiY29udGV4dFBhdGhEZWZpbml0aW9uIiwic3BsaWNlIiwicHJvcGVydHlWYWx1ZSIsImxlbmd0aCIsIm5hbWUiLCJhZGRTaW5nbGVDb250ZXh0IiwicGFyc2VBZ2dyZWdhdGlvbiIsIm9BZ2dyZWdhdGlvbiIsImRlZmluaXRpb24iLCJvT3V0T2JqZWN0cyIsImNoaWxkcmVuIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJuYW1lc3BhY2VVUkkiLCJvUGFyZW50IiwicGFyZW50Tm9kZSIsInZpc2l0Tm9kZSIsImNoaWxkSWR4IiwiY2hpbGREZWZpbml0aW9uIiwiY2hpbGRLZXkiLCJza2lwS2V5IiwibXVsdGlwbGUiLCJ1aWQiLCJzZXRBdHRyaWJ1dGUiLCJhZ2dyZWdhdGlvbk9iamVjdCIsImtleSIsInBvc2l0aW9uIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJhbmNob3IiLCJwcm9jZXNzQWdncmVnYXRpb25zIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwicHJvY2Vzc09iamVjdCIsImVsZW1lbnQiLCJteUFycmF5IiwibXlPYmplY3QiLCJjaGlsZE5vZGVOYW1lcyIsIm1hcCIsImxvY2FsTmFtZSIsImNoaWxkSXNBcnJheSIsIlNldCIsInNpemUiLCJwdXNoIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsImlDaGlsZEluZGV4IiwiQXJyYXkiLCJmcm9tIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwic0NoaWxkTmFtZSIsInNBZ2dyZWdhdGlvbk5hbWUiLCJ0b1VwcGVyQ2FzZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJvTmV4dENoaWxkIiwibmV4dENoaWxkIiwiaGFzVmlydHVhbE5vZGUiLCJjaGlsZFdyYXBwZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnROUyIsImFwcGVuZENoaWxkIiwicmVtb3ZlQXR0cmlidXRlIiwib05ld0NoaWxkIiwiY2xvbmVOb2RlIiwiYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyIsIm15Q2hpbGQiLCJwcm9jZXNzU2xvdHMiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsImFyZ3VtZW50cyIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudCIsInJlcGxhY2VXaXRoIiwicmVwbGFjZSIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwibWV0YWRhdGEiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lc3BhY2UiLCJ4bWxUYWciLCJnZXRTZXR0aW5ncyIsIkpTT05Nb2RlbCIsImluaXRpYWxLZXlzIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwicHJvcE5hbWUiLCJvRGF0YSIsIm9yaWdpbmFsRGVmaW5pdGlvbiIsInZhbGlkYXRlIiwib0luc3RhbmNlIiwiZ2V0UHJvcGVydGllcyIsInNDb250ZXh0TmFtZSIsInRhcmdldE9iamVjdCIsImlzQ29udGV4dCIsImF0dHJpYnV0ZVZhbHVlIiwic3RvcmVPYmplY3RWYWx1ZSIsIm5ld0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIm9QcmV2aW91c01hY3JvSW5mbyIsImNvcmVSZXF1aXJlIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvbGRLZXlzIiwidGVtcG9yYXJ5T2JqZWN0U3RvcmUiLCJ0ZW1wbGF0ZVN0cmluZyIsImpzeCIsInJlbmRlckFzWE1MIiwiZ2V0VGVtcGxhdGUiLCJpc1J1bnRpbWUiLCJzdG9yZUtleSIsImhhc0Vycm9yIiwiaGFzUGFyc2VFcnJvciIsInBhcnNlZFRlbXBsYXRlIiwicGFyc2VYTUxTdHJpbmciLCJpdGVyIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsInRleHRub2RlIiwibmV4dE5vZGUiLCJ0ZXh0Q29udGVudCIsInRyaW0iLCJwcm9jZXNzWG1sSW5UcmFjZSIsImluaXRpYWxUZW1wbGF0ZSIsIm9FcnJvclRleHQiLCJjcmVhdGVFcnJvclhNTCIsInRlbXBsYXRlIiwib3V0ZXJIVE1MIiwiam9pbiIsInZpc2l0ZWROb2RlcyIsImludGVybmFsTm9kZSIsIlByb21pc2UiLCJhbGwiLCJyZW1vdmUiLCJyZXNvbHZlIiwib01hY3JvRWxlbWVudCIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJyZXF1aXJlT25NYWNybyIsImdldEF0dHJpYnV0ZU5TIiwic3Vic3RyaW5nIiwic2V0QXR0cmlidXRlTlMiLCJjbGFzc0xpc3QiLCJhZGQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsIm9FcnJvciIsInN0YWNrIiwib1RlbXBsYXRlIiwib0N0eCIsIm1TZXR0aW5nIiwiZXgiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJ1bnJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSIsImVycm9yU3RhY2siLCJzdGFja0Zvcm1hdHRlZCIsImJ0b2EiLCJhZGRpdGlvbmFsVGV4dCIsImpzb25WYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXBsYWNlQWxsIiwicHJvcGVydHlVSUQiLCJwcm9jZXNzTmV4dFhtbEluVHJhY2UiLCJtZXRob2QiLCJyZXR1cm5WYWx1ZSIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJwYXJlbnRFbGVtZW50IiwicmVuZGVySW5UcmFjZU1vZGUiLCJvdXRTdHIiLCJ4bWxSZXN1bHQiLCJpbm5lclRleHQiLCJpbm5lckhUTUwiLCJzcGxpdCIsInN0cmluZ3MiLCJpIiwiX2xlbiIsInZhbHVlcyIsIl9rZXkiLCJpc0FycmF5IiwiZmxhdCIsImlzRnVuY3Rpb25BcnJheSIsInZhbHVlZm4iLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImNvbXBpbGVkRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwicHJvcGVydHlVSWQiLCJhZGRDb25kaXRpb25hbGx5VG9YTUwiLCJjb25kaXRpb24iLCJwYXJ0VG9BZGQiLCJhZGRBdHRyaWJ1dGVUb1hNTCIsImlzVW5kZWZpbmVkRXhwcmVzc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBpc1VuZGVmaW5lZEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBBdHRyaWJ1dGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uLFxuXHRPYmplY3RWYWx1ZSxcblx0T2JqZWN0VmFsdWUyXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IERlZmluaXRpb25Db250ZXh0LCBEZWZpbml0aW9uUGFnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9kZWZpbml0aW9uL0ZFRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgaXNDb250ZXh0LCBpc0Z1bmN0aW9uQXJyYXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvIH0gZnJvbSBcIi4uL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi4vVHJhY2VJbmZvXCI7XG5cbmNvbnN0IExPR0dFUl9TQ09QRSA9IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmNvbnN0IFhNTFRFTVBMQVRJTkdfTlMgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgJiB7XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIG1ldGEgZGF0YSBjb250ZXh0XG4gKi9cbnR5cGUgTWV0YURhdGFDb250ZXh0ID0ge1xuXHRuYW1lPzogc3RyaW5nO1xuXHRtb2RlbDogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRjdXJyZW50Q29udGV4dFBhdGg6IENvbnRleHQ7XG5cdGlzUHVibGljOiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0aXNSdW50aW1lSW5zdGFudGlhdGlvbj86IGJvb2xlYW47XG5cdG1vZGVsczogUmVjb3JkPHN0cmluZywgTW9kZWw+ICYge1xuXHRcdGNvbnZlcnRlckNvbnRleHQ6IEpTT05Nb2RlbDtcblx0XHR2aWV3RGF0YTogSlNPTk1vZGVsO1xuXHRcdGludGVybmFsOiBKU09OTW9kZWw7XG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcInNhcC5mZS5pMThuXCI/OiBSZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRnZXREZWZpbml0aW9uQ29udGV4dCgpOiBEZWZpbml0aW9uQ29udGV4dDtcblx0Z2V0RGVmaW5pdGlvbkZvclBhZ2UoKTogRGVmaW5pdGlvblBhZ2U7XG5cdGJpbmRpbmdDb250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD47XG5cdF9tYWNyb0luZm8/OiBNYWNyb0luZm87XG5cdFtrOiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgSVZpc2l0b3JDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncztcblx0LyoqXG5cdCAqIFZpc2l0cyB0aGUgZ2l2ZW4gbm9kZSBhbmQgZWl0aGVyIHByb2Nlc3NlcyBhIHRlbXBsYXRlIGluc3RydWN0aW9uLCBjYWxsc1xuXHQgKiBhIHZpc2l0b3IsIG9yIHNpbXBseSBjYWxscyBib3RoIHtAbGlua1xuXHQgKiBzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2sudmlzaXRBdHRyaWJ1dGVzIHZpc2l0QXR0cmlidXRlc31cblx0ICogYW5kIHtAbGluayBzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2sudmlzaXRDaGlsZE5vZGVzXG5cdCAqIHZpc2l0Q2hpbGROb2Rlc30uXG5cdCAqIEBwYXJhbSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnNcblx0ICogICBBIHRoZW5hYmxlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHZpc2l0aW5nXG5cdCAqICAgaXMgZG9uZSwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgdmlzaXRpbmcgZmFpbHNcblx0ICovXG5cdHZpc2l0Tm9kZShvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEluc2VydHMgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuIExvYWRzIHRoZVxuXHQgKiBmcmFnbWVudCwgdGFrZXMgY2FyZSBvZiBjYWNoaW5nIChmb3IgdGhlIGN1cnJlbnQgcHJlLXByb2Nlc3NvciBydW4pIGFuZCB2aXNpdHMgdGhlXG5cdCAqIGZyYWdtZW50J3MgY29udGVudCBvbmNlIGl0IGhhcyBiZWVuIGltcG9ydGVkIGludG8gdGhlIGVsZW1lbnQncyBvd25lciBkb2N1bWVudCBhbmRcblx0ICogcHV0IGludG8gcGxhY2UuIExvYWRpbmcgb2YgZnJhZ21lbnRzIGlzIGFzeW5jaHJvbm91cyBpZiB0aGUgdGVtcGxhdGUgdmlldyBpc1xuXHQgKiBhc3luY2hyb25vdXMuXG5cdCAqIEBwYXJhbSBzRnJhZ21lbnRcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSBvRWxlbWVudFxuXHQgKiAgIHRoZSBYTUwgRE9NIGVsZW1lbnQsIGUuZy4gPHNhcC51aS5jb3JlOkZyYWdtZW50PiBvciA8Y29yZTpFeHRlbnNpb25Qb2ludD5cblx0ICogQHBhcmFtIG9XaXRoXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnNcblx0ICogQSBzeW5jIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdGhlIGZyYWdtZW50XG5cdCAqICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIGxvYWRpbmcgb3IgdmlzaXRpbmdcblx0ICogICBmYWlscy5cblx0ICovXG5cdGluc2VydEZyYWdtZW50KHNGcmFnbWVudDogc3RyaW5nLCBvRWxlbWVudDogRWxlbWVudCwgb1dpdGg/OiBDb250cm9sKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGUob05vZGU6IEVsZW1lbnQsIG9BdHRyaWJ1dGU6IEF0dHIpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdEF0dHJpYnV0ZXMob05vZGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+O1xuXHRnZXRWaWV3SW5mbygpOiBQcm9taXNlPHVua25vd24+O1xuXHR2aXNpdENoaWxkTm9kZXMob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogSW50ZXJwcmV0cyB0aGUgZ2l2ZW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBiaW5kaW5nIGFuZCByZXR1cm5zIHRoZVxuXHQgKiByZXN1bHRpbmcgdmFsdWUuXG5cdCAqIEBwYXJhbSBzVmFsdWVcblx0ICogICBBbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZVxuXHQgKiBAcGFyYW0gW2VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHRpbmcgdmFsdWUsIG9yIGlzIHJlamVjdGVkIHdpdGggYVxuXHQgKiAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgKGZvciBleGFtcGxlLCBhbiBlcnJvciB0aHJvd24gYnkgYSBmb3JtYXR0ZXIpIG9yXG5cdCAqICAgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgYmluZGluZyBpcyBub3QgcmVhZHkgKGJlY2F1c2UgaXQgcmVmZXJzIHRvIGFcblx0ICogICBtb2RlbCB3aGljaCBpcyBub3QgYXZhaWxhYmxlKSAoc2luY2UgMS41Ny4wKVxuXHQgKi9cblx0Z2V0UmVzdWx0KHNWYWx1ZTogc3RyaW5nLCBlbGVtZW50PzogRWxlbWVudCk6IFByb21pc2U8Q29udGV4dD4gfCBudWxsO1xuXHRnZXRDb250ZXh0KHNQYXRoPzogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYXAgb2YgdmFyaWFibGVzIHdoaWNoXG5cdCAqIG92ZXJyaWRlIGN1cnJlbnRseSBrbm93biB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8Y29kZT50aGlzPC9jb2RlPlxuXHQgKiBwYXJlbnQgaW50ZXJmYWNlIG9yIHJlcGxhY2UgdGhlbSBhbHRvZ2V0aGVyLiBFYWNoIHZhcmlhYmxlIG5hbWUgYmVjb21lcyBhXG5cdCAqIG5hbWVkIG1vZGVsIHdpdGggYSBjb3JyZXNwb25kaW5nIG9iamVjdCBiaW5kaW5nIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlXG5cdCAqIFhNTCB0ZW1wbGF0ZSBpbiB0aGUgdXN1YWwgd2F5LCB0aGF0IGlzLCB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uIGxpa2Vcblx0ICogPGNvZGU+XCJ7dmFyPnNvbWUvcmVsYXRpdmUvcGF0aH1cIjwvY29kZT4gKHNlZSBleGFtcGxlKS5cblx0ICogQHBhcmFtIFttVmFyaWFibGVzPXt9XVxuXHQgKiAgIE1hcCBmcm9tIHZhcmlhYmxlIG5hbWUgKHN0cmluZykgdG8gdmFsdWVcblx0ICogQHBhcmFtIFtiUmVwbGFjZV1cblx0ICogICBXaGV0aGVyIG9ubHkgdGhlIGdpdmVuIHZhcmlhYmxlcyBhcmUga25vd24gaW4gdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2Vcblx0ICogICBpbnN0YW5jZSwgbm8gaW5oZXJpdGVkIG9uZXNcblx0ICogQHJldHVybnNcblx0ICogICBBIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbVZhcmlhYmxlc1xuXHQgKiBAcGFyYW0gYlJlcGxhY2Vcblx0ICovXG5cdFwid2l0aFwiKG1WYXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiwgYlJlcGxhY2U/OiBib29sZWFuKTogSVZpc2l0b3JDYWxsYmFjaztcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdG9Db250ZXh0U2V0dGluZ3M6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRzS2V5OiBzdHJpbmdcbik6IHZvaWQge1xuXHRjb25zdCBvQ29udGV4dCA9IG1Db250ZXh0c1tzS2V5XTtcblx0Y29uc3Qgb0NvbnRleHRPYmplY3QgPSBvQ29udGV4dD8uZ2V0T2JqZWN0KCkgYXMge1xuXHRcdCRUeXBlPzogc3RyaW5nO1xuXHRcdCRraW5kPzogc3RyaW5nO1xuXHR9O1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkID09PSB0cnVlICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRPYmplY3QuJGtpbmQgIT09IHVuZGVmaW5lZCAmJiBvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkVHlwZXMuaW5jbHVkZXMob0NvbnRleHRPYmplY3QuJGtpbmQpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmXG5cdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzXG5cdFx0KSB7XG5cdFx0XHQvLyBDaGVjayBvbmx5ICRUeXBlXG5cdFx0XHRpZiAoIW9Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXMuaW5jbHVkZXMob0NvbnRleHRPYmplY3QuJFR5cGUpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKFxuXHRzTmFtZTogc3RyaW5nLFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvTm9kZTogRWxlbWVudFxuKTogdm9pZCB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0Ly8gY29sbGVjdCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb05vZGUuZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0b0F0dHJpYnV0ZU5hbWVzW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0fVxuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlTZXR0aW5ncyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NLZXldO1xuXHRcdGlmICghb05vZGUuaGFzQXR0cmlidXRlKHNLZXkpKSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5U2V0dGluZ3MucmVxdWlyZWQgJiYgIW9Qcm9wZXJ0eVNldHRpbmdzLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IGAgKyBgUmVxdWlyZWQgcHJvcGVydHkgJyR7c0tleX0nIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggY29udGFpbiBhIGNvbG9uIFwiOlwiIChkaWZmZXJlbnQgbmFtZXNwYWNlKSwgZS5nLiB4bWxuczp0cmFjZSwgdHJhY2U6bWFjcm9JRCwgdW5pdHRlc3Q6aWRcblx0XHRpZiAoIXNLZXkuaW5jbHVkZXMoXCI6XCIpICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmNvbnN0IFNBUF9VSV9DT1JFX0VMRU1FTlQgPSBcInNhcC51aS5jb3JlLkVsZW1lbnRcIjtcblxuZXhwb3J0IGNvbnN0IFNBUF9VSV9NT0RFTF9DT05URVhUID0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIG1ldGFkYXRhIG9mIGEgYnVpbGRpbmcgYmxvY2sgYnkgYWRkaW5nIGFkZGl0aW9uYWwgYWdncmVnYXRpb25zLFxuICogYW5kIHNwbGl0dGluZyBwcm9wZXJ0aWVzIGludG8gYWN0dWFsIHByb3BlcnRpZXMgYW5kIG1ldGFkYXRhIGNvbnRleHRzLlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tNZXRhZGF0YSBUaGUgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgaW5wdXRcbiAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBtZXRhZGF0YVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1NZXRhZGF0YShidWlsZGluZ0Jsb2NrTWV0YWRhdGE6IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSk6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhIHtcblx0Y29uc3QgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj4gPSB7XG5cdFx0Y2xhc3M6IHtcblx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH1cblx0fTtcblx0Y29uc3QgYWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPiA9IHtcblx0XHRkZXBlbmRlbnRzOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJkZXBlbmRlbnRzXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0Y3VzdG9tRGF0YToge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiY3VzdG9tRGF0YVwiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdGxheW91dERhdGE6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImxheW91dERhdGFcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zXG5cdH07XG5cdGNvbnN0IG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzKSkge1xuXHRcdGNvbnN0IHByb3BlcnR5VHlwZSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0udHlwZTtcblxuXHRcdGlmIChwcm9wZXJ0eVR5cGUgIT09IFNBUF9VSV9NT0RFTF9DT05URVhUKSB7XG5cdFx0XHRwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdH1cblxuXHRcdGlmIChbU0FQX1VJX01PREVMX0NPTlRFWFQsIFwib2JqZWN0XCIsIFwiYXJyYXlcIl0uaW5jbHVkZXMocHJvcGVydHlUeXBlKSkge1xuXHRcdFx0Ly8gRXhwbGljaXRseSBkZWZpbmVkIGNvbnRleHRzLCBvYmplY3RzLCBhbmQgYXJyYXlzIG1heSBjb21lIGZyb20gdGhlIG1ldGFkYXRhQ29udGV4dFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0c1twcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSBhcyBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdC4uLmJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0XHRwcm9wZXJ0aWVzLFxuXHRcdG1ldGFkYXRhQ29udGV4dHMsXG5cdFx0YWdncmVnYXRpb25zXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBhYnNvbHV0ZSBvciBjb250ZXh0IHBhdGhzIGFuZCByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIE1ldGFDb250ZXh0LlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRwYXRoOiBzTWV0YVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBoZWxwcyB0byBjcmVhdGUgdGhlIG1ldGFkYXRhIGNvbnRleHQgaW4gY2FzZSBpdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUuXG4gKiBAcGFyYW0gb1NldHRpbmdzIEFkZGl0aW9uYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSBzQXR0cmlidXRlTmFtZSBUaGUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSBzQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMgVGhlIG1ldGEgZGF0YSBjb250ZXh0IG9iamVjdFxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRzQXR0cmlidXRlVmFsdWU6IHN0cmluZ1xuKTogTWV0YURhdGFDb250ZXh0IHtcblx0bGV0IHJldHVybkNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dDtcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpICYmICFvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuZ2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlKSkge1xuXHRcdGNvbnN0IGRhdGEgPSB1bnN0b3JlT2JqZWN0VmFsdWUoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlLCBkYXRhKTtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fSBlbHNlIGlmICgoc0F0dHJpYnV0ZU5hbWUgPT09IFwibWV0YVBhdGhcIiAmJiBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoKSB8fCBzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IF9jaGVja0Fic29sdXRlQW5kQ29udGV4dFBhdGhzKG9TZXR0aW5ncywgc0F0dHJpYnV0ZVZhbHVlKTtcblx0fSBlbHNlIGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogc0F0dHJpYnV0ZVZhbHVlXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm5Db250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRwYXRoOiBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldCA/IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0LmdldFBhdGgoc0F0dHJpYnV0ZVZhbHVlKSA6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHJldHVybkNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0b05vZGU6IEVsZW1lbnQsXG5cdHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbik6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdGxldCBvTWV0YWRhdGFDb250ZXh0OiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQ7XG5cdGlmICghYkRvTm90UmVzb2x2ZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0bGV0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCAmJiBzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9NZXRhZGF0YUNvbnRleHQubW9kZWwgJiYgb01ldGFkYXRhQ29udGV4dC5wYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgbWV0YVBhdGggaXMgZmlsbGVkIHRocm91Z2ggYSBKU09OIG1vZGVsLCB3ZSBjYW4ndCB1c2UgdGhpcyBjb250ZXh0IGFzIHRoZSBtZXRhZGF0YUNvbnRleHQsXG5cdFx0XHQvLyBidXQgaW5zdGVhZCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCB0aGUgYWN0dWFsIHZhbHVlXG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dFBhdGggPSBgJHtvTWV0YWRhdGFDb250ZXh0Lm1vZGVsfT4ke29NZXRhZGF0YUNvbnRleHQucGF0aH1gO1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IG9WaXNpdG9yLmdldENvbnRleHQobWV0YUNvbnRleHRQYXRoKTtcblx0XHRcdGlmIChjb250ZXh0Py5nZXRNb2RlbCgpPy5pc0EoXCJzYXAudWkubW9kZWwuanNvbi5KU09OTW9kZWxcIikpIHtcblx0XHRcdFx0c0F0dHJpYnV0ZVZhbHVlID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIHByb3BlcnRpZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+PiB7XG5cdGNvbnN0IGRlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID1cblx0XHRcdFx0ZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgJiYgZGVlcENsb25lKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljICE9PSB0cnVlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdmFsdWU7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgYW5kIG1pc3NpbmcgY29udGV4dHNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdC8vIElmIHRoZSBjb250ZXh0IHdhcyByZXNvbHZlZCBhcyBhIHByb3BlcnR5IChiaW5kaW5nIC8geG1sIGFnZ3JlZ2F0aW9uKSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCBoZXJlLlxuXHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuXHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuID8/IGZhbHNlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAobUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGJpbmRpbmcgY291bGRuJ3QgYmUgcmVzb2x2ZWQgY29uc2lkZXIgdGhhdCB0aGVyZSB3YXMgbm8gdmFsdWUgaGVyZVxuXHRcdFx0XHRkZWxldGUgb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1NaXNzaW5nQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5hc3luYyBmdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0FnZ3JlZ2F0aW9uPzogRWxlbWVudCxcblx0ZGVmaW5pdGlvbj86IEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb25cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPj4ge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgZmlyc3RFbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb24uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0aWYgKGZpcnN0RWxlbWVudENoaWxkPy5uYW1lc3BhY2VVUkkgPT09IFhNTFRFTVBMQVRJTkdfTlMpIHtcblx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRjb25zdCBvUGFyZW50ID0gZmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShmaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHxcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpIHx8XG5cdFx0XHRcdChkZWZpbml0aW9uPy5za2lwS2V5ICYmIGRlZmluaXRpb24ubXVsdGlwbGUgPT09IGZhbHNlICYmIHVpZCgpKTtcblx0XHRcdGlmIChjaGlsZEtleSkge1xuXHRcdFx0XHRjaGlsZEtleSA9IGBJbmxpbmVYTUxfJHtjaGlsZEtleX1gO1xuXHRcdFx0XHRjaGlsZERlZmluaXRpb24uc2V0QXR0cmlidXRlKFwia2V5XCIsIGNoaWxkS2V5KTtcblx0XHRcdFx0bGV0IGFnZ3JlZ2F0aW9uT2JqZWN0OiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb24gPSB7XG5cdFx0XHRcdFx0a2V5OiBjaGlsZEtleSxcblx0XHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdFx0cGxhY2VtZW50OiAoY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcInBsYWNlbWVudFwiKSBhcyBQbGFjZW1lbnQpIHx8IFBsYWNlbWVudC5BZnRlcixcblx0XHRcdFx0XHRcdGFuY2hvcjogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImFuY2hvclwiKSB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHR5cGU6IFwiU2xvdFwiXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChkZWZpbml0aW9uPy5wcm9jZXNzQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25PYmplY3QgPSBkZWZpbml0aW9uLnByb2Nlc3NBZ2dyZWdhdGlvbnMoY2hpbGREZWZpbml0aW9uLCBhZ2dyZWdhdGlvbk9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b091dE9iamVjdHNbYWdncmVnYXRpb25PYmplY3Qua2V5XSA9IGFnZ3JlZ2F0aW9uT2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChjaGlsZERlZmluaXRpb24udGFnTmFtZSAhPT0gXCJzbG90XCIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBUaGUgYWdncmVnYXRpb24gJHtjaGlsZERlZmluaXRpb24ubm9kZU5hbWV9IGlzIG1pc3NpbmcgYSBLZXkgYXR0cmlidXRlLiBJdCBpcyBub3QgZGlzcGxheWVkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBwcm9wZXJ0aWVzIHdoZW4gdGhlIHR5cGUgaXMgYW4gb2JqZWN0LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIFhNTCBlbGVtZW50IHRvIHBhcnNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIG9iamVjdFxuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0KGVsZW1lbnQ6IEVsZW1lbnQpOiBvYmplY3Qge1xuXHRjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG5cdGNvbnN0IG15QXJyYXk6IEFycmF5PHVua25vd24+ID0gW107XG5cdGNvbnN0IG15T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG5cdFx0bXlPYmplY3RbYXR0cmlidXRlTmFtZV0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0fVxuXHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkTm9kZU5hbWVzID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcCgoa2V5KSA9PiBjaGlsZHJlbltrZXkgYXMgdW5rbm93biBhcyBudW1iZXJdLmxvY2FsTmFtZSk7XG5cdFx0Y29uc3QgY2hpbGRJc0FycmF5ID0gY2hpbGROb2RlTmFtZXMubGVuZ3RoICE9PSBuZXcgU2V0KGNoaWxkTm9kZU5hbWVzKS5zaXplO1xuXHRcdGZvciAoY29uc3QgY2hpbGREZWZpbml0aW9uIG9mIGNoaWxkcmVuIGFzIHVua25vd24gYXMgQXJyYXk8RWxlbWVudD4pIHtcblx0XHRcdGlmIChjaGlsZElzQXJyYXkpIHtcblx0XHRcdFx0bXlBcnJheS5wdXNoKHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRteU9iamVjdFtjaGlsZERlZmluaXRpb24ubG9jYWxOYW1lXSA9IHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoaWxkSXNBcnJheSkge1xuXHRcdFx0cmV0dXJuIG15QXJyYXk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBteU9iamVjdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgZm9yIHdoaWNoIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuXG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgVGhlIHZhbHVlcyBvZiBhbHJlYWR5IHBhcnNlZCBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBjaGlsZHJlblxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgRWxlbWVudD4+IHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblxuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQubmFtZXNwYWNlVVJJID09PSBYTUxURU1QTEFUSU5HX05TKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRcdGNvbnN0IG9QYXJlbnQgPSBvRmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdFx0aWYgKG9QYXJlbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdID8gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gOiBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE5vdCBzdXJlIGhvdyB0aGlzIGNvdWxkIGhhcHBlbiBidXQgSSBhbHNvIGRvbid0IHdhbnQgdG8gY3JlYXRlIGluZmluaXRlIGxvb3BzXG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBhd2FpdCBwYXJzZUFnZ3JlZ2F0aW9uKG9WaXNpdG9yLCBvRmlyc3RFbGVtZW50Q2hpbGQsIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QgJiYgb0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR3aGlsZSAoY2hpbGREZWZpbml0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Q2hpbGQgPSBjaGlsZERlZmluaXRpb24ubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSEpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkRGVmaW5pdGlvbjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbiA9IG5leHRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gc0NoaWxkTmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb05ld0NoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmNsb25lTm9kZSh0cnVlKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyA9IHByb2Nlc3NPYmplY3Qob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXM7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW47XG5cdFx0XHRcdFx0XHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPltdID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdFx0XHRcdFx0Ly8gbm9uIGtleWVkIGNoaWxkLCBqdXN0IGFkZCBpdCB0byB0aGUgYWdncmVnYXRpb25cblx0XHRcdFx0XHRcdFx0Y29uc3QgbXlDaGlsZDogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiA9IHt9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2F0dHJpYnV0ZU5hbWVdID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvT3V0T2JqZWN0cy5wdXNoKG15Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvT3V0T2JqZWN0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTbG90cyhcblx0b0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4sXG5cdG9NZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRwcm9jZXNzQ3VzdG9tRGF0YSA9IGZhbHNlXG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0aWYgKG9Ob2RlICE9PSBudWxsICYmIG9Ob2RlICE9PSB1bmRlZmluZWQgJiYgb0FnZ3JlZ2F0aW9uRWxlbWVudCkge1xuXHRcdFx0XHQvLyBzbG90cyBjYW4gaGF2ZSA6OiBhcyBrZXlzIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGFnZ3JlZ2F0aW9uIG5hbWUgdGhlcmVmb3JlIHJlcGxhY2luZyB0aGVtXG5cdFx0XHRcdGNvbnN0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRpZiAoIVtcImRlcGVuZGVudHNcIiwgXCJjdXN0b21EYXRhXCIsIFwibGF5b3V0RGF0YVwiXS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb0VsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZTogRWxlbWVudCwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nLCBvRWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCk6IEVsZW1lbnQge1xuXHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdHdoaWxlIChvRWxlbWVudENoaWxkKSB7XG5cdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRvRWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb05ld0NoaWxkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0QnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgPz8gYCR7b01ldGFkYXRhLm5hbWVzcGFjZSA/PyBvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlfS4ke29NZXRhZGF0YS54bWxUYWcgPz8gb01ldGFkYXRhLm5hbWV9YDtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cblx0Ly8gQWRkIGFuIGVtcHR5IGNvbnZlcnRlciBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgaW4gb3JkZXIgdG8gaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIG9iamVjdCB2YWx1ZXNcblx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0ID8/PSBuZXcgSlNPTk1vZGVsKCk7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhvTWV0YWRhdGEsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0ID0gcHJvY2Vzc0NvbnRleHRzKG9NZXRhZGF0YSwgb1NldHRpbmdzLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBtQ29udGV4dHMsIHByb3BlcnR5VmFsdWVzKTtcblxuXHR0cnkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGFuZCBjb21wbGV4IHR5cGUgc3VwcG9ydFxuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnMgPSBhd2FpdCBwcm9jZXNzQ2hpbGRyZW4ob05vZGUsIG9WaXNpdG9yLCBvTWV0YWRhdGEsIGlzUHVibGljLCBwcm9wZXJ0eVZhbHVlcyk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXG5cdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRsZXQgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuXHRcdFx0Ly9jaGVjayBmb3IgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIC8gb3ZlcndyaXRlIHBhcmFtZXRlcnNcblx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IEJ1aWxkaW5nQmxvY2tDbGFzcz8ubWV0YWRhdGE/LnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXHRcdFx0aWYgKG9yaWdpbmFsRGVmaW5pdGlvbj8udmFsaWRhdGUpIHtcblx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhPy5pc0E/LihTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiYgIW9EYXRhLmdldE1vZGVsKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSA9IG9EYXRhLmdldE9iamVjdCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb3BlcnR5VmFsdWVzLmlzUHVibGljID0gaXNQdWJsaWM7XG5cblx0XHRjb25zdCBvSW5zdGFuY2UgPSBuZXcgQnVpbGRpbmdCbG9ja0NsYXNzKHsgLi4ucHJvcGVydHlWYWx1ZXMsIC4uLm9BZ2dyZWdhdGlvbnMgfSwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0aWYgKGlzQ29udGV4dCh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlVmFsdWUgPSBzdG9yZU9iamVjdFZhbHVlKHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KGF0dHJpYnV0ZVZhbHVlLCB0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoYXR0cmlidXRlVmFsdWUpITtcblx0XHRcdFx0XHR1bnN0b3JlT2JqZWN0VmFsdWUoYXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gbmV3Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXHRcdC8vIGNvcmU6cmVxdWlyZSBuZWVkIHRvIGJlIGRlZmluZWQgb24gdGhlIG5vZGUgaXRzZWxmIHRvIGJlIHBpY2tlZCB1cCBkdWUgdG8gdGhlIHRlbXBsYXRpbmcgc3RlcFxuXHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGU/LmdldEF0dHJpYnV0ZShcImNvcmU6cmVxdWlyZVwiKSB8fCB1bmRlZmluZWQ7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKG1Db250ZXh0cywgb01ldGFkYXRhLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIW9NZXRhZGF0YS5pc09wZW4gOiB0cnVlKTtcblx0XHRjb25zdCBvUGFyZW50ID0gb05vZGUucGFyZW50Tm9kZTtcblxuXHRcdGxldCBpQ2hpbGRJbmRleDogbnVtYmVyO1xuXHRcdGxldCBvUHJvbWlzZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXG5cdFx0XHRpZiAob01ldGFkYXRhLmZyYWdtZW50KSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9sZEtleXMgPSBPYmplY3Qua2V5cyh0ZW1wb3JhcnlPYmplY3RTdG9yZSk7XG5cdFx0XHRcdGNvbnN0IHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSEob05vZGUpKTtcblxuXHRcdFx0XHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdC8vIEZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrcywgd2UgbmVlZCB0byBhdHRhY2ggYWxsIG9iamVjdHMgdG8gdGhlIGNvbnZlcnRlckNvbnRleHQgZGlyZWN0bHksIGFzIHRoZSBhY3R1YWwgcmVuZGVyaW5nIHRha2VzIHBsYWNlIGF0IHJ1bnRpbWVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN0b3JlS2V5IGluIHRlbXBvcmFyeU9iamVjdFN0b3JlKSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9sZEtleXMuaW5jbHVkZXMoc3RvcmVLZXkpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB1bnN0b3JlT2JqZWN0VmFsdWUoc3RvcmVLZXkpO1xuXHRcdFx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc3RvcmVLZXksIGRhdGEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBoYXNFcnJvciA9IFwiXCI7XG5cdFx0XHRcdGlmICh0ZW1wbGF0ZVN0cmluZykge1xuXHRcdFx0XHRcdGxldCBoYXNQYXJzZUVycm9yID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV0IHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcodGVtcGxhdGVTdHJpbmcsIHRydWUpO1xuXHRcdFx0XHRcdC8vIEZvciBzYWZldHkgcHVycG9zZSB3ZSB0cnkgdG8gZGV0ZWN0IHRyYWlsaW5nIHRleHQgaW4gYmV0d2VlbiBYTUwgVGFnc1xuXHRcdFx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXJzZWRUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihlbGVtZW50LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG5cdFx0XHRcdFx0XHRsZXQgdGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0XHRoYXNQYXJzZUVycm9yID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdoaWxlICh0ZXh0bm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGV4dG5vZGUudGV4dENvbnRlbnQgJiYgdGV4dG5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNFcnJvciA9IHRleHRub2RlLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChoYXNQYXJzZUVycm9yKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIHBhcnNlZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyB0aGUgWE1MIGl0IG1lYW5zIHRoZSBYTUwgaXRzZWxmIGlzIG1hbGZvcm1lZCwgYXMgc3VjaCB3ZSByZXJ1biB0aGUgdGVtcGxhdGUgcHJvY2Vzc1xuXHRcdFx0XHRcdFx0Ly8gU2V0dGluZyBpc1RyYWNlTW9kZSB0cnVlIHdpbGwgbWFrZSBpdCBzbyB0aGF0IGVhY2ggeG1sYCBleHByZXNzaW9uIGlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGZyb20gWE1MIHBlcnNwZWN0aXZlXG5cdFx0XHRcdFx0XHQvLyBJZiBhbiBlcnJvciBpcyBmb3VuZCBpdCdzIHJldHVybmVkIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBmcmFnbWVudFxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLCBoYXNFcnJvcik7XG5cdFx0XHRcdFx0XHRwYXJzZWRUZW1wbGF0ZSA9IChhd2FpdCBwcm9jZXNzWG1sSW5UcmFjZShhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PiBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKSk7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pKSBhcyBFbGVtZW50W107XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChoYXNFcnJvci5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyB0cmFpbGluZyB0ZXh0IHdlIGNyZWF0ZSBhIHN0YW5kYXJkIGVycm9yIGFuZCBkaXNwbGF5IGl0LlxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvclRleHQgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgdmlzaXRlZE5vZGVzID0gcGFyc2VkVGVtcGxhdGUubWFwKGFzeW5jIChpbnRlcm5hbE5vZGUpID0+IHtcblx0XHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBpbnRlcm5hbE5vZGUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKGludGVybmFsTm9kZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLmFsbCh2aXNpdGVkTm9kZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgdHJ1ZSk7XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29yZVJlcXVpcmUpIHtcblx0XHRcdFx0XHRsZXQgcmVxdWlyZU9uTWFjcm8gPSBvTWFjcm9FbGVtZW50LmdldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJyZXF1aXJlXCIpO1xuXHRcdFx0XHRcdGlmIChyZXF1aXJlT25NYWNybykge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSByZXF1aXJlT25NYWNyby5zdWJzdHJpbmcoMCwgcmVxdWlyZU9uTWFjcm8ubGVuZ3RoIC0gMSkgKyBcIixcIiArIGNvcmVSZXF1aXJlLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxhc3QgfSBhbmQgZmlyc3Qge1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXF1aXJlT25NYWNybyA9IGNvcmVSZXF1aXJlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJjb3JlOnJlcXVpcmVcIiwgcmVxdWlyZU9uTWFjcm8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlcy5jbGFzcyAmJiAhQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdG9NYWNyb0VsZW1lbnQuY2xhc3NMaXN0LmFkZChwcm9wZXJ0eVZhbHVlcy5jbGFzcyBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlOiB1bmtub3duKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pOiB2b2lkIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3M6IHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UpOiB2b2lkIHtcblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciwgdHJ1ZSksXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBVblJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiBzbyB0aGF0IGl0IGlzIG5vIGxvbmdlciB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk6IHZvaWQge1xuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRudWxsLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCwgc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGVycm9yU3RhY2sgPSBcIlwiO1xuXHRpZiAoc3RhY2spIHtcblx0XHRjb25zdCBzdGFja0Zvcm1hdHRlZCA9IGJ0b2EoYDxwcmU+JHtzdGFja308L3ByZT5gKTtcblx0XHRlcnJvclN0YWNrID0geG1sYDxtOkZvcm1hdHRlZFRleHQgaHRtbFRleHQ9XCJ7PSBCQkYuYmFzZTY0RGVjb2RlKCcke3N0YWNrRm9ybWF0dGVkfScpIH1cIiAvPmA7XG5cdH1cblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0bGV0IGpzb25WYWx1ZSA9IFwiXCI7XG5cdFx0dHJ5IHtcblx0XHRcdGpzb25WYWx1ZSA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRqc29uVmFsdWUgPSBidG9hKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IFwiQ291bGQgbm90IHN0cmluZ2lmeSBhZGRpdGlvbmFsRGF0YSBkdWUgdG8gY2lyY3VsYXIgc3RydWN0dXJlLlwiIH0sIG51bGwsIDQpKTtcblx0XHR9XG5cblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtqc29uVmFsdWV9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8Y29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyIHhtbG5zOmNvbnRyb2xzPVwic2FwLmZlLmNvcmUuY29udHJvbHNcIj5cblx0XHRcdFx0XHQ8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHN0b3JlXG4gKiBAcmV0dXJucyBJRCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZU9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0Y29uc3QgcHJvcGVydHlVSUQgPSBgL3VpZC0tJHt1aWQoKX1gO1xuXHR0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZTtcblx0cmV0dXJuIHByb3BlcnR5VUlEO1xufVxuXG4vKipcbiAqIFVuc3RvcmVzIGFuIG9iamVjdCBmcm9tIGEgdGVtcG9yYXJ5IHN0b3JlIGJ5IHJlbW92aW5nIGl0IGFuZCByZXR1cm5pbmcgaXRzIG9iamVjdCB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eVVJRCBJRCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlXG4gKiBAcmV0dXJucyBPYmplY3QgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdW5zdG9yZU9iamVjdFZhbHVlKHByb3BlcnR5VUlEOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3QgdmFsdWUgPSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdGRlbGV0ZSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdHJldHVybiB2YWx1ZTtcbn1cblxubGV0IHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgYWxsIHhtbGAgY2FsbHMgaW5zaWRlIHRoZSBnaXZlbiBtZXRob2QgYXJlIHByb2Nlc3NlZCBpbiB0cmFjZSBtb2RlLlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIG1ldGhvZFxuICovXG5jb25zdCBwcm9jZXNzWG1sSW5UcmFjZSA9IGFzeW5jIGZ1bmN0aW9uIChtZXRob2Q6ICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcblx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gdHJ1ZTtcblx0bGV0IHJldHVyblZhbHVlO1xuXHR0cnkge1xuXHRcdHJldHVyblZhbHVlID0gbWV0aG9kKCk7XG5cdH0gZmluYWxseSB7XG5cdFx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKiBAcGFyYW0geG1sU3RyaW5nIFRoZSB4bWwgc3RyaW5nXG4gKiBAcGFyYW0gW2FkZERlZmF1bHROYW1lc3BhY2VzXSBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IG5hbWVzcGFjZXMgc2hvdWxkIGJlIGFkZGVkXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50W10ge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRjb25zdCBjaGlsZHJlbiA9IG91dHB1dD8ucGFyZW50RWxlbWVudCA/IG91dHB1dD8ucGFyZW50RWxlbWVudC5jaGlsZHJlbiA6IFtvdXRwdXQgYXMgRWxlbWVudF07XG5cdHJldHVybiBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0Py5sZW5ndGggPiAwICYmIHhtbFJlc3VsdFswXT8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuXHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb3V0U3RyO1xuXHR9XG59XG5cbmV4cG9ydCB0eXBlIFhNTFByb2Nlc3NvclR5cGVWYWx1ZSA9XG5cdHwgc3RyaW5nXG5cdHwgYm9vbGVhblxuXHR8IG51bWJlclxuXHR8IHVuZGVmaW5lZFxuXHR8IG51bGxcblx0fCBvYmplY3Rcblx0fCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHR8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPlxuXHR8IEFycmF5PHN0cmluZz5cblx0fCBBcnJheTxGdW5jdGlvbj5cblx0fCBGdW5jdGlvblxuXHR8IENvbnRleHQ7XG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogWE1MUHJvY2Vzc29yVHlwZVZhbHVlW10pOiBzdHJpbmcgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0b3V0U3RyICs9IFwie3RoaXM+dW5kZWZpbmVkVmFsdWV9XCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGlmIChpc0NvbnRleHQodmFsdWUpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlT2JqZWN0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIjxcIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRvdXRTdHIgPSBvdXRTdHIudHJpbSgpO1xuXHRpZiAocHJvY2Vzc05leHRYbWxJblRyYWNlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDb25kaXRpb25hbGx5VG9YTUwgPSBmdW5jdGlvbiAoY29uZGl0aW9uOiBib29sZWFuLCBwYXJ0VG9BZGQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmIChjb25kaXRpb24pIHtcblx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhdHRyaWJ1dGUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIElmIGl0J3MgdW5kZWZpbmVkIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGFkZGVkLlxuICogQHBhcmFtIGF0dHJpYnV0ZU5hbWVcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMgVGhlIGF0dHJpYnV0ZSB0byBhZGQgaWYgdGhlIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEF0dHJpYnV0ZVRvWE1MID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgdmFsdWU/OiBYTUxQcm9jZXNzb3JUeXBlVmFsdWUpOiAoKSA9PiBzdHJpbmcge1xuXHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhaXNVbmRlZmluZWRFeHByZXNzaW9uKHZhbHVlKSkge1xuXHRcdHJldHVybiAoKSA9PiB4bWxgJHthdHRyaWJ1dGVOYW1lfT1cIiR7dmFsdWV9XCJgO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAoKSA9PiBcIlwi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
995
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJfZXhwb3J0cyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsInRyYW5zZm9ybU1ldGFkYXRhIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwiY2xhc3MiLCJ0eXBlIiwiaXNQdWJsaWMiLCJhZ2dyZWdhdGlvbnMiLCJkZXBlbmRlbnRzIiwic2xvdCIsImN1c3RvbURhdGEiLCJsYXlvdXREYXRhIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlUeXBlIiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJvU2V0dGluZ3MiLCJzQXR0cmlidXRlVmFsdWUiLCJzTWV0YVBhdGgiLCJzQ29udGV4dFBhdGgiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0Iiwic0F0dHJpYnV0ZU5hbWUiLCJyZXR1cm5Db250ZXh0IiwibW9kZWxzIiwiY29udmVydGVyQ29udGV4dCIsImdldFByb3BlcnR5IiwiZGF0YSIsInVuc3RvcmVPYmplY3RWYWx1ZSIsInNldFByb3BlcnR5IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsIm9WaXNpdG9yIiwiYkRvTm90UmVzb2x2ZSIsImlzT3BlbiIsIm9NZXRhZGF0YUNvbnRleHQiLCJnZXRBdHRyaWJ1dGUiLCJCaW5kaW5nSW5mbyIsInBhcnNlIiwibWV0YUNvbnRleHRQYXRoIiwiY29udGV4dCIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImlzQSIsImUiLCJwcm9jZXNzUHJvcGVydGllcyIsImRlZmluaXRpb25Qcm9wZXJ0aWVzIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInByb3BlcnR5VmFsdWVzIiwic0tleVZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiZGVlcENsb25lIiwiZXJyb3IiLCJ2aXNpdEF0dHJpYnV0ZSIsImF0dHJpYnV0ZXMiLCJnZXROYW1lZEl0ZW0iLCJ2YWx1ZSIsIk51bWJlciIsInByb2Nlc3NDb250ZXh0cyIsImNvbnRleHRQYXRoIiwibU1pc3NpbmdDb250ZXh0Iiwib0RlZmluaXRpb25Db250ZXh0cyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwiY29udGV4dFBhdGhJbmRleCIsImluZGV4T2YiLCJjb250ZXh0UGF0aERlZmluaXRpb24iLCJzcGxpY2UiLCJwcm9wZXJ0eVZhbHVlIiwibGVuZ3RoIiwibmFtZSIsImFkZFNpbmdsZUNvbnRleHQiLCJwYXJzZUFnZ3JlZ2F0aW9uIiwib0FnZ3JlZ2F0aW9uIiwiZGVmaW5pdGlvbiIsIm9PdXRPYmplY3RzIiwiY2hpbGRyZW4iLCJmaXJzdEVsZW1lbnRDaGlsZCIsIm5hbWVzcGFjZVVSSSIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwidmlzaXROb2RlIiwiY2hpbGRJZHgiLCJjaGlsZERlZmluaXRpb24iLCJjaGlsZEtleSIsInNraXBLZXkiLCJtdWx0aXBsZSIsInVpZCIsInNldEF0dHJpYnV0ZSIsImFnZ3JlZ2F0aW9uT2JqZWN0Iiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImFuY2hvciIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJ0YWdOYW1lIiwibm9kZU5hbWUiLCJwcm9jZXNzT2JqZWN0IiwiZWxlbWVudCIsIm15QXJyYXkiLCJteU9iamVjdCIsImNoaWxkTm9kZU5hbWVzIiwibWFwIiwibG9jYWxOYW1lIiwiY2hpbGRJc0FycmF5IiwiU2V0Iiwic2l6ZSIsInB1c2giLCJwcm9jZXNzQ2hpbGRyZW4iLCJvQWdncmVnYXRpb25zIiwib0ZpcnN0RWxlbWVudENoaWxkIiwiaUNoaWxkSW5kZXgiLCJBcnJheSIsImZyb20iLCJuZXh0RWxlbWVudFNpYmxpbmciLCJzQ2hpbGROYW1lIiwic0FnZ3JlZ2F0aW9uTmFtZSIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwicGFyc2VkQWdncmVnYXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbktleSIsIm9OZXh0Q2hpbGQiLCJuZXh0Q2hpbGQiLCJoYXNWaXJ0dWFsTm9kZSIsImNoaWxkV3JhcHBlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJvTmV3Q2hpbGQiLCJjbG9uZU5vZGUiLCJhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzIiwibXlDaGlsZCIsInByb2Nlc3NTbG90cyIsIm9NZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsInByb2Nlc3NDdXN0b21EYXRhIiwiYXJndW1lbnRzIiwib0FnZ3JlZ2F0aW9uRWxlbWVudCIsIm9FbGVtZW50Q2hpbGQiLCJzU2xvdE5hbWUiLCJvVGFyZ2V0RWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50IiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJCdWlsZGluZ0Jsb2NrQ2xhc3MiLCJtZXRhZGF0YSIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWVzcGFjZSIsInhtbFRhZyIsImdldFNldHRpbmdzIiwiSlNPTk1vZGVsIiwiaW5pdGlhbEtleXMiLCJvQ29udHJvbENvbmZpZyIsInZpZXdEYXRhIiwicHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMiLCJwcm9wTmFtZSIsIm9EYXRhIiwib3JpZ2luYWxEZWZpbml0aW9uIiwidmFsaWRhdGUiLCJvSW5zdGFuY2UiLCJnZXRQcm9wZXJ0aWVzIiwic0NvbnRleHROYW1lIiwidGFyZ2V0T2JqZWN0IiwiaXNDb250ZXh0IiwiYXR0cmlidXRlVmFsdWUiLCJzdG9yZU9iamVjdFZhbHVlIiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwiY29yZVJlcXVpcmUiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwib1Byb21pc2UiLCJpbnNlcnRGcmFnbWVudCIsIm9sZEtleXMiLCJ0ZW1wb3JhcnlPYmplY3RTdG9yZSIsInRlbXBsYXRlU3RyaW5nIiwianN4IiwicmVuZGVyQXNYTUwiLCJnZXRUZW1wbGF0ZSIsImlzUnVudGltZSIsInN0b3JlS2V5IiwiaGFzRXJyb3IiLCJoYXNQYXJzZUVycm9yIiwicGFyc2VkVGVtcGxhdGUiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJOb2RlRmlsdGVyIiwiU0hPV19URVhUIiwidGV4dG5vZGUiLCJuZXh0Tm9kZSIsInRleHRDb250ZW50IiwidHJpbSIsInByb2Nlc3NYbWxJblRyYWNlIiwiaW5pdGlhbFRlbXBsYXRlIiwib0Vycm9yVGV4dCIsImNyZWF0ZUVycm9yWE1MIiwidGVtcGxhdGUiLCJvdXRlckhUTUwiLCJqb2luIiwidmlzaXRlZE5vZGVzIiwiaW50ZXJuYWxOb2RlIiwiUHJvbWlzZSIsImFsbCIsInJlbW92ZSIsInJlc29sdmUiLCJvTWFjcm9FbGVtZW50Iiwib1JlbWFpbmluZ1Nsb3RzIiwicXVlcnlTZWxlY3RvckFsbCIsIm9TbG90RWxlbWVudCIsInJlcXVpcmVPbk1hY3JvIiwiZ2V0QXR0cmlidXRlTlMiLCJzdWJzdHJpbmciLCJzZXRBdHRyaWJ1dGVOUyIsImNsYXNzTGlzdCIsImFkZCIsInRyYWNlRGV0YWlscyIsImluaXRpYWxQcm9wZXJ0aWVzIiwicmVzb2x2ZWRQcm9wZXJ0aWVzIiwibWlzc2luZ0NvbnRleHRzIiwib0Vycm9yIiwic3RhY2siLCJvVGVtcGxhdGUiLCJvQ3R4IiwibVNldHRpbmciLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiZXJyb3JNZXNzYWdlcyIsInhtbEZyYWdtZW50IiwiYWRkaXRpb25hbERhdGEiLCJlcnJvckxhYmVscyIsImVycm9yTWVzc2FnZSIsInhtbCIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwiZXJyb3JTdGFjayIsInN0YWNrRm9ybWF0dGVkIiwiYnRvYSIsImFkZGl0aW9uYWxUZXh0IiwianNvblZhbHVlIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2VBbGwiLCJwcm9wZXJ0eVVJRCIsInByb2Nlc3NOZXh0WG1sSW5UcmFjZSIsIm1ldGhvZCIsInJldHVyblZhbHVlIiwieG1sU3RyaW5nIiwiYWRkRGVmYXVsdE5hbWVzcGFjZXMiLCJ4bWxEb2N1bWVudCIsInBhcnNlRnJvbVN0cmluZyIsIm91dHB1dCIsInBhcmVudEVsZW1lbnQiLCJyZW5kZXJJblRyYWNlTW9kZSIsIm91dFN0ciIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Iiwic3RyaW5ncyIsImkiLCJfbGVuIiwidmFsdWVzIiwiX2tleSIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCIsImFkZENvbmRpdGlvbmFsbHlUb1hNTCIsImNvbmRpdGlvbiIsInBhcnRUb0FkZCIsImFkZEF0dHJpYnV0ZVRvWE1MIiwiaXNVbmRlZmluZWRFeHByZXNzaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzVW5kZWZpbmVkRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IGpzeCBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgRGVmaW5pdGlvbkNvbnRleHQsIERlZmluaXRpb25QYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2RlZmluaXRpb24vRkVEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBpc0NvbnRleHQsIGlzRnVuY3Rpb25BcnJheSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBCaW5kaW5nSW5mbyBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ0luZm9cIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1hY3JvSW5mbyB9IGZyb20gXCIuLi9UcmFjZUluZm9cIjtcbmltcG9ydCBUcmFjZUluZm8gZnJvbSBcIi4uL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLnRlbXBsYXRpbmcuQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yXCI7XG5jb25zdCBYTUxURU1QTEFUSU5HX05TID0gXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0gQnVpbGRpbmdCbG9ja01ldGFkYXRhICYge1xuXHRtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj47XG59O1xuXG4vKipcbiAqIERlZmluaXRpb24gb2YgYSBtZXRhIGRhdGEgY29udGV4dFxuICovXG50eXBlIE1ldGFEYXRhQ29udGV4dCA9IHtcblx0bmFtZT86IHN0cmluZztcblx0bW9kZWw6IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0Y3VycmVudENvbnRleHRQYXRoOiBDb250ZXh0O1xuXHRpc1B1YmxpYzogYm9vbGVhbjtcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsPiAmIHtcblx0XHRjb252ZXJ0ZXJDb250ZXh0OiBKU09OTW9kZWw7XG5cdFx0dmlld0RhdGE6IEpTT05Nb2RlbDtcblx0XHRpbnRlcm5hbDogSlNPTk1vZGVsO1xuXHRcdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XCJzYXAuZmUuaTE4blwiPzogUmVzb3VyY2VNb2RlbDtcblx0fTtcblx0Z2V0RGVmaW5pdGlvbkNvbnRleHQoKTogRGVmaW5pdGlvbkNvbnRleHQ7XG5cdGdldERlZmluaXRpb25Gb3JQYWdlKCk6IERlZmluaXRpb25QYWdlO1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmICghb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRraW5kKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRUeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJlxuXHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc1xuXHRcdCkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRUeXBlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXN9JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShcblx0c05hbWU6IHN0cmluZyxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b05vZGU6IEVsZW1lbnRcbik6IHZvaWQge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9Ob2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1thdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdH1cblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKCFzS2V5LmluY2x1ZGVzKFwiOlwiKSAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgbWV0YWRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEpOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge1xuXHRcdGNsYXNzOiB7XG5cdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9XG5cdH07XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4gPSB7XG5cdFx0ZGVwZW5kZW50czoge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiZGVwZW5kZW50c1wiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdGN1c3RvbURhdGE6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImN1c3RvbURhdGFcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHRsYXlvdXREYXRhOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJsYXlvdXREYXRhXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1xuXHR9O1xuXHRjb25zdCBtZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykpIHtcblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGU7XG5cblx0XHRpZiAocHJvcGVydHlUeXBlICE9PSBTQVBfVUlfTU9ERUxfQ09OVEVYVCkge1xuXHRcdFx0cHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cblx0XHRpZiAoW1NBUF9VSV9NT0RFTF9DT05URVhULCBcIm9iamVjdFwiLCBcImFycmF5XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSkpIHtcblx0XHRcdC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBjb250ZXh0cywgb2JqZWN0cywgYW5kIGFycmF5cyBtYXkgY29tZSBmcm9tIHRoZSBtZXRhZGF0YUNvbnRleHRcblx0XHRcdG1ldGFkYXRhQ29udGV4dHNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gYXMgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdFx0cHJvcGVydGllcyxcblx0XHRtZXRhZGF0YUNvbnRleHRzLFxuXHRcdGFnZ3JlZ2F0aW9uc1xuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWJzb2x1dGUgb3IgY29udGV4dCBwYXRocyBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBNZXRhQ29udGV4dC5cbiAqIEBwYXJhbSBvU2V0dGluZ3MgQWRkaXRpb25hbCBzZXR0aW5nc1xuICogQHBhcmFtIHNBdHRyaWJ1dGVWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgbWV0YSBkYXRhIGNvbnRleHQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIF9jaGVja0Fic29sdXRlQW5kQ29udGV4dFBhdGhzKG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncywgc0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcpOiBNZXRhRGF0YUNvbnRleHQge1xuXHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0cGF0aDogc01ldGFQYXRoXG5cdH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaGVscHMgdG8gY3JlYXRlIHRoZSBtZXRhZGF0YSBjb250ZXh0IGluIGNhc2UgaXQgaXMgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlIHN0b3JlLlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pOiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGxldCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ0luZm8ucGFyc2Uoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCAmJiBzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9NZXRhZGF0YUNvbnRleHQubW9kZWwgJiYgb01ldGFkYXRhQ29udGV4dC5wYXRoKSB7XG5cdFx0XHQvLyBpZiB0aGUgbWV0YVBhdGggaXMgZmlsbGVkIHRocm91Z2ggYSBKU09OIG1vZGVsLCB3ZSBjYW4ndCB1c2UgdGhpcyBjb250ZXh0IGFzIHRoZSBtZXRhZGF0YUNvbnRleHQsXG5cdFx0XHQvLyBidXQgaW5zdGVhZCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCB0aGUgYWN0dWFsIHZhbHVlXG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dFBhdGggPSBgJHtvTWV0YWRhdGFDb250ZXh0Lm1vZGVsfT4ke29NZXRhZGF0YUNvbnRleHQucGF0aH1gO1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IG9WaXNpdG9yLmdldENvbnRleHQobWV0YUNvbnRleHRQYXRoKTtcblx0XHRcdGlmIChjb250ZXh0Py5nZXRNb2RlbCgpPy5pc0EoXCJzYXAudWkubW9kZWwuanNvbi5KU09OTW9kZWxcIikpIHtcblx0XHRcdFx0c0F0dHJpYnV0ZVZhbHVlID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIHRvIHBhcnNlXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIHByb3BlcnRpZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+PiB7XG5cdGNvbnN0IGRlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID1cblx0XHRcdFx0ZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgJiYgZGVlcENsb25lKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSAmJiBpc1B1YmxpYyAmJiBkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljICE9PSB0cnVlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogdmFsdWU7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VmFsdWVzO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBpbmNvbWluZyBYTUwgbm9kZSBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIGJpbmRpbmcgY29udGV4dHMgZGVmaW5lZCBpbnNpZGUuXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgYW5kIG1pc3NpbmcgY29udGV4dHNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdC8vIElmIHRoZSBjb250ZXh0IHdhcyByZXNvbHZlZCBhcyBhIHByb3BlcnR5IChiaW5kaW5nIC8geG1sIGFnZ3JlZ2F0aW9uKSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCBoZXJlLlxuXHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuXHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuID8/IGZhbHNlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAobUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGJpbmRpbmcgY291bGRuJ3QgYmUgcmVzb2x2ZWQgY29uc2lkZXIgdGhhdCB0aGVyZSB3YXMgbm8gdmFsdWUgaGVyZVxuXHRcdFx0XHRkZWxldGUgb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1NaXNzaW5nQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5hc3luYyBmdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0FnZ3JlZ2F0aW9uPzogRWxlbWVudCxcblx0ZGVmaW5pdGlvbj86IEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb25cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPj4ge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgZmlyc3RFbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb24uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0aWYgKGZpcnN0RWxlbWVudENoaWxkPy5uYW1lc3BhY2VVUkkgPT09IFhNTFRFTVBMQVRJTkdfTlMpIHtcblx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRjb25zdCBvUGFyZW50ID0gZmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShmaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHxcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpIHx8XG5cdFx0XHRcdChkZWZpbml0aW9uPy5za2lwS2V5ICYmIGRlZmluaXRpb24ubXVsdGlwbGUgPT09IGZhbHNlICYmIHVpZCgpKTtcblx0XHRcdGlmIChjaGlsZEtleSkge1xuXHRcdFx0XHRjaGlsZEtleSA9IGBJbmxpbmVYTUxfJHtjaGlsZEtleX1gO1xuXHRcdFx0XHRjaGlsZERlZmluaXRpb24uc2V0QXR0cmlidXRlKFwia2V5XCIsIGNoaWxkS2V5KTtcblx0XHRcdFx0bGV0IGFnZ3JlZ2F0aW9uT2JqZWN0OiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb24gPSB7XG5cdFx0XHRcdFx0a2V5OiBjaGlsZEtleSxcblx0XHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdFx0cGxhY2VtZW50OiAoY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcInBsYWNlbWVudFwiKSBhcyBQbGFjZW1lbnQpIHx8IFBsYWNlbWVudC5BZnRlcixcblx0XHRcdFx0XHRcdGFuY2hvcjogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImFuY2hvclwiKSB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHR5cGU6IFwiU2xvdFwiXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChkZWZpbml0aW9uPy5wcm9jZXNzQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25PYmplY3QgPSBkZWZpbml0aW9uLnByb2Nlc3NBZ2dyZWdhdGlvbnMoY2hpbGREZWZpbml0aW9uLCBhZ2dyZWdhdGlvbk9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b091dE9iamVjdHNbYWdncmVnYXRpb25PYmplY3Qua2V5XSA9IGFnZ3JlZ2F0aW9uT2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChjaGlsZERlZmluaXRpb24udGFnTmFtZSAhPT0gXCJzbG90XCIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBUaGUgYWdncmVnYXRpb24gJHtjaGlsZERlZmluaXRpb24ubm9kZU5hbWV9IGlzIG1pc3NpbmcgYSBLZXkgYXR0cmlidXRlLiBJdCBpcyBub3QgZGlzcGxheWVkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBwcm9wZXJ0aWVzIHdoZW4gdGhlIHR5cGUgaXMgYW4gb2JqZWN0LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIFhNTCBlbGVtZW50IHRvIHBhcnNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIG9iamVjdFxuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0KGVsZW1lbnQ6IEVsZW1lbnQpOiBvYmplY3Qge1xuXHRjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG5cdGNvbnN0IG15QXJyYXk6IEFycmF5PHVua25vd24+ID0gW107XG5cdGNvbnN0IG15T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG5cdFx0bXlPYmplY3RbYXR0cmlidXRlTmFtZV0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0fVxuXHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkTm9kZU5hbWVzID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcCgoa2V5KSA9PiBjaGlsZHJlbltrZXkgYXMgdW5rbm93biBhcyBudW1iZXJdLmxvY2FsTmFtZSk7XG5cdFx0Y29uc3QgY2hpbGRJc0FycmF5ID0gY2hpbGROb2RlTmFtZXMubGVuZ3RoICE9PSBuZXcgU2V0KGNoaWxkTm9kZU5hbWVzKS5zaXplO1xuXHRcdGZvciAoY29uc3QgY2hpbGREZWZpbml0aW9uIG9mIGNoaWxkcmVuIGFzIHVua25vd24gYXMgQXJyYXk8RWxlbWVudD4pIHtcblx0XHRcdGlmIChjaGlsZElzQXJyYXkpIHtcblx0XHRcdFx0bXlBcnJheS5wdXNoKHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRteU9iamVjdFtjaGlsZERlZmluaXRpb24ubG9jYWxOYW1lXSA9IHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoaWxkSXNBcnJheSkge1xuXHRcdFx0cmV0dXJuIG15QXJyYXk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBteU9iamVjdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgZm9yIHdoaWNoIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuXG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgVGhlIHZhbHVlcyBvZiBhbHJlYWR5IHBhcnNlZCBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBjaGlsZHJlblxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgRWxlbWVudD4+IHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblxuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQubmFtZXNwYWNlVVJJID09PSBYTUxURU1QTEFUSU5HX05TKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRcdGNvbnN0IG9QYXJlbnQgPSBvRmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdFx0aWYgKG9QYXJlbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdID8gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gOiBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE5vdCBzdXJlIGhvdyB0aGlzIGNvdWxkIGhhcHBlbiBidXQgSSBhbHNvIGRvbid0IHdhbnQgdG8gY3JlYXRlIGluZmluaXRlIGxvb3BzXG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBhd2FpdCBwYXJzZUFnZ3JlZ2F0aW9uKG9WaXNpdG9yLCBvRmlyc3RFbGVtZW50Q2hpbGQsIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBwYXJzZWRBZ2dyZWdhdGlvbjtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uS2V5IGluIHBhcnNlZEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWV0YWRhdGEuYWdncmVnYXRpb25zW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XSA9IHBhcnNlZEFnZ3JlZ2F0aW9uW3BhcnNlZEFnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljID09PSB0cnVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QgJiYgb0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0bGV0IGNoaWxkRGVmaW5pdGlvbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR3aGlsZSAoY2hpbGREZWZpbml0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Q2hpbGQgPSBjaGlsZERlZmluaXRpb24ubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uaGFzVmlydHVhbE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSEpO1xuXHRcdFx0XHRcdFx0XHRjaGlsZFdyYXBwZXIuYXBwZW5kQ2hpbGQoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZFdyYXBwZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkRGVmaW5pdGlvbjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbiA9IG5leHRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gc0NoaWxkTmFtZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb05ld0NoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmNsb25lTm9kZSh0cnVlKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5jbHVkZXMoc0FnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcyA9IHByb2Nlc3NPYmplY3Qob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXM7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW47XG5cdFx0XHRcdFx0XHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPltdID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdFx0XHRcdFx0Ly8gbm9uIGtleWVkIGNoaWxkLCBqdXN0IGFkZCBpdCB0byB0aGUgYWdncmVnYXRpb25cblx0XHRcdFx0XHRcdFx0Y29uc3QgbXlDaGlsZDogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiA9IHt9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRteUNoaWxkW2F0dHJpYnV0ZU5hbWVdID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvT3V0T2JqZWN0cy5wdXNoKG15Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvT3V0T2JqZWN0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTbG90cyhcblx0b0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4sXG5cdG9NZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj4sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRwcm9jZXNzQ3VzdG9tRGF0YSA9IGZhbHNlXG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0aWYgKG9Ob2RlICE9PSBudWxsICYmIG9Ob2RlICE9PSB1bmRlZmluZWQgJiYgb0FnZ3JlZ2F0aW9uRWxlbWVudCkge1xuXHRcdFx0XHQvLyBzbG90cyBjYW4gaGF2ZSA6OiBhcyBrZXlzIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGFnZ3JlZ2F0aW9uIG5hbWUgdGhlcmVmb3JlIHJlcGxhY2luZyB0aGVtXG5cdFx0XHRcdGNvbnN0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRpZiAoIVtcImRlcGVuZGVudHNcIiwgXCJjdXN0b21EYXRhXCIsIFwibGF5b3V0RGF0YVwiXS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvY2Vzc0N1c3RvbURhdGEgJiYgb0VsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQgJiYgb01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApO1xuXHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGUsIHNBZ2dyZWdhdGlvbk5hbWUsIG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyB1bmtub3duIGFzIE5vZGVbXSkpOyAvLyBTb21laG93IFRTIGRvZXNuJ3QgbGlrZSB0aGlzIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGlzIHNob3VsZCB3b3JrXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZTogRWxlbWVudCwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nLCBvRWxlbWVudENoaWxkOiBFbGVtZW50IHwgbnVsbCk6IEVsZW1lbnQge1xuXHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lLnJlcGxhY2UoLzovZ2ksIFwiX1wiKSk7XG5cdHdoaWxlIChvRWxlbWVudENoaWxkKSB7XG5cdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRvRWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb05ld0NoaWxkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0QnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgPz8gYCR7b01ldGFkYXRhLm5hbWVzcGFjZSA/PyBvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlfS4ke29NZXRhZGF0YS54bWxUYWcgPz8gb01ldGFkYXRhLm5hbWV9YDtcblxuXHRjb25zdCBtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cblx0Ly8gQWRkIGFuIGVtcHR5IGNvbnZlcnRlciBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgaW4gb3JkZXIgdG8gaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIG9iamVjdCB2YWx1ZXNcblx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0ID8/PSBuZXcgSlNPTk1vZGVsKCk7XG5cblx0Ly9JbmplY3Qgc3RvcmFnZSBmb3IgbWFjcm9zXG5cdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0b1NldHRpbmdzW3NGcmFnbWVudE5hbWVdID0ge307XG5cdH1cblxuXHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlcyB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgbWV0YWRhdGEgY29udGV4dHNcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhvTWV0YWRhdGEsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0ID0gcHJvY2Vzc0NvbnRleHRzKG9NZXRhZGF0YSwgb1NldHRpbmdzLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yLCBtQ29udGV4dHMsIHByb3BlcnR5VmFsdWVzKTtcblxuXHR0cnkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGFuZCBjb21wbGV4IHR5cGUgc3VwcG9ydFxuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnMgPSBhd2FpdCBwcm9jZXNzQ2hpbGRyZW4ob05vZGUsIG9WaXNpdG9yLCBvTWV0YWRhdGEsIGlzUHVibGljLCBwcm9wZXJ0eVZhbHVlcyk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXG5cdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRsZXQgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuXHRcdFx0Ly9jaGVjayBmb3IgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIC8gb3ZlcndyaXRlIHBhcmFtZXRlcnNcblx0XHRcdGNvbnN0IG9yaWdpbmFsRGVmaW5pdGlvbiA9IEJ1aWxkaW5nQmxvY2tDbGFzcz8ubWV0YWRhdGE/LnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXHRcdFx0aWYgKG9yaWdpbmFsRGVmaW5pdGlvbj8udmFsaWRhdGUpIHtcblx0XHRcdFx0b0RhdGEgPSBvcmlnaW5hbERlZmluaXRpb24udmFsaWRhdGUob0RhdGEpIHx8IG9EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhPy5pc0E/LihTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiYgIW9EYXRhLmdldE1vZGVsKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSA9IG9EYXRhLmdldE9iamVjdCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb3BlcnR5VmFsdWVzLmlzUHVibGljID0gaXNQdWJsaWM7XG5cblx0XHRjb25zdCBvSW5zdGFuY2UgPSBuZXcgQnVpbGRpbmdCbG9ja0NsYXNzKHsgLi4ucHJvcGVydHlWYWx1ZXMsIC4uLm9BZ2dyZWdhdGlvbnMgfSwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLmhhc093blByb3BlcnR5KHNDb250ZXh0TmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0aWYgKGlzQ29udGV4dCh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlVmFsdWUgPSBzdG9yZU9iamVjdFZhbHVlKHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KGF0dHJpYnV0ZVZhbHVlLCB0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuY3JlYXRlQmluZGluZ0NvbnRleHQoYXR0cmlidXRlVmFsdWUpITtcblx0XHRcdFx0XHR1bnN0b3JlT2JqZWN0VmFsdWUoYXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gbmV3Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXHRcdC8vIGNvcmU6cmVxdWlyZSBuZWVkIHRvIGJlIGRlZmluZWQgb24gdGhlIG5vZGUgaXRzZWxmIHRvIGJlIHBpY2tlZCB1cCBkdWUgdG8gdGhlIHRlbXBsYXRpbmcgc3RlcFxuXHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGU/LmdldEF0dHJpYnV0ZShcImNvcmU6cmVxdWlyZVwiKSB8fCB1bmRlZmluZWQ7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKG1Db250ZXh0cywgb01ldGFkYXRhLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIW9NZXRhZGF0YS5pc09wZW4gOiB0cnVlKTtcblx0XHRjb25zdCBvUGFyZW50ID0gb05vZGUucGFyZW50Tm9kZTtcblxuXHRcdGxldCBpQ2hpbGRJbmRleDogbnVtYmVyO1xuXHRcdGxldCBvUHJvbWlzZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXG5cdFx0XHRpZiAob01ldGFkYXRhLmZyYWdtZW50KSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9sZEtleXMgPSBPYmplY3Qua2V5cyh0ZW1wb3JhcnlPYmplY3RTdG9yZSk7XG5cdFx0XHRcdGNvbnN0IHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSEob05vZGUpKTtcblxuXHRcdFx0XHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdC8vIEZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrcywgd2UgbmVlZCB0byBhdHRhY2ggYWxsIG9iamVjdHMgdG8gdGhlIGNvbnZlcnRlckNvbnRleHQgZGlyZWN0bHksIGFzIHRoZSBhY3R1YWwgcmVuZGVyaW5nIHRha2VzIHBsYWNlIGF0IHJ1bnRpbWVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN0b3JlS2V5IGluIHRlbXBvcmFyeU9iamVjdFN0b3JlKSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9sZEtleXMuaW5jbHVkZXMoc3RvcmVLZXkpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB1bnN0b3JlT2JqZWN0VmFsdWUoc3RvcmVLZXkpO1xuXHRcdFx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc3RvcmVLZXksIGRhdGEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBoYXNFcnJvciA9IFwiXCI7XG5cdFx0XHRcdGlmICh0ZW1wbGF0ZVN0cmluZykge1xuXHRcdFx0XHRcdGxldCBoYXNQYXJzZUVycm9yID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV0IHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcodGVtcGxhdGVTdHJpbmcsIHRydWUpO1xuXHRcdFx0XHRcdC8vIEZvciBzYWZldHkgcHVycG9zZSB3ZSB0cnkgdG8gZGV0ZWN0IHRyYWlsaW5nIHRleHQgaW4gYmV0d2VlbiBYTUwgVGFnc1xuXHRcdFx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXJzZWRUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihlbGVtZW50LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG5cdFx0XHRcdFx0XHRsZXQgdGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0XHRoYXNQYXJzZUVycm9yID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdoaWxlICh0ZXh0bm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGV4dG5vZGUudGV4dENvbnRlbnQgJiYgdGV4dG5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNFcnJvciA9IHRleHRub2RlLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChoYXNQYXJzZUVycm9yKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIHBhcnNlZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyB0aGUgWE1MIGl0IG1lYW5zIHRoZSBYTUwgaXRzZWxmIGlzIG1hbGZvcm1lZCwgYXMgc3VjaCB3ZSByZXJ1biB0aGUgdGVtcGxhdGUgcHJvY2Vzc1xuXHRcdFx0XHRcdFx0Ly8gU2V0dGluZyBpc1RyYWNlTW9kZSB0cnVlIHdpbGwgbWFrZSBpdCBzbyB0aGF0IGVhY2ggeG1sYCBleHByZXNzaW9uIGlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGZyb20gWE1MIHBlcnNwZWN0aXZlXG5cdFx0XHRcdFx0XHQvLyBJZiBhbiBlcnJvciBpcyBmb3VuZCBpdCdzIHJldHVybmVkIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBmcmFnbWVudFxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLCBoYXNFcnJvcik7XG5cdFx0XHRcdFx0XHRwYXJzZWRUZW1wbGF0ZSA9IChhd2FpdCBwcm9jZXNzWG1sSW5UcmFjZShhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PiBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKSk7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pKSBhcyBFbGVtZW50W107XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChoYXNFcnJvci5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyB0cmFpbGluZyB0ZXh0IHdlIGNyZWF0ZSBhIHN0YW5kYXJkIGVycm9yIGFuZCBkaXNwbGF5IGl0LlxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvclRleHQgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgdmlzaXRlZE5vZGVzID0gcGFyc2VkVGVtcGxhdGUubWFwKGFzeW5jIChpbnRlcm5hbE5vZGUpID0+IHtcblx0XHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBpbnRlcm5hbE5vZGUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKGludGVybmFsTm9kZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLmFsbCh2aXNpdGVkTm9kZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgdHJ1ZSk7XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29yZVJlcXVpcmUpIHtcblx0XHRcdFx0XHRsZXQgcmVxdWlyZU9uTWFjcm8gPSBvTWFjcm9FbGVtZW50LmdldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJyZXF1aXJlXCIpO1xuXHRcdFx0XHRcdGlmIChyZXF1aXJlT25NYWNybykge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSByZXF1aXJlT25NYWNyby5zdWJzdHJpbmcoMCwgcmVxdWlyZU9uTWFjcm8ubGVuZ3RoIC0gMSkgKyBcIixcIiArIGNvcmVSZXF1aXJlLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxhc3QgfSBhbmQgZmlyc3Qge1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXF1aXJlT25NYWNybyA9IGNvcmVSZXF1aXJlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJjb3JlOnJlcXVpcmVcIiwgcmVxdWlyZU9uTWFjcm8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlcy5jbGFzcyAmJiAhQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdG9NYWNyb0VsZW1lbnQuY2xhc3NMaXN0LmFkZChwcm9wZXJ0eVZhbHVlcy5jbGFzcyBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlOiB1bmtub3duKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pOiB2b2lkIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3M6IHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UpOiB2b2lkIHtcblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciwgdHJ1ZSksXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBVblJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiBzbyB0aGF0IGl0IGlzIG5vIGxvbmdlciB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk6IHZvaWQge1xuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHRudWxsLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCwgc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGVycm9yU3RhY2sgPSBcIlwiO1xuXHRpZiAoc3RhY2spIHtcblx0XHRjb25zdCBzdGFja0Zvcm1hdHRlZCA9IGJ0b2EoYDxwcmU+JHtzdGFja308L3ByZT5gKTtcblx0XHRlcnJvclN0YWNrID0geG1sYDxtOkZvcm1hdHRlZFRleHQgaHRtbFRleHQ9XCJ7PSBCQkYuYmFzZTY0RGVjb2RlKCcke3N0YWNrRm9ybWF0dGVkfScpIH1cIiAvPmA7XG5cdH1cblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0bGV0IGpzb25WYWx1ZSA9IFwiXCI7XG5cdFx0dHJ5IHtcblx0XHRcdGpzb25WYWx1ZSA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRqc29uVmFsdWUgPSBidG9hKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IFwiQ291bGQgbm90IHN0cmluZ2lmeSBhZGRpdGlvbmFsRGF0YSBkdWUgdG8gY2lyY3VsYXIgc3RydWN0dXJlLlwiIH0sIG51bGwsIDQpKTtcblx0XHR9XG5cblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtqc29uVmFsdWV9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8Y29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyIHhtbG5zOmNvbnRyb2xzPVwic2FwLmZlLmNvcmUuY29udHJvbHNcIj5cblx0XHRcdFx0XHQ8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHN0b3JlXG4gKiBAcmV0dXJucyBJRCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZU9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0Y29uc3QgcHJvcGVydHlVSUQgPSBgL3VpZC0tJHt1aWQoKX1gO1xuXHR0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZTtcblx0cmV0dXJuIHByb3BlcnR5VUlEO1xufVxuXG4vKipcbiAqIFVuc3RvcmVzIGFuIG9iamVjdCBmcm9tIGEgdGVtcG9yYXJ5IHN0b3JlIGJ5IHJlbW92aW5nIGl0IGFuZCByZXR1cm5pbmcgaXRzIG9iamVjdCB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eVVJRCBJRCB0byByZXRyaWV2ZSB0aGlzIHZhbHVlXG4gKiBAcmV0dXJucyBPYmplY3QgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdW5zdG9yZU9iamVjdFZhbHVlKHByb3BlcnR5VUlEOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3QgdmFsdWUgPSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdGRlbGV0ZSB0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF07XG5cdHJldHVybiB2YWx1ZTtcbn1cblxubGV0IHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgYWxsIHhtbGAgY2FsbHMgaW5zaWRlIHRoZSBnaXZlbiBtZXRob2QgYXJlIHByb2Nlc3NlZCBpbiB0cmFjZSBtb2RlLlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIG1ldGhvZFxuICovXG5jb25zdCBwcm9jZXNzWG1sSW5UcmFjZSA9IGFzeW5jIGZ1bmN0aW9uIChtZXRob2Q6ICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcblx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gdHJ1ZTtcblx0bGV0IHJldHVyblZhbHVlO1xuXHR0cnkge1xuXHRcdHJldHVyblZhbHVlID0gbWV0aG9kKCk7XG5cdH0gZmluYWxseSB7XG5cdFx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKiBAcGFyYW0geG1sU3RyaW5nIFRoZSB4bWwgc3RyaW5nXG4gKiBAcGFyYW0gW2FkZERlZmF1bHROYW1lc3BhY2VzXSBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IG5hbWVzcGFjZXMgc2hvdWxkIGJlIGFkZGVkXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50W10ge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRjb25zdCBjaGlsZHJlbiA9IG91dHB1dD8ucGFyZW50RWxlbWVudCA/IG91dHB1dD8ucGFyZW50RWxlbWVudC5jaGlsZHJlbiA6IFtvdXRwdXQgYXMgRWxlbWVudF07XG5cdHJldHVybiBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0Py5sZW5ndGggPiAwICYmIHhtbFJlc3VsdFswXT8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuXHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb3V0U3RyO1xuXHR9XG59XG5cbmV4cG9ydCB0eXBlIFhNTFByb2Nlc3NvclR5cGVWYWx1ZSA9XG5cdHwgc3RyaW5nXG5cdHwgYm9vbGVhblxuXHR8IG51bWJlclxuXHR8IHVuZGVmaW5lZFxuXHR8IG51bGxcblx0fCBvYmplY3Rcblx0fCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHR8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPlxuXHR8IEFycmF5PHN0cmluZz5cblx0fCBBcnJheTxGdW5jdGlvbj5cblx0fCBGdW5jdGlvblxuXHR8IENvbnRleHQ7XG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogWE1MUHJvY2Vzc29yVHlwZVZhbHVlW10pOiBzdHJpbmcgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0b3V0U3RyICs9IFwie3RoaXM+dW5kZWZpbmVkVmFsdWV9XCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGlmIChpc0NvbnRleHQodmFsdWUpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlT2JqZWN0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIjxcIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRvdXRTdHIgPSBvdXRTdHIudHJpbSgpO1xuXHRpZiAocHJvY2Vzc05leHRYbWxJblRyYWNlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDb25kaXRpb25hbGx5VG9YTUwgPSBmdW5jdGlvbiAoY29uZGl0aW9uOiBib29sZWFuLCBwYXJ0VG9BZGQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmIChjb25kaXRpb24pIHtcblx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhdHRyaWJ1dGUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIElmIGl0J3MgdW5kZWZpbmVkIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGFkZGVkLlxuICogQHBhcmFtIGF0dHJpYnV0ZU5hbWVcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMgVGhlIGF0dHJpYnV0ZSB0byBhZGQgaWYgdGhlIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEF0dHJpYnV0ZVRvWE1MID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgdmFsdWU/OiBYTUxQcm9jZXNzb3JUeXBlVmFsdWUpOiAoKSA9PiBzdHJpbmcge1xuXHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhaXNVbmRlZmluZWRFeHByZXNzaW9uKHZhbHVlKSkge1xuXHRcdHJldHVybiAoKSA9PiB4bWxgJHthdHRyaWJ1dGVOYW1lfT1cIiR7dmFsdWV9XCJgO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAoKSA9PiBcIlwiO1xuXHR9XG59O1xuIl0sIm1hcHBpbmdz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