@sapui5/sap.fe.core 1.135.0 → 1.136.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 (217) 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 +3 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -1
  5. package/src/sap/fe/core/AppComponent.js +6 -4
  6. package/src/sap/fe/core/AppComponent.ts +3 -1
  7. package/src/sap/fe/core/AppStateHandler.js +8 -6
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/CommonUtils.js +4 -1
  10. package/src/sap/fe/core/CommonUtils.ts +12 -2
  11. package/src/sap/fe/core/ExtensionAPI.js +5 -3
  12. package/src/sap/fe/core/ExtensionAPI.ts +4 -2
  13. package/src/sap/fe/core/PageController.js +13 -1
  14. package/src/sap/fe/core/PageController.ts +13 -0
  15. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
  16. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
  17. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
  18. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  19. package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
  20. package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
  21. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
  22. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  27. package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
  29. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
  34. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
  35. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
  36. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
  37. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
  47. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
  49. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
  50. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  51. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
  52. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
  53. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  54. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  55. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  56. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  57. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  58. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  59. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  60. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
  61. package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
  62. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  63. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
  64. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
  65. package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
  66. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
  67. package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
  68. package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
  69. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
  70. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
  71. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
  72. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
  73. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
  74. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
  75. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  76. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  77. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
  78. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  79. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
  80. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
  81. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  83. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
  84. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
  85. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  86. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  87. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  88. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  89. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  90. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  91. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  92. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  93. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  94. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  95. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  96. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  97. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  98. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  99. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  100. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  101. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  102. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  103. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  104. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  105. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  106. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  107. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  108. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  109. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  110. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  111. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  112. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  113. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  114. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  115. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  116. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  117. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  118. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  119. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  120. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  121. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  122. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  123. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  124. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  125. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  126. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  127. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  128. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  129. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  130. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  131. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  132. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  133. package/src/sap/fe/core/fpm/manifest.json +1 -1
  134. package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
  135. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  136. package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
  137. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  138. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
  139. package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
  140. package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
  141. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  142. package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
  143. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  144. package/src/sap/fe/core/helpers/WebSocket.js +10 -1
  145. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  146. package/src/sap/fe/core/library.js +1 -1
  147. package/src/sap/fe/core/messagebundle.properties +41 -2
  148. package/src/sap/fe/core/messagebundle_ar.properties +23 -2
  149. package/src/sap/fe/core/messagebundle_bg.properties +23 -2
  150. package/src/sap/fe/core/messagebundle_ca.properties +21 -0
  151. package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
  152. package/src/sap/fe/core/messagebundle_cs.properties +21 -0
  153. package/src/sap/fe/core/messagebundle_cy.properties +21 -0
  154. package/src/sap/fe/core/messagebundle_da.properties +23 -2
  155. package/src/sap/fe/core/messagebundle_de.properties +23 -2
  156. package/src/sap/fe/core/messagebundle_el.properties +21 -0
  157. package/src/sap/fe/core/messagebundle_en.properties +23 -2
  158. package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
  159. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
  160. package/src/sap/fe/core/messagebundle_es.properties +21 -0
  161. package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
  162. package/src/sap/fe/core/messagebundle_et.properties +21 -0
  163. package/src/sap/fe/core/messagebundle_fi.properties +21 -0
  164. package/src/sap/fe/core/messagebundle_fr.properties +22 -1
  165. package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
  166. package/src/sap/fe/core/messagebundle_hi.properties +22 -1
  167. package/src/sap/fe/core/messagebundle_hr.properties +24 -3
  168. package/src/sap/fe/core/messagebundle_hu.properties +21 -0
  169. package/src/sap/fe/core/messagebundle_id.properties +21 -0
  170. package/src/sap/fe/core/messagebundle_it.properties +23 -2
  171. package/src/sap/fe/core/messagebundle_iw.properties +21 -0
  172. package/src/sap/fe/core/messagebundle_ja.properties +21 -0
  173. package/src/sap/fe/core/messagebundle_kk.properties +21 -0
  174. package/src/sap/fe/core/messagebundle_ko.properties +21 -0
  175. package/src/sap/fe/core/messagebundle_lt.properties +21 -0
  176. package/src/sap/fe/core/messagebundle_lv.properties +23 -2
  177. package/src/sap/fe/core/messagebundle_mk.properties +21 -0
  178. package/src/sap/fe/core/messagebundle_ms.properties +22 -1
  179. package/src/sap/fe/core/messagebundle_nl.properties +21 -0
  180. package/src/sap/fe/core/messagebundle_no.properties +21 -0
  181. package/src/sap/fe/core/messagebundle_pl.properties +23 -2
  182. package/src/sap/fe/core/messagebundle_pt.properties +23 -2
  183. package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
  184. package/src/sap/fe/core/messagebundle_ro.properties +23 -2
  185. package/src/sap/fe/core/messagebundle_ru.properties +22 -1
  186. package/src/sap/fe/core/messagebundle_sh.properties +23 -2
  187. package/src/sap/fe/core/messagebundle_sk.properties +21 -0
  188. package/src/sap/fe/core/messagebundle_sl.properties +23 -2
  189. package/src/sap/fe/core/messagebundle_sr.properties +23 -2
  190. package/src/sap/fe/core/messagebundle_sv.properties +21 -0
  191. package/src/sap/fe/core/messagebundle_th.properties +21 -0
  192. package/src/sap/fe/core/messagebundle_tr.properties +21 -0
  193. package/src/sap/fe/core/messagebundle_uk.properties +23 -2
  194. package/src/sap/fe/core/messagebundle_vi.properties +23 -2
  195. package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
  196. package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
  197. package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
  198. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
  199. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  200. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  201. package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
  202. package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
  203. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
  204. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  205. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
  206. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  207. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
  208. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
  209. package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
  210. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  211. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
  212. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  213. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  214. package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
  215. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  216. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
  217. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
@@ -64,6 +64,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
64
64
  const bIsDraftNode = ModelHelper.isDraftNode(currentEntitySet);
65
65
  return bIsDraftRoot || bIsDraftNode;
66
66
  },
67
+ /**
68
+ * Returns whether or not we have a ShareAction in any EntitySet of the application.
69
+ * @param converterContext The instance of the converter context
70
+ * @returns True if the annotation exists. False otherwise.
71
+ */
72
+ isCollaborationDraftSupportedFromConverterContext(converterContext) {
73
+ return converterContext.getConvertedTypes().entitySets.some(entitySet => {
74
+ return entitySet.annotations?.Common?.DraftRoot?.ShareAction !== undefined;
75
+ });
76
+ },
67
77
  /**
68
78
  * Method to determine if the service, supports collaboration draft.
69
79
  * @param metaObject MetaObject to be used for determination
@@ -273,8 +283,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
273
283
  isFilteringCaseSensitive: function (oMetaModel, filterFunctions) {
274
284
  const _filterFunctions = filterFunctions ?? oMetaModel?.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
275
285
  if (!_filterFunctions) {
276
- // if no filters function defined in service, tolower is supported
277
- return false;
286
+ // if no filters function defined in service, we assume that the service is case sensitive
287
+ return true;
278
288
  }
279
289
  return _filterFunctions.indexOf("tolower") === -1;
280
290
  },
@@ -505,7 +515,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
505
515
  const isContext = context?.isA?.("sap.ui.model.odata.v4.Context");
506
516
  if (typeof context === "object" && !isContext) {
507
517
  dataSet[contextPath] = clearAnnotationType(annotationTypes, dataSet[contextPath]);
508
- if (Object.keys(dataSet[contextPath]).length === 0) {
518
+ if (dataSet[contextPath] && Object.keys(dataSet[contextPath]).length === 0) {
509
519
  delete dataSet[contextPath];
510
520
  }
511
521
  }
@@ -816,4 +826,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/contro
816
826
  };
817
827
  return ModelHelper;
818
828
  }, false);
819
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJtZXRhT2JqZWN0IiwidGVtcGxhdGVJbnRlcmZhY2UiLCJvTWV0YU1vZGVsIiwiY29udGV4dCIsImdldE1vZGVsIiwiX18kZmVJc0NvbGxhYm9yYXRpb25EcmFmdEVuYWJsZWQiLCJ1bmRlZmluZWQiLCJvRW50aXR5Q29udGFpbmVyIiwic0VudGl0eVNldCIsImdldERyYWZ0Um9vdFBhdGgiLCJvQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldFJvb3RQYXRoIiwic1BhdGgiLCJtb2RlbCIsImZpcnN0SXRlcmF0aW9uIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic0l0ZXJhdGlvblBhdGgiLCJSZWdFeHAiLCJleGVjIiwic0VudGl0eVBhdGgiLCJnZXRNZXRhUGF0aCIsIm1EYXRhTW9kZWwiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRDb250ZXh0IiwiZ2V0UGF0aCIsImdldFN0aWNreVJvb3RQYXRoIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJvZGF0YU1ldGFNb2RlbCIsImVudGl0eVNldFBhdGgiLCJzcGxpdCIsImZpbHRlciIsImZpbHRlck91dE5hdlByb3BCaW5kaW5nIiwiam9pbiIsInBhdGhQYXJ0cyIsImluaXRpYWxQYXRoT2JqZWN0IiwiZ3Jvd2luZ1BhdGgiLCJwZW5kaW5nTmF2UHJvcEJpbmRpbmciLCJwYXRoT2JqZWN0IiwicmVkdWNlIiwicGF0aFVuZGVyQ29uc3RydWN0aW9uIiwicGF0aFBhcnQiLCJpZHgiLCJkZWxpbWl0ZXIiLCJ0ZW1wUGF0aCIsIm5hdlByb3BCaW5kaW5ncyIsIm5hdlByb3BCaW5kaW5nVG9DaGVjayIsIk9iamVjdCIsImtleXMiLCJoYXNPd25Qcm9wZXJ0eSIsInJlcGxhY2UiLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvRXZlbnRzIiwiY29udGV4dEJpbmRpbmciLCJhcHBseSIsImZuR2V0Qm91bmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib0JvdW5kQ29udGV4dCIsInNldFByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJwcm9wZXJ0eVBhdGhTcGxpdCIsImkiLCJnZXRQcm9wZXJ0eSIsImVuaGFuY2VVaUpTT05Nb2RlbCIsInVpTW9kZWwiLCJsaWJyYXJ5IiwiZm5TZXRQcm9wZXJ0eSIsImFzeW5jVXBkYXRlIiwiRWRpdE1vZGUiLCJFZGl0YWJsZSIsIkRpc3BsYXkiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsInZpZXdNb2RlbCIsImZuR2V0T2JqZWN0IiwiX2dldE9iamVjdCIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImZpbHRlckZ1bmN0aW9ucyIsIl9maWx0ZXJGdW5jdGlvbnMiLCJpbmRleE9mIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwib01vZGVsIiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJjb250ZXh0UGF0aCIsInJvb3RFbnRpdHlTZXRQYXRoIiwiYVBhdGhzIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwib1ZpZXciLCJ2TGlzdEJpbmRpbmciLCJzTWV0YVBhdGgiLCJzdGFydHNXaXRoIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzUm9vdENvbnRleHRQYXRoIiwib0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInNSb290QmluZGluZ1BhdGgiLCJzUmVsYXRpdmVQYXRoIiwiZW50aXR5U2V0IiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiaXNTdGlja3kiLCJnZXRTdGlja3lTZXNzaW9uIiwiaXNVcGRhdGVIaWRkZW4iLCJlbnRpdHlUeXBlIiwiaXNFbnRpdHlTZXQiLCJVSSIsIlVwZGF0ZUhpZGRlbiIsImdldERlbGV0ZUhpZGRlbiIsIkRlbGV0ZUhpZGRlbiIsImdldEFic29sdXRlUGF0aEZyb21MaXN0QmluZGluZyIsImxpc3RCaW5kaW5nIiwibWV0YW1vZGVsIiwibWV0YVBhdGgiLCJyb290QmluZGluZyIsInJvb3RCaW5kaW5nUGF0aCIsInJlbGF0aXZlUGF0aCIsImVuaGFuY2VPRGF0YU1vZGVsIiwib2RhdGFNb2RlbCIsImFwcENvbXBvbmVudCIsInZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeSIsIkFycmF5IiwiZm5NZXNzYWdlIiwic2V0TWVzc2FnZXMiLCJsb2NhbEFubm90YXRpb25Nb2RlbCIsIkpTT05Nb2RlbCIsInNldERlZmF1bHRCaW5kaW5nTW9kZSIsIkJpbmRpbmdNb2RlIiwiT25lV2F5IiwiYmFzZVNldFByb3BlcnR5IiwiYmFzZUdldFByb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiYW5ub3RhdGlvblR5cGUiLCJpc1RyYW5zaWVudCIsImNvbnRleHRPYmplY3QiLCJNZXRhUGF0aCIsImNvbnZlcnRUeXBlcyIsImV4dGVybmFsSWRQcm9wZXJ0eSIsImdldE1ldGFQYXRoRm9yUGF0aCIsImdldFRhcmdldCIsIkV4dGVybmFsSUQiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImZ1bGxQYXRoIiwiX3JlZnJlc2hMb2NhbE1vZGVsIiwicmVmcmVzaCIsImV4dGVybmFsSWRQcm9wUGF0aCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInRleHRQcm9wZXJ0eSIsIlRleHQiLCJ0ZXh0UHJvcFBhdGgiLCJpbmNsdWRlcyIsInB1c2giLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInBhdGhGcm9tUm9vdCIsImNsZWFyQW5ub3RhdGlvblR5cGUiLCJhbm5vdGF0aW9uVHlwZXMiLCJkYXRhU2V0IiwiaXNDb250ZXh0IiwiaXNBIiwiZW5kc1dpdGgiLCJfbG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJnZXRMb2NhbEFubm90YXRpb25Nb2RlbCIsIm1lc3NhZ2VzIiwiY2xlYW5lZERhdGEiLCJnZXREYXRhIiwic2V0RGF0YSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRUeXBlIiwiZ2V0TWVzc2FnZSIsImZuQmluZFByb3BlcnR5IiwiYmluZFByb3BlcnR5IiwiYmluZCIsInBhcmFtZXRlcnMiLCJyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiRGlzYWJsZUlucHV0QXNzaXN0YW5jZSIsInJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nIiwic2V0VXBSZWNvbW1lbmRhdGlvbkxvY2FsTW9kZWxCaW5kaW5nIiwiaW50ZXJuYWxJZEJpbmRpbmciLCJleHRlcm5hbElkQmluZGluZyIsImF0dGFjaENoYW5nZSIsInJlcXVlc3RWYWx1ZSIsInByb3BCaW5kaW5nIiwidXBkYXRlUmVxdWlyZWQiLCJleHByZXNzaW9uIiwiZ2V0VmlydHVhbEJpbmRpbmdFeHByZXNzaW9uIiwiZ2hvc3RDb250cm9sIiwiQW55IiwiYW55IiwiY29tcGlsZUV4cHJlc3Npb24iLCJiaW5kQmFja1Byb3BlcnR5IiwiZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nIiwiZGVzdHJveSIsImZuU2V0Q29udGV4dCIsInNldENvbnRleHQiLCJuZXdDb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJzZXRNb2RlbCIsImdob3N0QmluZGluZyIsImdldEJpbmRpbmdJbmZvIiwiYmluZGluZyIsImZuQ2hlY2tVcGRhdGUiLCJjaGVja1VwZGF0ZSIsImZuRGVzdHJveSIsInZwQmluZGluZyIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJjb252ZXJ0ZXJDb250ZXh0IiwidGV4dCIsIm1ldGFNb2RlbFBhdGgiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsImFubm90YXRpb24iLCJ0b1N0cmluZyIsImUiLCJpbmZvIiwiZ2V0TWVzc2FnZXNQYXRoIiwidGFyZ2V0RW50aXR5VHlwZSIsIk1lc3NhZ2VzIiwicmVjb21tZW5kYXRpb25iaW5kaW5nIiwic2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nIiwib2RhdGFQcm9wZXJ0eUJpbmRpbmciLCJyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSIsImlzUmVjb21tZW5kZWRQcm9wZXJ0eSIsInZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aCIsImFscmVhZHlCb3VuZCIsInNvbWUiLCJleGlzdGluZ0JpbmRpbmciLCJzZXRUeXBlIiwiUmF3Iiwic2V0QmluZGluZ01vZGUiLCJldmVudCIsInByb3BlcnR5QmluZGluZyIsImdldFNvdXJjZSIsImN1cnJlbnRDb250ZXh0IiwiY29udGV4dFJlY29tbWVuZGF0aW9ucyIsImdldFZhbHVlIiwic2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbCIsImJpbmRpbmdQYXRoIiwiY29udGV4dE1ldGFQYXRoIiwiUmVjb21tZW5kYXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnR5IiwibmFtZSIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJyZWNvbW1lbmRlZFByb3BlcnR5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbnMiLCJsb2NhbE1vZGVsUGF0aCIsInR5cGVBaGVhZFZhbHVlcyIsInByb3BlcnR5UmVjb21tZW5kYXRpb24iLCJSZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uIiwicGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoIiwicGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoIiwiUmVjb21tZW5kZWRGaWVsZFZhbHVlIiwiUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImFsdGVybmF0ZUtleXMiLCJfZmV0Y2hBbHRlcm5hdGVLZXlzIiwiZW50aXR5VHlwZU9yU2V0IiwiQ29yZSIsIkFsdGVybmF0ZUtleXMiLCJmb3JFYWNoIiwiYWx0ZXJuYXRlS2V5IiwiS2V5Iiwia2V5IiwiTmFtZSIsIl9mZXRjaFNlY29uZGFyeUtleXMiLCJlVCIsIlNlY29uZGFyeUtleSIsInNlY29uZGFyeUtleSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTW9kZWxIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIHRvIGJlIHVzZWQgYXQgcnVudGltZSB0byByZXRyaWV2ZSBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbCAqL1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4VHlwZSwgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoLCBTaW5nbGV0b24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnROb2RlLCBEcmFmdFJvb3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBBbHRlcm5hdGVLZXksIFByb3BlcnR5UmVmIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1Nlc3Npb25cIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlfRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IEFueSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQW55XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IE1ldGFQYXRoIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFQYXRoXCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCwgaXNOYXZpZ2F0aW9uUHJvcGVydHksIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgUmF3IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9SYXdcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT0RhdGFMaXN0QmluZGluZyB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuXG4vLyBUT0RPOiBSaWdodCBub3cgcmVjb21tZW5kYXRpb25zIGlzIG5vdCBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5LlxuLy8gaGVuY2Ugd2UgYXJlIGFkZGluZyBpdCB0byB0aGUgdHlwZS5cbi8vIG9uY2UgdGhpcyBiZWNvbWVzIHBhcnQgb2YgdGhlIFVJIHZvY2FidWxhcnkgdGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMuXG5leHBvcnQgdHlwZSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUlfV2l0aF9SZWNvbW1lbmRhdGlvbnMgPSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgJiB7XG5cdFJlY29tbWVuZGF0aW9ucz86IHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdH07XG59O1xuXG5jb25zdCBNb2RlbEhlbHBlciA9IHtcblx0Ly8gZ2xvYmFsIHN3aXRjaCB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGJ5IGEgcHJpdmF0ZSBtYW5pZmVzdCBmbGFnXG5cdC8vIHRoaXMgYWxsb3dzIGN1c3RvbWVycyB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGluIGNhc2Ugd2UgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGZpcnN0IGRlbGl2ZXJ5XG5cdC8vIHRoaXMgd2lsbCBiZSByZW1vdmVkIHdpdGggdGhlIG5leHQgUy80IHJlbGVhc2Vcblx0ZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdDogZmFsc2UsXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBzdGlja3kuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNb2RlbE1ldGFNb2RlbCB0byBjaGVjayBmb3Igc3RpY2t5IGVuYWJsZWQgZW50aXR5XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBzdGlja3ksIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBib29sZWFuIHtcblx0XHRjb25zdCBlbnRpdHlDb250YWluZXIgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGVudGl0eVNldE5hbWUgaW4gZW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVudGl0eUNvbnRhaW5lcltlbnRpdHlTZXROYW1lXS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlTZXROYW1lfUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRgKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHByb2dyYW1taW5nIG1vZGVsIGlzIGRyYWZ0LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0gcGF0aCBQYXRoIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGRyYWZ0LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc0RyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KG1ldGFDb250ZXh0KTtcblx0XHRyZXR1cm4gdGhpcy5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChvYmplY3RQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGRyYWZ0IGlzIHN1cHBvcnRlZCBmb3IgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzdXBwb3J0ZWRcblx0ICovXG5cdGlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAoZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCA9XG5cdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eShkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiZcblx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Py5jb250YWluc1RhcmdldCAmJlxuXHRcdFx0KChkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUpXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGUgfHwgKCFjdXJyZW50RW50aXR5U2V0ICYmIGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQpO1xuXHR9LFxuXG5cdGlzTWV0YVBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IE1ldGFQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGguZ2V0Q2xvc2VzdEVudGl0eVNldCgpIGFzIEVudGl0eVNldDtcblx0XHRjb25zdCBiSXNEcmFmdFJvb3QgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KTtcblx0XHRjb25zdCBiSXNEcmFmdE5vZGUgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjdXJyZW50RW50aXR5U2V0KTtcblx0XHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgc2VydmljZSwgc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdC5cblx0ICogQHBhcmFtIG1ldGFPYmplY3QgTWV0YU9iamVjdCB0byBiZSB1c2VkIGZvciBkZXRlcm1pbmF0aW9uXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUludGVyZmFjZSBBUEkgcHJvdmlkZWQgYnkgVUk1IHRlbXBsYXRpbmcgaWYgdXNlZFxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UuY29udGV4dCBDb250ZXh0IG9mIHRoZSB0ZW1wbGF0ZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhT2JqZWN0OiB1bmtub3duLCB0ZW1wbGF0ZUludGVyZmFjZT86IHsgY29udGV4dDogQ29udGV4dCB9KTogYm9vbGVhbiB7XG5cdFx0aWYgKCFNb2RlbEhlbHBlci5kaXNhYmxlQ29sbGFib3JhdGlvbkRyYWZ0KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gKHRlbXBsYXRlSW50ZXJmYWNlPy5jb250ZXh0Py5nZXRNb2RlbCgpIHx8IG1ldGFPYmplY3QpIGFzIE9EYXRhTWV0YU1vZGVsICYge1xuXHRcdFx0XHRfXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZD86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0aWYgKG9NZXRhTW9kZWwuX18kZmVJc0NvbGxhYm9yYXRpb25EcmFmdEVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0XHRmb3IgKGNvbnN0IHNFbnRpdHlTZXQgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzRW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9NZXRhTW9kZWwuX18kZmVJc0NvbGxhYm9yYXRpb25EcmFmdEVuYWJsZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBEcmFmdFJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZHJhZnRSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRyYWZ0Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0RHJhZnRSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFN0aWNreVJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldFN0aWNreVJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtRGF0YU1vZGVsLnN0YXJ0aW5nRW50aXR5U2V0ID09PSBtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0XHRcdChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRsZXQgcGF0aCA9IHRoaXMuZ2V0UGF0aCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTsgLy8gUmVtb3ZlIHNsYXNoIGlmIGl0IGlzIGF0IHRoZSBlbmRcblx0XHRcdFx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IGAke3BhdGh9LyR7cHJvcGVydHlQYXRoU3BsaXRbaV19YDtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0TW9kZWwoKS5nZXRQcm9wZXJ0eShwYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwYXRoLCB7fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBjb250ZXh0QmluZGluZztcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGhhbmRsZXIgb24gcHJvcGVydHlDaGFuZ2UuXG5cdCAqIFRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiIGlzIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHByb3BlcnR5ICcvaXNFZGl0YWJsZScgd2hlbiB0aGlzIGxhc3Qgb25lIGlzIHNldFxuXHQgKiBpbiBvcmRlciB0byBiZSBjb21wbGlhbnQgd2l0aCBmb3JtZXIgdmVyc2lvbnMgd2hlcmUgYnVpbGRpbmcgYmxvY2tzIHVzZSB0aGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIlxuXHQgKiBAcGFyYW0gdWlNb2RlbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqIEBwYXJhbSBsaWJyYXJ5IENvcmUgbGlicmFyeSBvZiBTQVAgRmlvcmkgZWxlbWVudHNcblx0ICovXG5cblx0ZW5oYW5jZVVpSlNPTk1vZGVsOiBmdW5jdGlvbiAodWlNb2RlbDogSlNPTk1vZGVsLCBsaWJyYXJ5OiB7IEVkaXRNb2RlOiB7IEVkaXRhYmxlOiBzdHJpbmc7IERpc3BsYXk6IHN0cmluZyB9IH0pOiB2b2lkIHtcblx0XHRjb25zdCBmblNldFByb3BlcnR5ID0gdWlNb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHR1aU1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRcdFx0cGF0aDogc3RyaW5nLFxuXHRcdFx0dmFsdWU6IHVua25vd24sXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRcdGFzeW5jVXBkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cdFx0KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAocGF0aCA9PT0gXCIvaXNFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvZWRpdE1vZGVcIiwgdmFsdWUgPyBsaWJyYXJ5LkVkaXRNb2RlLkVkaXRhYmxlIDogbGlicmFyeS5FZGl0TW9kZS5EaXNwbGF5LCBjb250ZXh0LCBhc3luY1VwZGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgdmFsdWUsIGNvbnRleHQsIGFzeW5jVXBkYXRlXSk7XG5cdFx0fTtcblx0fSxcblxuXHRlbmhhbmNlVmlld0pTT05Nb2RlbDogZnVuY3Rpb24gKHZpZXdNb2RlbDogSlNPTk1vZGVsICYgeyBfZ2V0T2JqZWN0OiBGdW5jdGlvbiB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5HZXRPYmplY3QgPSB2aWV3TW9kZWwuX2dldE9iamVjdDtcblx0XHR2aWV3TW9kZWwuX2dldE9iamVjdCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiB1bmtub3duIHtcblx0XHRcdGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoID0gXCIvXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5HZXRPYmplY3QuYXBwbHkodGhpcywgW3NQYXRoLCBvQ29udGV4dF0pO1xuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBmaWx0ZXJGdW5jdGlvbnMgRmlsdGVyIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2Vcblx0ICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcblx0ICovXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCwgZmlsdGVyRnVuY3Rpb25zPzogRmlsdGVyRnVuY3Rpb25zKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgX2ZpbHRlckZ1bmN0aW9ucyA9IGZpbHRlckZ1bmN0aW9ucyA/PyBvTWV0YU1vZGVsPy5nZXRPYmplY3QoXCIvQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyRnVuY3Rpb25zXCIpO1xuXG5cdFx0aWYgKCFfZmlsdGVyRnVuY3Rpb25zKSB7XG5cdFx0XHQvLyBpZiBubyBmaWx0ZXJzIGZ1bmN0aW9uIGRlZmluZWQgaW4gc2VydmljZSwgdG9sb3dlciBpcyBzdXBwb3J0ZWRcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2ZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTE7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKi9cblx0Z2V0TWV0YVBhdGhGb3JDb250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwgJiYgc1BhdGggJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBNZXRhUGF0aCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJvb3QgZW50aXR5IHNldCBwYXRoLlxuXHQgKi9cblx0Z2V0Um9vdEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgcm9vdEVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGFQYXRocyA9IGNvbnRleHRQYXRoID8gY29udGV4dFBhdGguc3BsaXQoXCIvXCIpIDogW107XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRyb290RW50aXR5U2V0UGF0aCA9IGFQYXRoc1sxXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb3RFbnRpdHlTZXRQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgbGlzdGJpbmRpbmcuXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogRkVWaWV3LCB2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdEJpbmRpbmdQYXRofS8ke3NSZWxhdGl2ZVBhdGh9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzTWV0YVBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdGlzRHJhZnRSb290OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RHJhZnRSb290KGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IG5vZGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZVxuXHQgKi9cblx0aXNEcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdE5vZGUoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RpY2t5IHNlc3Npb24gcm9vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290XG5cdCAqL1xuXHRpc1N0aWNreTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RpY2t5U2Vzc2lvbihlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgZW50aXR5IGlzIHVwZGF0YWJsZSBvciBub3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB1cGRhdGFibGUgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNVcGRhdGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFVwZGF0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnRSb290IGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdFJvb3QgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290IDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBAQ29tbW9uLkRyYWZ0Tm9kZSBhbm5vdGF0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBFbnRpdHlTZXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIERyYWZ0Um9vdFxuXHQgKi9cblx0Z2V0RHJhZnROb2RlOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogRHJhZnROb2RlIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSA/IGVudGl0eVNldC5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Tm9kZSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogSGVscGVyIG1ldGhvZCB0byBnZXQgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFNlc3Npb24gU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHQgKi9cblx0Z2V0U3RpY2t5U2Vzc2lvbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgZGVsZXRlIGJ1dHRvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGRlbGV0ZSBidXR0b24gaXMgaGlkZGVuXG5cdCAqL1xuXHRnZXREZWxldGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IERlbGV0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBtZXRhcGF0aCBmb3IgdGhlIGdpdmVuIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nLlxuXHQgKiBAcmV0dXJucyBNZXRhUGF0aFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBtZXRhUGF0aDtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0aWYgKGxpc3RCaW5kaW5nID09PSByb290QmluZGluZykge1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgcm9vdEJpbmRpbmdQYXRoID0gcm9vdEJpbmRpbmc/LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdG1ldGFQYXRoID0gbWV0YW1vZGVsLmdldE1ldGFQYXRoKGAke3Jvb3RCaW5kaW5nUGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXRhUGF0aDtcblx0fSxcblxuXHRlbmhhbmNlT0RhdGFNb2RlbChvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IHZvaWQge1xuXHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5ID0gbmV3IEFycmF5PE9EYXRhUHJvcGVydHlCaW5kaW5nPigpO1xuXHRcdGNvbnN0IGZuTWVzc2FnZSA9IG9kYXRhTW9kZWwuc2V0TWVzc2FnZXM7XG5cdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXREZWZhdWx0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRjb25zdCBiYXNlU2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHRjb25zdCBiYXNlR2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHVua25vd24ge1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblxuXHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc1RyYW5zaWVudCgpICE9PSB0cnVlICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRPYmplY3QgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoY29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0XHRvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KHByb3BlcnR5TmFtZSk/LmdldFRhcmdldCgpLmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0XHRcdFx0Py5FeHRlcm5hbElEO1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QoZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYmFzZUdldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCBjb250ZXh0XSk7XG5cdFx0fTtcblxuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZSk6IGJvb2xlYW4ge1xuXHRcdFx0bGV0IGZ1bGxQYXRoID0gcGF0aDtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGZ1bGxQYXRoID0gY29udGV4dC5nZXRQYXRoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgX3JlZnJlc2hMb2NhbE1vZGVsID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXHRcdFx0aWYgKGNvbnRleHQgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcblx0XHRcdFx0Ly8gcmVmcmVzaGluZyBFeHRlcm5hbElEIGFuZCB0ZXh0IHByb3BlcnRpZXMgKHBhdGhzIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBnZW5lcmljYWxseSlcblx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gbWV0YVBhdGguZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eU5hbWUpPy5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BQYXRoID0gZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtleHRlcm5hbElkUHJvcFBhdGguc3Vic3RyaW5nKDAsIGV4dGVybmFsSWRQcm9wUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSWRQcm9wUGF0aCk/LmdldFRhcmdldCgpLmFubm90YXRpb25zLkNvbW1vbj8uVGV4dDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGV4dFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dFByb3BQYXRoID0gdGV4dFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0XHRpZiAodGV4dFByb3BQYXRoLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9SZXF1ZXN0LnB1c2godGV4dFByb3BQYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KGNvbnRleHQgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QpXG5cdFx0XHRcdFx0XHQudGhlbihfcmVmcmVzaExvY2FsTW9kZWwpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoU3BsaXQgPSBmdWxsUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdGxldCBwYXRoRnJvbVJvb3QgPSBcIlwiO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0cGF0aEZyb21Sb290ICs9IFwiL1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhGcm9tUm9vdCArPSBwcm9wZXJ0eVBhdGhTcGxpdFtpXTtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T2JqZWN0KHBhdGhGcm9tUm9vdCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHR0aGlzLnNldFByb3BlcnR5KHBhdGhGcm9tUm9vdCwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYmFzZVNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHRcdGZ1bmN0aW9uIGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzOiBzdHJpbmdbXSwgZGF0YVNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBvYmplY3Qge1xuXHRcdFx0Zm9yIChjb25zdCBjb250ZXh0UGF0aCBpbiBkYXRhU2V0KSB7XG5cdFx0XHRcdC8vIHdlIGFkZGVkIGEgY29udGV4dCBmb3IgYWNjZXB0aW5nIHJlY29tbWVuZGF0aW9ucyBldmVudHVhbGx5LlxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IGl0ZXJhdGluZyBvdmVyIGl0IGNhdXNlIHRoZSBjb2RlIHRoZSBicmVha1xuXHRcdFx0XHQvLyBoZW5jZSB3ZSBhcmUgc2tpcHBpbmcgaXQgaGVyZS5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGRhdGFTZXQ/Lltjb250ZXh0UGF0aF0gYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGV4dCA9IGNvbnRleHQ/LmlzQT8uKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIik7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29udGV4dCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGF0YVNldFtjb250ZXh0UGF0aF0gPSBjbGVhckFubm90YXRpb25UeXBlKGFubm90YXRpb25UeXBlcywgZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGFubm90YXRpb25UeXBlIG9mIGFubm90YXRpb25UeXBlcykge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0UGF0aC5lbmRzV2l0aChhbm5vdGF0aW9uVHlwZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhU2V0O1xuXHRcdH1cblx0XHRvZGF0YU1vZGVsLl9sb2NhbEFubm90YXRpb25Nb2RlbCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBmdW5jdGlvbiAoKTogSlNPTk1vZGVsIHtcblx0XHRcdHJldHVybiB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHR9O1xuXHRcdG9kYXRhTW9kZWwuc2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VbXT4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNsZWFuZWREYXRhID0gY2xlYXJBbm5vdGF0aW9uVHlwZShbXCJAJHVpNS5mZS5tZXNzYWdlVHlwZVwiLCBcIkAkdWk1LmZlLm1lc3NhZ2VUZXh0XCJdLCB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5nZXREYXRhKCkpO1xuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0RGF0YShjbGVhbmVkRGF0YSk7XG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2VUYXJnZXQgaW4gbWVzc2FnZXMpIHtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVHlwZWAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldFR5cGUoKSk7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVRleHRgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRNZXNzYWdlKCkpO1xuXHRcdFx0fVxuXHRcdFx0Zm5NZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5CaW5kUHJvcGVydHkgPSBvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuYmluZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQsIHBhcmFtZXRlcnMpOiBPRGF0YVByb3BlcnR5QmluZGluZyB7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCA9IGFwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKS5EaXNhYmxlSW5wdXRBc3Npc3RhbmNlO1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcgPSBNb2RlbEhlbHBlci5zZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmcoXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGZuQmluZFByb3BlcnR5LFxuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZFxuXHRcdFx0KTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5lbmRzV2l0aChcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSAmJiBjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsSWRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCk7XG5cdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2goaW50ZXJuYWxJZEJpbmRpbmcpO1xuXHRcdFx0XHRjb25zdCBleHRlcm5hbElkQmluZGluZyA9IHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyB1bmtub3duIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nO1xuXG5cdFx0XHRcdGludGVybmFsSWRCaW5kaW5nLmF0dGFjaENoYW5nZSgoKSA9PiB7XG5cdFx0XHRcdFx0ZXh0ZXJuYWxJZEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aW50ZXJuYWxJZEJpbmRpbmdcblx0XHRcdFx0XHQucmVxdWVzdFZhbHVlKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRleHRlcm5hbElkQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gZXh0ZXJuYWxJZEJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5pbmNsdWRlcyhcIkAkdWk1LmZlLlwiKSkge1xuXHRcdFx0XHRjb25zdCBwcm9wQmluZGluZyA9IHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0XHRzZXRDb250ZXh0PzogRnVuY3Rpb247XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BCaW5kaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByb3BCaW5kaW5nLnVwZGF0ZVJlcXVpcmVkID0gZnVuY3Rpb24gKG1vZGVsOiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gbW9kZWwgJiYgbW9kZWwgPT09IG9kYXRhTW9kZWw7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChwYXRoLmluY2x1ZGVzKFwiQCR1aTUuZmUudmlydHVhbC5cIikpIHtcblx0XHRcdFx0XHRjb25zdCBleHByZXNzaW9uID0gTWV0YU1vZGVsQ29udmVydGVyLmdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKHRoaXMuZ2V0TWV0YU1vZGVsKCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBnaG9zdENvbnRyb2wgPSBuZXcgQW55KHsgYW55OiBjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uKSwgYmluZEJhY2tQcm9wZXJ0eTogcGF0aCB9KTtcblx0XHRcdFx0XHRjb25zdCBmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmcgPSBwcm9wQmluZGluZy5kZXN0cm95LmJpbmQocHJvcEJpbmRpbmcpO1xuXHRcdFx0XHRcdHByb3BCaW5kaW5nLmRlc3Ryb3kgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRyb2w/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdHJldHVybiBmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmcoKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHByb3BCaW5kaW5nLnNldENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGZuU2V0Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0cHJvcEJpbmRpbmcuc2V0Q29udGV4dCA9IChuZXdDb250ZXh0OiBDb250ZXh0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q29udHJvbD8uc2V0QmluZGluZ0NvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmblNldENvbnRleHQuYmluZChwcm9wQmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdob3N0Q29udHJvbC5zZXRNb2RlbCh0aGlzKTtcblx0XHRcdFx0XHRjb25zdCBnaG9zdEJpbmRpbmcgPSBnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0luZm8oXCJhbnlcIik/LmJpbmRpbmc7XG5cdFx0XHRcdFx0Y29uc3QgZm5DaGVja1VwZGF0ZSA9IGdob3N0QmluZGluZz8uY2hlY2tVcGRhdGU7XG5cdFx0XHRcdFx0aWYgKGZuQ2hlY2tVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGdob3N0Q29udHJvbC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKS5iaW5kaW5nLmNoZWNrVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5DaGVja1VwZGF0ZS5iaW5kKGdob3N0QmluZGluZykodHJ1ZSk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRnaG9zdENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHByb3BCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuQmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5EZXN0cm95ID0gb2RhdGFNb2RlbC5kZXN0cm95LmJpbmQob2RhdGFNb2RlbCk7XG5cdFx0b2RhdGFNb2RlbC5kZXN0cm95ID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0Zm9yIChjb25zdCB2cEJpbmRpbmcgb2Ygb2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkpIHtcblx0XHRcdFx0dnBCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiBmbkRlc3Ryb3kuYXBwbHkodGhpcyk7XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFJlc29sdmVzIGEgbWV0YWRhdGEgYmluZGluZyB0byBpdHMgdGV4dCwgZWl0aGVyIHVzaW5nIHRoZSBjb252ZXJ0ZXJDb250ZXh0IG9yIHRoZSBtZXRhTW9kZWwgZGlyZWN0bHkuXG5cdCAqIEBwYXJhbSBwYXRoXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVkIHRleHQgaWYgcG9zc2libGUsIGVsc2UgdGhlIGlucHV0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCB3YXMgdW5kZWZpbmVkXG5cdCAqL1xuXHRmZXRjaFRleHRGcm9tTWV0YU1vZGVsKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dD86IENvbnZlcnRlckNvbnRleHQ8dW5rbm93bj4sIG1ldGFNb2RlbD86IE1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHRleHQgPSBwYXRoICE9PSB1bmRlZmluZWQgPyBwYXRoIDogXCJcIjtcblx0XHRpZiAocGF0aD8uc3RhcnRzV2l0aChcInttZXRhTW9kZWw+XCIpKSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxQYXRoID0gcGF0aC5zdWJzdHJpbmcoMTEsIHBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udmVydGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdHRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKG1ldGFNb2RlbFBhdGgpLmFubm90YXRpb24/LnRvU3RyaW5nKCkgPz8gXCJcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0ZXh0ID0gbWV0YU1vZGVsPy5nZXRPYmplY3QobWV0YU1vZGVsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0TG9nLmluZm8oYFVuYWJsZSB0byByZXRyaWV2ZSB0ZXh0IGZyb20gbWV0YSBtb2RlbCB1c2luZyBwYXRoICR7bWV0YU1vZGVsUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRleHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgcGF0aCBjb3JyZXNwb25kaW5nIHRvIHN0YXRlIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggZm9yIHRoZSBjb250ZXh0IG9uIHdoaWNoIHdlIHdoYXQgdG8gcmV0cmVpdmUgdGhlIG1lc3NhZ2UgcGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoLCBvciB1bmRlZmluZWQgaWYgbm8gTWVzc2FnZXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkXG5cdCAqL1xuXHRnZXRNZXNzYWdlc1BhdGg6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0UGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0XHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcblx0fSxcblx0LyoqXG5cdCAqIFNldHVwIHJlY29tbWVuZGF0aW9uIGxvY2FsIGJpbmRpbmcgdG8gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWNjZXNzaWJsZSB2aWEgY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIFJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkuXG5cdCAqIE1vZGVsIGRvZXMgbm90IHByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gYmluZCB0byBjb21wbGV4IHByb3BlcnRpZXMuIEl0IGhhcyAyIG1ham9yIGxpbWl0YXRpb25zLlxuXHQgKlxuXHQgKiBJdCBvbmx5IHN1cHBvcnRzIG9uZSB0aW1lIGJpbmRpbmcgdG8gY29tcGxleCBwcm9wZXJ0aWVzLiBUaGlzIGlzIG5lZWRlZCB0byBzaG93IHVwZGF0ZWQgcmVjb21tZW5kYXRpb25zIG9uIHRoZSBVSS5cblx0ICogSXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5ncyB0byBwcm9wZXJ0aWVzIGluc2lkZSBhIGNvbXBsZXggcHJvcGVydHkgd2hpY2ggaXMgbmVlZGVkIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3b3JrYXJvdW5kIHRvIG92ZXJjb21lIHRoZSBhYm92ZSB0d28gc2hvcnQgY29taW5ncyBhbmRcblx0ICogdG8gc3VwcG9ydCBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucyBmb3IgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gb2RhdGFNb2RlbCBUaGUgb2RhdGEgbW9kZWwgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBmbkJpbmRQcm9wZXJ0eSBPcmlnaW5hbCBiaW5kIHByb3BlcnR5IG9mIHRoZSBvRGF0YU1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCBGbGFnIHdoaWNoIHRvZ2dsZXMgdGhlIHJlY29tbWVuZGF0aW9uIGZlYXR1cmVcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHRzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdGZuQmluZFByb3BlcnR5OiBGdW5jdGlvbixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQ6IGJvb2xlYW5cblx0KTogUHJvcGVydHlCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocGF0aC5pbmNsdWRlcyhcInVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIikpIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uYmluZGluZyA9IG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKS5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyA9IChvZGF0YVByb3BlcnR5QmluZGluZzogT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7IHNldENvbnRleHQ6IEZ1bmN0aW9uIH0pOiB2b2lkID0+IHtcblx0XHRcdFx0Ly93ZSBtYWtlIHN1cmUgdGhlIHBhcmVudCBjb250ZXh0IGlzIHNldCB0byB0aGUgcHJvcGVydHliaW5kaW5nXG5cdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHJlY29tbWVuZGF0aW9uYmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmc/LnNldENvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQob2RhdGFQcm9wZXJ0eUJpbmRpbmcpKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LCBpc1JlY29tbWVuZGVkUHJvcGVydHkgfSA9IE1vZGVsSGVscGVyLnZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aChcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdHBhdGhcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5ICYmIGlzUmVjb21tZW5kZWRQcm9wZXJ0eSAmJiAhcmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQpIHtcblx0XHRcdFx0XHRjb25zdCBhbHJlYWR5Qm91bmQgPSBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5zb21lKChleGlzdGluZ0JpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgZXhpc3RzIGJ1dCB0aGUgY29udGV4dCBjYW4gYmUgZGVzdHJveWVkIHNvbWV0aW1lcyBiZWNhdXNlIG9mIGRpc2NhcmQgYW5kIGRlbGV0ZS5cblx0XHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgbmVlZCB0byBjaGVjayBpZiBjb250ZXh0IGV4aXN0cyBvciBub3QgYmVmb3JlIGRlY2lkaW5nIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGJpbmRpbmcgb3Igbm90LlxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBXZSBtaWdodCB3YW50IHRvIGNsZWFyIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHdoZW4gdGhlIGNvbnRleCBpcyBkZXN0cm95ZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0UGF0aCgpID09PSBleGlzdGluZ0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgJiZcblx0XHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFhbHJlYWR5Qm91bmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9kYXRhUHJvcGVydHlCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdFx0XHRzZXRDb250ZXh0OiBGdW5jdGlvbjtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHQvLyBCZWN1YXNlIHJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIG5vdCBhIHByaW1pdGl2ZSB0eXBlIGhlbmNlIHVzZSBhIHJhdyB0eXBlLlxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0VHlwZShuZXcgUmF3KCksIFwiYW55XCIpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2gob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgbG9jYWwgYW5ub3RhdGlvbiBiaW5kaW5nIG9uY2UgcmVjb21tZW5kYXRpb24gYmluZGluZyBpcyB1cGRhdGVkLlxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUJpbmRpbmcgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBldmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgPSBwcm9wZXJ0eUJpbmRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5zZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIHJldWVzdFZhbHVlIHdpbGwgYWRkIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSB0byB0aGUgJHNlbGVjdFxuXHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSAkc2VsZWN0IHdoZW4gY29uc3RydWN0aW5nIHRoZSBiaW5kaW5nIGF0IHZhcmlvdXMgcGxhY2VzIChmb3JtcywgdGFibGUgZXRjLilcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnJlcXVlc3RWYWx1ZSgpLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJSZWNvbW1lbmRhdGlvbnMgY291bGQgbm90IGJlIHJlc29sdmVkXCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0c2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGJpbmRpbmcgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBiaW5kaW5nIGlzIGNyZWF0ZWQgc28gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGJpbmRpbmcgY2FuIGJlIGNyZWF0ZWQuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRm9yIHRoaXMgd2UgbmVlZCB0byBvdmVycmlkZSB1cGRhdGVSZXF1aXJlZCBzbyB0aGF0IHRoZSBiaW5kaW5nIGlzIHVwZGF0ZWQgdW50aWwgaXQgaGFzIG5vdCByZWNlaXZlZCBhIGNvbnRleHRcblx0XHRcdC8vIHBvc3QgdGhhdCB3ZSBkbyBub3QgbmVlZCB0aGUgYmluZGluZyB0byBiZSB1cGRhdGVkLlxuXHRcdFx0Ly8gSWYgd2UgcmVtb3ZlIHRoZSB1cGRhdGVSZXF1aXJlZCBvdmVycmlkZSB0aGVuIHJlY29tbWVuZGF0aW9ucyB3b3JrIGZpbmUgYnkgZHVyaW5nIHNhdmUgb2YgYSBuZXdseSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyB3ZSBnZXQgYmluZGluZyByZWxhdGVkIGlzc3Vlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBVcGRhdGluZyB0aGUgYmluZGluZyB0byByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBkb25lIGJ5IHNldFByb3BlcnR5IG9uIHRoZSBsb2NhbEFubm90YXRpb25Nb2RlbFxuXHRcdFx0Ly8gd2hlbiB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgaXMgYWN0dWFsbHkgdXBkYXRlZC5cblx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldENvbnRleHQoKSA/IG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsIDogbW9kZWwgJiYgdGhpcy5nZXRNb2RlbCgpID09PSBtb2RlbDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25iaW5kaW5nO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBiYXNlZCBvbiBtZXRhZGF0YSB3aGV0aGVyIGEgZ2l2ZW4gYmluZGluZyBzaG91bGQgZGVhbCB3aXRoIHJlY29tbWVuZGF0aW9ucyBvciBub3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHBhdGggZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCBhbmQgd2hldGhlciB0aGUgYmluZGluZ1BhdGggaXMgcmVsZXZhbnQgb3Igbm90IGJhc2VkIG9uIG1ldGFkYXRhLlxuXHQgKi9cblx0dmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YmluZGluZ1BhdGg6IHN0cmluZ1xuXHQpOiB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGlzUmVjb21tZW5kZWRQcm9wZXJ0eTogYm9vbGVhbiB9IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0TWV0YVBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPSAodGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJIGFzIEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSV9XaXRoX1JlY29tbWVuZGF0aW9ucylcblx0XHRcdD8uUmVjb21tZW5kYXRpb25zPy5wYXRoO1xuXHRcdC8vIHNhbXBsZSBiaW5kaW5nIC0gU2hpcHBpbmdDb25kaXRpb25AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVxuXHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGJpbmRpbmdQYXRoLnNwbGl0KFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIpWzBdO1xuXHRcdGNvbnN0IGlzUmVjb21tZW5kZWRQcm9wZXJ0eSA9IHRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5zb21lKChlbnRpdHlQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKGVudGl0eVByb3BlcnR5Lm5hbWUgPT09IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiAoZW50aXR5UHJvcGVydHk/LnRhcmdldFR5cGUgYXMgQ29tcGxleFR5cGUpPy5wcm9wZXJ0aWVzLnNvbWUoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHkubmFtZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LFxuXHRcdFx0aXNSZWNvbW1lbmRlZFByb3BlcnR5XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFVwZGF0ZSByZWNvbW1lbmRhdGlvbiBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgVXBkYXRlZCByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjdXJyZW50Q29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIHdhcyB1cGRhdGVkLlxuXHQgKi9cblx0c2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbDogZnVuY3Rpb24gKGNvbnRleHRSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgcmVjb21tZW5kZWRQcm9wZXJ0eSBpbiBjb250ZXh0UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UmVjb21tZW5kYXRpb25zID0gY29udGV4dFJlY29tbWVuZGF0aW9uc1tyZWNvbW1lbmRlZFByb3BlcnR5XTtcblx0XHRcdFx0Y29uc3QgbG9jYWxNb2RlbFBhdGggPSByZWNvbW1lbmRlZFByb3BlcnR5O1xuXHRcdFx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IGN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgdHlwZUFoZWFkVmFsdWVzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbiBvZiBwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRJc1N1Z2dlc3Rpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlckRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSxcblx0XHRcdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdC8vIHNldCBwbGFjZWhvbGRlciBkZXNjcmlwdGlvbiBhbmQgdmFsdWVzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vbG9jYWxBbm5vdGF0aW9uTW9kZWwuXG5cdFx0XHRcdFx0Ly8gcHVzaCB0b3AgMyByZWNvbW1lbmRhdGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdHR5cGVBaGVhZFZhbHVlcy5wdXNoKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucyB8fCAhcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlckRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCwgbnVsbCwgY3VycmVudENvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGgsIFwiXCIsIGN1cnJlbnRDb250ZXh0LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQuZ2V0UGF0aChsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiKSxcblx0XHRcdFx0XHR0eXBlQWhlYWRWYWx1ZXMsXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoY3VycmVudENvbnRleHQuZ2V0UGF0aChcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKSwgY3VycmVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIFNlY29uZGFyeUtleXMgZnJvbSBlbnRpdHl0eXBlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVR5cGVcblx0ICogQHBhcmFtIGVudGl0eVNldCBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVNldFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbHRlcm5hdGUga2V5c1xuXHQgKi9cblx0Z2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5czogKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10gPT4ge1xuXHRcdGNvbnN0IGFsdGVybmF0ZUtleXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgX2ZldGNoQWx0ZXJuYXRlS2V5cyA9IChlbnRpdHlUeXBlT3JTZXQ6IEVudGl0eVNldCB8IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVudGl0eVR5cGVPclNldD8uYW5ub3RhdGlvbnM/LkNvcmU/LkFsdGVybmF0ZUtleXM/LmZvckVhY2goKGFsdGVybmF0ZUtleTogQWx0ZXJuYXRlS2V5KSA9PiB7XG5cdFx0XHRcdGFsdGVybmF0ZUtleS5LZXkuZm9yRWFjaCgoa2V5OiBQcm9wZXJ0eVJlZikgPT4ge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChrZXkuTmFtZS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBfZmV0Y2hTZWNvbmRhcnlLZXlzID0gKGVUOiBFbnRpdHlUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRlVD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2Vjb25kYXJ5S2V5Py5mb3JFYWNoKChzZWNvbmRhcnlLZXk6IFByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAoIWFsdGVybmF0ZUtleXMuaW5jbHVkZXMoc2Vjb25kYXJ5S2V5LnZhbHVlKSkge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChzZWNvbmRhcnlLZXkudmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5U2V0KTtcblx0XHRpZiAoIWFsdGVybmF0ZUtleXMubGVuZ3RoKSB7XG5cdFx0XHRfZmV0Y2hBbHRlcm5hdGVLZXlzKGVudGl0eVR5cGUpO1xuXHRcdH1cblx0XHRfZmV0Y2hTZWNvbmRhcnlLZXlzKGVudGl0eVR5cGUpO1xuXHRcdHJldHVybiBhbHRlcm5hdGVLZXlzO1xuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBb0NBO0VBQ0E7RUFDQTs7RUFPQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxTQUF5QixFQUFXO01BQ3ZFLE1BQU1DLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxTQUFTLENBQUMsR0FBRyxDQUFDO01BQ2hELEtBQUssTUFBTUMsYUFBYSxJQUFJRixl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
829
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImVudGl0eVNldHMiLCJzb21lIiwiZW50aXR5U2V0IiwiU2hhcmVBY3Rpb24iLCJ1bmRlZmluZWQiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIm1ldGFPYmplY3QiLCJ0ZW1wbGF0ZUludGVyZmFjZSIsIm9NZXRhTW9kZWwiLCJjb250ZXh0IiwiZ2V0TW9kZWwiLCJfXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCIsIm9FbnRpdHlDb250YWluZXIiLCJzRW50aXR5U2V0IiwiZ2V0RHJhZnRSb290UGF0aCIsIm9Db250ZXh0IiwiZ2V0TWV0YU1vZGVsIiwiZ2V0Um9vdFBhdGgiLCJzUGF0aCIsIm1vZGVsIiwiZmlyc3RJdGVyYXRpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzSXRlcmF0aW9uUGF0aCIsIlJlZ0V4cCIsImV4ZWMiLCJzRW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwibURhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImdldFRhcmdldEVudGl0eVNldCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsIm9kYXRhTWV0YU1vZGVsIiwiZW50aXR5U2V0UGF0aCIsInNwbGl0IiwiZmlsdGVyIiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJqb2luIiwicGF0aFBhcnRzIiwiaW5pdGlhbFBhdGhPYmplY3QiLCJncm93aW5nUGF0aCIsInBlbmRpbmdOYXZQcm9wQmluZGluZyIsInBhdGhPYmplY3QiLCJyZWR1Y2UiLCJwYXRoVW5kZXJDb25zdHJ1Y3Rpb24iLCJwYXRoUGFydCIsImlkeCIsImRlbGltaXRlciIsInRlbXBQYXRoIiwibmF2UHJvcEJpbmRpbmdzIiwibmF2UHJvcEJpbmRpbmdUb0NoZWNrIiwiT2JqZWN0Iiwia2V5cyIsImhhc093blByb3BlcnR5IiwicmVwbGFjZSIsImdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoIiwib1BhcmFtZXRlciIsIiROYW1lIiwic1BhdGhQYXJ0IiwiZW5oYW5jZUludGVybmFsSlNPTk1vZGVsIiwib0ludGVybmFsTW9kZWwiLCJmbkJpbmRDb250ZXh0IiwiYmluZENvbnRleHQiLCJtUGFyYW1ldGVycyIsIm9FdmVudHMiLCJjb250ZXh0QmluZGluZyIsImFwcGx5IiwiZm5HZXRCb3VuZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvQm91bmRDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJwcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInByb3BlcnR5UGF0aFNwbGl0IiwiaSIsImdldFByb3BlcnR5IiwiZW5oYW5jZVVpSlNPTk1vZGVsIiwidWlNb2RlbCIsImxpYnJhcnkiLCJmblNldFByb3BlcnR5IiwiYXN5bmNVcGRhdGUiLCJFZGl0TW9kZSIsIkVkaXRhYmxlIiwiRGlzcGxheSIsImVuaGFuY2VWaWV3SlNPTk1vZGVsIiwidmlld01vZGVsIiwiZm5HZXRPYmplY3QiLCJfZ2V0T2JqZWN0IiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiZmlsdGVyRnVuY3Rpb25zIiwiX2ZpbHRlckZ1bmN0aW9ucyIsImluZGV4T2YiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJvTW9kZWwiLCJnZXRSb290RW50aXR5U2V0UGF0aCIsImNvbnRleHRQYXRoIiwicm9vdEVudGl0eVNldFBhdGgiLCJhUGF0aHMiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJvVmlldyIsInZMaXN0QmluZGluZyIsInNNZXRhUGF0aCIsInN0YXJ0c1dpdGgiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNSb290Q29udGV4dFBhdGgiLCJvQmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic1Jvb3RCaW5kaW5nUGF0aCIsInNSZWxhdGl2ZVBhdGgiLCJnZXREcmFmdFJvb3QiLCJnZXREcmFmdE5vZGUiLCJpc1N0aWNreSIsImdldFN0aWNreVNlc3Npb24iLCJpc1VwZGF0ZUhpZGRlbiIsImVudGl0eVR5cGUiLCJpc0VudGl0eVNldCIsIlVJIiwiVXBkYXRlSGlkZGVuIiwiZ2V0RGVsZXRlSGlkZGVuIiwiRGVsZXRlSGlkZGVuIiwiZ2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nIiwibGlzdEJpbmRpbmciLCJtZXRhbW9kZWwiLCJtZXRhUGF0aCIsInJvb3RCaW5kaW5nIiwicm9vdEJpbmRpbmdQYXRoIiwicmVsYXRpdmVQYXRoIiwiZW5oYW5jZU9EYXRhTW9kZWwiLCJvZGF0YU1vZGVsIiwiYXBwQ29tcG9uZW50IiwidmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5IiwiQXJyYXkiLCJmbk1lc3NhZ2UiLCJzZXRNZXNzYWdlcyIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwiQmluZGluZ01vZGUiLCJPbmVXYXkiLCJiYXNlU2V0UHJvcGVydHkiLCJiYXNlR2V0UHJvcGVydHkiLCJwcm9wZXJ0eU5hbWUiLCJhbm5vdGF0aW9uVHlwZSIsImlzVHJhbnNpZW50IiwiY29udGV4dE9iamVjdCIsIk1ldGFQYXRoIiwiY29udmVydFR5cGVzIiwiZXh0ZXJuYWxJZFByb3BlcnR5IiwiZ2V0TWV0YVBhdGhGb3JQYXRoIiwiZ2V0VGFyZ2V0IiwiRXh0ZXJuYWxJRCIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiZnVsbFBhdGgiLCJfcmVmcmVzaExvY2FsTW9kZWwiLCJyZWZyZXNoIiwiZXh0ZXJuYWxJZFByb3BQYXRoIiwicHJvcGVydGllc1RvUmVxdWVzdCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwidGV4dFByb3BlcnR5IiwiVGV4dCIsInRleHRQcm9wUGF0aCIsImluY2x1ZGVzIiwicHVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInRoZW4iLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicGF0aEZyb21Sb290IiwiY2xlYXJBbm5vdGF0aW9uVHlwZSIsImFubm90YXRpb25UeXBlcyIsImRhdGFTZXQiLCJpc0NvbnRleHQiLCJpc0EiLCJlbmRzV2l0aCIsIl9sb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwibWVzc2FnZXMiLCJjbGVhbmVkRGF0YSIsImdldERhdGEiLCJzZXREYXRhIiwibWVzc2FnZVRhcmdldCIsImdldFR5cGUiLCJnZXRNZXNzYWdlIiwiZm5CaW5kUHJvcGVydHkiLCJiaW5kUHJvcGVydHkiLCJiaW5kIiwicGFyYW1ldGVycyIsInJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJEaXNhYmxlSW5wdXRBc3Npc3RhbmNlIiwicmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmciLCJpbnRlcm5hbElkQmluZGluZyIsImV4dGVybmFsSWRCaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwicmVxdWVzdFZhbHVlIiwicHJvcEJpbmRpbmciLCJ1cGRhdGVSZXF1aXJlZCIsImV4cHJlc3Npb24iLCJnZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24iLCJnaG9zdENvbnRyb2wiLCJBbnkiLCJhbnkiLCJjb21waWxlRXhwcmVzc2lvbiIsImJpbmRCYWNrUHJvcGVydHkiLCJmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmciLCJkZXN0cm95IiwiZm5TZXRDb250ZXh0Iiwic2V0Q29udGV4dCIsIm5ld0NvbnRleHQiLCJzZXRCaW5kaW5nQ29udGV4dCIsInNldE1vZGVsIiwiZ2hvc3RCaW5kaW5nIiwiZ2V0QmluZGluZ0luZm8iLCJiaW5kaW5nIiwiZm5DaGVja1VwZGF0ZSIsImNoZWNrVXBkYXRlIiwiZm5EZXN0cm95IiwidnBCaW5kaW5nIiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsInRhcmdldEVudGl0eVR5cGUiLCJNZXNzYWdlcyIsInJlY29tbWVuZGF0aW9uYmluZGluZyIsInNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyIsIm9kYXRhUHJvcGVydHlCaW5kaW5nIiwicmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkiLCJpc1JlY29tbWVuZGVkUHJvcGVydHkiLCJ2YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgiLCJhbHJlYWR5Qm91bmQiLCJleGlzdGluZ0JpbmRpbmciLCJzZXRUeXBlIiwiUmF3Iiwic2V0QmluZGluZ01vZGUiLCJldmVudCIsInByb3BlcnR5QmluZGluZyIsImdldFNvdXJjZSIsImN1cnJlbnRDb250ZXh0IiwiY29udGV4dFJlY29tbWVuZGF0aW9ucyIsImdldFZhbHVlIiwic2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbCIsImJpbmRpbmdQYXRoIiwiY29udGV4dE1ldGFQYXRoIiwiUmVjb21tZW5kYXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnR5IiwibmFtZSIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJyZWNvbW1lbmRlZFByb3BlcnR5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbnMiLCJsb2NhbE1vZGVsUGF0aCIsInR5cGVBaGVhZFZhbHVlcyIsInByb3BlcnR5UmVjb21tZW5kYXRpb24iLCJSZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uIiwicGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoIiwicGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoIiwiUmVjb21tZW5kZWRGaWVsZFZhbHVlIiwiUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImFsdGVybmF0ZUtleXMiLCJfZmV0Y2hBbHRlcm5hdGVLZXlzIiwiZW50aXR5VHlwZU9yU2V0IiwiQ29yZSIsIkFsdGVybmF0ZUtleXMiLCJmb3JFYWNoIiwiYWx0ZXJuYXRlS2V5IiwiS2V5Iiwia2V5IiwiTmFtZSIsIl9mZXRjaFNlY29uZGFyeUtleXMiLCJlVCIsIlNlY29uZGFyeUtleSIsInNlY29uZGFyeUtleSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTW9kZWxIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIHRvIGJlIHVzZWQgYXQgcnVudGltZSB0byByZXRyaWV2ZSBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbCAqL1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4VHlwZSwgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoLCBTaW5nbGV0b24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnROb2RlLCBEcmFmdFJvb3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBBbHRlcm5hdGVLZXksIFByb3BlcnR5UmVmIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1Nlc3Npb25cIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlfRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IEFueSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQW55XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IE1ldGFQYXRoIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFQYXRoXCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCwgaXNOYXZpZ2F0aW9uUHJvcGVydHksIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgUmF3IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9SYXdcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT0RhdGFMaXN0QmluZGluZyB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuXG4vLyBUT0RPOiBSaWdodCBub3cgcmVjb21tZW5kYXRpb25zIGlzIG5vdCBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5LlxuLy8gaGVuY2Ugd2UgYXJlIGFkZGluZyBpdCB0byB0aGUgdHlwZS5cbi8vIG9uY2UgdGhpcyBiZWNvbWVzIHBhcnQgb2YgdGhlIFVJIHZvY2FidWxhcnkgdGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMuXG5leHBvcnQgdHlwZSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUlfV2l0aF9SZWNvbW1lbmRhdGlvbnMgPSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgJiB7XG5cdFJlY29tbWVuZGF0aW9ucz86IHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdH07XG59O1xuXG5jb25zdCBNb2RlbEhlbHBlciA9IHtcblx0Ly8gZ2xvYmFsIHN3aXRjaCB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGJ5IGEgcHJpdmF0ZSBtYW5pZmVzdCBmbGFnXG5cdC8vIHRoaXMgYWxsb3dzIGN1c3RvbWVycyB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGluIGNhc2Ugd2UgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGZpcnN0IGRlbGl2ZXJ5XG5cdC8vIHRoaXMgd2lsbCBiZSByZW1vdmVkIHdpdGggdGhlIG5leHQgUy80IHJlbGVhc2Vcblx0ZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdDogZmFsc2UsXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBzdGlja3kuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNb2RlbE1ldGFNb2RlbCB0byBjaGVjayBmb3Igc3RpY2t5IGVuYWJsZWQgZW50aXR5XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBzdGlja3ksIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBib29sZWFuIHtcblx0XHRjb25zdCBlbnRpdHlDb250YWluZXIgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGVudGl0eVNldE5hbWUgaW4gZW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVudGl0eUNvbnRhaW5lcltlbnRpdHlTZXROYW1lXS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlTZXROYW1lfUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRgKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHByb2dyYW1taW5nIG1vZGVsIGlzIGRyYWZ0LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0gcGF0aCBQYXRoIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGRyYWZ0LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc0RyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KG1ldGFDb250ZXh0KTtcblx0XHRyZXR1cm4gdGhpcy5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChvYmplY3RQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGRyYWZ0IGlzIHN1cHBvcnRlZCBmb3IgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzdXBwb3J0ZWRcblx0ICovXG5cdGlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAoZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCA9XG5cdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eShkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiZcblx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Py5jb250YWluc1RhcmdldCAmJlxuXHRcdFx0KChkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUpXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGUgfHwgKCFjdXJyZW50RW50aXR5U2V0ICYmIGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQpO1xuXHR9LFxuXG5cdGlzTWV0YVBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IE1ldGFQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGguZ2V0Q2xvc2VzdEVudGl0eVNldCgpIGFzIEVudGl0eVNldDtcblx0XHRjb25zdCBiSXNEcmFmdFJvb3QgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KTtcblx0XHRjb25zdCBiSXNEcmFmdE5vZGUgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjdXJyZW50RW50aXR5U2V0KTtcblx0XHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgU2hhcmVBY3Rpb24gaW4gYW55IEVudGl0eVNldCBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYW5ub3RhdGlvbiBleGlzdHMuIEZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkRnJvbUNvbnZlcnRlckNvbnRleHQoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlZFR5cGVzKCkuZW50aXR5U2V0cy5zb21lKChlbnRpdHlTZXQpID0+IHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5TaGFyZUFjdGlvbiAhPT0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzZXJ2aWNlLCBzdXBwb3J0cyBjb2xsYWJvcmF0aW9uIGRyYWZ0LlxuXHQgKiBAcGFyYW0gbWV0YU9iamVjdCBNZXRhT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGRldGVybWluYXRpb25cblx0ICogQHBhcmFtIHRlbXBsYXRlSW50ZXJmYWNlIEFQSSBwcm92aWRlZCBieSBVSTUgdGVtcGxhdGluZyBpZiB1c2VkXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUludGVyZmFjZS5jb250ZXh0IENvbnRleHQgb2YgdGhlIHRlbXBsYXRlXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmljZSBzdXBwb3J0cyBjb2xsYWJvcmF0aW9uIGRyYWZ0LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFPYmplY3Q6IHVua25vd24sIHRlbXBsYXRlSW50ZXJmYWNlPzogeyBjb250ZXh0OiBDb250ZXh0IH0pOiBib29sZWFuIHtcblx0XHRpZiAoIU1vZGVsSGVscGVyLmRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQpIHtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSAodGVtcGxhdGVJbnRlcmZhY2U/LmNvbnRleHQ/LmdldE1vZGVsKCkgfHwgbWV0YU9iamVjdCkgYXMgT0RhdGFNZXRhTW9kZWwgJiB7XG5cdFx0XHRcdF9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHRpZiAob01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsLl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRcdGZvciAoY29uc3Qgc0VudGl0eVNldCBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRW50aXR5Q29udGFpbmVyW3NFbnRpdHlTZXRdLiRraW5kID09PSBcIkVudGl0eVNldFwiICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NFbnRpdHlTZXR9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvU2hhcmVBY3Rpb25gKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvTWV0YU1vZGVsLl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHBhdGggb2YgdGhlIERyYWZ0Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkcmFmdFJvb3QgZW50aXR5LCBvciB1bmRlZmluZWQgaWYgbm8gZHJhZnRSb290IGlzIGZvdW5kXG5cdCAqL1xuXHRnZXREcmFmdFJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmICgobURhdGFNb2RlbC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IHBhdGggYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgT2RhdGFNb2RlbCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIFN0aWNreVJvb3QgZW50aXR5LCBvciB1bmRlZmluZWQgaWYgbm8gU3RpY2t5Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0U3RpY2t5Um9vdFBhdGg6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZ2V0Um9vdFBhdGggPSBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIGZpcnN0SXRlcmF0aW9uID0gdHJ1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRjb25zdCBzSXRlcmF0aW9uUGF0aCA9IGZpcnN0SXRlcmF0aW9uID8gc1BhdGggOiBuZXcgUmVnRXhwKC8uKig/PVxcLykvKS5leGVjKHNQYXRoKT8uWzBdOyAvLyAqUmVnZXggdG8gZ2V0IHRoZSBhbmNlc3RvclxuXHRcdFx0aWYgKHNJdGVyYXRpb25QYXRoICYmIHNJdGVyYXRpb25QYXRoICE9PSBcIi9cIikge1xuXHRcdFx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc0l0ZXJhdGlvblBhdGgpO1xuXHRcdFx0XHRjb25zdCBtRGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvTWV0YU1vZGVsLmdldENvbnRleHQoc0VudGl0eVBhdGgpKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG1EYXRhTW9kZWwuc3RhcnRpbmdFbnRpdHlTZXQgPT09IG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0ICYmXG5cdFx0XHRcdFx0KG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiBzSXRlcmF0aW9uUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgoc0l0ZXJhdGlvblBhdGgsIG1vZGVsLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH07XG5cdFx0cmV0dXJuIGdldFJvb3RQYXRoKG9Db250ZXh0LmdldFBhdGgoKSwgb0NvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgZW50aXR5IHNldCB3aXRoIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSB0YXJnZXQgZW50aXR5IHNldCB3aWxsIGJlIGRldGVybWluZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXRcblx0ICovXG5cdGdldFRhcmdldEVudGl0eVNldDogZnVuY3Rpb24gKG9Db250ZXh0OiBCYXNlQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHxcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkFjdGlvblwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIwLyRraW5kXCIpID09PSBcIkFjdGlvblwiXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzUGF0aCk7XG5cdFx0cmV0dXJuIGAvJHtvQ29udGV4dC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGgpfWA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldCB2aWEgdXNpbmcgbmF2aWdhdGlvbiBwcm9wZXJ0eSBiaW5kaW5nLiBOb3RlOiBUbyBiZSB1c2VkIG9ubHkgYWZ0ZXIgdGhlIG1ldGFtb2RlbCBoYXMgbG9hZGVkLlxuXHQgKiBAcGFyYW0gcGF0aCBQYXRoIGZvciB3aGljaCBjb21wbGV0ZSBlbnRpdHlTZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGZyb20gZW50aXR5VHlwZSBwYXRoXG5cdCAqIEBwYXJhbSBvZGF0YU1ldGFNb2RlbCBNZXRhbW9kZWwgdG8gYmUgdXNlZC4oT3B0aW9uYWwgaW4gbm9ybWFsIHNjZW5hcmlvcywgYnV0IG5lZWRlZCBmb3IgcGFyYW1ldGVyaXplZCBzZXJ2aWNlIHNjZW5hcmlvcylcblx0ICogQHJldHVybnMgUmV0dXJucyBjb21wbGV0ZSBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRFbnRpdHlTZXRQYXRoOiBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBvZGF0YU1ldGFNb2RlbD86IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgZW50aXR5U2V0UGF0aCA9IFwiXCI7XG5cdFx0aWYgKCFvZGF0YU1ldGFNb2RlbCkge1xuXHRcdFx0Ly8gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gZm9yIGdldHRpbmcgZW50aXR5U2V0UGF0aCBmcm9tIGVudGl0eVR5cGVQYXRoXG5cdFx0XHRlbnRpdHlTZXRQYXRoID0gYC8ke3BhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZykuam9pbihcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy9cIil9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ2FsY3VsYXRpbmcgdGhlIGVudGl0eVNldFBhdGggZnJvbSBNZXRhTW9kZWwuXG5cdFx0XHRjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRcdFx0aWYgKHBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdGNvbnN0IGluaXRpYWxQYXRoT2JqZWN0ID0ge1xuXHRcdFx0XHRcdGdyb3dpbmdQYXRoOiBcIi9cIixcblx0XHRcdFx0XHRwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IFwiXCJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCBwYXRoT2JqZWN0ID0gcGF0aFBhcnRzLnJlZHVjZShcblx0XHRcdFx0XHQocGF0aFVuZGVyQ29uc3RydWN0aW9uOiB7IGdyb3dpbmdQYXRoOiBzdHJpbmc7IHBlbmRpbmdOYXZQcm9wQmluZGluZzogc3RyaW5nIH0sIHBhdGhQYXJ0OiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkZWxpbWl0ZXIgPSAoISFpZHggJiYgXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpIHx8IFwiXCI7XG5cdFx0XHRcdFx0XHRsZXQgeyBncm93aW5nUGF0aCwgcGVuZGluZ05hdlByb3BCaW5kaW5nIH0gPSBwYXRoVW5kZXJDb25zdHJ1Y3Rpb247XG5cdFx0XHRcdFx0XHRjb25zdCB0ZW1wUGF0aCA9IGdyb3dpbmdQYXRoICsgZGVsaW1pdGVyO1xuXHRcdFx0XHRcdFx0Y29uc3QgbmF2UHJvcEJpbmRpbmdzID0gb2RhdGFNZXRhTW9kZWwuZ2V0T2JqZWN0KHRlbXBQYXRoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5nVG9DaGVjayA9IHBlbmRpbmdOYXZQcm9wQmluZGluZyA/IGAke3BlbmRpbmdOYXZQcm9wQmluZGluZ30vJHtwYXRoUGFydH1gIDogcGF0aFBhcnQ7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncyAmJlxuXHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhuYXZQcm9wQmluZGluZ3MpLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0bmF2UHJvcEJpbmRpbmdzLmhhc093blByb3BlcnR5KG5hdlByb3BCaW5kaW5nVG9DaGVjaylcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRncm93aW5nUGF0aCA9IHRlbXBQYXRoICsgbmF2UHJvcEJpbmRpbmdUb0NoZWNrLnJlcGxhY2UoXCIvXCIsIFwiJTJGXCIpO1xuXHRcdFx0XHRcdFx0XHRwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nICs9IHBlbmRpbmdOYXZQcm9wQmluZGluZyA/IGAvJHtwYXRoUGFydH1gIDogcGF0aFBhcnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBncm93aW5nUGF0aCwgcGVuZGluZ05hdlByb3BCaW5kaW5nIH07XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRpbml0aWFsUGF0aE9iamVjdFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBwYXRoT2JqZWN0Lmdyb3dpbmdQYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoUGFydHNbMF19YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZW50aXR5U2V0UGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcGF0aCBmb3IgdGhlIGl0ZW1zIHByb3BlcnR5IG9mIE11bHRpVmFsdWVGaWVsZCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gb1BhcmFtZXRlciBBY3Rpb24gUGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbXBsZXRlIG1vZGVsIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVyc1xuXHQgKi9cblx0Z2V0QWN0aW9uUGFyYW1ldGVySXRlbXNNb2RlbFBhdGg6IGZ1bmN0aW9uIChvUGFyYW1ldGVyOiBNZXRhTW9kZWxBY3Rpb25QYXJhbWV0ZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBvUGFyYW1ldGVyICYmIG9QYXJhbWV0ZXIuJE5hbWUgPyBge3BhdGg6ICdtdmZ2aWV3Pi8ke29QYXJhbWV0ZXIuJE5hbWV9J31gIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdGZpbHRlck91dE5hdlByb3BCaW5kaW5nOiBmdW5jdGlvbiAoc1BhdGhQYXJ0OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc1BhdGhQYXJ0ICE9PSBcIlwiICYmIHNQYXRoUGFydCAhPT0gXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgc2V0UHJvcGVydHkgdG8gdGhlIGNyZWF0ZWQgYmluZGluZyBjb250ZXh0cyBvZiB0aGUgaW50ZXJuYWwgSlNPTiBtb2RlbC5cblx0ICogQHBhcmFtIEludGVybmFsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICovXG5cblx0ZW5oYW5jZUludGVybmFsSlNPTk1vZGVsOiBmdW5jdGlvbiAob0ludGVybmFsTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGNvbnN0IGZuQmluZENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dCA9IGZ1bmN0aW9uIChcblx0XHRcdHNQYXRoOiBzdHJpbmcsXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCxcblx0XHRcdG1QYXJhbWV0ZXJzOiBvYmplY3QgfCB1bmRlZmluZWQsXG5cdFx0XHRvRXZlbnRzOiBvYmplY3QgfCB1bmRlZmluZWRcblx0XHQpOiBDb250ZXh0QmluZGluZyB7XG5cdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IGZuQmluZENvbnRleHQuYXBwbHkodGhpcywgW3NQYXRoLCBjb250ZXh0LCBtUGFyYW1ldGVycywgb0V2ZW50c10pO1xuXHRcdFx0Y29uc3QgZm5HZXRCb3VuZENvbnRleHQgPSBjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQ7XG5cblx0XHRcdGNvbnRleHRCaW5kaW5nLmdldEJvdW5kQ29udGV4dCA9IGZ1bmN0aW9uICgpOiBCYXNlQ29udGV4dCB8IG51bGwge1xuXHRcdFx0XHRjb25zdCBvQm91bmRDb250ZXh0ID0gZm5HZXRCb3VuZENvbnRleHQuYXBwbHkodGhpcyk7XG5cdFx0XHRcdGlmIChvQm91bmRDb250ZXh0KSB7XG5cdFx0XHRcdFx0b0JvdW5kQ29udGV4dC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKCksIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aFNwbGl0ID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0XHRcdGxldCBwYXRoID0gdGhpcy5nZXRQYXRoKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpOyAvLyBSZW1vdmUgc2xhc2ggaWYgaXQgaXMgYXQgdGhlIGVuZFxuXHRcdFx0XHRcdFx0Ly8gbGV0J3MgZW5zdXJlIHRoYXQgc3ViIG9iamVjdHMgYXJlIGluaXRpYWxpemVkXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gYCR7cGF0aH0vJHtwcm9wZXJ0eVBhdGhTcGxpdFtpXX1gO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRNb2RlbCgpLmdldFByb3BlcnR5KHBhdGgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbml0aWFsaXplXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHBhdGgsIHt9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHByb3BlcnR5UGF0aCwgdmFsdWUsIHRoaXMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9Cb3VuZENvbnRleHQ7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIGNvbnRleHRCaW5kaW5nO1xuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaGFuZGxlciBvbiBwcm9wZXJ0eUNoYW5nZS5cblx0ICogVGhlIHByb3BlcnR5IFwiL2VkaXRNb2RlXCIgaXMgY2hhbmdlZCBhY2NvcmRpbmcgdG8gcHJvcGVydHkgJy9pc0VkaXRhYmxlJyB3aGVuIHRoaXMgbGFzdCBvbmUgaXMgc2V0XG5cdCAqIGluIG9yZGVyIHRvIGJlIGNvbXBsaWFudCB3aXRoIGZvcm1lciB2ZXJzaW9ucyB3aGVyZSBidWlsZGluZyBibG9ja3MgdXNlIHRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiXG5cdCAqIEBwYXJhbSB1aU1vZGVsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICogQHBhcmFtIGxpYnJhcnkgQ29yZSBsaWJyYXJ5IG9mIFNBUCBGaW9yaSBlbGVtZW50c1xuXHQgKi9cblxuXHRlbmhhbmNlVWlKU09OTW9kZWw6IGZ1bmN0aW9uICh1aU1vZGVsOiBKU09OTW9kZWwsIGxpYnJhcnk6IHsgRWRpdE1vZGU6IHsgRWRpdGFibGU6IHN0cmluZzsgRGlzcGxheTogc3RyaW5nIH0gfSk6IHZvaWQge1xuXHRcdGNvbnN0IGZuU2V0UHJvcGVydHkgPSB1aU1vZGVsLnNldFByb3BlcnR5O1xuXHRcdHVpTW9kZWwuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdFx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0XHR2YWx1ZTogdW5rbm93bixcblx0XHRcdGNvbnRleHQ6IEJhc2VDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdFx0YXN5bmNVcGRhdGU6IGJvb2xlYW4gfCB1bmRlZmluZWRcblx0XHQpOiBib29sZWFuIHtcblx0XHRcdGlmIChwYXRoID09PSBcIi9pc0VkaXRhYmxlXCIpIHtcblx0XHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShcIi9lZGl0TW9kZVwiLCB2YWx1ZSA/IGxpYnJhcnkuRWRpdE1vZGUuRWRpdGFibGUgOiBsaWJyYXJ5LkVkaXRNb2RlLkRpc3BsYXksIGNvbnRleHQsIGFzeW5jVXBkYXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmblNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHR9LFxuXG5cdGVuaGFuY2VWaWV3SlNPTk1vZGVsOiBmdW5jdGlvbiAodmlld01vZGVsOiBKU09OTW9kZWwgJiB7IF9nZXRPYmplY3Q6IEZ1bmN0aW9uIH0pOiB2b2lkIHtcblx0XHRjb25zdCBmbkdldE9iamVjdCA9IHZpZXdNb2RlbC5fZ2V0T2JqZWN0O1xuXHRcdHZpZXdNb2RlbC5fZ2V0T2JqZWN0ID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCk6IHVua25vd24ge1xuXHRcdFx0aWYgKHNQYXRoID09PSB1bmRlZmluZWQgfHwgc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0c1BhdGggPSBcIi9cIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbkdldE9iamVjdC5hcHBseSh0aGlzLCBbc1BhdGgsIG9Db250ZXh0XSk7XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHBhcmFtIGZpbHRlckZ1bmN0aW9ucyBGaWx0ZXIgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuXHQgKi9cblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlOiBmdW5jdGlvbiAob01ldGFNb2RlbD86IE9EYXRhTWV0YU1vZGVsLCBmaWx0ZXJGdW5jdGlvbnM/OiBGaWx0ZXJGdW5jdGlvbnMgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IF9maWx0ZXJGdW5jdGlvbnMgPSBmaWx0ZXJGdW5jdGlvbnMgPz8gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KFwiL0BPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlckZ1bmN0aW9uc1wiKTtcblxuXHRcdGlmICghX2ZpbHRlckZ1bmN0aW9ucykge1xuXHRcdFx0Ly8gaWYgbm8gZmlsdGVycyBmdW5jdGlvbiBkZWZpbmVkIGluIHNlcnZpY2UsIHdlIGFzc3VtZSB0aGF0IHRoZSBzZXJ2aWNlIGlzIGNhc2Ugc2Vuc2l0aXZlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2ZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTE7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKi9cblx0Z2V0TWV0YVBhdGhGb3JDb250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwgJiYgc1BhdGggJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBNZXRhUGF0aCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJvb3QgZW50aXR5IHNldCBwYXRoLlxuXHQgKi9cblx0Z2V0Um9vdEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgcm9vdEVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGFQYXRocyA9IGNvbnRleHRQYXRoID8gY29udGV4dFBhdGguc3BsaXQoXCIvXCIpIDogW107XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRyb290RW50aXR5U2V0UGF0aCA9IGFQYXRoc1sxXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb3RFbnRpdHlTZXRQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgbGlzdGJpbmRpbmcuXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogRkVWaWV3LCB2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdEJpbmRpbmdQYXRofS8ke3NSZWxhdGl2ZVBhdGh9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzTWV0YVBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdGlzRHJhZnRSb290OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RHJhZnRSb290KGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IG5vZGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZVxuXHQgKi9cblx0aXNEcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdE5vZGUoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RpY2t5IHNlc3Npb24gcm9vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290XG5cdCAqL1xuXHRpc1N0aWNreTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RpY2t5U2Vzc2lvbihlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgZW50aXR5IGlzIHVwZGF0YWJsZSBvciBub3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB1cGRhdGFibGUgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNVcGRhdGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFVwZGF0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnRSb290IGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdFJvb3QgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290IDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBAQ29tbW9uLkRyYWZ0Tm9kZSBhbm5vdGF0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBFbnRpdHlTZXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIERyYWZ0Um9vdFxuXHQgKi9cblx0Z2V0RHJhZnROb2RlOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogRHJhZnROb2RlIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSA/IGVudGl0eVNldC5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Tm9kZSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogSGVscGVyIG1ldGhvZCB0byBnZXQgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFNlc3Npb24gU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHQgKi9cblx0Z2V0U3RpY2t5U2Vzc2lvbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgZGVsZXRlIGJ1dHRvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGRlbGV0ZSBidXR0b24gaXMgaGlkZGVuXG5cdCAqL1xuXHRnZXREZWxldGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IERlbGV0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBtZXRhcGF0aCBmb3IgdGhlIGdpdmVuIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nLlxuXHQgKiBAcmV0dXJucyBNZXRhUGF0aFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBtZXRhUGF0aDtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0aWYgKGxpc3RCaW5kaW5nID09PSByb290QmluZGluZykge1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgcm9vdEJpbmRpbmdQYXRoID0gcm9vdEJpbmRpbmc/LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdG1ldGFQYXRoID0gbWV0YW1vZGVsLmdldE1ldGFQYXRoKGAke3Jvb3RCaW5kaW5nUGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXRhUGF0aDtcblx0fSxcblxuXHRlbmhhbmNlT0RhdGFNb2RlbChvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IHZvaWQge1xuXHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5ID0gbmV3IEFycmF5PE9EYXRhUHJvcGVydHlCaW5kaW5nPigpO1xuXHRcdGNvbnN0IGZuTWVzc2FnZSA9IG9kYXRhTW9kZWwuc2V0TWVzc2FnZXM7XG5cdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXREZWZhdWx0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRjb25zdCBiYXNlU2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHRjb25zdCBiYXNlR2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHVua25vd24ge1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblxuXHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc1RyYW5zaWVudCgpICE9PSB0cnVlICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRPYmplY3QgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoY29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0XHRvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KHByb3BlcnR5TmFtZSk/LmdldFRhcmdldCgpLmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0XHRcdFx0Py5FeHRlcm5hbElEO1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QoZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYmFzZUdldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCBjb250ZXh0XSk7XG5cdFx0fTtcblxuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZSk6IGJvb2xlYW4ge1xuXHRcdFx0bGV0IGZ1bGxQYXRoID0gcGF0aDtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGZ1bGxQYXRoID0gY29udGV4dC5nZXRQYXRoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgX3JlZnJlc2hMb2NhbE1vZGVsID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXHRcdFx0aWYgKGNvbnRleHQgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcblx0XHRcdFx0Ly8gcmVmcmVzaGluZyBFeHRlcm5hbElEIGFuZCB0ZXh0IHByb3BlcnRpZXMgKHBhdGhzIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBnZW5lcmljYWxseSlcblx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gbWV0YVBhdGguZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eU5hbWUpPy5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BQYXRoID0gZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtleHRlcm5hbElkUHJvcFBhdGguc3Vic3RyaW5nKDAsIGV4dGVybmFsSWRQcm9wUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSWRQcm9wUGF0aCk/LmdldFRhcmdldCgpLmFubm90YXRpb25zLkNvbW1vbj8uVGV4dDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGV4dFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dFByb3BQYXRoID0gdGV4dFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0XHRpZiAodGV4dFByb3BQYXRoLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9SZXF1ZXN0LnB1c2godGV4dFByb3BQYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KGNvbnRleHQgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QpXG5cdFx0XHRcdFx0XHQudGhlbihfcmVmcmVzaExvY2FsTW9kZWwpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoU3BsaXQgPSBmdWxsUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdGxldCBwYXRoRnJvbVJvb3QgPSBcIlwiO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0cGF0aEZyb21Sb290ICs9IFwiL1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhGcm9tUm9vdCArPSBwcm9wZXJ0eVBhdGhTcGxpdFtpXTtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T2JqZWN0KHBhdGhGcm9tUm9vdCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHR0aGlzLnNldFByb3BlcnR5KHBhdGhGcm9tUm9vdCwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYmFzZVNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHRcdGZ1bmN0aW9uIGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzOiBzdHJpbmdbXSwgZGF0YVNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBvYmplY3Qge1xuXHRcdFx0Zm9yIChjb25zdCBjb250ZXh0UGF0aCBpbiBkYXRhU2V0KSB7XG5cdFx0XHRcdC8vIHdlIGFkZGVkIGEgY29udGV4dCBmb3IgYWNjZXB0aW5nIHJlY29tbWVuZGF0aW9ucyBldmVudHVhbGx5LlxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IGl0ZXJhdGluZyBvdmVyIGl0IGNhdXNlIHRoZSBjb2RlIHRoZSBicmVha1xuXHRcdFx0XHQvLyBoZW5jZSB3ZSBhcmUgc2tpcHBpbmcgaXQgaGVyZS5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGRhdGFTZXQ/Lltjb250ZXh0UGF0aF0gYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGV4dCA9IGNvbnRleHQ/LmlzQT8uKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIik7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29udGV4dCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGF0YVNldFtjb250ZXh0UGF0aF0gPSBjbGVhckFubm90YXRpb25UeXBlKGFubm90YXRpb25UeXBlcywgZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0XHRcdGlmIChkYXRhU2V0W2NvbnRleHRQYXRoXSAmJiBPYmplY3Qua2V5cyhkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGFubm90YXRpb25UeXBlIG9mIGFubm90YXRpb25UeXBlcykge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0UGF0aC5lbmRzV2l0aChhbm5vdGF0aW9uVHlwZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhU2V0O1xuXHRcdH1cblx0XHRvZGF0YU1vZGVsLl9sb2NhbEFubm90YXRpb25Nb2RlbCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBmdW5jdGlvbiAoKTogSlNPTk1vZGVsIHtcblx0XHRcdHJldHVybiB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHR9O1xuXHRcdG9kYXRhTW9kZWwuc2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VbXT4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNsZWFuZWREYXRhID0gY2xlYXJBbm5vdGF0aW9uVHlwZShbXCJAJHVpNS5mZS5tZXNzYWdlVHlwZVwiLCBcIkAkdWk1LmZlLm1lc3NhZ2VUZXh0XCJdLCB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5nZXREYXRhKCkpO1xuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0RGF0YShjbGVhbmVkRGF0YSk7XG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2VUYXJnZXQgaW4gbWVzc2FnZXMpIHtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVHlwZWAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldFR5cGUoKSk7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVRleHRgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRNZXNzYWdlKCkpO1xuXHRcdFx0fVxuXHRcdFx0Zm5NZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5CaW5kUHJvcGVydHkgPSBvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuYmluZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQsIHBhcmFtZXRlcnMpOiBPRGF0YVByb3BlcnR5QmluZGluZyB7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCA9IGFwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKS5EaXNhYmxlSW5wdXRBc3Npc3RhbmNlO1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcgPSBNb2RlbEhlbHBlci5zZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmcoXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGZuQmluZFByb3BlcnR5LFxuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRyZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZFxuXHRcdFx0KTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25Qcm9wZXJ0eUJpbmRpbmcgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5lbmRzV2l0aChcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSAmJiBjb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsSWRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCk7XG5cdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2goaW50ZXJuYWxJZEJpbmRpbmcpO1xuXHRcdFx0XHRjb25zdCBleHRlcm5hbElkQmluZGluZyA9IHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyB1bmtub3duIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nO1xuXG5cdFx0XHRcdGludGVybmFsSWRCaW5kaW5nLmF0dGFjaENoYW5nZSgoKSA9PiB7XG5cdFx0XHRcdFx0ZXh0ZXJuYWxJZEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aW50ZXJuYWxJZEJpbmRpbmdcblx0XHRcdFx0XHQucmVxdWVzdFZhbHVlKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRleHRlcm5hbElkQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gZXh0ZXJuYWxJZEJpbmRpbmc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGF0aC5pbmNsdWRlcyhcIkAkdWk1LmZlLlwiKSkge1xuXHRcdFx0XHRjb25zdCBwcm9wQmluZGluZyA9IHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0KSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyAmIHtcblx0XHRcdFx0XHRzZXRDb250ZXh0PzogRnVuY3Rpb247XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BCaW5kaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByb3BCaW5kaW5nLnVwZGF0ZVJlcXVpcmVkID0gZnVuY3Rpb24gKG1vZGVsOiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gbW9kZWwgJiYgbW9kZWwgPT09IG9kYXRhTW9kZWw7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChwYXRoLmluY2x1ZGVzKFwiQCR1aTUuZmUudmlydHVhbC5cIikpIHtcblx0XHRcdFx0XHRjb25zdCBleHByZXNzaW9uID0gTWV0YU1vZGVsQ29udmVydGVyLmdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKHRoaXMuZ2V0TWV0YU1vZGVsKCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBnaG9zdENvbnRyb2wgPSBuZXcgQW55KHsgYW55OiBjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uKSwgYmluZEJhY2tQcm9wZXJ0eTogcGF0aCB9KTtcblx0XHRcdFx0XHRjb25zdCBmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmcgPSBwcm9wQmluZGluZy5kZXN0cm95LmJpbmQocHJvcEJpbmRpbmcpO1xuXHRcdFx0XHRcdHByb3BCaW5kaW5nLmRlc3Ryb3kgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRyb2w/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdHJldHVybiBmbkRlc3Ryb3lQcm9wZXJ0eUJpbmRpbmcoKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHByb3BCaW5kaW5nLnNldENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGZuU2V0Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0cHJvcEJpbmRpbmcuc2V0Q29udGV4dCA9IChuZXdDb250ZXh0OiBDb250ZXh0KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q29udHJvbD8uc2V0QmluZGluZ0NvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmblNldENvbnRleHQuYmluZChwcm9wQmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdob3N0Q29udHJvbC5zZXRNb2RlbCh0aGlzKTtcblx0XHRcdFx0XHRjb25zdCBnaG9zdEJpbmRpbmcgPSBnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0luZm8oXCJhbnlcIik/LmJpbmRpbmc7XG5cdFx0XHRcdFx0Y29uc3QgZm5DaGVja1VwZGF0ZSA9IGdob3N0QmluZGluZz8uY2hlY2tVcGRhdGU7XG5cdFx0XHRcdFx0aWYgKGZuQ2hlY2tVcGRhdGUpIHtcblx0XHRcdFx0XHRcdGdob3N0Q29udHJvbC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKS5iaW5kaW5nLmNoZWNrVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5DaGVja1VwZGF0ZS5iaW5kKGdob3N0QmluZGluZykodHJ1ZSk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRnaG9zdENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHByb3BCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZuQmluZFByb3BlcnR5KHBhdGgsIGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5EZXN0cm95ID0gb2RhdGFNb2RlbC5kZXN0cm95LmJpbmQob2RhdGFNb2RlbCk7XG5cdFx0b2RhdGFNb2RlbC5kZXN0cm95ID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0Zm9yIChjb25zdCB2cEJpbmRpbmcgb2Ygb2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkpIHtcblx0XHRcdFx0dnBCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiBmbkRlc3Ryb3kuYXBwbHkodGhpcyk7XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFJlc29sdmVzIGEgbWV0YWRhdGEgYmluZGluZyB0byBpdHMgdGV4dCwgZWl0aGVyIHVzaW5nIHRoZSBjb252ZXJ0ZXJDb250ZXh0IG9yIHRoZSBtZXRhTW9kZWwgZGlyZWN0bHkuXG5cdCAqIEBwYXJhbSBwYXRoXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVkIHRleHQgaWYgcG9zc2libGUsIGVsc2UgdGhlIGlucHV0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCB3YXMgdW5kZWZpbmVkXG5cdCAqL1xuXHRmZXRjaFRleHRGcm9tTWV0YU1vZGVsKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dD86IENvbnZlcnRlckNvbnRleHQ8dW5rbm93bj4sIG1ldGFNb2RlbD86IE1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHRleHQgPSBwYXRoICE9PSB1bmRlZmluZWQgPyBwYXRoIDogXCJcIjtcblx0XHRpZiAocGF0aD8uc3RhcnRzV2l0aChcInttZXRhTW9kZWw+XCIpKSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxQYXRoID0gcGF0aC5zdWJzdHJpbmcoMTEsIHBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udmVydGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdHRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKG1ldGFNb2RlbFBhdGgpLmFubm90YXRpb24/LnRvU3RyaW5nKCkgPz8gXCJcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0ZXh0ID0gbWV0YU1vZGVsPy5nZXRPYmplY3QobWV0YU1vZGVsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0TG9nLmluZm8oYFVuYWJsZSB0byByZXRyaWV2ZSB0ZXh0IGZyb20gbWV0YSBtb2RlbCB1c2luZyBwYXRoICR7bWV0YU1vZGVsUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRleHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgcGF0aCBjb3JyZXNwb25kaW5nIHRvIHN0YXRlIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggZm9yIHRoZSBjb250ZXh0IG9uIHdoaWNoIHdlIHdoYXQgdG8gcmV0cmVpdmUgdGhlIG1lc3NhZ2UgcGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoLCBvciB1bmRlZmluZWQgaWYgbm8gTWVzc2FnZXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkXG5cdCAqL1xuXHRnZXRNZXNzYWdlc1BhdGg6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0UGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0XHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcblx0fSxcblx0LyoqXG5cdCAqIFNldHVwIHJlY29tbWVuZGF0aW9uIGxvY2FsIGJpbmRpbmcgdG8gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWNjZXNzaWJsZSB2aWEgY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIFJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkuXG5cdCAqIE1vZGVsIGRvZXMgbm90IHByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gYmluZCB0byBjb21wbGV4IHByb3BlcnRpZXMuIEl0IGhhcyAyIG1ham9yIGxpbWl0YXRpb25zLlxuXHQgKlxuXHQgKiBJdCBvbmx5IHN1cHBvcnRzIG9uZSB0aW1lIGJpbmRpbmcgdG8gY29tcGxleCBwcm9wZXJ0aWVzLiBUaGlzIGlzIG5lZWRlZCB0byBzaG93IHVwZGF0ZWQgcmVjb21tZW5kYXRpb25zIG9uIHRoZSBVSS5cblx0ICogSXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5ncyB0byBwcm9wZXJ0aWVzIGluc2lkZSBhIGNvbXBsZXggcHJvcGVydHkgd2hpY2ggaXMgbmVlZGVkIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3b3JrYXJvdW5kIHRvIG92ZXJjb21lIHRoZSBhYm92ZSB0d28gc2hvcnQgY29taW5ncyBhbmRcblx0ICogdG8gc3VwcG9ydCBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucyBmb3IgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gb2RhdGFNb2RlbCBUaGUgb2RhdGEgbW9kZWwgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBmbkJpbmRQcm9wZXJ0eSBPcmlnaW5hbCBiaW5kIHByb3BlcnR5IG9mIHRoZSBvRGF0YU1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCBGbGFnIHdoaWNoIHRvZ2dsZXMgdGhlIHJlY29tbWVuZGF0aW9uIGZlYXR1cmVcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHRzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdGZuQmluZFByb3BlcnR5OiBGdW5jdGlvbixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQ6IGJvb2xlYW5cblx0KTogUHJvcGVydHlCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocGF0aC5pbmNsdWRlcyhcInVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIikpIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uYmluZGluZyA9IG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKS5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyA9IChvZGF0YVByb3BlcnR5QmluZGluZzogT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7IHNldENvbnRleHQ6IEZ1bmN0aW9uIH0pOiB2b2lkID0+IHtcblx0XHRcdFx0Ly93ZSBtYWtlIHN1cmUgdGhlIHBhcmVudCBjb250ZXh0IGlzIHNldCB0byB0aGUgcHJvcGVydHliaW5kaW5nXG5cdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHJlY29tbWVuZGF0aW9uYmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmc/LnNldENvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQob2RhdGFQcm9wZXJ0eUJpbmRpbmcpKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LCBpc1JlY29tbWVuZGVkUHJvcGVydHkgfSA9IE1vZGVsSGVscGVyLnZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aChcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdHBhdGhcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5ICYmIGlzUmVjb21tZW5kZWRQcm9wZXJ0eSAmJiAhcmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQpIHtcblx0XHRcdFx0XHRjb25zdCBhbHJlYWR5Qm91bmQgPSBvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5zb21lKChleGlzdGluZ0JpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgZXhpc3RzIGJ1dCB0aGUgY29udGV4dCBjYW4gYmUgZGVzdHJveWVkIHNvbWV0aW1lcyBiZWNhdXNlIG9mIGRpc2NhcmQgYW5kIGRlbGV0ZS5cblx0XHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgbmVlZCB0byBjaGVjayBpZiBjb250ZXh0IGV4aXN0cyBvciBub3QgYmVmb3JlIGRlY2lkaW5nIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGJpbmRpbmcgb3Igbm90LlxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBXZSBtaWdodCB3YW50IHRvIGNsZWFyIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHdoZW4gdGhlIGNvbnRleCBpcyBkZXN0cm95ZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0UGF0aCgpID09PSBleGlzdGluZ0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgJiZcblx0XHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFhbHJlYWR5Qm91bmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9kYXRhUHJvcGVydHlCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdFx0XHRzZXRDb250ZXh0OiBGdW5jdGlvbjtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHQvLyBCZWN1YXNlIHJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIG5vdCBhIHByaW1pdGl2ZSB0eXBlIGhlbmNlIHVzZSBhIHJhdyB0eXBlLlxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0VHlwZShuZXcgUmF3KCksIFwiYW55XCIpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2gob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgbG9jYWwgYW5ub3RhdGlvbiBiaW5kaW5nIG9uY2UgcmVjb21tZW5kYXRpb24gYmluZGluZyBpcyB1cGRhdGVkLlxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUJpbmRpbmcgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBldmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgPSBwcm9wZXJ0eUJpbmRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5zZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIHJldWVzdFZhbHVlIHdpbGwgYWRkIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSB0byB0aGUgJHNlbGVjdFxuXHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSAkc2VsZWN0IHdoZW4gY29uc3RydWN0aW5nIHRoZSBiaW5kaW5nIGF0IHZhcmlvdXMgcGxhY2VzIChmb3JtcywgdGFibGUgZXRjLilcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnJlcXVlc3RWYWx1ZSgpLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJSZWNvbW1lbmRhdGlvbnMgY291bGQgbm90IGJlIHJlc29sdmVkXCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0c2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGJpbmRpbmcgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBiaW5kaW5nIGlzIGNyZWF0ZWQgc28gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGJpbmRpbmcgY2FuIGJlIGNyZWF0ZWQuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRm9yIHRoaXMgd2UgbmVlZCB0byBvdmVycmlkZSB1cGRhdGVSZXF1aXJlZCBzbyB0aGF0IHRoZSBiaW5kaW5nIGlzIHVwZGF0ZWQgdW50aWwgaXQgaGFzIG5vdCByZWNlaXZlZCBhIGNvbnRleHRcblx0XHRcdC8vIHBvc3QgdGhhdCB3ZSBkbyBub3QgbmVlZCB0aGUgYmluZGluZyB0byBiZSB1cGRhdGVkLlxuXHRcdFx0Ly8gSWYgd2UgcmVtb3ZlIHRoZSB1cGRhdGVSZXF1aXJlZCBvdmVycmlkZSB0aGVuIHJlY29tbWVuZGF0aW9ucyB3b3JrIGZpbmUgYnkgZHVyaW5nIHNhdmUgb2YgYSBuZXdseSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyB3ZSBnZXQgYmluZGluZyByZWxhdGVkIGlzc3Vlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBVcGRhdGluZyB0aGUgYmluZGluZyB0byByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBkb25lIGJ5IHNldFByb3BlcnR5IG9uIHRoZSBsb2NhbEFubm90YXRpb25Nb2RlbFxuXHRcdFx0Ly8gd2hlbiB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgaXMgYWN0dWFsbHkgdXBkYXRlZC5cblx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldENvbnRleHQoKSA/IG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsIDogbW9kZWwgJiYgdGhpcy5nZXRNb2RlbCgpID09PSBtb2RlbDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25iaW5kaW5nO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBiYXNlZCBvbiBtZXRhZGF0YSB3aGV0aGVyIGEgZ2l2ZW4gYmluZGluZyBzaG91bGQgZGVhbCB3aXRoIHJlY29tbWVuZGF0aW9ucyBvciBub3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHBhdGggZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCBhbmQgd2hldGhlciB0aGUgYmluZGluZ1BhdGggaXMgcmVsZXZhbnQgb3Igbm90IGJhc2VkIG9uIG1ldGFkYXRhLlxuXHQgKi9cblx0dmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YmluZGluZ1BhdGg6IHN0cmluZ1xuXHQpOiB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGlzUmVjb21tZW5kZWRQcm9wZXJ0eTogYm9vbGVhbiB9IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0TWV0YVBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPSAodGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJIGFzIEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSV9XaXRoX1JlY29tbWVuZGF0aW9ucylcblx0XHRcdD8uUmVjb21tZW5kYXRpb25zPy5wYXRoO1xuXHRcdC8vIHNhbXBsZSBiaW5kaW5nIC0gU2hpcHBpbmdDb25kaXRpb25AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVxuXHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGJpbmRpbmdQYXRoLnNwbGl0KFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIpWzBdO1xuXHRcdGNvbnN0IGlzUmVjb21tZW5kZWRQcm9wZXJ0eSA9IHRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5zb21lKChlbnRpdHlQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKGVudGl0eVByb3BlcnR5Lm5hbWUgPT09IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiAoZW50aXR5UHJvcGVydHk/LnRhcmdldFR5cGUgYXMgQ29tcGxleFR5cGUpPy5wcm9wZXJ0aWVzLnNvbWUoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHkubmFtZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LFxuXHRcdFx0aXNSZWNvbW1lbmRlZFByb3BlcnR5XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFVwZGF0ZSByZWNvbW1lbmRhdGlvbiBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgVXBkYXRlZCByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjdXJyZW50Q29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIHdhcyB1cGRhdGVkLlxuXHQgKi9cblx0c2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbDogZnVuY3Rpb24gKGNvbnRleHRSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgcmVjb21tZW5kZWRQcm9wZXJ0eSBpbiBjb250ZXh0UmVjb21tZW5kYXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UmVjb21tZW5kYXRpb25zID0gY29udGV4dFJlY29tbWVuZGF0aW9uc1tyZWNvbW1lbmRlZFByb3BlcnR5XTtcblx0XHRcdFx0Y29uc3QgbG9jYWxNb2RlbFBhdGggPSByZWNvbW1lbmRlZFByb3BlcnR5O1xuXHRcdFx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IGN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgdHlwZUFoZWFkVmFsdWVzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbiBvZiBwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRJc1N1Z2dlc3Rpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoXG5cdFx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJEZXNjcmlwdGlvbkFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlckRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSxcblx0XHRcdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyRGVzY3JpcHRpb25Bbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdC8vIHNldCBwbGFjZWhvbGRlciBkZXNjcmlwdGlvbiBhbmQgdmFsdWVzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vbG9jYWxBbm5vdGF0aW9uTW9kZWwuXG5cdFx0XHRcdFx0Ly8gcHVzaCB0b3AgMyByZWNvbW1lbmRhdGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdHR5cGVBaGVhZFZhbHVlcy5wdXNoKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucyB8fCAhcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJWYWx1ZUFubm90YXRpb25QYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aChcblx0XHRcdFx0XHRcdGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGggPSBjdXJyZW50Q29udGV4dC5nZXRQYXRoKFxuXHRcdFx0XHRcdFx0bG9jYWxNb2RlbFBhdGggKyBcIkAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy5wbGFjZWhvbGRlckRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KHBsYWNlaG9sZGVyVmFsdWVBbm5vdGF0aW9uUGF0aCwgbnVsbCwgY3VycmVudENvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShwbGFjZWhvbGRlckRlc2NyaXB0aW9uQW5ub3RhdGlvblBhdGgsIFwiXCIsIGN1cnJlbnRDb250ZXh0LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQuZ2V0UGF0aChsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiKSxcblx0XHRcdFx0XHR0eXBlQWhlYWRWYWx1ZXMsXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQsXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0bG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoY3VycmVudENvbnRleHQuZ2V0UGF0aChcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKSwgY3VycmVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIFNlY29uZGFyeUtleXMgZnJvbSBlbnRpdHl0eXBlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVR5cGVcblx0ICogQHBhcmFtIGVudGl0eVNldCBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVNldFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbHRlcm5hdGUga2V5c1xuXHQgKi9cblx0Z2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5czogKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10gPT4ge1xuXHRcdGNvbnN0IGFsdGVybmF0ZUtleXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgX2ZldGNoQWx0ZXJuYXRlS2V5cyA9IChlbnRpdHlUeXBlT3JTZXQ6IEVudGl0eVNldCB8IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVudGl0eVR5cGVPclNldD8uYW5ub3RhdGlvbnM/LkNvcmU/LkFsdGVybmF0ZUtleXM/LmZvckVhY2goKGFsdGVybmF0ZUtleTogQWx0ZXJuYXRlS2V5KSA9PiB7XG5cdFx0XHRcdGFsdGVybmF0ZUtleS5LZXkuZm9yRWFjaCgoa2V5OiBQcm9wZXJ0eVJlZikgPT4ge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChrZXkuTmFtZS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBfZmV0Y2hTZWNvbmRhcnlLZXlzID0gKGVUOiBFbnRpdHlUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRlVD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2Vjb25kYXJ5S2V5Py5mb3JFYWNoKChzZWNvbmRhcnlLZXk6IFByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAoIWFsdGVybmF0ZUtleXMuaW5jbHVkZXMoc2Vjb25kYXJ5S2V5LnZhbHVlKSkge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChzZWNvbmRhcnlLZXkudmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5U2V0KTtcblx0XHRpZiAoIWFsdGVybmF0ZUtleXMubGVuZ3RoKSB7XG5cdFx0XHRfZmV0Y2hBbHRlcm5hdGVLZXlzKGVudGl0eVR5cGUpO1xuXHRcdH1cblx0XHRfZmV0Y2hTZWNvbmRhcnlLZXlzKGVudGl0eVR5cGUpO1xuXHRcdHJldHVybiBhbHRlcm5hdGVLZXlzO1xuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBb0NBO0VBQ0E7RUFDQTs7RUFPQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxTQUF5QixFQUFXO01BQ3ZFLE1BQU1DLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxTQUFTLENBQUMsR0FBRyxDQUFDO01BQ2hELEtBQUssTUFBTUMsYUFBYSxJQUFJRixlQUFlLEVBQUU7UUFDNUMsSUFDQ0EsZUFBZSxDQUFDRSxhQUFhLENBQUMsQ0FBQ0MsS0FBSyxLQUFLLFdBQVcsSUFDcERKLFNBQVMsQ0FBQ0UsU0FBUyxDQUFDLElBQUlDLGFBQWEseURBQXlELENBQUMsRUFDOUY7VUFDRCxPQUFPLElBQUk7UUFDWjtNQUNEO01BQ0EsT0FBTyxLQUFLO0lBQ2IsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDRSxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFV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RXBCLGNBQWMsRUFBRSxLQUFLLENBQUM7VUFDbEc7VUFDQWxILG9CQUFvQixDQUFDbEUsV0FBVyxDQUMvQm9MLGNBQWMsQ0FBQ2pPLE9BQU8sQ0FBQ2dQLGNBQWMsR0FBRywwQ0FBMEMsQ0FBQyxFQUNuRkMsZUFBZSxFQUNmaEIsY0FBYyxFQUNkLEtBQ0QsQ0FBQztVQUNEbEgsb0JBQW9CLENBQUNsRSxXQUFXLENBQUNvTCxjQUFjLENBQUNqTyxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFBRWlPLGNBQWMsQ0FBQztRQUNsRztNQUNEO0lBQ0QsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDdUIsNEJBQTRCLEVBQUVBLENBQUM3SixVQUFzQixFQUFFeEgsU0FBb0IsS0FBZTtNQUN6RixNQUFNc1IsYUFBdUIsR0FBRyxFQUFFO01BQ2xDLE1BQU1DLG1CQUFtQixHQUFJQyxlQUF1QyxJQUFXO1FBQzlFQSxlQUFlLEVBQUVuUyxXQUFXLEVBQUVvUyxJQUFJLEVBQUVDLGFBQWEsRUFBRUMsT0FBTyxDQUFFQyxZQUEwQixJQUFLO1VBQzFGQSxZQUFZLENBQUNDLEdBQUcsQ0FBQ0YsT0FBTyxDQUFFRyxHQUFnQixJQUFLO1lBQzlDUixhQUFhLENBQUM3RyxJQUFJLENBQUNxSCxHQUFHLENBQUNDLElBQUksQ0FBQ25OLEtBQUssQ0FBQztVQUNuQyxDQUFDLENBQUM7UUFDSCxDQUFDLENBQUM7TUFDSCxDQUFDO01BQ0QsTUFBTW9OLG1CQUFtQixHQUFJQyxFQUFjLElBQVc7UUFDckRBLEVBQUUsRUFBRTVTLFdBQVcsRUFBRUMsTUFBTSxFQUFFNFMsWUFBWSxFQUFFUCxPQUFPLENBQUVRLFlBQTBCLElBQUs7VUFDOUUsSUFBSSxDQUFDYixhQUFhLENBQUM5RyxRQUFRLENBQUMySCxZQUFZLENBQUN2TixLQUFLLENBQUMsRUFBRTtZQUNoRDBNLGFBQWEsQ0FBQzdHLElBQUksQ0FBQzBILFlBQVksQ0FBQ3ZOLEtBQUssQ0FBQztVQUN2QztRQUNELENBQUMsQ0FBQztNQUNILENBQUM7TUFDRDJNLG1CQUFtQixDQUFDdlIsU0FBUyxDQUFDO01BQzlCLElBQUksQ0FBQ3NSLGFBQWEsQ0FBQ2xRLE1BQU0sRUFBRTtRQUMxQm1RLG1CQUFtQixDQUFDL0osVUFBVSxDQUFDO01BQ2hDO01BQ0F3SyxtQkFBbUIsQ0FBQ3hLLFVBQVUsQ0FBQztNQUMvQixPQUFPOEosYUFBYTtJQUNyQjtFQUNELENBQUM7RUFBQyxPQWFhNVQsV0FBVztBQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -105,6 +105,17 @@ const ModelHelper = {
105
105
  return bIsDraftRoot || bIsDraftNode;
106
106
  },
107
107
 
108
+ /**
109
+ * Returns whether or not we have a ShareAction in any EntitySet of the application.
110
+ * @param converterContext The instance of the converter context
111
+ * @returns True if the annotation exists. False otherwise.
112
+ */
113
+ isCollaborationDraftSupportedFromConverterContext(converterContext: ConverterContext): boolean {
114
+ return converterContext.getConvertedTypes().entitySets.some((entitySet) => {
115
+ return entitySet.annotations?.Common?.DraftRoot?.ShareAction !== undefined;
116
+ });
117
+ },
118
+
108
119
  /**
109
120
  * Method to determine if the service, supports collaboration draft.
110
121
  * @param metaObject MetaObject to be used for determination
@@ -344,12 +355,12 @@ const ModelHelper = {
344
355
  * @param filterFunctions Filter functions supported by the service
345
356
  * @returns Returns 'false' if the service supports 'tolower', else 'true'
346
357
  */
347
- isFilteringCaseSensitive: function (oMetaModel?: ODataMetaModel, filterFunctions?: FilterFunctions): boolean {
358
+ isFilteringCaseSensitive: function (oMetaModel?: ODataMetaModel, filterFunctions?: FilterFunctions | string[]): boolean {
348
359
  const _filterFunctions = filterFunctions ?? oMetaModel?.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
349
360
 
350
361
  if (!_filterFunctions) {
351
- // if no filters function defined in service, tolower is supported
352
- return false;
362
+ // if no filters function defined in service, we assume that the service is case sensitive
363
+ return true;
353
364
  }
354
365
 
355
366
  return _filterFunctions.indexOf("tolower") === -1;
@@ -607,7 +618,7 @@ const ModelHelper = {
607
618
  const isContext = context?.isA?.("sap.ui.model.odata.v4.Context");
608
619
  if (typeof context === "object" && !isContext) {
609
620
  dataSet[contextPath] = clearAnnotationType(annotationTypes, dataSet[contextPath] as Record<string, unknown>);
610
- if (Object.keys(dataSet[contextPath] as object).length === 0) {
621
+ if (dataSet[contextPath] && Object.keys(dataSet[contextPath] as object).length === 0) {
611
622
  delete dataSet[contextPath];
612
623
  }
613
624
  }