@sapui5/sap.fe.core 1.135.0 → 1.136.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -1
  5. package/src/sap/fe/core/AppComponent.js +6 -4
  6. package/src/sap/fe/core/AppComponent.ts +3 -1
  7. package/src/sap/fe/core/AppStateHandler.js +8 -6
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/CommonUtils.js +4 -1
  10. package/src/sap/fe/core/CommonUtils.ts +12 -2
  11. package/src/sap/fe/core/ExtensionAPI.js +5 -3
  12. package/src/sap/fe/core/ExtensionAPI.ts +4 -2
  13. package/src/sap/fe/core/PageController.js +13 -1
  14. package/src/sap/fe/core/PageController.ts +13 -0
  15. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
  16. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
  17. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
  18. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  19. package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
  20. package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
  21. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
  22. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  27. package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
  29. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
  34. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
  35. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
  36. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
  37. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
  47. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
  49. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
  50. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  51. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
  52. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
  53. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  54. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  55. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  56. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  57. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  58. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  59. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  60. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
  61. package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
  62. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  63. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
  64. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
  65. package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
  66. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
  67. package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
  68. package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
  69. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
  70. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
  71. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
  72. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
  73. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
  74. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
  75. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  76. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  77. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
  78. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  79. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
  80. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
  81. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  83. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
  84. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
  85. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  86. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  87. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  88. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  89. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  90. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  91. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  92. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  93. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  94. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  95. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  96. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  97. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  98. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  99. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  100. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  101. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  102. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  103. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  104. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  105. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  106. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  107. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  108. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  109. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  110. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  111. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  112. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  113. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  114. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  115. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  116. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  117. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  118. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  119. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  120. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  121. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  122. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  123. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  124. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  125. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  126. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  127. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  128. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  129. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  130. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  131. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  132. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  133. package/src/sap/fe/core/fpm/manifest.json +1 -1
  134. package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
  135. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  136. package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
  137. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  138. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
  139. package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
  140. package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
  141. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  142. package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
  143. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  144. package/src/sap/fe/core/helpers/WebSocket.js +10 -1
  145. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  146. package/src/sap/fe/core/library.js +1 -1
  147. package/src/sap/fe/core/messagebundle.properties +41 -2
  148. package/src/sap/fe/core/messagebundle_ar.properties +23 -2
  149. package/src/sap/fe/core/messagebundle_bg.properties +23 -2
  150. package/src/sap/fe/core/messagebundle_ca.properties +21 -0
  151. package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
  152. package/src/sap/fe/core/messagebundle_cs.properties +21 -0
  153. package/src/sap/fe/core/messagebundle_cy.properties +21 -0
  154. package/src/sap/fe/core/messagebundle_da.properties +23 -2
  155. package/src/sap/fe/core/messagebundle_de.properties +23 -2
  156. package/src/sap/fe/core/messagebundle_el.properties +21 -0
  157. package/src/sap/fe/core/messagebundle_en.properties +23 -2
  158. package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
  159. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
  160. package/src/sap/fe/core/messagebundle_es.properties +21 -0
  161. package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
  162. package/src/sap/fe/core/messagebundle_et.properties +21 -0
  163. package/src/sap/fe/core/messagebundle_fi.properties +21 -0
  164. package/src/sap/fe/core/messagebundle_fr.properties +22 -1
  165. package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
  166. package/src/sap/fe/core/messagebundle_hi.properties +22 -1
  167. package/src/sap/fe/core/messagebundle_hr.properties +24 -3
  168. package/src/sap/fe/core/messagebundle_hu.properties +21 -0
  169. package/src/sap/fe/core/messagebundle_id.properties +21 -0
  170. package/src/sap/fe/core/messagebundle_it.properties +23 -2
  171. package/src/sap/fe/core/messagebundle_iw.properties +21 -0
  172. package/src/sap/fe/core/messagebundle_ja.properties +21 -0
  173. package/src/sap/fe/core/messagebundle_kk.properties +21 -0
  174. package/src/sap/fe/core/messagebundle_ko.properties +21 -0
  175. package/src/sap/fe/core/messagebundle_lt.properties +21 -0
  176. package/src/sap/fe/core/messagebundle_lv.properties +23 -2
  177. package/src/sap/fe/core/messagebundle_mk.properties +21 -0
  178. package/src/sap/fe/core/messagebundle_ms.properties +22 -1
  179. package/src/sap/fe/core/messagebundle_nl.properties +21 -0
  180. package/src/sap/fe/core/messagebundle_no.properties +21 -0
  181. package/src/sap/fe/core/messagebundle_pl.properties +23 -2
  182. package/src/sap/fe/core/messagebundle_pt.properties +23 -2
  183. package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
  184. package/src/sap/fe/core/messagebundle_ro.properties +23 -2
  185. package/src/sap/fe/core/messagebundle_ru.properties +22 -1
  186. package/src/sap/fe/core/messagebundle_sh.properties +23 -2
  187. package/src/sap/fe/core/messagebundle_sk.properties +21 -0
  188. package/src/sap/fe/core/messagebundle_sl.properties +23 -2
  189. package/src/sap/fe/core/messagebundle_sr.properties +23 -2
  190. package/src/sap/fe/core/messagebundle_sv.properties +21 -0
  191. package/src/sap/fe/core/messagebundle_th.properties +21 -0
  192. package/src/sap/fe/core/messagebundle_tr.properties +21 -0
  193. package/src/sap/fe/core/messagebundle_uk.properties +23 -2
  194. package/src/sap/fe/core/messagebundle_vi.properties +23 -2
  195. package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
  196. package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
  197. package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
  198. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
  199. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  200. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  201. package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
  202. package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
  203. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
  204. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  205. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
  206. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  207. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
  208. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
  209. package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
  210. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  211. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
  212. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  213. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  214. package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
  215. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  216. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
  217. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
@@ -41,6 +41,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
41
41
  // eslint-disable-next-line @typescript-eslint/no-restricted-imports
42
42
  const StandardActionKeys = {
43
43
  Cut: "StandardAction::Cut",
44
+ Copy: "StandardAction::Copy",
44
45
  Create: "StandardAction::Create",
45
46
  Delete: "StandardAction::Delete",
46
47
  CreationRow: "StandardAction::CreationRow",
@@ -218,6 +219,25 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
218
219
  };
219
220
  }
220
221
 
222
+ /**
223
+ * Gets the binding expressions for the properties of the 'Copy' action.
224
+ * @param converterContext
225
+ * @param standardActionsContext
226
+ * @returns The standard action info
227
+ */
228
+ _exports.getStandardActionCut = getStandardActionCut;
229
+ function getStandardActionCopy(converterContext, standardActionsContext) {
230
+ const copyVisibility = getCopyVisibility(converterContext, standardActionsContext);
231
+ return {
232
+ isTemplated: compileExpression(getDefaultTemplating(copyVisibility)),
233
+ visible: compileExpression(copyVisibility),
234
+ enabled: compileExpression(getCopyEnablement(copyVisibility, false)),
235
+ enabledForContextMenu: compileExpression(getCopyEnablement(copyVisibility, true)),
236
+ key: StandardActionKeys.Copy,
237
+ type: ActionType.Standard
238
+ };
239
+ }
240
+
221
241
  /**
222
242
  * Gets the binding expressions for the properties of the 'Move up' and 'Move down' actions.
223
243
  * @param converterContext
@@ -225,7 +245,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
225
245
  * @param forUp
226
246
  * @returns The standard action info
227
247
  */
228
- _exports.getStandardActionCut = getStandardActionCut;
248
+ _exports.getStandardActionCopy = getStandardActionCopy;
229
249
  function getStandardActionMoveUpDown(converterContext, standardActionsContext, forUp) {
230
250
  const canChangeSibling = converterContext.getEntityType().annotations.Hierarchy?.[`RecursiveHierarchyActions#${standardActionsContext.tableManifestConfiguration.hierarchyQualifier ?? ""}`]?.ChangeNextSiblingAction !== undefined;
231
251
  const moveVisibility = and(getCutVisibility(converterContext, standardActionsContext), canChangeSibling);
@@ -291,6 +311,22 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
291
311
  return ifElse(equal(standardActionsContext.tableManifestConfiguration?.type, "TreeTable"), and(standardActionsContext.tableManifestConfiguration.isHierarchyParentNodeUpdatable, not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), templateBindingExpression), false);
292
312
  }
293
313
 
314
+ /**
315
+ * Gets the binding expression for the 'visible' property of the 'Copy' action.
316
+ * @param converterContext
317
+ * @param standardActionsContext
318
+ * @returns The binding expression for the 'visible' property of the 'Copy' action.
319
+ */
320
+ _exports.getCutVisibility = getCutVisibility;
321
+ function getCopyVisibility(converterContext, standardActionsContext) {
322
+ const availableCopyAction = converterContext?.getEntityType().annotations.Hierarchy?.[`RecursiveHierarchyActions#${standardActionsContext.tableManifestConfiguration.hierarchyQualifier ?? ""}`]?.CopyAction;
323
+ if (!availableCopyAction) {
324
+ return constant(false);
325
+ }
326
+ const templateBindingExpression = converterContext.getTemplateType() !== TemplateType.ListReport ? UI.IsEditable : converterContext.getEntitySet()?.annotations.Common?.DraftRoot !== undefined; // To allow cut/paste for a draft TreeTable in a ListReport
327
+ return ifElse(equal(standardActionsContext.tableManifestConfiguration?.type, "TreeTable"), templateBindingExpression, false);
328
+ }
329
+
294
330
  /**
295
331
  * Gets the binding expressions for the properties of the 'Paste' action.
296
332
  *
@@ -300,11 +336,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
300
336
  * @param isInsertUpdateActionsTemplated
301
337
  * @returns The binding expressions for the properties of the 'Paste' action.
302
338
  */
303
- _exports.getCutVisibility = getCutVisibility;
339
+ _exports.getCopyVisibility = getCopyVisibility;
304
340
  function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
305
341
  const cutVisibility = getCutVisibility(converterContext, standardActionsContext);
342
+ const copyVisibility = getCopyVisibility(converterContext, standardActionsContext);
306
343
  const createVisibility = getCreateVisibility(converterContext, standardActionsContext, false, true);
307
- const pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, cutVisibility, isInsertUpdateActionsTemplated);
344
+ const pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, cutVisibility, copyVisibility, isInsertUpdateActionsTemplated);
308
345
  const pasteEnablement = getPasteEnablement(pasteVisibility, standardActionsContext, false);
309
346
  const pasteEnablementForContextMenu = getPasteEnablement(pasteVisibility, standardActionsContext, true);
310
347
  return {
@@ -462,7 +499,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
462
499
  * @returns The binding expression for the 'visible' property of the 'Paste' action.
463
500
  */
464
501
  _exports.getDeleteVisibility = getDeleteVisibility;
465
- function getPasteVisibility(converterContext, standardActionsContext, createVisibility, cutVisibility, isInsertUpdateActionsTemplated) {
502
+ function getPasteVisibility(converterContext, standardActionsContext, createVisibility, cutVisibility, copyVisibility, isInsertUpdateActionsTemplated) {
466
503
  //If it isn't deactivated within the manifest and we're operating in OP/blocks outside Fiori elements templates,
467
504
  //the treeTable's visibility relies on the cutvisibility,
468
505
  //while the visibility of the other table is determined by insertable restrictions and create visibility.
@@ -470,7 +507,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
470
507
  if (updateOnNavigation?._type === "Unresolvable") {
471
508
  updateOnNavigation = constant(true);
472
509
  }
473
- return and(standardActionsContext.tableManifestConfiguration.type === "TreeTable" ? cutVisibility : and(or(and(createVisibility, standardActionsContext.restrictions.isInsertable.expression), and(UI.IsEditable, updateOnNavigation)), notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), ![TemplateType.ListReport, TemplateType.AnalyticalListPage].includes(converterContext.getTemplateType())), isInsertUpdateActionsTemplated);
510
+ return and(standardActionsContext.tableManifestConfiguration.type === "TreeTable" ? or(cutVisibility, copyVisibility) : and(or(and(createVisibility, standardActionsContext.restrictions.isInsertable.expression), and(UI.IsEditable, updateOnNavigation)), notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), ![TemplateType.ListReport, TemplateType.AnalyticalListPage].includes(converterContext.getTemplateType())), isInsertUpdateActionsTemplated);
474
511
  }
475
512
 
476
513
  /**
@@ -602,9 +639,10 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
602
639
  */
603
640
  _exports.getDeleteEnablement = getDeleteEnablement;
604
641
  function getPasteEnablement(pasteVisibility, standardActionsContext, forContextMenu) {
642
+ const selectedContextsPath = !forContextMenu ? "selectedContexts" : "contextmenu/selectedContexts";
643
+ const pasteEnablementPath = !forContextMenu ? "nodeUpdatesInfo/pasteEnablement" : "contextmenu/nodeUpdatesInfo/pasteEnablement";
605
644
  if (standardActionsContext.tableManifestConfiguration.type === "TreeTable") {
606
- const numberOfSelectedContextsPath = !forContextMenu ? "numberOfSelectedContexts" : "contextmenu/numberOfSelectedContexts";
607
- return and(pasteVisibility, or(standardActionsContext.restrictions.isUpdatable.navigationExpression._type === "Unresolvable", standardActionsContext.restrictions.isUpdatable.expression), and(equal(length(pathInModel("pastableContexts", "internal"), true), 1), standardActionsContext.tableManifestConfiguration.type === "TreeTable" ? lessOrEqual(pathInModel(numberOfSelectedContextsPath, "internal"), 1) : true, equal(pathInModel("pasteAuthorized", "internal"), true)));
645
+ return and(pasteVisibility, or(standardActionsContext.restrictions.isUpdatable.navigationExpression._type === "Unresolvable", standardActionsContext.restrictions.isUpdatable.expression), ifElse(lessOrEqual(length(pathInModel(selectedContextsPath, "internal")), 1), equal(pathInModel(pasteEnablementPath, "internal"), true), false));
608
646
  }
609
647
  let updateOnNavigation = standardActionsContext.restrictions?.isUpdatable?.navigationExpression;
610
648
  if (updateOnNavigation?._type === "Unresolvable") {
@@ -650,13 +688,24 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
650
688
  */
651
689
  _exports.getMassEditEnablement = getMassEditEnablement;
652
690
  function getCutEnablement(cutVisibility, standardActionsContext, forContextMenu) {
653
- const numberOfSelectedContextsPath = !forContextMenu ? "numberOfSelectedContexts" : "contextmenu/numberOfSelectedContexts";
654
- const numberOfSelectedContexts = equal(pathInModel(numberOfSelectedContextsPath, "internal"), 1);
655
- const cutableContextsPath = !forContextMenu ? "cutableContexts" : "contextmenu/cutableContexts";
656
- const runtimeBinding = and(numberOfSelectedContexts, equal(length(pathInModel(cutableContextsPath, "internal"), true), 1));
691
+ const cutableContextsPath = !forContextMenu ? "nodeUpdatesInfo/cutEnablement" : "contextmenu/nodeUpdatesInfo/cutEnablement";
692
+ const runtimeBinding = pathInModel(cutableContextsPath, "internal");
657
693
  return and(cutVisibility, or(standardActionsContext.restrictions.isUpdatable.navigationExpression._type === "Unresolvable", standardActionsContext.restrictions.isUpdatable.expression), runtimeBinding);
658
694
  }
659
695
 
696
+ /**
697
+ * Gets the binding expression for the 'enabled' property of the 'Copy' action.
698
+ * @param copyVisibility
699
+ * @param forContextMenu
700
+ * @returns The binding expression for the 'enabled' property of the 'Copy' action.
701
+ */
702
+ _exports.getCutEnablement = getCutEnablement;
703
+ function getCopyEnablement(copyVisibility, forContextMenu) {
704
+ const copyableContextsPath = !forContextMenu ? "nodeUpdatesInfo/copyEnablement" : "contextmenu/nodeUpdatesInfo/copyEnablement";
705
+ const runtimeBinding = pathInModel(copyableContextsPath, "internal");
706
+ return and(copyVisibility, runtimeBinding);
707
+ }
708
+
660
709
  /**
661
710
  * Gets the binding expression for the 'enabled' property of the 'Move up' and 'Move down' actions.
662
711
  * @param moveUpDownVisibility
@@ -665,7 +714,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
665
714
  * @param forContextMenu
666
715
  * @returns The binding expression
667
716
  */
668
- _exports.getCutEnablement = getCutEnablement;
717
+ _exports.getCopyEnablement = getCopyEnablement;
669
718
  function getMoveUpDownEnablement(moveUpDownVisibility, standardActionsContext, forUp) {
670
719
  let forContextMenu = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
671
720
  const singleContextMovableUp = !forContextMenu ? "singleContextMovableUp" : "contextmenu/singleContextMovableUp";
@@ -696,4 +745,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/helpers/ModelHelper",
696
745
  _exports.isInDisplayMode = isInDisplayMode;
697
746
  return _exports;
698
747
  }, false);
699
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdGFuZGFyZEFjdGlvbktleXMiLCJDdXQiLCJDcmVhdGUiLCJEZWxldGUiLCJDcmVhdGlvblJvdyIsIlBhc3RlIiwiTWFzc0VkaXQiLCJJbnNpZ2h0cyIsIk1vdmVVcCIsIk1vdmVEb3duIiwiX2V4cG9ydHMiLCJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRpb25Nb2RlIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJjb2xsZWN0aW9uUGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiaGlkZGVuQW5ub3RhdGlvbiIsImNyZWF0ZSIsImlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuIiwiZGVsZXRlIiwidXBkYXRlIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwibmV3QWN0aW9uIiwiZ2V0TmV3QWN0aW9uIiwicmVzdHJpY3Rpb25zIiwiZ2V0UmVzdHJpY3Rpb25zIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImJJc0RyYWZ0U3VwcG9ydGVkIiwiTW9kZWxIZWxwZXIiLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJzdGFydGluZ0VudGl0eVNldCIsImFubm90YXRpb25zIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjdXJyZW50RW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiaXNFbnRpdHlTZXQiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJuZXdBY3Rpb25OYW1lIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJzQW5ub3RhdGlvblRlcm0iLCJiV2l0aE5hdmlnYXRpb25QYXRoIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYWN0aW9uQW5ub3RhdGlvblZhbHVlIiwiaXNTaW5nbGV0b24iLCJVSSIsImNvbnN0YW50IiwidmlzaXRlZE5hdmlnYXRpb25QYXRocyIsImdldFJlbGF0aXZlUGF0aHMiLCJwYXRoIiwic2luZ2xldG9uUGF0aFZpc2l0b3IiLCJnZXRDb252ZXJ0ZWRUeXBlcyIsInJlc3RyaWN0aW9uc0RlZiIsImtleSIsImZ1bmN0aW9uIiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsInBhdGhWaXNpdG9yIiwibmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvbkV4cHJlc3Npb24iLCJpZ25vcmVUYXJnZXRDb2xsZWN0aW9uIiwiYXV0aG9yaXplVW5yZXNvbHZhYmxlIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNEcmFmdE9yU3RpY2t5IiwiQ3JlYXRpb25Nb2RlIiwiRXh0ZXJuYWwiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlRXhwcmVzc2lvbiIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwidmlzaWJsZUV4cHJlc3Npb24iLCJlbmFibGVkIiwiZ2V0Q3JlYXRlRW5hYmxlbWVudCIsImVuYWJsZWRGb3JDb250ZXh0TWVudSIsInR5cGUiLCJBY3Rpb25UeXBlIiwiU3RhbmRhcmQiLCJnZXRTdGFuZGFyZEFjdGlvbkN1dCIsImN1dFZpc2liaWxpdHkiLCJnZXRDdXRWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXRDdXRFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duIiwiZm9yVXAiLCJjYW5DaGFuZ2VTaWJsaW5nIiwiSGllcmFyY2h5IiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiQ2hhbmdlTmV4dFNpYmxpbmdBY3Rpb24iLCJtb3ZlVmlzaWJpbGl0eSIsImFuZCIsImdldE1vdmVVcERvd25FbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJkZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVsZXRlVmlzaWJpbGl0eSIsImdldERlbGV0ZUVuYWJsZW1lbnQiLCJnZXRDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93VmlzaWJpbGl0eSIsImdldENyZWF0aW9uUm93RW5hYmxlbWVudCIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJ0ZW1wbGF0ZUJpbmRpbmdFeHByZXNzaW9uIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIklzRWRpdGFibGUiLCJpZkVsc2UiLCJlcXVhbCIsImlzSGllcmFyY2h5UGFyZW50Tm9kZVVwZGF0YWJsZSIsIm5vdCIsImlzQ29uc3RhbnQiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwiaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkIiwicGFzdGVWaXNpYmlsaXR5IiwiZ2V0UGFzdGVWaXNpYmlsaXR5IiwicGFzdGVFbmFibGVtZW50IiwiZ2V0UGFzdGVFbmFibGVtZW50IiwicGFzdGVFbmFibGVtZW50Rm9yQ29udGV4dE1lbnUiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwidmlzaWJsZUZvckNvbnRleHRNZW51IiwicGF0aEluTW9kZWwiLCJnZXRNYXNzRWRpdEVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzIiwidmlzdWFsaXphdGlvblBhdGgiLCJpbnNpZ2h0c1Zpc2liaWxpdHkiLCJnZXRJbnNpZ2h0c1Zpc2liaWxpdHkiLCJpbnNpZ2h0c0VuYWJsZW1lbnQiLCJnZXRJbnNpZ2h0c0VuYWJsZW1lbnQiLCJpc0ZvckNyZWF0aW9uUm93Iiwib3IiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNGb3JQYXN0ZSIsImlzSW5zZXJ0YWJsZSIsImlzQ3JlYXRlSGlkZGVuIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsIklzQ3JlYXRlTW9kZSIsImlzUGF0aEluTW9kZWxFeHByZXNzaW9uIiwiaXNEZWxldGVIaWRkZW4iLCJwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiIsImlzRGVsZXRhYmxlIiwiQW5hbHl0aWNhbExpc3RQYWdlIiwidXBkYXRlT25OYXZpZ2F0aW9uIiwiX3R5cGUiLCJub3RFcXVhbCIsImVuYWJsZVBhc3RlIiwiaW5jbHVkZXMiLCJpc1VwZGF0ZUhpZGRlbiIsIm1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3QiLCJtYXNzRWRpdCIsIk9iamVjdFBhZ2UiLCJGcmVlU3R5bGVQYWdlIiwicmVzdHJpY3Rpb25zSW5zZXJ0YWJsZSIsImluZGV4T2YiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImxhc3ROYXYiLCJwYXJ0bmVyIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZm9ybWF0UmVzdWx0IiwidGFibGVGb3JtYXR0ZXJzIiwidmFsaWRhdGVDcmVhdGlvblJvd0ZpZWxkcyIsImZvckNvbnRleHRNZW51IiwiY29uZGl0aW9ucyIsImNvbnRleHRQYXRoIiwicHVzaCIsIkNvbGxlY3Rpb25UeXBlIiwicmVzb2x2ZUFic29sdXRlUGF0aCIsInRhcmdldCIsImxlc3NPckVxdWFsIiwiY3JlYXRlRW5hYmxlbWVudCIsImRlbGV0YWJsZUNvbnRleHRzIiwidW5TYXZlZENvbnRleHRzIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJncmVhdGVyVGhhbiIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1BhdGgiLCJpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRQcm9wZXJ0eSIsInVwZGF0YWJsZUNvbnRleHRQcm9wZXJ0eSIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImlzSW5EaXNwbGF5TW9kZSIsInJ1bnRpbWVCaW5kaW5nIiwiY3V0YWJsZUNvbnRleHRzUGF0aCIsIm1vdmVVcERvd25WaXNpYmlsaXR5Iiwic2luZ2xlQ29udGV4dE1vdmFibGVVcCIsInNpbmdsZUNvbnRleHRNb3ZhYmxlRG93biIsImNoZWNrTXVsdGlwbGVWaXN1YWxpemF0aW9uIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzSW5saW5lRWRpdCIsInRlbXBsYXRlVHlwZSIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJvb2xlYW4sIEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLFxuXHRncmVhdGVyT3JFcXVhbCxcblx0Z3JlYXRlclRoYW4sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNQYXRoSW5Nb2RlbEV4cHJlc3Npb24sXG5cdGxlbmd0aCxcblx0bGVzc09yRXF1YWwsXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbFxufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQsIGlzTmF2aWdhdGlvblByb3BlcnR5LCBpc1NpbmdsZXRvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7XG5cdGdldFJlbGF0aXZlUGF0aHMsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoSW5zZXJ0YWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFVJLCBzaW5nbGV0b25QYXRoVmlzaXRvciB9IGZyb20gXCIuLi8uLi8uLi8uLi9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEFjdGlvblR5cGUsIENyZWF0aW9uTW9kZSwgVGVtcGxhdGVUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEluc2lnaHRzRW5hYmxlbWVudCwgZ2V0SW5zaWdodHNWaXNpYmlsaXR5IH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnMvSW5zaWdodHNIZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vVGFibGVcIjtcblxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb24gPSBCYXNlQWN0aW9uICYge1xuXHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkO1xuXHRpc1RlbXBsYXRlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHR2aXNpYmxlOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0dmlzaWJsZUV4cHJlc3Npb24/OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRlbmFibGVkRm9yQ29udGV4dE1lbnU/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcbn07XG5cbnR5cGUgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGUgPSB7XG5cdGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0bmF2aWdhdGlvbkV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG50eXBlIFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUgPSBSZWNvcmQ8c3RyaW5nLCBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZT47XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSB7XG5cdGNvbGxlY3Rpb25QYXRoOiBzdHJpbmc7XG5cdGhpZGRlbkFubm90YXRpb246IHtcblx0XHRjcmVhdGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHRkZWxldGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHR1cGRhdGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZDogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRhdmFpbGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlc3RyaWN0aW9uczogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZTtcbn07XG5cbmV4cG9ydCBjb25zdCBTdGFuZGFyZEFjdGlvbktleXMgPSB7XG5cdEN1dDogXCJTdGFuZGFyZEFjdGlvbjo6Q3V0XCIsXG5cdENyZWF0ZTogXCJTdGFuZGFyZEFjdGlvbjo6Q3JlYXRlXCIsXG5cdERlbGV0ZTogXCJTdGFuZGFyZEFjdGlvbjo6RGVsZXRlXCIsXG5cdENyZWF0aW9uUm93OiBcIlN0YW5kYXJkQWN0aW9uOjpDcmVhdGlvblJvd1wiLFxuXHRQYXN0ZTogXCJTdGFuZGFyZEFjdGlvbjo6UGFzdGVcIixcblx0TWFzc0VkaXQ6IFwiU3RhbmRhcmRBY3Rpb246Ok1hc3NFZGl0XCIsXG5cdEluc2lnaHRzOiBcIlN0YW5kYXJkQWN0aW9uOjpJbnNpZ2h0c1wiLFxuXHRNb3ZlVXA6IFwiU3RhbmRhcmRBY3Rpb246Ok1vdmVVcFwiLFxuXHRNb3ZlRG93bjogXCJTdGFuZGFyZEFjdGlvbjo6TW92ZURvd25cIlxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgY29udGV4dCBmb3IgdGhlIHN0YW5kYXJkIGFjdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGNyZWF0aW9uTW9kZVxuICogQHBhcmFtIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyAgVGhlIGNvbnRleHQgZm9yIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQge1xuXHRyZXR1cm4ge1xuXHRcdGNvbGxlY3Rpb25QYXRoOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0XHRjcmVhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiQ3JlYXRlSGlkZGVuXCIpLFxuXHRcdFx0ZGVsZXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkRlbGV0ZUhpZGRlblwiKSxcblx0XHRcdHVwZGF0ZTogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgXCJVcGRhdGVIaWRkZW5cIilcblx0XHR9LFxuXHRcdGNyZWF0aW9uTW9kZTogY3JlYXRpb25Nb2RlLFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZDogaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdG5ld0FjdGlvbjogZ2V0TmV3QWN0aW9uKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHRyZXN0cmljdGlvbnM6IGdldFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBzdGlja3kgb3IgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkID0gKGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcblx0XHQ/IHRydWVcblx0XHQ6IGZhbHNlO1xuXG5cdHJldHVybiBiSXNEcmFmdFN1cHBvcnRlZCB8fCBiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgbmV3QWN0aW9uIGludG8gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbmV3IGFjdGlvbiBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdBY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogeyBuYW1lOiBzdHJpbmc7IGF2YWlsYWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IH0gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0Y29uc3QgbmV3QWN0aW9uID0gaXNFbnRpdHlTZXQoY3VycmVudEVudGl0eVNldClcblx0XHQ/IGN1cnJlbnRFbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Q/Lk5ld0FjdGlvbiA/P1xuXHRcdCAgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb25cblx0XHQ6IHVuZGVmaW5lZDtcblx0Y29uc3QgbmV3QWN0aW9uTmFtZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gPSBuZXdBY3Rpb24/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0Y29uc3QgYXZhaWxhYmxlUHJvcGVydHkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogbmV3QWN0aW9uTmFtZSxcblx0XHRcdGF2YWlsYWJsZTogZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uPEJvb2xlYW4+KGF2YWlsYWJsZVByb3BlcnR5LCBbXSwgdHJ1ZSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgYWN0aW9uIHZpc2liaWxpdHkgY29uZmlndXJlZCBpbnRvIGFubm90YXRpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHNBbm5vdGF0aW9uVGVybVxuICogQHBhcmFtIGJXaXRoTmF2aWdhdGlvblBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c0Fubm90YXRpb25UZXJtOiBcIkNyZWF0ZUhpZGRlblwiIHwgXCJVcGRhdGVIaWRkZW5cIiB8IFwiRGVsZXRlSGlkZGVuXCIsXG5cdGJXaXRoTmF2aWdhdGlvblBhdGggPSB0cnVlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHQvLyBUaGUgYW5ub3RhdGlvbnMgaW4gcXVlc3Rpb24gKENyZWF0ZUhpZGRlbiwgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4pIG1vc3Qgc3BlY2lmaWNhbGx5IGNhbiBiZSBkZWZpbmVkIG9uIEVudGl0eVNldC5cblx0Ly8gSW4gc2V2ZXJhbCBjYXNlcywgZmFsbGJhY2sgdG8gRW50aXR5VHlwZSBuZWVkcyB0byBiZSBjaGVja2VkOlxuXHQvLyAtIEluIGNhc2Ugb2Ygc2luZ2xldG9uIChhbm5vdGF0aW9ucyBkbyBub3QgYXBwbHkpXG5cdC8vIC0gRW50aXR5U2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChjb250YWlubWVudCBvciBubyBuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nKVxuXHQvLyAtIEVudGl0eVNldCBjYW4gYmUgZGV0ZXJtaW5lZCwgYnV0IHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBkZWZpbmVkIHRoZXJlXG5cblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGFjdGlvbkFubm90YXRpb25WYWx1ZSA9XG5cdFx0KCFpc1NpbmdsZXRvbihjdXJyZW50RW50aXR5U2V0KSAmJiBjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VST8uW3NBbm5vdGF0aW9uVGVybV0pIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMuVUk/LltzQW5ub3RhdGlvblRlcm1dO1xuXG5cdGlmICghYWN0aW9uQW5ub3RhdGlvblZhbHVlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdHJldHVybiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oYWN0aW9uQW5ub3RhdGlvblZhbHVlLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIChwYXRoOiBzdHJpbmcpID0+XG5cdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzKVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFubm90YXRlZCByZXN0cmljdGlvbnMgZm9yIHRoZSBhY3Rpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSByZXN0cmljdGlvbiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHJlc3RyaWN0aW9uc0RlZiA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNJbnNlcnRhYmxlXCIsXG5cdFx0XHRmdW5jdGlvbjogaXNQYXRoSW5zZXJ0YWJsZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzVXBkYXRhYmxlXCIsXG5cdFx0XHRmdW5jdGlvbjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdGZ1bmN0aW9uOiBpc1BhdGhEZWxldGFibGVcblx0XHR9XG5cdF07XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+ID0ge307XG5cdHJlc3RyaWN0aW9uc0RlZi5mb3JFYWNoKGZ1bmN0aW9uIChkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pLFxuXHRcdFx0bmF2aWdhdGlvbkV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pXG5cdFx0fTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRlbXBsYXRpbmcgZm9yIGluc2VydC91cGRhdGUgYWN0aW9ucyBpcyBtYW5kYXRvcnkuXG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGlzRHJhZnRPclN0aWNreVxuICogQHJldHVybnMgVHJ1ZSBpZiB3ZSBuZWVkIHRvIHRlbXBsYXRlIGluc2VydCBvciB1cGRhdGUgYWN0aW9ucywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4pOiBib29sZWFuIHtcblx0cmV0dXJuIGlzRHJhZnRPclN0aWNreSB8fCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBzdGFuZGFyZCBhY3Rpb24gaW5mb1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogU3RhbmRhcmRBY3Rpb24ge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oY3JlYXRlVmlzaWJpbGl0eSksXG5cdFx0dmlzaWJsZUV4cHJlc3Npb246IGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHksIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGUsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ0N1dCcgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgc3RhbmRhcmQgYWN0aW9uIGluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uQ3V0KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgY3V0VmlzaWJpbGl0eSA9IGdldEN1dFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlZmF1bHRUZW1wbGF0aW5nKGN1dFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihjdXRWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXRDdXRFbmFibGVtZW50KGN1dFZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGZhbHNlKSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXRDdXRFbmFibGVtZW50KGN1dFZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5DdXQsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnTW92ZSB1cCcgYW5kICdNb3ZlIGRvd24nIGFjdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBmb3JVcFxuICogQHJldHVybnMgVGhlIHN0YW5kYXJkIGFjdGlvbiBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbk1vdmVVcERvd24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Zm9yVXA6IGJvb2xlYW5cbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgY2FuQ2hhbmdlU2libGluZyA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bXG5cdFx0XHRgUmVjdXJzaXZlSGllcmFyY2h5QWN0aW9ucyMke3N0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uaGllcmFyY2h5UXVhbGlmaWVyID8/IFwiXCJ9YFxuXHRcdF0/LkNoYW5nZU5leHRTaWJsaW5nQWN0aW9uICE9PSB1bmRlZmluZWQ7XG5cdGNvbnN0IG1vdmVWaXNpYmlsaXR5ID0gYW5kKGdldEN1dFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksIGNhbkNoYW5nZVNpYmxpbmcpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXREZWZhdWx0VGVtcGxhdGluZyhtb3ZlVmlzaWJpbGl0eSkpLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKG1vdmVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXRNb3ZlVXBEb3duRW5hYmxlbWVudChtb3ZlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZm9yVXApKSxcblx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKGdldE1vdmVVcERvd25FbmFibGVtZW50KG1vdmVWaXNpYmlsaXR5LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBmb3JVcCwgdHJ1ZSkpLFxuXHRcdGtleTogZm9yVXAgPyBTdGFuZGFyZEFjdGlvbktleXMuTW92ZVVwIDogU3RhbmRhcmRBY3Rpb25LZXlzLk1vdmVEb3duLFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdEZWxldGUnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgZGVsZXRlVmlzaWJpbGl0eSA9IGdldERlbGV0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0RGVmYXVsdFRlbXBsYXRpbmcoZGVsZXRlVmlzaWJpbGl0eSkpLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKGRlbGV0ZVZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlbGV0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZGVsZXRlVmlzaWJpbGl0eSwgZmFsc2UpKSxcblx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlbGV0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZGVsZXRlVmlzaWJpbGl0eSwgdHJ1ZSkpLFxuXHRcdGtleTogU3RhbmRhcmRBY3Rpb25LZXlzLkRlbGV0ZSxcblx0XHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdDcmVhdGlvblJvdycgYWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhY3R1YWxseSBhbiBhY3Rpb24gdGhhdCBpcyB0ZW1wbGF0ZWQgYXMgYSBidXR0b24gYnV0IGl0cyBwcm9wZXJ0aWVzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBhbiBNREMgZmVhdHVyZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMgU3RhbmRhcmRBY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0aW9uUm93KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgY3JlYXRpb25Sb3dWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCB0cnVlKTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0aW9uUm93VmlzaWJpbGl0eSwgdHJ1ZSkpLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKGNyZWF0aW9uUm93VmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRpb25Sb3dFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0aW9uUm93VmlzaWJpbGl0eSkpLFxuXHRcdGtleTogU3RhbmRhcmRBY3Rpb25LZXlzLkNyZWF0aW9uUm93LFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdDdXQnIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0N1dCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3V0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zPy5pc1VwZGF0YWJsZT8uZXhwcmVzc2lvbjtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdD8gVUkuSXNFZGl0YWJsZVxuXHRcdFx0OiAoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdCAhPT0gdW5kZWZpbmVkOyAvLyBUbyBhbGxvdyBjdXQvcGFzdGUgZm9yIGEgZHJhZnQgVHJlZVRhYmxlIGluIGEgTGlzdFJlcG9ydFxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGVxdWFsKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24/LnR5cGUsIFwiVHJlZVRhYmxlXCIpLFxuXHRcdGFuZChcblx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uaXNIaWVyYXJjaHlQYXJlbnROb2RlVXBkYXRhYmxlISxcblx0XHRcdG5vdChhbmQoaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBmYWxzZSkpKSxcblx0XHRcdHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb25cblx0XHQpLFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdQYXN0ZScgYWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhY3R1YWxseSBhbiBhY3Rpb24gdGhhdCBpcyBkaXNwbGF5ZWQgYXMgYSBidXR0b24gYnV0IGl0cyBwcm9wZXJ0aWVzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBhbiBNREMgZmVhdHVyZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGN1dFZpc2liaWxpdHkgPSBnZXRDdXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBmYWxzZSwgdHJ1ZSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRjdXRWaXNpYmlsaXR5LFxuXHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHQpO1xuXHRjb25zdCBwYXN0ZUVuYWJsZW1lbnQgPSBnZXRQYXN0ZUVuYWJsZW1lbnQocGFzdGVWaXNpYmlsaXR5LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBmYWxzZSk7XG5cdGNvbnN0IHBhc3RlRW5hYmxlbWVudEZvckNvbnRleHRNZW51ID0gZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdHJ1ZSk7XG5cdHJldHVybiB7XG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24ocGFzdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihwYXN0ZUVuYWJsZW1lbnQpLFxuXHRcdGVuYWJsZWRGb3JDb250ZXh0TWVudTogY29tcGlsZUV4cHJlc3Npb24ocGFzdGVFbmFibGVtZW50Rm9yQ29udGV4dE1lbnUpLFxuXHRcdGtleTogU3RhbmRhcmRBY3Rpb25LZXlzLlBhc3RlLFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgbWFzc0VkaXRWaXNpYmlsaXR5ID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlZmF1bHRUZW1wbGF0aW5nKG1hc3NFZGl0VmlzaWJpbGl0eSkpLFxuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKG1hc3NFZGl0VmlzaWJpbGl0eSksXG5cdFx0Ly8gRm9yIHRoZSBjb250ZXh0IG1lbnUsIHRoZSB2aXNpYmlsaXR5IHNob3VsZCBhbHNvIGNvbnNpZGVyIHRoZSAnaW5hY3RpdmVDb250ZXh0JyBwcm9wZXJ0eTpcblx0XHQvLyBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIHNlbGVjdGVkIGNvbnRleHQgaXMgYWN0aXZlIChpLmUuIFwiY29udGV4dG1lbnUvaW5hY3RpdmVDb250ZXh0XCIgaXMgZmFsc2UpLCB0aGUgYWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSBjb250ZXh0IG1lbnVcblx0XHQvLyBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgdGFibGUgbWFuaWZlc3Qgc2V0dGluZyBcImNyZWF0aW9uTW9kZVwiIGlzIFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHR2aXNpYmxlRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0YW5kKG1hc3NFZGl0VmlzaWJpbGl0eSwgZXF1YWwocGF0aEluTW9kZWwoXCJjb250ZXh0bWVudS9pbmFjdGl2ZUNvbnRleHRcIiwgXCJpbnRlcm5hbFwiKSwgZmFsc2UpKVxuXHRcdCksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0TWFzc0VkaXRFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIG1hc3NFZGl0VmlzaWJpbGl0eSkpLFxuXHRcdGVuYWJsZWRGb3JDb250ZXh0TWVudTogY29tcGlsZUV4cHJlc3Npb24oZ2V0TWFzc0VkaXRFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIG1hc3NFZGl0VmlzaWJpbGl0eSwgdHJ1ZSkpLFxuXHRcdGtleTogU3RhbmRhcmRBY3Rpb25LZXlzLk1hc3NFZGl0LFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ0FkZENhcmRzVG9JbnNpZ2h0cycgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ0FkZENhcmRzVG9JbnNpZ2h0cycgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25JbnNpZ2h0cyhcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nXG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGluc2lnaHRzVmlzaWJpbGl0eSA9IGdldEluc2lnaHRzVmlzaWJpbGl0eShcIlRhYmxlXCIsIGNvbnZlcnRlckNvbnRleHQsIHZpc3VhbGl6YXRpb25QYXRoLCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgaW5zaWdodHNFbmFibGVtZW50ID0gYW5kKGluc2lnaHRzVmlzaWJpbGl0eSwgZ2V0SW5zaWdodHNFbmFibGVtZW50KCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXREZWZhdWx0VGVtcGxhdGluZyhpbnNpZ2h0c1Zpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihpbnNpZ2h0c1Zpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGluc2lnaHRzRW5hYmxlbWVudCksXG5cdFx0a2V5OiBTdGFuZGFyZEFjdGlvbktleXMuSW5zaWdodHMsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlICdDcmVhdGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIGlzRm9yQ3JlYXRpb25Sb3dcbiAqIEByZXR1cm5zIFRoZSBjcmVhdGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRjcmVhdGVWaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdGlzRm9yQ3JlYXRpb25Sb3cgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly9UZW1wbGF0aW5nIG9mIENyZWF0ZSBCdXR0b24gaXMgbm90IGRvbmU6XG5cdC8vIFx0IC0gSWYgQnV0dG9uIGlzIG5ldmVyIHZpc2libGUoY292ZXJlZCB0aGUgRXh0ZXJuYWwgY3JlYXRlIGJ1dHRvbiwgbmV3IEFjdGlvbilcblx0Ly9cdCAtIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRlIEJ1dHRvblxuXHQvL1x0IC0gb3IgQ3JlYXRpb25Nb2RlIGlzIG5vdCBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRpb25Sb3cgQnV0dG9uXG5cblx0cmV0dXJuIGFuZChcblx0XHQvL1hOT1IgZ2F0ZVxuXHRcdG9yKFxuXHRcdFx0YW5kKGlzRm9yQ3JlYXRpb25Sb3csIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpLFxuXHRcdFx0YW5kKCFpc0ZvckNyZWF0aW9uUm93LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KVxuXHRcdCksXG5cdFx0b3Iobm90KGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSkpLCBjcmVhdGVWaXNpYmlsaXR5KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIG5vbi1DcmVhdGUgYWN0aW9ucy5cbiAqIEBwYXJhbSBhY3Rpb25WaXNpYmlsaXR5XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdGVtcGxhdGluZyBvZiB0aGUgbm9uLUNyZWF0ZSBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRpbmcoYWN0aW9uVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG9yKG5vdChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpKSwgYWN0aW9uVmlzaWJpbGl0eSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBpc0ZvckNyZWF0aW9uUm93XG4gKiBAcGFyYW0gaXNGb3JQYXN0ZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0ZvckNyZWF0aW9uUm93ID0gZmFsc2UsXG5cdGlzRm9yUGFzdGUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuID0gaXNGb3JDcmVhdGlvblJvd1xuXHRcdD8gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgXCJDcmVhdGVIaWRkZW5cIiwgZmFsc2UpXG5cdFx0OiBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmhpZGRlbkFubm90YXRpb24uY3JlYXRlO1xuXHRjb25zdCBuZXdBY3Rpb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0Lm5ld0FjdGlvbjtcblx0Ly9DcmVhdGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IC0gSWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgZXh0ZXJuYWxcblx0Ly8gICAgICAtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCBhbmQgY3JlYXRlIGlzIG5vdCBoaWRkZW5cblx0Ly9cdFx0LSBPdGhlcndpc2UgdGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgVUkuSXNFZGl0YWJsZVxuXHQvL1x0IC0gT3RoZXJ3aXNlXG5cdC8vXHRcdC0gSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB2YWxpZCB0aGVuIGNyZWF0ZSBidXR0b24gaXNuJ3QgdmlzaWJsZVxuXHQvL1x0XHRcdC0gbm8gbmV3QWN0aW9uIGF2YWlsYWJsZVxuXHQvL1x0XHRcdC0gSXQncyBub3QgaW5zZXJ0YWJsZSBhbmQgdGhlcmUgaXMgbm90IGEgbmV3IGFjdGlvblxuXHQvL1x0XHRcdC0gY3JlYXRlIGlzIGhpZGRlblxuXHQvL1x0XHRcdC0gVGhlcmUgYXJlIG11bHRpcGxlIHZpc3VhbGl6YXRpb25zXG5cdC8vXHRcdFx0LSBJdCdzIGFuIEFuYWx5dGljYWwgTGlzdCBQYWdlXG5cdC8vXHRcdFx0LSBVc2VzIElubGluZUNyZWF0aW9uUm93cyBtb2RlIGFuZCBhIFJlc3BvbnNpdmUgdGFibGUgdHlwZSwgd2l0aCB0aGUgcGFyYW1ldGVyIGlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgdG8gdHJ1ZSB3aGlsZSBub3QgaW4gY3JlYXRlIG1vZGVcblx0Ly8gICAgICAgICAgXHQtIHdoZW4gY2FsY3VsYXRpbmcgcGFzdGUgYnV0dG9uIHZpc2liaWxpdHksICB3ZSBmb3JjZSB0aGUgY29uZGl0aW9uIHRvIGZhbHNlIHdpdGggdGhlIGlzRm9yUGFzdGUgcHJvcGVydHlcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvLyBcdCBcdC0gSWYgd2UncmUgb24gdGhlIGxpc3QgcmVwb3J0IC0+XG5cdC8vIFx0IFx0XHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0XHQtIE90aGVyd2lzZSwgY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgXHQtIE90aGVyd2lzZVxuXHQvLyBcdCAgXHQgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSBVSS5Jc0VkaXRhYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCxcblx0XHRhbmQobm90KGlzQ3JlYXRlSGlkZGVuKSwgb3IoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsIFVJLklzRWRpdGFibGUpKSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQobmV3QWN0aW9uPy5hdmFpbGFibGUpLCBlcXVhbChuZXdBY3Rpb24/LmF2YWlsYWJsZSwgZmFsc2UpKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksICFuZXdBY3Rpb24pLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbiksIGVxdWFsKGlzQ3JlYXRlSGlkZGVuLCB0cnVlKSksXG5cdFx0XHRcdGFuZChcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyxcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy50eXBlID09PSBcIlJlc3BvbnNpdmVUYWJsZVwiLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdGFuZChcblx0XHRcdFx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dD8udGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgPT09IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRub3QoaXNGb3JQYXN0ZSlcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0VUkuSXNDcmVhdGVNb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRvcihub3QoaXNQYXRoSW5Nb2RlbEV4cHJlc3Npb24oaXNDcmVhdGVIaWRkZW4pKSwgbm90KGlzQ3JlYXRlSGlkZGVuKSksXG5cdFx0XHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdEZWxldGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBBTFBcblx0Ly8gICAtIElmIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGUgc2V0IHRvIGZhbHNlIC0+IG5vdCB2aXNpYmxlXG5cdC8vICAgLSBPdGhlcndpc2Vcblx0Ly9cdFx0XHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBpcyB0cnVlIC0+IG5vdCB2aXNpYmxlXG5cdC8vXHRcdFx0LSBPdGhlcndpc2Vcblx0Ly8gXHQgXHRcdFx0LSBJZiB3ZSdyZSBvbiBPUCAtPiBkZXBlbmRpbmcgaWYgVUkgaXMgZWRpdGFibGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSxcblx0XHRmYWxzZSxcblx0XHRpZkVsc2UoXG5cdFx0XHRhbmQoaXNDb25zdGFudChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhEZWxldGFibGVFeHByZXNzaW9uLCBmYWxzZSkpLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KGlzRGVsZXRlSGlkZGVuKSwgZXF1YWwoaXNEZWxldGVIaWRkZW4sIGNvbnN0YW50KHRydWUpKSksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRcdFx0YW5kKG5vdChpc0RlbGV0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpLFxuXHRcdFx0XHRcdG5vdChhbmQoaXNQYXRoSW5Nb2RlbEV4cHJlc3Npb24oaXNEZWxldGVIaWRkZW4pLCBpc0RlbGV0ZUhpZGRlbikpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGNyZWF0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSBjdXRWaXNpYmlsaXR5XG4gKiBAcGFyYW0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRjcmVhdGVWaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdGN1dFZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHQvL0lmIGl0IGlzbid0IGRlYWN0aXZhdGVkIHdpdGhpbiB0aGUgbWFuaWZlc3QgYW5kIHdlJ3JlIG9wZXJhdGluZyBpbiBPUC9ibG9ja3Mgb3V0c2lkZSBGaW9yaSBlbGVtZW50cyB0ZW1wbGF0ZXMsXG5cdC8vdGhlIHRyZWVUYWJsZSdzIHZpc2liaWxpdHkgcmVsaWVzIG9uIHRoZSBjdXR2aXNpYmlsaXR5LFxuXHQvL3doaWxlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBvdGhlciB0YWJsZSBpcyBkZXRlcm1pbmVkIGJ5IGluc2VydGFibGUgcmVzdHJpY3Rpb25zIGFuZCBjcmVhdGUgdmlzaWJpbGl0eS5cblx0bGV0IHVwZGF0ZU9uTmF2aWdhdGlvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zPy5pc1VwZGF0YWJsZT8ubmF2aWdhdGlvbkV4cHJlc3Npb247XG5cdGlmICh1cGRhdGVPbk5hdmlnYXRpb24/Ll90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiKSB7XG5cdFx0dXBkYXRlT25OYXZpZ2F0aW9uID0gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblx0cmV0dXJuIGFuZChcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCJcblx0XHRcdD8gY3V0VmlzaWJpbGl0eVxuXHRcdFx0OiBhbmQoXG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRhbmQoY3JlYXRlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIHVwZGF0ZU9uTmF2aWdhdGlvbilcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdG5vdEVxdWFsKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uZW5hYmxlUGFzdGUsIGZhbHNlKSxcblx0XHRcdFx0XHQhW1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmNsdWRlcyhjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKVxuXHRcdFx0ICApLFxuXHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0bWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdDogYm9vbGVhbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24/Lm1hc3NFZGl0LmVuYWJsZWQgfHwgZmFsc2U7XG5cdGNvbnN0IHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24gPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlXG5cdFx0XHQ/IFVJLklzRWRpdGFibGVcblx0XHRcdDogW1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZV0uaW5jbHVkZXMoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSk7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gYW5kKFxuXHRcdG5vdChhbmQoaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBmYWxzZSkpKSxcblx0XHRtYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0LFxuXHRcdHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24sXG5cdFx0bm90KGlzVXBkYXRlSGlkZGVuKVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgY3JlYXRpb25Sb3cuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGlvblJvd1Zpc2liaWxpdHlcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlIGNyZWF0aW9uUm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRpb25Sb3dFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0aW9uUm93VmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCByZXN0cmljdGlvbnNJbnNlcnRhYmxlID0gaXNQYXRoSW5zZXJ0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwge1xuXHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0XHRpZiAocGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRwYXRoID0gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpO1xuXHRcdFx0XHRyZXR1cm4gcGF0aDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdFx0XHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXMpIHtcblx0XHRcdFx0Y29uc3QgbGFzdE5hdiA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRjb25zdCBwYXJ0bmVyID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGFzdE5hdikgJiYgbGFzdE5hdi5wYXJ0bmVyO1xuXHRcdFx0XHRpZiAocGFydG5lcikge1xuXHRcdFx0XHRcdHBhdGggPSBgJHtwYXJ0bmVyfS8ke3BhdGh9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID1cblx0XHRyZXN0cmljdGlvbnNJbnNlcnRhYmxlLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiXG5cdFx0XHQ/IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRcdFx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBbXSlcblx0XHRcdCAgfSlcblx0XHRcdDogcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZTtcblxuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0aW9uUm93VmlzaWJpbGl0eSxcblx0XHRpc0luc2VydGFibGUsXG5cdFx0b3IoXG5cdFx0XHQhc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhLFxuXHRcdFx0Zm9ybWF0UmVzdWx0KFtwYXRoSW5Nb2RlbChcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBcImludGVybmFsXCIpXSwgdGFibGVGb3JtYXR0ZXJzLnZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY29uZGl0aW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0Y29uc3QgY29udGV4dFBhdGg6IHN0cmluZyA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXG5cdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cykge1xuXHRcdC8vIGZvciBJbmxpbmUgY3JlYXRpb24gcm93cyBjcmVhdGUgY2FuIGJlIGhpZGRlbiB2aWEgbWFuaWZlc3QgYW5kIHRoaXMgc2hvdWxkIG5vdCBpbXBhY3QgaXRzIGVuYWJsZW1lbnRcblx0XHRjb25kaXRpb25zLnB1c2goYW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmhpZGRlbkFubm90YXRpb24uY3JlYXRlKSwgVUkuSXNFZGl0YWJsZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbmRpdGlvbnMucHVzaChjcmVhdGVWaXNpYmlsaXR5KTtcblx0fVxuXG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBDb2xsZWN0aW9uVHlwZSA9IGNvbnZlcnRlckNvbnRleHQucmVzb2x2ZUFic29sdXRlUGF0aDxFbnRpdHlTZXQ+KHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY29sbGVjdGlvblBhdGgpLnRhcmdldDtcblx0Y29uZGl0aW9ucy5wdXNoKFxuXHRcdG9yKFxuXHRcdFx0aXNFbnRpdHlTZXQoQ29sbGVjdGlvblR5cGUpLFxuXHRcdFx0YW5kKGlzSW5zZXJ0YWJsZSwgb3IoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UsIFVJLklzRWRpdGFibGUpKVxuXHRcdClcblx0KTtcblxuXHRpZiAoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgdGhlIGNyZWF0ZSBidXR0b24gc2hhbGwgYmUgYWN0aXZlIG9ubHkgaWYgMCBvciAxIGl0ZW1zIGFyZSBzZWxlY3RlZCAocGFyZW50IG5vZGUpXG5cdFx0Ly8gV2UgZG8gbm90IG5lZWQgdGhpcyBjb25kaXRpb24gb24gdGhlIENvbnRleHRNZW51LCBhcyB3ZSBvbmx5IGNyZWF0ZSBvbiB0aGUgc2VsZWN0ZWQgbm9kZVxuXHRcdGNvbmRpdGlvbnMucHVzaChsZXNzT3JFcXVhbChwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpKTtcblxuXHRcdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUVuYWJsZW1lbnQpIHtcblx0XHRcdC8vIFRoZXJlJ3MgYSBjcmVhdGVFbmFibGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBhZGRpdGlvbm5hbCBjb25kaXRpb25zXG5cdFx0XHQvLyBUaGVzZSBjb25kaXRpb25zIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKG5vdEVxdWFsKHBhdGhJbk1vZGVsKGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50L0NyZWF0ZVwiLCBcImludGVybmFsXCIpLCBmYWxzZSkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhbmQoLi4uY29uZGl0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBkZWxldGVWaXNpYmlsaXR5XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gVGhlIGZvbGxvd2luZyBjb250ZXh0cyBhcmUgZmlsbGVkIGF0IHJ1bnRpbWUgd2hlbiBhIHVzZXIgc2VsZWN0cyBvbmUgb3IgbW9yZSBpdGVtcyBmcm9tIGEgbGlzdC5cblx0Ly8gQ2hlY2tzIGFyZSB0aGVuIG1hZGUgaW4gZnVuY3Rpb24gdXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMgaW4gZmlsZSBEZWxldGVIZWxwZXIgdG8gc2VlIGlmIHRoZXJlXG5cdC8vIGFyZSBpdGVtcyB0aGF0IGNhbiBiZSBkZWxldGVkLCB0aHVzIHRoZSBkZWxldGUgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkIGluIHRoZXNlIGNhc2VzLlxuXHRjb25zdCBjb250ZXh0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXHRjb25zdCBkZWxldGFibGVDb250ZXh0cyA9IHBhdGhJbk1vZGVsKGNvbnRleHRQYXRoICsgXCJkZWxldGFibGVDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCB1blNhdmVkQ29udGV4dHMgPSBwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwidW5TYXZlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgPSBwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlID0gcGF0aEluTW9kZWwoY29udGV4dFBhdGggKyBcImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcIiwgXCJpbnRlcm5hbFwiKTtcblxuXHQvLyBcIlVucmVzb2x2YWJsZVwiIGluIG5hdmlnYXRpb25FeHByZXNzaW9uIGlzIGludGVycHJldGVkIHRvIG1lYW4gdGhhdCB0aGVyZSBhcmUgbm8gbmF2aWdhdGlvbkV4cHJlc3Npb25zXG5cdC8vIGRlZmluZWQuXG5cdC8vIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb24gaXMgYSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBjb21lc1xuXHQvLyBmcm9tIHRoZSBEZWxldGUgcmVzdHJpY3Rpb25zIGRlZmluZWQgaW4gTmF2aWdhdGlvblJlc3RyaWN0aW9ucyBmb3IgdGhpcyBlbnRpdHkuIEluIG9yZGVyIHRvXG5cdC8vIGJlIGRlbGV0YWJsZSwgdGhlIGl0ZW0gbXVzdCBhbHNvIGJlIGFsbG93ZWQgdG8gYmUgZGVsZXRhYmxlIGFjY29yZGluZyB0byB0aGUgRGVsZXRlIFJlc3RyaWN0aW9uc1xuXHQvLyBvbiB0aGUgZW50aXR5IGl0c2VsZi5cblx0cmV0dXJuIGFuZChcblx0XHRkZWxldGVWaXNpYmlsaXR5LFxuXHRcdG9yKFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0RlbGV0YWJsZS5leHByZXNzaW9uXG5cdFx0KSxcblx0XHRvcihcblx0XHRcdGdyZWF0ZXJUaGFuKGxlbmd0aChkZWxldGFibGVDb250ZXh0cywgdHJ1ZSksIDApLFxuXHRcdFx0Z3JlYXRlclRoYW4obGVuZ3RoKGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIHRydWUpLCAwKSxcblx0XHRcdGdyZWF0ZXJUaGFuKGxlbmd0aChkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLCB0cnVlKSwgMCksXG5cdFx0XHRncmVhdGVyVGhhbihsZW5ndGgodW5TYXZlZENvbnRleHRzLCB0cnVlKSwgMClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBwYXN0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdQYXN0ZScgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFzdGVFbmFibGVtZW50KFxuXHRwYXN0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNQYXRoID0gIWZvckNvbnRleHRNZW51ID8gXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiA6IFwiY29udGV4dG1lbnUvbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCI7XG5cdFx0cmV0dXJuIGFuZChcblx0XHRcdHBhc3RlVmlzaWJpbGl0eSxcblx0XHRcdG9yKFxuXHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIixcblx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvblxuXHRcdFx0KSxcblx0XHRcdGFuZChcblx0XHRcdFx0ZXF1YWwobGVuZ3RoKHBhdGhJbk1vZGVsKFwicGFzdGFibGVDb250ZXh0c1wiLCBcImludGVybmFsXCIpLCB0cnVlKSwgMSksXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJUcmVlVGFibGVcIlxuXHRcdFx0XHRcdD8gbGVzc09yRXF1YWwocGF0aEluTW9kZWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzUGF0aCwgXCJpbnRlcm5hbFwiKSwgMSlcblx0XHRcdFx0XHQ6IHRydWUsXG5cdFx0XHRcdGVxdWFsKHBhdGhJbk1vZGVsKFwicGFzdGVBdXRob3JpemVkXCIsIFwiaW50ZXJuYWxcIiksIHRydWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXHRsZXQgdXBkYXRlT25OYXZpZ2F0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnM/LmlzVXBkYXRhYmxlPy5uYXZpZ2F0aW9uRXhwcmVzc2lvbjtcblx0aWYgKHVwZGF0ZU9uTmF2aWdhdGlvbj8uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIpIHtcblx0XHR1cGRhdGVPbk5hdmlnYXRpb24gPSBjb25zdGFudCh0cnVlKTtcblx0fVxuXHRyZXR1cm4gYW5kKHVwZGF0ZU9uTmF2aWdhdGlvbiwgcGFzdGVWaXNpYmlsaXR5KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gbWFzc0VkaXRWaXNpYmlsaXR5XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnTWFzc0VkaXQnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0RW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRtYXNzRWRpdFZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5ID1cblx0XHQhaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikgJiZcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIjtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L251bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiO1xuXHRjb25zdCB1cGRhdGFibGVDb250ZXh0UHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcInVwZGF0YWJsZUNvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L3VwZGF0YWJsZUNvbnRleHRzXCI7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKHBhdGhJbk1vZGVsKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0UHJvcGVydHksIFwiaW50ZXJuYWxcIiksIDEpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKHBhdGhJbk1vZGVsKHVwZGF0YWJsZUNvbnRleHRQcm9wZXJ0eSwgXCJpbnRlcm5hbFwiKSksIDEpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgYkRpc3BsYXlNb2RlID0gaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdC8vIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIGJpbmRpbmcgaW4gY2FzZVxuXHQvLyAxLiBVcGRhdGUgaXMgZGVwZW5kZW50IG9uIGN1cnJlbnQgZW50aXR5IHByb3BlcnR5IChpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5IGlzIHRydWUpLlxuXHQvLyAyLiBUaGUgdGFibGUgaXMgcmVhZCBvbmx5IGFuZCBkcmFmdCBlbmFibGVkKGxpa2UgTFIpLCBpbiB0aGlzIGNhc2Ugb25seSBhY3RpdmUgY29udGV4dHMgY2FuIGJlIG1hc3MgZWRpdGVkLlxuXHQvLyAgICBTbywgdXBkYXRlIGRlcGVuZHMgb24gJ0lzQWN0aXZlRW50aXR5JyB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBjaGVja2VkIHJ1bnRpbWUuXG5cdGNvbnN0IHJ1bnRpbWVCaW5kaW5nID0gaWZFbHNlKFxuXHRcdG9yKGFuZChiRGlzcGxheU1vZGUsIGJJc0RyYWZ0U3VwcG9ydGVkKSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0YW5kKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyksXG5cdFx0YW5kKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cylcblx0KTtcblxuXHRyZXR1cm4gYW5kKG1hc3NFZGl0VmlzaWJpbGl0eSwgaWZFbHNlKGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHksIHJ1bnRpbWVCaW5kaW5nLCBhbmQocnVudGltZUJpbmRpbmcsIHBhdGhVcGRhdGFibGVFeHByZXNzaW9uKSkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ0N1dCcgYWN0aW9uLlxuICogQHBhcmFtIGN1dFZpc2liaWxpdHlcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3V0RW5hYmxlbWVudChcblx0Y3V0VmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRmb3JDb250ZXh0TWVudTogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzUGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L251bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiO1xuXHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBlcXVhbChwYXRoSW5Nb2RlbChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNQYXRoLCBcImludGVybmFsXCIpLCAxKTtcblx0Y29uc3QgY3V0YWJsZUNvbnRleHRzUGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiY3V0YWJsZUNvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L2N1dGFibGVDb250ZXh0c1wiO1xuXG5cdGNvbnN0IHJ1bnRpbWVCaW5kaW5nID0gYW5kKG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cywgZXF1YWwobGVuZ3RoKHBhdGhJbk1vZGVsKGN1dGFibGVDb250ZXh0c1BhdGgsIFwiaW50ZXJuYWxcIiksIHRydWUpLCAxKSk7XG5cdHJldHVybiBhbmQoXG5cdFx0Y3V0VmlzaWJpbGl0eSxcblx0XHRvcihcblx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvblxuXHRcdCksXG5cdFx0cnVudGltZUJpbmRpbmdcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdNb3ZlIHVwJyBhbmQgJ01vdmUgZG93bicgYWN0aW9ucy5cbiAqIEBwYXJhbSBtb3ZlVXBEb3duVmlzaWJpbGl0eVxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBmb3JVcFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldE1vdmVVcERvd25FbmFibGVtZW50KFxuXHRtb3ZlVXBEb3duVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRmb3JVcDogYm9vbGVhbixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3Qgc2luZ2xlQ29udGV4dE1vdmFibGVVcCA9ICFmb3JDb250ZXh0TWVudSA/IFwic2luZ2xlQ29udGV4dE1vdmFibGVVcFwiIDogXCJjb250ZXh0bWVudS9zaW5nbGVDb250ZXh0TW92YWJsZVVwXCI7XG5cdGNvbnN0IHNpbmdsZUNvbnRleHRNb3ZhYmxlRG93biA9ICFmb3JDb250ZXh0TWVudSA/IFwic2luZ2xlQ29udGV4dE1vdmFibGVEb3duXCIgOiBcImNvbnRleHRtZW51L3NpbmdsZUNvbnRleHRNb3ZhYmxlRG93blwiO1xuXHRjb25zdCBydW50aW1lQmluZGluZyA9IGZvclVwXG5cdFx0PyBlcXVhbChwYXRoSW5Nb2RlbChzaW5nbGVDb250ZXh0TW92YWJsZVVwLCBcImludGVybmFsXCIpLCB0cnVlKVxuXHRcdDogZXF1YWwocGF0aEluTW9kZWwoc2luZ2xlQ29udGV4dE1vdmFibGVEb3duLCBcImludGVybmFsXCIpLCB0cnVlKTtcblx0cmV0dXJuIGFuZChcblx0XHRtb3ZlVXBEb3duVmlzaWJpbGl0eSxcblx0XHRvcihcblx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvblxuXHRcdCksXG5cdFx0cnVudGltZUJpbmRpbmdcblx0KTtcbn1cblxuLyoqXG4gKiBUZWxscyBpZiB0aGUgdGFibGUgaW4gdGVtcGxhdGUgaXMgaW4gZGlzcGxheSBtb2RlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBjaGVja011bHRpcGxlVmlzdWFsaXphdGlvblxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YWJsZSBpcyBpbiBkaXNwbGF5IG1vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sIGNoZWNrTXVsdGlwbGVWaXN1YWxpemF0aW9uID0gZmFsc2UpOiBib29sZWFuIHtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzSW5saW5lRWRpdCgpKSB7XG5cdFx0Ly9pZiB0aGVyZSBpcyBpbmxpbmUgZWRpdCBpbiB0aGUgcGFnZSB3ZSBjYW5ub3QgZm9yY2UgdGhlIHRhYmxlIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIHRlbXBsYXRlIHR5cGVcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0aWYgKFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHR0ZW1wbGF0ZVR5cGUgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgfHxcblx0XHQoY2hlY2tNdWx0aXBsZVZpc3VhbGl6YXRpb24gJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkpXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8vIHVwZGF0YWJsZSB3aWxsIGJlIGhhbmRsZWQgYXQgdGhlIHByb3BlcnR5IGxldmVsXG5cdHJldHVybiBmYWxzZTtcbn1cbiJdLCJtYXBwaW5ncyI6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
748
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdGFuZGFyZEFjdGlvbktleXMiLCJDdXQiLCJDb3B5IiwiQ3JlYXRlIiwiRGVsZXRlIiwiQ3JlYXRpb25Sb3ciLCJQYXN0ZSIsIk1hc3NFZGl0IiwiSW5zaWdodHMiLCJNb3ZlVXAiLCJNb3ZlRG93biIsIl9leHBvcnRzIiwiZ2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiY29udmVydGVyQ29udGV4dCIsImNyZWF0aW9uTW9kZSIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwiY29sbGVjdGlvblBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImhpZGRlbkFubm90YXRpb24iLCJjcmVhdGUiLCJpc0FjdGlvbkFubm90YXRlZEhpZGRlbiIsImRlbGV0ZSIsInVwZGF0ZSIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJiSXNEcmFmdFN1cHBvcnRlZCIsIk1vZGVsSGVscGVyIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJhbm5vdGF0aW9ucyIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiY3VycmVudEVudGl0eVNldCIsImdldEVudGl0eVNldCIsImlzRW50aXR5U2V0IiwiQ29tbW9uIiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwidW5kZWZpbmVkIiwibmV3QWN0aW9uTmFtZSIsInRvU3RyaW5nIiwiYXZhaWxhYmxlUHJvcGVydHkiLCJnZXRFbnRpdHlUeXBlIiwiYWN0aW9ucyIsIkNvcmUiLCJPcGVyYXRpb25BdmFpbGFibGUiLCJuYW1lIiwiYXZhaWxhYmxlIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwic0Fubm90YXRpb25UZXJtIiwiYldpdGhOYXZpZ2F0aW9uUGF0aCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFjdGlvbkFubm90YXRpb25WYWx1ZSIsImlzU2luZ2xldG9uIiwiVUkiLCJjb25zdGFudCIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJnZXRSZWxhdGl2ZVBhdGhzIiwicGF0aCIsInNpbmdsZXRvblBhdGhWaXNpdG9yIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJyZXN0cmljdGlvbnNEZWYiLCJrZXkiLCJmdW5jdGlvbiIsImlzUGF0aEluc2VydGFibGUiLCJpc1BhdGhVcGRhdGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJyZXN1bHQiLCJmb3JFYWNoIiwiZGVmIiwiZGVmRnVuY3Rpb24iLCJleHByZXNzaW9uIiwiYXBwbHkiLCJwYXRoVmlzaXRvciIsIm5hdmlnYXRpb25QYXRocyIsIm5hdmlnYXRpb25FeHByZXNzaW9uIiwiaWdub3JlVGFyZ2V0Q29sbGVjdGlvbiIsImF1dGhvcml6ZVVucmVzb2x2YWJsZSIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImlzRHJhZnRPclN0aWNreSIsIkNyZWF0aW9uTW9kZSIsIkV4dGVybmFsIiwiZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUiLCJjcmVhdGVWaXNpYmlsaXR5IiwiZ2V0Q3JlYXRlVmlzaWJpbGl0eSIsImlzVGVtcGxhdGVkIiwiY29tcGlsZUV4cHJlc3Npb24iLCJnZXRDcmVhdGVUZW1wbGF0aW5nIiwidmlzaWJsZSIsInZpc2libGVFeHByZXNzaW9uIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJlbmFibGVkRm9yQ29udGV4dE1lbnUiLCJ0eXBlIiwiQWN0aW9uVHlwZSIsIlN0YW5kYXJkIiwiZ2V0U3RhbmRhcmRBY3Rpb25DdXQiLCJjdXRWaXNpYmlsaXR5IiwiZ2V0Q3V0VmlzaWJpbGl0eSIsImdldERlZmF1bHRUZW1wbGF0aW5nIiwiZ2V0Q3V0RW5hYmxlbWVudCIsImdldFN0YW5kYXJkQWN0aW9uQ29weSIsImNvcHlWaXNpYmlsaXR5IiwiZ2V0Q29weVZpc2liaWxpdHkiLCJnZXRDb3B5RW5hYmxlbWVudCIsImdldFN0YW5kYXJkQWN0aW9uTW92ZVVwRG93biIsImZvclVwIiwiY2FuQ2hhbmdlU2libGluZyIsIkhpZXJhcmNoeSIsImhpZXJhcmNoeVF1YWxpZmllciIsIkNoYW5nZU5leHRTaWJsaW5nQWN0aW9uIiwibW92ZVZpc2liaWxpdHkiLCJhbmQiLCJnZXRNb3ZlVXBEb3duRW5hYmxlbWVudCIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwiZGVsZXRlVmlzaWJpbGl0eSIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0Q3JlYXRpb25Sb3ciLCJjcmVhdGlvblJvd1Zpc2liaWxpdHkiLCJnZXRDcmVhdGlvblJvd0VuYWJsZW1lbnQiLCJwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiIsImlzVXBkYXRhYmxlIiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkxpc3RSZXBvcnQiLCJJc0VkaXRhYmxlIiwiaWZFbHNlIiwiZXF1YWwiLCJpc0hpZXJhcmNoeVBhcmVudE5vZGVVcGRhdGFibGUiLCJub3QiLCJpc0NvbnN0YW50IiwiYXZhaWxhYmxlQ29weUFjdGlvbiIsIkNvcHlBY3Rpb24iLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwiaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkIiwicGFzdGVWaXNpYmlsaXR5IiwiZ2V0UGFzdGVWaXNpYmlsaXR5IiwicGFzdGVFbmFibGVtZW50IiwiZ2V0UGFzdGVFbmFibGVtZW50IiwicGFzdGVFbmFibGVtZW50Rm9yQ29udGV4dE1lbnUiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwidmlzaWJsZUZvckNvbnRleHRNZW51IiwicGF0aEluTW9kZWwiLCJnZXRNYXNzRWRpdEVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkluc2lnaHRzIiwidmlzdWFsaXphdGlvblBhdGgiLCJpbnNpZ2h0c1Zpc2liaWxpdHkiLCJnZXRJbnNpZ2h0c1Zpc2liaWxpdHkiLCJpbnNpZ2h0c0VuYWJsZW1lbnQiLCJnZXRJbnNpZ2h0c0VuYWJsZW1lbnQiLCJpc0ZvckNyZWF0aW9uUm93Iiwib3IiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNGb3JQYXN0ZSIsImlzSW5zZXJ0YWJsZSIsImlzQ3JlYXRlSGlkZGVuIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsIklzQ3JlYXRlTW9kZSIsImlzUGF0aEluTW9kZWxFeHByZXNzaW9uIiwiaXNEZWxldGVIaWRkZW4iLCJwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiIsImlzRGVsZXRhYmxlIiwiQW5hbHl0aWNhbExpc3RQYWdlIiwidXBkYXRlT25OYXZpZ2F0aW9uIiwiX3R5cGUiLCJub3RFcXVhbCIsImVuYWJsZVBhc3RlIiwiaW5jbHVkZXMiLCJpc1VwZGF0ZUhpZGRlbiIsIm1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3QiLCJtYXNzRWRpdCIsIk9iamVjdFBhZ2UiLCJGcmVlU3R5bGVQYWdlIiwicmVzdHJpY3Rpb25zSW5zZXJ0YWJsZSIsImluZGV4T2YiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImxhc3ROYXYiLCJwYXJ0bmVyIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZm9ybWF0UmVzdWx0IiwidGFibGVGb3JtYXR0ZXJzIiwidmFsaWRhdGVDcmVhdGlvblJvd0ZpZWxkcyIsImZvckNvbnRleHRNZW51IiwiY29uZGl0aW9ucyIsImNvbnRleHRQYXRoIiwicHVzaCIsIkNvbGxlY3Rpb25UeXBlIiwicmVzb2x2ZUFic29sdXRlUGF0aCIsInRhcmdldCIsImxlc3NPckVxdWFsIiwiY3JlYXRlRW5hYmxlbWVudCIsImRlbGV0YWJsZUNvbnRleHRzIiwidW5TYXZlZENvbnRleHRzIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmUiLCJncmVhdGVyVGhhbiIsInNlbGVjdGVkQ29udGV4dHNQYXRoIiwicGFzdGVFbmFibGVtZW50UGF0aCIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dFByb3BlcnR5IiwidXBkYXRhYmxlQ29udGV4dFByb3BlcnR5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiZ3JlYXRlck9yRXF1YWwiLCJudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzIiwiYkRpc3BsYXlNb2RlIiwiaXNJbkRpc3BsYXlNb2RlIiwicnVudGltZUJpbmRpbmciLCJjdXRhYmxlQ29udGV4dHNQYXRoIiwiY29weWFibGVDb250ZXh0c1BhdGgiLCJtb3ZlVXBEb3duVmlzaWJpbGl0eSIsInNpbmdsZUNvbnRleHRNb3ZhYmxlVXAiLCJzaW5nbGVDb250ZXh0TW92YWJsZURvd24iLCJjaGVja011bHRpcGxlVmlzdWFsaXphdGlvbiIsImdldE1hbmlmZXN0V3JhcHBlciIsImhhc0lubGluZUVkaXQiLCJ0ZW1wbGF0ZVR5cGUiLCJoYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJTdGFuZGFyZEFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCb29sZWFuLCBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0Z3JlYXRlck9yRXF1YWwsXG5cdGdyZWF0ZXJUaGFuLFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdGlzUGF0aEluTW9kZWxFeHByZXNzaW9uLFxuXHRsZW5ndGgsXG5cdGxlc3NPckVxdWFsLFxuXHRub3QsXG5cdG5vdEVxdWFsLFxuXHRvcixcblx0cGF0aEluTW9kZWxcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0LCBpc05hdmlnYXRpb25Qcm9wZXJ0eSwgaXNTaW5nbGV0b24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRnZXRSZWxhdGl2ZVBhdGhzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aEluc2VydGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBVSSwgc2luZ2xldG9uUGF0aFZpc2l0b3IgfSBmcm9tIFwiLi4vLi4vLi4vLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlLCBDcmVhdGlvbk1vZGUsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCIuLi8uLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRJbnNpZ2h0c0VuYWJsZW1lbnQsIGdldEluc2lnaHRzVmlzaWJpbGl0eSB9IGZyb20gXCIuLi8uLi8uLi9oZWxwZXJzL0luc2lnaHRzSGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL1RhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uID0gQmFzZUFjdGlvbiAmIHtcblx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZDtcblx0aXNUZW1wbGF0ZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0dmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHZpc2libGVFeHByZXNzaW9uPzogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRlbmFibGVkOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlZEZvckNvbnRleHRNZW51PzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG50eXBlIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlID0ge1xuXHRleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdG5hdmlnYXRpb25FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xudHlwZSBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlID0gUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEFjdGlvbnNDb250ZXh0ID0ge1xuXHRjb2xsZWN0aW9uUGF0aDogc3RyaW5nO1xuXHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0ZGVsZXRlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0dXBkYXRlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0YXZhaWxhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uO1xuXHRyZXN0cmljdGlvbnM6IFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGU7XG59O1xuXG5leHBvcnQgY29uc3QgU3RhbmRhcmRBY3Rpb25LZXlzID0ge1xuXHRDdXQ6IFwiU3RhbmRhcmRBY3Rpb246OkN1dFwiLFxuXHRDb3B5OiBcIlN0YW5kYXJkQWN0aW9uOjpDb3B5XCIsXG5cdENyZWF0ZTogXCJTdGFuZGFyZEFjdGlvbjo6Q3JlYXRlXCIsXG5cdERlbGV0ZTogXCJTdGFuZGFyZEFjdGlvbjo6RGVsZXRlXCIsXG5cdENyZWF0aW9uUm93OiBcIlN0YW5kYXJkQWN0aW9uOjpDcmVhdGlvblJvd1wiLFxuXHRQYXN0ZTogXCJTdGFuZGFyZEFjdGlvbjo6UGFzdGVcIixcblx0TWFzc0VkaXQ6IFwiU3RhbmRhcmRBY3Rpb246Ok1hc3NFZGl0XCIsXG5cdEluc2lnaHRzOiBcIlN0YW5kYXJkQWN0aW9uOjpJbnNpZ2h0c1wiLFxuXHRNb3ZlVXA6IFwiU3RhbmRhcmRBY3Rpb246Ok1vdmVVcFwiLFxuXHRNb3ZlRG93bjogXCJTdGFuZGFyZEFjdGlvbjo6TW92ZURvd25cIlxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgY29udGV4dCBmb3IgdGhlIHN0YW5kYXJkIGFjdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGNyZWF0aW9uTW9kZVxuICogQHBhcmFtIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyAgVGhlIGNvbnRleHQgZm9yIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQge1xuXHRyZXR1cm4ge1xuXHRcdGNvbGxlY3Rpb25QYXRoOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0XHRjcmVhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiQ3JlYXRlSGlkZGVuXCIpLFxuXHRcdFx0ZGVsZXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkRlbGV0ZUhpZGRlblwiKSxcblx0XHRcdHVwZGF0ZTogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgXCJVcGRhdGVIaWRkZW5cIilcblx0XHR9LFxuXHRcdGNyZWF0aW9uTW9kZTogY3JlYXRpb25Nb2RlLFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZDogaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdG5ld0FjdGlvbjogZ2V0TmV3QWN0aW9uKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHRyZXN0cmljdGlvbnM6IGdldFJlc3RyaWN0aW9ucyhjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBzdGlja3kgb3IgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkID0gKGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcblx0XHQ/IHRydWVcblx0XHQ6IGZhbHNlO1xuXG5cdHJldHVybiBiSXNEcmFmdFN1cHBvcnRlZCB8fCBiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgbmV3QWN0aW9uIGludG8gYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgbmV3IGFjdGlvbiBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdBY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogeyBuYW1lOiBzdHJpbmc7IGF2YWlsYWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IH0gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0Y29uc3QgbmV3QWN0aW9uID0gaXNFbnRpdHlTZXQoY3VycmVudEVudGl0eVNldClcblx0XHQ/IGN1cnJlbnRFbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Q/Lk5ld0FjdGlvbiA/P1xuXHRcdCAgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb25cblx0XHQ6IHVuZGVmaW5lZDtcblx0Y29uc3QgbmV3QWN0aW9uTmFtZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gPSBuZXdBY3Rpb24/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0Y29uc3QgYXZhaWxhYmxlUHJvcGVydHkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogbmV3QWN0aW9uTmFtZSxcblx0XHRcdGF2YWlsYWJsZTogZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uPEJvb2xlYW4+KGF2YWlsYWJsZVByb3BlcnR5LCBbXSwgdHJ1ZSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgYWN0aW9uIHZpc2liaWxpdHkgY29uZmlndXJlZCBpbnRvIGFubm90YXRpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHNBbm5vdGF0aW9uVGVybVxuICogQHBhcmFtIGJXaXRoTmF2aWdhdGlvblBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c0Fubm90YXRpb25UZXJtOiBcIkNyZWF0ZUhpZGRlblwiIHwgXCJVcGRhdGVIaWRkZW5cIiB8IFwiRGVsZXRlSGlkZGVuXCIsXG5cdGJXaXRoTmF2aWdhdGlvblBhdGggPSB0cnVlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHQvLyBUaGUgYW5ub3RhdGlvbnMgaW4gcXVlc3Rpb24gKENyZWF0ZUhpZGRlbiwgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4pIG1vc3Qgc3BlY2lmaWNhbGx5IGNhbiBiZSBkZWZpbmVkIG9uIEVudGl0eVNldC5cblx0Ly8gSW4gc2V2ZXJhbCBjYXNlcywgZmFsbGJhY2sgdG8gRW50aXR5VHlwZSBuZWVkcyB0byBiZSBjaGVja2VkOlxuXHQvLyAtIEluIGNhc2Ugb2Ygc2luZ2xldG9uIChhbm5vdGF0aW9ucyBkbyBub3QgYXBwbHkpXG5cdC8vIC0gRW50aXR5U2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChjb250YWlubWVudCBvciBubyBuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nKVxuXHQvLyAtIEVudGl0eVNldCBjYW4gYmUgZGV0ZXJtaW5lZCwgYnV0IHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBkZWZpbmVkIHRoZXJlXG5cblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGFjdGlvbkFubm90YXRpb25WYWx1ZSA9XG5cdFx0KCFpc1NpbmdsZXRvbihjdXJyZW50RW50aXR5U2V0KSAmJiBjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VST8uW3NBbm5vdGF0aW9uVGVybV0pIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMuVUk/LltzQW5ub3RhdGlvblRlcm1dO1xuXG5cdGlmICghYWN0aW9uQW5ub3RhdGlvblZhbHVlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdHJldHVybiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oYWN0aW9uQW5ub3RhdGlvblZhbHVlLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIChwYXRoOiBzdHJpbmcpID0+XG5cdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzKVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFubm90YXRlZCByZXN0cmljdGlvbnMgZm9yIHRoZSBhY3Rpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSByZXN0cmljdGlvbiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHJlc3RyaWN0aW9uc0RlZiA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNJbnNlcnRhYmxlXCIsXG5cdFx0XHRmdW5jdGlvbjogaXNQYXRoSW5zZXJ0YWJsZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzVXBkYXRhYmxlXCIsXG5cdFx0XHRmdW5jdGlvbjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdGZ1bmN0aW9uOiBpc1BhdGhEZWxldGFibGVcblx0XHR9XG5cdF07XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+ID0ge307XG5cdHJlc3RyaWN0aW9uc0RlZi5mb3JFYWNoKGZ1bmN0aW9uIChkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pLFxuXHRcdFx0bmF2aWdhdGlvbkV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pXG5cdFx0fTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRlbXBsYXRpbmcgZm9yIGluc2VydC91cGRhdGUgYWN0aW9ucyBpcyBtYW5kYXRvcnkuXG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGlzRHJhZnRPclN0aWNreVxuICogQHJldHVybnMgVHJ1ZSBpZiB3ZSBuZWVkIHRvIHRlbXBsYXRlIGluc2VydCBvciB1cGRhdGUgYWN0aW9ucywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4pOiBib29sZWFuIHtcblx0cmV0dXJuIGlzRHJhZnRPclN0aWNreSB8fCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBzdGFuZGFyZCBhY3Rpb24gaW5mb1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogU3RhbmRhcmRBY3Rpb24ge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oY3JlYXRlVmlzaWJpbGl0eSksXG5cdFx0dmlzaWJsZUV4cHJlc3Npb246IGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHksIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGUsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ0N1dCcgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgc3RhbmRhcmQgYWN0aW9uIGluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uQ3V0KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uIHtcblx0Y29uc3QgY3V0VmlzaWJpbGl0eSA9IGdldEN1dFZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlZmF1bHRUZW1wbGF0aW5nKGN1dFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihjdXRWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXRDdXRFbmFibGVtZW50KGN1dFZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGZhbHNlKSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXRDdXRFbmFibGVtZW50KGN1dFZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5DdXQsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnQ29weScgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgc3RhbmRhcmQgYWN0aW9uIGluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uQ29weShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGNvcHlWaXNpYmlsaXR5ID0gZ2V0Q29weVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlZmF1bHRUZW1wbGF0aW5nKGNvcHlWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oY29weVZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldENvcHlFbmFibGVtZW50KGNvcHlWaXNpYmlsaXR5LCBmYWxzZSkpLFxuXHRcdGVuYWJsZWRGb3JDb250ZXh0TWVudTogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q29weUVuYWJsZW1lbnQoY29weVZpc2liaWxpdHksIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5Db3B5LFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ01vdmUgdXAnIGFuZCAnTW92ZSBkb3duJyBhY3Rpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gZm9yVXBcbiAqIEByZXR1cm5zIFRoZSBzdGFuZGFyZCBhY3Rpb24gaW5mb1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25Nb3ZlVXBEb3duKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGZvclVwOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGNhbkNoYW5nZVNpYmxpbmcgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmFubm90YXRpb25zLkhpZXJhcmNoeT8uW1xuXHRcdFx0YFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHtzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmhpZXJhcmNoeVF1YWxpZmllciA/PyBcIlwifWBcblx0XHRdPy5DaGFuZ2VOZXh0U2libGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkO1xuXHRjb25zdCBtb3ZlVmlzaWJpbGl0eSA9IGFuZChnZXRDdXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLCBjYW5DaGFuZ2VTaWJsaW5nKTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0RGVmYXVsdFRlbXBsYXRpbmcobW92ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihtb3ZlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0TW92ZVVwRG93bkVuYWJsZW1lbnQobW92ZVZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGZvclVwKSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXRNb3ZlVXBEb3duRW5hYmxlbWVudChtb3ZlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZm9yVXAsIHRydWUpKSxcblx0XHRrZXk6IGZvclVwID8gU3RhbmRhcmRBY3Rpb25LZXlzLk1vdmVVcCA6IFN0YW5kYXJkQWN0aW9uS2V5cy5Nb3ZlRG93bixcblx0XHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdEZWxldGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGRlbGV0ZVZpc2liaWxpdHkgPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldERlZmF1bHRUZW1wbGF0aW5nKGRlbGV0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihkZWxldGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHksIGZhbHNlKSksXG5cdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHksIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5EZWxldGUsXG5cdFx0dHlwZTogQWN0aW9uVHlwZS5TdGFuZGFyZFxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnQ3JlYXRpb25Sb3cnIGFjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYWN0dWFsbHkgYW4gYWN0aW9uIHRoYXQgaXMgdGVtcGxhdGVkIGFzIGEgYnV0dG9uIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgdXNlZCB0byBjb25maWd1cmUgYW4gTURDIGZlYXR1cmUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFN0YW5kYXJkQWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGlvblJvdyhcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IGNyZWF0aW9uUm93VmlzaWJpbGl0eSA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdHJ1ZSk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHksIHRydWUpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihjcmVhdGlvblJvd1Zpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldENyZWF0aW9uUm93RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHkpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5DcmVhdGlvblJvdyxcblx0XHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSAnQ3V0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdDdXQnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1dFZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucz8uaXNVcGRhdGFibGU/LmV4cHJlc3Npb247XG5cdGNvbnN0IHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24gPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0XG5cdFx0XHQ/IFVJLklzRWRpdGFibGVcblx0XHRcdDogKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgIT09IHVuZGVmaW5lZDsgLy8gVG8gYWxsb3cgY3V0L3Bhc3RlIGZvciBhIGRyYWZ0IFRyZWVUYWJsZSBpbiBhIExpc3RSZXBvcnRcblx0cmV0dXJuIGlmRWxzZShcblx0XHRlcXVhbChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy50eXBlLCBcIlRyZWVUYWJsZVwiKSxcblx0XHRhbmQoXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmlzSGllcmFyY2h5UGFyZW50Tm9kZVVwZGF0YWJsZSEsXG5cdFx0XHRub3QoYW5kKGlzQ29uc3RhbnQocGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSksXG5cdFx0XHR0ZW1wbGF0ZUJpbmRpbmdFeHByZXNzaW9uXG5cdFx0KSxcblx0XHRmYWxzZVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0NvcHknIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0NvcHknIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvcHlWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGF2YWlsYWJsZUNvcHlBY3Rpb24gPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMuSGllcmFyY2h5Py5bXG5cdFx0YFJlY3Vyc2l2ZUhpZXJhcmNoeUFjdGlvbnMjJHtzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmhpZXJhcmNoeVF1YWxpZmllciA/PyBcIlwifWBcblx0XT8uQ29weUFjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0aWYgKCFhdmFpbGFibGVDb3B5QWN0aW9uKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24gPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0XG5cdFx0XHQ/IFVJLklzRWRpdGFibGVcblx0XHRcdDogKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgIT09IHVuZGVmaW5lZDsgLy8gVG8gYWxsb3cgY3V0L3Bhc3RlIGZvciBhIGRyYWZ0IFRyZWVUYWJsZSBpbiBhIExpc3RSZXBvcnRcblx0cmV0dXJuIGlmRWxzZShlcXVhbChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy50eXBlLCBcIlRyZWVUYWJsZVwiKSwgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYWN0dWFsbHkgYW4gYWN0aW9uIHRoYXQgaXMgZGlzcGxheWVkIGFzIGEgYnV0dG9uIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgdXNlZCB0byBjb25maWd1cmUgYW4gTURDIGZlYXR1cmUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ1Bhc3RlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFuZGFyZEFjdGlvblBhc3RlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogYm9vbGVhblxuKTogU3RhbmRhcmRBY3Rpb24ge1xuXHRjb25zdCBjdXRWaXNpYmlsaXR5ID0gZ2V0Q3V0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY29weVZpc2liaWxpdHkgPSBnZXRDb3B5VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlVmlzaWJpbGl0eSA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZmFsc2UsIHRydWUpO1xuXHRjb25zdCBwYXN0ZVZpc2liaWxpdHkgPSBnZXRQYXN0ZVZpc2liaWxpdHkoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0Y3V0VmlzaWJpbGl0eSxcblx0XHRjb3B5VmlzaWJpbGl0eSxcblx0XHRpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcblx0KTtcblx0Y29uc3QgcGFzdGVFbmFibGVtZW50ID0gZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgZmFsc2UpO1xuXHRjb25zdCBwYXN0ZUVuYWJsZW1lbnRGb3JDb250ZXh0TWVudSA9IGdldFBhc3RlRW5hYmxlbWVudChwYXN0ZVZpc2liaWxpdHksIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIHRydWUpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVFeHByZXNzaW9uKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUV4cHJlc3Npb24ocGFzdGVFbmFibGVtZW50KSxcblx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKHBhc3RlRW5hYmxlbWVudEZvckNvbnRleHRNZW51KSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5QYXN0ZSxcblx0XHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbiB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlRXhwcmVzc2lvbihnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlRXhwcmVzc2lvbihtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdC8vIEZvciB0aGUgY29udGV4dCBtZW51LCB0aGUgdmlzaWJpbGl0eSBzaG91bGQgYWxzbyBjb25zaWRlciB0aGUgJ2luYWN0aXZlQ29udGV4dCcgcHJvcGVydHk6XG5cdFx0Ly8gb25seSB3aGVuIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBjb250ZXh0IGlzIGFjdGl2ZSAoaS5lLiBcImNvbnRleHRtZW51L2luYWN0aXZlQ29udGV4dFwiIGlzIGZhbHNlKSwgdGhlIGFjdGlvbiBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGUgY29udGV4dCBtZW51XG5cdFx0Ly8gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIHRhYmxlIG1hbmlmZXN0IHNldHRpbmcgXCJjcmVhdGlvbk1vZGVcIiBpcyBcIklubGluZUNyZWF0aW9uUm93c1wiXG5cdFx0dmlzaWJsZUZvckNvbnRleHRNZW51OiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdGFuZChtYXNzRWRpdFZpc2liaWxpdHksIGVxdWFsKHBhdGhJbk1vZGVsKFwiY29udGV4dG1lbnUvaW5hY3RpdmVDb250ZXh0XCIsIFwiaW50ZXJuYWxcIiksIGZhbHNlKSlcblx0XHQpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVFeHByZXNzaW9uKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IGNvbXBpbGVFeHByZXNzaW9uKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHksIHRydWUpKSxcblx0XHRrZXk6IFN0YW5kYXJkQWN0aW9uS2V5cy5NYXNzRWRpdCxcblx0XHR0eXBlOiBBY3Rpb25UeXBlLlN0YW5kYXJkXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdBZGRDYXJkc1RvSW5zaWdodHMnIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdBZGRDYXJkc1RvSW5zaWdodHMnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uSW5zaWdodHMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZ1xuKTogU3RhbmRhcmRBY3Rpb24ge1xuXHRjb25zdCBpbnNpZ2h0c1Zpc2liaWxpdHkgPSBnZXRJbnNpZ2h0c1Zpc2liaWxpdHkoXCJUYWJsZVwiLCBjb252ZXJ0ZXJDb250ZXh0LCB2aXN1YWxpemF0aW9uUGF0aCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCk7XG5cdGNvbnN0IGluc2lnaHRzRW5hYmxlbWVudCA9IGFuZChpbnNpZ2h0c1Zpc2liaWxpdHksIGdldEluc2lnaHRzRW5hYmxlbWVudCgpKTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUV4cHJlc3Npb24oZ2V0RGVmYXVsdFRlbXBsYXRpbmcoaW5zaWdodHNWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oaW5zaWdodHNWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlRXhwcmVzc2lvbihpbnNpZ2h0c0VuYWJsZW1lbnQpLFxuXHRcdGtleTogU3RhbmRhcmRBY3Rpb25LZXlzLkluc2lnaHRzLFxuXHRcdHR5cGU6IEFjdGlvblR5cGUuU3RhbmRhcmRcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSB0ZW1wbGF0aW5nIG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGNyZWF0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSBpc0ZvckNyZWF0aW9uUm93XG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlIGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRpc0ZvckNyZWF0aW9uUm93ID0gZmFsc2Vcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdC8vVGVtcGxhdGluZyBvZiBDcmVhdGUgQnV0dG9uIGlzIG5vdCBkb25lOlxuXHQvLyBcdCAtIElmIEJ1dHRvbiBpcyBuZXZlciB2aXNpYmxlKGNvdmVyZWQgdGhlIEV4dGVybmFsIGNyZWF0ZSBidXR0b24sIG5ldyBBY3Rpb24pXG5cdC8vXHQgLSBvciBDcmVhdGlvbk1vZGUgaXMgb24gQ3JlYXRpb25Sb3cgZm9yIENyZWF0ZSBCdXR0b25cblx0Ly9cdCAtIG9yIENyZWF0aW9uTW9kZSBpcyBub3Qgb24gQ3JlYXRpb25Sb3cgZm9yIENyZWF0aW9uUm93IEJ1dHRvblxuXG5cdHJldHVybiBhbmQoXG5cdFx0Ly9YTk9SIGdhdGVcblx0XHRvcihcblx0XHRcdGFuZChpc0ZvckNyZWF0aW9uUm93LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSxcblx0XHRcdGFuZCghaXNGb3JDcmVhdGlvblJvdywgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdylcblx0XHQpLFxuXHRcdG9yKG5vdChpc0NvbnN0YW50KGNyZWF0ZVZpc2liaWxpdHkpKSwgY3JlYXRlVmlzaWJpbGl0eSlcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSB0ZW1wbGF0aW5nIG9mIHRoZSBub24tQ3JlYXRlIGFjdGlvbnMuXG4gKiBAcGFyYW0gYWN0aW9uVmlzaWJpbGl0eVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIG5vbi1DcmVhdGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0aW5nKGFjdGlvblZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBvcihub3QoaXNDb25zdGFudChhY3Rpb25WaXNpYmlsaXR5KSksIGFjdGlvblZpc2liaWxpdHkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gaXNGb3JDcmVhdGlvblJvd1xuICogQHBhcmFtIGlzRm9yUGFzdGVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdDcmVhdGUnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNGb3JDcmVhdGlvblJvdyA9IGZhbHNlLFxuXHRpc0ZvclBhc3RlID0gZmFsc2Vcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc0NyZWF0ZUhpZGRlbiA9IGlzRm9yQ3JlYXRpb25Sb3dcblx0XHQ/IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiQ3JlYXRlSGlkZGVuXCIsIGZhbHNlKVxuXHRcdDogc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLmNyZWF0ZTtcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cdC8vQ3JlYXRlIEJ1dHRvbiBpcyB2aXNpYmxlOlxuXHQvLyBcdCAtIElmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGV4dGVybmFsXG5cdC8vICAgICAgLSBJZiB3ZSdyZSBvbiB0aGUgbGlzdCByZXBvcnQgYW5kIGNyZWF0ZSBpcyBub3QgaGlkZGVuXG5cdC8vXHRcdC0gT3RoZXJ3aXNlIHRoaXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIFVJLklzRWRpdGFibGVcblx0Ly9cdCAtIE90aGVyd2lzZVxuXHQvL1x0XHQtIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdmFsaWQgdGhlbiBjcmVhdGUgYnV0dG9uIGlzbid0IHZpc2libGVcblx0Ly9cdFx0XHQtIG5vIG5ld0FjdGlvbiBhdmFpbGFibGVcblx0Ly9cdFx0XHQtIEl0J3Mgbm90IGluc2VydGFibGUgYW5kIHRoZXJlIGlzIG5vdCBhIG5ldyBhY3Rpb25cblx0Ly9cdFx0XHQtIGNyZWF0ZSBpcyBoaWRkZW5cblx0Ly9cdFx0XHQtIFRoZXJlIGFyZSBtdWx0aXBsZSB2aXN1YWxpemF0aW9uc1xuXHQvL1x0XHRcdC0gSXQncyBhbiBBbmFseXRpY2FsIExpc3QgUGFnZVxuXHQvL1x0XHRcdC0gVXNlcyBJbmxpbmVDcmVhdGlvblJvd3MgbW9kZSBhbmQgYSBSZXNwb25zaXZlIHRhYmxlIHR5cGUsIHdpdGggdGhlIHBhcmFtZXRlciBpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIHRvIHRydWUgd2hpbGUgbm90IGluIGNyZWF0ZSBtb2RlXG5cdC8vICAgICAgICAgIFx0LSB3aGVuIGNhbGN1bGF0aW5nIHBhc3RlIGJ1dHRvbiB2aXNpYmlsaXR5LCAgd2UgZm9yY2UgdGhlIGNvbmRpdGlvbiB0byBmYWxzZSB3aXRoIHRoZSBpc0ZvclBhc3RlIHByb3BlcnR5XG5cdC8vICAgLSBPdGhlcndpc2Vcblx0Ly8gXHQgXHQtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCAtPlxuXHQvLyBcdCBcdFx0LSBJZiBVSS5DcmVhdGVIaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHkgcGF0aCAtPiBwcm92aWRlIGEgbmVnYXRlZCBiaW5kaW5nIHRvIHRoaXMgcGF0aFxuXHQvLyBcdCBcdFx0LSBPdGhlcndpc2UsIGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIFx0IFx0LSBPdGhlcndpc2Vcblx0Ly8gXHQgIFx0IC0gVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwsXG5cdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIG9yKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBVSS5Jc0VkaXRhYmxlKSksXG5cdFx0aWZFbHNlKFxuXHRcdFx0b3IoXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgZmFsc2UpLCAhbmV3QWN0aW9uKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNDcmVhdGVIaWRkZW4pLCBlcXVhbChpc0NyZWF0ZUhpZGRlbiwgdHJ1ZSkpLFxuXHRcdFx0XHRhbmQoXG5cdFx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MsXG5cdFx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj8udHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIixcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRhbmQoXG5cdFx0XHRcdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ/LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlID09PSBmYWxzZSxcblx0XHRcdFx0XHRcdFx0bm90KGlzRm9yUGFzdGUpXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFVJLklzQ3JlYXRlTW9kZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHRcdFx0b3Iobm90KGlzUGF0aEluTW9kZWxFeHByZXNzaW9uKGlzQ3JlYXRlSGlkZGVuKSksIG5vdChpc0NyZWF0ZUhpZGRlbikpLFxuXHRcdFx0XHRhbmQobm90KGlzQ3JlYXRlSGlkZGVuKSwgVUkuSXNFZGl0YWJsZSlcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdEZWxldGUnIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNEZWxldGVIaWRkZW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmhpZGRlbkFubm90YXRpb24uZGVsZXRlO1xuXHRjb25zdCBwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cblx0Ly9EZWxldGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IFByZXJlcXVpc2l0ZXM6XG5cdC8vXHQgLSBJZiB3ZSdyZSBub3Qgb24gQUxQXG5cdC8vICAgLSBJZiByZXN0cmljdGlvbnMgb24gZGVsZXRhYmxlIHNldCB0byBmYWxzZSAtPiBub3QgdmlzaWJsZVxuXHQvLyAgIC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0LSBJZiBVSS5EZWxldGVIaWRkZW4gaXMgdHJ1ZSAtPiBub3QgdmlzaWJsZVxuXHQvL1x0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vIFx0IFx0XHRcdC0gSWYgd2UncmUgb24gT1AgLT4gZGVwZW5kaW5nIGlmIFVJIGlzIGVkaXRhYmxlIGFuZCByZXN0cmljdGlvbnMgb24gZGVsZXRhYmxlXG5cdC8vXHRcdFx0XHQtIE90aGVyd2lzZVxuXHQvL1x0XHRcdFx0IFx0LSBJZiBVSS5EZWxldGVIaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHkgcGF0aCAtPiBwcm92aWRlIGEgbmVnYXRlZCBiaW5kaW5nIHRvIHRoaXMgcGF0aFxuXHQvL1x0IFx0IFx0XHQgXHQtIE90aGVyd2lzZSwgZGVsZXRlIGlzIHZpc2libGVcblxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UsXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBVSS5Jc0VkaXRhYmxlKSxcblx0XHRcdFx0XHRub3QoYW5kKGlzUGF0aEluTW9kZWxFeHByZXNzaW9uKGlzRGVsZXRlSGlkZGVuKSwgaXNEZWxldGVIaWRkZW4pKVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ1Bhc3RlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGVWaXNpYmlsaXR5XG4gKiBAcGFyYW0gY3V0VmlzaWJpbGl0eVxuICogQHBhcmFtIGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ1Bhc3RlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXN0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRjdXRWaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdGNvcHlWaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZDogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly9JZiBpdCBpc24ndCBkZWFjdGl2YXRlZCB3aXRoaW4gdGhlIG1hbmlmZXN0IGFuZCB3ZSdyZSBvcGVyYXRpbmcgaW4gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzLFxuXHQvL3RoZSB0cmVlVGFibGUncyB2aXNpYmlsaXR5IHJlbGllcyBvbiB0aGUgY3V0dmlzaWJpbGl0eSxcblx0Ly93aGlsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgb3RoZXIgdGFibGUgaXMgZGV0ZXJtaW5lZCBieSBpbnNlcnRhYmxlIHJlc3RyaWN0aW9ucyBhbmQgY3JlYXRlIHZpc2liaWxpdHkuXG5cdGxldCB1cGRhdGVPbk5hdmlnYXRpb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucz8uaXNVcGRhdGFibGU/Lm5hdmlnYXRpb25FeHByZXNzaW9uO1xuXHRpZiAodXBkYXRlT25OYXZpZ2F0aW9uPy5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIikge1xuXHRcdHVwZGF0ZU9uTmF2aWdhdGlvbiA9IGNvbnN0YW50KHRydWUpO1xuXHR9XG5cdHJldHVybiBhbmQoXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiXG5cdFx0XHQ/IG9yKGN1dFZpc2liaWxpdHksIGNvcHlWaXNpYmlsaXR5KVxuXHRcdFx0OiBhbmQoXG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRhbmQoY3JlYXRlVmlzaWJpbGl0eSwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIHVwZGF0ZU9uTmF2aWdhdGlvbilcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdG5vdEVxdWFsKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uZW5hYmxlUGFzdGUsIGZhbHNlKSxcblx0XHRcdFx0XHQhW1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmNsdWRlcyhjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKVxuXHRcdFx0ICApLFxuXHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAndmlzaWJsZScgcHJvcGVydHkgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0bWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdDogYm9vbGVhbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQudGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24/Lm1hc3NFZGl0LmVuYWJsZWQgfHwgZmFsc2U7XG5cdGNvbnN0IHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24gPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlXG5cdFx0XHQ/IFVJLklzRWRpdGFibGVcblx0XHRcdDogW1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuRnJlZVN0eWxlUGFnZV0uaW5jbHVkZXMoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSk7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gYW5kKFxuXHRcdG5vdChhbmQoaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBmYWxzZSkpKSxcblx0XHRtYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0LFxuXHRcdHRlbXBsYXRlQmluZGluZ0V4cHJlc3Npb24sXG5cdFx0bm90KGlzVXBkYXRlSGlkZGVuKVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgY3JlYXRpb25Sb3cuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGlvblJvd1Zpc2liaWxpdHlcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlIGNyZWF0aW9uUm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRpb25Sb3dFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0aW9uUm93VmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCByZXN0cmljdGlvbnNJbnNlcnRhYmxlID0gaXNQYXRoSW5zZXJ0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwge1xuXHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0XHRpZiAocGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRwYXRoID0gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpO1xuXHRcdFx0XHRyZXR1cm4gcGF0aDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdFx0XHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXMpIHtcblx0XHRcdFx0Y29uc3QgbGFzdE5hdiA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRjb25zdCBwYXJ0bmVyID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGFzdE5hdikgJiYgbGFzdE5hdi5wYXJ0bmVyO1xuXHRcdFx0XHRpZiAocGFydG5lcikge1xuXHRcdFx0XHRcdHBhdGggPSBgJHtwYXJ0bmVyfS8ke3BhdGh9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID1cblx0XHRyZXN0cmljdGlvbnNJbnNlcnRhYmxlLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiXG5cdFx0XHQ/IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRcdFx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBbXSlcblx0XHRcdCAgfSlcblx0XHRcdDogcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZTtcblxuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0aW9uUm93VmlzaWJpbGl0eSxcblx0XHRpc0luc2VydGFibGUsXG5cdFx0b3IoXG5cdFx0XHQhc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhLFxuXHRcdFx0Zm9ybWF0UmVzdWx0KFtwYXRoSW5Nb2RlbChcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBcImludGVybmFsXCIpXSwgdGFibGVGb3JtYXR0ZXJzLnZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY29uZGl0aW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0Y29uc3QgY29udGV4dFBhdGg6IHN0cmluZyA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXG5cdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cykge1xuXHRcdC8vIGZvciBJbmxpbmUgY3JlYXRpb24gcm93cyBjcmVhdGUgY2FuIGJlIGhpZGRlbiB2aWEgbWFuaWZlc3QgYW5kIHRoaXMgc2hvdWxkIG5vdCBpbXBhY3QgaXRzIGVuYWJsZW1lbnRcblx0XHRjb25kaXRpb25zLnB1c2goYW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmhpZGRlbkFubm90YXRpb24uY3JlYXRlKSwgVUkuSXNFZGl0YWJsZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbmRpdGlvbnMucHVzaChjcmVhdGVWaXNpYmlsaXR5KTtcblx0fVxuXG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBDb2xsZWN0aW9uVHlwZSA9IGNvbnZlcnRlckNvbnRleHQucmVzb2x2ZUFic29sdXRlUGF0aDxFbnRpdHlTZXQ+KHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY29sbGVjdGlvblBhdGgpLnRhcmdldDtcblx0Y29uZGl0aW9ucy5wdXNoKFxuXHRcdG9yKFxuXHRcdFx0aXNFbnRpdHlTZXQoQ29sbGVjdGlvblR5cGUpLFxuXHRcdFx0YW5kKGlzSW5zZXJ0YWJsZSwgb3IoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UsIFVJLklzRWRpdGFibGUpKVxuXHRcdClcblx0KTtcblxuXHRpZiAoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIlRyZWVUYWJsZVwiKSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgdGhlIGNyZWF0ZSBidXR0b24gc2hhbGwgYmUgYWN0aXZlIG9ubHkgaWYgMCBvciAxIGl0ZW1zIGFyZSBzZWxlY3RlZCAocGFyZW50IG5vZGUpXG5cdFx0Ly8gV2UgZG8gbm90IG5lZWQgdGhpcyBjb25kaXRpb24gb24gdGhlIENvbnRleHRNZW51LCBhcyB3ZSBvbmx5IGNyZWF0ZSBvbiB0aGUgc2VsZWN0ZWQgbm9kZVxuXHRcdGNvbmRpdGlvbnMucHVzaChsZXNzT3JFcXVhbChwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpKTtcblxuXHRcdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUVuYWJsZW1lbnQpIHtcblx0XHRcdC8vIFRoZXJlJ3MgYSBjcmVhdGVFbmFibGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBhZGRpdGlvbm5hbCBjb25kaXRpb25zXG5cdFx0XHQvLyBUaGVzZSBjb25kaXRpb25zIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKG5vdEVxdWFsKHBhdGhJbk1vZGVsKGNvbnRleHRQYXRoICsgXCJjcmVhdGVFbmFibGVtZW50L0NyZWF0ZVwiLCBcImludGVybmFsXCIpLCBmYWxzZSkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhbmQoLi4uY29uZGl0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBkZWxldGVWaXNpYmlsaXR5XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIGlmIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgY29udGV4dCBtZW51LiBJZiBmYWxzZSwgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSB0YWJsZSB0b29sYmFyXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gVGhlIGZvbGxvd2luZyBjb250ZXh0cyBhcmUgZmlsbGVkIGF0IHJ1bnRpbWUgd2hlbiBhIHVzZXIgc2VsZWN0cyBvbmUgb3IgbW9yZSBpdGVtcyBmcm9tIGEgbGlzdC5cblx0Ly8gQ2hlY2tzIGFyZSB0aGVuIG1hZGUgaW4gZnVuY3Rpb24gdXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMgaW4gZmlsZSBEZWxldGVIZWxwZXIgdG8gc2VlIGlmIHRoZXJlXG5cdC8vIGFyZSBpdGVtcyB0aGF0IGNhbiBiZSBkZWxldGVkLCB0aHVzIHRoZSBkZWxldGUgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkIGluIHRoZXNlIGNhc2VzLlxuXHRjb25zdCBjb250ZXh0UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiXCIgOiBcImNvbnRleHRtZW51L1wiO1xuXHRjb25zdCBkZWxldGFibGVDb250ZXh0cyA9IHBhdGhJbk1vZGVsKGNvbnRleHRQYXRoICsgXCJkZWxldGFibGVDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCB1blNhdmVkQ29udGV4dHMgPSBwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwidW5TYXZlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUgPSBwYXRoSW5Nb2RlbChjb250ZXh0UGF0aCArIFwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVwiLCBcImludGVybmFsXCIpO1xuXHRjb25zdCBkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlID0gcGF0aEluTW9kZWwoY29udGV4dFBhdGggKyBcImRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcIiwgXCJpbnRlcm5hbFwiKTtcblxuXHQvLyBcIlVucmVzb2x2YWJsZVwiIGluIG5hdmlnYXRpb25FeHByZXNzaW9uIGlzIGludGVycHJldGVkIHRvIG1lYW4gdGhhdCB0aGVyZSBhcmUgbm8gbmF2aWdhdGlvbkV4cHJlc3Npb25zXG5cdC8vIGRlZmluZWQuXG5cdC8vIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb24gaXMgYSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBjb21lc1xuXHQvLyBmcm9tIHRoZSBEZWxldGUgcmVzdHJpY3Rpb25zIGRlZmluZWQgaW4gTmF2aWdhdGlvblJlc3RyaWN0aW9ucyBmb3IgdGhpcyBlbnRpdHkuIEluIG9yZGVyIHRvXG5cdC8vIGJlIGRlbGV0YWJsZSwgdGhlIGl0ZW0gbXVzdCBhbHNvIGJlIGFsbG93ZWQgdG8gYmUgZGVsZXRhYmxlIGFjY29yZGluZyB0byB0aGUgRGVsZXRlIFJlc3RyaWN0aW9uc1xuXHQvLyBvbiB0aGUgZW50aXR5IGl0c2VsZi5cblx0cmV0dXJuIGFuZChcblx0XHRkZWxldGVWaXNpYmlsaXR5LFxuXHRcdG9yKFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0RlbGV0YWJsZS5leHByZXNzaW9uXG5cdFx0KSxcblx0XHRvcihcblx0XHRcdGdyZWF0ZXJUaGFuKGxlbmd0aChkZWxldGFibGVDb250ZXh0cywgdHJ1ZSksIDApLFxuXHRcdFx0Z3JlYXRlclRoYW4obGVuZ3RoKGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUsIHRydWUpLCAwKSxcblx0XHRcdGdyZWF0ZXJUaGFuKGxlbmd0aChkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlLCB0cnVlKSwgMCksXG5cdFx0XHRncmVhdGVyVGhhbihsZW5ndGgodW5TYXZlZENvbnRleHRzLCB0cnVlKSwgMClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnUGFzdGUnIGFjdGlvbi5cbiAqIEBwYXJhbSBwYXN0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdQYXN0ZScgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFzdGVFbmFibGVtZW50KFxuXHRwYXN0ZVZpc2liaWxpdHk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPixcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Zm9yQ29udGV4dE1lbnU6IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHNlbGVjdGVkQ29udGV4dHNQYXRoID0gIWZvckNvbnRleHRNZW51ID8gXCJzZWxlY3RlZENvbnRleHRzXCIgOiBcImNvbnRleHRtZW51L3NlbGVjdGVkQ29udGV4dHNcIjtcblx0Y29uc3QgcGFzdGVFbmFibGVtZW50UGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwibm9kZVVwZGF0ZXNJbmZvL3Bhc3RlRW5hYmxlbWVudFwiIDogXCJjb250ZXh0bWVudS9ub2RlVXBkYXRlc0luZm8vcGFzdGVFbmFibGVtZW50XCI7XG5cdGlmIChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLnR5cGUgPT09IFwiVHJlZVRhYmxlXCIpIHtcblx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0cGFzdGVWaXNpYmlsaXR5LFxuXHRcdFx0b3IoXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiLFxuXHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uXG5cdFx0XHQpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRsZXNzT3JFcXVhbChsZW5ndGgocGF0aEluTW9kZWwoc2VsZWN0ZWRDb250ZXh0c1BhdGgsIFwiaW50ZXJuYWxcIikpLCAxKSxcblx0XHRcdFx0ZXF1YWwocGF0aEluTW9kZWwocGFzdGVFbmFibGVtZW50UGF0aCwgXCJpbnRlcm5hbFwiKSwgdHJ1ZSksXG5cblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHQpO1xuXHR9XG5cdGxldCB1cGRhdGVPbk5hdmlnYXRpb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucz8uaXNVcGRhdGFibGU/Lm5hdmlnYXRpb25FeHByZXNzaW9uO1xuXHRpZiAodXBkYXRlT25OYXZpZ2F0aW9uPy5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIikge1xuXHRcdHVwZGF0ZU9uTmF2aWdhdGlvbiA9IGNvbnN0YW50KHRydWUpO1xuXHR9XG5cdHJldHVybiBhbmQodXBkYXRlT25OYXZpZ2F0aW9uLCBwYXN0ZVZpc2liaWxpdHkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBtYXNzRWRpdFZpc2liaWxpdHlcbiAqIEBwYXJhbSBmb3JDb250ZXh0TWVudSBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZXh0IG1lbnUuIElmIGZhbHNlLCB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIHRhYmxlIHRvb2xiYXJcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdNYXNzRWRpdCcgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFzc0VkaXRFbmFibGVtZW50KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdG1hc3NFZGl0VmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdCFpc0NvbnN0YW50KHBhdGhVcGRhdGFibGVFeHByZXNzaW9uKSAmJlxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiO1xuXHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dFByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiA6IFwiY29udGV4dG1lbnUvbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCI7XG5cdGNvbnN0IHVwZGF0YWJsZUNvbnRleHRQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwidXBkYXRhYmxlQ29udGV4dHNcIiA6IFwiY29udGV4dG1lbnUvdXBkYXRhYmxlQ29udGV4dHNcIjtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwocGF0aEluTW9kZWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRQcm9wZXJ0eSwgXCJpbnRlcm5hbFwiKSwgMSk7XG5cdGNvbnN0IG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMgPSBncmVhdGVyT3JFcXVhbChsZW5ndGgocGF0aEluTW9kZWwodXBkYXRhYmxlQ29udGV4dFByb3BlcnR5LCBcImludGVybmFsXCIpKSwgMSk7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gTW9kZWxIZWxwZXIuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRjb25zdCBiRGlzcGxheU1vZGUgPSBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgYmluZGluZyBpbiBjYXNlXG5cdC8vIDEuIFVwZGF0ZSBpcyBkZXBlbmRlbnQgb24gY3VycmVudCBlbnRpdHkgcHJvcGVydHkgKGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgaXMgdHJ1ZSkuXG5cdC8vIDIuIFRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWQobGlrZSBMUiksIGluIHRoaXMgY2FzZSBvbmx5IGFjdGl2ZSBjb250ZXh0cyBjYW4gYmUgbWFzcyBlZGl0ZWQuXG5cdC8vICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknIHZhbHVlIHdoaWNoIG5lZWRzIHRvIGJlIGNoZWNrZWQgcnVudGltZS5cblx0Y29uc3QgcnVudGltZUJpbmRpbmcgPSBpZkVsc2UoXG5cdFx0b3IoYW5kKGJEaXNwbGF5TW9kZSwgYklzRHJhZnRTdXBwb3J0ZWQpLCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5KSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzKSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKVxuXHQpO1xuXG5cdHJldHVybiBhbmQobWFzc0VkaXRWaXNpYmlsaXR5LCBpZkVsc2UoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSwgcnVudGltZUJpbmRpbmcsIGFuZChydW50aW1lQmluZGluZywgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pKSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSAnQ3V0JyBhY3Rpb24uXG4gKiBAcGFyYW0gY3V0VmlzaWJpbGl0eVxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ01hc3NFZGl0JyBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXRFbmFibGVtZW50KFxuXHRjdXRWaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGZvckNvbnRleHRNZW51OiBib29sZWFuXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBjdXRhYmxlQ29udGV4dHNQYXRoID0gIWZvckNvbnRleHRNZW51ID8gXCJub2RlVXBkYXRlc0luZm8vY3V0RW5hYmxlbWVudFwiIDogXCJjb250ZXh0bWVudS9ub2RlVXBkYXRlc0luZm8vY3V0RW5hYmxlbWVudFwiO1xuXHRjb25zdCBydW50aW1lQmluZGluZyA9IHBhdGhJbk1vZGVsKGN1dGFibGVDb250ZXh0c1BhdGgsIFwiaW50ZXJuYWxcIik7XG5cdHJldHVybiBhbmQoXG5cdFx0Y3V0VmlzaWJpbGl0eSxcblx0XHRvcihcblx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiLFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvblxuXHRcdCksXG5cdFx0cnVudGltZUJpbmRpbmdcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgdGhlICdDb3B5JyBhY3Rpb24uXG4gKiBAcGFyYW0gY29weVZpc2liaWxpdHlcbiAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ0NvcHknIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvcHlFbmFibGVtZW50KFxuXHRjb3B5VmlzaWJpbGl0eTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRmb3JDb250ZXh0TWVudTogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY29weWFibGVDb250ZXh0c1BhdGggPSAhZm9yQ29udGV4dE1lbnUgPyBcIm5vZGVVcGRhdGVzSW5mby9jb3B5RW5hYmxlbWVudFwiIDogXCJjb250ZXh0bWVudS9ub2RlVXBkYXRlc0luZm8vY29weUVuYWJsZW1lbnRcIjtcblx0Y29uc3QgcnVudGltZUJpbmRpbmcgPSBwYXRoSW5Nb2RlbChjb3B5YWJsZUNvbnRleHRzUGF0aCwgXCJpbnRlcm5hbFwiKTtcblx0cmV0dXJuIGFuZChjb3B5VmlzaWJpbGl0eSwgcnVudGltZUJpbmRpbmcpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgJ01vdmUgdXAnIGFuZCAnTW92ZSBkb3duJyBhY3Rpb25zLlxuICogQHBhcmFtIG1vdmVVcERvd25WaXNpYmlsaXR5XG4gKiBAcGFyYW0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIGZvclVwXG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gZ2V0TW92ZVVwRG93bkVuYWJsZW1lbnQoXG5cdG1vdmVVcERvd25WaXNpYmlsaXR5OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4sXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGZvclVwOiBib29sZWFuLFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBzaW5nbGVDb250ZXh0TW92YWJsZVVwID0gIWZvckNvbnRleHRNZW51ID8gXCJzaW5nbGVDb250ZXh0TW92YWJsZVVwXCIgOiBcImNvbnRleHRtZW51L3NpbmdsZUNvbnRleHRNb3ZhYmxlVXBcIjtcblx0Y29uc3Qgc2luZ2xlQ29udGV4dE1vdmFibGVEb3duID0gIWZvckNvbnRleHRNZW51ID8gXCJzaW5nbGVDb250ZXh0TW92YWJsZURvd25cIiA6IFwiY29udGV4dG1lbnUvc2luZ2xlQ29udGV4dE1vdmFibGVEb3duXCI7XG5cdGNvbnN0IHJ1bnRpbWVCaW5kaW5nID0gZm9yVXBcblx0XHQ/IGVxdWFsKHBhdGhJbk1vZGVsKHNpbmdsZUNvbnRleHRNb3ZhYmxlVXAsIFwiaW50ZXJuYWxcIiksIHRydWUpXG5cdFx0OiBlcXVhbChwYXRoSW5Nb2RlbChzaW5nbGVDb250ZXh0TW92YWJsZURvd24sIFwiaW50ZXJuYWxcIiksIHRydWUpO1xuXHRyZXR1cm4gYW5kKFxuXHRcdG1vdmVVcERvd25WaXNpYmlsaXR5LFxuXHRcdG9yKFxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIsXG5cdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uXG5cdFx0KSxcblx0XHRydW50aW1lQmluZGluZ1xuXHQpO1xufVxuXG4vKipcbiAqIFRlbGxzIGlmIHRoZSB0YWJsZSBpbiB0ZW1wbGF0ZSBpcyBpbiBkaXNwbGF5IG1vZGUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGNoZWNrTXVsdGlwbGVWaXN1YWxpemF0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhYmxlIGlzIGluIGRpc3BsYXkgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PiwgY2hlY2tNdWx0aXBsZVZpc3VhbGl6YXRpb24gPSBmYWxzZSk6IGJvb2xlYW4ge1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNJbmxpbmVFZGl0KCkpIHtcblx0XHQvL2lmIHRoZXJlIGlzIGlubGluZSBlZGl0IGluIHRoZSBwYWdlIHdlIGNhbm5vdCBmb3JjZSB0aGUgdGFibGUgdG8gZGlzcGxheSBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgdHlwZVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdChjaGVja011bHRpcGxlVmlzdWFsaXphdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMoKSlcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0Ly8gdXBkYXRhYmxlIHdpbGwgYmUgaGFuZGxlZCBhdCB0aGUgcHJvcGVydHkgbGV2ZWxcblx0cmV0dXJuIGZhbHNlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7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