@sapui5/sap.fe.core 1.141.2 → 1.142.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -9,6 +9,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
9
9
  var getActionEnabledExpression = UIFormatters.getActionEnabledExpression;
10
10
  var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
11
11
  var UI = BindingHelper.UI;
12
+ var Draft = BindingHelper.Draft;
12
13
  var getCustomActionID = ID.getCustomActionID;
13
14
  var Placement = ConfigurableObject.Placement;
14
15
  var ActionType = ManifestSettings.ActionType;
@@ -394,7 +395,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
394
395
  defaultAction: manifestAction.defaultAction,
395
396
  isAIOperation: manifestAction?.isAIOperation ?? undefined,
396
397
  priority: manifestAction?.priority ?? undefined,
397
- group: manifestAction?.group ?? undefined
398
+ group: manifestAction?.overflowGroup ?? manifestAction?.group ?? undefined,
399
+ overflowGroup: manifestAction?.overflowGroup ?? undefined,
400
+ disableStrictHandling: manifestAction?.disableStrictHandling ?? undefined
398
401
  };
399
402
  overrideManifestConfigurationWithAnnotation(actions[actionKey], annotationAction);
400
403
  }
@@ -627,34 +630,68 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/conver
627
630
 
628
631
  /**
629
632
  * Method to add toolbar separators if actions are grouped in more than one group.
630
- * @param actions Collection of merged actions from annotations and manifest
633
+ * @param actions Collection of merged actions from annotations and manifest settings
634
+ * @param overflowGroupsConfig Configuration for overflow group separators from manifest settings
631
635
  * @returns Collection of merged actions with toolbar separators
632
636
  */
633
- function addSeparators(actions) {
637
+ function addSeparators(actions, overflowGroupsConfig) {
638
+ if (!overflowGroupsConfig) {
639
+ return actions;
640
+ }
634
641
  const result = [];
635
642
  const groupsUsed = [];
636
- actions.forEach(action => {
637
- // if a new group is found
638
- if (action.group !== undefined && !groupsUsed.includes(action.group)) {
639
- groupsUsed.push(action.group);
640
- // if there are two or more groups, add separator
641
- if (groupsUsed.length > 1) {
642
- result.push({
643
- type: ActionType.Separator,
644
- key: "Separator::" + action.group,
645
- group: action.group,
646
- position: {
647
- anchor: action.key,
648
- placement: Placement.Before
649
- }
650
- });
651
- }
643
+ const groupStartPositions = {};
644
+
645
+ // First pass: identify groups and their positions
646
+ actions.forEach((action, index) => {
647
+ // Use overflowGroup if available, otherwise fall back to group for compatibility
648
+ const effectiveGroup = action.overflowGroup ?? action.group;
649
+ if (effectiveGroup !== undefined && !groupsUsed.includes(effectiveGroup)) {
650
+ groupsUsed.push(effectiveGroup);
651
+ groupStartPositions[effectiveGroup] = index;
652
652
  }
653
+ });
654
+
655
+ // Second pass: add actions and separators based on configuration
656
+ actions.forEach((action, index) => {
657
+ // Use overflowGroup if available, otherwise fall back to group for compatibility
658
+ const effectiveGroup = action.overflowGroup ?? action.group;
659
+ const groupConfig = overflowGroupsConfig?.[effectiveGroup?.toString() || ""];
660
+ const isGroupStart = effectiveGroup !== undefined && groupStartPositions[effectiveGroup] === index;
661
+
662
+ // Add separator at the beginning of group if configured
663
+ if (isGroupStart && groupConfig?.showSeparator && result.length > 0) {
664
+ // Don't add separator if it would be the first item
665
+ result.push({
666
+ type: ActionType.Separator,
667
+ key: "Separator::" + effectiveGroup,
668
+ group: effectiveGroup,
669
+ overflowGroup: effectiveGroup,
670
+ position: {
671
+ placement: Placement.After
672
+ }
673
+ });
674
+ }
675
+
676
+ // Add the action itself
653
677
  result.push(action);
654
678
  });
655
679
  return result;
656
680
  }
681
+
682
+ /**
683
+ * Gets the binding expression for the visibility of the CreateNext button.
684
+ * This function centralizes the visibility logic to be reused by both getFooterDefaultActions
685
+ * and FooterContent.tsx.
686
+ * @param hiddenDraftEnabled Whether hidden draft mode is enabled
687
+ * @param fclEnabled Whether FCL (Flexible Column Layout) is enabled
688
+ * @returns A compiled binding expression for the CreateNext button visibility
689
+ */
657
690
  _exports.addSeparators = addSeparators;
691
+ function getCreateNextButtonVisibility(hiddenDraftEnabled, fclEnabled) {
692
+ return ifElse(hiddenDraftEnabled === true, ifElse(fclEnabled === true, and(Draft.IsNewObject, equal(pathInModel("/showSaveAndCancelButton", "fclhelper"), true)), Draft.IsNewObject), Draft.IsNewObject);
693
+ }
694
+ _exports.getCreateNextButtonVisibility = getCreateNextButtonVisibility;
658
695
  return _exports;
659
696
  }, false);
660
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwiX2V4cG9ydHMiLCJhaUljb24iLCJQUklOVF9JQ09OIiwiRVhQT1JUX1RPX1NQUkVBRFNIRUVUX0lDT04iLCJFWFBPUlRfVE9fQ1NWX0lDT04iLCJFWFBPUlRfVE9fUERGX0lDT04iLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwiYWN0aW9ucyIsIm1lbnVBY3Rpb25Ob3RWaXNpYmxlIiwibWVudUFjdGlvblZpc2libGVQYXRocyIsImF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlIiwibWVudUl0ZW1zVmlzaWJsZVBhdGhzIiwiZm9yRWFjaCIsIm1lbnVBY3Rpb24iLCJ2aXNpYmxlIiwidmFsdWVPZiIsInB1c2giLCJtZW51IiwibGVuZ3RoIiwibWVudUl0ZW0iLCJtZW51SXRlbVZpc2libGUiLCJ0b1N0cmluZyIsImNvbXBpbGVFeHByZXNzaW9uIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJ2aXNpYmxlRXhwcmVzc2lvbnMiLCJtYXAiLCJtZW51SXRlbVZpc2libGVQYXRoIiwiYW5kIiwib3IiLCJhZGRDb2xsYWJvcmF0aW9uQ29uZGl0aW9uIiwiYWN0aW9uIiwidHlwZSIsIm5vdCIsImVxdWFsIiwiVUkiLCJoYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiIsIm1hcEFjdGlvbkJ5S2V5IiwibWFuaWZlc3RBY3Rpb25zIiwiYW5ub3RhdGlvbkFjdGlvbnMiLCJhY3Rpb25LZXkiLCJhbm5vdGF0aW9uQWN0aW9uIiwiZmluZCIsImtleSIsIm1hbmlmZXN0QWN0aW9uIiwicmVzdWx0QWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImFjdGlvbkFubm90YXRpb24iLCJBY3Rpb25UeXBlIiwiTWVudSIsImVuYWJsZWQiLCJwcm9wIiwicHJvcEtleSIsImNhbkJlTWVudUl0ZW0iLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJtYXBNZW51RGVmYXVsdEFjdGlvbiIsImNvbW1hbmRBY3Rpb25zIiwiZGVmYXVsdEFjdGlvbiIsImNvbW1hbmQiLCJtYXBNZW51SXRlbXMiLCJtYXBwZWRNZW51SXRlbXMiLCJtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24iLCJtZW51SXRlbUtleSIsIm1hcHBlZE1lbnVBY3Rpb24iLCJ0cmFuc2Zvcm1NZW51QWN0aW9uc0FuZElkZW50aWZ5Q29tbWFuZHMiLCJhbGxBY3Rpb25zIiwiYWN0aW9uS2V5c1RvRGVsZXRlIiwidW5kZWZpbmVkIiwiX2dldE1hbmlmZXN0RW5hYmxlZCIsImlzQW5ub3RhdGlvbkFjdGlvbiIsImNvbnZlcnRlckNvbnRleHQiLCJmb3JDb250ZXh0TWVudSIsImFyZ3VtZW50cyIsInJlc3VsdCIsImdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlciIsImludGVybmFsTW9kZWxQcm9wZXJ0eSIsImlmRWxzZSIsInJlcXVpcmVzU2VsZWN0aW9uIiwiZW5hYmxlT25TZWxlY3QiLCJwYXRoSW5Nb2RlbCIsImdyZWF0ZXJPckVxdWFsIiwiX2dldE1hbmlmZXN0VmlzaWJsZSIsIm92ZXJyaWRlTWFuaWZlc3RDb25maWd1cmF0aW9uV2l0aEFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsInByZXNzIiwiZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdCIsIm5hdmlnYXRpb25TZXR0aW5ncyIsImNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzIiwiaGlkZGVuQWN0aW9ucyIsImZhY2V0TmFtZSIsImxhc3REb3RJbmRleCIsImxhc3RJbmRleE9mIiwiaWQiLCJzdGFydHNXaXRoIiwiZ2V0Q3VzdG9tQWN0aW9uSUQiLCJEZWZhdWx0IiwiZW5hYmxlZEZvckNvbnRleHRNZW51IiwiaGFuZGxlck1vZHVsZSIsInN1YnN0cmluZyIsInJlcGxhY2UiLCJoYW5kbGVyTWV0aG9kIiwidGV4dCIsIm5vV3JhcCIsIl9fbm9XcmFwIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImRlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc05hdmlnYWJsZSIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZW5hYmxlQXV0b1Njcm9sbCIsImlubGluZSIsImlzQUlPcGVyYXRpb24iLCJwcmlvcml0eSIsImdyb3VwIiwicHJvcGVydHlWYWx1ZSIsInJlc29sdmVkQmluZGluZyIsImlzQ29uc3RhbnQiLCJ2YWx1ZSIsImNvbnN0YW50IiwibWV0aG9kUGF0aCIsImZvcm1hdFJlc3VsdCIsImZwbUZvcm1hdHRlciIsImN1c3RvbUJvb2xlYW5Qcm9wZXJ0eUNoZWNrIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRMb2NhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwicmVtb3ZlRHVwbGljYXRlQWN0aW9ucyIsIm9NZW51SXRlbUtleXMiLCJhY3Rpb25NZW51IiwicmVkdWNlIiwiaXRlbSIsIl9yZWYiLCJnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbkV4cHJlc3Npb24iLCJhY3Rpb25UYXJnZXQiLCJwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiIsImFubm90YXRpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJpc0VuYWJsZWRFeHAiLCJnZXRBY3Rpb25FbmFibGVkRXhwcmVzc2lvbiIsImdldENvbnZlcnRlZFR5cGVzIiwiY29sbGFib3JhdGlvbk9uUm9vdCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dCIsImdldERyYWZ0Um9vdCIsImdldEVudGl0eVNldCIsImdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwibWFwcGluZ3MiLCJtYXBwaW5nIiwiTG9jYWxQcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJTZW1hbnRpY09iamVjdFByb3BlcnR5IiwiYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWQiLCJkZXRhaWxPckRpc3BsYXkiLCJkZXRhaWwiLCJkaXNwbGF5Iiwicm91dGUiLCJhZnRlckV4ZWN1dGlvbiIsIm5hdmlnYXRlVG9JbnN0YW5jZSIsImRhdGFGaWVsZElzQ29weUFjdGlvbiIsImRhdGFGaWVsZCIsIklzQ29weUFjdGlvbiIsIiRUeXBlIiwiZ2V0Q29weUFjdGlvbiIsImNvcHlEYXRhRmllbGRzIiwiTG9nIiwiZXJyb3IiLCJnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zIiwibWVudUFjdGlvbkl0ZW1zIiwiZ2V0TWF0Y2hpbmdNYW5pZmVzdEFjdGlvbiIsImFubm90YXRpb25NZW51SXRlbXMiLCJtYXRjaGluZ01hbmlmZXN0QWN0aW9ucyIsInByZXBhcmVNZW51QWN0aW9ucyIsInVucHJlcGFyZWRBY3Rpb25zIiwib3ZlcnJpZGVNZW51QWN0aW9ucyIsImZvdW5kQWN0aW9uIiwibWVudUl0ZW1JbmRleCIsIm92ZXJyaWRlTWVudUFjdGlvbiIsInNwbGljZSIsImlzTWVudUFJT3BlcmF0aW9uIiwiaXNBSU9wZXJhdGlvbk9jY3VycmVuY2VzIiwiaXNBY3Rpb25BSU9wZXJhdGlvbiIsImlzQ3VzdG9tQWN0aW9uQUlPcGVyYXRpb24iLCJBY3Rpb25UYXJnZXQiLCJJc0FJT3BlcmF0aW9uIiwiY3VzdG9tQWN0aW9uIiwiYWRkU2VwYXJhdG9ycyIsImdyb3Vwc1VzZWQiLCJpbmNsdWRlcyIsIlNlcGFyYXRvciIsIkJlZm9yZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUge1xuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25UeXBlc1xufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z3JlYXRlck9yRXF1YWwsXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0TWFuaWZlc3RBY3Rpb24sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQWN0aW9uVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBPdmVycmlkZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldEN1c3RvbUFjdGlvbklEIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9JRFwiO1xuaW1wb3J0IGZwbUZvcm1hdHRlciBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9GUE1Gb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGdldEFjdGlvbkVuYWJsZWRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IE92ZXJmbG93VG9vbGJhclByaW9yaXR5IH0gZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgZW51bSBCdXR0b25UeXBlIHtcblx0QWNjZXB0ID0gXCJBY2NlcHRcIixcblx0QXR0ZW50aW9uID0gXCJBdHRlbnRpb25cIixcblx0QmFjayA9IFwiQmFja1wiLFxuXHRDcml0aWNhbCA9IFwiQ3JpdGljYWxcIixcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRFbXBoYXNpemVkID0gXCJFbXBoYXNpemVkXCIsXG5cdEdob3N0ID0gXCJHaG9zdFwiLFxuXHROZWdhdGl2ZSA9IFwiTmVnYXRpdmVcIixcblx0TmV1dHJhbCA9IFwiTmV1dHJhbFwiLFxuXHRSZWplY3QgPSBcIlJlamVjdFwiLFxuXHRTdWNjZXNzID0gXCJTdWNjZXNzXCIsXG5cdFRyYW5zcGFyZW50ID0gXCJUcmFuc3BhcmVudFwiLFxuXHRVbnN0eWxlZCA9IFwiVW5zdHlsZWRcIixcblx0VXAgPSBcIlVwXCJcbn1cblxuZXhwb3J0IGNvbnN0IGFpSWNvbiA9IFwic2FwLWljb246Ly9haVwiO1xuZXhwb3J0IGNvbnN0IFBSSU5UX0lDT04gPSBcInNhcC1pY29uOi8vcHJpbnRcIjtcbmV4cG9ydCBjb25zdCBFWFBPUlRfVE9fU1BSRUFEU0hFRVRfSUNPTiA9IFwic2FwLWljb246Ly9leGNlbC1hdHRhY2htZW50XCI7XG5leHBvcnQgY29uc3QgRVhQT1JUX1RPX0NTVl9JQ09OID0gXCJzYXAtaWNvbjovL2RvY3VtZW50XCI7XG5leHBvcnQgY29uc3QgRVhQT1JUX1RPX1BERl9JQ09OID0gXCJzYXAtaWNvbjovL3BkZi1hdHRhY2htZW50XCI7XG5cbmV4cG9ydCB0eXBlIEJhc2VBY3Rpb24gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkPzogc3RyaW5nO1xuXHR0ZXh0Pzogc3RyaW5nO1xuXHR0eXBlPzogQWN0aW9uVHlwZTtcblx0cHJlc3M/OiBzdHJpbmc7XG5cdGVuYWJsZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlZEZvckNvbnRleHRNZW51PzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHZpc2libGU/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlT25TZWxlY3Q/OiBzdHJpbmc7XG5cdGFubm90YXRpb25QYXRoPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdHBhcmVudEVudGl0eURlbGV0ZUVuYWJsZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0bWVudT86IEJhc2VBY3Rpb25bXTtcblx0ZmFjZXROYW1lPzogc3RyaW5nO1xuXHRjb21tYW5kPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpc0FJT3BlcmF0aW9uPzogYm9vbGVhbjtcblx0cHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0Z3JvdXA/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uID0gQmFzZUFjdGlvbiAmIHtcblx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbiB8IEFjdGlvblR5cGUuTWVudSB8IEFjdGlvblR5cGUuQ29weTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0Y3VzdG9tRGF0YT86IHN0cmluZztcblx0cmVxdWlyZXNEaWFsb2c/OiBzdHJpbmc7XG5cdGJpbmRpbmc/OiBzdHJpbmc7XG5cdGJ1dHRvblR5cGU/OiBCdXR0b25UeXBlLkdob3N0IHwgQnV0dG9uVHlwZS5UcmFuc3BhcmVudCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25BY3Rpb25BY3Rpb25Hcm91cCA9IEJhc2VBY3Rpb24gJiB7XG5cdC8vIGltcGxlbWVudHMgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcblx0dHlwZTogQWN0aW9uVHlwZS5NZW51O1xuXHRtZW51OiBBbm5vdGF0aW9uQWN0aW9uW107XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21BY3Rpb24gPSBDdXN0b21FbGVtZW50PFxuXHRCYXNlQWN0aW9uICYge1xuXHRcdGhhbmRsZXJNZXRob2Q/OiBzdHJpbmc7XG5cdFx0aGFuZGxlck1vZHVsZT86IHN0cmluZztcblx0XHRub1dyYXA/OiBib29sZWFuOyAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGF2b2lkIHRoZSB3cmFwcGluZyBmcm9tIHRoZSBGUE1IZWxwZXJcblx0XHRyZXF1aXJlc1NlbGVjdGlvbj86IGJvb2xlYW47XG5cdFx0ZGVmYXVsdEFjdGlvbj86IHN0cmluZyB8IEJhc2VBY3Rpb24gfCBDdXN0b21BY3Rpb247IC8vIEluZGljYXRlcyB3aGV0aGVyIGEgZGVmYXVsdCBhY3Rpb24gZXhpc3RzIGluIHRoaXMgY29udGV4dFxuXHR9XG4+O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uR3JvdXAgPSBCYXNlQWN0aW9uICYge1xuXHQvLyBpbXBsZW1lbnRzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdHR5cGU6IEFjdGlvblR5cGUuTWVudTtcblx0bWVudTogQW5ub3RhdGlvbkFjdGlvbltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tYmluZWRBY3Rpb24gPSB7XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj47XG59O1xuXG5leHBvcnQgdHlwZSBPdmVycmlkZVR5cGVBY3Rpb24gPSB7XG5cdGVuYWJsZUF1dG9TY3JvbGw/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRpc05hdmlnYWJsZT86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cdGVuYWJsZU9uU2VsZWN0PzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0bWVudT86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cblx0Ly8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSBhbGlnbmVkIGZvciBhbGwgYWN0aW9uc1xuXHRlbmFibGVkOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHR2aXNpYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRjb21tYW5kOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRwb3NpdGlvbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0cHJpb3JpdHk/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRncm91cD86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhRmllbGRGb3JBY3Rpb25PckFjdGlvbkdyb3VwID0gRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMgfCBEYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzO1xuXG50eXBlIE1lbnVBY3Rpb24gPVxuXHR8IEJhc2VBY3Rpb25cblx0fCB7XG5cdFx0XHR2aXNpYmxlPzogc3RyaW5nW107XG5cdFx0XHRlbmFibGVkPzogc3RyaW5nW107XG5cdFx0XHRtZW51PzogQmFzZUFjdGlvbltdO1xuXHQgIH07XG5cbi8qKlxuICogTWV0aG9kIHByb3ZpZGVzIGFjdGlvbnMgY29sbGVjdGlvbiBhZnRlciBjYWxjdWxhdGluZyB0aGUgdmlzaWJsZSBzZXR0aW5nIGZvciBhbGwgYWN0aW9ucyBvZiB0eXBlIG1lbnUgZGVwZW5kaW5nIG9uIGl0cyB2aXNpYmxlIHNldHRpbmcgYW5kIGl0cyBtZW51IGl0ZW1zIHZpc2libGUgc2V0dGluZ3MuXG4gKiBAcGFyYW0gYWN0aW9ucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgYWN0aW9ucyB3aXRoIHZpc2libGUgc2V0dGluZyBzZXQgZm9yIGFjdGlvbnMgb2YgdHlwZSBtZW51XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zID0gKGFjdGlvbnM6IEN1c3RvbUFjdGlvbltdKTogQ3VzdG9tQWN0aW9uW10gPT4ge1xuXHRsZXQgbWVudUFjdGlvbk5vdFZpc2libGU6IHN0cmluZyB8IGJvb2xlYW4sXG5cdFx0bWVudUFjdGlvblZpc2libGVQYXRoczogc3RyaW5nW10sXG5cdFx0YXRsZWFzdE9uZU1lbnVJdGVtc1Zpc2libGU6IGJvb2xlYW4sXG5cdFx0bWVudUl0ZW1zVmlzaWJsZVBhdGhzOiBzdHJpbmdbXTtcblx0YWN0aW9ucy5mb3JFYWNoKChtZW51QWN0aW9uOiBNZW51QWN0aW9uKSA9PiB7XG5cdFx0bWVudUFjdGlvbk5vdFZpc2libGUgPSBtZW51QWN0aW9uLnZpc2libGU/LnZhbHVlT2YoKSA9PT0gXCJmYWxzZVwiO1xuXHRcdGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0bWVudUl0ZW1zVmlzaWJsZVBhdGhzID0gW107XG5cdFx0bWVudUFjdGlvblZpc2libGVQYXRocyA9IFtdO1xuXHRcdGlmIChtZW51QWN0aW9uLnZpc2libGUgJiYgIShtZW51QWN0aW9uLnZpc2libGUudmFsdWVPZigpID09PSBcInRydWVcIiB8fCBtZW51QWN0aW9uLnZpc2libGUudmFsdWVPZigpID09PSBcImZhbHNlXCIpKSB7XG5cdFx0XHRtZW51QWN0aW9uVmlzaWJsZVBhdGhzLnB1c2gobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdGlmIChtZW51QWN0aW9uPy5tZW51Py5sZW5ndGgpIHtcblx0XHRcdG1lbnVBY3Rpb24/Lm1lbnU/LmZvckVhY2goKG1lbnVJdGVtOiBCYXNlQWN0aW9uKTogdm9pZCA9PiB7XG5cdFx0XHRcdGNvbnN0IG1lbnVJdGVtVmlzaWJsZSA9IG1lbnVJdGVtLnZpc2libGU7XG5cdFx0XHRcdGlmIChtZW51SXRlbVZpc2libGUgJiYgKHR5cGVvZiBtZW51SXRlbVZpc2libGUgPT09IFwiYm9vbGVhblwiIHx8IG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkgPT09IFwidHJ1ZVwiKSkge1xuXHRcdFx0XHRcdGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChtZW51SXRlbVZpc2libGUgJiYgbWVudUl0ZW1WaXNpYmxlLnZhbHVlT2YoKSAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdFx0bWVudUl0ZW1zVmlzaWJsZVBhdGhzLnB1c2gobWVudUl0ZW1WaXNpYmxlLnZhbHVlT2YoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKG1lbnVBY3Rpb25Ob3RWaXNpYmxlKSB7XG5cdFx0XHRcdC8vIGlmIG1lbnUgaXMgc3RhdGljYWxseSB2aXNpYmxlIGZhbHNlXG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGZhbHNlLnRvU3RyaW5nKCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSAmJiAhbWVudUl0ZW1zVmlzaWJsZVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBpZiBhbGwgbWVudSBpdGVtcyBhcmUgc3RhdGljYWxseSB2aXNpYmxlIGZhbHNlXG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGZhbHNlLnRvU3RyaW5nKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlICYmICFtZW51QWN0aW9uVmlzaWJsZVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBpZiBhdCBsZWFzdCBvbmUgbWVudSBpdGVtIGlzIHN0YXRpY2FsbHkgdmlzaWJsZSB0cnVlIGFuZCBubyB2aXNpYmxlIHNldHRpbmcgZm9yIG1lbnVcblx0XHRcdFx0bWVudUFjdGlvbi52aXNpYmxlID0gdHJ1ZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmIChhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSkge1xuXHRcdFx0XHQvLyBpZiBhdCBsZWFzdCBvbmUgbWVudSBpdGVtLCB0aGVuIGp1c3QgY29uc2lkZXIgdmlzaWJsZSBzZXR0aW5nIG9mIHRoZSBtZW51XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcpKTtcblx0XHRcdH0gZWxzZSBpZiAobWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGggfHwgbWVudUl0ZW1zVmlzaWJsZVBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgbWVudSBpcyBzZXQgdG8gaW52aXNpYmxlLCBpdCBzaG91bGQgYmUgaW52aXNpYmxlLCBvdGhlcndpc2UgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaXRlbXNcblx0XHRcdFx0Y29uc3QgdmlzaWJsZUV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IG1lbnVJdGVtc1Zpc2libGVQYXRocy5tYXAoKG1lbnVJdGVtVmlzaWJsZVBhdGgpID0+XG5cdFx0XHRcdFx0cmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUl0ZW1WaXNpYmxlUGF0aCwgXCJib29sZWFuXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGFuZChyZXNvbHZlQmluZGluZ1N0cmluZygobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZykgfHwgdHJ1ZSwgXCJib29sZWFuXCIpLCBvciguLi52aXNpYmxlRXhwcmVzc2lvbnMpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWVudUFjdGlvbi52aXNpYmxlID0gKCFtZW51QWN0aW9uTm90VmlzaWJsZSkudG9TdHJpbmcoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYWN0aW9ucztcbn07XG5cbi8qKlxuICogQWRkcyB0aGUgY29sbGFib3JhdGlvbiBjb25kaXRpb24gdG8gYWxsIGFjdGlvbnMgd2l0aCB0eXBlIEZvckFjdGlvbi5cbiAqIFRoaXMgZGlzYWJsZXMgdGhlIGFjdGlvbnMgaWYgdGhlIGNvbGxhYm9yYXRpb24gaXMgZW5hYmxlZCwgYnV0IHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGUgYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBiYWNrIGVuZC5cbiAqIEBwYXJhbSBhY3Rpb25zIFRoZSBsaXN0IG9mIGRlZmluaXRpb25zIG9mIHRoZSB0YWJsZSBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29sbGFib3JhdGlvbkNvbmRpdGlvbihhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IHZvaWQge1xuXHRhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuXHRcdGlmIChhY3Rpb24udmlzaWJsZT8udmFsdWVPZigpID09PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGFjdGlvbi50eXBlID09PSBcIkZvckFjdGlvblwiKSB7XG5cdFx0XHRhY3Rpb24udmlzaWJsZSA9IGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRhbmQocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uLnZpc2libGUgYXMgc3RyaW5nLCBcImJvb2xlYW5cIiksIG5vdChlcXVhbChVSS5oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiwgZmFsc2UpKSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBNYXBzIGFuIGFjdGlvbiBieSBpdHMga2V5LCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBhY3Rpb25zIGFuZCBtYW5pZmVzdCBjb25maWd1cmF0aW9uLiBUaGUgcmVzdWx0IGFscmVhZHkgcmVwcmVzZW50cyB0aGVcbiAqIG1lcmdlZCBhY3Rpb24gZnJvbSBib3RoIGNvbmZpZ3VyYXRpb24gc291cmNlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIGFjdGlvbiBjYW4gYmUgYSBtZW51IGl0ZW0sIHNheWluZyB3aGV0aGVyIGl0IGlzIHZpc2libGUgb3Igb2YgYSBzcGVjaWZpYyB0eXBlXG4gKiB0aGF0IGFsbG93cyB0aGlzLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBhY3Rpb25LZXkgQWN0aW9uIEtleSB0byBsb29rIHVwXG4gKiBAcmV0dXJucyBNZXJnZWQgYWN0aW9uIGFuZCBpbmRpY2F0b3Igd2hldGhlciBpdCBjYW4gYmUgYSBtZW51IGl0ZW1cbiAqL1xuZnVuY3Rpb24gbWFwQWN0aW9uQnlLZXkoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0YWN0aW9uS2V5OiBzdHJpbmdcbik6IHsgYWN0aW9uOiBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uOyBjYW5CZU1lbnVJdGVtOiBib29sZWFuIHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSB7XG5cdGNvbnN0IGFubm90YXRpb25BY3Rpb24gPSBhbm5vdGF0aW9uQWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5rZXkgPT09IGFjdGlvbktleSk7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdGxldCByZXN1bHRBY3Rpb246IFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbiB8IEJhc2VBY3Rpb24gPSB7IC4uLihhbm5vdGF0aW9uQWN0aW9uID8/IG1hbmlmZXN0QWN0aW9uKSB9O1xuXG5cdC8vIGFjdGlvbnMgaW5zaWRlIG1lbnVzIGNhbid0IGJlIGZvdW5kIG9uIHRvcCBsZXZlbCwgc28gYXNzaWduIGFjdGlvbnMgZnJvbSBtZW51IHRvIGl0XG5cdGlmIChPYmplY3Qua2V5cyhyZXN1bHRBY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuXHRcdGFubm90YXRpb25BY3Rpb25zXG5cdFx0XHQuZmlsdGVyKChhY3Rpb25Bbm5vdGF0aW9uOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhY3Rpb25Bbm5vdGF0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudTtcblx0XHRcdH0pXG5cdFx0XHQuZm9yRWFjaCgobWVudUFjdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRtZW51QWN0aW9uLm1lbnU/LmZvckVhY2goKG1lbnVJdGVtOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG1lbnVJdGVtLmtleSA9PT0gYWN0aW9uS2V5KSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRBY3Rpb24gPSBtZW51SXRlbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvLyBBbm5vdGF0aW9uIGFjdGlvbiBhbmQgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0byBiZSBtZXJnZWQgaGVyZSBhcyBpbnNlcnRDdXN0b21FbGVtZW50cyBvbmx5IGNvbnNpZGVycyB0b3AtbGV2ZWwgYWN0aW9uc1xuXHRpZiAoYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdC8vIElmIGVuYWJsZWQgb3IgdmlzaWJsZSBpcyBub3Qgc2V0IGluIHRoZSBtYW5pZmVzdCwgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlIGFuZCBoZW5jZSBkbyBub3Qgb3ZlcndyaXRlXG5cdFx0cmVzdWx0QWN0aW9uLmVuYWJsZWQgPSBtYW5pZmVzdEFjdGlvbj8uZW5hYmxlZCA/PyBhbm5vdGF0aW9uQWN0aW9uLmVuYWJsZWQ7XG5cdFx0cmVzdWx0QWN0aW9uLnZpc2libGUgPSBtYW5pZmVzdEFjdGlvbj8udmlzaWJsZSA/PyBhbm5vdGF0aW9uQWN0aW9uLnZpc2libGU7XG5cblx0XHRmb3IgKGNvbnN0IHByb3AgaW4gbWFuaWZlc3RBY3Rpb24gfHwge30pIHtcblx0XHRcdGNvbnN0IHByb3BLZXkgPSBwcm9wIGFzIGtleW9mIEJhc2VBY3Rpb247XG5cdFx0XHRpZiAoIWFubm90YXRpb25BY3Rpb25bcHJvcEtleV0gJiYgcHJvcEtleSAhPT0gXCJtZW51XCIpIHtcblx0XHRcdFx0cmVzdWx0QWN0aW9uW3Byb3BLZXldID0gbWFuaWZlc3RBY3Rpb25bcHJvcEtleV0gYXMgbmV2ZXI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgY2FuQmVNZW51SXRlbSA9XG5cdFx0cmVzdWx0QWN0aW9uPy52aXNpYmxlIHx8XG5cdFx0cmVzdWx0QWN0aW9uPy50eXBlID09PSBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdHJlc3VsdEFjdGlvbj8udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0cmV0dXJuIHtcblx0XHRhY3Rpb246IHJlc3VsdEFjdGlvbiBhcyBCYXNlQWN0aW9uIHwgQ3VzdG9tQWN0aW9uLFxuXHRcdGNhbkJlTWVudUl0ZW1cblx0fTtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIGRlZmF1bHQgYWN0aW9uIGtleSBvZiBhIG1lbnUgdG8gaXRzIGFjdHVhbCBhY3Rpb24gY29uZmlndXJhdGlvbiBhbmQgaWRlbnRpZnkgd2hldGhlciB0aGlzIGRlZmF1bHQgYWN0aW9uIGlzIGEgY29tbWFuZC5cbiAqIEBwYXJhbSBtZW51QWN0aW9uIE1lbnUgYWN0aW9uIHRvIG1hcCB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgdGhyb3VnaCBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGNvbW1hbmRBY3Rpb25zIEFycmF5IG9mIGNvbW1hbmQgYWN0aW9ucyB0byBwdXNoIHRoZSBkZWZhdWx0IGFjdGlvbiB0byBpZiBhcHBsaWNhYmxlXG4gKi9cbmZ1bmN0aW9uIG1hcE1lbnVEZWZhdWx0QWN0aW9uKFxuXHRtZW51QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbiB8IEJhc2VBY3Rpb24+XG4pOiB2b2lkIHtcblx0Y29uc3QgeyBhY3Rpb24sIGNhbkJlTWVudUl0ZW0gfSA9IG1hcEFjdGlvbkJ5S2V5KG1hbmlmZXN0QWN0aW9ucywgYW5ub3RhdGlvbkFjdGlvbnMsIG1lbnVBY3Rpb24uZGVmYXVsdEFjdGlvbiBhcyBzdHJpbmcpO1xuXG5cdGlmIChjYW5CZU1lbnVJdGVtKSB7XG5cdFx0bWVudUFjdGlvbi5kZWZhdWx0QWN0aW9uID0gYWN0aW9uO1xuXHR9XG5cblx0aWYgKGFjdGlvbi5jb21tYW5kKSB7XG5cdFx0Y29tbWFuZEFjdGlvbnNbYWN0aW9uLmtleV0gPSBhY3Rpb247XG5cdH1cbn1cblxuLyoqXG4gKiBNYXAgdGhlIG1lbnUgaXRlbSBrZXlzIG9mIGEgbWVudSB0byB0aGVpciBhY3R1YWwgYWN0aW9uIGNvbmZpZ3VyYXRpb25zIGFuZCBpZGVudGlmeSB3aGV0aGVyIHRoZXkgYXJlIGNvbW1hbmRzLlxuICogQHBhcmFtIG1lbnVBY3Rpb24gTWVudSBhY3Rpb24gdG8gbWFwIHRoZSBtZW51IGl0ZW1zIGZvclxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBjb21tYW5kQWN0aW9ucyBBcnJheSBvZiBjb21tYW5kIGFjdGlvbnMgdG8gcHVzaCB0aGUgbWVudSBpdGVtIGFjdGlvbnMgdG8gaWYgYXBwbGljYWJsZVxuICovXG5mdW5jdGlvbiBtYXBNZW51SXRlbXMoXG5cdG1lbnVBY3Rpb246IFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbixcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+LFxuXHRhbm5vdGF0aW9uQWN0aW9uczogQmFzZUFjdGlvbltdLFxuXHRjb21tYW5kQWN0aW9uczogUmVjb3JkPHN0cmluZywgQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbj5cbik6IHZvaWQge1xuXHRjb25zdCBtYXBwZWRNZW51SXRlbXM6IChDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uKVtdID0gW107XG5cdGNvbnN0IG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbiA9IGFubm90YXRpb25BY3Rpb25zLmZpbmQoKGFubm90YXRpb25BY3Rpb24pID0+IGFubm90YXRpb25BY3Rpb24ua2V5ID09PSBtZW51QWN0aW9uLmtleSk7XG5cblx0aWYgKG1lbnVBY3Rpb24ubWVudT8ubGVuZ3RoICE9PSAwKSB7XG5cdFx0Zm9yIChjb25zdCBtZW51SXRlbUtleSBvZiBtZW51QWN0aW9uLm1lbnUgPz8gW10pIHtcblx0XHRcdGNvbnN0IHsgYWN0aW9uLCBjYW5CZU1lbnVJdGVtIH0gPSBtYXBBY3Rpb25CeUtleShtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBtZW51SXRlbUtleSk7XG5cblx0XHRcdGlmIChjYW5CZU1lbnVJdGVtKSB7XG5cdFx0XHRcdG1hcHBlZE1lbnVJdGVtcy5wdXNoKGFjdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhY3Rpb24uY29tbWFuZCkge1xuXHRcdFx0XHRjb21tYW5kQWN0aW9uc1ttZW51SXRlbUtleV0gPSBhY3Rpb247XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgbm8gbWVudSBpdGVtcyBhcmUgYXNzaWduZWQgdG8gdGhlIG1hbmlmZXN0LW92ZXJyaWRlLW1lbnUsIGl0IGluaGVyaXRzIHRoZSBpdGVtcyBmcm9tIHRoZSBwcmV2aW91cyBtZW51XG5cdGVsc2UgaWYgKG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdG1hdGNoaW5nQW5ub3RhdGlvbkFjdGlvbi5tZW51Py5mb3JFYWNoKChtZW51SXRlbSkgPT4gbWFwcGVkTWVudUl0ZW1zLnB1c2gobWVudUl0ZW0pKTtcblx0fVxuXG5cdGNvbnN0IG1hcHBlZE1lbnVBY3Rpb24gPSBtZW51QWN0aW9uIGFzIEN1c3RvbUFjdGlvbjtcblx0bWFwcGVkTWVudUFjdGlvbi5tZW51ID0gbWFwcGVkTWVudUl0ZW1zO1xuXG5cdC8vIElmIHRoZSBtZW51IGlzIHNldCB0byBpbnZpc2libGUsIGl0IHNob3VsZCBiZSBpbnZpc2libGUsIG90aGVyd2lzZSB0aGUgdmlzaWJpbGl0eSBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBpdGVtc1xuXHRjb25zdCB2aXNpYmxlRXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdID0gbWFwcGVkTWVudUl0ZW1zLm1hcCgobWVudUl0ZW0pID0+XG5cdFx0cmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUl0ZW0udmlzaWJsZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKVxuXHQpO1xuXHRtYXBwZWRNZW51QWN0aW9uLnZpc2libGUgPSBjb21waWxlRXhwcmVzc2lvbihcblx0XHRhbmQocmVzb2x2ZUJpbmRpbmdTdHJpbmcobWVudUFjdGlvbi52aXNpYmxlIGFzIHN0cmluZywgXCJib29sZWFuXCIpLCBvciguLi52aXNpYmxlRXhwcmVzc2lvbnMpKVxuXHQpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGZsYXQgY29sbGVjdGlvbiBvZiBhY3Rpb25zIGludG8gYSBuZXN0ZWQgc3RydWN0dXJlcyBvZiBtZW51cy4gVGhlIHJlc3VsdCBpcyBhIHJlY29yZCBvZiBhY3Rpb25zIHRoYXQgYXJlIGVpdGhlciBtZW51cyBvclxuICogb25lcyB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gbWVudXMgYXMgbWVudSBpdGVtcy4gSXQgYWxzbyByZXR1cm5zIGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgaGF2ZSBhbiBhc3NpZ25lZCBjb21tYW5kLlxuICpcbiAqIE5vdGUgdGhhdCBtZW51IGl0ZW1zIGFyZSBhbHJlYWR5IHRoZSBtZXJnZWQgcmVzdWx0IG9mIGFubm90YXRpb24gYWN0aW9ucyBhbmQgdGhlaXIgbWFuaWZlc3QgY29uZmlndXJhdGlvbiwgYXMge0BsaW5rIGluc2VydEN1c3RvbUVsZW1lbnRzfVxuICogb25seSBjb25zaWRlcnMgcm9vdC1sZXZlbCBhY3Rpb25zLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBhY3Rpb25zIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBhIGxpc3Qgb2YgY29tbWFuZCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1lbnVBY3Rpb25zQW5kSWRlbnRpZnlDb21tYW5kcyhcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+LFxuXHRhbm5vdGF0aW9uQWN0aW9uczogQmFzZUFjdGlvbltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+PiB7XG5cdGNvbnN0IGFsbEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4gPSB7fTtcblx0Y29uc3QgYWN0aW9uS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBjb21tYW5kQWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXG5cdGZvciAoY29uc3QgYWN0aW9uS2V5IGluIG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblxuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi5kZWZhdWx0QWN0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1hcE1lbnVEZWZhdWx0QWN0aW9uKG1hbmlmZXN0QWN0aW9uLCBtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBjb21tYW5kQWN0aW9ucyk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hbmlmZXN0QWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkge1xuXHRcdFx0bWFwTWVudUl0ZW1zKG1hbmlmZXN0QWN0aW9uLCBtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBjb21tYW5kQWN0aW9ucyk7XG5cblx0XHRcdC8vIE1lbnUgaGFzIG5vIHZpc2libGUgaXRlbXMsIHNvIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCFtYW5pZmVzdEFjdGlvbi5tZW51Py5sZW5ndGgpIHtcblx0XHRcdFx0YWN0aW9uS2V5c1RvRGVsZXRlLnB1c2gobWFuaWZlc3RBY3Rpb24ua2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uY29tbWFuZCkge1xuXHRcdFx0Y29tbWFuZEFjdGlvbnNbYWN0aW9uS2V5XSA9IG1hbmlmZXN0QWN0aW9uIGFzIEN1c3RvbUFjdGlvbjtcblx0XHR9XG5cblx0XHRhbGxBY3Rpb25zW2FjdGlvbktleV0gPSBtYW5pZmVzdEFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdH1cblxuXHRhY3Rpb25LZXlzVG9EZWxldGUuZm9yRWFjaCgoYWN0aW9uS2V5OiBzdHJpbmcpID0+IGRlbGV0ZSBhbGxBY3Rpb25zW2FjdGlvbktleV0pO1xuXG5cdHJldHVybiB7XG5cdFx0YWN0aW9uczogYWxsQWN0aW9ucyxcblx0XHRjb21tYW5kQWN0aW9uczogY29tbWFuZEFjdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBlbmFibGVtZW50IG9mIGEgbWFuaWZlc3QgYWN0aW9uLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIFRoZSBhY3Rpb24gY29uZmlndXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBpc0Fubm90YXRpb25BY3Rpb24gV2hldGhlciB0aGUgYWN0aW9uLCBkZWZpbmVkIGluIG1hbmlmZXN0LCBjb3JyZXNwb25kcyB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnVcbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBlbmFibGVtZW50XG4gKi9cbmNvbnN0IF9nZXRNYW5pZmVzdEVuYWJsZWQgPSBmdW5jdGlvbiAoXG5cdG1hbmlmZXN0QWN0aW9uOiBNYW5pZmVzdEFjdGlvbixcblx0aXNBbm5vdGF0aW9uQWN0aW9uOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzQW5ub3RhdGlvbkFjdGlvbiAmJiBtYW5pZmVzdEFjdGlvbi5lbmFibGVkID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBJZiBhbm5vdGF0aW9uIGFjdGlvbiBoYXMgbm8gcHJvcGVydHkgZGVmaW5lZCBpbiBtYW5pZmVzdCxcblx0XHQvLyBkbyBub3Qgb3ZlcndyaXRlIGl0IHdpdGggbWFuaWZlc3QgYWN0aW9uJ3MgZGVmYXVsdCB2YWx1ZS5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgcmVzdWx0ID0gZ2V0TWFuaWZlc3RBY3Rpb25Cb29sZWFuUHJvcGVydHlXaXRoRm9ybWF0dGVyKG1hbmlmZXN0QWN0aW9uLmVuYWJsZWQsIGNvbnZlcnRlckNvbnRleHQsIGZvckNvbnRleHRNZW51KTtcblxuXHQvLyBDb25zaWRlciByZXF1aXJlc1NlbGVjdGlvbiBwcm9wZXJ0eSB0byBpbmNsdWRlIHNlbGVjdGVkQ29udGV4dHMgaW4gdGhlIGJpbmRpbmcgZXhwcmVzc2lvblxuXHRjb25zdCBpbnRlcm5hbE1vZGVsUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS9udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIjtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdGlmRWxzZShcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRtYW5pZmVzdEFjdGlvbi5lbmFibGVPblNlbGVjdCA9PT0gXCJzaW5nbGVcIixcblx0XHRcdFx0YW5kKGVxdWFsKHBhdGhJbk1vZGVsKGludGVybmFsTW9kZWxQcm9wZXJ0eSwgXCJpbnRlcm5hbFwiKSwgMSksIHJlc3VsdCksXG5cdFx0XHRcdGFuZChncmVhdGVyT3JFcXVhbChwYXRoSW5Nb2RlbChpbnRlcm5hbE1vZGVsUHJvcGVydHksIFwiaW50ZXJuYWxcIiksIDEpLCByZXN1bHQpXG5cdFx0XHQpLFxuXHRcdFx0cmVzdWx0XG5cdFx0KVxuXHQpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSB2aXNpYmlsaXR5IG9mIGEgbWFuaWZlc3QgYWN0aW9uLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIFRoZSBhY3Rpb24gY29uZmlndXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSBpc0Fubm90YXRpb25BY3Rpb24gV2hldGhlciB0aGUgYWN0aW9uLCBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgY29ycmVzcG9uZHMgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgdmlzaWJpbGl0eVxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RWaXNpYmxlID0gZnVuY3Rpb24gKFxuXHRtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24sXG5cdGlzQW5ub3RhdGlvbkFjdGlvbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc0Fubm90YXRpb25BY3Rpb24gJiYgbWFuaWZlc3RBY3Rpb24udmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBhY3Rpb24gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGFjdGlvbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihtYW5pZmVzdEFjdGlvbi52aXNpYmxlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHJlc3VsdCk7XG59O1xuXG50eXBlIFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbiA9IE9taXQ8Q3VzdG9tQWN0aW9uLCBcIm1lbnVcIj4gJiB7XG5cdG1lbnU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRwcmlvcml0eT86IE92ZXJmbG93VG9vbGJhclByaW9yaXR5O1xuXHRncm91cD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQXMgc29tZSBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmUgb3ZlcnJpZGFibGUgYnkgdGhlIG1hbmlmZXN0LCBtYWtlIHN1cmUgdGhhdCB0aGUgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBnZXRzIHRoZSBhbm5vdGF0aW9uIHZhbHVlcyBmb3IgdGhlc2UuXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb24gQWN0aW9uIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbiBBY3Rpb24gZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKi9cbmZ1bmN0aW9uIG92ZXJyaWRlTWFuaWZlc3RDb25maWd1cmF0aW9uV2l0aEFubm90YXRpb24obWFuaWZlc3RBY3Rpb246IFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbiwgYW5ub3RhdGlvbkFjdGlvbj86IEJhc2VBY3Rpb24pOiB2b2lkIHtcblx0aWYgKCFhbm5vdGF0aW9uQWN0aW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gRG8gbm90IG92ZXJyaWRlIHRoZSAndHlwZScgZ2l2ZW4gaW4gYW4gYW5ub3RhdGlvbiBhY3Rpb25cblx0bWFuaWZlc3RBY3Rpb24udHlwZSA9IGFubm90YXRpb25BY3Rpb24udHlwZTtcblx0bWFuaWZlc3RBY3Rpb24uYW5ub3RhdGlvblBhdGggPSBhbm5vdGF0aW9uQWN0aW9uLmFubm90YXRpb25QYXRoO1xuXHRtYW5pZmVzdEFjdGlvbi5wcmVzcyA9IGFubm90YXRpb25BY3Rpb24ucHJlc3M7XG5cblx0Ly8gT25seSB1c2UgdGhlIGFubm90YXRpb24gdmFsdWVzIGZvciBlbmFibGVtZW50IGFuZCB2aXNpYmlsaXR5IGlmIG5vdCBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdG1hbmlmZXN0QWN0aW9uLmVuYWJsZWQgPSBtYW5pZmVzdEFjdGlvbi5lbmFibGVkID8/IGFubm90YXRpb25BY3Rpb24uZW5hYmxlZDtcblx0bWFuaWZlc3RBY3Rpb24udmlzaWJsZSA9IG1hbmlmZXN0QWN0aW9uLnZpc2libGUgPz8gYW5ub3RhdGlvbkFjdGlvbi52aXNpYmxlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGFjdGlvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIG1hbmlmZXN0IGFjdGlvbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIFRoZSBhbm5vdGF0aW9uIGFjdGlvbnMgZGVmaW5pdGlvblxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5ncyBUaGUgbmF2aWdhdGlvbiBzZXR0aW5nc1xuICogQHBhcmFtIGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzIFRoZSBuYXZpZ2F0aW9uIHNldHRpbmdzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBoaWRkZW5BY3Rpb25zIEFjdGlvbnMgdGhhdCBhcmUgY29uZmlndXJlZCBhcyBoaWRkZW4gKGFkZGl0aW9uYWwgdG8gdGhlIHZpc2libGUgcHJvcGVydHkpXG4gKiBAcGFyYW0gZmFjZXROYW1lIFRoZSBmYWNldCB3aGVyZSBhbiBhY3Rpb24gaXMgZGlzcGxheWVkIGlmIGl0IGlzIGlubGluZVxuICogQHJldHVybnMgVGhlIGFjdGlvbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RBY3Rpb24+IHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGFubm90YXRpb25BY3Rpb25zPzogQmFzZUFjdGlvbltdLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncz86IGJvb2xlYW4sXG5cdGhpZGRlbkFjdGlvbnM/OiBCYXNlQWN0aW9uW10sXG5cdGZhY2V0TmFtZT86IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPj4ge1xuXHRjb25zdCBhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24+ID0ge307XG5cdGZvciAoY29uc3QgYWN0aW9uS2V5IGluIG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0QWN0aW9uOiBNYW5pZmVzdEFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdGNvbnN0IGxhc3REb3RJbmRleCA9IG1hbmlmZXN0QWN0aW9uLnByZXNzPy5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTE7XG5cdFx0bGV0IGFubm90YXRpb25BY3Rpb246IEJhc2VBY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAoYW5ub3RhdGlvbkFjdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgYWN0aW9uIG9mIGFubm90YXRpb25BY3Rpb25zKSB7XG5cdFx0XHRcdC8vIFN1YlNlY3Rpb24udHMjY3JlYXRlRm9ybUFjdGlvblJlZHVjZXIgdXNlcyBpbnNlcnRDdXN0b21FbGVtZW50cyB3aGljaCByZXN1bHRzIGluIGFubm90YXRpb24gYWN0aW9ucyBtaXhpbmcgdXAgd2l0aCBtYW5pZmVzdCBhY3Rpb25cblx0XHRcdFx0Ly8gdGhpcyBpcyB3aHkgd2UgbWF5IGZpbmQgYW4gYWN0aW9uIHRoYXQgaGFzIGEgQ3VzdG9tQWN0aW9uIHByZWZpeFxuXHRcdFx0XHRpZiAoYWN0aW9uLmlkPy5zdGFydHNXaXRoKFwiQ3VzdG9tQWN0aW9uOjpcIikpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYWN0aW9uLmtleSA9PT0gYWN0aW9uS2V5KSB7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbkFjdGlvbiA9IGFjdGlvbjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gXCJNZW51XCIpIHtcblx0XHRcdFx0XHQvLyBJZiBub3QgZm91bmQsIGNoZWNrIGluc2lkZSBtZW51c1xuXHRcdFx0XHRcdGFubm90YXRpb25BY3Rpb24gPSBhY3Rpb24ubWVudT8uZmluZCgobWVudUl0ZW06IEJhc2VBY3Rpb24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBtZW51SXRlbS5rZXkgPT09IGFjdGlvbktleTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVG8gaWRlbnRpZnkgdGhlIGFubm90YXRpb24gYWN0aW9uIHByb3BlcnR5IG92ZXJ3cml0ZSB2aWEgbWFuaWZlc3QgdXNlLWNhc2UuXG5cdFx0Y29uc3QgaXNBbm5vdGF0aW9uQWN0aW9uID0gISFhbm5vdGF0aW9uQWN0aW9uO1xuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi5mYWNldE5hbWUpIHtcblx0XHRcdGZhY2V0TmFtZSA9IG1hbmlmZXN0QWN0aW9uLmZhY2V0TmFtZTtcblx0XHR9XG5cblx0XHRhY3Rpb25zW2FjdGlvbktleV0gPSB7XG5cdFx0XHRpZDogYW5ub3RhdGlvbkFjdGlvbiA/IGFjdGlvbktleSA6IGdldEN1c3RvbUFjdGlvbklEKGFjdGlvbktleSksXG5cdFx0XHR0eXBlOiBtYW5pZmVzdEFjdGlvbi5tZW51ID8gQWN0aW9uVHlwZS5NZW51IDogQWN0aW9uVHlwZS5EZWZhdWx0LFxuXHRcdFx0dmlzaWJsZTogX2dldE1hbmlmZXN0VmlzaWJsZShtYW5pZmVzdEFjdGlvbiwgaXNBbm5vdGF0aW9uQWN0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdGVuYWJsZWQ6IF9nZXRNYW5pZmVzdEVuYWJsZWQobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRlbmFibGVkRm9yQ29udGV4dE1lbnU6IF9nZXRNYW5pZmVzdEVuYWJsZWQobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCwgdHJ1ZSksXG5cdFx0XHRoYW5kbGVyTW9kdWxlOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyAmJiBtYW5pZmVzdEFjdGlvbi5wcmVzcy5zdWJzdHJpbmcoMCwgbGFzdERvdEluZGV4KS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdGhhbmRsZXJNZXRob2Q6IG1hbmlmZXN0QWN0aW9uLnByZXNzICYmIG1hbmlmZXN0QWN0aW9uLnByZXNzLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxKSxcblx0XHRcdHByZXNzOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyxcblx0XHRcdHRleHQ6IG1hbmlmZXN0QWN0aW9uLnRleHQsXG5cdFx0XHRub1dyYXA6IG1hbmlmZXN0QWN0aW9uLl9fbm9XcmFwLFxuXHRcdFx0a2V5OiByZXBsYWNlU3BlY2lhbENoYXJzKGFjdGlvbktleSksXG5cdFx0XHRlbmFibGVPblNlbGVjdDogbWFuaWZlc3RBY3Rpb24uZW5hYmxlT25TZWxlY3QsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1hbmlmZXN0QWN0aW9uLmRlZmF1bHRWYWx1ZXNGdW5jdGlvbixcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdEFjdGlvbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0aXNOYXZpZ2FibGU6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0QWN0aW9uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzKSxcblx0XHRcdGNvbW1hbmQ6IG1hbmlmZXN0QWN0aW9uLmNvbW1hbmQsXG5cdFx0XHRyZXF1aXJlc1NlbGVjdGlvbjogbWFuaWZlc3RBY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWFuaWZlc3RBY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24sXG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsOiBlbmFibGVBdXRvU2Nyb2xsKG1hbmlmZXN0QWN0aW9uKSxcblx0XHRcdG1lbnU6IG1hbmlmZXN0QWN0aW9uLm1lbnUgPz8gKGFubm90YXRpb25BY3Rpb24/LnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSA/IFtdIDogdW5kZWZpbmVkKSxcblx0XHRcdGZhY2V0TmFtZTogbWFuaWZlc3RBY3Rpb24uaW5saW5lID8gZmFjZXROYW1lIDogdW5kZWZpbmVkLFxuXHRcdFx0ZGVmYXVsdEFjdGlvbjogbWFuaWZlc3RBY3Rpb24uZGVmYXVsdEFjdGlvbixcblx0XHRcdGlzQUlPcGVyYXRpb246IG1hbmlmZXN0QWN0aW9uPy5pc0FJT3BlcmF0aW9uID8/IHVuZGVmaW5lZCxcblx0XHRcdHByaW9yaXR5OiBtYW5pZmVzdEFjdGlvbj8ucHJpb3JpdHkgPz8gdW5kZWZpbmVkLFxuXHRcdFx0Z3JvdXA6IG1hbmlmZXN0QWN0aW9uPy5ncm91cCA/PyB1bmRlZmluZWRcblx0XHR9O1xuXG5cdFx0b3ZlcnJpZGVNYW5pZmVzdENvbmZpZ3VyYXRpb25XaXRoQW5ub3RhdGlvbihhY3Rpb25zW2FjdGlvbktleV0sIGFubm90YXRpb25BY3Rpb24pO1xuXHR9XG5cblx0cmV0dXJuIHRyYW5zZm9ybU1lbnVBY3Rpb25zQW5kSWRlbnRpZnlDb21tYW5kcyhhY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucyA/PyBbXSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBCb29sZWFuIG1hbmlmZXN0IHByb3BlcnR5IHRoYXQgY2FuIGVpdGhlciBiZSByZXByZXNlbnRlZCBieSBhIHN0YXRpYyB2YWx1ZSwgYSBiaW5kaW5nIHN0cmluZyxcbiAqIG9yIGEgcnVudGltZSBmb3JtYXR0ZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmVkIHByb3BlcnR5IHZhbHVlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyByZXF1ZXN0ZWQgZm9yIGEgY29udGV4dCBtZW51IGFjdGlvblxuICogQHJldHVybnMgQSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdEFjdGlvbkJvb2xlYW5Qcm9wZXJ0eVdpdGhGb3JtYXR0ZXIoXG5cdHByb3BlcnR5VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVzb2x2ZWRCaW5kaW5nID0gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8Ym9vbGVhbiB8IHN0cmluZz4ocHJvcGVydHlWYWx1ZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKTtcblx0bGV0IHJlc3VsdDogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRpZiAoaXNDb25zdGFudChyZXNvbHZlZEJpbmRpbmcpICYmIHJlc29sdmVkQmluZGluZy52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gTm8gcHJvcGVydHkgdmFsdWUgY29uZmlndXJlZCBpbiBtYW5pZmVzdCBmb3IgdGhlIGN1c3RvbSBhY3Rpb24gLS0+IGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZVxuXHRcdHJlc3VsdCA9IGNvbnN0YW50KHRydWUpO1xuXHR9IGVsc2UgaWYgKGlzQ29uc3RhbnQocmVzb2x2ZWRCaW5kaW5nKSAmJiB0eXBlb2YgcmVzb2x2ZWRCaW5kaW5nLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0Ly8gVGhlbiBpdCdzIGEgbW9kdWxlLW1ldGhvZCByZWZlcmVuY2UgXCJzYXAueHh4Lnl5eS5kb1NvbWV0aGluZ1wiXG5cdFx0Y29uc3QgbWV0aG9kUGF0aCA9IHJlc29sdmVkQmluZGluZy52YWx1ZTtcblx0XHQvLyBGSVhNRTogVGhlIGN1c3RvbSBcImlzRW5hYmxlZFwiIGNoZWNrIGRvZXMgbm90IHRyaWdnZXIgKGJlY2F1c2Ugbm9uZSBvZiB0aGUgYm91bmQgdmFsdWVzIGNoYW5nZXMpXG5cdFx0cmVzdWx0ID0gZm9ybWF0UmVzdWx0KFxuXHRcdFx0W3BhdGhJbk1vZGVsPFZpZXc+KFwiL1wiLCBcIiR2aWV3XCIpLCBtZXRob2RQYXRoLCBwYXRoSW5Nb2RlbDxDb250ZXh0W10+KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpXSxcblx0XHRcdGZwbUZvcm1hdHRlci5jdXN0b21Cb29sZWFuUHJvcGVydHlDaGVjayxcblx0XHRcdCFmb3JDb250ZXh0TWVudVxuXHRcdFx0XHQ/IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLmNvbnRleHRMb2NhdGlvbj8udGFyZ2V0RW50aXR5VHlwZSB8fCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gdGhlbiBpdCdzIGEgYmluZGluZ1xuXHRcdHJlc3VsdCA9IHJlc29sdmVkQmluZGluZyBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyA9IChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IEN1c3RvbUFjdGlvbltdID0+IHtcblx0bGV0IG9NZW51SXRlbUtleXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiB7XG5cdFx0aWYgKGFjdGlvbj8ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhY3Rpb25NZW51ID0gYWN0aW9uLm1lbnU7XG5cdFx0XHRvTWVudUl0ZW1LZXlzID0gYWN0aW9uTWVudS5yZWR1Y2UoKGl0ZW06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCB7IGtleSB9KSA9PiB7XG5cdFx0XHRcdGlmIChrZXkgJiYgIWl0ZW1ba2V5XSkge1xuXHRcdFx0XHRcdGl0ZW1ba2V5XSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGl0ZW07XG5cdFx0XHR9LCBvTWVudUl0ZW1LZXlzKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gIW9NZW51SXRlbUtleXNbYWN0aW9uLmtleV0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uRXhwcmVzc2lvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRhY3Rpb25UYXJnZXQ6IEFjdGlvbiB8IHVuZGVmaW5lZCxcblx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24gPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnMuQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlKSB7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdGxldCBpc0VuYWJsZWRFeHAgPSBnZXRBY3Rpb25FbmFibGVkRXhwcmVzc2lvbihcblx0XHRcdGFjdGlvblRhcmdldCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKSxcblx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvblxuXHRcdCk7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvbk9uUm9vdCA9XG5cdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZEZyb21Db252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlckNvbnRleHQpICYmXG5cdFx0XHRNb2RlbEhlbHBlci5nZXREcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSk7XG5cdFx0aWYgKGNvbGxhYm9yYXRpb25PblJvb3QpIHtcblx0XHRcdGlzRW5hYmxlZEV4cCA9IGFuZChpc0VuYWJsZWRFeHAsIG5vdChlcXVhbChVSS5oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiwgZmFsc2UpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0VuYWJsZWRFeHA7XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgYW4gYW5ub3RhdGlvbi1iYXNlZCBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gYWN0aW9uVGFyZ2V0IFRoZSBpbnN0YW5jZSBvZiB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gcGF0aEZyb21Db250ZXh0TG9jYXRpb24gSXMgdGhlIGJpbmRpbmcgcGF0aCBjYWxjdWxhdGVkICBmcm9tIHRoZSBjb252ZXJ0ZXIgY29udGV4dCBsb2NhdGlvblxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiB0aGUgYWN0aW9uIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGFjdGlvblRhcmdldDogQWN0aW9uIHwgdW5kZWZpbmVkLFxuXHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbkV4cHJlc3Npb24oY29udmVydGVyQ29udGV4dCwgYWN0aW9uVGFyZ2V0LCBwYXRoRnJvbUNvbnRleHRMb2NhdGlvbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG1hcHBpbmdzPzogU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZVtdKTogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdIHtcblx0cmV0dXJuIG1hcHBpbmdzXG5cdFx0PyBtYXBwaW5ncy5tYXAoKG1hcHBpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBtYXBwaW5nLkxvY2FsUHJvcGVydHkudmFsdWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IG1hcHBpbmcuU2VtYW50aWNPYmplY3RQcm9wZXJ0eS50b1N0cmluZygpXG5cdFx0XHRcdH07XG5cdFx0ICB9KVxuXHRcdDogW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbk5hdmlnYWJsZShcblx0YWN0aW9uOiBNYW5pZmVzdEFjdGlvbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlIHwgdW5kZWZpbmVkLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncz86IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRsZXQgYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWQgPSB0cnVlO1xuXHRpZiAoY29uc2lkZXJOYXZpZ2F0aW9uU2V0dGluZ3MpIHtcblx0XHRjb25zdCBkZXRhaWxPckRpc3BsYXkgPSBuYXZpZ2F0aW9uU2V0dGluZ3MgJiYgKG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWwgfHwgbmF2aWdhdGlvblNldHRpbmdzLmRpc3BsYXkpO1xuXHRcdGJJc05hdmlnYXRpb25Db25maWd1cmVkID0gZGV0YWlsT3JEaXNwbGF5Py5yb3V0ZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXHQvLyB3aGVuIGVuYWJsZUF1dG9TY3JvbGwgaXMgdHJ1ZSB0aGUgbmF2aWdhdGVUb0luc3RhbmNlIGZlYXR1cmUgaXMgZGlzYWJsZWRcblx0aWYgKFxuXHRcdChhY3Rpb24gJiZcblx0XHRcdGFjdGlvbi5hZnRlckV4ZWN1dGlvbiAmJlxuXHRcdFx0KGFjdGlvbi5hZnRlckV4ZWN1dGlvbj8ubmF2aWdhdGVUb0luc3RhbmNlID09PSBmYWxzZSB8fCBhY3Rpb24uYWZ0ZXJFeGVjdXRpb24/LmVuYWJsZUF1dG9TY3JvbGwgPT09IHRydWUpKSB8fFxuXHRcdCFiSXNOYXZpZ2F0aW9uQ29uZmlndXJlZFxuXHQpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVBdXRvU2Nyb2xsKGFjdGlvbjogTWFuaWZlc3RBY3Rpb24pOiBib29sZWFuIHtcblx0cmV0dXJuIGFjdGlvbj8uYWZ0ZXJFeGVjdXRpb24/LmVuYWJsZUF1dG9TY3JvbGwgPT09IHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhRmllbGRJc0NvcHlBY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRGb3JBY3Rpb25UeXBlcyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSXNDb3B5QWN0aW9uPy52YWx1ZU9mKCkgPT09IHRydWUgJiYgZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb3B5QWN0aW9uKGNvcHlEYXRhRmllbGRzOiBEYXRhRmllbGRGb3JBY3Rpb25UeXBlc1tdKTogRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMgfCB1bmRlZmluZWQge1xuXHRpZiAoY29weURhdGFGaWVsZHMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGNvcHlEYXRhRmllbGRzWzBdO1xuXHR9XG5cdGlmIChjb3B5RGF0YUZpZWxkcy5sZW5ndGggPiAxKSB7XG5cdFx0TG9nLmVycm9yKFwiTXVsdGlwbGUgYWN0aW9ucyBhcmUgYW5ub3RhdGVkIHdpdGggaXNDb3B5QWN0aW9uLiBUaGVyZSBjYW4gYmUgb25seSBvbmUgc3RhbmRhcmQgY29weSBhY3Rpb24uXCIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGV4dHJhY3QgbWVudSBpdGVtcyBmcm9tIGFjdGlvbnMgb2YgdHlwZSBtZW51cy5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9ucyBDb2xsZWN0aW9uIG9mIGFubm90YXRpb24gYmFzZWQgYWN0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zIHdoaWNoIGFyZSBtZW51IGl0ZW1zIGluIG9uZSBvZiB0aGUgYW5ub3RhdGlvbiBiYXNlZCBtZW51c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyhhbm5vdGF0aW9uQWN0aW9uczogQmFzZUFjdGlvbltdKTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgbWVudUFjdGlvbkl0ZW1zOiBCYXNlQWN0aW9uW10gPSBbXTtcblxuXHRhbm5vdGF0aW9uQWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEJhc2VBY3Rpb24pID0+IHtcblx0XHRpZiAoYWN0aW9uLnR5cGUgPT09IFwiTWVudVwiICYmICFhY3Rpb24uaWQ/LnN0YXJ0c1dpdGgoXCJDdXN0b21BY3Rpb246OlwiKSAmJiBhY3Rpb24ubWVudSkge1xuXHRcdFx0bWVudUFjdGlvbkl0ZW1zLnB1c2goLi4uYWN0aW9uLm1lbnUpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG1lbnVBY3Rpb25JdGVtcztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZmluZCB0aGUgbWF0Y2hpbmcgbWFuaWZlc3QgYWN0aW9ucyB3aGljaCBvdmVycmlkZSB0aGUgYW5ub3RhdGlvbiBtZW51IGl0ZW1zLlxuICogQHBhcmFtIGFubm90YXRpb25NZW51SXRlbXMgQ29sbGVjdGlvbiBvZiBhbm5vdGF0aW9uIGJhc2VkIG1lbnUgaXRlbXNcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQ29sbGVjdGlvbiBvZiBtYW5pZmVzdCBiYXNlZCBhY3Rpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnMgd2hpY2ggYXJlIG1lbnUgaXRlbXMgaW4gb25lIG9mIHRoZSBhbm5vdGF0aW9uIGJhc2VkIG1lbnVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXRjaGluZ01hbmlmZXN0QWN0aW9uKFxuXHRhbm5vdGF0aW9uTWVudUl0ZW1zOiBCYXNlQWN0aW9uW10sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPlxuKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPiB7XG5cdGNvbnN0IG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+ID0ge307XG5cblx0Zm9yIChjb25zdCBtYW5pZmVzdEFjdGlvbiBpbiBtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRpZiAoXG5cdFx0XHRtYW5pZmVzdEFjdGlvbi5zdGFydHNXaXRoKFwiRGF0YUZpZWxkRm9yQWN0aW9uOjpcIikgJiZcblx0XHRcdGFubm90YXRpb25NZW51SXRlbXMuZmluZCgobWVudUFjdGlvbkl0ZW1zKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZW51QWN0aW9uSXRlbXMua2V5ID09PSBtYW5pZmVzdEFjdGlvbjtcblx0XHRcdH0pXG5cdFx0KSB7XG5cdFx0XHRtYXRjaGluZ01hbmlmZXN0QWN0aW9uc1ttYW5pZmVzdEFjdGlvbl0gPSBtYW5pZmVzdEFjdGlvbnNbbWFuaWZlc3RBY3Rpb25dO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGluZ01hbmlmZXN0QWN0aW9ucztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBtZW51cyBieSByZXBsYWNpbmcgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBvdmVycmlkaW5nIGFjdGlvbnMuXG4gKiBAcGFyYW0gdW5wcmVwYXJlZEFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhbGwgYWN0aW9ucyBhZnRlciBtZXJnaW5nIG1hbmlmZXN0IGFuZCBhbm5vdGF0aW9uIGFjdGlvbnNcbiAqIEBwYXJhbSBvdmVycmlkZU1lbnVBY3Rpb25zIENvbGxlY3Rpb24gb2YgYWxsIG92ZXJyaWRlbiBtZW51IGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTWVudUFjdGlvbnModW5wcmVwYXJlZEFjdGlvbnM6IEN1c3RvbUFjdGlvbltdLCBvdmVycmlkZU1lbnVBY3Rpb25zOiBCYXNlQWN0aW9uW10pOiB2b2lkIHtcblx0bGV0IGZvdW5kQWN0aW9uO1xuXG5cdHVucHJlcGFyZWRBY3Rpb25zLmZvckVhY2goKGFjdGlvbjogQ3VzdG9tQWN0aW9uKSA9PiB7XG5cdFx0aWYgKGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLk1lbnUpIHtcblx0XHRcdGFjdGlvbi5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbiwgbWVudUl0ZW1JbmRleDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGZvdW5kQWN0aW9uID0gb3ZlcnJpZGVNZW51QWN0aW9ucy5maW5kKChvdmVycmlkZU1lbnVBY3Rpb246IEJhc2VBY3Rpb24pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb3ZlcnJpZGVNZW51QWN0aW9uLmtleSA9PT0gbWVudUl0ZW0ua2V5O1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoZm91bmRBY3Rpb24pIHtcblx0XHRcdFx0XHRhY3Rpb24ubWVudT8uc3BsaWNlKG1lbnVJdGVtSW5kZXgsIDEsIGZvdW5kQWN0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIE1lbnUgaGFzIGlzQUlPcGVyYXRpb24gc2V0IHRvIHRydWUgb24gZWFjaCBtZW51IGl0ZW0gaGFzIGlzQUlPcGVyYXRpb24gc2V0IHRvIHRydWVcblx0XHRcdGNvbnN0IGlzQUlPcGVyYXRpb24gPSBpc01lbnVBSU9wZXJhdGlvbihhY3Rpb24ubWVudSBhcyB1bmtub3duIGFzIEN1c3RvbUFjdGlvbltdKTtcblx0XHRcdGlmIChpc0FJT3BlcmF0aW9uKSB7XG5cdFx0XHRcdGFjdGlvbi5pc0FJT3BlcmF0aW9uID0gaXNBSU9wZXJhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1lbnUgY29uc2lzdHMgb2YgYWxsIEFJIG9wZXJhdGlvbiBhY3Rpb25zLlxuICogQHBhcmFtIGFjdGlvbnMgQ29sbGVjdGlvbiBvZiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzIG9yIEN1c3RvbUFjdGlvbiBpbiB0aGUgbWVudVxuICogQHJldHVybnMgQSBib29sZWFuIHRydWUgaWYgYWxsIHJlY29yZHMgaW4gdGhlIG1lbnUgYXJlIEFJIG9wZXJhdGlvbnMsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZW51QUlPcGVyYXRpb24oYWN0aW9uczogRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlc1tdIHwgQ3VzdG9tQWN0aW9uW10pOiBib29sZWFuIHtcblx0bGV0IGlzQUlPcGVyYXRpb25PY2N1cnJlbmNlcyA9IDA7XG5cdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiB7XG5cdFx0aWYgKChhY3Rpb24gYXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcykuJFR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGlzQWN0aW9uQUlPcGVyYXRpb24oYWN0aW9uIGFzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMpKSB7XG5cdFx0XHRcdGlzQUlPcGVyYXRpb25PY2N1cnJlbmNlcysrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoKGFjdGlvbiBhcyBDdXN0b21BY3Rpb24pLnR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGlzQ3VzdG9tQWN0aW9uQUlPcGVyYXRpb24oYWN0aW9uIGFzIEN1c3RvbUFjdGlvbikpIHtcblx0XHRcdFx0aXNBSU9wZXJhdGlvbk9jY3VycmVuY2VzKys7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0aWYgKGlzQUlPcGVyYXRpb25PY2N1cnJlbmNlcyA9PT0gYWN0aW9ucz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIGFuIEFJIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIHJlY29yZCBvZiB0eXBlIERhdGFGaWVsZEZvckFjdGlvbiBvciBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiB0cnVlIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgYW4gQUkgb3BlcmF0aW9uLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uQUlPcGVyYXRpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdHJldHVybiBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucy5VST8uSXNBSU9wZXJhdGlvbj8udmFsdWVPZigpID09PSB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBjdXN0b20gYWN0aW9uIGlzIGFuIEFJIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBjdXN0b21BY3Rpb24gVGhlIHJlY29yZCBvZiB0eXBlIEN1c3RvbUFjdGlvblxuICogQHJldHVybnMgQSBib29sZWFuIHRydWUgaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBhbiBBSSBvcGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc0N1c3RvbUFjdGlvbkFJT3BlcmF0aW9uKGN1c3RvbUFjdGlvbjogQ3VzdG9tQWN0aW9uKTogYm9vbGVhbiB7XG5cdHJldHVybiBjdXN0b21BY3Rpb24/LmlzQUlPcGVyYXRpb24gPT09IHRydWU7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGFkZCB0b29sYmFyIHNlcGFyYXRvcnMgaWYgYWN0aW9ucyBhcmUgZ3JvdXBlZCBpbiBtb3JlIHRoYW4gb25lIGdyb3VwLlxuICogQHBhcmFtIGFjdGlvbnMgQ29sbGVjdGlvbiBvZiBtZXJnZWQgYWN0aW9ucyBmcm9tIGFubm90YXRpb25zIGFuZCBtYW5pZmVzdFxuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBtZXJnZWQgYWN0aW9ucyB3aXRoIHRvb2xiYXIgc2VwYXJhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkU2VwYXJhdG9ycyhhY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBCYXNlQWN0aW9uW10ge1xuXHRjb25zdCByZXN1bHQ6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRjb25zdCBncm91cHNVc2VkOiBudW1iZXJbXSA9IFtdO1xuXHRhY3Rpb25zLmZvckVhY2goKGFjdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdC8vIGlmIGEgbmV3IGdyb3VwIGlzIGZvdW5kXG5cdFx0aWYgKGFjdGlvbi5ncm91cCAhPT0gdW5kZWZpbmVkICYmICFncm91cHNVc2VkLmluY2x1ZGVzKGFjdGlvbi5ncm91cCkpIHtcblx0XHRcdGdyb3Vwc1VzZWQucHVzaChhY3Rpb24uZ3JvdXApO1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIGdyb3VwcywgYWRkIHNlcGFyYXRvclxuXHRcdFx0aWYgKGdyb3Vwc1VzZWQubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5TZXBhcmF0b3IsXG5cdFx0XHRcdFx0a2V5OiBcIlNlcGFyYXRvcjo6XCIgKyBhY3Rpb24uZ3JvdXAsXG5cdFx0XHRcdFx0Z3JvdXA6IGFjdGlvbi5ncm91cCxcblx0XHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdFx0YW5jaG9yOiBhY3Rpb24ua2V5LFxuXHRcdFx0XHRcdFx0cGxhY2VtZW50OiBQbGFjZW1lbnQuQmVmb3JlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzdWx0LnB1c2goYWN0aW9uKTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BNkNZQSxVQUFVLDBCQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFBLE9BQVZBLFVBQVU7RUFBQTtFQUFBQyxRQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtFQWlCZixNQUFNRSxNQUFNLEdBQUcsZUFBZTtFQUFDRCxRQUFBLENBQUFDLE1BQUEsR0FBQUEsTUFBQTtFQUMvQixNQUFNQyxVQUFVLEdBQUcsa0JBQWtCO0VBQUNGLFFBQUEsQ0FBQUUsVUFBQSxHQUFBQSxVQUFBO0VBQ3RDLE1BQU1DLDBCQUEwQixHQUFHLDZCQUE2QjtFQUFDSCxRQUFBLENBQUFHLDBCQUFBLEdBQUFBLDBCQUFBO0VBQ2pFLE1BQU1DLGtCQUFrQixHQUFHLHFCQUFxQjtFQUFDSixRQUFBLENBQUFJLGtCQUFBLEdBQUFBLGtCQUFBO0VBQ2pELE1BQU1DLGtCQUFrQixHQUFHLDJCQUEyQjtFQUFDTCxRQUFBLENBQUFLLGtCQUFBLEdBQUFBLGtCQUFBO0VBc0Y5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sTUFBTUMsa0NBQWtDLEdBQUlDLE9BQXVCLElBQXFCO0lBQzlGLElBQUlDLG9CQUFzQyxFQUN6Q0Msc0JBQWdDLEVBQ2hDQywwQkFBbUMsRUFDbkNDLHFCQUErQjtJQUNoQ0osT0FBTyxDQUFDSyxP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O0VBS08sU0FBU0UsbUJBQW1CQSxDQUFDckIsU0FBMEMsRUFBVztJQUN4RixJQUFJQSxTQUFTLENBQUNFLEtBQUssb0RBQXlDLEVBQUU7TUFDN0QsT0FBT0YsU0FBUyxDQUFDdUIsWUFBWSxFQUFFbEQsV0FBVyxDQUFDN0csRUFBRSxFQUFFZ0ssYUFBYSxFQUFFbkwsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJO0lBQ2pGO0lBQ0EsT0FBTyxLQUFLO0VBQ2I7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBZixRQUFBLENBQUErTCxtQkFBQSxHQUFBQSxtQkFBQTtFQUtBLFNBQVNDLHlCQUF5QkEsQ0FBQ0csWUFBMEIsRUFBVztJQUN2RSxPQUFPQSxZQUFZLEVBQUU3RSxhQUFhLEtBQUssSUFBSTtFQUM1Qzs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBUzhFLGFBQWFBLENBQUM3TCxPQUFxQixFQUFnQjtJQUNsRSxNQUFNb0UsTUFBb0IsR0FBRyxFQUFFO0lBQy9CLE1BQU0wSCxVQUFvQixHQUFHLEVBQUU7SUFDL0I5TCxPQUFPLENBQUNLLE9BQU8sQ0FBRWtCLE1BQWtCLElBQUs7TUFDdkM7TUFDQSxJQUFJQSxNQUFNLENBQUMwRixLQUFLLEtBQUtuRCxTQUFTLElBQUksQ0FBQ2dJLFVBQVUsQ0FBQ0MsUUFBUSxDQUFDeEssTUFBTSxDQUFDMEYsS0FBSyxDQUFDLEVBQUU7UUFDckU2RSxVQUFVLENBQUNyTCxJQUFJLENBQUNjLE1BQU0sQ0FBQzBGLEtBQUssQ0FBQztRQUM3QjtRQUNBLElBQUk2RSxVQUFVLENBQUNuTCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQzFCeUQsTUFBTSxDQUFDM0QsSUFBSSxDQUFDO1lBQ1hlLElBQUksRUFBRWtCLFVBQVUsQ0FBQ3NKLFNBQVM7WUFDMUI3SixHQUFHLEVBQUUsYUFBYSxHQUFHWixNQUFNLENBQUMwRixLQUFLO1lBQ2pDQSxLQUFLLEVBQUUxRixNQUFNLENBQUMwRixLQUFLO1lBQ25CWCxRQUFRLEVBQUU7Y0FDVEMsTUFBTSxFQUFFaEYsTUFBTSxDQUFDWSxHQUFHO2NBQ2xCcUUsU0FBUyxFQUFFQyxTQUFTLENBQUN3RjtZQUN0QjtVQUNELENBQUMsQ0FBQztRQUNIO01BQ0Q7TUFDQTdILE1BQU0sQ0FBQzNELElBQUksQ0FBQ2MsTUFBTSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUNGLE9BQU82QyxNQUFNO0VBQ2Q7RUFBQzNFLFFBQUEsQ0FBQW9NLGFBQUEsR0FBQUEsYUFBQTtFQUFBLE9BQUFwTSxRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
697
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwiX2V4cG9ydHMiLCJhaUljb24iLCJQUklOVF9JQ09OIiwiRVhQT1JUX1RPX1NQUkVBRFNIRUVUX0lDT04iLCJFWFBPUlRfVE9fQ1NWX0lDT04iLCJFWFBPUlRfVE9fUERGX0lDT04iLCJnZXRWaXNpYmlsaXR5RW5hYmxlbWVudE1lbnVBY3Rpb25zIiwiYWN0aW9ucyIsIm1lbnVBY3Rpb25Ob3RWaXNpYmxlIiwibWVudUFjdGlvblZpc2libGVQYXRocyIsImF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlIiwibWVudUl0ZW1zVmlzaWJsZVBhdGhzIiwiZm9yRWFjaCIsIm1lbnVBY3Rpb24iLCJ2aXNpYmxlIiwidmFsdWVPZiIsInB1c2giLCJtZW51IiwibGVuZ3RoIiwibWVudUl0ZW0iLCJtZW51SXRlbVZpc2libGUiLCJ0b1N0cmluZyIsImNvbXBpbGVFeHByZXNzaW9uIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJ2aXNpYmxlRXhwcmVzc2lvbnMiLCJtYXAiLCJtZW51SXRlbVZpc2libGVQYXRoIiwiYW5kIiwib3IiLCJhZGRDb2xsYWJvcmF0aW9uQ29uZGl0aW9uIiwiYWN0aW9uIiwidHlwZSIsIm5vdCIsImVxdWFsIiwiVUkiLCJoYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvbiIsIm1hcEFjdGlvbkJ5S2V5IiwibWFuaWZlc3RBY3Rpb25zIiwiYW5ub3RhdGlvbkFjdGlvbnMiLCJhY3Rpb25LZXkiLCJhbm5vdGF0aW9uQWN0aW9uIiwiZmluZCIsImtleSIsIm1hbmlmZXN0QWN0aW9uIiwicmVzdWx0QWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImFjdGlvbkFubm90YXRpb24iLCJBY3Rpb25UeXBlIiwiTWVudSIsImVuYWJsZWQiLCJwcm9wIiwicHJvcEtleSIsImNhbkJlTWVudUl0ZW0iLCJEYXRhRmllbGRGb3JBY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJtYXBNZW51RGVmYXVsdEFjdGlvbiIsImNvbW1hbmRBY3Rpb25zIiwiZGVmYXVsdEFjdGlvbiIsImNvbW1hbmQiLCJtYXBNZW51SXRlbXMiLCJtYXBwZWRNZW51SXRlbXMiLCJtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24iLCJtZW51SXRlbUtleSIsIm1hcHBlZE1lbnVBY3Rpb24iLCJ0cmFuc2Zvcm1NZW51QWN0aW9uc0FuZElkZW50aWZ5Q29tbWFuZHMiLCJhbGxBY3Rpb25zIiwiYWN0aW9uS2V5c1RvRGVsZXRlIiwidW5kZWZpbmVkIiwiX2dldE1hbmlmZXN0RW5hYmxlZCIsImlzQW5ub3RhdGlvbkFjdGlvbiIsImNvbnZlcnRlckNvbnRleHQiLCJmb3JDb250ZXh0TWVudSIsImFyZ3VtZW50cyIsInJlc3VsdCIsImdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlciIsImludGVybmFsTW9kZWxQcm9wZXJ0eSIsImlmRWxzZSIsInJlcXVpcmVzU2VsZWN0aW9uIiwiZW5hYmxlT25TZWxlY3QiLCJwYXRoSW5Nb2RlbCIsImdyZWF0ZXJPckVxdWFsIiwiX2dldE1hbmlmZXN0VmlzaWJsZSIsIm92ZXJyaWRlTWFuaWZlc3RDb25maWd1cmF0aW9uV2l0aEFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsInByZXNzIiwiZ2V0QWN0aW9uc0Zyb21NYW5pZmVzdCIsIm5hdmlnYXRpb25TZXR0aW5ncyIsImNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzIiwiaGlkZGVuQWN0aW9ucyIsImZhY2V0TmFtZSIsImxhc3REb3RJbmRleCIsImxhc3RJbmRleE9mIiwiaWQiLCJzdGFydHNXaXRoIiwiZ2V0Q3VzdG9tQWN0aW9uSUQiLCJEZWZhdWx0IiwiZW5hYmxlZEZvckNvbnRleHRNZW51IiwiaGFuZGxlck1vZHVsZSIsInN1YnN0cmluZyIsInJlcGxhY2UiLCJoYW5kbGVyTWV0aG9kIiwidGV4dCIsIm5vV3JhcCIsIl9fbm9XcmFwIiwicmVwbGFjZVNwZWNpYWxDaGFycyIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImRlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc05hdmlnYWJsZSIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZW5hYmxlQXV0b1Njcm9sbCIsImlubGluZSIsImlzQUlPcGVyYXRpb24iLCJwcmlvcml0eSIsImdyb3VwIiwib3ZlcmZsb3dHcm91cCIsImRpc2FibGVTdHJpY3RIYW5kbGluZyIsInByb3BlcnR5VmFsdWUiLCJyZXNvbHZlZEJpbmRpbmciLCJpc0NvbnN0YW50IiwidmFsdWUiLCJjb25zdGFudCIsIm1ldGhvZFBhdGgiLCJmb3JtYXRSZXN1bHQiLCJmcG1Gb3JtYXR0ZXIiLCJjdXN0b21Cb29sZWFuUHJvcGVydHlDaGVjayIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJjb250ZXh0TG9jYXRpb24iLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJvTWVudUl0ZW1LZXlzIiwiYWN0aW9uTWVudSIsInJlZHVjZSIsIml0ZW0iLCJfcmVmIiwiZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb25FeHByZXNzaW9uIiwiYWN0aW9uVGFyZ2V0IiwicGF0aEZyb21Db250ZXh0TG9jYXRpb24iLCJhbm5vdGF0aW9ucyIsIkNvcmUiLCJPcGVyYXRpb25BdmFpbGFibGUiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbmFibGVkRXhwIiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImNvbGxhYm9yYXRpb25PblJvb3QiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkRnJvbUNvbnZlcnRlckNvbnRleHQiLCJnZXREcmFmdFJvb3QiLCJnZXRFbnRpdHlTZXQiLCJnZXRFbmFibGVkRm9yQW5ub3RhdGlvbkFjdGlvbiIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm1hcHBpbmdzIiwibWFwcGluZyIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsImJJc05hdmlnYXRpb25Db25maWd1cmVkIiwiZGV0YWlsT3JEaXNwbGF5IiwiZGV0YWlsIiwiZGlzcGxheSIsInJvdXRlIiwiYWZ0ZXJFeGVjdXRpb24iLCJuYXZpZ2F0ZVRvSW5zdGFuY2UiLCJkYXRhRmllbGRJc0NvcHlBY3Rpb24iLCJkYXRhRmllbGQiLCJJc0NvcHlBY3Rpb24iLCIkVHlwZSIsImdldENvcHlBY3Rpb24iLCJjb3B5RGF0YUZpZWxkcyIsIkxvZyIsImVycm9yIiwiZ2V0QW5ub3RhdGlvbk1lbnVBY3Rpb25JdGVtcyIsIm1lbnVBY3Rpb25JdGVtcyIsImdldE1hdGNoaW5nTWFuaWZlc3RBY3Rpb24iLCJhbm5vdGF0aW9uTWVudUl0ZW1zIiwibWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnMiLCJwcmVwYXJlTWVudUFjdGlvbnMiLCJ1bnByZXBhcmVkQWN0aW9ucyIsIm92ZXJyaWRlTWVudUFjdGlvbnMiLCJmb3VuZEFjdGlvbiIsIm1lbnVJdGVtSW5kZXgiLCJvdmVycmlkZU1lbnVBY3Rpb24iLCJzcGxpY2UiLCJpc01lbnVBSU9wZXJhdGlvbiIsImlzQUlPcGVyYXRpb25PY2N1cnJlbmNlcyIsImlzQWN0aW9uQUlPcGVyYXRpb24iLCJpc0N1c3RvbUFjdGlvbkFJT3BlcmF0aW9uIiwiQWN0aW9uVGFyZ2V0IiwiSXNBSU9wZXJhdGlvbiIsImN1c3RvbUFjdGlvbiIsImFkZFNlcGFyYXRvcnMiLCJvdmVyZmxvd0dyb3Vwc0NvbmZpZyIsImdyb3Vwc1VzZWQiLCJncm91cFN0YXJ0UG9zaXRpb25zIiwiaW5kZXgiLCJlZmZlY3RpdmVHcm91cCIsImluY2x1ZGVzIiwiZ3JvdXBDb25maWciLCJpc0dyb3VwU3RhcnQiLCJzaG93U2VwYXJhdG9yIiwiU2VwYXJhdG9yIiwiZ2V0Q3JlYXRlTmV4dEJ1dHRvblZpc2liaWxpdHkiLCJoaWRkZW5EcmFmdEVuYWJsZWQiLCJmY2xFbmFibGVkIiwiRHJhZnQiLCJJc05ld09iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUge1xuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25Hcm91cFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25UeXBlc1xufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGZvcm1hdFJlc3VsdCxcblx0Z3JlYXRlck9yRXF1YWwsXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0TWFuaWZlc3RBY3Rpb24sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE92ZXJmbG93R3JvdXBzQ29uZmlndXJhdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQsIE92ZXJyaWRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgZ2V0Q3VzdG9tQWN0aW9uSUQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgZnBtRm9ybWF0dGVyIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL0ZQTUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgRHJhZnQsIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGdldEFjdGlvbkVuYWJsZWRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IE92ZXJmbG93VG9vbGJhclByaW9yaXR5IH0gZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgZW51bSBCdXR0b25UeXBlIHtcblx0QWNjZXB0ID0gXCJBY2NlcHRcIixcblx0QXR0ZW50aW9uID0gXCJBdHRlbnRpb25cIixcblx0QmFjayA9IFwiQmFja1wiLFxuXHRDcml0aWNhbCA9IFwiQ3JpdGljYWxcIixcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxuXHRFbXBoYXNpemVkID0gXCJFbXBoYXNpemVkXCIsXG5cdEdob3N0ID0gXCJHaG9zdFwiLFxuXHROZWdhdGl2ZSA9IFwiTmVnYXRpdmVcIixcblx0TmV1dHJhbCA9IFwiTmV1dHJhbFwiLFxuXHRSZWplY3QgPSBcIlJlamVjdFwiLFxuXHRTdWNjZXNzID0gXCJTdWNjZXNzXCIsXG5cdFRyYW5zcGFyZW50ID0gXCJUcmFuc3BhcmVudFwiLFxuXHRVbnN0eWxlZCA9IFwiVW5zdHlsZWRcIixcblx0VXAgPSBcIlVwXCJcbn1cblxuZXhwb3J0IGNvbnN0IGFpSWNvbiA9IFwic2FwLWljb246Ly9haVwiO1xuZXhwb3J0IGNvbnN0IFBSSU5UX0lDT04gPSBcInNhcC1pY29uOi8vcHJpbnRcIjtcbmV4cG9ydCBjb25zdCBFWFBPUlRfVE9fU1BSRUFEU0hFRVRfSUNPTiA9IFwic2FwLWljb246Ly9leGNlbC1hdHRhY2htZW50XCI7XG5leHBvcnQgY29uc3QgRVhQT1JUX1RPX0NTVl9JQ09OID0gXCJzYXAtaWNvbjovL2RvY3VtZW50XCI7XG5leHBvcnQgY29uc3QgRVhQT1JUX1RPX1BERl9JQ09OID0gXCJzYXAtaWNvbjovL3BkZi1hdHRhY2htZW50XCI7XG5cbmV4cG9ydCB0eXBlIEJhc2VBY3Rpb24gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkPzogc3RyaW5nO1xuXHR0ZXh0Pzogc3RyaW5nO1xuXHR0eXBlPzogQWN0aW9uVHlwZTtcblx0cHJlc3M/OiBzdHJpbmc7XG5cdGVuYWJsZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlZEZvckNvbnRleHRNZW51PzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdHZpc2libGU/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0ZW5hYmxlT25TZWxlY3Q/OiBzdHJpbmc7XG5cdGFubm90YXRpb25QYXRoPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdHBhcmVudEVudGl0eURlbGV0ZUVuYWJsZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0bWVudT86IEJhc2VBY3Rpb25bXTtcblx0ZmFjZXROYW1lPzogc3RyaW5nO1xuXHRjb21tYW5kPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpc0FJT3BlcmF0aW9uPzogYm9vbGVhbjtcblx0cHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0Z3JvdXA/OiBudW1iZXI7XG5cdG92ZXJmbG93R3JvdXA/OiBudW1iZXI7XG5cdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uID0gQmFzZUFjdGlvbiAmIHtcblx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckFjdGlvbiB8IEFjdGlvblR5cGUuTWVudSB8IEFjdGlvblR5cGUuQ29weTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0Y3VzdG9tRGF0YT86IHN0cmluZztcblx0cmVxdWlyZXNEaWFsb2c/OiBzdHJpbmc7XG5cdGJpbmRpbmc/OiBzdHJpbmc7XG5cdGJ1dHRvblR5cGU/OiBCdXR0b25UeXBlLkdob3N0IHwgQnV0dG9uVHlwZS5UcmFuc3BhcmVudCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25BY3Rpb25BY3Rpb25Hcm91cCA9IEJhc2VBY3Rpb24gJiB7XG5cdC8vIGltcGxlbWVudHMgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcblx0dHlwZTogQWN0aW9uVHlwZS5NZW51O1xuXHRtZW51OiBBbm5vdGF0aW9uQWN0aW9uW107XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21BY3Rpb24gPSBDdXN0b21FbGVtZW50PFxuXHRCYXNlQWN0aW9uICYge1xuXHRcdGhhbmRsZXJNZXRob2Q/OiBzdHJpbmc7XG5cdFx0aGFuZGxlck1vZHVsZT86IHN0cmluZztcblx0XHRub1dyYXA/OiBib29sZWFuOyAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGF2b2lkIHRoZSB3cmFwcGluZyBmcm9tIHRoZSBGUE1IZWxwZXJcblx0XHRyZXF1aXJlc1NlbGVjdGlvbj86IGJvb2xlYW47XG5cdFx0ZGVmYXVsdEFjdGlvbj86IHN0cmluZyB8IEJhc2VBY3Rpb24gfCBDdXN0b21BY3Rpb247IC8vIEluZGljYXRlcyB3aGV0aGVyIGEgZGVmYXVsdCBhY3Rpb24gZXhpc3RzIGluIHRoaXMgY29udGV4dFxuXHR9XG4+O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uQWN0aW9uR3JvdXAgPSBCYXNlQWN0aW9uICYge1xuXHQvLyBpbXBsZW1lbnRzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdHR5cGU6IEFjdGlvblR5cGUuTWVudTtcblx0bWVudTogQW5ub3RhdGlvbkFjdGlvbltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tYmluZWRBY3Rpb24gPSB7XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj47XG59O1xuXG5leHBvcnQgdHlwZSBPdmVycmlkZVR5cGVBY3Rpb24gPSB7XG5cdGVuYWJsZUF1dG9TY3JvbGw/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRpc05hdmlnYWJsZT86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cdGVuYWJsZU9uU2VsZWN0PzogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0bWVudT86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cblx0Ly8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSBhbGlnbmVkIGZvciBhbGwgYWN0aW9uc1xuXHRlbmFibGVkOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHR2aXNpYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRjb21tYW5kOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRwb3NpdGlvbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZTtcblx0cHJpb3JpdHk/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRncm91cD86IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGU7XG5cdG92ZXJmbG93R3JvdXA/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xuXHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBPdmVycmlkZVR5cGUub3ZlcndyaXRlO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YUZpZWxkRm9yQWN0aW9uT3JBY3Rpb25Hcm91cCA9IERhdGFGaWVsZEZvckFjdGlvblR5cGVzIHwgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBUeXBlcztcblxudHlwZSBNZW51QWN0aW9uID1cblx0fCBCYXNlQWN0aW9uXG5cdHwge1xuXHRcdFx0dmlzaWJsZT86IHN0cmluZ1tdO1xuXHRcdFx0ZW5hYmxlZD86IHN0cmluZ1tdO1xuXHRcdFx0bWVudT86IEJhc2VBY3Rpb25bXTtcblx0ICB9O1xuXG4vKipcbiAqIE1ldGhvZCBwcm92aWRlcyBhY3Rpb25zIGNvbGxlY3Rpb24gYWZ0ZXIgY2FsY3VsYXRpbmcgdGhlIHZpc2libGUgc2V0dGluZyBmb3IgYWxsIGFjdGlvbnMgb2YgdHlwZSBtZW51IGRlcGVuZGluZyBvbiBpdHMgdmlzaWJsZSBzZXR0aW5nIGFuZCBpdHMgbWVudSBpdGVtcyB2aXNpYmxlIHNldHRpbmdzLlxuICogQHBhcmFtIGFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhY3Rpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnMgd2l0aCB2aXNpYmxlIHNldHRpbmcgc2V0IGZvciBhY3Rpb25zIG9mIHR5cGUgbWVudVxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJpbGl0eUVuYWJsZW1lbnRNZW51QWN0aW9ucyA9IChhY3Rpb25zOiBDdXN0b21BY3Rpb25bXSk6IEN1c3RvbUFjdGlvbltdID0+IHtcblx0bGV0IG1lbnVBY3Rpb25Ob3RWaXNpYmxlOiBzdHJpbmcgfCBib29sZWFuLFxuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHM6IHN0cmluZ1tdLFxuXHRcdGF0bGVhc3RPbmVNZW51SXRlbXNWaXNpYmxlOiBib29sZWFuLFxuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRoczogc3RyaW5nW107XG5cdGFjdGlvbnMuZm9yRWFjaCgobWVudUFjdGlvbjogTWVudUFjdGlvbikgPT4ge1xuXHRcdG1lbnVBY3Rpb25Ob3RWaXNpYmxlID0gbWVudUFjdGlvbi52aXNpYmxlPy52YWx1ZU9mKCkgPT09IFwiZmFsc2VcIjtcblx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IGZhbHNlO1xuXHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocyA9IFtdO1xuXHRcdG1lbnVBY3Rpb25WaXNpYmxlUGF0aHMgPSBbXTtcblx0XHRpZiAobWVudUFjdGlvbi52aXNpYmxlICYmICEobWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJ0cnVlXCIgfHwgbWVudUFjdGlvbi52aXNpYmxlLnZhbHVlT2YoKSA9PT0gXCJmYWxzZVwiKSkge1xuXHRcdFx0bWVudUFjdGlvblZpc2libGVQYXRocy5wdXNoKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRpZiAobWVudUFjdGlvbj8ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRtZW51QWN0aW9uPy5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRjb25zdCBtZW51SXRlbVZpc2libGUgPSBtZW51SXRlbS52aXNpYmxlO1xuXHRcdFx0XHRpZiAobWVudUl0ZW1WaXNpYmxlICYmICh0eXBlb2YgbWVudUl0ZW1WaXNpYmxlID09PSBcImJvb2xlYW5cIiB8fCBtZW51SXRlbVZpc2libGUudmFsdWVPZigpID09PSBcInRydWVcIikpIHtcblx0XHRcdFx0XHRhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAobWVudUl0ZW1WaXNpYmxlICYmIG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkgIT09IFwiZmFsc2VcIikge1xuXHRcdFx0XHRcdG1lbnVJdGVtc1Zpc2libGVQYXRocy5wdXNoKG1lbnVJdGVtVmlzaWJsZS52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtZW51QWN0aW9uTm90VmlzaWJsZSkge1xuXHRcdFx0XHQvLyBpZiBtZW51IGlzIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmICghYXRsZWFzdE9uZU1lbnVJdGVtc1Zpc2libGUgJiYgIW1lbnVJdGVtc1Zpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYWxsIG1lbnUgaXRlbXMgYXJlIHN0YXRpY2FsbHkgdmlzaWJsZSBmYWxzZVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBmYWxzZS50b1N0cmluZygpO1xuXHRcdFx0fSBlbHNlIGlmIChhdGxlYXN0T25lTWVudUl0ZW1zVmlzaWJsZSAmJiAhbWVudUFjdGlvblZpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gaWYgYXQgbGVhc3Qgb25lIG1lbnUgaXRlbSBpcyBzdGF0aWNhbGx5IHZpc2libGUgdHJ1ZSBhbmQgbm8gdmlzaWJsZSBzZXR0aW5nIGZvciBtZW51XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9IHRydWUudG9TdHJpbmcoKTtcblx0XHRcdH0gZWxzZSBpZiAoYXRsZWFzdE9uZU1lbnVJdGVtc1Zpc2libGUpIHtcblx0XHRcdFx0Ly8gaWYgYXQgbGVhc3Qgb25lIG1lbnUgaXRlbSwgdGhlbiBqdXN0IGNvbnNpZGVyIHZpc2libGUgc2V0dGluZyBvZiB0aGUgbWVudVxuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBjb21waWxlRXhwcmVzc2lvbihyZXNvbHZlQmluZGluZ1N0cmluZyhtZW51QWN0aW9uLnZpc2libGUgYXMgc3RyaW5nKSk7XG5cdFx0XHR9IGVsc2UgaWYgKG1lbnVBY3Rpb25WaXNpYmxlUGF0aHMubGVuZ3RoIHx8IG1lbnVJdGVtc1Zpc2libGVQYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIG1lbnUgaXMgc2V0IHRvIGludmlzaWJsZSwgaXQgc2hvdWxkIGJlIGludmlzaWJsZSwgb3RoZXJ3aXNlIHRoZSB2aXNpYmlsaXR5IHNob3VsZCBiZSBjYWxjdWxhdGVkIGZyb20gdGhlIGl0ZW1zXG5cdFx0XHRcdGNvbnN0IHZpc2libGVFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBtZW51SXRlbXNWaXNpYmxlUGF0aHMubWFwKChtZW51SXRlbVZpc2libGVQYXRoKSA9PlxuXHRcdFx0XHRcdHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVJdGVtVmlzaWJsZVBhdGgsIFwiYm9vbGVhblwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRtZW51QWN0aW9uLnZpc2libGUgPSBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0XHRhbmQocmVzb2x2ZUJpbmRpbmdTdHJpbmcoKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcpIHx8IHRydWUsIFwiYm9vbGVhblwiKSwgb3IoLi4udmlzaWJsZUV4cHJlc3Npb25zKSlcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lbnVBY3Rpb24udmlzaWJsZSA9ICghbWVudUFjdGlvbk5vdFZpc2libGUpLnRvU3RyaW5nKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFjdGlvbnM7XG59O1xuXG4vKipcbiAqIEFkZHMgdGhlIGNvbGxhYm9yYXRpb24gY29uZGl0aW9uIHRvIGFsbCBhY3Rpb25zIHdpdGggdHlwZSBGb3JBY3Rpb24uXG4gKiBUaGlzIGRpc2FibGVzIHRoZSBhY3Rpb25zIGlmIHRoZSBjb2xsYWJvcmF0aW9uIGlzIGVuYWJsZWQsIGJ1dCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdGhlIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgYmFjayBlbmQuXG4gKiBAcGFyYW0gYWN0aW9ucyBUaGUgbGlzdCBvZiBkZWZpbml0aW9ucyBvZiB0aGUgdGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbGxhYm9yYXRpb25Db25kaXRpb24oYWN0aW9uczogQ3VzdG9tQWN0aW9uW10pOiB2b2lkIHtcblx0YWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcblx0XHRpZiAoYWN0aW9uLnZpc2libGU/LnZhbHVlT2YoKSA9PT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChhY3Rpb24udHlwZSA9PT0gXCJGb3JBY3Rpb25cIikge1xuXHRcdFx0YWN0aW9uLnZpc2libGUgPSBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0YW5kKHJlc29sdmVCaW5kaW5nU3RyaW5nKGFjdGlvbi52aXNpYmxlIGFzIHN0cmluZywgXCJib29sZWFuXCIpLCBub3QoZXF1YWwoVUkuaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb24sIGZhbHNlKSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogTWFwcyBhbiBhY3Rpb24gYnkgaXRzIGtleSwgYmFzZWQgb24gdGhlIGdpdmVuIGFubm90YXRpb24gYWN0aW9ucyBhbmQgbWFuaWZlc3QgY29uZmlndXJhdGlvbi4gVGhlIHJlc3VsdCBhbHJlYWR5IHJlcHJlc2VudHMgdGhlXG4gKiBtZXJnZWQgYWN0aW9uIGZyb20gYm90aCBjb25maWd1cmF0aW9uIHNvdXJjZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBhbHNvIHJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBhY3Rpb24gY2FuIGJlIGEgbWVudSBpdGVtLCBzYXlpbmcgd2hldGhlciBpdCBpcyB2aXNpYmxlIG9yIG9mIGEgc3BlY2lmaWMgdHlwZVxuICogdGhhdCBhbGxvd3MgdGhpcy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcGFyYW0gYWN0aW9uS2V5IEFjdGlvbiBLZXkgdG8gbG9vayB1cFxuICogQHJldHVybnMgTWVyZ2VkIGFjdGlvbiBhbmQgaW5kaWNhdG9yIHdoZXRoZXIgaXQgY2FuIGJlIGEgbWVudSBpdGVtXG4gKi9cbmZ1bmN0aW9uIG1hcEFjdGlvbkJ5S2V5KFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbj4sXG5cdGFubm90YXRpb25BY3Rpb25zOiBCYXNlQWN0aW9uW10sXG5cdGFjdGlvbktleTogc3RyaW5nXG4pOiB7IGFjdGlvbjogQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbjsgY2FuQmVNZW51SXRlbTogYm9vbGVhbiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0ge1xuXHRjb25zdCBhbm5vdGF0aW9uQWN0aW9uID0gYW5ub3RhdGlvbkFjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5ID09PSBhY3Rpb25LZXkpO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRsZXQgcmVzdWx0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uID0geyAuLi4oYW5ub3RhdGlvbkFjdGlvbiA/PyBtYW5pZmVzdEFjdGlvbikgfTtcblxuXHQvLyBhY3Rpb25zIGluc2lkZSBtZW51cyBjYW4ndCBiZSBmb3VuZCBvbiB0b3AgbGV2ZWwsIHNvIGFzc2lnbiBhY3Rpb25zIGZyb20gbWVudSB0byBpdFxuXHRpZiAoT2JqZWN0LmtleXMocmVzdWx0QWN0aW9uKS5sZW5ndGggPT09IDApIHtcblx0XHRhbm5vdGF0aW9uQWN0aW9uc1xuXHRcdFx0LmZpbHRlcigoYWN0aW9uQW5ub3RhdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWN0aW9uQW5ub3RhdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLk1lbnU7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goKG1lbnVBY3Rpb246IEJhc2VBY3Rpb24pID0+IHtcblx0XHRcdFx0bWVudUFjdGlvbi5tZW51Py5mb3JFYWNoKChtZW51SXRlbTogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRcdGlmIChtZW51SXRlbS5rZXkgPT09IGFjdGlvbktleSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0QWN0aW9uID0gbWVudUl0ZW07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Ly8gQW5ub3RhdGlvbiBhY3Rpb24gYW5kIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdG8gYmUgbWVyZ2VkIGhlcmUgYXMgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgb25seSBjb25zaWRlcnMgdG9wLWxldmVsIGFjdGlvbnNcblx0aWYgKGFubm90YXRpb25BY3Rpb24pIHtcblx0XHQvLyBJZiBlbmFibGVkIG9yIHZpc2libGUgaXMgbm90IHNldCBpbiB0aGUgbWFuaWZlc3QsIHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBhbmQgaGVuY2UgZG8gbm90IG92ZXJ3cml0ZVxuXHRcdHJlc3VsdEFjdGlvbi5lbmFibGVkID0gbWFuaWZlc3RBY3Rpb24/LmVuYWJsZWQgPz8gYW5ub3RhdGlvbkFjdGlvbi5lbmFibGVkO1xuXHRcdHJlc3VsdEFjdGlvbi52aXNpYmxlID0gbWFuaWZlc3RBY3Rpb24/LnZpc2libGUgPz8gYW5ub3RhdGlvbkFjdGlvbi52aXNpYmxlO1xuXG5cdFx0Zm9yIChjb25zdCBwcm9wIGluIG1hbmlmZXN0QWN0aW9uIHx8IHt9KSB7XG5cdFx0XHRjb25zdCBwcm9wS2V5ID0gcHJvcCBhcyBrZXlvZiBCYXNlQWN0aW9uO1xuXHRcdFx0aWYgKCFhbm5vdGF0aW9uQWN0aW9uW3Byb3BLZXldICYmIHByb3BLZXkgIT09IFwibWVudVwiKSB7XG5cdFx0XHRcdHJlc3VsdEFjdGlvbltwcm9wS2V5XSA9IG1hbmlmZXN0QWN0aW9uW3Byb3BLZXldIGFzIG5ldmVyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGNhbkJlTWVudUl0ZW0gPVxuXHRcdHJlc3VsdEFjdGlvbj8udmlzaWJsZSB8fFxuXHRcdHJlc3VsdEFjdGlvbj8udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRyZXN1bHRBY3Rpb24/LnR5cGUgPT09IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdHJldHVybiB7XG5cdFx0YWN0aW9uOiByZXN1bHRBY3Rpb24gYXMgQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbixcblx0XHRjYW5CZU1lbnVJdGVtXG5cdH07XG59XG5cbi8qKlxuICogTWFwIHRoZSBkZWZhdWx0IGFjdGlvbiBrZXkgb2YgYSBtZW51IHRvIGl0cyBhY3R1YWwgYWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGlkZW50aWZ5IHdoZXRoZXIgdGhpcyBkZWZhdWx0IGFjdGlvbiBpcyBhIGNvbW1hbmQuXG4gKiBAcGFyYW0gbWVudUFjdGlvbiBNZW51IGFjdGlvbiB0byBtYXAgdGhlIGRlZmF1bHQgYWN0aW9uIGZvclxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBBY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gYW5ub3RhdGlvbkFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIHRocm91Z2ggYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBjb21tYW5kQWN0aW9ucyBBcnJheSBvZiBjb21tYW5kIGFjdGlvbnMgdG8gcHVzaCB0aGUgZGVmYXVsdCBhY3Rpb24gdG8gaWYgYXBwbGljYWJsZVxuICovXG5mdW5jdGlvbiBtYXBNZW51RGVmYXVsdEFjdGlvbihcblx0bWVudUFjdGlvbjogUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uLFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxseUNvbnZlcnRlZEN1c3RvbUFjdGlvbj4sXG5cdGFubm90YXRpb25BY3Rpb25zOiBCYXNlQWN0aW9uW10sXG5cdGNvbW1hbmRBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24gfCBCYXNlQWN0aW9uPlxuKTogdm9pZCB7XG5cdGNvbnN0IHsgYWN0aW9uLCBjYW5CZU1lbnVJdGVtIH0gPSBtYXBBY3Rpb25CeUtleShtYW5pZmVzdEFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zLCBtZW51QWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgc3RyaW5nKTtcblxuXHRpZiAoY2FuQmVNZW51SXRlbSkge1xuXHRcdG1lbnVBY3Rpb24uZGVmYXVsdEFjdGlvbiA9IGFjdGlvbjtcblx0fVxuXG5cdGlmIChhY3Rpb24uY29tbWFuZCkge1xuXHRcdGNvbW1hbmRBY3Rpb25zW2FjdGlvbi5rZXldID0gYWN0aW9uO1xuXHR9XG59XG5cbi8qKlxuICogTWFwIHRoZSBtZW51IGl0ZW0ga2V5cyBvZiBhIG1lbnUgdG8gdGhlaXIgYWN0dWFsIGFjdGlvbiBjb25maWd1cmF0aW9ucyBhbmQgaWRlbnRpZnkgd2hldGhlciB0aGV5IGFyZSBjb21tYW5kcy5cbiAqIEBwYXJhbSBtZW51QWN0aW9uIE1lbnUgYWN0aW9uIHRvIG1hcCB0aGUgbWVudSBpdGVtcyBmb3JcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcGFyYW0gY29tbWFuZEFjdGlvbnMgQXJyYXkgb2YgY29tbWFuZCBhY3Rpb25zIHRvIHB1c2ggdGhlIG1lbnUgaXRlbSBhY3Rpb25zIHRvIGlmIGFwcGxpY2FibGVcbiAqL1xuZnVuY3Rpb24gbWFwTWVudUl0ZW1zKFxuXHRtZW51QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXSxcblx0Y29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJhc2VBY3Rpb24gfCBDdXN0b21BY3Rpb24+XG4pOiB2b2lkIHtcblx0Y29uc3QgbWFwcGVkTWVudUl0ZW1zOiAoQ3VzdG9tQWN0aW9uIHwgQmFzZUFjdGlvbilbXSA9IFtdO1xuXHRjb25zdCBtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24gPSBhbm5vdGF0aW9uQWN0aW9ucy5maW5kKChhbm5vdGF0aW9uQWN0aW9uKSA9PiBhbm5vdGF0aW9uQWN0aW9uLmtleSA9PT0gbWVudUFjdGlvbi5rZXkpO1xuXG5cdGlmIChtZW51QWN0aW9uLm1lbnU/Lmxlbmd0aCAhPT0gMCkge1xuXHRcdGZvciAoY29uc3QgbWVudUl0ZW1LZXkgb2YgbWVudUFjdGlvbi5tZW51ID8/IFtdKSB7XG5cdFx0XHRjb25zdCB7IGFjdGlvbiwgY2FuQmVNZW51SXRlbSB9ID0gbWFwQWN0aW9uQnlLZXkobWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgbWVudUl0ZW1LZXkpO1xuXG5cdFx0XHRpZiAoY2FuQmVNZW51SXRlbSkge1xuXHRcdFx0XHRtYXBwZWRNZW51SXRlbXMucHVzaChhY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdFx0Y29tbWFuZEFjdGlvbnNbbWVudUl0ZW1LZXldID0gYWN0aW9uO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIElmIG5vIG1lbnUgaXRlbXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBtYW5pZmVzdC1vdmVycmlkZS1tZW51LCBpdCBpbmhlcml0cyB0aGUgaXRlbXMgZnJvbSB0aGUgcHJldmlvdXMgbWVudVxuXHRlbHNlIGlmIChtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24pIHtcblx0XHRtYXRjaGluZ0Fubm90YXRpb25BY3Rpb24ubWVudT8uZm9yRWFjaCgobWVudUl0ZW0pID0+IG1hcHBlZE1lbnVJdGVtcy5wdXNoKG1lbnVJdGVtKSk7XG5cdH1cblxuXHRjb25zdCBtYXBwZWRNZW51QWN0aW9uID0gbWVudUFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdG1hcHBlZE1lbnVBY3Rpb24ubWVudSA9IG1hcHBlZE1lbnVJdGVtcztcblxuXHQvLyBJZiB0aGUgbWVudSBpcyBzZXQgdG8gaW52aXNpYmxlLCBpdCBzaG91bGQgYmUgaW52aXNpYmxlLCBvdGhlcndpc2UgdGhlIHZpc2liaWxpdHkgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaXRlbXNcblx0Y29uc3QgdmlzaWJsZUV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IG1hcHBlZE1lbnVJdGVtcy5tYXAoKG1lbnVJdGVtKSA9PlxuXHRcdHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVJdGVtLnZpc2libGUgYXMgc3RyaW5nLCBcImJvb2xlYW5cIilcblx0KTtcblx0bWFwcGVkTWVudUFjdGlvbi52aXNpYmxlID0gY29tcGlsZUV4cHJlc3Npb24oXG5cdFx0YW5kKHJlc29sdmVCaW5kaW5nU3RyaW5nKG1lbnVBY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcsIFwiYm9vbGVhblwiKSwgb3IoLi4udmlzaWJsZUV4cHJlc3Npb25zKSlcblx0KTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBmbGF0IGNvbGxlY3Rpb24gb2YgYWN0aW9ucyBpbnRvIGEgbmVzdGVkIHN0cnVjdHVyZXMgb2YgbWVudXMuIFRoZSByZXN1bHQgaXMgYSByZWNvcmQgb2YgYWN0aW9ucyB0aGF0IGFyZSBlaXRoZXIgbWVudXMgb3JcbiAqIG9uZXMgdGhhdCBkbyBub3QgYXBwZWFyIGluIG1lbnVzIGFzIG1lbnUgaXRlbXMuIEl0IGFsc28gcmV0dXJucyBhIGxpc3Qgb2YgYWN0aW9ucyB0aGF0IGhhdmUgYW4gYXNzaWduZWQgY29tbWFuZC5cbiAqXG4gKiBOb3RlIHRoYXQgbWVudSBpdGVtcyBhcmUgYWxyZWFkeSB0aGUgbWVyZ2VkIHJlc3VsdCBvZiBhbm5vdGF0aW9uIGFjdGlvbnMgYW5kIHRoZWlyIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24sIGFzIHtAbGluayBpbnNlcnRDdXN0b21FbGVtZW50c31cbiAqIG9ubHkgY29uc2lkZXJzIHJvb3QtbGV2ZWwgYWN0aW9ucy5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgQWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIEFjdGlvbnMgZGVmaW5lZCB0aHJvdWdoIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgYWN0aW9ucyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgYSBsaXN0IG9mIGNvbW1hbmQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1NZW51QWN0aW9uc0FuZElkZW50aWZ5Q29tbWFuZHMoXG5cdG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPixcblx0YW5ub3RhdGlvbkFjdGlvbnM6IEJhc2VBY3Rpb25bXVxuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPj4ge1xuXHRjb25zdCBhbGxBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+ID0ge307XG5cdGNvbnN0IGFjdGlvbktleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgY29tbWFuZEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IGFjdGlvbktleSBpbiBtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdEFjdGlvbjogUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uZGVmYXVsdEFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtYXBNZW51RGVmYXVsdEFjdGlvbihtYW5pZmVzdEFjdGlvbiwgbWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgY29tbWFuZEFjdGlvbnMpO1xuXHRcdH1cblxuXHRcdGlmIChtYW5pZmVzdEFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlLk1lbnUpIHtcblx0XHRcdG1hcE1lbnVJdGVtcyhtYW5pZmVzdEFjdGlvbiwgbWFuaWZlc3RBY3Rpb25zLCBhbm5vdGF0aW9uQWN0aW9ucywgY29tbWFuZEFjdGlvbnMpO1xuXG5cdFx0XHQvLyBNZW51IGhhcyBubyB2aXNpYmxlIGl0ZW1zLCBzbyByZW1vdmUgaXRcblx0XHRcdGlmICghbWFuaWZlc3RBY3Rpb24ubWVudT8ubGVuZ3RoKSB7XG5cdFx0XHRcdGFjdGlvbktleXNUb0RlbGV0ZS5wdXNoKG1hbmlmZXN0QWN0aW9uLmtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1hbmlmZXN0QWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdGNvbW1hbmRBY3Rpb25zW2FjdGlvbktleV0gPSBtYW5pZmVzdEFjdGlvbiBhcyBDdXN0b21BY3Rpb247XG5cdFx0fVxuXG5cdFx0YWxsQWN0aW9uc1thY3Rpb25LZXldID0gbWFuaWZlc3RBY3Rpb24gYXMgQ3VzdG9tQWN0aW9uO1xuXHR9XG5cblx0YWN0aW9uS2V5c1RvRGVsZXRlLmZvckVhY2goKGFjdGlvbktleTogc3RyaW5nKSA9PiBkZWxldGUgYWxsQWN0aW9uc1thY3Rpb25LZXldKTtcblxuXHRyZXR1cm4ge1xuXHRcdGFjdGlvbnM6IGFsbEFjdGlvbnMsXG5cdFx0Y29tbWFuZEFjdGlvbnM6IGNvbW1hbmRBY3Rpb25zXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgZW5hYmxlbWVudCBvZiBhIG1hbmlmZXN0IGFjdGlvbi5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbiBUaGUgYWN0aW9uIGNvbmZpZ3VyZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gaXNBbm5vdGF0aW9uQWN0aW9uIFdoZXRoZXIgdGhlIGFjdGlvbiwgZGVmaW5lZCBpbiBtYW5pZmVzdCwgY29ycmVzcG9uZHMgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGZvckNvbnRleHRNZW51XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZW5hYmxlbWVudFxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RFbmFibGVkID0gZnVuY3Rpb24gKFxuXHRtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24sXG5cdGlzQW5ub3RhdGlvbkFjdGlvbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc0Fubm90YXRpb25BY3Rpb24gJiYgbWFuaWZlc3RBY3Rpb24uZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBhY3Rpb24gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGFjdGlvbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihtYW5pZmVzdEFjdGlvbi5lbmFibGVkLCBjb252ZXJ0ZXJDb250ZXh0LCBmb3JDb250ZXh0TWVudSk7XG5cblx0Ly8gQ29uc2lkZXIgcmVxdWlyZXNTZWxlY3Rpb24gcHJvcGVydHkgdG8gaW5jbHVkZSBzZWxlY3RlZENvbnRleHRzIGluIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25cblx0Y29uc3QgaW50ZXJuYWxNb2RlbFByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiA6IFwiY29udGV4dG1lbnUvbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCI7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRpZkVsc2UoXG5cdFx0XHRtYW5pZmVzdEFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0bWFuaWZlc3RBY3Rpb24uZW5hYmxlT25TZWxlY3QgPT09IFwic2luZ2xlXCIsXG5cdFx0XHRcdGFuZChlcXVhbChwYXRoSW5Nb2RlbChpbnRlcm5hbE1vZGVsUHJvcGVydHksIFwiaW50ZXJuYWxcIiksIDEpLCByZXN1bHQpLFxuXHRcdFx0XHRhbmQoZ3JlYXRlck9yRXF1YWwocGF0aEluTW9kZWwoaW50ZXJuYWxNb2RlbFByb3BlcnR5LCBcImludGVybmFsXCIpLCAxKSwgcmVzdWx0KVxuXHRcdFx0KSxcblx0XHRcdHJlc3VsdFxuXHRcdClcblx0KTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdmlzaWJpbGl0eSBvZiBhIG1hbmlmZXN0IGFjdGlvbi5cbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbiBUaGUgYWN0aW9uIGNvbmZpZ3VyZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcGFyYW0gaXNBbm5vdGF0aW9uQWN0aW9uIFdoZXRoZXIgdGhlIGFjdGlvbiwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gYWN0aW9uLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBmb3JDb250ZXh0TWVudVxuICogQHJldHVybnMgRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHZpc2liaWxpdHlcbiAqL1xuY29uc3QgX2dldE1hbmlmZXN0VmlzaWJsZSA9IGZ1bmN0aW9uIChcblx0bWFuaWZlc3RBY3Rpb246IE1hbmlmZXN0QWN0aW9uLFxuXHRpc0Fubm90YXRpb25BY3Rpb246IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuXHRpZiAoaXNBbm5vdGF0aW9uQWN0aW9uICYmIG1hbmlmZXN0QWN0aW9uLnZpc2libGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIElmIGFubm90YXRpb24gYWN0aW9uIGhhcyBubyBwcm9wZXJ0eSBkZWZpbmVkIGluIG1hbmlmZXN0LFxuXHRcdC8vIGRvIG5vdCBvdmVyd3JpdGUgaXQgd2l0aCBtYW5pZmVzdCBhY3Rpb24ncyBkZWZhdWx0IHZhbHVlLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCByZXN1bHQgPSBnZXRNYW5pZmVzdEFjdGlvbkJvb2xlYW5Qcm9wZXJ0eVdpdGhGb3JtYXR0ZXIobWFuaWZlc3RBY3Rpb24udmlzaWJsZSwgY29udmVydGVyQ29udGV4dCk7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihyZXN1bHQpO1xufTtcblxudHlwZSBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24gPSBPbWl0PEN1c3RvbUFjdGlvbiwgXCJtZW51XCI+ICYge1xuXHRtZW51OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0cHJpb3JpdHk/OiBPdmVyZmxvd1Rvb2xiYXJQcmlvcml0eTtcblx0Z3JvdXA/OiBudW1iZXI7XG5cdG92ZXJmbG93R3JvdXA/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEFzIHNvbWUgcHJvcGVydGllcyBzaG91bGQgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSBtYW5pZmVzdCwgbWFrZSBzdXJlIHRoYXQgdGhlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZ2V0cyB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMgZm9yIHRoZXNlLlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9uIEFjdGlvbiBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb24gQWN0aW9uIGRlZmluZWQgdGhyb3VnaCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBvdmVycmlkZU1hbmlmZXN0Q29uZmlndXJhdGlvbldpdGhBbm5vdGF0aW9uKG1hbmlmZXN0QWN0aW9uOiBQYXJ0aWFsbHlDb252ZXJ0ZWRDdXN0b21BY3Rpb24sIGFubm90YXRpb25BY3Rpb24/OiBCYXNlQWN0aW9uKTogdm9pZCB7XG5cdGlmICghYW5ub3RhdGlvbkFjdGlvbikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIERvIG5vdCBvdmVycmlkZSB0aGUgJ3R5cGUnIGdpdmVuIGluIGFuIGFubm90YXRpb24gYWN0aW9uXG5cdG1hbmlmZXN0QWN0aW9uLnR5cGUgPSBhbm5vdGF0aW9uQWN0aW9uLnR5cGU7XG5cdG1hbmlmZXN0QWN0aW9uLmFubm90YXRpb25QYXRoID0gYW5ub3RhdGlvbkFjdGlvbi5hbm5vdGF0aW9uUGF0aDtcblx0bWFuaWZlc3RBY3Rpb24ucHJlc3MgPSBhbm5vdGF0aW9uQWN0aW9uLnByZXNzO1xuXG5cdC8vIE9ubHkgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlcyBmb3IgZW5hYmxlbWVudCBhbmQgdmlzaWJpbGl0eSBpZiBub3Qgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRtYW5pZmVzdEFjdGlvbi5lbmFibGVkID0gbWFuaWZlc3RBY3Rpb24uZW5hYmxlZCA/PyBhbm5vdGF0aW9uQWN0aW9uLmVuYWJsZWQ7XG5cdG1hbmlmZXN0QWN0aW9uLnZpc2libGUgPSBtYW5pZmVzdEFjdGlvbi52aXNpYmxlID8/IGFubm90YXRpb25BY3Rpb24udmlzaWJsZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBhY3Rpb24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBtYW5pZmVzdCBhY3Rpb25zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQWN0aW9ucyBUaGUgYW5ub3RhdGlvbiBhY3Rpb25zIGRlZmluaXRpb25cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3MgVGhlIG5hdmlnYXRpb24gc2V0dGluZ3NcbiAqIEBwYXJhbSBjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncyBUaGUgbmF2aWdhdGlvbiBzZXR0aW5ncyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcGFyYW0gaGlkZGVuQWN0aW9ucyBBY3Rpb25zIHRoYXQgYXJlIGNvbmZpZ3VyZWQgYXMgaGlkZGVuIChhZGRpdGlvbmFsIHRvIHRoZSB2aXNpYmxlIHByb3BlcnR5KVxuICogQHBhcmFtIGZhY2V0TmFtZSBUaGUgZmFjZXQgd2hlcmUgYW4gYWN0aW9uIGlzIGRpc3BsYXllZCBpZiBpdCBpcyBpbmxpbmVcbiAqIEByZXR1cm5zIFRoZSBhY3Rpb25zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0QWN0aW9uPiB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRhbm5vdGF0aW9uQWN0aW9ucz86IEJhc2VBY3Rpb25bXSxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29uc2lkZXJOYXZpZ2F0aW9uU2V0dGluZ3M/OiBib29sZWFuLFxuXHRoaWRkZW5BY3Rpb25zPzogQmFzZUFjdGlvbltdLFxuXHRmYWNldE5hbWU/OiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4+IHtcblx0Y29uc3QgYWN0aW9uczogUmVjb3JkPHN0cmluZywgUGFydGlhbGx5Q29udmVydGVkQ3VzdG9tQWN0aW9uPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGFjdGlvbktleSBpbiBtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdEFjdGlvbjogTWFuaWZlc3RBY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRjb25zdCBsYXN0RG90SW5kZXggPSBtYW5pZmVzdEFjdGlvbi5wcmVzcz8ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xO1xuXHRcdGxldCBhbm5vdGF0aW9uQWN0aW9uOiBCYXNlQWN0aW9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGFubm90YXRpb25BY3Rpb25zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhbm5vdGF0aW9uQWN0aW9ucykge1xuXHRcdFx0XHQvLyBTdWJTZWN0aW9uLnRzI2NyZWF0ZUZvcm1BY3Rpb25SZWR1Y2VyIHVzZXMgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgd2hpY2ggcmVzdWx0cyBpbiBhbm5vdGF0aW9uIGFjdGlvbnMgbWl4aW5nIHVwIHdpdGggbWFuaWZlc3QgYWN0aW9uXG5cdFx0XHRcdC8vIHRoaXMgaXMgd2h5IHdlIG1heSBmaW5kIGFuIGFjdGlvbiB0aGF0IGhhcyBhIEN1c3RvbUFjdGlvbiBwcmVmaXhcblx0XHRcdFx0aWYgKGFjdGlvbi5pZD8uc3RhcnRzV2l0aChcIkN1c3RvbUFjdGlvbjo6XCIpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFjdGlvbi5rZXkgPT09IGFjdGlvbktleSkge1xuXHRcdFx0XHRcdGFubm90YXRpb25BY3Rpb24gPSBhY3Rpb247XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IFwiTWVudVwiKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbm90IGZvdW5kLCBjaGVjayBpbnNpZGUgbWVudXNcblx0XHRcdFx0XHRhbm5vdGF0aW9uQWN0aW9uID0gYWN0aW9uLm1lbnU/LmZpbmQoKG1lbnVJdGVtOiBCYXNlQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVudUl0ZW0ua2V5ID09PSBhY3Rpb25LZXk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKGFubm90YXRpb25BY3Rpb24pIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGFjdGlvbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkFjdGlvbiA9ICEhYW5ub3RhdGlvbkFjdGlvbjtcblx0XHRpZiAobWFuaWZlc3RBY3Rpb24uZmFjZXROYW1lKSB7XG5cdFx0XHRmYWNldE5hbWUgPSBtYW5pZmVzdEFjdGlvbi5mYWNldE5hbWU7XG5cdFx0fVxuXG5cdFx0YWN0aW9uc1thY3Rpb25LZXldID0ge1xuXHRcdFx0aWQ6IGFubm90YXRpb25BY3Rpb24gPyBhY3Rpb25LZXkgOiBnZXRDdXN0b21BY3Rpb25JRChhY3Rpb25LZXkpLFxuXHRcdFx0dHlwZTogbWFuaWZlc3RBY3Rpb24ubWVudSA/IEFjdGlvblR5cGUuTWVudSA6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdHZpc2libGU6IF9nZXRNYW5pZmVzdFZpc2libGUobWFuaWZlc3RBY3Rpb24sIGlzQW5ub3RhdGlvbkFjdGlvbiwgY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRlbmFibGVkOiBfZ2V0TWFuaWZlc3RFbmFibGVkKG1hbmlmZXN0QWN0aW9uLCBpc0Fubm90YXRpb25BY3Rpb24sIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0ZW5hYmxlZEZvckNvbnRleHRNZW51OiBfZ2V0TWFuaWZlc3RFbmFibGVkKG1hbmlmZXN0QWN0aW9uLCBpc0Fubm90YXRpb25BY3Rpb24sIGNvbnZlcnRlckNvbnRleHQsIHRydWUpLFxuXHRcdFx0aGFuZGxlck1vZHVsZTogbWFuaWZlc3RBY3Rpb24ucHJlc3MgJiYgbWFuaWZlc3RBY3Rpb24ucHJlc3Muc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRoYW5kbGVyTWV0aG9kOiBtYW5pZmVzdEFjdGlvbi5wcmVzcyAmJiBtYW5pZmVzdEFjdGlvbi5wcmVzcy5zdWJzdHJpbmcobGFzdERvdEluZGV4ICsgMSksXG5cdFx0XHRwcmVzczogbWFuaWZlc3RBY3Rpb24ucHJlc3MsXG5cdFx0XHR0ZXh0OiBtYW5pZmVzdEFjdGlvbi50ZXh0LFxuXHRcdFx0bm9XcmFwOiBtYW5pZmVzdEFjdGlvbi5fX25vV3JhcCxcblx0XHRcdGtleTogcmVwbGFjZVNwZWNpYWxDaGFycyhhY3Rpb25LZXkpLFxuXHRcdFx0ZW5hYmxlT25TZWxlY3Q6IG1hbmlmZXN0QWN0aW9uLmVuYWJsZU9uU2VsZWN0LFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtYW5pZmVzdEFjdGlvbi5kZWZhdWx0VmFsdWVzRnVuY3Rpb24sXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RBY3Rpb24ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0QWN0aW9uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGlzTmF2aWdhYmxlOiBpc0FjdGlvbk5hdmlnYWJsZShtYW5pZmVzdEFjdGlvbiwgbmF2aWdhdGlvblNldHRpbmdzLCBjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0XHRjb21tYW5kOiBtYW5pZmVzdEFjdGlvbi5jb21tYW5kLFxuXHRcdFx0cmVxdWlyZXNTZWxlY3Rpb246IG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1hbmlmZXN0QWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogZW5hYmxlQXV0b1Njcm9sbChtYW5pZmVzdEFjdGlvbiksXG5cdFx0XHRtZW51OiBtYW5pZmVzdEFjdGlvbi5tZW51ID8/IChhbm5vdGF0aW9uQWN0aW9uPy50eXBlID09PSBBY3Rpb25UeXBlLk1lbnUgPyBbXSA6IHVuZGVmaW5lZCksXG5cdFx0XHRmYWNldE5hbWU6IG1hbmlmZXN0QWN0aW9uLmlubGluZSA/IGZhY2V0TmFtZSA6IHVuZGVmaW5lZCxcblx0XHRcdGRlZmF1bHRBY3Rpb246IG1hbmlmZXN0QWN0aW9uLmRlZmF1bHRBY3Rpb24sXG5cdFx0XHRpc0FJT3BlcmF0aW9uOiBtYW5pZmVzdEFjdGlvbj8uaXNBSU9wZXJhdGlvbiA/PyB1bmRlZmluZWQsXG5cdFx0XHRwcmlvcml0eTogbWFuaWZlc3RBY3Rpb24/LnByaW9yaXR5ID8/IHVuZGVmaW5lZCxcblx0XHRcdGdyb3VwOiBtYW5pZmVzdEFjdGlvbj8ub3ZlcmZsb3dHcm91cCA/PyBtYW5pZmVzdEFjdGlvbj8uZ3JvdXAgPz8gdW5kZWZpbmVkLFxuXHRcdFx0b3ZlcmZsb3dHcm91cDogbWFuaWZlc3RBY3Rpb24/Lm92ZXJmbG93R3JvdXAgPz8gdW5kZWZpbmVkLFxuXHRcdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nOiBtYW5pZmVzdEFjdGlvbj8uZGlzYWJsZVN0cmljdEhhbmRsaW5nID8/IHVuZGVmaW5lZFxuXHRcdH07XG5cblx0XHRvdmVycmlkZU1hbmlmZXN0Q29uZmlndXJhdGlvbldpdGhBbm5vdGF0aW9uKGFjdGlvbnNbYWN0aW9uS2V5XSwgYW5ub3RhdGlvbkFjdGlvbik7XG5cdH1cblxuXHRyZXR1cm4gdHJhbnNmb3JtTWVudUFjdGlvbnNBbmRJZGVudGlmeUNvbW1hbmRzKGFjdGlvbnMsIGFubm90YXRpb25BY3Rpb25zID8/IFtdKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIEJvb2xlYW4gbWFuaWZlc3QgcHJvcGVydHkgdGhhdCBjYW4gZWl0aGVyIGJlIHJlcHJlc2VudGVkIGJ5IGEgc3RhdGljIHZhbHVlLCBhIGJpbmRpbmcgc3RyaW5nLFxuICogb3IgYSBydW50aW1lIGZvcm1hdHRlciBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyZWQgcHJvcGVydHkgdmFsdWVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZm9yQ29udGV4dE1lbnUgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHJlcXVlc3RlZCBmb3IgYSBjb250ZXh0IG1lbnUgYWN0aW9uXG4gKiBAcmV0dXJucyBBIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0QWN0aW9uQm9vbGVhblByb3BlcnR5V2l0aEZvcm1hdHRlcihcblx0cHJvcGVydHlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmb3JDb250ZXh0TWVudSA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCByZXNvbHZlZEJpbmRpbmcgPSByZXNvbHZlQmluZGluZ1N0cmluZzxib29sZWFuIHwgc3RyaW5nPihwcm9wZXJ0eVZhbHVlIGFzIHN0cmluZywgXCJib29sZWFuXCIpO1xuXHRsZXQgcmVzdWx0OiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGlmIChpc0NvbnN0YW50KHJlc29sdmVkQmluZGluZykgJiYgcmVzb2x2ZWRCaW5kaW5nLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBObyBwcm9wZXJ0eSB2YWx1ZSBjb25maWd1cmVkIGluIG1hbmlmZXN0IGZvciB0aGUgY3VzdG9tIGFjdGlvbiAtLT4gZGVmYXVsdCB2YWx1ZSBpcyB0cnVlXG5cdFx0cmVzdWx0ID0gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChyZXNvbHZlZEJpbmRpbmcpICYmIHR5cGVvZiByZXNvbHZlZEJpbmRpbmcudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHQvLyBUaGVuIGl0J3MgYSBtb2R1bGUtbWV0aG9kIHJlZmVyZW5jZSBcInNhcC54eHgueXl5LmRvU29tZXRoaW5nXCJcblx0XHRjb25zdCBtZXRob2RQYXRoID0gcmVzb2x2ZWRCaW5kaW5nLnZhbHVlO1xuXHRcdC8vIEZJWE1FOiBUaGUgY3VzdG9tIFwiaXNFbmFibGVkXCIgY2hlY2sgZG9lcyBub3QgdHJpZ2dlciAoYmVjYXVzZSBub25lIG9mIHRoZSBib3VuZCB2YWx1ZXMgY2hhbmdlcylcblx0XHRyZXN1bHQgPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRbcGF0aEluTW9kZWw8Vmlldz4oXCIvXCIsIFwiJHZpZXdcIiksIG1ldGhvZFBhdGgsIHBhdGhJbk1vZGVsPENvbnRleHRbXT4oXCJzZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0ZnBtRm9ybWF0dGVyLmN1c3RvbUJvb2xlYW5Qcm9wZXJ0eUNoZWNrLFxuXHRcdFx0IWZvckNvbnRleHRNZW51XG5cdFx0XHRcdD8gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuY29udGV4dExvY2F0aW9uPy50YXJnZXRFbnRpdHlUeXBlIHx8IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHQvLyB0aGVuIGl0J3MgYSBiaW5kaW5nXG5cdFx0cmVzdWx0ID0gcmVzb2x2ZWRCaW5kaW5nIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVEdXBsaWNhdGVBY3Rpb25zID0gKGFjdGlvbnM6IEN1c3RvbUFjdGlvbltdKTogQ3VzdG9tQWN0aW9uW10gPT4ge1xuXHRsZXQgb01lbnVJdGVtS2V5czogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0YWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcblx0XHRpZiAoYWN0aW9uPy5tZW51Py5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFjdGlvbk1lbnUgPSBhY3Rpb24ubWVudTtcblx0XHRcdG9NZW51SXRlbUtleXMgPSBhY3Rpb25NZW51LnJlZHVjZSgoaXRlbTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIHsga2V5IH0pID0+IHtcblx0XHRcdFx0aWYgKGtleSAmJiAhaXRlbVtrZXldKSB7XG5cdFx0XHRcdFx0aXRlbVtrZXldID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH0sIG9NZW51SXRlbUtleXMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhb01lbnVJdGVtS2V5c1thY3Rpb24ua2V5XSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb25FeHByZXNzaW9uKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGFjdGlvblRhcmdldDogQWN0aW9uIHwgdW5kZWZpbmVkLFxuXHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoYWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUpIHtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0bGV0IGlzRW5hYmxlZEV4cCA9IGdldEFjdGlvbkVuYWJsZWRFeHByZXNzaW9uKFxuXHRcdFx0YWN0aW9uVGFyZ2V0LFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uXG5cdFx0KTtcblx0XHRjb25zdCBjb2xsYWJvcmF0aW9uT25Sb290ID1cblx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkRnJvbUNvbnZlcnRlckNvbnRleHQoY29udmVydGVyQ29udGV4dCkgJiZcblx0XHRcdE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKTtcblx0XHRpZiAoY29sbGFib3JhdGlvbk9uUm9vdCkge1xuXHRcdFx0aXNFbmFibGVkRXhwID0gYW5kKGlzRW5hYmxlZEV4cCwgbm90KGVxdWFsKFVJLmhhc0NvbGxhYm9yYXRpb25BdXRob3JpemF0aW9uLCBmYWxzZSkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzRW5hYmxlZEV4cDtcblx0fVxuXHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBhbiBhbm5vdGF0aW9uLWJhc2VkIGFjdGlvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBhY3Rpb25UYXJnZXQgVGhlIGluc3RhbmNlIG9mIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSBwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiBJcyB0aGUgYmluZGluZyBwYXRoIGNhbGN1bGF0ZWQgIGZyb20gdGhlIGNvbnZlcnRlciBjb250ZXh0IGxvY2F0aW9uXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5hYmxlZEZvckFubm90YXRpb25BY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0YWN0aW9uVGFyZ2V0OiBBY3Rpb24gfCB1bmRlZmluZWQsXG5cdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uID0gZmFsc2Vcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEVuYWJsZWRGb3JBbm5vdGF0aW9uQWN0aW9uRXhwcmVzc2lvbihjb252ZXJ0ZXJDb250ZXh0LCBhY3Rpb25UYXJnZXQsIHBhdGhGcm9tQ29udGV4dExvY2F0aW9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmcobWFwcGluZ3M/OiBTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlW10pOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W10ge1xuXHRyZXR1cm4gbWFwcGluZ3Ncblx0XHQ/IG1hcHBpbmdzLm1hcCgobWFwcGluZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IG1hcHBpbmcuTG9jYWxQcm9wZXJ0eS52YWx1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogbWFwcGluZy5TZW1hbnRpY09iamVjdFByb3BlcnR5LnRvU3RyaW5nKClcblx0XHRcdFx0fTtcblx0XHQgIH0pXG5cdFx0OiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uTmF2aWdhYmxlKFxuXHRhY3Rpb246IE1hbmlmZXN0QWN0aW9uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgfCB1bmRlZmluZWQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnNpZGVyTmF2aWdhdGlvblNldHRpbmdzPzogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdGxldCBiSXNOYXZpZ2F0aW9uQ29uZmlndXJlZCA9IHRydWU7XG5cdGlmIChjb25zaWRlck5hdmlnYXRpb25TZXR0aW5ncykge1xuXHRcdGNvbnN0IGRldGFpbE9yRGlzcGxheSA9IG5hdmlnYXRpb25TZXR0aW5ncyAmJiAobmF2aWdhdGlvblNldHRpbmdzLmRldGFpbCB8fCBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheSk7XG5cdFx0YklzTmF2aWdhdGlvbkNvbmZpZ3VyZWQgPSBkZXRhaWxPckRpc3BsYXk/LnJvdXRlID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cdC8vIHdoZW4gZW5hYmxlQXV0b1Njcm9sbCBpcyB0cnVlIHRoZSBuYXZpZ2F0ZVRvSW5zdGFuY2UgZmVhdHVyZSBpcyBkaXNhYmxlZFxuXHRpZiAoXG5cdFx0KGFjdGlvbiAmJlxuXHRcdFx0YWN0aW9uLmFmdGVyRXhlY3V0aW9uICYmXG5cdFx0XHQoYWN0aW9uLmFmdGVyRXhlY3V0aW9uPy5uYXZpZ2F0ZVRvSW5zdGFuY2UgPT09IGZhbHNlIHx8IGFjdGlvbi5hZnRlckV4ZWN1dGlvbj8uZW5hYmxlQXV0b1Njcm9sbCA9PT0gdHJ1ZSkpIHx8XG5cdFx0IWJJc05hdmlnYXRpb25Db25maWd1cmVkXG5cdCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUF1dG9TY3JvbGwoYWN0aW9uOiBNYW5pZmVzdEFjdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gYWN0aW9uPy5hZnRlckV4ZWN1dGlvbj8uZW5hYmxlQXV0b1Njcm9sbCA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFGaWVsZElzQ29weUFjdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzKTogYm9vbGVhbiB7XG5cdHJldHVybiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5Jc0NvcHlBY3Rpb24/LnZhbHVlT2YoKSA9PT0gdHJ1ZSAmJiBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvcHlBY3Rpb24oY29weURhdGFGaWVsZHM6IERhdGFGaWVsZEZvckFjdGlvblR5cGVzW10pOiBEYXRhRmllbGRGb3JBY3Rpb25UeXBlcyB8IHVuZGVmaW5lZCB7XG5cdGlmIChjb3B5RGF0YUZpZWxkcy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gY29weURhdGFGaWVsZHNbMF07XG5cdH1cblx0aWYgKGNvcHlEYXRhRmllbGRzLmxlbmd0aCA+IDEpIHtcblx0XHRMb2cuZXJyb3IoXCJNdWx0aXBsZSBhY3Rpb25zIGFyZSBhbm5vdGF0ZWQgd2l0aCBpc0NvcHlBY3Rpb24uIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzdGFuZGFyZCBjb3B5IGFjdGlvbi5cIik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZXh0cmFjdCBtZW51IGl0ZW1zIGZyb20gYWN0aW9ucyBvZiB0eXBlIG1lbnVzLlxuICogQHBhcmFtIGFubm90YXRpb25BY3Rpb25zIENvbGxlY3Rpb24gb2YgYW5ub3RhdGlvbiBiYXNlZCBhY3Rpb25zXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIGFjdGlvbnMgd2hpY2ggYXJlIG1lbnUgaXRlbXMgaW4gb25lIG9mIHRoZSBhbm5vdGF0aW9uIGJhc2VkIG1lbnVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbm5vdGF0aW9uTWVudUFjdGlvbkl0ZW1zKGFubm90YXRpb25BY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBCYXNlQWN0aW9uW10ge1xuXHRjb25zdCBtZW51QWN0aW9uSXRlbXM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXG5cdGFubm90YXRpb25BY3Rpb25zLmZvckVhY2goKGFjdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdGlmIChhY3Rpb24udHlwZSA9PT0gXCJNZW51XCIgJiYgIWFjdGlvbi5pZD8uc3RhcnRzV2l0aChcIkN1c3RvbUFjdGlvbjo6XCIpICYmIGFjdGlvbi5tZW51KSB7XG5cdFx0XHRtZW51QWN0aW9uSXRlbXMucHVzaCguLi5hY3Rpb24ubWVudSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gbWVudUFjdGlvbkl0ZW1zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBmaW5kIHRoZSBtYXRjaGluZyBtYW5pZmVzdCBhY3Rpb25zIHdoaWNoIG92ZXJyaWRlIHRoZSBhbm5vdGF0aW9uIG1lbnUgaXRlbXMuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbk1lbnVJdGVtcyBDb2xsZWN0aW9uIG9mIGFubm90YXRpb24gYmFzZWQgbWVudSBpdGVtc1xuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBDb2xsZWN0aW9uIG9mIG1hbmlmZXN0IGJhc2VkIGFjdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgYWN0aW9ucyB3aGljaCBhcmUgbWVudSBpdGVtcyBpbiBvbmUgb2YgdGhlIGFubm90YXRpb24gYmFzZWQgbWVudXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hdGNoaW5nTWFuaWZlc3RBY3Rpb24oXG5cdGFubm90YXRpb25NZW51SXRlbXM6IEJhc2VBY3Rpb25bXSxcblx0bWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+IHtcblx0Y29uc3QgbWF0Y2hpbmdNYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IG1hbmlmZXN0QWN0aW9uIGluIG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdGlmIChcblx0XHRcdG1hbmlmZXN0QWN0aW9uLnN0YXJ0c1dpdGgoXCJEYXRhRmllbGRGb3JBY3Rpb246OlwiKSAmJlxuXHRcdFx0YW5ub3RhdGlvbk1lbnVJdGVtcy5maW5kKChtZW51QWN0aW9uSXRlbXMpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lbnVBY3Rpb25JdGVtcy5rZXkgPT09IG1hbmlmZXN0QWN0aW9uO1xuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zW21hbmlmZXN0QWN0aW9uXSA9IG1hbmlmZXN0QWN0aW9uc1ttYW5pZmVzdEFjdGlvbl07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoaW5nTWFuaWZlc3RBY3Rpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIG1lbnVzIGJ5IHJlcGxhY2luZyB0aGUgbWVudSBpdGVtcyB3aXRoIHRoZWlyIG92ZXJyaWRpbmcgYWN0aW9ucy5cbiAqIEBwYXJhbSB1bnByZXBhcmVkQWN0aW9ucyBDb2xsZWN0aW9uIG9mIGFsbCBhY3Rpb25zIGFmdGVyIG1lcmdpbmcgbWFuaWZlc3QgYW5kIGFubm90YXRpb24gYWN0aW9uc1xuICogQHBhcmFtIG92ZXJyaWRlTWVudUFjdGlvbnMgQ29sbGVjdGlvbiBvZiBhbGwgb3ZlcnJpZGVuIG1lbnUgaXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVNZW51QWN0aW9ucyh1bnByZXBhcmVkQWN0aW9uczogQ3VzdG9tQWN0aW9uW10sIG92ZXJyaWRlTWVudUFjdGlvbnM6IEJhc2VBY3Rpb25bXSk6IHZvaWQge1xuXHRsZXQgZm91bmRBY3Rpb247XG5cblx0dW5wcmVwYXJlZEFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBDdXN0b21BY3Rpb24pID0+IHtcblx0XHRpZiAoYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuTWVudSkge1xuXHRcdFx0YWN0aW9uLm1lbnU/LmZvckVhY2goKG1lbnVJdGVtOiBCYXNlQWN0aW9uLCBtZW51SXRlbUluZGV4OiBudW1iZXIpID0+IHtcblx0XHRcdFx0Zm91bmRBY3Rpb24gPSBvdmVycmlkZU1lbnVBY3Rpb25zLmZpbmQoKG92ZXJyaWRlTWVudUFjdGlvbjogQmFzZUFjdGlvbikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBvdmVycmlkZU1lbnVBY3Rpb24ua2V5ID09PSBtZW51SXRlbS5rZXk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChmb3VuZEFjdGlvbikge1xuXHRcdFx0XHRcdGFjdGlvbi5tZW51Py5zcGxpY2UobWVudUl0ZW1JbmRleCwgMSwgZm91bmRBY3Rpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gTWVudSBoYXMgaXNBSU9wZXJhdGlvbiBzZXQgdG8gdHJ1ZSBvbiBlYWNoIG1lbnUgaXRlbSBoYXMgaXNBSU9wZXJhdGlvbiBzZXQgdG8gdHJ1ZVxuXHRcdFx0Y29uc3QgaXNBSU9wZXJhdGlvbiA9IGlzTWVudUFJT3BlcmF0aW9uKGFjdGlvbi5tZW51IGFzIHVua25vd24gYXMgQ3VzdG9tQWN0aW9uW10pO1xuXHRcdFx0aWYgKGlzQUlPcGVyYXRpb24pIHtcblx0XHRcdFx0YWN0aW9uLmlzQUlPcGVyYXRpb24gPSBpc0FJT3BlcmF0aW9uO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgbWVudSBjb25zaXN0cyBvZiBhbGwgQUkgb3BlcmF0aW9uIGFjdGlvbnMuXG4gKiBAcGFyYW0gYWN0aW9ucyBDb2xsZWN0aW9uIG9mIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMgb3IgQ3VzdG9tQWN0aW9uIGluIHRoZSBtZW51XG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcmVjb3JkcyBpbiB0aGUgbWVudSBhcmUgQUkgb3BlcmF0aW9ucywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lbnVBSU9wZXJhdGlvbihhY3Rpb25zOiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzW10gfCBDdXN0b21BY3Rpb25bXSk6IGJvb2xlYW4ge1xuXHRsZXQgaXNBSU9wZXJhdGlvbk9jY3VycmVuY2VzID0gMDtcblx0YWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcblx0XHRpZiAoKGFjdGlvbiBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS4kVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNBY3Rpb25BSU9wZXJhdGlvbihhY3Rpb24gYXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcykpIHtcblx0XHRcdFx0aXNBSU9wZXJhdGlvbk9jY3VycmVuY2VzKys7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgoYWN0aW9uIGFzIEN1c3RvbUFjdGlvbikudHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNDdXN0b21BY3Rpb25BSU9wZXJhdGlvbihhY3Rpb24gYXMgQ3VzdG9tQWN0aW9uKSkge1xuXHRcdFx0XHRpc0FJT3BlcmF0aW9uT2NjdXJyZW5jZXMrKztcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRpZiAoaXNBSU9wZXJhdGlvbk9jY3VycmVuY2VzID09PSBhY3Rpb25zPy5sZW5ndGgpIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgYW4gQUkgb3BlcmF0aW9uLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgcmVjb3JkIG9mIHR5cGUgRGF0YUZpZWxkRm9yQWN0aW9uIG9yIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuICogQHJldHVybnMgQSBib29sZWFuIHRydWUgaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBhbiBBSSBvcGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25BSU9wZXJhdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zLlVJPy5Jc0FJT3BlcmF0aW9uPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIGN1c3RvbSBhY3Rpb24gaXMgYW4gQUkgb3BlcmF0aW9uLlxuICogQHBhcmFtIGN1c3RvbUFjdGlvbiBUaGUgcmVjb3JkIG9mIHR5cGUgQ3VzdG9tQWN0aW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIGFuIEFJIG9wZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzQ3VzdG9tQWN0aW9uQUlPcGVyYXRpb24oY3VzdG9tQWN0aW9uOiBDdXN0b21BY3Rpb24pOiBib29sZWFuIHtcblx0cmV0dXJuIGN1c3RvbUFjdGlvbj8uaXNBSU9wZXJhdGlvbiA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYWRkIHRvb2xiYXIgc2VwYXJhdG9ycyBpZiBhY3Rpb25zIGFyZSBncm91cGVkIGluIG1vcmUgdGhhbiBvbmUgZ3JvdXAuXG4gKiBAcGFyYW0gYWN0aW9ucyBDb2xsZWN0aW9uIG9mIG1lcmdlZCBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMgYW5kIG1hbmlmZXN0IHNldHRpbmdzXG4gKiBAcGFyYW0gb3ZlcmZsb3dHcm91cHNDb25maWcgQ29uZmlndXJhdGlvbiBmb3Igb3ZlcmZsb3cgZ3JvdXAgc2VwYXJhdG9ycyBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKiBAcmV0dXJucyBDb2xsZWN0aW9uIG9mIG1lcmdlZCBhY3Rpb25zIHdpdGggdG9vbGJhciBzZXBhcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRTZXBhcmF0b3JzKGFjdGlvbnM6IEJhc2VBY3Rpb25bXSwgb3ZlcmZsb3dHcm91cHNDb25maWc/OiBPdmVyZmxvd0dyb3Vwc0NvbmZpZ3VyYXRpb24pOiBCYXNlQWN0aW9uW10ge1xuXHRpZiAoIW92ZXJmbG93R3JvdXBzQ29uZmlnKSB7XG5cdFx0cmV0dXJuIGFjdGlvbnM7XG5cdH1cblx0Y29uc3QgcmVzdWx0OiBCYXNlQWN0aW9uW10gPSBbXTtcblx0Y29uc3QgZ3JvdXBzVXNlZDogbnVtYmVyW10gPSBbXTtcblx0Y29uc3QgZ3JvdXBTdGFydFBvc2l0aW9uczogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xuXG5cdC8vIEZpcnN0IHBhc3M6IGlkZW50aWZ5IGdyb3VwcyBhbmQgdGhlaXIgcG9zaXRpb25zXG5cdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNlQWN0aW9uLCBpbmRleDogbnVtYmVyKSA9PiB7XG5cdFx0Ly8gVXNlIG92ZXJmbG93R3JvdXAgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGdyb3VwIGZvciBjb21wYXRpYmlsaXR5XG5cdFx0Y29uc3QgZWZmZWN0aXZlR3JvdXAgPSBhY3Rpb24ub3ZlcmZsb3dHcm91cCA/PyBhY3Rpb24uZ3JvdXA7XG5cdFx0aWYgKGVmZmVjdGl2ZUdyb3VwICE9PSB1bmRlZmluZWQgJiYgIWdyb3Vwc1VzZWQuaW5jbHVkZXMoZWZmZWN0aXZlR3JvdXApKSB7XG5cdFx0XHRncm91cHNVc2VkLnB1c2goZWZmZWN0aXZlR3JvdXApO1xuXHRcdFx0Z3JvdXBTdGFydFBvc2l0aW9uc1tlZmZlY3RpdmVHcm91cF0gPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFNlY29uZCBwYXNzOiBhZGQgYWN0aW9ucyBhbmQgc2VwYXJhdG9ycyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG5cdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNlQWN0aW9uLCBpbmRleDogbnVtYmVyKSA9PiB7XG5cdFx0Ly8gVXNlIG92ZXJmbG93R3JvdXAgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGdyb3VwIGZvciBjb21wYXRpYmlsaXR5XG5cdFx0Y29uc3QgZWZmZWN0aXZlR3JvdXAgPSBhY3Rpb24ub3ZlcmZsb3dHcm91cCA/PyBhY3Rpb24uZ3JvdXA7XG5cdFx0Y29uc3QgZ3JvdXBDb25maWcgPSBvdmVyZmxvd0dyb3Vwc0NvbmZpZz8uW2VmZmVjdGl2ZUdyb3VwPy50b1N0cmluZygpIHx8IFwiXCJdO1xuXHRcdGNvbnN0IGlzR3JvdXBTdGFydCA9IGVmZmVjdGl2ZUdyb3VwICE9PSB1bmRlZmluZWQgJiYgZ3JvdXBTdGFydFBvc2l0aW9uc1tlZmZlY3RpdmVHcm91cF0gPT09IGluZGV4O1xuXG5cdFx0Ly8gQWRkIHNlcGFyYXRvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGdyb3VwIGlmIGNvbmZpZ3VyZWRcblx0XHRpZiAoaXNHcm91cFN0YXJ0ICYmIGdyb3VwQ29uZmlnPy5zaG93U2VwYXJhdG9yICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBEb24ndCBhZGQgc2VwYXJhdG9yIGlmIGl0IHdvdWxkIGJlIHRoZSBmaXJzdCBpdGVtXG5cdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuU2VwYXJhdG9yLFxuXHRcdFx0XHRrZXk6IFwiU2VwYXJhdG9yOjpcIiArIGVmZmVjdGl2ZUdyb3VwLFxuXHRcdFx0XHRncm91cDogZWZmZWN0aXZlR3JvdXAsXG5cdFx0XHRcdG92ZXJmbG93R3JvdXA6IGVmZmVjdGl2ZUdyb3VwLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdHBsYWNlbWVudDogUGxhY2VtZW50LkFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgYWN0aW9uIGl0c2VsZlxuXHRcdHJlc3VsdC5wdXNoKGFjdGlvbik7XG5cdH0pO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgQ3JlYXRlTmV4dCBidXR0b24uXG4gKiBUaGlzIGZ1bmN0aW9uIGNlbnRyYWxpemVzIHRoZSB2aXNpYmlsaXR5IGxvZ2ljIHRvIGJlIHJldXNlZCBieSBib3RoIGdldEZvb3RlckRlZmF1bHRBY3Rpb25zXG4gKiBhbmQgRm9vdGVyQ29udGVudC50c3guXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnRFbmFibGVkIFdoZXRoZXIgaGlkZGVuIGRyYWZ0IG1vZGUgaXMgZW5hYmxlZFxuICogQHBhcmFtIGZjbEVuYWJsZWQgV2hldGhlciBGQ0wgKEZsZXhpYmxlIENvbHVtbiBMYXlvdXQpIGlzIGVuYWJsZWRcbiAqIEByZXR1cm5zIEEgY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgQ3JlYXRlTmV4dCBidXR0b24gdmlzaWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlTmV4dEJ1dHRvblZpc2liaWxpdHkoaGlkZGVuRHJhZnRFbmFibGVkOiBib29sZWFuLCBmY2xFbmFibGVkOiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGlmRWxzZShcblx0XHRoaWRkZW5EcmFmdEVuYWJsZWQgPT09IHRydWUsXG5cdFx0aWZFbHNlKFxuXHRcdFx0ZmNsRW5hYmxlZCA9PT0gdHJ1ZSxcblx0XHRcdGFuZChEcmFmdC5Jc05ld09iamVjdCwgZXF1YWwocGF0aEluTW9kZWwoXCIvc2hvd1NhdmVBbmRDYW5jZWxCdXR0b25cIiwgXCJmY2xoZWxwZXJcIiksIHRydWUpKSxcblx0XHRcdERyYWZ0LklzTmV3T2JqZWN0XG5cdFx0KSxcblx0XHREcmFmdC5Jc05ld09iamVjdFxuXHQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUE4Q1lBLFVBQVUsMEJBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQUEsT0FBVkEsVUFBVTtFQUFBO0VBQUFDLFFBQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0VBaUJmLE1BQU1FLE1BQU0sR0FBRyxlQUFlO0VBQUNELFFBQUEsQ0FBQUMsTUFBQSxHQUFBQSxNQUFBO0VBQy9CLE1BQU1DLFVBQVUsR0FBRyxrQkFBa0I7RUFBQ0YsUUFBQSxDQUFBRSxVQUFBLEdBQUFBLFVBQUE7RUFDdEMsTUFBTUMsMEJBQTBCLEdBQUcsNkJBQTZCO0VBQUNILFFBQUEsQ0FBQUcsMEJBQUEsR0FBQUEsMEJBQUE7RUFDakUsTUFBTUMsa0JBQWtCLEdBQUcscUJBQXFCO0VBQUNKLFFBQUEsQ0FBQUksa0JBQUEsR0FBQUEsa0JBQUE7RUFDakQsTUFBTUMsa0JBQWtCLEdBQUcsMkJBQTJCO0VBQUNMLFFBQUEsQ0FBQUssa0JBQUEsR0FBQUEsa0JBQUE7RUEwRjlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxNQUFNQyxrQ0FBa0MsR0FBSUMsT0FBdUIsSUFBcUI7SUFDOUYsSUFBSUMsb0JBQXNDLEVBQ3pDQyxzQkFBZ0MsRUFDaENDLDBCQUFtQyxFQUNuQ0MscUJBQStCO0lBQ2hDSixPQUFPLENBQUNLLE9BQU8sQ0FBRUMsVUFBc0IsSUFBSztNQUMzQ0wsb0JBQW9CLEdBQUdLLFVBQVUsQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLENBQUMsQ0FBQyxLQUFLLE9BQU87TUFDaEVMLDBCQUEwQixHQUFHLEtBQUs7TUFDbENDLHFCQUFxQixHQUFHLEVBQUU7TUFDMUJGLHNCQUFzQixHQUFHLEVBQUU7TUFDM0IsSUFBSUksVUFBVSxDQUFDQyxPQUFPLElBQUksRUFBRUQsVUFBVSxDQUFDQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxJQUFJRixVQUFVLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsRUFBRTtRQUNqSE4sc0JBQXNCLENBQUNPLElBQUksQ0FBQ0gsVUFBVSxDQUFDQyxPQUFpQixDQUFDO01BQzFEO01BQ0EsSUFBSUQsVUFBVSxFQUFFSSxJQUFJLEVBQUVDLE1BQU0sRUFBRTtRQUM3QkwsVUFBVSxFQUFFSSxJQUFJLEVBQUVMLE9BQU8sQ0FBRU8sUUFBb0IsSUFBVztVQUN6RCxNQUFNQyxlQUFlLEdBQUdELFFBQVEsQ0FBQ0wsT0FBTztVQUN4QyxJQUFJTSxlQUFlLEtBQUssT0FBT0EsZUFBZSxLQUFLLFNBQVMsSUFBSUEsZUFBZSxDQUFDTCxPQUFPLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxFQUFFO1lBQ3RHTCwwQkFBMEIsR0FBRyxJQUFJO1VBQ2xDLENBQUMsTUFBTSxJQUFJVSxlQUFlLElBQUlBLGVBQWUsQ0FBQ0wsT0FBTyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUU7WUFDcEVKLHFCQUFxQixDQUFDSyxJQUFJLENBQUNJLGVBQWUsQ0FBQ0wsT0FBTyxDQUFDLENBQUMsQ0FBQztVQUN0RDtRQUNELENBQUMsQ0FBQztRQUNGLElBQUlQLG9CQUFvQixFQUFFO1VBQ3pCO1VBQ0FLLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHLEtBQUssQ0FBQ08sUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxNQUFNLElBQUksQ0FBQ1gsMEJBQTBCLElBQUksQ0FBQ0MscUJBQXFCLENBQUNPLE1BQU0sRUFBRTtVQUN4RTtVQUNBTCxVQUFVLENBQUNDLE9BQU8sR0FBRyxLQUFLLENBQUNPLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsTUFBTSxJQUFJWCwwQkFBMEIsSUFBSSxDQUFDRCxzQkFBc0IsQ0FBQ1MsTUFBTSxFQUFFO1VBQ3hFO1VBQ0FMLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHLElBQUksQ0FBQ08sUUFBUSxDQUFDLENBQUM7UUFDckMsQ0FBQyxNQUFNLElBQUlYLDBCQUEwQixFQUFFO1VBQ3RDO1VBQ0FHLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHUSxpQkFBaUIsQ0FBQ0Msb0JBQW9CLENBQUNWLFVBQVUsQ0FBQ0MsT0FBaUIsQ0FBQyxDQUFDO1FBQzNGLENBQUMsTUFBTSxJQUFJTCxzQkFBc0IsQ0FBQ1MsTUFBTSxJQUFJUCxxQkFBcUIsQ0FBQ08sTUFBTSxFQUFFO1VBQ3pFO1VBQ0EsTUFBTU0sa0JBQXVELEdBQUdiLHFCQUFxQixDQUFDYyxHQUFHLENBQUVDLG1CQUFtQixJQUM3R0gsb0JBQW9CLENBQUNHLG1CQUFtQixFQUFFLFNBQVMsQ0FDcEQsQ0FBQztVQUNEYixVQUFVLENBQUNDLE9BQU8sR0FBR1EsaUJBQWlCLENBQ3JDSyxHQUFHLENBQUNKLG9CQUFvQixDQUFFVixVQUFVLENBQUNDLE9BQU8sSUFBZSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUVjLEVBQUUsQ0FBQyxHQUFHSixrQkFBa0IsQ0FBQyxDQUN2RyxDQUFDO1FBQ0YsQ0FBQyxNQUFNO1VBQ05YLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQ04sb0JBQW9CLEVBQUVhLFFBQVEsQ0FBQyxDQUFDO1FBQ3hEO01BQ0Q7SUFDRCxDQUFDLENBQUM7SUFDRixPQUFPZCxPQUFPO0VBQ2YsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFQLFFBQUEsQ0FBQU0sa0NBQUEsR0FBQUEsa0NBQUE7RUFLTyxTQUFTdUIseUJBQXlCQSxDQUFDdEIsT0FBdUIsRUFBUTtJQUN4RUEsT0FBTyxDQUFDSyxPQUFPLENBQUVrQixNQUFNLElBQUs7TUFDM0IsSUFBSUEsTUFBTSxDQUFDaEIsT0FBTyxFQUFFQyxPQUFPLENBQUMsQ0FBQyxLQUFLLE9BQU8sRUFBRTtRQUMxQztNQUNEO01BQ0EsSUFBSWUsTUFBTSxDQUFDQyxJQUFJLEtBQUssV0FBVyxFQUFFO1FBQ2hDRCxNQUFNLENBQUNoQixPQUFPLEdBQUdRLGlCQUFpQixDQUNqQ0ssR0FBRyxDQUFDSixvQkFBb0IsQ0FBQ08sTUFBTSxDQUFDaEIsT0FBTyxFQUFZLFNBQVMsQ0FBQyxFQUFFa0IsR0FBRyxDQUFDQyxLQUFLLENBQUNDLEVBQUUsQ0FBQ0MsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDbkgsQ0FBQztNQUNGO0lBQ0QsQ0FBQyxDQUFDO0VBQ0g7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVZBbkMsUUFBQSxDQUFBNkIseUJBQUEsR0FBQUEseUJBQUE7RUFXQSxTQUFTTyxjQUFjQSxDQUN0QkMsZUFBK0QsRUFDL0RDLGlCQUErQixFQUMvQkMsU0FBaUIsRUFDa0Y7SUFDbkcsTUFBTUMsZ0JBQWdCLEdBQUdGLGlCQUFpQixDQUFDRyxJQUFJLENBQUVYLE1BQU0sSUFBS0EsTUFBTSxDQUFDWSxHQUFHLEtBQUtILFNBQVMsQ0FBQztJQUNyRixNQUFNSSxjQUFjLEdBQUdOLGVBQWUsQ0FBQ0UsU0FBUyxDQUFDO0lBQ2pELElBQUlLLFlBQXlELEdBQUc7TUFBRSxJQUFJSixnQkFBZ0IsSUFBSUcsY0FBYztJQUFFLENBQUM7O0lBRTNHO0lBQ0EsSUFBSUUsTUFBTSxDQUFDQyxJQUFJLENBQUNGLFlBQVksQ0FBQyxDQUFDMUIsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMzQ29CLGlCQUFpQixDQUNmUyxNQUFNLENBQUVDLGdCQUE0QixJQUFLO1FBQ3pDLE9BQU9BLGdCQUFnQixDQUFDakIsSUFBSSxLQUFLa0IsVUFBVSxDQUFDQyxJQUFJO01BQ2pELENBQUMsQ0FBQyxDQUNEdEMsT0FBTyxDQUFFQyxVQUFzQixJQUFLO1FBQ3BDQSxVQUFVLENBQUNJLElBQUksRUFBRUwsT0FBTyxDQUFFTyxRQUFvQixJQUFLO1VBQ2xELElBQUlBLFFBQVEsQ0FBQ3VCLEdBQUcsS0FBS0gsU0FBUyxFQUFFO1lBQy9CSyxZQUFZLEdBQUd6QixRQUFRO1VBQ3hCO1FBQ0QsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxDQUFDO0lBQ0o7O0lBRUE7SUFDQSxJQUFJcUIsZ0JBQWdCLEVBQUU7TUFDckI7TUFDQUksWUFBWSxDQUFDTyxPQUFPLEdBQUdSLGNBQWMsRUFBRVEsT0FBTyxJQUFJWCxnQkFBZ0IsQ0FBQ1csT0FBTztNQUMxRVAsWUFBWSxDQUFDOUIsT0FBTyxHQUFHNkIsY0FBYyxFQUFFN0IsT0FBTyxJQUFJMEIsZ0JBQWdCLENBQUMxQixPQUFPO01BRTFFLEtBQUssTUFBTXNDLElBQUksSUFBSVQsY0FBYyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3hDLE1BQU1VLE9BQU8sR0FBR0QsSUFBd0I7UUFDeEMsSUFBSSxDQUFDWixnQkFBZ0IsQ0FBQ2EsT0FBTyxDQUFDLElBQUlBLE9BQU8sS0FBSyxNQUFNLEVBQUU7VUFDckRULFlBQVksQ0FBQ1MsT0FBTyxDQUFDLEdBQUdWLGNBQWMsQ0FBQ1UsT0FBTyxDQUFVO1FBQ3pEO01BQ0Q7SUFDRDtJQUVBLE1BQU1DLGFBQWEsR0FDbEJWLFlBQVksRUFBRTlCLE9BQU8sSUFDckI4QixZQUFZLEVBQUViLElBQUksS0FBS2tCLFVBQVUsQ0FBQ00sa0JBQWtCLElBQ3BEWCxZQUFZLEVBQUViLElBQUksS0FBS2tCLFVBQVUsQ0FBQ08saUNBQWlDO0lBRXBFLE9BQU87TUFDTjFCLE1BQU0sRUFBRWMsWUFBeUM7TUFDakRVO0lBQ0QsQ0FBQztFQUNGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0csb0JBQW9CQSxDQUM1QjVDLFVBQTBDLEVBQzFDd0IsZUFBK0QsRUFDL0RDLGlCQUErQixFQUMvQm9CLGNBQXlELEVBQ2xEO0lBQ1AsTUFBTTtNQUFFNUIsTUFBTTtNQUFFd0I7SUFBYyxDQUFDLEdBQUdsQixjQUFjLENBQUNDLGVBQWUsRUFBRUMsaUJBQWlCLEVBQUV6QixVQUFVLENBQUM4QyxhQUF1QixDQUFDO0lBRXhILElBQUlMLGFBQWEsRUFBRTtNQUNsQnpDLFVBQVUsQ0FBQzhDLGFBQWEsR0FBRzdCLE1BQU07SUFDbEM7SUFFQSxJQUFJQSxNQUFNLENBQUM4QixPQUFPLEVBQUU7TUFDbkJGLGNBQWMsQ0FBQzVCLE1BQU0sQ0FBQ1ksR0FBRyxDQUFDLEdBQUdaLE1BQU07SUFDcEM7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVMrQixZQUFZQSxDQUNwQmhELFVBQTBDLEVBQzFDd0IsZUFBK0QsRUFDL0RDLGlCQUErQixFQUMvQm9CLGNBQXlELEVBQ2xEO0lBQ1AsTUFBTUksZUFBOEMsR0FBRyxFQUFFO0lBQ3pELE1BQU1DLHdCQUF3QixHQUFHekIsaUJBQWlCLENBQUNHLElBQUksQ0FBRUQsZ0JBQWdCLElBQUtBLGdCQUFnQixDQUFDRSxHQUFHLEtBQUs3QixVQUFVLENBQUM2QixHQUFHLENBQUM7SUFFdEgsSUFBSTdCLFVBQVUsQ0FBQ0ksSUFBSSxFQUFFQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2xDLEtBQUssTUFBTThDLFdBQVcsSUFBSW5ELFVBQVUsQ0FBQ0ksSUFBSSxJQUFJLEVBQUUsRUFBRTtRQUNoRCxNQUFNO1VBQUVhLE1BQU07VUFBRXdCO1FBQWMsQ0FBQyxHQUFHbEIsY0FBYyxDQUFDQyxlQUFlLEVBQUVDLGlCQUFpQixFQUFFMEIsV0FBVyxDQUFDO1FBRWpHLElBQUlWLGFBQWEsRUFBRTtVQUNsQlEsZUFBZSxDQUFDOUMsSUFBSSxDQUFDYyxNQUFNLENBQUM7UUFDN0I7UUFFQSxJQUFJQSxNQUFNLENBQUM4QixPQUFPLEVBQUU7VUFDbkJGLGNBQWMsQ0FBQ00sV0FBVyxDQUFDLEdBQUdsQyxNQUFNO1FBQ3JDO01BQ0Q7SUFDRDs7SUFFQTtJQUFBLEtBQ0ssSUFBSWlDLHdCQUF3QixFQUFFO01BQ2xDQSx3QkFBd0IsQ0FBQzlDLElBQUksRUFBRUwsT0FBTyxDQUFFTyxRQUFRLElBQUsyQyxlQUFlLENBQUM5QyxJQUFJLENBQUNHLFFBQVEsQ0FBQyxDQUFDO0lBQ3JGO0lBRUEsTUFBTThDLGdCQUFnQixHQUFHcEQsVUFBMEI7SUFDbkRvRCxnQkFBZ0IsQ0FBQ2hELElBQUksR0FBRzZDLGVBQWU7O0lBRXZDO0lBQ0EsTUFBTXRDLGtCQUF1RCxHQUFHc0MsZUFBZSxDQUFDckMsR0FBRyxDQUFFTixRQUFRLElBQzVGSSxvQkFBb0IsQ0FBQ0osUUFBUSxDQUFDTCxPQUFPLEVBQVksU0FBUyxDQUMzRCxDQUFDO0lBQ0RtRCxnQkFBZ0IsQ0FBQ25ELE9BQU8sR0FBR1EsaUJBQWlCLENBQzNDSyxHQUFHLENBQUNKLG9CQUFvQixDQUFDVixVQUFVLENBQUNDLE9BQU8sRUFBWSxTQUFTLENBQUMsRUFBRWMsRUFBRSxDQUFDLEdBQUdKLGtCQUFrQixDQUFDLENBQzdGLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVMwQyx1Q0FBdUNBLENBQy9DN0IsZUFBK0QsRUFDL0RDLGlCQUErQixFQUNnQjtJQUMvQyxNQUFNNkIsVUFBd0MsR0FBRyxDQUFDLENBQUM7SUFDbkQsTUFBTUMsa0JBQTRCLEdBQUcsRUFBRTtJQUN2QyxNQUFNVixjQUE0QyxHQUFHLENBQUMsQ0FBQztJQUV2RCxLQUFLLE1BQU1uQixTQUFTLElBQUlGLGVBQWUsRUFBRTtNQUN4QyxNQUFNTSxjQUE4QyxHQUFHTixlQUFlLENBQUNFLFNBQVMsQ0FBQztNQUVqRixJQUFJSSxjQUFjLENBQUNnQixhQUFhLEtBQUtVLFNBQVMsRUFBRTtRQUMvQ1osb0JBQW9CLENBQUNkLGNBQWMsRUFBRU4sZUFBZSxFQUFFQyxpQkFBaUIsRUFBRW9CLGNBQWMsQ0FBQztNQUN6RjtNQUVBLElBQUlmLGNBQWMsQ0FBQ1osSUFBSSxLQUFLa0IsVUFBVSxDQUFDQyxJQUFJLEVBQUU7UUFDNUNXLFlBQVksQ0FBQ2xCLGNBQWMsRUFBRU4sZUFBZSxFQUFFQyxpQkFBaUIsRUFBRW9CLGNBQWMsQ0FBQzs7UUFFaEY7UUFDQSxJQUFJLENBQUNmLGNBQWMsQ0FBQzFCLElBQUksRUFBRUMsTUFBTSxFQUFFO1VBQ2pDa0Qsa0JBQWtCLENBQUNwRCxJQUFJLENBQUMyQixjQUFjLENBQUNELEdBQUcsQ0FBQztRQUM1QztNQUNEO01BRUEsSUFBSUMsY0FBYyxDQUFDaUIsT0FBTyxFQUFFO1FBQzNCRixjQUFjLENBQUNuQixTQUFTLENBQUMsR0FBR0ksY0FBOEI7TUFDM0Q7TUFFQXdCLFVBQVUsQ0FBQzVCLFNBQVMsQ0FBQyxHQUFHSSxjQUE4QjtJQUN2RDtJQUVBeUIsa0JBQWtCLENBQUN4RCxPQUFPLENBQUUyQixTQUFpQixJQUFLLE9BQU80QixVQUFVLENBQUM1QixTQUFTLENBQUMsQ0FBQztJQUUvRSxPQUFPO01BQ05oQyxPQUFPLEVBQUU0RCxVQUFVO01BQ25CVCxjQUFjLEVBQUVBO0lBQ2pCLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTVksbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0IzQixjQUE4QixFQUM5QjRCLGtCQUEyQixFQUMzQkMsZ0JBQXlELEVBRVY7SUFBQSxJQUQvQ0MsY0FBYyxHQUFBQyxTQUFBLENBQUF4RCxNQUFBLFFBQUF3RCxTQUFBLFFBQUFMLFNBQUEsR0FBQUssU0FBQSxNQUFHLEtBQUs7SUFFdEIsSUFBSUgsa0JBQWtCLElBQUk1QixjQUFjLENBQUNRLE9BQU8sS0FBS2tCLFNBQVMsRUFBRTtNQUMvRDtNQUNBO01BQ0EsT0FBT0EsU0FBUztJQUNqQjtJQUVBLE1BQU1NLE1BQU0sR0FBR0MsNkNBQTZDLENBQUNqQyxjQUFjLENBQUNRLE9BQU8sRUFBRXFCLGdCQUFnQixFQUFFQyxjQUFjLENBQUM7O0lBRXRIO0lBQ0EsTUFBTUkscUJBQXFCLEdBQUcsQ0FBQ0osY0FBYyxHQUFHLDBCQUEwQixHQUFHLHNDQUFzQztJQUNuSCxPQUFPbkQsaUJBQWlCLENBQ3ZCd0QsTUFBTSxDQUNMbkMsY0FBYyxDQUFDb0MsaUJBQWlCLEtBQUssSUFBSSxFQUN6Q0QsTUFBTSxDQUNMbkMsY0FBYyxDQUFDcUMsY0FBYyxLQUFLLFFBQVEsRUFDMUNyRCxHQUFHLENBQUNNLEtBQUssQ0FBQ2dELFdBQVcsQ0FBQ0oscUJBQXFCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUVGLE1BQU0sQ0FBQyxFQUNyRWhELEdBQUcsQ0FBQ3VELGNBQWMsQ0FBQ0QsV0FBVyxDQUFDSixxQkFBcUIsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRUYsTUFBTSxDQUM5RSxDQUFDLEVBQ0RBLE1BQ0QsQ0FDRCxDQUFDO0VBQ0YsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTVEsbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0J4QyxjQUE4QixFQUM5QjRCLGtCQUEyQixFQUMzQkMsZ0JBQXlELEVBQ1Y7SUFDL0MsSUFBSUQsa0JBQWtCLElBQUk1QixjQUFjLENBQUM3QixPQUFPLEtBQUt1RCxTQUFTLEVBQUU7TUFDL0Q7TUFDQTtNQUNBLE9BQU9BLFNBQVM7SUFDakI7SUFFQSxNQUFNTSxNQUFNLEdBQUdDLDZDQUE2QyxDQUFDakMsY0FBYyxDQUFDN0IsT0FBTyxFQUFFMEQsZ0JBQWdCLENBQUM7SUFDdEcsT0FBT2xELGlCQUFpQixDQUFDcUQsTUFBTSxDQUFDO0VBQ2pDLENBQUM7RUFTRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU1MsMkNBQTJDQSxDQUFDekMsY0FBOEMsRUFBRUgsZ0JBQTZCLEVBQVE7SUFDekksSUFBSSxDQUFDQSxnQkFBZ0IsRUFBRTtNQUN0QjtJQUNEOztJQUVBO0lBQ0FHLGNBQWMsQ0FBQ1osSUFBSSxHQUFHUyxnQkFBZ0IsQ0FBQ1QsSUFBSTtJQUMzQ1ksY0FBYyxDQUFDMEMsY0FBYyxHQUFHN0MsZ0JBQWdCLENBQUM2QyxjQUFjO0lBQy9EMUMsY0FBYyxDQUFDMkMsS0FBSyxHQUFHOUMsZ0JBQWdCLENBQUM4QyxLQUFLOztJQUU3QztJQUNBM0MsY0FBYyxDQUFDUSxPQUFPLEdBQUdSLGNBQWMsQ0FBQ1EsT0FBTyxJQUFJWCxnQkFBZ0IsQ0FBQ1csT0FBTztJQUMzRVIsY0FBYyxDQUFDN0IsT0FBTyxHQUFHNkIsY0FBYyxDQUFDN0IsT0FBTyxJQUFJMEIsZ0JBQWdCLENBQUMxQixPQUFPO0VBQzVFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTeUUsc0JBQXNCQSxDQUNyQ2xELGVBQTJELEVBQzNEbUMsZ0JBQXlELEVBQ3pEbEMsaUJBQWdDLEVBQ2hDa0Qsa0JBQW9ELEVBQ3BEQywwQkFBb0MsRUFDcENDLGFBQTRCLEVBQzVCQyxTQUFrQixFQUM2QjtJQUMvQyxNQUFNcEYsT0FBdUQsR0FBRyxDQUFDLENBQUM7SUFDbEUsS0FBSyxNQUFNZ0MsU0FBUyxJQUFJRixlQUFlLEVBQUU7TUFDeEMsTUFBTU0sY0FBOEIsR0FBR04sZUFBZSxDQUFDRSxTQUFTLENBQUM7TUFDakUsTUFBTXFELFlBQVksR0FBR2pELGNBQWMsQ0FBQzJDLEtBQUssRUFBRU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUNqRSxJQUFJckQsZ0JBQXdDO01BRTVDLElBQUlGLGlCQUFpQixFQUFFO1FBQ3RCLEtBQUssTUFBTVIsTUFBTSxJQUFJUSxpQkFBaUIsRUFBRTtVQUN2QztVQUNBO1VBQ0EsSUFBSVIsTUFBTSxDQUFDZ0UsRUFBRSxFQUFFQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM1QztVQUNEO1VBQ0EsSUFBSWpFLE1BQU0sQ0FBQ1ksR0FBRyxLQUFLSCxTQUFTLEVBQUU7WUFDN0JDLGdCQUFnQixHQUFHVixNQUFNO1lBQ3pCO1VBQ0QsQ0FBQyxNQUFNLElBQUlBLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNsQztZQUNBUyxnQkFBZ0IsR0FBR1YsTUFBTSxDQUFDYixJQUFJLEVBQUV3QixJQUFJLENBQUV0QixRQUFvQixJQUFLO2NBQzlELE9BQU9BLFFBQVEsQ0FBQ3VCLEdBQUcsS0FBS0gsU0FBUztZQUNsQyxDQUFDLENBQUM7WUFDRixJQUFJQyxnQkFBZ0IsRUFBRTtjQUNyQjtZQUNEO1VBQ0Q7UUFDRDtNQUNEOztNQUVBO01BQ0EsTUFBTStCLGtCQUFrQixHQUFHLENBQUMsQ0FBQy9CLGdCQUFnQjtNQUM3QyxJQUFJRyxjQUFjLENBQUNnRCxTQUFTLEVBQUU7UUFDN0JBLFNBQVMsR0FBR2hELGNBQWMsQ0FBQ2dELFNBQVM7TUFDckM7TUFFQXBGLE9BQU8sQ0FBQ2dDLFNBQVMsQ0FBQyxHQUFHO1FBQ3BCdUQsRUFBRSxFQUFFdEQsZ0JBQWdCLEdBQUdELFNBQVMsR0FBR3lELGlCQUFpQixDQUFDekQsU0FBUyxDQUFDO1FBQy9EUixJQUFJLEVBQUVZLGNBQWMsQ0FBQzFCLElBQUksR0FBR2dDLFVBQVUsQ0FBQ0MsSUFBSSxHQUFHRCxVQUFVLENBQUNnRCxPQUFPO1FBQ2hFbkYsT0FBTyxFQUFFcUUsbUJBQW1CLENBQUN4QyxjQUFjLEVBQUU0QixrQkFBa0IsRUFBRUMsZ0JBQWdCLENBQUM7UUFDbEZyQixPQUFPLEVBQUVtQixtQkFBbUIsQ0FBQzNCLGNBQWMsRUFBRTRCLGtCQUFrQixFQUFFQyxnQkFBZ0IsQ0FBQztRQUNsRjBCLHFCQUFxQixFQUFFNUIsbUJBQW1CLENBQUMzQixjQUFjLEVBQUU0QixrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDO1FBQ3RHMkIsYUFBYSxFQUFFeEQsY0FBYyxDQUFDMkMsS0FBSyxJQUFJM0MsY0FBYyxDQUFDMkMsS0FBSyxDQUFDYyxTQUFTLENBQUMsQ0FBQyxFQUFFUixZQUFZLENBQUMsQ0FBQ1MsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7UUFDM0dDLGFBQWEsRUFBRTNELGNBQWMsQ0FBQzJDLEtBQUssSUFBSTNDLGNBQWMsQ0FBQzJDLEtBQUssQ0FBQ2MsU0FBUyxDQUFDUixZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZGTixLQUFLLEVBQUUzQyxjQUFjLENBQUMyQyxLQUFLO1FBQzNCaUIsSUFBSSxFQUFFNUQsY0FBYyxDQUFDNEQsSUFBSTtRQUN6QkMsTUFBTSxFQUFFN0QsY0FBYyxDQUFDOEQsUUFBUTtRQUMvQi9ELEdBQUcsRUFBRWdFLG1CQUFtQixDQUFDbkUsU0FBUyxDQUFDO1FBQ25DeUMsY0FBYyxFQUFFckMsY0FBYyxDQUFDcUMsY0FBYztRQUM3QzJCLDhCQUE4QixFQUFFaEUsY0FBYyxDQUFDaUUscUJBQXFCO1FBQ3BFQyxRQUFRLEVBQUU7VUFDVEMsTUFBTSxFQUFFbkUsY0FBYyxDQUFDa0UsUUFBUSxFQUFFQyxNQUFNO1VBQ3ZDQyxTQUFTLEVBQUVwRSxjQUFjLENBQUNrRSxRQUFRLEtBQUt4QyxTQUFTLEdBQUcyQyxTQUFTLENBQUNDLEtBQUssR0FBR3RFLGNBQWMsQ0FBQ2tFLFFBQVEsQ0FBQ0U7UUFDOUYsQ0FBQztRQUNERyxXQUFXLEVBQUVDLGlCQUFpQixDQUFDeEUsY0FBYyxFQUFFNkMsa0JBQWtCLEVBQUVDLDBCQUEwQixDQUFDO1FBQzlGN0IsT0FBTyxFQUFFakIsY0FBYyxDQUFDaUIsT0FBTztRQUMvQm1CLGlCQUFpQixFQUFFcEMsY0FBYyxDQUFDb0MsaUJBQWlCLEtBQUtWLFNBQVMsR0FBRyxLQUFLLEdBQUcxQixjQUFjLENBQUNvQyxpQkFBaUI7UUFDNUdxQyxnQkFBZ0IsRUFBRUEsZ0JBQWdCLENBQUN6RSxjQUFjLENBQUM7UUFDbEQxQixJQUFJLEVBQUUwQixjQUFjLENBQUMxQixJQUFJLEtBQUt1QixnQkFBZ0IsRUFBRVQsSUFBSSxLQUFLa0IsVUFBVSxDQUFDQyxJQUFJLEdBQUcsRUFBRSxHQUFHbUIsU0FBUyxDQUFDO1FBQzFGc0IsU0FBUyxFQUFFaEQsY0FBYyxDQUFDMEUsTUFBTSxHQUFHMUIsU0FBUyxHQUFHdEIsU0FBUztRQUN4RFYsYUFBYSxFQUFFaEIsY0FBYyxDQUFDZ0IsYUFBYTtRQUMzQzJELGFBQWEsRUFBRTNFLGNBQWMsRUFBRTJFLGFBQWEsSUFBSWpELFNBQVM7UUFDekRrRCxRQUFRLEVBQUU1RSxjQUFjLEVBQUU0RSxRQUFRLElBQUlsRCxTQUFTO1FBQy9DbUQsS0FBSyxFQUFFN0UsY0FBYyxFQUFFOEUsYUFBYSxJQUFJOUUsY0FBYyxFQUFFNkUsS0FBSyxJQUFJbkQsU0FBUztRQUMxRW9ELGFBQWEsRUFBRTlFLGNBQWMsRUFBRThFLGFBQWEsSUFBSXBELFNBQVM7UUFDekRxRCxxQkFBcUIsRUFBRS9FLGNBQWMsRUFBRStFLHFCQUFxQixJQUFJckQ7TUFDakUsQ0FBQztNQUVEZSwyQ0FBMkMsQ0FBQzdFLE9BQU8sQ0FBQ2dDLFNBQVMsQ0FBQyxFQUFFQyxnQkFBZ0IsQ0FBQztJQUNsRjtJQUVBLE9BQU8wQix1Q0FBdUMsQ0FBQzNELE9BQU8sRUFBRStCLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztFQUNqRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEF0QyxRQUFBLENBQUF1RixzQkFBQSxHQUFBQSxzQkFBQTtFQVFBLFNBQVNYLDZDQUE2Q0EsQ0FDckQrQyxhQUEyQyxFQUMzQ25ELGdCQUF5RCxFQUVyQjtJQUFBLElBRHBDQyxjQUFjLEdBQUFDLFNBQUEsQ0FBQXhELE1BQUEsUUFBQXdELFNBQUEsUUFBQUwsU0FBQSxHQUFBSyxTQUFBLE1BQUcsS0FBSztJQUV0QixNQUFNa0QsZUFBZSxHQUFHckcsb0JBQW9CLENBQW1Cb0csYUFBYSxFQUFZLFNBQVMsQ0FBQztJQUNsRyxJQUFJaEQsTUFBeUM7SUFDN0MsSUFBSWtELFVBQVUsQ0FBQ0QsZUFBZSxDQUFDLElBQUlBLGVBQWUsQ0FBQ0UsS0FBSyxLQUFLekQsU0FBUyxFQUFFO01BQ3ZFO01BQ0FNLE1BQU0sR0FBR29ELFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQyxNQUFNLElBQUlGLFVBQVUsQ0FBQ0QsZUFBZSxDQUFDLElBQUksT0FBT0EsZUFBZSxDQUFDRSxLQUFLLEtBQUssUUFBUSxFQUFFO01BQ3BGO01BQ0EsTUFBTUUsVUFBVSxHQUFHSixlQUFlLENBQUNFLEtBQUs7TUFDeEM7TUFDQW5ELE1BQU0sR0FBR3NELFlBQVksQ0FDcEIsQ0FBQ2hELFdBQVcsQ0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUrQyxVQUFVLEVBQUUvQyxXQUFXLENBQVksa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFDckdpRCxZQUFZLENBQUNDLDBCQUEwQixFQUN2QyxDQUFDMUQsY0FBYyxHQUNaRCxnQkFBZ0IsQ0FBQzRELHNCQUFzQixDQUFDLENBQUMsQ0FBQ0MsZUFBZSxFQUFFQyxnQkFBZ0IsSUFBSTlELGdCQUFnQixDQUFDK0QsYUFBYSxDQUFDLENBQUMsR0FDL0dsRSxTQUNKLENBQUM7SUFDRixDQUFDLE1BQU07TUFDTjtNQUNBTSxNQUFNLEdBQUdpRCxlQUFvRDtJQUM5RDtJQUVBLE9BQU9qRCxNQUFNO0VBQ2Q7RUFFTyxNQUFNNkQsc0JBQXNCLEdBQUlqSSxPQUF1QixJQUFxQjtJQUNsRixJQUFJa0ksYUFBc0MsR0FBRyxDQUFDLENBQUM7SUFDL0NsSSxPQUFPLENBQUNLLE9BQU8sQ0FBRWtCLE1BQU0sSUFBSztNQUMzQixJQUFJQSxNQUFNLEVBQUViLElBQUksRUFBRUMsTUFBTSxFQUFFO1FBQ3pCLE1BQU13SCxVQUFVLEdBQUc1RyxNQUFNLENBQUNiLElBQUk7UUFDOUJ3SCxhQUFhLEdBQUdDLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDLENBQUNDLElBQTZCLEVBQUFDLElBQUEsS0FBYztVQUFBLElBQVo7WUFBRW5HO1VBQUksQ0FBQyxHQUFBbUcsSUFBQTtVQUN4RSxJQUFJbkcsR0FBRyxJQUFJLENBQUNrRyxJQUFJLENBQUNsRyxHQUFHLENBQUMsRUFBRTtZQUN0QmtHLElBQUksQ0FBQ2xHLEdBQUcsQ0FBQyxHQUFHLElBQUk7VUFDakI7VUFDQSxPQUFPa0csSUFBSTtRQUNaLENBQUMsRUFBRUgsYUFBYSxDQUFDO01BQ2xCO0lBQ0QsQ0FBQyxDQUFDO0lBQ0YsT0FBT2xJLE9BQU8sQ0FBQ3dDLE1BQU0sQ0FBRWpCLE1BQU0sSUFBSyxDQUFDMkcsYUFBYSxDQUFDM0csTUFBTSxDQUFDWSxHQUFHLENBQUMsQ0FBQztFQUM5RCxDQUFDO0VBQUMxQyxRQUFBLENBQUF3SSxzQkFBQSxHQUFBQSxzQkFBQTtFQUVLLFNBQVNNLHVDQUF1Q0EsQ0FDdER0RSxnQkFBeUQsRUFDekR1RSxZQUFnQyxFQUVJO0lBQUEsSUFEcENDLHVCQUF1QixHQUFBdEUsU0FBQSxDQUFBeEQsTUFBQSxRQUFBd0QsU0FBQSxRQUFBTCxTQUFBLEdBQUFLLFNBQUEsTUFBRyxLQUFLO0lBRS9CLElBQUlxRSxZQUFZLEVBQUVFLFdBQVcsQ0FBQ0MsSUFBSSxFQUFFQyxrQkFBa0IsRUFBRTtNQUN2RCxNQUFNQyxtQkFBbUIsR0FBRzVFLGdCQUFnQixDQUFDNEQsc0JBQXNCLENBQUMsQ0FBQztNQUNyRSxJQUFJaUIsWUFBWSxHQUFHQywwQkFBMEIsQ0FDNUNQLFlBQVksRUFDWnZFLGdCQUFnQixDQUFDK0UsaUJBQWlCLENBQUMsQ0FBQyxFQUNwQ0gsbUJBQW1CLEVBQ25CSix1QkFDRCxDQUFDO01BQ0QsTUFBTVEsbUJBQW1CLEdBQ3hCQyxXQUFXLENBQUNDLGlEQUFpRCxDQUFDbEYsZ0JBQWdCLENBQUMsSUFDL0VpRixXQUFXLENBQUNFLFlBQVksQ0FBQ25GLGdCQUFnQixDQUFDb0YsWUFBWSxDQUFDLENBQUMsQ0FBQztNQUMxRCxJQUFJSixtQkFBbUIsRUFBRTtRQUN4QkgsWUFBWSxHQUFHMUgsR0FBRyxDQUFDMEgsWUFBWSxFQUFFckgsR0FBRyxDQUFDQyxLQUFLLENBQUNDLEVBQUUsQ0FBQ0MsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUN0RjtNQUNBLE9BQU9rSCxZQUFZO0lBQ3BCO0lBQ0EsT0FBT3RCLFFBQVEsQ0FBQyxJQUFJLENBQUM7RUFDdEI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQS9ILFFBQUEsQ0FBQThJLHVDQUFBLEdBQUFBLHVDQUFBO0VBT08sU0FBU2UsNkJBQTZCQSxDQUM1Q3JGLGdCQUF5RCxFQUN6RHVFLFlBQWdDLEVBRUc7SUFBQSxJQURuQ0MsdUJBQXVCLEdBQUF0RSxTQUFBLENBQUF4RCxNQUFBLFFBQUF3RCxTQUFBLFFBQUFMLFNBQUEsR0FBQUssU0FBQSxNQUFHLEtBQUs7SUFFL0IsT0FBT3BELGlCQUFpQixDQUFDd0gsdUNBQXVDLENBQUN0RSxnQkFBZ0IsRUFBRXVFLFlBQVksRUFBRUMsdUJBQXVCLENBQUMsQ0FBQztFQUMzSDtFQUFDaEosUUFBQSxDQUFBNkosNkJBQUEsR0FBQUEsNkJBQUE7RUFFTSxTQUFTQyx3QkFBd0JBLENBQUNDLFFBQXNDLEVBQThDO0lBQzVILE9BQU9BLFFBQVEsR0FDWkEsUUFBUSxDQUFDdEksR0FBRyxDQUFFdUksT0FBTyxJQUFLO01BQzFCLE9BQU87UUFDTkMsYUFBYSxFQUFFO1VBQ2RDLGFBQWEsRUFBRUYsT0FBTyxDQUFDQyxhQUFhLENBQUNuQztRQUN0QyxDQUFDO1FBQ0RxQyxzQkFBc0IsRUFBRUgsT0FBTyxDQUFDRyxzQkFBc0IsQ0FBQzlJLFFBQVEsQ0FBQztNQUNqRSxDQUFDO0lBQ0QsQ0FBQyxDQUFDLEdBQ0YsRUFBRTtFQUNOO0VBQUNyQixRQUFBLENBQUE4Six3QkFBQSxHQUFBQSx3QkFBQTtFQUVNLFNBQVMzQyxpQkFBaUJBLENBQ2hDckYsTUFBd0UsRUFDeEUwRCxrQkFBb0QsRUFDcERDLDBCQUFvQyxFQUMxQjtJQUNWLElBQUkyRSx1QkFBdUIsR0FBRyxJQUFJO0lBQ2xDLElBQUkzRSwwQkFBMEIsRUFBRTtNQUMvQixNQUFNNEUsZUFBZSxHQUFHN0Usa0JBQWtCLEtBQUtBLGtCQUFrQixDQUFDOEUsTUFBTSxJQUFJOUUsa0JBQWtCLENBQUMrRSxPQUFPLENBQUM7TUFDdkdILHVCQUF1QixHQUFHQyxlQUFlLEVBQUVHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSztJQUNoRTtJQUNBO0lBQ0EsSUFDRTFJLE1BQU0sSUFDTkEsTUFBTSxDQUFDMkksY0FBYyxLQUNwQjNJLE1BQU0sQ0FBQzJJLGNBQWMsRUFBRUMsa0JBQWtCLEtBQUssS0FBSyxJQUFJNUksTUFBTSxDQUFDMkksY0FBYyxFQUFFckQsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLElBQzFHLENBQUNnRCx1QkFBdUIsRUFDdkI7TUFDRCxPQUFPLEtBQUs7SUFDYjtJQUNBLE9BQU8sSUFBSTtFQUNaO0VBQUNwSyxRQUFBLENBQUFtSCxpQkFBQSxHQUFBQSxpQkFBQTtFQUVNLFNBQVNDLGdCQUFnQkEsQ0FBQ3RGLE1BQXNCLEVBQVc7SUFDakUsT0FBT0EsTUFBTSxFQUFFMkksY0FBYyxFQUFFckQsZ0JBQWdCLEtBQUssSUFBSTtFQUN6RDtFQUFDcEgsUUFBQSxDQUFBb0gsZ0JBQUEsR0FBQUEsZ0JBQUE7RUFFTSxTQUFTdUQscUJBQXFCQSxDQUFDQyxTQUFrQyxFQUFXO0lBQ2xGLE9BQU9BLFNBQVMsQ0FBQzNCLFdBQVcsRUFBRS9HLEVBQUUsRUFBRTJJLFlBQVksRUFBRTlKLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJNkosU0FBUyxDQUFDRSxLQUFLLG9EQUF5QztFQUMvSDtFQUFDOUssUUFBQSxDQUFBMksscUJBQUEsR0FBQUEscUJBQUE7RUFFTSxTQUFTSSxhQUFhQSxDQUFDQyxjQUF5QyxFQUF1QztJQUM3RyxJQUFJQSxjQUFjLENBQUM5SixNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2hDLE9BQU84SixjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3pCO0lBQ0EsSUFBSUEsY0FBYyxDQUFDOUosTUFBTSxHQUFHLENBQUMsRUFBRTtNQUM5QitKLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLCtGQUErRixDQUFDO0lBQzNHO0lBQ0EsT0FBTzdHLFNBQVM7RUFDakI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBckUsUUFBQSxDQUFBK0ssYUFBQSxHQUFBQSxhQUFBO0VBS08sU0FBU0ksNEJBQTRCQSxDQUFDN0ksaUJBQStCLEVBQWdCO0lBQzNGLE1BQU04SSxlQUE2QixHQUFHLEVBQUU7SUFFeEM5SSxpQkFBaUIsQ0FBQzFCLE9BQU8sQ0FBRWtCLE1BQWtCLElBQUs7TUFDakQsSUFBSUEsTUFBTSxDQUFDQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUNELE1BQU0sQ0FBQ2dFLEVBQUUsRUFBRUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUlqRSxNQUFNLENBQUNiLElBQUksRUFBRTtRQUN0Rm1LLGVBQWUsQ0FBQ3BLLElBQUksQ0FBQyxHQUFHYyxNQUFNLENBQUNiLElBQUksQ0FBQztNQUNyQztJQUNELENBQUMsQ0FBQztJQUVGLE9BQU9tSyxlQUFlO0VBQ3ZCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBcEwsUUFBQSxDQUFBbUwsNEJBQUEsR0FBQUEsNEJBQUE7RUFNTyxTQUFTRSx5QkFBeUJBLENBQ3hDQyxtQkFBaUMsRUFDakNqSixlQUE2QyxFQUNkO0lBQy9CLE1BQU1rSix1QkFBcUQsR0FBRyxDQUFDLENBQUM7SUFFaEUsS0FBSyxNQUFNNUksY0FBYyxJQUFJTixlQUFlLEVBQUU7TUFDN0MsSUFDQ00sY0FBYyxDQUFDb0QsVUFBVSxDQUFDLHNCQUFzQixDQUFDLElBQ2pEdUYsbUJBQW1CLENBQUM3SSxJQUFJLENBQUUySSxlQUFlLElBQUs7UUFDN0MsT0FBT0EsZUFBZSxDQUFDMUksR0FBRyxLQUFLQyxjQUFjO01BQzlDLENBQUMsQ0FBQyxFQUNEO1FBQ0Q0SSx1QkFBdUIsQ0FBQzVJLGNBQWMsQ0FBQyxHQUFHTixlQUFlLENBQUNNLGNBQWMsQ0FBQztNQUMxRTtJQUNEO0lBRUEsT0FBTzRJLHVCQUF1QjtFQUMvQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkF2TCxRQUFBLENBQUFxTCx5QkFBQSxHQUFBQSx5QkFBQTtFQUtPLFNBQVNHLGtCQUFrQkEsQ0FBQ0MsaUJBQWlDLEVBQUVDLG1CQUFpQyxFQUFRO0lBQzlHLElBQUlDLFdBQVc7SUFFZkYsaUJBQWlCLENBQUM3SyxPQUFPLENBQUVrQixNQUFvQixJQUFLO01BQ25ELElBQUlBLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLa0IsVUFBVSxDQUFDQyxJQUFJLEVBQUU7UUFDcENwQixNQUFNLENBQUNiLElBQUksRUFBRUwsT0FBTyxDQUFDLENBQUNPLFFBQW9CLEVBQUV5SyxhQUFxQixLQUFLO1VBQ3JFRCxXQUFXLEdBQUdELG1CQUFtQixDQUFDakosSUFBSSxDQUFFb0osa0JBQThCLElBQUs7WUFDMUUsT0FBT0Esa0JBQWtCLENBQUNuSixHQUFHLEtBQUt2QixRQUFRLENBQUN1QixHQUFHO1VBQy9DLENBQUMsQ0FBQztVQUVGLElBQUlpSixXQUFXLEVBQUU7WUFDaEI3SixNQUFNLENBQUNiLElBQUksRUFBRTZLLE1BQU0sQ0FBQ0YsYUFBYSxFQUFFLENBQUMsRUFBRUQsV0FBVyxDQUFDO1VBQ25EO1FBQ0QsQ0FBQyxDQUFDOztRQUVGO1FBQ0EsTUFBTXJFLGFBQWEsR0FBR3lFLGlCQUFpQixDQUFDakssTUFBTSxDQUFDYixJQUFpQyxDQUFDO1FBQ2pGLElBQUlxRyxhQUFhLEVBQUU7VUFDbEJ4RixNQUFNLENBQUN3RixhQUFhLEdBQUdBLGFBQWE7UUFDckM7TUFDRDtJQUNELENBQUMsQ0FBQztFQUNIOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQXRILFFBQUEsQ0FBQXdMLGtCQUFBLEdBQUFBLGtCQUFBO0VBS08sU0FBU08saUJBQWlCQSxDQUFDeEwsT0FBMkQsRUFBVztJQUN2RyxJQUFJeUwsd0JBQXdCLEdBQUcsQ0FBQztJQUNoQ3pMLE9BQU8sQ0FBQ0ssT0FBTyxDQUFFa0IsTUFBTSxJQUFLO01BQzNCLElBQUtBLE1BQU0sQ0FBcUNnSixLQUFLLEtBQUt6RyxTQUFTLEVBQUU7UUFDcEUsSUFBSTRILG1CQUFtQixDQUFDbkssTUFBeUMsQ0FBQyxFQUFFO1VBQ25Fa0ssd0JBQXdCLEVBQUU7UUFDM0I7TUFDRCxDQUFDLE1BQU0sSUFBS2xLLE1BQU0sQ0FBa0JDLElBQUksS0FBS3NDLFNBQVMsRUFBRTtRQUN2RCxJQUFJNkgseUJBQXlCLENBQUNwSyxNQUFzQixDQUFDLEVBQUU7VUFDdERrSyx3QkFBd0IsRUFBRTtRQUMzQjtNQUNEO0lBQ0QsQ0FBQyxDQUFDO0lBQ0YsSUFBSUEsd0JBQXdCLEtBQUt6TCxPQUFPLEVBQUVXLE1BQU0sRUFBRSxPQUFPLElBQUk7SUFFN0QsT0FBTyxLQUFLO0VBQ2I7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBbEIsUUFBQSxDQUFBK0wsaUJBQUEsR0FBQUEsaUJBQUE7RUFLTyxTQUFTRSxtQkFBbUJBLENBQUNyQixTQUEwQyxFQUFXO0lBQ3hGLElBQUlBLFNBQVMsQ0FBQ0UsS0FBSyxvREFBeUMsRUFBRTtNQUM3RCxPQUFPRixTQUFTLENBQUN1QixZQUFZLEVBQUVsRCxXQUFXLENBQUMvRyxFQUFFLEVBQUVrSyxhQUFhLEVBQUVyTCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUk7SUFDakY7SUFDQSxPQUFPLEtBQUs7RUFDYjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFmLFFBQUEsQ0FBQWlNLG1CQUFBLEdBQUFBLG1CQUFBO0VBS0EsU0FBU0MseUJBQXlCQSxDQUFDRyxZQUEwQixFQUFXO0lBQ3ZFLE9BQU9BLFlBQVksRUFBRS9FLGFBQWEsS0FBSyxJQUFJO0VBQzVDOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNnRixhQUFhQSxDQUFDL0wsT0FBcUIsRUFBRWdNLG9CQUFrRCxFQUFnQjtJQUN0SCxJQUFJLENBQUNBLG9CQUFvQixFQUFFO01BQzFCLE9BQU9oTSxPQUFPO0lBQ2Y7SUFDQSxNQUFNb0UsTUFBb0IsR0FBRyxFQUFFO0lBQy9CLE1BQU02SCxVQUFvQixHQUFHLEVBQUU7SUFDL0IsTUFBTUMsbUJBQTJDLEdBQUcsQ0FBQyxDQUFDOztJQUV0RDtJQUNBbE0sT0FBTyxDQUFDSyxPQUFPLENBQUMsQ0FBQ2tCLE1BQWtCLEVBQUU0SyxLQUFhLEtBQUs7TUFDdEQ7TUFDQSxNQUFNQyxjQUFjLEdBQUc3SyxNQUFNLENBQUMyRixhQUFhLElBQUkzRixNQUFNLENBQUMwRixLQUFLO01BQzNELElBQUltRixjQUFjLEtBQUt0SSxTQUFTLElBQUksQ0FBQ21JLFVBQVUsQ0FBQ0ksUUFBUSxDQUFDRCxjQUFjLENBQUMsRUFBRTtRQUN6RUgsVUFBVSxDQUFDeEwsSUFBSSxDQUFDMkwsY0FBYyxDQUFDO1FBQy9CRixtQkFBbUIsQ0FBQ0UsY0FBYyxDQUFDLEdBQUdELEtBQUs7TUFDNUM7SUFDRCxDQUFDLENBQUM7O0lBRUY7SUFDQW5NLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDLENBQUNrQixNQUFrQixFQUFFNEssS0FBYSxLQUFLO01BQ3REO01BQ0EsTUFBTUMsY0FBYyxHQUFHN0ssTUFBTSxDQUFDMkYsYUFBYSxJQUFJM0YsTUFBTSxDQUFDMEYsS0FBSztNQUMzRCxNQUFNcUYsV0FBVyxHQUFHTixvQkFBb0IsR0FBR0ksY0FBYyxFQUFFdEwsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7TUFDNUUsTUFBTXlMLFlBQVksR0FBR0gsY0FBYyxLQUFLdEksU0FBUyxJQUFJb0ksbUJBQW1CLENBQUNFLGNBQWMsQ0FBQyxLQUFLRCxLQUFLOztNQUVsRztNQUNBLElBQUlJLFlBQVksSUFBSUQsV0FBVyxFQUFFRSxhQUFhLElBQUlwSSxNQUFNLENBQUN6RCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3BFO1FBQ0F5RCxNQUFNLENBQUMzRCxJQUFJLENBQUM7VUFDWGUsSUFBSSxFQUFFa0IsVUFBVSxDQUFDK0osU0FBUztVQUMxQnRLLEdBQUcsRUFBRSxhQUFhLEdBQUdpSyxjQUFjO1VBQ25DbkYsS0FBSyxFQUFFbUYsY0FBYztVQUNyQmxGLGFBQWEsRUFBRWtGLGNBQWM7VUFDN0I5RixRQUFRLEVBQUU7WUFDVEUsU0FBUyxFQUFFQyxTQUFTLENBQUNDO1VBQ3RCO1FBQ0QsQ0FBQyxDQUFDO01BQ0g7O01BRUE7TUFDQXRDLE1BQU0sQ0FBQzNELElBQUksQ0FBQ2MsTUFBTSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUVGLE9BQU82QyxNQUFNO0VBQ2Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBM0UsUUFBQSxDQUFBc00sYUFBQSxHQUFBQSxhQUFBO0VBUU8sU0FBU1csNkJBQTZCQSxDQUFDQyxrQkFBMkIsRUFBRUMsVUFBbUIsRUFBcUM7SUFDbEksT0FBT3JJLE1BQU0sQ0FDWm9JLGtCQUFrQixLQUFLLElBQUksRUFDM0JwSSxNQUFNLENBQ0xxSSxVQUFVLEtBQUssSUFBSSxFQUNuQnhMLEdBQUcsQ0FBQ3lMLEtBQUssQ0FBQ0MsV0FBVyxFQUFFcEwsS0FBSyxDQUFDZ0QsV0FBVyxDQUFDLDBCQUEwQixFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3pGbUksS0FBSyxDQUFDQyxXQUNQLENBQUMsRUFDREQsS0FBSyxDQUFDQyxXQUNQLENBQUM7RUFDRjtFQUFDck4sUUFBQSxDQUFBaU4sNkJBQUEsR0FBQUEsNkJBQUE7RUFBQSxPQUFBak4sUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -25,7 +25,8 @@ import {
25
25
  import type {
26
26
  CustomDefinedTableColumnForOverride,
27
27
  ManifestAction,
28
- NavigationSettingsConfiguration
28
+ NavigationSettingsConfiguration,
29
+ OverflowGroupsConfiguration
29
30
  } from "sap/fe/core/converters/ManifestSettings";
30
31
  import { ActionType } from "sap/fe/core/converters/ManifestSettings";
31
32
  import type { PageContextPathTarget } from "sap/fe/core/converters/TemplateConverter";
@@ -33,7 +34,7 @@ import type { ConfigurableObject, CustomElement, OverrideType } from "sap/fe/cor
33
34
  import { Placement } from "sap/fe/core/converters/helpers/ConfigurableObject";
34
35
  import { getCustomActionID } from "sap/fe/core/converters/helpers/ID";
35
36
  import fpmFormatter from "sap/fe/core/formatters/FPMFormatter";
36
- import { UI } from "sap/fe/core/helpers/BindingHelper";
37
+ import { Draft, UI } from "sap/fe/core/helpers/BindingHelper";
37
38
  import ModelHelper from "sap/fe/core/helpers/ModelHelper";
38
39
  import { replaceSpecialChars } from "sap/fe/core/helpers/StableIdHelper";
39
40
  import { getActionEnabledExpression } from "sap/fe/core/templating/UIFormatters";
@@ -86,6 +87,8 @@ export type BaseAction = ConfigurableObject & {
86
87
  isAIOperation?: boolean;
87
88
  priority?: OverflowToolbarPriority;
88
89
  group?: number;
90
+ overflowGroup?: number;
91
+ disableStrictHandling?: boolean;
89
92
  };
90
93
 
91
94
  export type AnnotationAction = BaseAction & {
@@ -138,6 +141,8 @@ export type OverrideTypeAction = {
138
141
  position: OverrideType.overwrite;
139
142
  priority?: OverrideType.overwrite;
140
143
  group?: OverrideType.overwrite;
144
+ overflowGroup?: OverrideType.overwrite;
145
+ disableStrictHandling?: OverrideType.overwrite;
141
146
  };
142
147
 
143
148
  export type DataFieldForActionOrActionGroup = DataFieldForActionTypes | DataFieldForActionGroupTypes;
@@ -467,6 +472,7 @@ type PartiallyConvertedCustomAction = Omit<CustomAction, "menu"> & {
467
472
  menu: string[] | undefined;
468
473
  priority?: OverflowToolbarPriority;
469
474
  group?: number;
475
+ overflowGroup?: number;
470
476
  };
471
477
 
472
478
  /**
@@ -570,7 +576,9 @@ export function getActionsFromManifest(
570
576
  defaultAction: manifestAction.defaultAction,
571
577
  isAIOperation: manifestAction?.isAIOperation ?? undefined,
572
578
  priority: manifestAction?.priority ?? undefined,
573
- group: manifestAction?.group ?? undefined
579
+ group: manifestAction?.overflowGroup ?? manifestAction?.group ?? undefined,
580
+ overflowGroup: manifestAction?.overflowGroup ?? undefined,
581
+ disableStrictHandling: manifestAction?.disableStrictHandling ?? undefined
574
582
  };
575
583
 
576
584
  overrideManifestConfigurationWithAnnotation(actions[actionKey], annotationAction);
@@ -842,30 +850,72 @@ function isCustomActionAIOperation(customAction: CustomAction): boolean {
842
850
 
843
851
  /**
844
852
  * Method to add toolbar separators if actions are grouped in more than one group.
845
- * @param actions Collection of merged actions from annotations and manifest
853
+ * @param actions Collection of merged actions from annotations and manifest settings
854
+ * @param overflowGroupsConfig Configuration for overflow group separators from manifest settings
846
855
  * @returns Collection of merged actions with toolbar separators
847
856
  */
848
- export function addSeparators(actions: BaseAction[]): BaseAction[] {
857
+ export function addSeparators(actions: BaseAction[], overflowGroupsConfig?: OverflowGroupsConfiguration): BaseAction[] {
858
+ if (!overflowGroupsConfig) {
859
+ return actions;
860
+ }
849
861
  const result: BaseAction[] = [];
850
862
  const groupsUsed: number[] = [];
851
- actions.forEach((action: BaseAction) => {
852
- // if a new group is found
853
- if (action.group !== undefined && !groupsUsed.includes(action.group)) {
854
- groupsUsed.push(action.group);
855
- // if there are two or more groups, add separator
856
- if (groupsUsed.length > 1) {
857
- result.push({
858
- type: ActionType.Separator,
859
- key: "Separator::" + action.group,
860
- group: action.group,
861
- position: {
862
- anchor: action.key,
863
- placement: Placement.Before
864
- }
865
- });
866
- }
863
+ const groupStartPositions: Record<number, number> = {};
864
+
865
+ // First pass: identify groups and their positions
866
+ actions.forEach((action: BaseAction, index: number) => {
867
+ // Use overflowGroup if available, otherwise fall back to group for compatibility
868
+ const effectiveGroup = action.overflowGroup ?? action.group;
869
+ if (effectiveGroup !== undefined && !groupsUsed.includes(effectiveGroup)) {
870
+ groupsUsed.push(effectiveGroup);
871
+ groupStartPositions[effectiveGroup] = index;
872
+ }
873
+ });
874
+
875
+ // Second pass: add actions and separators based on configuration
876
+ actions.forEach((action: BaseAction, index: number) => {
877
+ // Use overflowGroup if available, otherwise fall back to group for compatibility
878
+ const effectiveGroup = action.overflowGroup ?? action.group;
879
+ const groupConfig = overflowGroupsConfig?.[effectiveGroup?.toString() || ""];
880
+ const isGroupStart = effectiveGroup !== undefined && groupStartPositions[effectiveGroup] === index;
881
+
882
+ // Add separator at the beginning of group if configured
883
+ if (isGroupStart && groupConfig?.showSeparator && result.length > 0) {
884
+ // Don't add separator if it would be the first item
885
+ result.push({
886
+ type: ActionType.Separator,
887
+ key: "Separator::" + effectiveGroup,
888
+ group: effectiveGroup,
889
+ overflowGroup: effectiveGroup,
890
+ position: {
891
+ placement: Placement.After
892
+ }
893
+ });
867
894
  }
895
+
896
+ // Add the action itself
868
897
  result.push(action);
869
898
  });
899
+
870
900
  return result;
871
901
  }
902
+
903
+ /**
904
+ * Gets the binding expression for the visibility of the CreateNext button.
905
+ * This function centralizes the visibility logic to be reused by both getFooterDefaultActions
906
+ * and FooterContent.tsx.
907
+ * @param hiddenDraftEnabled Whether hidden draft mode is enabled
908
+ * @param fclEnabled Whether FCL (Flexible Column Layout) is enabled
909
+ * @returns A compiled binding expression for the CreateNext button visibility
910
+ */
911
+ export function getCreateNextButtonVisibility(hiddenDraftEnabled: boolean, fclEnabled: boolean): BindingToolkitExpression<boolean> {
912
+ return ifElse(
913
+ hiddenDraftEnabled === true,
914
+ ifElse(
915
+ fclEnabled === true,
916
+ and(Draft.IsNewObject, equal(pathInModel("/showSaveAndCancelButton", "fclhelper"), true)),
917
+ Draft.IsNewObject
918
+ ),
919
+ Draft.IsNewObject
920
+ );
921
+ }