@sapui5/sap.fe.core 1.141.2 → 1.142.1

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 (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -2,18 +2,22 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element", "../CommonUtils", "../templating/UIFormatters", "./BaseControllerExtension", "./collaboration/CollaborationCommon"], function (Log, ClassSupport, Element, CommonUtils, UIFormatters, BaseControllerExtension, CollaborationCommon) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/BindingHelper", "sap/ui/core/Element", "../CommonUtils", "../templating/UIFormatters", "./BaseControllerExtension", "./collaboration/CollaborationCommon"], function (Log, BindingToolkit, ClassSupport, MetaModelConverter, BindingHelper, Element, CommonUtils, UIFormatters, BaseControllerExtension, CollaborationCommon) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _class;
9
9
  var _exports = {};
10
10
  var shareObject = CollaborationCommon.shareObject;
11
11
  var addSelf = CollaborationCommon.addSelf;
12
- var CollaborationUtils = CollaborationCommon.CollaborationUtils;
13
12
  var CollaborationFieldGroupPrefix = CollaborationCommon.CollaborationFieldGroupPrefix;
14
13
  var Activity = CollaborationCommon.Activity;
15
14
  var FieldEditMode = UIFormatters.FieldEditMode;
15
+ var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
16
+ var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
16
17
  var defineUI5Class = ClassSupport.defineUI5Class;
18
+ var isPathInModelExpression = BindingToolkit.isPathInModelExpression;
19
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
20
+ var compileExpression = BindingToolkit.compileExpression;
17
21
  function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
18
22
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
19
23
  /**
@@ -217,9 +221,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
217
221
  const internalModel = this.getView().getModel("internal");
218
222
  return internalModel?.getProperty("/collaborativeDraftRootPath");
219
223
  };
220
- _proto.getDraftUserListPromise = function getDraftUserListPromise() {
224
+ _proto.getDraftShareActionOperationAvailablePromise = function getDraftShareActionOperationAvailablePromise() {
221
225
  const internalModel = this.getView().getModel("internal");
222
- return internalModel?.getProperty("/collaborativeDraftUserListPromise");
226
+ return internalModel?.getProperty("/collaborativeDraftShareActionOperationAvailablePromise");
223
227
  };
224
228
  _proto.isInitialShare = function isInitialShare() {
225
229
  const internalModel = this.getView().getModel("internal");
@@ -239,20 +243,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
239
243
  */;
240
244
  _proto.setDraftRoot = function setDraftRoot(draftRootContext, groupId) {
241
245
  const internalModel = this.getView().getModel("internal");
242
- let userListPromise;
243
- if (draftRootContext.getObject("DraftAdministrativeData/DraftAdministrativeUser") === undefined) {
244
- userListPromise = new Promise(resolve => {
245
- const draftAdminUsers = draftRootContext.getModel().bindList("DraftAdministrativeData/DraftAdministrativeUser", draftRootContext);
246
- draftAdminUsers.requestContexts().then(e => {
247
- return resolve(e.map(c => c.getObject()));
248
- }).catch(e => {
249
- Log.error("Error while loading the DraftAdministrativeUser " + e);
250
- });
251
- });
252
- } else {
253
- userListPromise = draftRootContext.requestSideEffects(["DraftAdministrativeData/DraftAdministrativeUser"], groupId).then(async () => draftRootContext.requestObject("DraftAdministrativeData/DraftAdministrativeUser"));
254
- }
255
- internalModel?.setProperty("/collaborativeDraftUserListPromise", userListPromise);
246
+ const shareActionOperationAvailablePromise = this.getShareActionOperationAvailable(draftRootContext);
247
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", shareActionOperationAvailablePromise);
256
248
  internalModel?.setProperty("/collaborativeDraftRootPath", draftRootContext.getPath());
257
249
  }
258
250
 
@@ -262,7 +254,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
262
254
  */;
263
255
  _proto.cleanDraftRoot = function cleanDraftRoot() {
264
256
  const internalModel = this.getView().getModel("internal");
265
- internalModel?.setProperty("/collaborativeDraftUserListPromise", undefined);
257
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", undefined);
266
258
  internalModel?.setProperty("/collaborativeDraftRootPath", undefined);
267
259
  }
268
260
 
@@ -278,7 +270,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
278
270
  const uiModel = this.getView().getModel("ui");
279
271
  if (isActiveEntity) {
280
272
  // We're not in a draft -> disconnect if we were connected before
281
- uiModel.setProperty("/hasCollaborationAuthorization", undefined);
273
+ uiModel.setProperty("/showCollaborationStrip", undefined);
282
274
  this.disconnect();
283
275
  return false;
284
276
  }
@@ -294,15 +286,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
294
286
  if (currentDraftRootPath !== draftRootContext.getPath()) {
295
287
  Log.error(`Unexpected path for checking collaboration authorizations: ${draftRootContext.getPath()} (expecting ${currentDraftRootPath})`);
296
288
  }
297
- const usersInvited = await this.getDraftUserListPromise();
298
289
  if (uiModel.getProperty("/hasCollaborationAuthorization") !== undefined) {
299
290
  return uiModel.getProperty("/hasCollaborationAuthorization"); // Already checked, all good
300
291
  }
301
- const me = CollaborationUtils.getMe(this.base.getAppComponent());
302
- const hasMe = usersInvited?.some(singleUser => singleUser.UserID === me.id) ?? false;
303
- uiModel.setProperty("/hasCollaborationAuthorization", hasMe);
304
- uiModel.setProperty("/showCollaborationStrip", !hasMe);
305
- if (hasMe) {
292
+ const isShareActionOperationAvailable = await this.getDraftShareActionOperationAvailablePromise();
293
+ uiModel.setProperty("/hasCollaborationAuthorization", isShareActionOperationAvailable);
294
+ uiModel.setProperty("/showCollaborationStrip", !isShareActionOperationAvailable);
295
+ if (isShareActionOperationAvailable) {
306
296
  this.connect(draftRootContext).catch(error => {
307
297
  Log.error("Error when connecting to the collaboration draft " + error);
308
298
  });
@@ -310,11 +300,53 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
310
300
  // Disconnect the websocket but keep the properties in the internal model (so don't call this.disconnect)
311
301
  this.getCollaborativeDraftService().disconnect(this.getView());
312
302
  }
313
- return hasMe;
303
+ return !!isShareActionOperationAvailable;
314
304
  } catch (err) {
315
305
  Log.error("Error while activating the collaborative draft " + err);
316
306
  return false;
317
307
  }
308
+ };
309
+ _proto.getShareActionOperationAvailableBindingExpression = function getShareActionOperationAvailableBindingExpression(draftRootContext, getODataCacheValue) {
310
+ const metaModel = draftRootContext.getModel()?.getMetaModel();
311
+ const entitySet = metaModel?.getMetaPath(draftRootContext.getPath());
312
+ const metaContext = metaModel?.getMetaContext(draftRootContext.getPath());
313
+ const objectPath = metaContext && getInvolvedDataModelObjects(metaContext);
314
+ const shareActionName = metaModel?.getObject(`${entitySet}@com.sap.vocabularies.Common.v1.DraftRoot/ShareAction`);
315
+ const action = objectPath?.convertedTypes.actions.find(action => {
316
+ return action.fullyQualifiedName.startsWith(shareActionName);
317
+ });
318
+ const bindingParameterFullName = action?.isBound ? action.parameters[0]?.fullyQualifiedName : undefined;
319
+ const bindingExpression = getExpressionFromAnnotation(action?.annotations?.Core?.OperationAvailable, [], undefined, path => bindingContextPathVisitor(path, objectPath?.convertedTypes, bindingParameterFullName));
320
+ if (getODataCacheValue) {
321
+ if (isPathInModelExpression(bindingExpression)) {
322
+ const currentContextWithCache = draftRootContext.getObject();
323
+ if (currentContextWithCache) {
324
+ if (Object.keys(currentContextWithCache).includes(bindingExpression.path)) {
325
+ return currentContextWithCache[bindingExpression.path];
326
+ }
327
+ }
328
+ return undefined;
329
+ }
330
+ } else {
331
+ return bindingExpression;
332
+ }
333
+ };
334
+ _proto.getShareActionOperationAvailable = async function getShareActionOperationAvailable(draftRootContext) {
335
+ const model = draftRootContext.getModel();
336
+ const contextPath = draftRootContext.getPath();
337
+ const bindingExpression = this.getShareActionOperationAvailableBindingExpression(draftRootContext);
338
+ const shareActionOperationAvailableExpression = compileExpression(bindingExpression);
339
+ if (shareActionOperationAvailableExpression === "undefined") {
340
+ return true;
341
+ }
342
+ if (isPathInModelExpression(bindingExpression)) {
343
+ return model.bindContext(`${contextPath}`, undefined, {
344
+ $$groupId: draftRootContext.getGroupId(),
345
+ $select: [bindingExpression.path]
346
+ }).getBoundContext().requestProperty(bindingExpression.path);
347
+ } else {
348
+ return undefined;
349
+ }
318
350
  }
319
351
 
320
352
  /**
@@ -339,10 +371,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
339
371
  if (currentDraftRootPath === draftRootContext.getPath()) {
340
372
  return; // share was already called before, we don't need to call the Share action again
341
373
  }
342
- const sharePromise = this.isInitialShare() ? shareObject(draftRootContext, undefined, draftRootContext.getGroupId()) : addSelf(draftRootContext);
374
+ const performShare = async () => this.isInitialShare() ? shareObject(draftRootContext, undefined, draftRootContext.getGroupId()) : addSelf(draftRootContext);
343
375
  this.setInitialShare(false); // Reset the initial share flag, so that we don't call the initial Share action again
344
376
  this.setDraftRoot(draftRootContext, draftRootContext.getGroupId());
345
- await sharePromise;
377
+ const cachedAvailability = this.getShareActionOperationAvailableBindingExpression(draftRootContext, true);
378
+ // Perform share unless availability is explicitly false
379
+ if (cachedAvailability === undefined || cachedAvailability === true) {
380
+ await performShare();
381
+ }
346
382
  } catch (err) {
347
383
  Log.error("Error while adding current user in the collaborative draft " + err);
348
384
  }
@@ -367,7 +403,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
367
403
  /**
368
404
  * Sends a notification to other users that property values have been changed by the current user.
369
405
  *
370
- * This notification must be sent after the changes have been sent successfully to the back-end.
406
+ * This notification must be sent after the changes have been sent successfully to the back end.
371
407
  * @param context The context for the properties
372
408
  * @param propertyNames The property name or the array of property names
373
409
  * @public
@@ -387,23 +423,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
387
423
  /**
388
424
  * Sends a notification to other users that new contexts have been created by the current user.
389
425
  *
390
- * This notification must be sent after the new contexts have been created successfully in the back-end.
391
- * @param contexts The array of newly created contexts
426
+ * This notification must be sent after the new contexts have been created successfully in the back end.
427
+ * @param contextsOrBinding The array of newly created contexts, or the binding where the contexts were created
392
428
  * @public
393
429
  * @ui5-experimental-since 1.141.0
394
430
  * @since 1.141.0
395
431
  */;
396
- _proto.sendContextsCreated = function sendContextsCreated(contexts) {
397
- this.send({
398
- action: Activity.Create,
399
- content: contexts.map(context => context.getPath())
400
- });
432
+ _proto.sendContextsCreated = function sendContextsCreated(contextsOrBinding) {
433
+ if (Array.isArray(contextsOrBinding)) {
434
+ this.send({
435
+ action: Activity.Create,
436
+ content: contextsOrBinding.map(context => context.getPath())
437
+ });
438
+ } else {
439
+ this.send({
440
+ action: Activity.Create,
441
+ content: contextsOrBinding.getResolvedPath() ?? contextsOrBinding.getPath()
442
+ });
443
+ }
401
444
  }
402
445
 
403
446
  /**
404
447
  * Sends a notification to other users that contexts have been deleted by the current user.
405
448
  *
406
- * This notification must be sent after the contexts have been deleted successfully in the back-end.
449
+ * This notification must be sent after the contexts have been deleted successfully in the back end.
407
450
  * @param contexts The array of deleted contexts
408
451
  * @public
409
452
  * @ui5-experimental-since 1.141.0
@@ -420,4 +463,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/ui/core/Element"
420
463
  _exports = CollaborativeDraft;
421
464
  return _exports;
422
465
  }, false);
423
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2xsYWJvcmF0aXZlRHJhZnQiLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfY2xhc3MiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9leHBvcnRzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJnZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlIiwiY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSIsImJhc2UiLCJnZXRBcHBDb21wb25lbnQiLCJoYW5kbGVDb250ZW50Rm9jdXNJbiIsInNvdXJjZSIsImZvY3VzRXZlbnQiLCJpc0EiLCJnZXRQYXJlbnQiLCJ0YXJnZXRPdXRzaWRlT2ZDb250cm9sRG9tUmVmIiwiZ2V0RG9tUmVmIiwiY29udGFpbnMiLCJyZWxhdGVkVGFyZ2V0IiwibGFzdEZvY3VzSWQiLCJnZXRMYXN0Rm9jdXNJZCIsImdldElkIiwiZ2V0TGFzdEZvY3VzRmllbGRHcm91cHMiLCJnZXRGaWVsZEdyb3VwSWRzIiwiam9pbiIsImxhc3RGb2N1c2VkIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwic2VuZEZvY3VzT3V0TWVzc2FnZSIsInNldExhc3RGb2N1c0luZm9ybWF0aW9uIiwic2VuZEZvY3VzSW5NZXNzYWdlIiwiaGFuZGxlQ29udGVudEZvY3VzT3V0IiwiZmllbGRHcm91cEV2ZW50IiwiY29udHJvbCIsImdldFNvdXJjZSIsImZpZWxkR3JvdXBJZHMiLCJnZXRQYXJhbWV0ZXIiLCJzb21lIiwiZ3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJDb2xsYWJvcmF0aW9uRmllbGRHcm91cFByZWZpeCIsInNvdXJjZUNvbnRyb2wiLCJjdXJyZW50Rm9jdXNlZENvbnRyb2wiLCJnZXRBY3RpdmVFbGVtZW50IiwidW5kZWZpbmVkIiwibGFzdEZvY3VzRmllbGRHcm91cHMiLCJmb2N1c2VkRmllbGQiLCJmaWVsZHBBUEkiLCJjb2xsYWJvcmF0aW9uUGF0aCIsImdldENvbGxhYm9yYXRpb25QYXRoIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiTG9jayIsImNvbnRlbnQiLCJVbmxvY2siLCJmaWVsZCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRNYWluUHJvcGVydHlSZWxhdGl2ZVBhdGgiLCJmaWVsZFdyYXBwZXIiLCJGaWVsZEVkaXRNb2RlIiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiaW5jbHVkZXMiLCJnZXRQcm9wZXJ0eSIsImdldFBhdGgiLCJrZXlwYXRoIiwiZ2V0QmluZGluZ0luZm8iLCJ0ZW1wbGF0ZSIsImdldEJpbmRpbmdQYXRoIiwicGF0aCIsIm1lc3NhZ2UiLCJnZXRWaWV3IiwiaXNDb25uZWN0ZWQiLCJjb25uZWN0IiwiZHJhZnRSb290Q29udGV4dCIsImRpc2Nvbm5lY3QiLCJ1aU1vZGVsIiwiZ2V0TW9kZWwiLCJjbGVhbkRyYWZ0Um9vdCIsInNldFByb3BlcnR5IiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsInJldGFpbkFzeW5jTWVzc2FnZXMiLCJhY3Rpdml0eVBhdGhzIiwicmVsZWFzZUFzeW5jTWVzc2FnZXMiLCJ1cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoIiwib2xkQ29udGV4dFBhdGgiLCJuZXdDb250ZXh0UGF0aCIsImdldEN1cnJlbnREcmFmdFJvb3RQYXRoIiwiaW50ZXJuYWxNb2RlbCIsImdldERyYWZ0VXNlckxpc3RQcm9taXNlIiwiaXNJbml0aWFsU2hhcmUiLCJzZXRJbml0aWFsU2hhcmUiLCJpc0luaXRpYWwiLCJzZXREcmFmdFJvb3QiLCJ1c2VyTGlzdFByb21pc2UiLCJnZXRPYmplY3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRyYWZ0QWRtaW5Vc2VycyIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImUiLCJtYXAiLCJjIiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInJlcXVlc3RPYmplY3QiLCJhY3RpdmF0ZUNvbGxhYm9yYXRpb24iLCJwYWdlQ29udGV4dCIsImlzQWN0aXZlRW50aXR5IiwiQ29tbW9uVXRpbHMiLCJmaW5kT3JDcmVhdGVSb290Q29udGV4dCIsIiQkZ3JvdXBJZCIsImdldEdyb3VwSWQiLCIkc2VsZWN0Iiwicm9vdENvbnRleHQiLCJjdXJyZW50RHJhZnRSb290UGF0aCIsInVzZXJzSW52aXRlZCIsIm1lIiwiQ29sbGFib3JhdGlvblV0aWxzIiwiZ2V0TWUiLCJoYXNNZSIsInNpbmdsZVVzZXIiLCJVc2VySUQiLCJpZCIsImVyciIsImV4ZWN1dGVTaGFyZUFjdGlvbiIsInNoYXJlUHJvbWlzZSIsInNoYXJlT2JqZWN0IiwiYWRkU2VsZiIsInNlbmRMb2NrQ2hhbmdlIiwiY29udGV4dCIsInByb3BlcnR5TmFtZSIsImlzTG9ja2VkIiwic2VuZFByb3BlcnR5VmFsdWVzQ2hhbmdlIiwicHJvcGVydHlOYW1lcyIsIkFycmF5IiwiaXNBcnJheSIsIkNoYW5nZSIsInByb3AiLCJzZW5kQ29udGV4dHNDcmVhdGVkIiwiY29udGV4dHMiLCJDcmVhdGUiLCJzZW5kQ29udGV4dHNEZWxldGVkIiwiRGVsZXRlIiwiQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbGxhYm9yYXRpdmVEcmFmdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC9mZS9tYWNyb3MvRmllbGRcIjtcbmltcG9ydCB0eXBlIEZpZWxkV3JhcHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9GaWVsZFdyYXBwZXJcIjtcbmltcG9ydCB0eXBlIFRva2VuaXplciBmcm9tIFwic2FwL20vVG9rZW5pemVyXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wkVmFsaWRhdGVGaWVsZEdyb3VwRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCIuLi9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBGaWVsZEVkaXRNb2RlIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcIi4vQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCB7IEFjdGl2aXR5LCBDb2xsYWJvcmF0aW9uRmllbGRHcm91cFByZWZpeCwgQ29sbGFib3JhdGlvblV0aWxzLCBhZGRTZWxmLCBzaGFyZU9iamVjdCB9IGZyb20gXCIuL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuXG50eXBlIERyYWZ0QWRtaW5Vc2VyID0ge1xuXHREcmFmdEVudGl0eVR5cGU6IHN0cmluZztcblx0RHJhZnRVVUlEOiBzdHJpbmc7XG5cdFVzZXJJRDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRvIGhhbmRsZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IHNjZW5hcmlvcy5cbiAqIEB1aTUtZXhwZXJpbWVudGFsLXNpbmNlIDEuMTQxLjBcbiAqIEBzaW5jZSAxLjE0MS4wXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkNvbGxhYm9yYXRpdmVEcmFmdFwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGFib3JhdGl2ZURyYWZ0IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGxhc3RGb2N1c0lkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBsYXN0Rm9jdXNGaWVsZEdyb3Vwczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSE6IENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2U7XG5cblx0cHJpdmF0ZSBnZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCk6IENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2Uge1xuXHRcdHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSA9IHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSA/PyB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpO1xuXHRcdHJldHVybiB0aGlzLmNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2U7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgd2hlbiB0aGUgZm9jdXMgaXMgc2V0IGluIHRoZSBGaWVsZCBvciBvbmUgb2YgaXRzIGNoaWxkcmVuLlxuXHQgKiBAcGFyYW0gc291cmNlXG5cdCAqIEBwYXJhbSBmb2N1c0V2ZW50XG5cdCAqL1xuXHRwdWJsaWMgaGFuZGxlQ29udGVudEZvY3VzSW4oc291cmNlOiBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCwgZm9jdXNFdmVudD86IEZvY3VzRXZlbnQpOiB2b2lkIHtcblx0XHQvLyBXZSBzZW5kIHRoZSBldmVudCBvbmx5IGlmIHRoZSBmb2N1cyB3YXMgcHJldmlvdXNseSBvdXQgb2YgdGhlIEZpZWxkXG5cdFx0aWYgKHNvdXJjZS5pc0E8VG9rZW5pemVyPihcInNhcC5tLlRva2VuaXplclwiKSkge1xuXHRcdFx0c291cmNlID0gc291cmNlLmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKSBhcyBNdWx0aVZhbHVlRmllbGQ7XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRPdXRzaWRlT2ZDb250cm9sRG9tUmVmID0gZmFsc2U7XG5cdFx0aWYgKGZvY3VzRXZlbnQpIHtcblx0XHRcdHRhcmdldE91dHNpZGVPZkNvbnRyb2xEb21SZWYgPSAhc291cmNlLmdldERvbVJlZigpPy5jb250YWlucyhmb2N1c0V2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSk7XG5cdFx0fVxuXHRcdGlmIChzb3VyY2UuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSB8fCB0YXJnZXRPdXRzaWRlT2ZDb250cm9sRG9tUmVmKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbmV3bHkgZm9jdXNlZCBGaWVsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJldmlvdXMgb25lLCBidXQgdGhleSBzaGFyZSB0aGUgc2FtZSBmaWVsZEdyb3VwSURzXG5cdFx0XHQvLyAoZS5nLiBmaWVsZHMgaW4gZGlmZmVyZW50IHJvd3MgaW4gdGhlIHNhbWUgY29sdW1uIG9mIGEgdGFibGUpXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHRoZSBmb2N1c091dCBoYW5kbGVyIHdhcyBub3QgY2FsbGVkIChiZWNhdXNlIHdlIHN0YXkgaW4gdGhlIHNhbWUgZmllbGRHcm91cElEKSwgc28gd2UgbmVlZCB0byBzZW5kIGEgZm9jdXNPdXQgZXZlbnQgbWFudWFsbHlcblx0XHRcdGNvbnN0IGxhc3RGb2N1c0lkID0gdGhpcy5nZXRMYXN0Rm9jdXNJZCgpO1xuXHRcdFx0aWYgKGxhc3RGb2N1c0lkICYmIGxhc3RGb2N1c0lkICE9PSBzb3VyY2UuZ2V0SWQoKSAmJiB0aGlzLmdldExhc3RGb2N1c0ZpZWxkR3JvdXBzKCkgPT09IHNvdXJjZS5nZXRGaWVsZEdyb3VwSWRzKCkuam9pbihcIixcIikpIHtcblx0XHRcdFx0Y29uc3QgbGFzdEZvY3VzZWQgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RGb2N1c0lkKSBhcyBGaWVsZDtcblx0XHRcdFx0dGhpcz8uc2VuZEZvY3VzT3V0TWVzc2FnZShsYXN0Rm9jdXNlZCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0TGFzdEZvY3VzSW5mb3JtYXRpb24oc291cmNlKTtcblxuXHRcdFx0dGhpcy5zZW5kRm9jdXNJbk1lc3NhZ2Uoc291cmNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgd2hlbiB0aGUgZm9jdXMgaXMgcmVtb3ZlZCBmcm9tIHRoZSBGaWVsZCBvciBvbmUgb2YgaXRzIGNoaWxkcmVuLlxuXHQgKiBAcGFyYW0gZmllbGRHcm91cEV2ZW50XG5cdCAqL1xuXHRwdWJsaWMgaGFuZGxlQ29udGVudEZvY3VzT3V0KGZpZWxkR3JvdXBFdmVudDogQ29udHJvbCRWYWxpZGF0ZUZpZWxkR3JvdXBFdmVudCk6IHZvaWQge1xuXHRcdGxldCBjb250cm9sOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCA9IGZpZWxkR3JvdXBFdmVudC5nZXRTb3VyY2UoKTtcblx0XHRpZiAoY29udHJvbC5pc0E8VG9rZW5pemVyPihcInNhcC5tLlRva2VuaXplclwiKSkge1xuXHRcdFx0Y29udHJvbCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk/LmdldFBhcmVudCgpIGFzIE11bHRpVmFsdWVGaWVsZDtcblx0XHR9XG5cdFx0aWYgKCFjb250cm9sLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdHdoaWxlIChjb250cm9sICYmICFjb250cm9sPy5pc0E8RmllbGQ+KFwic2FwLmZlLm1hY3Jvcy5GaWVsZFwiKSkge1xuXHRcdFx0XHRjb250cm9sID0gY29udHJvbD8uZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWNvbnRyb2wpIHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEdyb3VwSWRzID0gZmllbGRHcm91cEV2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIikgYXMgc3RyaW5nW107XG5cblx0XHQvLyBXZSBzZW5kIHRoZSBldmVudCBvbmx5IGlmIHRoZSB2YWxpZGF0ZWQgZmllbGRDcm91cCBjb3JyZXNwb25kcyB0byBhIGNvbGxhYm9yYXRpb24gZ3JvdXBcblx0XHRpZiAoXG5cdFx0XHRmaWVsZEdyb3VwSWRzLnNvbWUoKGdyb3VwSWQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGdyb3VwSWQuc3RhcnRzV2l0aChDb2xsYWJvcmF0aW9uRmllbGRHcm91cFByZWZpeCk7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc291cmNlQ29udHJvbDogQ29udHJvbCA9IGZpZWxkR3JvdXBFdmVudC5nZXRTb3VyY2UoKTtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSBjb250cm9sIHRoYXQgc2VudCB0aGUgZXZlbnQgc3RpbGwgaGFzIHRoZSBmb2N1cyAob3Igb25lIG9mIGl0cyBjaGlsZHJlbikuXG5cdFx0XHQvLyBUaGlzIGNvdWxkIGhhcHBlbiBlLmcuIGlmIHRoZSB1c2VyIHByZXNzZWQgPEVudGVyPiB0byB2YWxpZGF0ZSB0aGUgaW5wdXQuXG5cdFx0XHRsZXQgY3VycmVudEZvY3VzZWRDb250cm9sOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCA9IEVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0d2hpbGUgKGN1cnJlbnRGb2N1c2VkQ29udHJvbCAmJiBjdXJyZW50Rm9jdXNlZENvbnRyb2wgIT09IHNvdXJjZUNvbnRyb2wpIHtcblx0XHRcdFx0Y3VycmVudEZvY3VzZWRDb250cm9sID0gY3VycmVudEZvY3VzZWRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRGb2N1c2VkQ29udHJvbCAhPT0gc291cmNlQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgY29udHJvbCB0aGF0IHNlbnQgdGhlIGV2ZW50IGlzbid0IGZvY3VzZWQgYW55bW9yZVxuXHRcdFx0XHR0aGlzLnNlbmRGb2N1c091dE1lc3NhZ2UoY29udHJvbCk7XG5cdFx0XHRcdGlmICh0aGlzLmdldExhc3RGb2N1c0lkKCkgPT09IGNvbnRyb2wuZ2V0SWQoKSkge1xuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdEZvY3VzSW5mb3JtYXRpb24odW5kZWZpbmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgbGFzdCBmb2N1c2VkIEZpZWxkIChpZiBhbnkpLlxuXHQgKiBAcmV0dXJucyBJRFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRMYXN0Rm9jdXNJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmxhc3RGb2N1c0lkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZpZWxkZ3JvdXBzIG9mIHRoZSBsYXN0IGZvY3VzZWQgRmllbGQgKGlmIGFueSkuXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpZWxkZ3JvdXBzIHNlcGFyYXRlZCBieSAnLCdcblx0ICovXG5cdHByaXZhdGUgZ2V0TGFzdEZvY3VzRmllbGRHcm91cHMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5sYXN0Rm9jdXNGaWVsZEdyb3Vwcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgZm9jdXNlZCBGaWVsZCAoaWQgYW5kIGZpZWxkZ3JvdXBzKS5cblx0ICogQHBhcmFtIGZvY3VzZWRGaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRMYXN0Rm9jdXNJbmZvcm1hdGlvbihmb2N1c2VkRmllbGQ6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0dGhpcy5sYXN0Rm9jdXNJZCA9IGZvY3VzZWRGaWVsZD8uZ2V0SWQoKTtcblx0XHR0aGlzLmxhc3RGb2N1c0ZpZWxkR3JvdXBzID0gZm9jdXNlZEZpZWxkPy5nZXRGaWVsZEdyb3VwSWRzKCkuam9pbihcIixcIik7XG5cdH1cblxuXHQvKipcblx0ICogSWYgY29sbGFib3JhdGlvbiBpcyBlbmFibGVkLCBzZW5kIGEgTG9jayBjb2xsYWJvcmF0aW9uIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBmaWVsZHBBUElcblx0ICovXG5cdHByaXZhdGUgc2VuZEZvY3VzSW5NZXNzYWdlKGZpZWxkcEFQSTogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsYWJvcmF0aW9uUGF0aCA9IHRoaXMuZ2V0Q29sbGFib3JhdGlvblBhdGgoZmllbGRwQVBJKTtcblxuXHRcdGlmIChjb2xsYWJvcmF0aW9uUGF0aCkge1xuXHRcdFx0dGhpcy5zZW5kKHsgYWN0aW9uOiBBY3Rpdml0eS5Mb2NrLCBjb250ZW50OiBjb2xsYWJvcmF0aW9uUGF0aCB9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSWYgY29sbGFib3JhdGlvbiBpcyBlbmFibGVkLCBzZW5kIGFuIFVubG9jayBjb2xsYWJvcmF0aW9uIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBmaWVsZHBBUElcblx0ICovXG5cdHByaXZhdGUgc2VuZEZvY3VzT3V0TWVzc2FnZShmaWVsZHBBUEk6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKCFmaWVsZHBBUEkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvblBhdGggPSB0aGlzLmdldENvbGxhYm9yYXRpb25QYXRoKGZpZWxkcEFQSSk7XG5cdFx0aWYgKGNvbGxhYm9yYXRpb25QYXRoKSB7XG5cdFx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IEFjdGl2aXR5LlVubG9jaywgY29udGVudDogY29sbGFib3JhdGlvblBhdGggfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggdXNlZCB0byBzZW5kIGNvbGxhYm9yYXRpb24gbWVzc2FnZXMuXG5cdCAqIEBwYXJhbSBmaWVsZFxuXHQgKiBAcmV0dXJucyBUaGUgcGF0aCAob3IgdW5kZWZpbmVkIGlzIG5vIHZhbGlkIHBhdGggY291bGQgYmUgZm91bmQpXG5cdCAqL1xuXHRwcml2YXRlIGdldENvbGxhYm9yYXRpb25QYXRoKGZpZWxkOiBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gTm90ZTogd2Ugc2VuZCBtZXNzYWdlcyBldmVuIGlmIHRoZSBjb250ZXh0IGlzIGluYWN0aXZlIChlbXB0eSBjcmVhdGlvbiByb3dzKSxcblx0XHQvLyBvdGhlcndpc2Ugd2UgY2FuJ3QgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGxvY2tzIHdoZW4gdGhlIGNvbnRleHQgaXMgYWN0aXZhdGVkLlxuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0ID0gZmllbGQ/LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChmaWVsZC5pc0E8RmllbGQ+KFwic2FwLmZlLm1hY3Jvcy5GaWVsZFwiKSkge1xuXHRcdFx0aWYgKCFmaWVsZC5nZXRNYWluUHJvcGVydHlSZWxhdGl2ZVBhdGgoKSkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaWVsZFdyYXBwZXIgPSBmaWVsZC5jb250ZW50IGFzIEZpZWxkV3JhcHBlciB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0IVtGaWVsZEVkaXRNb2RlLkVkaXRhYmxlLCBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlRGlzcGxheSwgRmllbGRFZGl0TW9kZS5FZGl0YWJsZVJlYWRPbmx5XS5pbmNsdWRlcyhcblx0XHRcdFx0XHRmaWVsZFdyYXBwZXI/LmdldFByb3BlcnR5KFwiZWRpdE1vZGVcIilcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoZSBmaWVsZCBpcyBub3QgaW4gZWRpdCBtb2RlIC0tPiBubyBjb2xsYWJvcmF0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBgJHtiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCl9LyR7ZmllbGQuZ2V0TWFpblByb3BlcnR5UmVsYXRpdmVQYXRoKCl9YDtcblx0XHR9IGVsc2UgaWYgKGZpZWxkLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdGNvbnN0IGtleXBhdGggPSBmaWVsZC5nZXRCaW5kaW5nSW5mbyhcIml0ZW1zXCIpLnRlbXBsYXRlLmdldEJpbmRpbmdQYXRoKFwia2V5XCIpO1xuXHRcdFx0cmV0dXJuIGAke2JpbmRpbmdDb250ZXh0LmdldFBhdGgoKX0vJHtmaWVsZC5nZXRCaW5kaW5nSW5mbyhcIml0ZW1zXCIpLnBhdGh9LyR7a2V5cGF0aH1gO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZW5kKG1lc3NhZ2U6IHtcblx0XHRhY3Rpb246IEFjdGl2aXR5O1xuXHRcdGNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmc7XG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbjtcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH0pOiB2b2lkIHtcblx0XHR0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5zZW5kKHRoaXMuZ2V0VmlldygpLCBtZXNzYWdlKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGNvbm5lY3QoZHJhZnRSb290Q29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5jb25uZWN0KGRyYWZ0Um9vdENvbnRleHQsIHRoaXMuZ2V0VmlldygpIGFzIEZFVmlldyk7XG5cdH1cblxuXHRwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcblx0XHRjb25zdCB1aU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdFx0dGhpcy5jbGVhbkRyYWZ0Um9vdCgpO1xuXHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdW5kZWZpbmVkKTtcblxuXHRcdGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdHRoaXMuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkgYXMgRkVWaWV3KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwdWJsaWMgcmV0YWluQXN5bmNNZXNzYWdlcyhhY3Rpdml0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5yZXRhaW5Bc3luY01lc3NhZ2VzKHRoaXMuZ2V0VmlldygpLCBhY3Rpdml0eVBhdGhzKTtcblx0fVxuXG5cdHB1YmxpYyByZWxlYXNlQXN5bmNNZXNzYWdlcyhhY3Rpdml0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5yZWxlYXNlQXN5bmNNZXNzYWdlcyh0aGlzLmdldFZpZXcoKSwgYWN0aXZpdHlQYXRocyk7XG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlTG9ja3NGb3JDb250ZXh0UGF0aChvbGRDb250ZXh0UGF0aDogc3RyaW5nLCBuZXdDb250ZXh0UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpLnVwZGF0ZUxvY2tzRm9yQ29udGV4dFBhdGgodGhpcy5nZXRWaWV3KCksIG9sZENvbnRleHRQYXRoLCBuZXdDb250ZXh0UGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGdldEN1cnJlbnREcmFmdFJvb3RQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0cmV0dXJuIGludGVybmFsTW9kZWw/LmdldFByb3BlcnR5KFwiL2NvbGxhYm9yYXRpdmVEcmFmdFJvb3RQYXRoXCIpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREcmFmdFVzZXJMaXN0UHJvbWlzZSgpOiBQcm9taXNlPERyYWZ0QWRtaW5Vc2VyW10+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRyZXR1cm4gaW50ZXJuYWxNb2RlbD8uZ2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0VXNlckxpc3RQcm9taXNlXCIpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc0luaXRpYWxTaGFyZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRyZXR1cm4gaW50ZXJuYWxNb2RlbD8uZ2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0U2hhcmVJbml0aWFsXCIpID09PSB0cnVlO1xuXHR9XG5cblx0c2V0SW5pdGlhbFNoYXJlKGlzSW5pdGlhbDogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRpbnRlcm5hbE1vZGVsPy5zZXRQcm9wZXJ0eShcIi9jb2xsYWJvcmF0aXZlRHJhZnRTaGFyZUluaXRpYWxcIiwgaXNJbml0aWFsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBkcmFmdCByb290IGNvbnRleHQgZm9yIHRoZSBjb2xsYWJvcmF0aW9uLlxuXHQgKiBJdHMgcGF0aCBpcyBzdG9yZWQgaW4gdGhlIGludGVybmFsIG1vZGVsLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIGNoZWNrIGlmIHRoZSBjb2xsYWJvcmF0aW9uIGlzIGFjdGl2ZS5cblx0ICogSXQgYWxzbyByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgdXNlcnMgaW52aXRlZCBpbiB0aGUgZHJhZnQgYW5kIHN0b3JlcyBpdCBpbiB0aGUgaW50ZXJuYWwgbW9kZWwuXG5cdCAqIEBwYXJhbSBkcmFmdFJvb3RDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgZHJhZnQgcm9vdFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCB0byByZXF1ZXN0IHRoZSBsaXN0IG9mIHVzZXJzIGludml0ZWQgaW4gdGhlIGRyYWZ0XG5cdCAqL1xuXHRwcml2YXRlIHNldERyYWZ0Um9vdChkcmFmdFJvb3RDb250ZXh0OiBDb250ZXh0LCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0bGV0IHVzZXJMaXN0UHJvbWlzZTogUHJvbWlzZTxEcmFmdEFkbWluVXNlcltdPjtcblx0XHRpZiAoZHJhZnRSb290Q29udGV4dC5nZXRPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR1c2VyTGlzdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBkcmFmdEFkbWluVXNlcnMgPSBkcmFmdFJvb3RDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuYmluZExpc3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiLCBkcmFmdFJvb3RDb250ZXh0KTtcblx0XHRcdFx0ZHJhZnRBZG1pblVzZXJzXG5cdFx0XHRcdFx0LnJlcXVlc3RDb250ZXh0cygpXG5cdFx0XHRcdFx0LnRoZW4oKGU6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc29sdmUoZS5tYXAoKGM6IENvbnRleHQpID0+IGMuZ2V0T2JqZWN0KCkpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZTogRXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGxvYWRpbmcgdGhlIERyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyIFwiICsgZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dXNlckxpc3RQcm9taXNlID0gZHJhZnRSb290Q29udGV4dFxuXHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCJdLCBncm91cElkKVxuXHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBkcmFmdFJvb3RDb250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiKSk7XG5cdFx0fVxuXG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0VXNlckxpc3RQcm9taXNlXCIsIHVzZXJMaXN0UHJvbWlzZSk7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0Um9vdFBhdGhcIiwgZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFucyB0aGUgZHJhZnQgcm9vdCBjb250ZXh0IGFuZCB0aGUgbGlzdCBvZiB1c2VycyBpbnZpdGVkIGluIHRoZSBkcmFmdC5cblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29sbGFib3JhdGlvbiBpcyBkZWFjdGl2YXRlZCBvciB3aGVuIHRoZSBkcmFmdCByb290IGNvbnRleHQgY2hhbmdlcy5cblx0ICovXG5cdHByaXZhdGUgY2xlYW5EcmFmdFJvb3QoKTogdm9pZCB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGludGVybmFsTW9kZWw/LnNldFByb3BlcnR5KFwiL2NvbGxhYm9yYXRpdmVEcmFmdFVzZXJMaXN0UHJvbWlzZVwiLCB1bmRlZmluZWQpO1xuXHRcdGludGVybmFsTW9kZWw/LnNldFByb3BlcnR5KFwiL2NvbGxhYm9yYXRpdmVEcmFmdFJvb3RQYXRoXCIsIHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBjb2xsYWJvcmF0aW9uIGZvciB0aGUgZ2l2ZW4gcGFnZSBjb250ZXh0LlxuXHQgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBhdXRob3JpemVkIHRvIGNvbGxhYm9yYXRlIG9uIHRoZSBkcmFmdCwgYW5kIHNldHMgdGhlIGZsYWcgaW4gdGhlIFVJIG1vZGVsIGFjY29yZGluZ2x5LlxuXHQgKiBAcGFyYW0gcGFnZUNvbnRleHQgVGhlIHBhZ2UgY29udGV4dCAobm90IG5lY2Vzc2FyaWx5IGEgZHJhZnQgcm9vdClcblx0ICogQHBhcmFtIGlzQWN0aXZlRW50aXR5IElzIHRoZSBjb250ZXh0IHRoZSBhY3RpdmUgb25lIChub3QgYSBkcmFmdCk/XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHVzZXIgaXMgYXV0aG9yaXplZCB0byBjb2xsYWJvcmF0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0YXN5bmMgYWN0aXZhdGVDb2xsYWJvcmF0aW9uKHBhZ2VDb250ZXh0OiBDb250ZXh0LCBpc0FjdGl2ZUVudGl0eTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1aU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRpZiAoaXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0Ly8gV2UncmUgbm90IGluIGEgZHJhZnQgLT4gZGlzY29ubmVjdCBpZiB3ZSB3ZXJlIGNvbm5lY3RlZCBiZWZvcmVcblx0XHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShcIi9oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gQ29tbW9uVXRpbHMuZmluZE9yQ3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdHBhZ2VDb250ZXh0LFxuXHRcdFx0XHRcIkRyYWZ0XCIsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHsgJCRncm91cElkOiBwYWdlQ29udGV4dC5nZXRHcm91cElkKCksICRzZWxlY3Q6IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIiB9XG5cdFx0XHQpLnJvb3RDb250ZXh0O1xuXHRcdFx0aWYgKCFkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNvdWxkbid0IGZpbmQgZHJhZnQgcm9vdCBjb250ZXh0IGZvciBlbmFibGluZyBjb2xsYWJvcmF0aW9uXCIpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGN1cnJlbnREcmFmdFJvb3RQYXRoID0gdGhpcy5nZXRDdXJyZW50RHJhZnRSb290UGF0aCgpO1xuXHRcdFx0aWYgKGN1cnJlbnREcmFmdFJvb3RQYXRoICE9PSBkcmFmdFJvb3RDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFVuZXhwZWN0ZWQgcGF0aCBmb3IgY2hlY2tpbmcgY29sbGFib3JhdGlvbiBhdXRob3JpemF0aW9uczogJHtkcmFmdFJvb3RDb250ZXh0LmdldFBhdGgoKX0gKGV4cGVjdGluZyAke2N1cnJlbnREcmFmdFJvb3RQYXRofSlgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHVzZXJzSW52aXRlZCA9IGF3YWl0IHRoaXMuZ2V0RHJhZnRVc2VyTGlzdFByb21pc2UoKTtcblx0XHRcdGlmICh1aU1vZGVsLmdldFByb3BlcnR5KFwiL2hhc0NvbGxhYm9yYXRpb25BdXRob3JpemF0aW9uXCIpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHVpTW9kZWwuZ2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIik7IC8vIEFscmVhZHkgY2hlY2tlZCwgYWxsIGdvb2Rcblx0XHRcdH1cblx0XHRcdGNvbnN0IG1lID0gQ29sbGFib3JhdGlvblV0aWxzLmdldE1lKHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHRjb25zdCBoYXNNZSA9IHVzZXJzSW52aXRlZD8uc29tZSgoc2luZ2xlVXNlcikgPT4gc2luZ2xlVXNlci5Vc2VySUQgPT09IG1lLmlkKSA/PyBmYWxzZTtcblx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgaGFzTWUpO1xuXHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShcIi9zaG93Q29sbGFib3JhdGlvblN0cmlwXCIsICFoYXNNZSk7XG5cblx0XHRcdGlmIChoYXNNZSkge1xuXHRcdFx0XHR0aGlzLmNvbm5lY3QoZHJhZnRSb290Q29udGV4dCkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IFwiICsgZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdC8vIERpc2Nvbm5lY3QgdGhlIHdlYnNvY2tldCBidXQga2VlcCB0aGUgcHJvcGVydGllcyBpbiB0aGUgaW50ZXJuYWwgbW9kZWwgKHNvIGRvbid0IGNhbGwgdGhpcy5kaXNjb25uZWN0KVxuXHRcdFx0XHR0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5kaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpIGFzIEZFVmlldyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaGFzTWU7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBhY3RpdmF0aW5nIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IFwiICsgZXJyKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgY3VycmVudCB1c2VyIGluIHRoZSBkcmFmdCByb290IGNvbnRleHQuXG5cdCAqIEBwYXJhbSBwYWdlQ29udGV4dCBUaGUgcGFnZSBjb250ZXh0IChub3QgbmVjZXNzYXJpbHkgYSBkcmFmdCByb290KVxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVNoYXJlQWN0aW9uKHBhZ2VDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGRyYWZ0Um9vdENvbnRleHQgPSBDb21tb25VdGlscy5maW5kT3JDcmVhdGVSb290Q29udGV4dChcblx0XHRcdFx0cGFnZUNvbnRleHQsXG5cdFx0XHRcdFwiRHJhZnRcIixcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0eyAkJGdyb3VwSWQ6IHBhZ2VDb250ZXh0LmdldEdyb3VwSWQoKSwgJHNlbGVjdDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiIH1cblx0XHRcdCkucm9vdENvbnRleHQ7XG5cdFx0XHRpZiAoIWRyYWZ0Um9vdENvbnRleHQpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ291bGRuJ3QgZmluZCBkcmFmdCByb290IGNvbnRleHQgZm9yIGVuYWJsaW5nIGNvbGxhYm9yYXRpb25cIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY3VycmVudERyYWZ0Um9vdFBhdGggPSB0aGlzLmdldEN1cnJlbnREcmFmdFJvb3RQYXRoKCk7XG5cdFx0XHRpZiAoY3VycmVudERyYWZ0Um9vdFBhdGggIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50RHJhZnRSb290UGF0aCAhPT0gZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gQ29sbGFib3JhdGlvbiB3YXMgZW5hYmxlZCBvbiBhbm90aGVyIGRyYWZ0IC0tPiBkaXNjb25uZWN0IGZpcnN0XG5cdFx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3VycmVudERyYWZ0Um9vdFBhdGggPT09IGRyYWZ0Um9vdENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gc2hhcmUgd2FzIGFscmVhZHkgY2FsbGVkIGJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBTaGFyZSBhY3Rpb24gYWdhaW5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2hhcmVQcm9taXNlID0gdGhpcy5pc0luaXRpYWxTaGFyZSgpXG5cdFx0XHRcdD8gc2hhcmVPYmplY3QoZHJhZnRSb290Q29udGV4dCwgdW5kZWZpbmVkLCBkcmFmdFJvb3RDb250ZXh0LmdldEdyb3VwSWQoKSlcblx0XHRcdFx0OiBhZGRTZWxmKGRyYWZ0Um9vdENvbnRleHQpO1xuXHRcdFx0dGhpcy5zZXRJbml0aWFsU2hhcmUoZmFsc2UpOyAvLyBSZXNldCB0aGUgaW5pdGlhbCBzaGFyZSBmbGFnLCBzbyB0aGF0IHdlIGRvbid0IGNhbGwgdGhlIGluaXRpYWwgU2hhcmUgYWN0aW9uIGFnYWluXG5cdFx0XHR0aGlzLnNldERyYWZ0Um9vdChkcmFmdFJvb3RDb250ZXh0LCBkcmFmdFJvb3RDb250ZXh0LmdldEdyb3VwSWQoKSk7XG5cdFx0XHRhd2FpdCBzaGFyZVByb21pc2U7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBhZGRpbmcgY3VycmVudCB1c2VyIGluIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IFwiICsgZXJyKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgdGhhdCBhIHByb3BlcnR5IGhhcyBiZWVuIGxvY2tlZCBvciB1bmxvY2tlZCBieSB0aGUgY3VycmVudCB1c2VyLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBpc0xvY2tlZCBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBsb2NrZWQsIGZhbHNlIGlmIGl0IGlzIHVubG9ja2VkXG5cdCAqIEBwdWJsaWNcblx0ICogQHVpNS1leHBlcmltZW50YWwtc2luY2UgMS4xNDEuMFxuXHQgKiBAc2luY2UgMS4xNDEuMFxuXHQgKi9cblx0c2VuZExvY2tDaGFuZ2UoY29udGV4dDogQ29udGV4dCwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIGlzTG9ja2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5zZW5kKHsgYWN0aW9uOiBpc0xvY2tlZCA/IEFjdGl2aXR5LkxvY2sgOiBBY3Rpdml0eS5VbmxvY2ssIGNvbnRlbnQ6IGAke2NvbnRleHQuZ2V0UGF0aCgpfS8ke3Byb3BlcnR5TmFtZX1gIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIG90aGVyIHVzZXJzIHRoYXQgcHJvcGVydHkgdmFsdWVzIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBjdXJyZW50IHVzZXIuXG5cdCAqXG5cdCAqIFRoaXMgbm90aWZpY2F0aW9uIG11c3QgYmUgc2VudCBhZnRlciB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgdG8gdGhlIGJhY2stZW5kLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZXMgVGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzXG5cdCAqIEBwdWJsaWNcblx0ICogQHVpNS1leHBlcmltZW50YWwtc2luY2UgMS4xNDEuMFxuXHQgKiBAc2luY2UgMS4xNDEuMFxuXHQgKi9cblx0c2VuZFByb3BlcnR5VmFsdWVzQ2hhbmdlKGNvbnRleHQ6IENvbnRleHQsIHByb3BlcnR5TmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZXMpKSB7XG5cdFx0XHRwcm9wZXJ0eU5hbWVzID0gW3Byb3BlcnR5TmFtZXNdO1xuXHRcdH1cblx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSwgY29udGVudDogcHJvcGVydHlOYW1lcy5tYXAoKHByb3ApID0+IGAke2NvbnRleHQuZ2V0UGF0aCgpfS8ke3Byb3B9YCkgfSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgdGhhdCBuZXcgY29udGV4dHMgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cblx0ICpcblx0ICogVGhpcyBub3RpZmljYXRpb24gbXVzdCBiZSBzZW50IGFmdGVyIHRoZSBuZXcgY29udGV4dHMgaGF2ZSBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IGluIHRoZSBiYWNrLWVuZC5cblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBhcnJheSBvZiBuZXdseSBjcmVhdGVkIGNvbnRleHRzXG5cdCAqIEBwdWJsaWNcblx0ICogQHVpNS1leHBlcmltZW50YWwtc2luY2UgMS4xNDEuMFxuXHQgKiBAc2luY2UgMS4xNDEuMFxuXHQgKi9cblx0c2VuZENvbnRleHRzQ3JlYXRlZChjb250ZXh0czogQ29udGV4dFtdKTogdm9pZCB7XG5cdFx0dGhpcy5zZW5kKHsgYWN0aW9uOiBBY3Rpdml0eS5DcmVhdGUsIGNvbnRlbnQ6IGNvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIG90aGVyIHVzZXJzIHRoYXQgY29udGV4dHMgaGF2ZSBiZWVuIGRlbGV0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cblx0ICpcblx0ICogVGhpcyBub3RpZmljYXRpb24gbXVzdCBiZSBzZW50IGFmdGVyIHRoZSBjb250ZXh0cyBoYXZlIGJlZW4gZGVsZXRlZCBzdWNjZXNzZnVsbHkgaW4gdGhlIGJhY2stZW5kLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGFycmF5IG9mIGRlbGV0ZWQgY29udGV4dHNcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG5cdCAqIEBzaW5jZSAxLjE0MS4wXG5cdCAqL1xuXHRzZW5kQ29udGV4dHNEZWxldGVkKGNvbnRleHRzOiBDb250ZXh0W10pOiB2b2lkIHtcblx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IEFjdGl2aXR5LkRlbGV0ZSwgY29udGVudDogY29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgfSk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBLElBT3FCQSxrQkFBa0IsSUFBQUMsSUFBQSxHQUR0Q0MsY0FBYyxDQUFDLHFEQUFxRCxDQUFDLEVBQUFELElBQUEsQ0FBQUUsTUFBQSwwQkFBQUMscUJBQUE7SUFBQSxTQUFBSixtQkFBQTtNQUFBLE9BQUFJLHFCQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0lBQUFDLFFBQUEsR0FBQVAsa0JBQUE7SUFBQVEsY0FBQSxDQUFBUixrQkFBQSxFQUFBSSxxQkFBQTtJQUFBLElBQUFLLE1BQUEsR0FBQVQsa0JBQUEsQ0FBQVUsU0FBQTtJQUFBRCxNQUFBLENBVTdERSw0QkFBNEIsR0FBcEMsU0FBUUEsNEJBQTRCQSxDQUFBLEVBQThCO01BQ2pFLElBQUksQ0FBQ0MseUJBQXlCLEdBQUcsSUFBSSxDQUFDQSx5QkFBeUIsSUFBSSxJQUFJLENBQUNDLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUMsQ0FBQ0gsNEJBQTRCLENBQUMsQ0FBQztNQUM3SCxPQUFPLElBQUksQ0FBQ0MseUJBQXlCO0lBQ3RDOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBSCxNQUFBLENBS09NLG9CQUFvQixHQUEzQixTQUFPQSxvQkFBb0JBLENBQUNDLE1BQStCLEVBQUVDLFVBQXVCLEVBQVE7TUFDM0Y7TUFDQSxJQUFJRCxNQUFNLENBQUNFLEdBQUcsQ0FBWSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDRixNQUFNLEdBQUdBLE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUMsRUFBRUEsU0FBUyxDQUFDLENBQW9CO01BQzVEO01BQ0EsSUFBSUMsNEJBQTRCLEdBQUcsS0FBSztNQUN4QyxJQUFJSCxVQUFVLEVBQUU7UUFDZkcsNEJBQTRCLEdBQUcsQ0FBQ0osTUFBTSxDQUFDSyxTQUFTLENBQUMsQ0FBQyxFQUFFQyxRQUFRLENBQUNMLFVBQVUsQ0FBQ00sYUFBcUIsQ0FBQztNQUMvRjtNQUNBLElBQUlQLE1BQU0sQ0FBQ0UsR0FBRyxDQUFrQiw0QkFBNEIsQ0FBQyxJQUFJRSw0QkFBNEIsRUFBRTtRQUM5RjtRQUNBO1FBQ0E7UUFDQSxNQUFNSSxXQUFXLEdBQUcsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FBQztRQUN6QyxJQUFJRCxXQUFXLElBQUlBLFdBQVcsS0FBS1IsTUFBTSxDQUFDVSxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ0MsdUJBQXVCLENBQUMsQ0FBQyxLQUFLWCxNQUFNLENBQUNZLGdCQUFnQixDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQzVILE1BQU1DLFdBQVcsR0FBR0MsT0FBTyxDQUFDQyxjQUFjLENBQUNSLFdBQVcsQ0FBVTtVQUNoRSxJQUFJLEVBQUVTLG1CQUFtQixDQUFDSCxXQUFXLENBQUM7UUFDdkM7UUFFQSxJQUFJLENBQUNJLHVCQUF1QixDQUFDbEIsTUFBTSxDQUFDO1FBRXBDLElBQUksQ0FBQ21CLGtCQUFrQixDQUFDbkIsTUFBTSxDQUFDO01BQ2hDO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBUCxNQUFBLENBSU8yQixxQkFBcUIsR0FBNUIsU0FBT0EscUJBQXFCQSxDQUFDQyxlQUFnRCxFQUFRO01BQ3BGLElBQUlDLE9BQTZCLEdBQUdELGVBQWUsQ0FBQ0UsU0FBUyxDQUFDLENBQUM7TUFDL0QsSUFBSUQsT0FBTyxDQUFDcEIsR0FBRyxDQUFZLGlCQUFpQixDQUFDLEVBQUU7UUFDOUNvQixPQUFPLEdBQUdBLE9BQU8sQ0FBQ25CLFNBQVMsQ0FBQyxDQUFDLEVBQUVBLFNBQVMsQ0FBQyxDQUFvQjtNQUM5RDtNQUNBLElBQUksQ0FBQ21CLE9BQU8sQ0FBQ3BCLEdBQUcsQ0FBa0IsNEJBQTRCLENBQUMsRUFBRTtRQUNoRSxPQUFPb0IsT0FBTyxJQUFJLENBQUNBLE9BQU8sRUFBRXBCLEdBQUcsQ0FBUSxxQkFBcUIsQ0FBQyxFQUFFO1VBQzlEb0IsT0FBTyxHQUFHQSxPQUFPLEVBQUVuQixTQUFTLENBQUMsQ0FBQztRQUMvQjtRQUNBLElBQUksQ0FBQ21CLE9BQU8sRUFBRTtNQUNmO01BRUEsTUFBTUUsYUFBYSxHQUFHSCxlQUFlLENBQUNJLFlBQVksQ0FBQyxlQUFlLENBQWE7O01BRS9FO01BQ0EsSUFDQ0QsYUFBYSxDQUFDRSxJQUFJLENBQUVDLE9BQU8sSUFBSztRQUMvQixPQUFPQSxPQUFPLENBQUNDLFVBQVUsQ0FBQ0MsNkJBQTZCLENBQUM7TUFDekQsQ0FBQyxDQUFDLEVBQ0Q7UUFDRCxNQUFNQyxhQUFzQixHQUFHVCxlQUFlLENBQUNFLFNBQVMsQ0FBQyxDQUFDOztRQUUxRDtRQUNBO1FBQ0EsSUFBSVEscUJBQXVELEdBQUdoQixPQUFPLENBQUNpQixnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hGLE9BQU9ELHFCQUFxQixJQUFJQSxxQkFBcUIsS0FBS0QsYUFBYSxFQUFFO1VBQ3hFQyxxQkFBcUIsR0FBR0EscUJBQXFCLENBQUM1QixTQUFTLENBQUMsQ0FBQztRQUMxRDtRQUNBLElBQUk0QixxQkFBcUIsS0FBS0QsYUFBYSxFQUFFO1VBQzVDO1VBQ0EsSUFBSSxDQUFDYixtQkFBbUIsQ0FBQ0ssT0FBTyxDQUFDO1VBQ2pDLElBQUksSUFBSSxDQUFDYixjQUFjLENBQUMsQ0FBQyxLQUFLYSxPQUFPLENBQUNaLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDUSx1QkFBdUIsQ0FBQ2UsU0FBUyxDQUFDO1VBQ3hDO1FBQ0Q7TUFDRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBLE9BSEM7SUFBQXhDLE1BQUEsQ0FJUWdCLGNBQWMsR0FBdEIsU0FBUUEsY0FBY0EsQ0FBQSxFQUF1QjtNQUM1QyxPQUFPLElBQUksQ0FBQ0QsV0FBVztJQUN4Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUFmLE1BQUEsQ0FJUWtCLHVCQUF1QixHQUEvQixTQUFRQSx1QkFBdUJBLENBQUEsRUFBdUI7TUFDckQsT0FBTyxJQUFJLENBQUN1QixvQkFBb0I7SUFDakM7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBekMsTUFBQSxDQUlReUIsdUJBQXVCLEdBQS9CLFNBQVFBLHVCQUF1QkEsQ0FBQ2lCLFlBQWlELEVBQVE7TUFDeEYsSUFBSSxDQUFDM0IsV0FBVyxHQUFHMkIsWUFBWSxFQUFFekIsS0FBSyxDQUFDLENBQUM7TUFDeEMsSUFBSSxDQUFDd0Isb0JBQW9CLEdBQUdDLFlBQVksRUFBRXZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2RTs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUFwQixNQUFBLENBSVEwQixrQkFBa0IsR0FBMUIsU0FBUUEsa0JBQWtCQSxDQUFDaUIsU0FBa0MsRUFBUTtNQUNwRSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJLENBQUNDLG9CQUFvQixDQUFDRixTQUFTLENBQUM7TUFFOUQsSUFBSUMsaUJBQWlCLEVBQUU7UUFDdEIsSUFBSSxDQUFDRSxJQUFJLENBQUM7VUFBRUMsTUFBTSxFQUFFQyxRQUFRLENBQUNDLElBQUk7VUFBRUMsT0FBTyxFQUFFTjtRQUFrQixDQUFDLENBQUM7TUFDakU7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUE1QyxNQUFBLENBSVF3QixtQkFBbUIsR0FBM0IsU0FBUUEsbUJBQW1CQSxDQUFDbUIsU0FBOEMsRUFBUTtNQUNqRixJQUFJLENBQUNBLFNBQVMsRUFBRTtRQUNmO01BQ0Q7TUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJLENBQUNDLG9CQUFvQixDQUFDRixTQUFTLENBQUM7TUFDOUQsSUFBSUMsaUJBQWlCLEVBQUU7UUFDdEIsSUFBSSxDQUFDRSxJQUFJLENBQUM7VUFBRUMsTUFBTSxFQUFFQyxRQUFRLENBQUNHLE1BQU07VUFBRUQsT0FBTyxFQUFFTjtRQUFrQixDQUFDLENBQUM7TUFDbkU7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQTVDLE1BQUEsQ0FLUTZDLG9CQUFvQixHQUE1QixTQUFRQSxvQkFBb0JBLENBQUNPLEtBQThCLEVBQXNCO01BQ2hGO01BQ0E7TUFDQSxNQUFNQyxjQUFjLEdBQUdELEtBQUssRUFBRUUsaUJBQWlCLENBQUMsQ0FBd0I7TUFDeEUsSUFBSSxDQUFDRCxjQUFjLEVBQUU7UUFDcEI7TUFDRDtNQUNBLElBQUlELEtBQUssQ0FBQzNDLEdBQUcsQ0FBUSxxQkFBcUIsQ0FBQyxFQUFFO1FBQzVDLElBQUksQ0FBQzJDLEtBQUssQ0FBQ0csMkJBQTJCLENBQUMsQ0FBQyxFQUFFO1VBQ3pDLE9BQU9mLFNBQVM7UUFDakI7UUFFQSxNQUFNZ0IsWUFBWSxHQUFHSixLQUFLLENBQUNGLE9BQW1DO1FBQzlELElBQ0MsQ0FBQyxDQUFDTyxhQUFhLENBQUNDLFFBQVEsRUFBRUQsYUFBYSxDQUFDRSxlQUFlLEVBQUVGLGFBQWEsQ0FBQ0csZ0JBQWdCLENBQUMsQ0FBQ0MsUUFBUSxDQUNoR0wsWUFBWSxFQUFFTSxXQUFXLENBQUMsVUFBVSxDQUNyQyxDQUFDLEVBQ0E7VUFDRDtVQUNBLE9BQU90QixTQUFTO1FBQ2pCO1FBRUEsT0FBTyxHQUFHYSxjQUFjLENBQUNVLE9BQU8sQ0FBQyxDQUFDLElBQUlYLEtBQUssQ0FBQ0csMkJBQTJCLENBQUMsQ0FBQyxFQUFFO01BQzVFLENBQUMsTUFBTSxJQUFJSCxLQUFLLENBQUMzQyxHQUFHLENBQWtCLDRCQUE0QixDQUFDLEVBQUU7UUFDcEUsTUFBTXVELE9BQU8sR0FBR1osS0FBSyxDQUFDYSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUNDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUM1RSxPQUFPLEdBQUdkLGNBQWMsQ0FBQ1UsT0FBTyxDQUFDLENBQUMsSUFBSVgsS0FBSyxDQUFDYSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUNHLElBQUksSUFBSUosT0FBTyxFQUFFO01BQ3RGO0lBQ0QsQ0FBQztJQUFBaEUsTUFBQSxDQUVNOEMsSUFBSSxHQUFYLFNBQU9BLElBQUlBLENBQUN1QixPQU1YLEVBQVE7TUFDUixJQUFJLENBQUNuRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUM0QyxJQUFJLENBQUMsSUFBSSxDQUFDd0IsT0FBTyxDQUFDLENBQUMsRUFBRUQsT0FBTyxDQUFDO0lBQ2xFLENBQUM7SUFBQXJFLE1BQUEsQ0FFTXVFLFdBQVcsR0FBbEIsU0FBT0EsV0FBV0EsQ0FBQSxFQUFZO01BQzdCLE9BQU8sSUFBSSxDQUFDckUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDcUUsV0FBVyxDQUFDLElBQUksQ0FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUF0RSxNQUFBLENBRVl3RSxPQUFPLEdBQXBCLGVBQWFBLE9BQU9BLENBQUNDLGdCQUF5QixFQUFpQjtNQUM5RCxPQUFPLElBQUksQ0FBQ3ZFLDRCQUE0QixDQUFDLENBQUMsQ0FBQ3NFLE9BQU8sQ0FBQ0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDSCxPQUFPLENBQUMsQ0FBVyxDQUFDO0lBQy9GLENBQUM7SUFBQXRFLE1BQUEsQ0FFTTBFLFVBQVUsR0FBakIsU0FBT0EsVUFBVUEsQ0FBQSxFQUFTO01BQ3pCLE1BQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUNNLFFBQVEsQ0FBQyxJQUFJLENBQWM7TUFDMUQsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FBQztNQUNyQkYsT0FBTyxDQUFDRyxXQUFXLENBQUMsZ0NBQWdDLEVBQUV0QyxTQUFTLENBQUM7TUFFaEUsSUFBSSxJQUFJLENBQUMrQixXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ3ZCLElBQUksQ0FBQ3JFLDRCQUE0QixDQUFDLENBQUMsQ0FBQ3dFLFVBQVUsQ0FBQyxJQUFJLENBQUNKLE9BQU8sQ0FBQyxDQUFXLENBQUM7TUFDekU7SUFDRCxDQUFDO0lBQUF0RSxNQUFBLENBRU0rRSxzQkFBc0IsR0FBN0IsU0FBT0Esc0JBQXNCQSxDQUFBLEVBQVk7TUFDeEMsT0FBTyxJQUFJLENBQUM3RSw0QkFBNEIsQ0FBQyxDQUFDLENBQUM2RSxzQkFBc0IsQ0FBQyxJQUFJLENBQUNULE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUFBdEUsTUFBQSxDQUVNZ0YsbUJBQW1CLEdBQTFCLFNBQU9BLG1CQUFtQkEsQ0FBQ0MsYUFBZ0MsRUFBUTtNQUNsRSxPQUFPLElBQUksQ0FBQy9FLDRCQUE0QixDQUFDLENBQUMsQ0FBQzhFLG1CQUFtQixDQUFDLElBQUksQ0FBQ1YsT0FBTyxDQUFDLENBQUMsRUFBRVcsYUFBYSxDQUFDO0lBQzlGLENBQUM7SUFBQWpGLE1BQUEsQ0FFTWtGLG9CQUFvQixHQUEzQixTQUFPQSxvQkFBb0JBLENBQUNELGFBQWdDLEVBQVE7TUFDbkUsT0FBTyxJQUFJLENBQUMvRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUNnRixvQkFBb0IsQ0FBQyxJQUFJLENBQUNaLE9BQU8sQ0FBQyxDQUFDLEVBQUVXLGFBQWEsQ0FBQztJQUMvRixDQUFDO0lBQUFqRixNQUFBLENBRU1tRix5QkFBeUIsR0FBaEMsU0FBT0EseUJBQXlCQSxDQUFDQyxjQUFzQixFQUFFQyxjQUFzQixFQUFRO01BQ3RGLE9BQU8sSUFBSSxDQUFDbkYsNEJBQTRCLENBQUMsQ0FBQyxDQUFDaUYseUJBQXlCLENBQUMsSUFBSSxDQUFDYixPQUFPLENBQUMsQ0FBQyxFQUFFYyxjQUFjLEVBQUVDLGNBQWMsQ0FBQztJQUNySCxDQUFDO0lBQUFyRixNQUFBLENBRU9zRix1QkFBdUIsR0FBL0IsU0FBUUEsdUJBQXVCQSxDQUFBLEVBQXVCO01BQ3JELE1BQU1DLGFBQWEsR0FBRyxJQUFJLENBQUNqQixPQUFPLENBQUMsQ0FBQyxDQUFDTSxRQUFRLENBQUMsVUFBVSxDQUFDO01BQ3pELE9BQU9XLGFBQWEsRUFBRXpCLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQztJQUNqRSxDQUFDO0lBQUE5RCxNQUFBLENBRU93Rix1QkFBdUIsR0FBL0IsU0FBUUEsdUJBQXVCQSxDQUFBLEVBQTBDO01BQ3hFLE1BQU1ELGFBQWEsR0FBRyxJQUFJLENBQUNqQixPQUFPLENBQUMsQ0FBQyxDQUFDTSxRQUFRLENBQUMsVUFBVSxDQUFDO01BQ3pELE9BQU9XLGFBQWEsRUFBRXpCLFdBQVcsQ0FBQyxvQ0FBb0MsQ0FBQztJQUN4RSxDQUFDO0lBQUE5RCxNQUFBLENBRU95RixjQUFjLEdBQXRCLFNBQVFBLGNBQWNBLENBQUEsRUFBWTtNQUNqQyxNQUFNRixhQUFhLEdBQUcsSUFBSSxDQUFDakIsT0FBTyxDQUFDLENBQUMsQ0FBQ00sUUFBUSxDQUFDLFVBQVUsQ0FBQztNQUN6RCxPQUFPVyxhQUFhLEVBQUV6QixXQUFXLENBQUMsaUNBQWlDLENBQUMsS0FBSyxJQUFJO0lBQzlFLENBQUM7SUFBQTlELE1BQUEsQ0FFRDBGLGVBQWUsR0FBZixTQUFBQSxlQUFlQSxDQUFDQyxTQUFrQixFQUFRO01BQ3pDLE1BQU1KLGFBQWEsR0FBRyxJQUFJLENBQUNqQixPQUFPLENBQUMsQ0FBQyxDQUFDTSxRQUFRLENBQUMsVUFBVSxDQUFjO01BQ3RFVyxhQUFhLEVBQUVULFdBQVcsQ0FBQyxpQ0FBaUMsRUFBRWEsU0FBUyxDQUFDO0lBQ3pFOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQTNGLE1BQUEsQ0FPUTRGLFlBQVksR0FBcEIsU0FBUUEsWUFBWUEsQ0FBQ25CLGdCQUF5QixFQUFFdkMsT0FBZSxFQUFRO01BQ3RFLE1BQU1xRCxhQUFhLEdBQUcsSUFBSSxDQUFDakIsT0FBTyxDQUFDLENBQUMsQ0FBQ00sUUFBUSxDQUFDLFVBQVUsQ0FBYztNQUN0RSxJQUFJaUIsZUFBMEM7TUFDOUMsSUFBSXBCLGdCQUFnQixDQUFDcUIsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLEtBQUt0RCxTQUFTLEVBQUU7UUFDaEdxRCxlQUFlLEdBQUcsSUFBSUUsT0FBTyxDQUFFQyxPQUFPLElBQUs7VUFDMUMsTUFBTUMsZUFBZSxHQUFHeEIsZ0JBQWdCLENBQ3RDRyxRQUFRLENBQUMsQ0FBQyxDQUNWc0IsUUFBUSxDQUFDLGlEQUFpRCxFQUFFekIsZ0JBQWdCLENBQUM7VUFDL0V3QixlQUFlLENBQ2JFLGVBQWUsQ0FBQyxDQUFDLENBQ2pCQyxJQUFJLENBQUVDLENBQVksSUFBSztZQUN2QixPQUFPTCxPQUFPLENBQUNLLENBQUMsQ0FBQ0MsR0FBRyxDQUFFQyxDQUFVLElBQUtBLENBQUMsQ0FBQ1QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQ3JELENBQUMsQ0FBQyxDQUNEVSxLQUFLLENBQUVILENBQVEsSUFBSztZQUNwQkksR0FBRyxDQUFDQyxLQUFLLENBQUMsa0RBQWtELEdBQUdMLENBQUMsQ0FBQztVQUNsRSxDQUFDLENBQUM7UUFDSixDQUFDLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTlIsZUFBZSxHQUFHcEIsZ0JBQWdCLENBQ2hDa0Msa0JBQWtCLENBQUMsQ0FBQyxpREFBaUQsQ0FBQyxFQUFFekUsT0FBTyxDQUFDLENBQ2hGa0UsSUFBSSxDQUFDLFlBQVkzQixnQkFBZ0IsQ0FBQ21DLGFBQWEsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO01BQ3RHO01BRUFyQixhQUFhLEVBQUVULFdBQVcsQ0FBQyxvQ0FBb0MsRUFBRWUsZUFBZSxDQUFDO01BQ2pGTixhQUFhLEVBQUVULFdBQVcsQ0FBQyw2QkFBNkIsRUFBRUwsZ0JBQWdCLENBQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEY7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBL0QsTUFBQSxDQUlRNkUsY0FBYyxHQUF0QixTQUFRQSxjQUFjQSxDQUFBLEVBQVM7TUFDOUIsTUFBTVUsYUFBYSxHQUFHLElBQUksQ0FBQ2pCLE9BQU8sQ0FBQyxDQUFDLENBQUNNLFFBQVEsQ0FBQyxVQUFVLENBQWM7TUFDdEVXLGFBQWEsRUFBRVQsV0FBVyxDQUFDLG9DQUFvQyxFQUFFdEMsU0FBUyxDQUFDO01BQzNFK0MsYUFBYSxFQUFFVCxXQUFXLENBQUMsNkJBQTZCLEVBQUV0QyxTQUFTLENBQUM7SUFDckU7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQztJQUFBeEMsTUFBQSxDQU9NNkcscUJBQXFCLEdBQTNCLGVBQU1BLHFCQUFxQkEsQ0FBQ0MsV0FBb0IsRUFBRUMsY0FBdUIsRUFBb0I7TUFDNUYsSUFBSTtRQUNILE1BQU1wQyxPQUFPLEdBQUcsSUFBSSxDQUFDTCxPQUFPLENBQUMsQ0FBQyxDQUFDTSxRQUFRLENBQUMsSUFBSSxDQUFjO1FBQzFELElBQUltQyxjQUFjLEVBQUU7VUFDbkI7VUFDQXBDLE9BQU8sQ0FBQ0csV0FBVyxDQUFDLGdDQUFnQyxFQUFFdEMsU0FBUyxDQUFDO1VBQ2hFLElBQUksQ0FBQ2tDLFVBQVUsQ0FBQyxDQUFDO1VBQ2pCLE9BQU8sS0FBSztRQUNiO1FBRUEsTUFBTUQsZ0JBQWdCLEdBQUd1QyxXQUFXLENBQUNDLHVCQUF1QixDQUMzREgsV0FBVyxFQUNYLE9BQU8sRUFDUCxJQUFJLENBQUN4QyxPQUFPLENBQUMsQ0FBQyxFQUNkLElBQUksQ0FBQ2xFLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUMsRUFDM0I7VUFBRTZHLFNBQVMsRUFBRUosV0FBVyxDQUFDSyxVQUFVLENBQUMsQ0FBQztVQUFFQyxPQUFPLEVBQUU7UUFBa0QsQ0FDbkcsQ0FBQyxDQUFDQyxXQUFXO1FBQ2IsSUFBSSxDQUFDNUMsZ0JBQWdCLEVBQUU7VUFDdEJnQyxHQUFHLENBQUNDLEtBQUssQ0FBQyw2REFBNkQsQ0FBQztVQUN4RSxPQUFPLEtBQUs7UUFDYjtRQUVBLE1BQU1ZLG9CQUFvQixHQUFHLElBQUksQ0FBQ2hDLHVCQUF1QixDQUFDLENBQUM7UUFDM0QsSUFBSWdDLG9CQUFvQixLQUFLN0MsZ0JBQWdCLENBQUNWLE9BQU8sQ0FBQyxDQUFDLEVBQUU7VUFDeEQwQyxHQUFHLENBQUNDLEtBQUssQ0FDUiw4REFBOERqQyxnQkFBZ0IsQ0FBQ1YsT0FBTyxDQUFDLENBQUMsZUFBZXVELG9CQUFvQixHQUM1SCxDQUFDO1FBQ0Y7UUFFQSxNQUFNQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMvQix1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pELElBQUliLE9BQU8sQ0FBQ2IsV0FBVyxDQUFDLGdDQUFnQyxDQUFDLEtBQUt0QixTQUFTLEVBQUU7VUFDeEUsT0FBT21DLE9BQU8sQ0FBQ2IsV0FBVyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztRQUMvRDtRQUNBLE1BQU0wRCxFQUFFLEdBQUdDLGtCQUFrQixDQUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDdEgsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU1zSCxLQUFLLEdBQUdKLFlBQVksRUFBRXRGLElBQUksQ0FBRTJGLFVBQVUsSUFBS0EsVUFBVSxDQUFDQyxNQUFNLEtBQUtMLEVBQUUsQ0FBQ00sRUFBRSxDQUFDLElBQUksS0FBSztRQUN0Rm5ELE9BQU8sQ0FBQ0csV0FBVyxDQUFDLGdDQUFnQyxFQUFFNkMsS0FBSyxDQUFDO1FBQzVEaEQsT0FBTyxDQUFDRyxXQUFXLENBQUMseUJBQXlCLEVBQUUsQ0FBQzZDLEtBQUssQ0FBQztRQUV0RCxJQUFJQSxLQUFLLEVBQUU7VUFDVixJQUFJLENBQUNuRCxPQUFPLENBQUNDLGdCQUFnQixDQUFDLENBQUMrQixLQUFLLENBQUVFLEtBQUssSUFBSztZQUMvQ0QsR0FBRyxDQUFDQyxLQUFLLENBQUMsbURBQW1ELEdBQUdBLEtBQUssQ0FBQztVQUN2RSxDQUFDLENBQUM7UUFDSCxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNuQyxXQUFXLENBQUMsQ0FBQyxFQUFFO1VBQzlCO1VBQ0EsSUFBSSxDQUFDckUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDd0UsVUFBVSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDLENBQVcsQ0FBQztRQUN6RTtRQUNBLE9BQU9xRCxLQUFLO01BQ2IsQ0FBQyxDQUFDLE9BQU9JLEdBQUcsRUFBRTtRQUNidEIsR0FBRyxDQUFDQyxLQUFLLENBQUMsaURBQWlELEdBQUdxQixHQUFHLENBQUM7UUFDbEUsT0FBTyxLQUFLO01BQ2I7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUEvSCxNQUFBLENBSU1nSSxrQkFBa0IsR0FBeEIsZUFBTUEsa0JBQWtCQSxDQUFDbEIsV0FBb0IsRUFBaUI7TUFDN0QsSUFBSTtRQUNILE1BQU1yQyxnQkFBZ0IsR0FBR3VDLFdBQVcsQ0FBQ0MsdUJBQXVCLENBQzNESCxXQUFXLEVBQ1gsT0FBTyxFQUNQLElBQUksQ0FBQ3hDLE9BQU8sQ0FBQyxDQUFDLEVBQ2QsSUFBSSxDQUFDbEUsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQyxFQUMzQjtVQUFFNkcsU0FBUyxFQUFFSixXQUFXLENBQUNLLFVBQVUsQ0FBQyxDQUFDO1VBQUVDLE9BQU8sRUFBRTtRQUFrRCxDQUNuRyxDQUFDLENBQUNDLFdBQVc7UUFDYixJQUFJLENBQUM1QyxnQkFBZ0IsRUFBRTtVQUN0QmdDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLDZEQUE2RCxDQUFDO1VBQ3hFO1FBQ0Q7UUFFQSxNQUFNWSxvQkFBb0IsR0FBRyxJQUFJLENBQUNoQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNELElBQUlnQyxvQkFBb0IsS0FBSzlFLFNBQVMsSUFBSThFLG9CQUFvQixLQUFLN0MsZ0JBQWdCLENBQUNWLE9BQU8sQ0FBQyxDQUFDLEVBQUU7VUFDOUY7VUFDQSxJQUFJLENBQUNXLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCO1FBRUEsSUFBSTRDLG9CQUFvQixLQUFLN0MsZ0JBQWdCLENBQUNWLE9BQU8sQ0FBQyxDQUFDLEVBQUU7VUFDeEQsT0FBTyxDQUFDO1FBQ1Q7UUFFQSxNQUFNa0UsWUFBWSxHQUFHLElBQUksQ0FBQ3hDLGNBQWMsQ0FBQyxDQUFDLEdBQ3ZDeUMsV0FBVyxDQUFDekQsZ0JBQWdCLEVBQUVqQyxTQUFTLEVBQUVpQyxnQkFBZ0IsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FDdkVnQixPQUFPLENBQUMxRCxnQkFBZ0IsQ0FBQztRQUM1QixJQUFJLENBQUNpQixlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUNFLFlBQVksQ0FBQ25CLGdCQUFnQixFQUFFQSxnQkFBZ0IsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTWMsWUFBWTtNQUNuQixDQUFDLENBQUMsT0FBT0YsR0FBRyxFQUFFO1FBQ2J0QixHQUFHLENBQUNDLEtBQUssQ0FBQyw2REFBNkQsR0FBR3FCLEdBQUcsQ0FBQztNQUMvRTtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVJDO0lBQUEvSCxNQUFBLENBU0FvSSxjQUFjLEdBQWQsU0FBQUEsY0FBY0EsQ0FBQ0MsT0FBZ0IsRUFBRUMsWUFBb0IsRUFBRUMsUUFBaUIsRUFBUTtNQUMvRSxJQUFJLENBQUN6RixJQUFJLENBQUM7UUFBRUMsTUFBTSxFQUFFd0YsUUFBUSxHQUFHdkYsUUFBUSxDQUFDQyxJQUFJLEdBQUdELFFBQVEsQ0FBQ0csTUFBTTtRQUFFRCxPQUFPLEVBQUUsR0FBR21GLE9BQU8sQ0FBQ3RFLE9BQU8sQ0FBQyxDQUFDLElBQUl1RSxZQUFZO01BQUcsQ0FBQyxDQUFDO0lBQ25IOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BVEM7SUFBQXRJLE1BQUEsQ0FVQXdJLHdCQUF3QixHQUF4QixTQUFBQSx3QkFBd0JBLENBQUNILE9BQWdCLEVBQUVJLGFBQWdDLEVBQVE7TUFDbEYsSUFBSSxDQUFDQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsYUFBYSxDQUFDLEVBQUU7UUFDbENBLGFBQWEsR0FBRyxDQUFDQSxhQUFhLENBQUM7TUFDaEM7TUFDQSxJQUFJLENBQUMzRixJQUFJLENBQUM7UUFBRUMsTUFBTSxFQUFFQyxRQUFRLENBQUM0RixNQUFNO1FBQUUxRixPQUFPLEVBQUV1RixhQUFhLENBQUNuQyxHQUFHLENBQUV1QyxJQUFJLElBQUssR0FBR1IsT0FBTyxDQUFDdEUsT0FBTyxDQUFDLENBQUMsSUFBSThFLElBQUksRUFBRTtNQUFFLENBQUMsQ0FBQztJQUM3Rzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBN0ksTUFBQSxDQVNBOEksbUJBQW1CLEdBQW5CLFNBQUFBLG1CQUFtQkEsQ0FBQ0MsUUFBbUIsRUFBUTtNQUM5QyxJQUFJLENBQUNqRyxJQUFJLENBQUM7UUFBRUMsTUFBTSxFQUFFQyxRQUFRLENBQUNnRyxNQUFNO1FBQUU5RixPQUFPLEVBQUU2RixRQUFRLENBQUN6QyxHQUFHLENBQUUrQixPQUFPLElBQUtBLE9BQU8sQ0FBQ3RFLE9BQU8sQ0FBQyxDQUFDO01BQUUsQ0FBQyxDQUFDO0lBQzlGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVJDO0lBQUEvRCxNQUFBLENBU0FpSixtQkFBbUIsR0FBbkIsU0FBQUEsbUJBQW1CQSxDQUFDRixRQUFtQixFQUFRO01BQzlDLElBQUksQ0FBQ2pHLElBQUksQ0FBQztRQUFFQyxNQUFNLEVBQUVDLFFBQVEsQ0FBQ2tHLE1BQU07UUFBRWhHLE9BQU8sRUFBRTZGLFFBQVEsQ0FBQ3pDLEdBQUcsQ0FBRStCLE9BQU8sSUFBS0EsT0FBTyxDQUFDdEUsT0FBTyxDQUFDLENBQUM7TUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUFBLE9BQUF4RSxrQkFBQTtFQUFBLEVBaGI4QzRKLHVCQUF1QixNQUFBekosTUFBQTtFQUFBSSxRQUFBLEdBQUFQLGtCQUFBO0VBQUEsT0FBQU8sUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
466
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2xsYWJvcmF0aXZlRHJhZnQiLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfY2xhc3MiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9leHBvcnRzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJnZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlIiwiY29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSIsImJhc2UiLCJnZXRBcHBDb21wb25lbnQiLCJoYW5kbGVDb250ZW50Rm9jdXNJbiIsInNvdXJjZSIsImZvY3VzRXZlbnQiLCJpc0EiLCJnZXRQYXJlbnQiLCJ0YXJnZXRPdXRzaWRlT2ZDb250cm9sRG9tUmVmIiwiZ2V0RG9tUmVmIiwiY29udGFpbnMiLCJyZWxhdGVkVGFyZ2V0IiwibGFzdEZvY3VzSWQiLCJnZXRMYXN0Rm9jdXNJZCIsImdldElkIiwiZ2V0TGFzdEZvY3VzRmllbGRHcm91cHMiLCJnZXRGaWVsZEdyb3VwSWRzIiwiam9pbiIsImxhc3RGb2N1c2VkIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwic2VuZEZvY3VzT3V0TWVzc2FnZSIsInNldExhc3RGb2N1c0luZm9ybWF0aW9uIiwic2VuZEZvY3VzSW5NZXNzYWdlIiwiaGFuZGxlQ29udGVudEZvY3VzT3V0IiwiZmllbGRHcm91cEV2ZW50IiwiY29udHJvbCIsImdldFNvdXJjZSIsImZpZWxkR3JvdXBJZHMiLCJnZXRQYXJhbWV0ZXIiLCJzb21lIiwiZ3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJDb2xsYWJvcmF0aW9uRmllbGRHcm91cFByZWZpeCIsInNvdXJjZUNvbnRyb2wiLCJjdXJyZW50Rm9jdXNlZENvbnRyb2wiLCJnZXRBY3RpdmVFbGVtZW50IiwidW5kZWZpbmVkIiwibGFzdEZvY3VzRmllbGRHcm91cHMiLCJmb2N1c2VkRmllbGQiLCJmaWVsZHBBUEkiLCJjb2xsYWJvcmF0aW9uUGF0aCIsImdldENvbGxhYm9yYXRpb25QYXRoIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiTG9jayIsImNvbnRlbnQiLCJVbmxvY2siLCJmaWVsZCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRNYWluUHJvcGVydHlSZWxhdGl2ZVBhdGgiLCJmaWVsZFdyYXBwZXIiLCJGaWVsZEVkaXRNb2RlIiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiaW5jbHVkZXMiLCJnZXRQcm9wZXJ0eSIsImdldFBhdGgiLCJrZXlwYXRoIiwiZ2V0QmluZGluZ0luZm8iLCJ0ZW1wbGF0ZSIsImdldEJpbmRpbmdQYXRoIiwicGF0aCIsIm1lc3NhZ2UiLCJnZXRWaWV3IiwiaXNDb25uZWN0ZWQiLCJjb25uZWN0IiwiZHJhZnRSb290Q29udGV4dCIsImRpc2Nvbm5lY3QiLCJ1aU1vZGVsIiwiZ2V0TW9kZWwiLCJjbGVhbkRyYWZ0Um9vdCIsInNldFByb3BlcnR5IiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsInJldGFpbkFzeW5jTWVzc2FnZXMiLCJhY3Rpdml0eVBhdGhzIiwicmVsZWFzZUFzeW5jTWVzc2FnZXMiLCJ1cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoIiwib2xkQ29udGV4dFBhdGgiLCJuZXdDb250ZXh0UGF0aCIsImdldEN1cnJlbnREcmFmdFJvb3RQYXRoIiwiaW50ZXJuYWxNb2RlbCIsImdldERyYWZ0U2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGVQcm9taXNlIiwiaXNJbml0aWFsU2hhcmUiLCJzZXRJbml0aWFsU2hhcmUiLCJpc0luaXRpYWwiLCJzZXREcmFmdFJvb3QiLCJzaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZVByb21pc2UiLCJnZXRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSIsImFjdGl2YXRlQ29sbGFib3JhdGlvbiIsInBhZ2VDb250ZXh0IiwiaXNBY3RpdmVFbnRpdHkiLCJDb21tb25VdGlscyIsImZpbmRPckNyZWF0ZVJvb3RDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0R3JvdXBJZCIsIiRzZWxlY3QiLCJyb290Q29udGV4dCIsIkxvZyIsImVycm9yIiwiY3VycmVudERyYWZ0Um9vdFBhdGgiLCJpc1NoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlIiwiY2F0Y2giLCJlcnIiLCJnZXRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZUJpbmRpbmdFeHByZXNzaW9uIiwiZ2V0T0RhdGFDYWNoZVZhbHVlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5U2V0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInNoYXJlQWN0aW9uTmFtZSIsImdldE9iamVjdCIsImNvbnZlcnRlZFR5cGVzIiwiYWN0aW9ucyIsImZpbmQiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJpc0JvdW5kIiwicGFyYW1ldGVycyIsImJpbmRpbmdFeHByZXNzaW9uIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiYW5ub3RhdGlvbnMiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwiYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciIsImlzUGF0aEluTW9kZWxFeHByZXNzaW9uIiwiY3VycmVudENvbnRleHRXaXRoQ2FjaGUiLCJPYmplY3QiLCJrZXlzIiwibW9kZWwiLCJjb250ZXh0UGF0aCIsInNoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJleGVjdXRlU2hhcmVBY3Rpb24iLCJwZXJmb3JtU2hhcmUiLCJzaGFyZU9iamVjdCIsImFkZFNlbGYiLCJjYWNoZWRBdmFpbGFiaWxpdHkiLCJzZW5kTG9ja0NoYW5nZSIsImNvbnRleHQiLCJwcm9wZXJ0eU5hbWUiLCJpc0xvY2tlZCIsInNlbmRQcm9wZXJ0eVZhbHVlc0NoYW5nZSIsInByb3BlcnR5TmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJDaGFuZ2UiLCJtYXAiLCJwcm9wIiwic2VuZENvbnRleHRzQ3JlYXRlZCIsImNvbnRleHRzT3JCaW5kaW5nIiwiQ3JlYXRlIiwiZ2V0UmVzb2x2ZWRQYXRoIiwic2VuZENvbnRleHRzRGVsZXRlZCIsImNvbnRleHRzIiwiRGVsZXRlIiwiQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbGxhYm9yYXRpdmVEcmFmdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBCb29sZWFuIGFzIEVkbUJvb2xlYW4gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLCBpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgRmllbGRXcmFwcGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL0ZpZWxkV3JhcHBlclwiO1xuaW1wb3J0IHR5cGUgVG9rZW5pemVyIGZyb20gXCJzYXAvbS9Ub2tlbml6ZXJcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbCRWYWxpZGF0ZUZpZWxkR3JvdXBFdmVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgRmllbGRFZGl0TW9kZSB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCIuL0Jhc2VDb250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29sbGFib3JhdGlvbkZpZWxkR3JvdXBQcmVmaXgsIGFkZFNlbGYsIHNoYXJlT2JqZWN0IH0gZnJvbSBcIi4vY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiB0byBoYW5kbGUgY29sbGFib3JhdGl2ZSBkcmFmdCBzY2VuYXJpb3MuXG4gKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG4gKiBAc2luY2UgMS4xNDEuMFxuICogQHB1YmxpY1xuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Db2xsYWJvcmF0aXZlRHJhZnRcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxhYm9yYXRpdmVEcmFmdCBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBsYXN0Rm9jdXNJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgbGFzdEZvY3VzRmllbGRHcm91cHM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIGNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UhOiBDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlO1xuXG5cdHByaXZhdGUgZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpOiBDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlIHtcblx0XHR0aGlzLmNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UgPSB0aGlzLmNvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UgPz8gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKTtcblx0XHRyZXR1cm4gdGhpcy5jb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIHdoZW4gdGhlIGZvY3VzIGlzIHNldCBpbiB0aGUgRmllbGQgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi5cblx0ICogQHBhcmFtIHNvdXJjZVxuXHQgKiBAcGFyYW0gZm9jdXNFdmVudFxuXHQgKi9cblx0cHVibGljIGhhbmRsZUNvbnRlbnRGb2N1c0luKHNvdXJjZTogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQsIGZvY3VzRXZlbnQ/OiBGb2N1c0V2ZW50KTogdm9pZCB7XG5cdFx0Ly8gV2Ugc2VuZCB0aGUgZXZlbnQgb25seSBpZiB0aGUgZm9jdXMgd2FzIHByZXZpb3VzbHkgb3V0IG9mIHRoZSBGaWVsZFxuXHRcdGlmIChzb3VyY2UuaXNBPFRva2VuaXplcj4oXCJzYXAubS5Ub2tlbml6ZXJcIikpIHtcblx0XHRcdHNvdXJjZSA9IHNvdXJjZS5nZXRQYXJlbnQoKT8uZ2V0UGFyZW50KCkgYXMgTXVsdGlWYWx1ZUZpZWxkO1xuXHRcdH1cblx0XHRsZXQgdGFyZ2V0T3V0c2lkZU9mQ29udHJvbERvbVJlZiA9IGZhbHNlO1xuXHRcdGlmIChmb2N1c0V2ZW50KSB7XG5cdFx0XHR0YXJnZXRPdXRzaWRlT2ZDb250cm9sRG9tUmVmID0gIXNvdXJjZS5nZXREb21SZWYoKT8uY29udGFpbnMoZm9jdXNFdmVudC5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpO1xuXHRcdH1cblx0XHRpZiAoc291cmNlLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikgfHwgdGFyZ2V0T3V0c2lkZU9mQ29udHJvbERvbVJlZikge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG5ld2x5IGZvY3VzZWQgRmllbGQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIG9uZSwgYnV0IHRoZXkgc2hhcmUgdGhlIHNhbWUgZmllbGRHcm91cElEc1xuXHRcdFx0Ly8gKGUuZy4gZmllbGRzIGluIGRpZmZlcmVudCByb3dzIGluIHRoZSBzYW1lIGNvbHVtbiBvZiBhIHRhYmxlKVxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB0aGUgZm9jdXNPdXQgaGFuZGxlciB3YXMgbm90IGNhbGxlZCAoYmVjYXVzZSB3ZSBzdGF5IGluIHRoZSBzYW1lIGZpZWxkR3JvdXBJRCksIHNvIHdlIG5lZWQgdG8gc2VuZCBhIGZvY3VzT3V0IGV2ZW50IG1hbnVhbGx5XG5cdFx0XHRjb25zdCBsYXN0Rm9jdXNJZCA9IHRoaXMuZ2V0TGFzdEZvY3VzSWQoKTtcblx0XHRcdGlmIChsYXN0Rm9jdXNJZCAmJiBsYXN0Rm9jdXNJZCAhPT0gc291cmNlLmdldElkKCkgJiYgdGhpcy5nZXRMYXN0Rm9jdXNGaWVsZEdyb3VwcygpID09PSBzb3VyY2UuZ2V0RmllbGRHcm91cElkcygpLmpvaW4oXCIsXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGxhc3RGb2N1c2VkID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChsYXN0Rm9jdXNJZCkgYXMgRmllbGQ7XG5cdFx0XHRcdHRoaXM/LnNlbmRGb2N1c091dE1lc3NhZ2UobGFzdEZvY3VzZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldExhc3RGb2N1c0luZm9ybWF0aW9uKHNvdXJjZSk7XG5cblx0XHRcdHRoaXMuc2VuZEZvY3VzSW5NZXNzYWdlKHNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIHdoZW4gdGhlIGZvY3VzIGlzIHJlbW92ZWQgZnJvbSB0aGUgRmllbGQgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi5cblx0ICogQHBhcmFtIGZpZWxkR3JvdXBFdmVudFxuXHQgKi9cblx0cHVibGljIGhhbmRsZUNvbnRlbnRGb2N1c091dChmaWVsZEdyb3VwRXZlbnQ6IENvbnRyb2wkVmFsaWRhdGVGaWVsZEdyb3VwRXZlbnQpOiB2b2lkIHtcblx0XHRsZXQgY29udHJvbDogTWFuYWdlZE9iamVjdCB8IG51bGwgPSBmaWVsZEdyb3VwRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0aWYgKGNvbnRyb2wuaXNBPFRva2VuaXplcj4oXCJzYXAubS5Ub2tlbml6ZXJcIikpIHtcblx0XHRcdGNvbnRyb2wgPSBjb250cm9sLmdldFBhcmVudCgpPy5nZXRQYXJlbnQoKSBhcyBNdWx0aVZhbHVlRmllbGQ7XG5cdFx0fVxuXHRcdGlmICghY29udHJvbC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHR3aGlsZSAoY29udHJvbCAmJiAhY29udHJvbD8uaXNBPEZpZWxkPihcInNhcC5mZS5tYWNyb3MuRmllbGRcIikpIHtcblx0XHRcdFx0Y29udHJvbCA9IGNvbnRyb2w/LmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjb250cm9sKSByZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmllbGRHcm91cElkcyA9IGZpZWxkR3JvdXBFdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpIGFzIHN0cmluZ1tdO1xuXG5cdFx0Ly8gV2Ugc2VuZCB0aGUgZXZlbnQgb25seSBpZiB0aGUgdmFsaWRhdGVkIGZpZWxkQ3JvdXAgY29ycmVzcG9uZHMgdG8gYSBjb2xsYWJvcmF0aW9uIGdyb3VwXG5cdFx0aWYgKFxuXHRcdFx0ZmllbGRHcm91cElkcy5zb21lKChncm91cElkKSA9PiB7XG5cdFx0XHRcdHJldHVybiBncm91cElkLnN0YXJ0c1dpdGgoQ29sbGFib3JhdGlvbkZpZWxkR3JvdXBQcmVmaXgpO1xuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUNvbnRyb2w6IENvbnRyb2wgPSBmaWVsZEdyb3VwRXZlbnQuZ2V0U291cmNlKCk7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiB0aGUgY29udHJvbCB0aGF0IHNlbnQgdGhlIGV2ZW50IHN0aWxsIGhhcyB0aGUgZm9jdXMgKG9yIG9uZSBvZiBpdHMgY2hpbGRyZW4pLlxuXHRcdFx0Ly8gVGhpcyBjb3VsZCBoYXBwZW4gZS5nLiBpZiB0aGUgdXNlciBwcmVzc2VkIDxFbnRlcj4gdG8gdmFsaWRhdGUgdGhlIGlucHV0LlxuXHRcdFx0bGV0IGN1cnJlbnRGb2N1c2VkQ29udHJvbDogTWFuYWdlZE9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQgPSBFbGVtZW50LmdldEFjdGl2ZUVsZW1lbnQoKTtcblx0XHRcdHdoaWxlIChjdXJyZW50Rm9jdXNlZENvbnRyb2wgJiYgY3VycmVudEZvY3VzZWRDb250cm9sICE9PSBzb3VyY2VDb250cm9sKSB7XG5cdFx0XHRcdGN1cnJlbnRGb2N1c2VkQ29udHJvbCA9IGN1cnJlbnRGb2N1c2VkQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50Rm9jdXNlZENvbnRyb2wgIT09IHNvdXJjZUNvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVGhlIGNvbnRyb2wgdGhhdCBzZW50IHRoZSBldmVudCBpc24ndCBmb2N1c2VkIGFueW1vcmVcblx0XHRcdFx0dGhpcy5zZW5kRm9jdXNPdXRNZXNzYWdlKGNvbnRyb2wpO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRMYXN0Rm9jdXNJZCgpID09PSBjb250cm9sLmdldElkKCkpIHtcblx0XHRcdFx0XHR0aGlzLnNldExhc3RGb2N1c0luZm9ybWF0aW9uKHVuZGVmaW5lZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGxhc3QgZm9jdXNlZCBGaWVsZCAoaWYgYW55KS5cblx0ICogQHJldHVybnMgSURcblx0ICovXG5cdHByaXZhdGUgZ2V0TGFzdEZvY3VzSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5sYXN0Rm9jdXNJZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmaWVsZGdyb3VwcyBvZiB0aGUgbGFzdCBmb2N1c2VkIEZpZWxkIChpZiBhbnkpLlxuXHQgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWVsZGdyb3VwcyBzZXBhcmF0ZWQgYnkgJywnXG5cdCAqL1xuXHRwcml2YXRlIGdldExhc3RGb2N1c0ZpZWxkR3JvdXBzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMubGFzdEZvY3VzRmllbGRHcm91cHM7XG5cdH1cblxuXHQvKipcblx0ICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGZvY3VzZWQgRmllbGQgKGlkIGFuZCBmaWVsZGdyb3VwcykuXG5cdCAqIEBwYXJhbSBmb2N1c2VkRmllbGRcblx0ICovXG5cdHByaXZhdGUgc2V0TGFzdEZvY3VzSW5mb3JtYXRpb24oZm9jdXNlZEZpZWxkOiBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdHRoaXMubGFzdEZvY3VzSWQgPSBmb2N1c2VkRmllbGQ/LmdldElkKCk7XG5cdFx0dGhpcy5sYXN0Rm9jdXNGaWVsZEdyb3VwcyA9IGZvY3VzZWRGaWVsZD8uZ2V0RmllbGRHcm91cElkcygpLmpvaW4oXCIsXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIGNvbGxhYm9yYXRpb24gaXMgZW5hYmxlZCwgc2VuZCBhIExvY2sgY29sbGFib3JhdGlvbiBtZXNzYWdlLlxuXHQgKiBAcGFyYW0gZmllbGRwQVBJXG5cdCAqL1xuXHRwcml2YXRlIHNlbmRGb2N1c0luTWVzc2FnZShmaWVsZHBBUEk6IEZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkKTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvblBhdGggPSB0aGlzLmdldENvbGxhYm9yYXRpb25QYXRoKGZpZWxkcEFQSSk7XG5cblx0XHRpZiAoY29sbGFib3JhdGlvblBhdGgpIHtcblx0XHRcdHRoaXMuc2VuZCh7IGFjdGlvbjogQWN0aXZpdHkuTG9jaywgY29udGVudDogY29sbGFib3JhdGlvblBhdGggfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIElmIGNvbGxhYm9yYXRpb24gaXMgZW5hYmxlZCwgc2VuZCBhbiBVbmxvY2sgY29sbGFib3JhdGlvbiBtZXNzYWdlLlxuXHQgKiBAcGFyYW0gZmllbGRwQVBJXG5cdCAqL1xuXHRwcml2YXRlIHNlbmRGb2N1c091dE1lc3NhZ2UoZmllbGRwQVBJOiBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghZmllbGRwQVBJKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNvbGxhYm9yYXRpb25QYXRoID0gdGhpcy5nZXRDb2xsYWJvcmF0aW9uUGF0aChmaWVsZHBBUEkpO1xuXHRcdGlmIChjb2xsYWJvcmF0aW9uUGF0aCkge1xuXHRcdFx0dGhpcy5zZW5kKHsgYWN0aW9uOiBBY3Rpdml0eS5VbmxvY2ssIGNvbnRlbnQ6IGNvbGxhYm9yYXRpb25QYXRoIH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwYXRoIHVzZWQgdG8gc2VuZCBjb2xsYWJvcmF0aW9uIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gZmllbGRcblx0ICogQHJldHVybnMgVGhlIHBhdGggKG9yIHVuZGVmaW5lZCBpcyBubyB2YWxpZCBwYXRoIGNvdWxkIGJlIGZvdW5kKVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRDb2xsYWJvcmF0aW9uUGF0aChmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdC8vIE5vdGU6IHdlIHNlbmQgbWVzc2FnZXMgZXZlbiBpZiB0aGUgY29udGV4dCBpcyBpbmFjdGl2ZSAoZW1wdHkgY3JlYXRpb24gcm93cyksXG5cdFx0Ly8gb3RoZXJ3aXNlIHdlIGNhbid0IHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBsb2NrcyB3aGVuIHRoZSBjb250ZXh0IGlzIGFjdGl2YXRlZC5cblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGZpZWxkPy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZmllbGQuaXNBPEZpZWxkPihcInNhcC5mZS5tYWNyb3MuRmllbGRcIikpIHtcblx0XHRcdGlmICghZmllbGQuZ2V0TWFpblByb3BlcnR5UmVsYXRpdmVQYXRoKCkpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmllbGRXcmFwcGVyID0gZmllbGQuY29udGVudCBhcyBGaWVsZFdyYXBwZXIgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFbRmllbGRFZGl0TW9kZS5FZGl0YWJsZSwgRmllbGRFZGl0TW9kZS5FZGl0YWJsZURpc3BsYXksIEZpZWxkRWRpdE1vZGUuRWRpdGFibGVSZWFkT25seV0uaW5jbHVkZXMoXG5cdFx0XHRcdFx0ZmllbGRXcmFwcGVyPy5nZXRQcm9wZXJ0eShcImVkaXRNb2RlXCIpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgZmllbGQgaXMgbm90IGluIGVkaXQgbW9kZSAtLT4gbm8gY29sbGFib3JhdGlvbiBtZXNzYWdlc1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYCR7YmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpfS8ke2ZpZWxkLmdldE1haW5Qcm9wZXJ0eVJlbGF0aXZlUGF0aCgpfWA7XG5cdFx0fSBlbHNlIGlmIChmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRjb25zdCBrZXlwYXRoID0gZmllbGQuZ2V0QmluZGluZ0luZm8oXCJpdGVtc1wiKS50ZW1wbGF0ZS5nZXRCaW5kaW5nUGF0aChcImtleVwiKTtcblx0XHRcdHJldHVybiBgJHtiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCl9LyR7ZmllbGQuZ2V0QmluZGluZ0luZm8oXCJpdGVtc1wiKS5wYXRofS8ke2tleXBhdGh9YDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2VuZChtZXNzYWdlOiB7XG5cdFx0YWN0aW9uOiBBY3Rpdml0eTtcblx0XHRjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0XHR0cmlnZ2VyZWRBY3Rpb25OYW1lPzogc3RyaW5nO1xuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW47XG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR9KTogdm9pZCB7XG5cdFx0dGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkuc2VuZCh0aGlzLmdldFZpZXcoKSwgbWVzc2FnZSk7XG5cdH1cblxuXHRwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBjb25uZWN0KGRyYWZ0Um9vdENvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkuY29ubmVjdChkcmFmdFJvb3RDb250ZXh0LCB0aGlzLmdldFZpZXcoKSBhcyBGRVZpZXcpO1xuXHR9XG5cblx0cHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG5cdFx0Y29uc3QgdWlNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHRcdHRoaXMuY2xlYW5EcmFmdFJvb3QoKTtcblx0XHR1aU1vZGVsLnNldFByb3BlcnR5KFwiL2hhc0NvbGxhYm9yYXRpb25BdXRob3JpemF0aW9uXCIsIHVuZGVmaW5lZCk7XG5cblx0XHRpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHR0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS5kaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpIGFzIEZFVmlldyk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpLmlzQ29sbGFib3JhdGlvbkVuYWJsZWQodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHVibGljIHJldGFpbkFzeW5jTWVzc2FnZXMoYWN0aXZpdHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkucmV0YWluQXN5bmNNZXNzYWdlcyh0aGlzLmdldFZpZXcoKSwgYWN0aXZpdHlQYXRocyk7XG5cdH1cblxuXHRwdWJsaWMgcmVsZWFzZUFzeW5jTWVzc2FnZXMoYWN0aXZpdHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRDb2xsYWJvcmF0aXZlRHJhZnRTZXJ2aWNlKCkucmVsZWFzZUFzeW5jTWVzc2FnZXModGhpcy5nZXRWaWV3KCksIGFjdGl2aXR5UGF0aHMpO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZUxvY2tzRm9yQ29udGV4dFBhdGgob2xkQ29udGV4dFBhdGg6IHN0cmluZywgbmV3Q29udGV4dFBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmdldENvbGxhYm9yYXRpdmVEcmFmdFNlcnZpY2UoKS51cGRhdGVMb2Nrc0ZvckNvbnRleHRQYXRoKHRoaXMuZ2V0VmlldygpLCBvbGRDb250ZXh0UGF0aCwgbmV3Q29udGV4dFBhdGgpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDdXJyZW50RHJhZnRSb290UGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdHJldHVybiBpbnRlcm5hbE1vZGVsPy5nZXRQcm9wZXJ0eShcIi9jb2xsYWJvcmF0aXZlRHJhZnRSb290UGF0aFwiKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RHJhZnRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZVByb21pc2UoKTogUHJvbWlzZTxib29sZWFuPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0cmV0dXJuIGludGVybmFsTW9kZWw/LmdldFByb3BlcnR5KFwiL2NvbGxhYm9yYXRpdmVEcmFmdFNoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlUHJvbWlzZVwiKTtcblx0fVxuXG5cdHByaXZhdGUgaXNJbml0aWFsU2hhcmUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0cmV0dXJuIGludGVybmFsTW9kZWw/LmdldFByb3BlcnR5KFwiL2NvbGxhYm9yYXRpdmVEcmFmdFNoYXJlSW5pdGlhbFwiKSA9PT0gdHJ1ZTtcblx0fVxuXG5cdHNldEluaXRpYWxTaGFyZShpc0luaXRpYWw6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0U2hhcmVJbml0aWFsXCIsIGlzSW5pdGlhbCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZHJhZnQgcm9vdCBjb250ZXh0IGZvciB0aGUgY29sbGFib3JhdGlvbi5cblx0ICogSXRzIHBhdGggaXMgc3RvcmVkIGluIHRoZSBpbnRlcm5hbCBtb2RlbCwgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBsYXRlciB0byBjaGVjayBpZiB0aGUgY29sbGFib3JhdGlvbiBpcyBhY3RpdmUuXG5cdCAqIEl0IGFsc28gcmV0cmlldmVzIHRoZSBsaXN0IG9mIHVzZXJzIGludml0ZWQgaW4gdGhlIGRyYWZ0IGFuZCBzdG9yZXMgaXQgaW4gdGhlIGludGVybmFsIG1vZGVsLlxuXHQgKiBAcGFyYW0gZHJhZnRSb290Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIGRyYWZ0IHJvb3Rcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgdG8gcmVxdWVzdCB0aGUgbGlzdCBvZiB1c2VycyBpbnZpdGVkIGluIHRoZSBkcmFmdFxuXHQgKi9cblx0cHVibGljIHNldERyYWZ0Um9vdChkcmFmdFJvb3RDb250ZXh0OiBDb250ZXh0LCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3Qgc2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGVQcm9taXNlOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0gdGhpcy5nZXRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZShkcmFmdFJvb3RDb250ZXh0KTtcblx0XHRpbnRlcm5hbE1vZGVsPy5zZXRQcm9wZXJ0eShcIi9jb2xsYWJvcmF0aXZlRHJhZnRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZVByb21pc2VcIiwgc2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGVQcm9taXNlKTtcblx0XHRpbnRlcm5hbE1vZGVsPy5zZXRQcm9wZXJ0eShcIi9jb2xsYWJvcmF0aXZlRHJhZnRSb290UGF0aFwiLCBkcmFmdFJvb3RDb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYW5zIHRoZSBkcmFmdCByb290IGNvbnRleHQgYW5kIHRoZSBsaXN0IG9mIHVzZXJzIGludml0ZWQgaW4gdGhlIGRyYWZ0LlxuXHQgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb2xsYWJvcmF0aW9uIGlzIGRlYWN0aXZhdGVkIG9yIHdoZW4gdGhlIGRyYWZ0IHJvb3QgY29udGV4dCBjaGFuZ2VzLlxuXHQgKi9cblx0cHJpdmF0ZSBjbGVhbkRyYWZ0Um9vdCgpOiB2b2lkIHtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0U2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGVQcm9taXNlXCIsIHVuZGVmaW5lZCk7XG5cdFx0aW50ZXJuYWxNb2RlbD8uc2V0UHJvcGVydHkoXCIvY29sbGFib3JhdGl2ZURyYWZ0Um9vdFBhdGhcIiwgdW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZXMgdGhlIGNvbGxhYm9yYXRpb24gZm9yIHRoZSBnaXZlbiBwYWdlIGNvbnRleHQuXG5cdCAqIENoZWNrcyBpZiB0aGUgY3VycmVudCB1c2VyIGlzIGF1dGhvcml6ZWQgdG8gY29sbGFib3JhdGUgb24gdGhlIGRyYWZ0LCBhbmQgc2V0cyB0aGUgZmxhZyBpbiB0aGUgVUkgbW9kZWwgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBwYWdlQ29udGV4dCBUaGUgcGFnZSBjb250ZXh0IChub3QgbmVjZXNzYXJpbHkgYSBkcmFmdCByb290KVxuXHQgKiBAcGFyYW0gaXNBY3RpdmVFbnRpdHkgSXMgdGhlIGNvbnRleHQgdGhlIGFjdGl2ZSBvbmUgKG5vdCBhIGRyYWZ0KT9cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdXNlciBpcyBhdXRob3JpemVkIHRvIGNvbGxhYm9yYXRlLCBmYWxzZSBvdGhlcndpc2UuXG5cdCAqL1xuXHRhc3luYyBhY3RpdmF0ZUNvbGxhYm9yYXRpb24ocGFnZUNvbnRleHQ6IENvbnRleHQsIGlzQWN0aXZlRW50aXR5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVpTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHQvLyBXZSdyZSBub3QgaW4gYSBkcmFmdCAtPiBkaXNjb25uZWN0IGlmIHdlIHdlcmUgY29ubmVjdGVkIGJlZm9yZVxuXHRcdFx0XHR1aU1vZGVsLnNldFByb3BlcnR5KFwiL3Nob3dDb2xsYWJvcmF0aW9uU3RyaXBcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dCA9IENvbW1vblV0aWxzLmZpbmRPckNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0XHRwYWdlQ29udGV4dCxcblx0XHRcdFx0XCJEcmFmdFwiLFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR7ICQkZ3JvdXBJZDogcGFnZUNvbnRleHQuZ2V0R3JvdXBJZCgpLCAkc2VsZWN0OiBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCIgfVxuXHRcdFx0KS5yb290Q29udGV4dDtcblx0XHRcdGlmICghZHJhZnRSb290Q29udGV4dCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDb3VsZG4ndCBmaW5kIGRyYWZ0IHJvb3QgY29udGV4dCBmb3IgZW5hYmxpbmcgY29sbGFib3JhdGlvblwiKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjdXJyZW50RHJhZnRSb290UGF0aCA9IHRoaXMuZ2V0Q3VycmVudERyYWZ0Um9vdFBhdGgoKTtcblx0XHRcdGlmIChjdXJyZW50RHJhZnRSb290UGF0aCAhPT0gZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBVbmV4cGVjdGVkIHBhdGggZm9yIGNoZWNraW5nIGNvbGxhYm9yYXRpb24gYXV0aG9yaXphdGlvbnM6ICR7ZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCl9IChleHBlY3RpbmcgJHtjdXJyZW50RHJhZnRSb290UGF0aH0pYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodWlNb2RlbC5nZXRQcm9wZXJ0eShcIi9oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvblwiKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB1aU1vZGVsLmdldFByb3BlcnR5KFwiL2hhc0NvbGxhYm9yYXRpb25BdXRob3JpemF0aW9uXCIpOyAvLyBBbHJlYWR5IGNoZWNrZWQsIGFsbCBnb29kXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1NoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5nZXREcmFmdFNoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlUHJvbWlzZSgpO1xuXHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShcIi9oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvblwiLCBpc1NoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlKTtcblx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvc2hvd0NvbGxhYm9yYXRpb25TdHJpcFwiLCAhaXNTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSk7XG5cblx0XHRcdGlmIChpc1NoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlKSB7XG5cdFx0XHRcdHRoaXMuY29ubmVjdChkcmFmdFJvb3RDb250ZXh0KS5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGNvbGxhYm9yYXRpb24gZHJhZnQgXCIgKyBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0Ly8gRGlzY29ubmVjdCB0aGUgd2Vic29ja2V0IGJ1dCBrZWVwIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBpbnRlcm5hbCBtb2RlbCAoc28gZG9uJ3QgY2FsbCB0aGlzLmRpc2Nvbm5lY3QpXG5cdFx0XHRcdHRoaXMuZ2V0Q29sbGFib3JhdGl2ZURyYWZ0U2VydmljZSgpLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkgYXMgRkVWaWV3KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAhIWlzU2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGU7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBhY3RpdmF0aW5nIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IFwiICsgZXJyKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRnZXRTaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZUJpbmRpbmdFeHByZXNzaW9uKFxuXHRcdGRyYWZ0Um9vdENvbnRleHQ6IENvbnRleHQsXG5cdFx0Z2V0T0RhdGFDYWNoZVZhbHVlPzogYm9vbGVhblxuXHQpOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gfCBib29sZWFuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBkcmFmdFJvb3RDb250ZXh0LmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGVudGl0eVNldCA9IG1ldGFNb2RlbD8uZ2V0TWV0YVBhdGgoZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsPy5nZXRNZXRhQ29udGV4dChkcmFmdFJvb3RDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IG1ldGFDb250ZXh0ICYmIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3Qgc2hhcmVBY3Rpb25OYW1lID0gbWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7ZW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYCk7XG5cdFx0Y29uc3QgYWN0aW9uID0gb2JqZWN0UGF0aD8uY29udmVydGVkVHlwZXMuYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IHtcblx0XHRcdHJldHVybiBhY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lLnN0YXJ0c1dpdGgoc2hhcmVBY3Rpb25OYW1lKTtcblx0XHR9KTtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUgPSBhY3Rpb24/LmlzQm91bmQgPyBhY3Rpb24ucGFyYW1ldGVyc1swXT8uZnVsbHlRdWFsaWZpZWROYW1lIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJpbmRpbmdFeHByZXNzaW9uID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKFxuXHRcdFx0YWN0aW9uPy5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlIGFzIHVua25vd24gYXMgQW5ub3RhdGlvblRlcm08UHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8RWRtQm9vbGVhbj4+LFxuXHRcdFx0W10sXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHQocGF0aDogc3RyaW5nKSA9PiBiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIG9iamVjdFBhdGg/LmNvbnZlcnRlZFR5cGVzLCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpXG5cdFx0KTtcblx0XHRpZiAoZ2V0T0RhdGFDYWNoZVZhbHVlKSB7XG5cdFx0XHRpZiAoaXNQYXRoSW5Nb2RlbEV4cHJlc3Npb24oYmluZGluZ0V4cHJlc3Npb24pKSB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRDb250ZXh0V2l0aENhY2hlID0gZHJhZnRSb290Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0aWYgKGN1cnJlbnRDb250ZXh0V2l0aENhY2hlKSB7XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGN1cnJlbnRDb250ZXh0V2l0aENhY2hlKS5pbmNsdWRlcyhiaW5kaW5nRXhwcmVzc2lvbi5wYXRoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0V2l0aENhY2hlW2JpbmRpbmdFeHByZXNzaW9uLnBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb247XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0U2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGUoZHJhZnRSb290Q29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gZHJhZnRSb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGNvbnRleHRQYXRoID0gZHJhZnRSb290Q29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgYmluZGluZ0V4cHJlc3Npb24gPSB0aGlzLmdldFNoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlQmluZGluZ0V4cHJlc3Npb24oZHJhZnRSb290Q29udGV4dCk7XG5cdFx0Y29uc3Qgc2hhcmVBY3Rpb25PcGVyYXRpb25BdmFpbGFibGVFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24oYmluZGluZ0V4cHJlc3Npb24pO1xuXHRcdGlmIChzaGFyZUFjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoaXNQYXRoSW5Nb2RlbEV4cHJlc3Npb24oYmluZGluZ0V4cHJlc3Npb24pKSB7XG5cdFx0XHRyZXR1cm4gbW9kZWxcblx0XHRcdFx0LmJpbmRDb250ZXh0KGAke2NvbnRleHRQYXRofWAsIHVuZGVmaW5lZCwgeyAkJGdyb3VwSWQ6IGRyYWZ0Um9vdENvbnRleHQuZ2V0R3JvdXBJZCgpLCAkc2VsZWN0OiBbYmluZGluZ0V4cHJlc3Npb24ucGF0aF0gfSlcblx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpXG5cdFx0XHRcdC5yZXF1ZXN0UHJvcGVydHkoYmluZGluZ0V4cHJlc3Npb24ucGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIGN1cnJlbnQgdXNlciBpbiB0aGUgZHJhZnQgcm9vdCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gcGFnZUNvbnRleHQgVGhlIHBhZ2UgY29udGV4dCAobm90IG5lY2Vzc2FyaWx5IGEgZHJhZnQgcm9vdClcblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVTaGFyZUFjdGlvbihwYWdlQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gQ29tbW9uVXRpbHMuZmluZE9yQ3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdHBhZ2VDb250ZXh0LFxuXHRcdFx0XHRcIkRyYWZ0XCIsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHsgJCRncm91cElkOiBwYWdlQ29udGV4dC5nZXRHcm91cElkKCksICRzZWxlY3Q6IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIiB9XG5cdFx0XHQpLnJvb3RDb250ZXh0O1xuXHRcdFx0aWYgKCFkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNvdWxkbid0IGZpbmQgZHJhZnQgcm9vdCBjb250ZXh0IGZvciBlbmFibGluZyBjb2xsYWJvcmF0aW9uXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGN1cnJlbnREcmFmdFJvb3RQYXRoID0gdGhpcy5nZXRDdXJyZW50RHJhZnRSb290UGF0aCgpO1xuXHRcdFx0aWYgKGN1cnJlbnREcmFmdFJvb3RQYXRoICE9PSB1bmRlZmluZWQgJiYgY3VycmVudERyYWZ0Um9vdFBhdGggIT09IGRyYWZ0Um9vdENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIENvbGxhYm9yYXRpb24gd2FzIGVuYWJsZWQgb24gYW5vdGhlciBkcmFmdCAtLT4gZGlzY29ubmVjdCBmaXJzdFxuXHRcdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnREcmFmdFJvb3RQYXRoID09PSBkcmFmdFJvb3RDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRyZXR1cm47IC8vIHNoYXJlIHdhcyBhbHJlYWR5IGNhbGxlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2FsbCB0aGUgU2hhcmUgYWN0aW9uIGFnYWluXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHBlcmZvcm1TaGFyZSA9IGFzeW5jICgpOiBQcm9taXNlPENvbnRleHQgfCB2b2lkPiA9PlxuXHRcdFx0XHR0aGlzLmlzSW5pdGlhbFNoYXJlKCkgPyBzaGFyZU9iamVjdChkcmFmdFJvb3RDb250ZXh0LCB1bmRlZmluZWQsIGRyYWZ0Um9vdENvbnRleHQuZ2V0R3JvdXBJZCgpKSA6IGFkZFNlbGYoZHJhZnRSb290Q29udGV4dCk7XG5cblx0XHRcdHRoaXMuc2V0SW5pdGlhbFNoYXJlKGZhbHNlKTsgLy8gUmVzZXQgdGhlIGluaXRpYWwgc2hhcmUgZmxhZywgc28gdGhhdCB3ZSBkb24ndCBjYWxsIHRoZSBpbml0aWFsIFNoYXJlIGFjdGlvbiBhZ2FpblxuXHRcdFx0dGhpcy5zZXREcmFmdFJvb3QoZHJhZnRSb290Q29udGV4dCwgZHJhZnRSb290Q29udGV4dC5nZXRHcm91cElkKCkpO1xuXG5cdFx0XHRjb25zdCBjYWNoZWRBdmFpbGFiaWxpdHkgPSB0aGlzLmdldFNoYXJlQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlQmluZGluZ0V4cHJlc3Npb24oZHJhZnRSb290Q29udGV4dCwgdHJ1ZSk7XG5cdFx0XHQvLyBQZXJmb3JtIHNoYXJlIHVubGVzcyBhdmFpbGFiaWxpdHkgaXMgZXhwbGljaXRseSBmYWxzZVxuXHRcdFx0aWYgKGNhY2hlZEF2YWlsYWJpbGl0eSA9PT0gdW5kZWZpbmVkIHx8IGNhY2hlZEF2YWlsYWJpbGl0eSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRhd2FpdCBwZXJmb3JtU2hhcmUoKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGFkZGluZyBjdXJyZW50IHVzZXIgaW4gdGhlIGNvbGxhYm9yYXRpdmUgZHJhZnQgXCIgKyBlcnIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kcyBhIG5vdGlmaWNhdGlvbiB0byBvdGhlciB1c2VycyB0aGF0IGEgcHJvcGVydHkgaGFzIGJlZW4gbG9ja2VkIG9yIHVubG9ja2VkIGJ5IHRoZSBjdXJyZW50IHVzZXIuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGlzTG9ja2VkIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGxvY2tlZCwgZmFsc2UgaWYgaXQgaXMgdW5sb2NrZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG5cdCAqIEBzaW5jZSAxLjE0MS4wXG5cdCAqL1xuXHRzZW5kTG9ja0NoYW5nZShjb250ZXh0OiBDb250ZXh0LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXNMb2NrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IGlzTG9ja2VkID8gQWN0aXZpdHkuTG9jayA6IEFjdGl2aXR5LlVubG9jaywgY29udGVudDogYCR7Y29udGV4dC5nZXRQYXRoKCl9LyR7cHJvcGVydHlOYW1lfWAgfSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgdGhhdCBwcm9wZXJ0eSB2YWx1ZXMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cblx0ICpcblx0ICogVGhpcyBub3RpZmljYXRpb24gbXVzdCBiZSBzZW50IGFmdGVyIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB0byB0aGUgYmFjayBlbmQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyBUaGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXNcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG5cdCAqIEBzaW5jZSAxLjE0MS4wXG5cdCAqL1xuXHRzZW5kUHJvcGVydHlWYWx1ZXNDaGFuZ2UoY29udGV4dDogQ29udGV4dCwgcHJvcGVydHlOYW1lczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lcykpIHtcblx0XHRcdHByb3BlcnR5TmFtZXMgPSBbcHJvcGVydHlOYW1lc107XG5cdFx0fVxuXHRcdHRoaXMuc2VuZCh7IGFjdGlvbjogQWN0aXZpdHkuQ2hhbmdlLCBjb250ZW50OiBwcm9wZXJ0eU5hbWVzLm1hcCgocHJvcCkgPT4gYCR7Y29udGV4dC5nZXRQYXRoKCl9LyR7cHJvcH1gKSB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kcyBhIG5vdGlmaWNhdGlvbiB0byBvdGhlciB1c2VycyB0aGF0IG5ldyBjb250ZXh0cyBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgY3VycmVudCB1c2VyLlxuXHQgKlxuXHQgKiBUaGlzIG5vdGlmaWNhdGlvbiBtdXN0IGJlIHNlbnQgYWZ0ZXIgdGhlIG5ldyBjb250ZXh0cyBoYXZlIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkgaW4gdGhlIGJhY2sgZW5kLlxuXHQgKiBAcGFyYW0gY29udGV4dHNPckJpbmRpbmcgVGhlIGFycmF5IG9mIG5ld2x5IGNyZWF0ZWQgY29udGV4dHMsIG9yIHRoZSBiaW5kaW5nIHdoZXJlIHRoZSBjb250ZXh0cyB3ZXJlIGNyZWF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG5cdCAqIEBzaW5jZSAxLjE0MS4wXG5cdCAqL1xuXHRzZW5kQ29udGV4dHNDcmVhdGVkKGNvbnRleHRzT3JCaW5kaW5nOiBDb250ZXh0W10gfCBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY29udGV4dHNPckJpbmRpbmcpKSB7XG5cdFx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IEFjdGl2aXR5LkNyZWF0ZSwgY29udGVudDogY29udGV4dHNPckJpbmRpbmcubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgfSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2VuZCh7IGFjdGlvbjogQWN0aXZpdHkuQ3JlYXRlLCBjb250ZW50OiBjb250ZXh0c09yQmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA/PyBjb250ZXh0c09yQmluZGluZy5nZXRQYXRoKCkgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIG90aGVyIHVzZXJzIHRoYXQgY29udGV4dHMgaGF2ZSBiZWVuIGRlbGV0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cblx0ICpcblx0ICogVGhpcyBub3RpZmljYXRpb24gbXVzdCBiZSBzZW50IGFmdGVyIHRoZSBjb250ZXh0cyBoYXZlIGJlZW4gZGVsZXRlZCBzdWNjZXNzZnVsbHkgaW4gdGhlIGJhY2sgZW5kLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGFycmF5IG9mIGRlbGV0ZWQgY29udGV4dHNcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG5cdCAqIEBzaW5jZSAxLjE0MS4wXG5cdCAqL1xuXHRzZW5kQ29udGV4dHNEZWxldGVkKGNvbnRleHRzOiBDb250ZXh0W10pOiB2b2lkIHtcblx0XHR0aGlzLnNlbmQoeyBhY3Rpb246IEFjdGl2aXR5LkRlbGV0ZSwgY29udGVudDogY29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgfSk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9xQkEsa0JBQWtCLElBQUFDLElBQUEsR0FEdENDLGNBQWMsQ0FBQyxxREFBcUQsQ0FBQyxFQUFBRCxJQUFBLENBQUFFLE1BQUEsMEJBQUFDLHFCQUFBO0lBQUEsU0FBQUosbUJBQUE7TUFBQSxPQUFBSSxxQkFBQSxDQUFBQyxLQUFBLE9BQUFDLFNBQUE7SUFBQTtJQUFBQyxRQUFBLEdBQUFQLGtCQUFBO0lBQUFRLGNBQUEsQ0FBQVIsa0JBQUEsRUFBQUkscUJBQUE7SUFBQSxJQUFBSyxNQUFBLEdBQUFULGtCQUFBLENBQUFVLFNBQUE7SUFBQUQsTUFBQSxDQVE3REUsNEJBQTRCLEdBQXBDLFNBQVFBLDRCQUE0QkEsQ0FBQSxFQUE4QjtNQUNqRSxJQUFJLENBQUNDLHlCQUF5QixHQUFHLElBQUksQ0FBQ0EseUJBQXlCLElBQUksSUFBSSxDQUFDQyxJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDLENBQUNILDRCQUE0QixDQUFDLENBQUM7TUFDN0gsT0FBTyxJQUFJLENB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