@sapui5/sap.fe.core 1.95.0 → 1.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -2,38 +2,47 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/helpers/Key", "sap/fe/core/formatters/TableFormatter", "sap/fe/core/formatters/TableFormatterTypes", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/templating/PropertyHelper", "../../helpers/Aggregation", "sap/fe/core/templating/UIFormatters", "./Criticality"], function (ManifestSettings, ID, Action, ConfigurableObject, DataField, BindingExpression, BindingHelper, Key, tableFormatters, TableFormatterTypes, DataModelPathHelper, StableIdHelper, IssueManager, PropertyHelper, Aggregation, UIFormatters, Criticality) {
5
+ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/helpers/Key", "sap/fe/core/formatters/TableFormatter", "sap/fe/core/formatters/TableFormatterTypes", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/templating/PropertyHelper", "../../helpers/Aggregation", "sap/fe/core/templating/DisplayModeFormatter", "./Criticality", "sap/fe/core/templating/EntitySetHelper", "./table/StandardActions"], function (ManifestSettings, ID, Action, ConfigurableObject, DataField, BindingExpression, BindingHelper, Key, tableFormatters, TableFormatterTypes, DataModelPathHelper, StableIdHelper, IssueManager, PropertyHelper, Aggregation, DisplayModeFormatter, Criticality, EntitySetHelper, StandardActions) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
+ var getInsertUpdateActionsTemplating = StandardActions.getInsertUpdateActionsTemplating;
10
+ var isDraftOrStickySupported = StandardActions.isDraftOrStickySupported;
11
+ var getStandardActionMassEdit = StandardActions.getStandardActionMassEdit;
12
+ var getStandardActionPaste = StandardActions.getStandardActionPaste;
13
+ var getStandardActionDelete = StandardActions.getStandardActionDelete;
14
+ var getStandardActionCreate = StandardActions.getStandardActionCreate;
15
+ var getDeleteVisibility = StandardActions.getDeleteVisibility;
16
+ var isExternalCreateConfigured = StandardActions.isExternalCreateConfigured;
17
+ var generateStandardActionsContext = StandardActions.generateStandardActionsContext;
18
+ var getNonSortablePropertiesRestrictions = EntitySetHelper.getNonSortablePropertiesRestrictions;
9
19
  var getMessageTypeFromCriticalityType = Criticality.getMessageTypeFromCriticalityType;
10
- var getDisplayMode = UIFormatters.getDisplayMode;
20
+ var getDisplayMode = DisplayModeFormatter.getDisplayMode;
21
+ var EDM_TYPE_MAPPING = DisplayModeFormatter.EDM_TYPE_MAPPING;
11
22
  var AggregationHelper = Aggregation.AggregationHelper;
12
23
  var getTargetValueOnDataPoint = PropertyHelper.getTargetValueOnDataPoint;
13
24
  var isPathExpression = PropertyHelper.isPathExpression;
14
25
  var getAssociatedCurrencyProperty = PropertyHelper.getAssociatedCurrencyProperty;
15
26
  var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
16
27
  var isProperty = PropertyHelper.isProperty;
28
+ var IssueCategoryType = IssueManager.IssueCategoryType;
17
29
  var IssueType = IssueManager.IssueType;
18
30
  var IssueSeverity = IssueManager.IssueSeverity;
19
31
  var IssueCategory = IssueManager.IssueCategory;
20
32
  var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
21
33
  var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
22
- var isPathInsertable = DataModelPathHelper.isPathInsertable;
23
34
  var isPathSearchable = DataModelPathHelper.isPathSearchable;
24
35
  var isPathDeletable = DataModelPathHelper.isPathDeletable;
25
36
  var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
26
37
  var MessageType = TableFormatterTypes.MessageType;
27
38
  var KeyHelper = Key.KeyHelper;
28
39
  var UI = BindingHelper.UI;
29
- var singletonPathVisitor = BindingHelper.singletonPathVisitor;
30
40
  var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
31
41
  var Draft = BindingHelper.Draft;
32
42
  var resolveBindingString = BindingExpression.resolveBindingString;
33
43
  var or = BindingExpression.or;
34
44
  var not = BindingExpression.not;
35
45
  var isConstant = BindingExpression.isConstant;
36
- var isBinding = BindingExpression.isBinding;
37
46
  var ifElse = BindingExpression.ifElse;
38
47
  var formatResult = BindingExpression.formatResult;
39
48
  var equal = BindingExpression.equal;
@@ -46,6 +55,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
46
55
  var isDataFieldForActionAbstract = DataField.isDataFieldForActionAbstract;
47
56
  var isDataFieldAlwaysHidden = DataField.isDataFieldAlwaysHidden;
48
57
  var getSemanticObjectPath = DataField.getSemanticObjectPath;
58
+ var getDataFieldDataType = DataField.getDataFieldDataType;
49
59
  var collectRelatedPropertiesRecursively = DataField.collectRelatedPropertiesRecursively;
50
60
  var collectRelatedProperties = DataField.collectRelatedProperties;
51
61
  var Placement = ConfigurableObject.Placement;
@@ -243,7 +253,10 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
243
253
 
244
254
  if (aggregatesDefinitions) {
245
255
  tableVisualization.enableAnalytics = true;
246
- tableVisualization.aggregates = aggregatesDefinitions; // Add group and sort conditions from the presentation variant
256
+ tableVisualization.aggregates = aggregatesDefinitions;
257
+ var aggregationHelper = new AggregationHelper(entityType, converterContext);
258
+ var allowedTransformations = aggregationHelper.getAllowedTransformations();
259
+ tableVisualization.enableAnalyticsSearch = allowedTransformations ? allowedTransformations.indexOf("search") >= 0 : true; // Add group and sort conditions from the presentation variant
247
260
 
248
261
  tableVisualization.annotation.groupConditions = getGroupConditions(presentationVariantAnnotation, tableVisualization.columns);
249
262
  tableVisualization.annotation.aggregateConditions = getAggregateConditions(presentationVariantAnnotation, tableVisualization.columns);
@@ -657,7 +670,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
657
670
 
658
671
  _exports.getCapabilityRestriction = getCapabilityRestriction;
659
672
 
660
- function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities) {
673
+ function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities, isDeleteButtonVisible) {
661
674
  var _tableManifestSetting;
662
675
 
663
676
  if (!lineItemAnnotation) {
@@ -676,23 +689,11 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
676
689
  parentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable, true) : isParentDeletable;
677
690
  }
678
691
 
679
- if (selectionMode && selectionMode === SelectionMode.None) {
680
- if (!isEntitySet) {
681
- if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false") {
682
- selectionMode = SelectionMode.Multi;
683
- return compileBinding(ifElse(equal(bindingExpression("/editMode", "ui"), "Editable"), constant(selectionMode), constant("None")));
684
- } else {
685
- selectionMode = SelectionMode.None;
686
- }
687
- } else if (isEntitySet) {
688
- if (targetCapabilities.isDeletable) {
689
- selectionMode = SelectionMode.Multi;
690
- return selectionMode;
691
- } else {
692
- selectionMode = SelectionMode.None;
693
- }
694
- }
695
- } else if (!selectionMode || selectionMode === SelectionMode.Auto) {
692
+ if (selectionMode && selectionMode === SelectionMode.None && isDeleteButtonVisible) {
693
+ return compileBinding(ifElse(isDeleteButtonVisible, constant("Multi"), constant("None")));
694
+ }
695
+
696
+ if (!selectionMode || selectionMode === SelectionMode.Auto) {
696
697
  selectionMode = SelectionMode.Multi;
697
698
  }
698
699
 
@@ -703,16 +704,16 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
703
704
  aHiddenBindingExpressions = getUIHiddenExpForActionsRequiringContext(lineItemAnnotation, converterContext.getEntityType(), converterContext.getDataModelObjectPath(), isEntitySet);
704
705
  aVisibleBindingExpressions = getVisibleExpForCustomActionsRequiringContext(manifestActions); // No action requiring a context:
705
706
 
706
- if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0) {
707
+ if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 && isDeleteButtonVisible) {
707
708
  if (!isEntitySet) {
708
709
  if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false") {
709
- return compileBinding(ifElse(equal(bindingExpression("/editMode", "ui"), "Editable"), constant(selectionMode), constant(SelectionMode.None)));
710
+ return compileBinding(ifElse(and(equal(bindingExpression("/editMode", "ui"), "Editable"), isDeleteButtonVisible), constant(selectionMode), constant(SelectionMode.None)));
710
711
  } else {
711
712
  return SelectionMode.None;
712
713
  } // EntitySet deletable:
713
714
 
714
- } else if (targetCapabilities.isDeletable) {
715
- return selectionMode; // EntitySet not deletable:
715
+ } else if (targetCapabilities.isDeletable && isDeleteButtonVisible) {
716
+ return compileBinding(ifElse(isDeleteButtonVisible, constant(selectionMode), constant("None"))); // EntitySet not deletable:
716
717
  } else {
717
718
  return SelectionMode.None;
718
719
  } // There are actions requiring a context:
@@ -817,7 +818,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
817
818
 
818
819
  var navigation = (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create) || (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.detail); // cross-app
819
820
 
820
- if (navigation !== null && navigation !== void 0 && navigation.outbound && navigation.outboundDetail && navigationSettings !== null && navigationSettings !== void 0 && navigationSettings.create) {
821
+ if (isExternalCreateConfigured(navigationSettings) && navigation) {
821
822
  return {
822
823
  mode: "External",
823
824
  outbound: navigation.outbound,
@@ -997,10 +998,28 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
997
998
  var groupPath = property.name ? _sliceAtSlash(property.name, true, false) : undefined;
998
999
  var isGroup = groupPath != property.name;
999
1000
  var isDataPointFakeProperty = name.indexOf("@com.sap.vocabularies.UI.v1.DataPoint") > -1;
1001
+
1002
+ var exportType = _getExportDataType(property.type);
1003
+
1004
+ var sDateInputFormat = property.type === "Edm.Date" ? "YYYY-MM-DD" : undefined;
1005
+ var dataType = getDataFieldDataType(property);
1006
+ var propertyTypeConfig = !isDataPointFakeProperty ? getTypeConfig(property, dataType) : undefined;
1007
+ var oTypeConfig = !isDataPointFakeProperty ? {
1008
+ className: property.type || dataType,
1009
+ oFormatOptions: propertyTypeConfig.formatOptions,
1010
+ oConstraints: propertyTypeConfig.constraints
1011
+ } : undefined;
1000
1012
  var exportSettings = isDataPointFakeProperty ? {
1001
1013
  template: getTargetValueOnDataPoint(property)
1002
- } : undefined;
1003
- return {
1014
+ } : {
1015
+ type: exportType,
1016
+ inputFormat: sDateInputFormat,
1017
+ scale: property.scale,
1018
+ delimiter: property.type === "Edm.Int64" ? true : false,
1019
+ trueValue: property.type === "Edm.Boolean" ? "Yes" : undefined,
1020
+ falseValue: property.type === "Edm.Boolean" ? "No" : undefined
1021
+ };
1022
+ var oColumn = {
1004
1023
  key: key,
1005
1024
  isGroupable: !isDataPointFakeProperty && !isHidden ? aggregationHelper.isPropertyGroupable(property) : false,
1006
1025
  type: ColumnType.Annotation,
@@ -1017,8 +1036,20 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1017
1036
  isKey: property.isKey,
1018
1037
  isDataPointFakeTargetProperty: isDataPointFakeProperty,
1019
1038
  exportSettings: exportSettings,
1020
- caseSensitive: isFilteringCaseSensitive(converterContext)
1039
+ caseSensitive: isFilteringCaseSensitive(converterContext),
1040
+ typeConfig: oTypeConfig,
1041
+ visualSettings: isDataPointFakeProperty ? {
1042
+ widthCalculation: null
1043
+ } : undefined
1021
1044
  };
1045
+
1046
+ var sTooltip = _getTooltip(property);
1047
+
1048
+ if (sTooltip) {
1049
+ oColumn.tooltip = sTooltip;
1050
+ }
1051
+
1052
+ return oColumn;
1022
1053
  };
1023
1054
  /**
1024
1055
  * Returns Boolean true for valid columns, false for invalid columns.
@@ -1051,8 +1082,90 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1051
1082
  }
1052
1083
  };
1053
1084
  /**
1054
- * Returns label for property and dataField.
1055
- * @param {DataFieldAbstractTypes | Property} property Entity type property or DataField defined in the annotations
1085
+ * Returns the binding expression to evaluate the visibility of a DataField or DataPoint annotation.
1086
+ *
1087
+ * SAP Fiori elements will evaluate either the UI.Hidden annotation defined on the annotation itself or on the target property.
1088
+ *
1089
+ * @param {DataModelObjectPath} dataFieldModelPath The metapath referring to the annotation that is evaluated by SAP Fiori elements.
1090
+ * @param {FieldFormatOptions} [formatOptions] FormatOptions is optional, used to check if the analytic table has GroupHeader expanded.
1091
+ * @param {boolean} [returnExpression] ReturnExpression optional.
1092
+ * @returns {BindingExpression<string>} An expression that you can bind to the UI.
1093
+ */
1094
+
1095
+
1096
+ var _getVisibleExpression = function (dataFieldModelPath, formatOptions, returnExpression) {
1097
+ var _targetObject$Target, _targetObject$Target$, _targetObject$annotat, _targetObject$annotat2, _propertyValue$annota, _propertyValue$annota2;
1098
+
1099
+ var targetObject = dataFieldModelPath.targetObject;
1100
+ var propertyValue;
1101
+
1102
+ if (targetObject) {
1103
+ switch (targetObject.$Type) {
1104
+ case "com.sap.vocabularies.UI.v1.DataField":
1105
+ case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
1106
+ case "com.sap.vocabularies.UI.v1.DataFieldWithNavigationPath":
1107
+ case "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation":
1108
+ case "com.sap.vocabularies.UI.v1.DataFieldWithAction":
1109
+ case "com.sap.vocabularies.UI.v1.DataPointType":
1110
+ propertyValue = targetObject.Value.$target;
1111
+ break;
1112
+
1113
+ case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
1114
+ // if it is a DataFieldForAnnotation pointing to a DataPoint we look at the dataPoint's value
1115
+ if ((targetObject === null || targetObject === void 0 ? void 0 : (_targetObject$Target = targetObject.Target) === null || _targetObject$Target === void 0 ? void 0 : (_targetObject$Target$ = _targetObject$Target.$target) === null || _targetObject$Target$ === void 0 ? void 0 : _targetObject$Target$.$Type) === "com.sap.vocabularies.UI.v1.DataPointType") {
1116
+ var _targetObject$Target$2;
1117
+
1118
+ propertyValue = (_targetObject$Target$2 = targetObject.Target.$target) === null || _targetObject$Target$2 === void 0 ? void 0 : _targetObject$Target$2.Value.$target;
1119
+ }
1120
+
1121
+ break;
1122
+
1123
+ case "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation":
1124
+ case "com.sap.vocabularies.UI.v1.DataFieldForAction":
1125
+ default:
1126
+ propertyValue = undefined;
1127
+ }
1128
+ }
1129
+
1130
+ var isAnalyticalGroupHeaderExpanded = formatOptions !== null && formatOptions !== void 0 && formatOptions.isAnalytics ? UI.IsExpanded : constant(false);
1131
+ var isAnalyticalLeaf = formatOptions !== null && formatOptions !== void 0 && formatOptions.isAnalytics ? equal(UI.NodeLevel, 0) : constant(false); // A data field is visible if:
1132
+ // - the UI.Hidden expression in the original annotation does not evaluate to 'true'
1133
+ // - the UI.Hidden expression in the target property does not evaluate to 'true'
1134
+ // - in case of Analytics it's not visible for an expanded GroupHeader
1135
+
1136
+ var expression = and.apply(void 0, [not(equal(annotationExpression(targetObject === null || targetObject === void 0 ? void 0 : (_targetObject$annotat = targetObject.annotations) === null || _targetObject$annotat === void 0 ? void 0 : (_targetObject$annotat2 = _targetObject$annotat.UI) === null || _targetObject$annotat2 === void 0 ? void 0 : _targetObject$annotat2.Hidden), true)), ifElse(!!propertyValue, propertyValue && not(equal(annotationExpression((_propertyValue$annota = propertyValue.annotations) === null || _propertyValue$annota === void 0 ? void 0 : (_propertyValue$annota2 = _propertyValue$annota.UI) === null || _propertyValue$annota2 === void 0 ? void 0 : _propertyValue$annota2.Hidden), true)), true), or(not(isAnalyticalGroupHeaderExpanded), isAnalyticalLeaf)]);
1137
+ return returnExpression ? expression : compileBinding(expression);
1138
+ };
1139
+ /**
1140
+ * Returns hidden binding expressions for a field group.
1141
+ * @param {DataFieldAbstractTypes} dataFieldGroup DataField defined in the annotations
1142
+ * @param {FieldFormatOptions} [fieldFormatOptions] FormatOptions is optional, used to check if the analytic table has GroupHeader expanded.
1143
+ * @returns {BindingExpression<string>} Compile binding of field group expressions.
1144
+ * @private
1145
+ */
1146
+
1147
+
1148
+ _exports._getVisibleExpression = _getVisibleExpression;
1149
+
1150
+ var _getFieldGroupHiddenExpressions = function (dataFieldGroup, fieldFormatOptions) {
1151
+ var _dataFieldGroup$Targe, _dataFieldGroup$Targe2;
1152
+
1153
+ var aFieldGroupHiddenExpressions = [];
1154
+
1155
+ if (dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_dataFieldGroup$Targe = dataFieldGroup.Target) === null || _dataFieldGroup$Targe === void 0 ? void 0 : (_dataFieldGroup$Targe2 = _dataFieldGroup$Targe.$target) === null || _dataFieldGroup$Targe2 === void 0 ? void 0 : _dataFieldGroup$Targe2.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1156
+ var _dataFieldGroup$Targe3;
1157
+
1158
+ (_dataFieldGroup$Targe3 = dataFieldGroup.Target.$target.Data) === null || _dataFieldGroup$Targe3 === void 0 ? void 0 : _dataFieldGroup$Targe3.forEach(function (innerDataField) {
1159
+ aFieldGroupHiddenExpressions.push(_getVisibleExpression({
1160
+ targetObject: innerDataField
1161
+ }, fieldFormatOptions, true));
1162
+ });
1163
+ return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aFieldGroupHiddenExpressions)), constant(true), constant(false)));
1164
+ }
1165
+ };
1166
+ /**
1167
+ * Returns the label for the property and dataField.
1168
+ * @param {DataFieldAbstractTypes | Property} [property] Property or DataField defined in the annotations
1056
1169
  * @param isGroup
1057
1170
  * @returns {string} Label of the property or DataField
1058
1171
  * @private
@@ -1098,6 +1211,29 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1098
1211
  return compileBinding(annotationExpression((_property$Label4 = property.Label) === null || _property$Label4 === void 0 ? void 0 : _property$Label4.valueOf()));
1099
1212
  }
1100
1213
  };
1214
+
1215
+ var _getTooltip = function (source) {
1216
+ if (!source) {
1217
+ return undefined;
1218
+ }
1219
+
1220
+ if (isProperty(source)) {
1221
+ var _source$annotations$C;
1222
+
1223
+ return (_source$annotations$C = source.annotations.Common) !== null && _source$annotations$C !== void 0 && _source$annotations$C.QuickInfo ? compileBinding(annotationExpression(source.annotations.Common.QuickInfo.valueOf())) : undefined;
1224
+ } else if (isDataFieldTypes(source)) {
1225
+ var _source$Value, _source$Value$$target, _source$Value$$target2, _source$Value$$target3;
1226
+
1227
+ return (_source$Value = source.Value) !== null && _source$Value !== void 0 && (_source$Value$$target = _source$Value.$target) !== null && _source$Value$$target !== void 0 && (_source$Value$$target2 = _source$Value$$target.annotations) !== null && _source$Value$$target2 !== void 0 && (_source$Value$$target3 = _source$Value$$target2.Common) !== null && _source$Value$$target3 !== void 0 && _source$Value$$target3.QuickInfo ? compileBinding(annotationExpression(source.Value.$target.annotations.Common.QuickInfo.valueOf())) : undefined;
1228
+ } else if (source.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
1229
+ var _source$Target, _datapointTarget$Valu, _datapointTarget$Valu2, _datapointTarget$Valu3, _datapointTarget$Valu4;
1230
+
1231
+ var datapointTarget = (_source$Target = source.Target) === null || _source$Target === void 0 ? void 0 : _source$Target.$target;
1232
+ return datapointTarget !== null && datapointTarget !== void 0 && (_datapointTarget$Valu = datapointTarget.Value) !== null && _datapointTarget$Valu !== void 0 && (_datapointTarget$Valu2 = _datapointTarget$Valu.$target) !== null && _datapointTarget$Valu2 !== void 0 && (_datapointTarget$Valu3 = _datapointTarget$Valu2.annotations) !== null && _datapointTarget$Valu3 !== void 0 && (_datapointTarget$Valu4 = _datapointTarget$Valu3.Common) !== null && _datapointTarget$Valu4 !== void 0 && _datapointTarget$Valu4.QuickInfo ? compileBinding(annotationExpression(datapointTarget.Value.$target.annotations.Common.QuickInfo.valueOf())) : undefined;
1233
+ } else {
1234
+ return undefined;
1235
+ }
1236
+ };
1101
1237
  /**
1102
1238
  * Creates a PropertyInfo for each identified property consumed by a LineItem.
1103
1239
  *
@@ -1188,6 +1324,25 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1188
1324
  return KeyHelper.generateKeyFromDataField(dataField);
1189
1325
  }
1190
1326
  };
1327
+ /**
1328
+ * Determines if the data field labels have to be displayed in the table.
1329
+ * @param {string} fieldGroupName The `DataField` name being processed.
1330
+ * @param {string} visualizationPath
1331
+ * @param {ConverterContext} converterContext
1332
+ * @returns {boolean} `showDataFieldsLabel` value from the manifest
1333
+ * @private
1334
+ */
1335
+
1336
+
1337
+ var _getShowDataFieldsLabel = function (fieldGroupName, visualizationPath, converterContext) {
1338
+ var _converterContext$get2;
1339
+
1340
+ var oColumns = (_converterContext$get2 = converterContext.getManifestControlConfiguration(visualizationPath)) === null || _converterContext$get2 === void 0 ? void 0 : _converterContext$get2.columns;
1341
+ var aColumnKeys = oColumns && Object.keys(oColumns);
1342
+ return aColumnKeys && !!aColumnKeys.find(function (key) {
1343
+ return key === fieldGroupName && oColumns[key].showDataFieldsLabel;
1344
+ });
1345
+ };
1191
1346
  /**
1192
1347
  * Determines the relative path of the property with respect to the root entity.
1193
1348
  * @param dataField The `DataField` being processed.
@@ -1269,9 +1424,9 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1269
1424
 
1270
1425
 
1271
1426
  var isFilteringCaseSensitive = function (converterContext) {
1272
- var _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6;
1427
+ var _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
1273
1428
 
1274
- var filterFunctions = ((_converterContext$get2 = converterContext.getEntitySet()) === null || _converterContext$get2 === void 0 ? void 0 : (_converterContext$get3 = _converterContext$get2.annotations) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.Capabilities) === null || _converterContext$get4 === void 0 ? void 0 : _converterContext$get4.FilterFunctions) || ((_converterContext$get5 = converterContext.getEntityContainer().annotations) === null || _converterContext$get5 === void 0 ? void 0 : (_converterContext$get6 = _converterContext$get5.Capabilities) === null || _converterContext$get6 === void 0 ? void 0 : _converterContext$get6.FilterFunctions);
1429
+ var filterFunctions = ((_converterContext$get3 = converterContext.getEntitySet()) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.annotations) === null || _converterContext$get4 === void 0 ? void 0 : (_converterContext$get5 = _converterContext$get4.Capabilities) === null || _converterContext$get5 === void 0 ? void 0 : _converterContext$get5.FilterFunctions) || ((_converterContext$get6 = converterContext.getEntityContainer().annotations) === null || _converterContext$get6 === void 0 ? void 0 : (_converterContext$get7 = _converterContext$get6.Capabilities) === null || _converterContext$get7 === void 0 ? void 0 : _converterContext$get7.FilterFunctions);
1275
1430
  return Array.isArray(filterFunctions) ? filterFunctions.indexOf("tolower") === -1 : true;
1276
1431
  };
1277
1432
  /**
@@ -1332,22 +1487,19 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1332
1487
 
1333
1488
 
1334
1489
  var getColumnsFromAnnotations = function (lineItemAnnotation, visualizationPath, converterContext) {
1335
- var _map, _converterContext$get7, _converterContext$get8, _converterContext$get9, _converterContext$get10, _converterContext$get11, _tableManifestSetting2;
1490
+ var _tableManifestSetting2;
1336
1491
 
1337
1492
  var entityType = converterContext.getAnnotationEntityType(lineItemAnnotation),
1338
1493
  annotationColumns = [],
1339
1494
  columnsToBeCreated = {},
1340
- nonSortableColumns = (_map = (_converterContext$get7 = converterContext.getEntitySet()) === null || _converterContext$get7 === void 0 ? void 0 : (_converterContext$get8 = _converterContext$get7.annotations) === null || _converterContext$get8 === void 0 ? void 0 : (_converterContext$get9 = _converterContext$get8.Capabilities) === null || _converterContext$get9 === void 0 ? void 0 : (_converterContext$get10 = _converterContext$get9.SortRestrictions) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.NonSortableProperties) === null || _converterContext$get11 === void 0 ? void 0 : _converterContext$get11.map(function (property) {
1341
- return property.value;
1342
- })) !== null && _map !== void 0 ? _map : [],
1495
+ nonSortableColumns = getNonSortablePropertiesRestrictions(converterContext.getEntitySet()),
1343
1496
  tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath),
1344
1497
  tableType = (tableManifestSettings === null || tableManifestSettings === void 0 ? void 0 : (_tableManifestSetting2 = tableManifestSettings.tableSettings) === null || _tableManifestSetting2 === void 0 ? void 0 : _tableManifestSetting2.type) || "ResponsiveTable";
1345
1498
  var semanticKeys = converterContext.getAnnotationsByTerm("Common", "com.sap.vocabularies.Common.v1.SemanticKey", [converterContext.getEntityType()])[0];
1346
1499
 
1347
1500
  if (lineItemAnnotation) {
1348
- // Get columns from the LineItem Annotation
1349
1501
  lineItemAnnotation.forEach(function (lineItem) {
1350
- var _lineItem$Value, _lineItem$Value$$targ, _lineItem$annotations, _lineItem$annotations2, _lineItem$annotations3;
1502
+ var _lineItem$Value, _lineItem$Value$$targ, _lineItem$Target, _lineItem$Target$$tar, _FE, _lineItem$annotations, _lineItem$annotations2, _lineItem$annotations3;
1351
1503
 
1352
1504
  if (!_isValidColumn(lineItem)) {
1353
1505
  return;
@@ -1370,30 +1522,87 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1370
1522
 
1371
1523
  var name = _getAnnotationColumnName(lineItem);
1372
1524
 
1373
- annotationColumns.push({
1525
+ var isFieldGroupColumn = groupPath.indexOf("@com.sap.vocabularies.UI.v1.FieldGroup") > -1;
1526
+ var showDataFieldsLabel = isFieldGroupColumn ? _getShowDataFieldsLabel(name, visualizationPath, converterContext) : false;
1527
+ var dataType = getDataFieldDataType(lineItem);
1528
+ var sDateInputFormat = dataType === "Edm.Date" ? "YYYY-MM-DD" : undefined;
1529
+
1530
+ var formatOptions = _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), getDefaultDraftIndicatorForColumn(name, semanticKeys));
1531
+
1532
+ var fieldGroupHiddenExpressions;
1533
+
1534
+ if (lineItem.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_lineItem$Target = lineItem.Target) === null || _lineItem$Target === void 0 ? void 0 : (_lineItem$Target$$tar = _lineItem$Target.$target) === null || _lineItem$Target$$tar === void 0 ? void 0 : _lineItem$Target$$tar.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
1535
+ fieldGroupHiddenExpressions = _getFieldGroupHiddenExpressions(lineItem, formatOptions);
1536
+ }
1537
+
1538
+ var exportSettings = {
1539
+ template: relatedPropertiesInfo.exportSettingsTemplate,
1540
+ wrap: relatedPropertiesInfo.exportSettingsWrapping,
1541
+ type: dataType ? _getExportDataType(dataType, relatedPropertyNames.length > 1) : undefined,
1542
+ inputFormat: sDateInputFormat,
1543
+ delimiter: dataType === "Edm.Int64" ? true : false,
1544
+ trueValue: dataType === "Edm.Boolean" ? "Yes" : undefined,
1545
+ falseValue: dataType === "Edm.Boolean" ? "No" : undefined
1546
+ };
1547
+ var propertyTypeConfig = dataType && getTypeConfig(lineItem, dataType);
1548
+ var oTypeConfig = propertyTypeConfig ? {
1549
+ className: dataType,
1550
+ oFormatOptions: _objectSpread(_objectSpread({}, formatOptions), propertyTypeConfig.formatOptions),
1551
+ oConstraints: propertyTypeConfig.constraints
1552
+ } : undefined;
1553
+ var visualSettings = {};
1554
+
1555
+ if (relatedPropertiesInfo.visualSettingsToBeExcluded) {
1556
+ // In case of text arrangement annotation with display mode as text only, exclude text property from the width calculation
1557
+ visualSettings = {
1558
+ widthCalculation: {
1559
+ excludeProperties: "Property::" + relatedPropertiesInfo.visualSettingsToBeExcluded
1560
+ }
1561
+ };
1562
+ } else if (!dataType || !oTypeConfig) {
1563
+ // for charts
1564
+ visualSettings.widthCalculation = null;
1565
+ } // TODO: For situation POC - increase width of the column with the situations indicator - works for the situations demo app only!
1566
+ // Might be a good idea to move the complete column width determination to the converter, that would allow us to widen the columns as needed. This workaround only deals with Date columns.
1567
+
1568
+
1569
+ var _getDefaultDraftIndic = getDefaultDraftIndicatorForColumn(name, semanticKeys),
1570
+ hasDraftIndicator = _getDefaultDraftIndic.hasDraftIndicator;
1571
+
1572
+ var widthOverride = (_FE = converterContext.getEntityType().annotations.FE) !== null && _FE !== void 0 && _FE.Situations && hasDraftIndicator && lineItem.$Type === "com.sap.vocabularies.UI.v1.DataField" && lineItem.Value.$target.type === "Edm.Date" ? "11em" : undefined;
1573
+ var oColumn = {
1374
1574
  key: KeyHelper.generateKeyFromDataField(lineItem),
1375
1575
  type: ColumnType.Annotation,
1376
1576
  label: sLabel,
1377
1577
  groupLabel: isGroup ? _getLabel(lineItem) : null,
1378
1578
  group: isGroup ? groupPath : null,
1579
+ FieldGroupHiddenExpressions: fieldGroupHiddenExpressions,
1379
1580
  annotationPath: converterContext.getEntitySetBasedAnnotationPath(lineItem.fullyQualifiedName),
1380
1581
  semanticObjectPath: semanticObjectAnnotationPath,
1381
1582
  availability: isDataFieldAlwaysHidden(lineItem) ? AvailabilityType.Hidden : AvailabilityType.Default,
1382
1583
  name: name,
1584
+ showDataFieldsLabel: showDataFieldsLabel,
1383
1585
  relativePath: relativePath,
1384
1586
  sortable: _isColumnSortable(lineItem, relativePath, nonSortableColumns),
1385
1587
  propertyInfos: relatedPropertyNames.length > 0 ? relatedPropertyNames : undefined,
1386
1588
  additionalPropertyInfos: additionalPropertyNames.length > 0 ? additionalPropertyNames : undefined,
1387
- exportSettings: {
1388
- template: relatedPropertiesInfo.exportSettingsTemplate,
1389
- wrap: relatedPropertiesInfo.exportSettingsWrapping
1390
- },
1391
- width: ((_lineItem$annotations = lineItem.annotations) === null || _lineItem$annotations === void 0 ? void 0 : (_lineItem$annotations2 = _lineItem$annotations.HTML5) === null || _lineItem$annotations2 === void 0 ? void 0 : (_lineItem$annotations3 = _lineItem$annotations2.CssDefaults) === null || _lineItem$annotations3 === void 0 ? void 0 : _lineItem$annotations3.width) || undefined,
1589
+ exportSettings: exportSettings,
1590
+ width: ((_lineItem$annotations = lineItem.annotations) === null || _lineItem$annotations === void 0 ? void 0 : (_lineItem$annotations2 = _lineItem$annotations.HTML5) === null || _lineItem$annotations2 === void 0 ? void 0 : (_lineItem$annotations3 = _lineItem$annotations2.CssDefaults) === null || _lineItem$annotations3 === void 0 ? void 0 : _lineItem$annotations3.width) || widthOverride || undefined,
1392
1591
  isNavigable: true,
1393
- formatOptions: _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), getDefaultDraftIndicatorForColumn(name, semanticKeys)),
1592
+ formatOptions: formatOptions,
1394
1593
  exportContactProperty: relatedPropertiesInfo.exportSettingsContactProperty,
1395
- caseSensitive: isFilteringCaseSensitive(converterContext)
1396
- }); // Collect information of related columns to be created.
1594
+ caseSensitive: isFilteringCaseSensitive(converterContext),
1595
+ typeConfig: oTypeConfig,
1596
+ visualSettings: visualSettings
1597
+ };
1598
+
1599
+ var sTooltip = _getTooltip(lineItem);
1600
+
1601
+ if (sTooltip) {
1602
+ oColumn.tooltip = sTooltip;
1603
+ }
1604
+
1605
+ annotationColumns.push(oColumn); // Collect information of related columns to be created.
1397
1606
 
1398
1607
  relatedPropertyNames.forEach(function (name) {
1399
1608
  columnsToBeCreated[name] = relatedPropertiesInfo.properties[name];
@@ -1492,8 +1701,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1492
1701
  var internalColumns = {};
1493
1702
 
1494
1703
  var _loop = function (key) {
1495
- var _manifestColumn$posit;
1496
-
1497
1704
  var manifestColumn = columns[key]; // To identify the annotation column property overwrite via manifest use-case.
1498
1705
 
1499
1706
  var isAnnotationColumn = annotationColumns.some(function (column) {
@@ -1503,32 +1710,41 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1503
1710
 
1504
1711
  var propertyInfos = _getPropertyNames(manifestColumn.properties, annotationColumns, converterContext, entityType);
1505
1712
 
1506
- internalColumns[key] = {
1507
- key: key,
1508
- id: "CustomColumn::" + key,
1509
- name: "CustomColumn::" + key,
1510
- header: manifestColumn.header,
1511
- width: manifestColumn.width || undefined,
1512
- horizontalAlign: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.horizontalAlign, HorizontalAlign.Begin, isAnnotationColumn),
1513
- type: manifestColumn.type === "Slot" ? ColumnType.Slot : ColumnType.Default,
1514
- availability: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.availability, AvailabilityType.Default, isAnnotationColumn),
1515
- template: manifestColumn.template || "undefined",
1516
- position: {
1517
- anchor: (_manifestColumn$posit = manifestColumn.position) === null || _manifestColumn$posit === void 0 ? void 0 : _manifestColumn$posit.anchor,
1518
- placement: manifestColumn.position === undefined ? Placement.After : manifestColumn.position.placement
1519
- },
1520
- isNavigable: isAnnotationColumn ? undefined : isActionNavigable(manifestColumn, navigationSettings, true),
1521
- settings: manifestColumn.settings,
1522
- sortable: false,
1523
- propertyInfos: propertyInfos,
1524
- formatOptions: _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), manifestColumn.formatOptions),
1525
- exportSettings: {
1526
- template: propertyInfos ? _appendCustomTemplate(propertyInfos) : undefined,
1527
- fieldLabel: propertyInfos ? manifestColumn.header : undefined,
1528
- wrap: propertyInfos && propertyInfos.length > 1 ? true : false
1529
- },
1530
- caseSensitive: isFilteringCaseSensitive(converterContext)
1531
- };
1713
+ if (!(manifestColumn !== null && manifestColumn !== void 0 && manifestColumn.template) && !isAnnotationColumn) {
1714
+ var _IssueCategoryType$An;
1715
+
1716
+ var Message = "The annotation column '" + key + "' referenced in the manifest is not found";
1717
+ converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, Message, IssueCategoryType, IssueCategoryType === null || IssueCategoryType === void 0 ? void 0 : (_IssueCategoryType$An = IssueCategoryType.AnnotationColumns) === null || _IssueCategoryType$An === void 0 ? void 0 : _IssueCategoryType$An.InvalidKey);
1718
+ } else {
1719
+ var _manifestColumn$posit;
1720
+
1721
+ internalColumns[key] = {
1722
+ key: key,
1723
+ id: "CustomColumn::" + key,
1724
+ name: "CustomColumn::" + key,
1725
+ header: manifestColumn.header,
1726
+ width: manifestColumn.width || undefined,
1727
+ horizontalAlign: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.horizontalAlign, HorizontalAlign.Begin, isAnnotationColumn),
1728
+ type: manifestColumn.type === "Slot" ? ColumnType.Slot : ColumnType.Default,
1729
+ availability: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.availability, AvailabilityType.Default, isAnnotationColumn),
1730
+ template: manifestColumn.template || "undefined",
1731
+ position: {
1732
+ anchor: (_manifestColumn$posit = manifestColumn.position) === null || _manifestColumn$posit === void 0 ? void 0 : _manifestColumn$posit.anchor,
1733
+ placement: manifestColumn.position === undefined ? Placement.After : manifestColumn.position.placement
1734
+ },
1735
+ isNavigable: isAnnotationColumn ? undefined : isActionNavigable(manifestColumn, navigationSettings, true),
1736
+ settings: manifestColumn.settings,
1737
+ sortable: false,
1738
+ propertyInfos: propertyInfos,
1739
+ formatOptions: _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), manifestColumn.formatOptions),
1740
+ exportSettings: {
1741
+ template: propertyInfos ? _appendCustomTemplate(propertyInfos) : undefined,
1742
+ fieldLabel: propertyInfos ? manifestColumn.header : undefined,
1743
+ wrap: propertyInfos && propertyInfos.length > 1 ? true : false
1744
+ },
1745
+ caseSensitive: isFilteringCaseSensitive(converterContext)
1746
+ };
1747
+ }
1532
1748
  };
1533
1749
 
1534
1750
  for (var key in columns) {
@@ -1600,205 +1816,20 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1600
1816
  return undefined;
1601
1817
  }
1602
1818
  /**
1603
- * Function to determine the visibility of the Delete button.
1604
- *
1605
- * @param converterContext The instance of the converter context
1606
- * @param navigationPath Path to the navigation entity
1607
- * @param isTargetDeletable Flag which determines whether a target is deletable
1608
- * @param viewConfiguration The instance of the configuration for the view path
1609
- * @returns {BindingExpression<boolean>} The binding expression for the Delete button
1610
- */
1611
-
1612
-
1613
- _exports.getP13nMode = getP13nMode;
1614
-
1615
- function getDeleteVisible(converterContext, navigationPath, isTargetDeletable, viewConfiguration) {
1616
- var _currentEntitySet$ann;
1617
-
1618
- var currentEntitySet = converterContext.getEntitySet();
1619
- var dataModelObjectPath = converterContext.getDataModelObjectPath();
1620
- var visitedNavigationPaths = dataModelObjectPath.navigationProperties.map(function (navProp) {
1621
- return navProp.name;
1622
- });
1623
- var isDeleteHiddenExpression = currentEntitySet ? annotationExpression((currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann === void 0 ? void 0 : _currentEntitySet$ann.DeleteHidden) || false, visitedNavigationPaths, undefined, function (path) {
1624
- return singletonPathVisitor(path, converterContext, visitedNavigationPaths);
1625
- }) : constant(false);
1626
- var isDeleteHidden = compileBinding(isDeleteHiddenExpression);
1627
- var isParentDeletable, parentEntitySetDeletable;
1628
-
1629
- if (converterContext.getTemplateType() === TemplateType.ObjectPage) {
1630
- isParentDeletable = isPathDeletable(converterContext.getDataModelObjectPath(), navigationPath);
1631
- parentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable) : isParentDeletable;
1632
- } //do not show case the delete button if parentEntitySetDeletable is false
1633
-
1634
-
1635
- if (parentEntitySetDeletable === "false") {
1636
- return false;
1637
- } else if (parentEntitySetDeletable && isDeleteHidden !== "true") {
1638
- //Delete Hidden in case of true and path based
1639
- if (isDeleteHidden && isDeleteHidden !== "false") {
1640
- return "{= !$" + isDeleteHidden + " && ${ui>/editMode} === 'Editable'}";
1641
- } else {
1642
- return "{= ${ui>/editMode} === 'Editable'}";
1643
- }
1644
- } else if (isDeleteHidden === "true" || !isTargetDeletable || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) || converterContext.getTemplateType() === TemplateType.AnalyticalListPage) {
1645
- return false;
1646
- } else if (converterContext.getTemplateType() !== TemplateType.ListReport) {
1647
- if (isDeleteHidden && isDeleteHidden === "false") {
1648
- return "{= !$" + isDeleteHidden + " && ${ui>/editMode} === 'Editable'}";
1649
- } else {
1650
- return "{= ${ui>/editMode} === 'Editable'}";
1651
- }
1652
- } else if (isBinding(isDeleteHiddenExpression)) {
1653
- // UI.DeleteHidden annotation points to a path
1654
- return compileBinding(not(isDeleteHiddenExpression));
1655
- } else {
1656
- return true;
1657
- }
1658
- }
1659
- /**
1660
- * Returns the enablement for the 'Mass Edit' button
1661
- *
1662
- * @param converterContext The converterContext
1663
- * @param bMassEditVisible The visibility of the 'Mass Edit' button
1664
- * @returns {*} Expression or Boolean value for the enablement of the 'Mass Edit' button
1665
- */
1666
-
1667
-
1668
- _exports.getDeleteVisible = getDeleteVisible;
1669
-
1670
- function getEnablementMassEdit(converterContext, bMassEditVisible) {
1671
- if (bMassEditVisible) {
1672
- var isParentUpdatable = isPathUpdatable(converterContext.getDataModelObjectPath(), undefined, true); //when updatable is path based and pointing to current entity set property, that case is handled in table helper and runtime
1673
-
1674
- if (isParentUpdatable !== null && isParentUpdatable !== void 0 && isParentUpdatable.currentEntityRestriction) {
1675
- return false;
1676
- }
1677
-
1678
- var oExpression = compileBinding(isParentUpdatable);
1679
- return isParentUpdatable ? "{= %{internal>numberOfSelectedContexts} >= 2 && " + compileBinding(isParentUpdatable, oExpression) + "}" : false;
1680
- }
1681
-
1682
- return false;
1683
- }
1684
- /**
1685
- * Returns the visibility for the 'Mass Edit' button
1686
- *
1687
- * @param converterContext The converterContext
1688
- * @param tableManifestConfiguration The manifest configuration for the table
1689
- * @param targetCapabilities The target capability restrictions for the table
1690
- * @param selectionMode The selection mode for the table
1691
- * @returns {*} Expression or Boolean value for the visibility of the 'Mass Edit' button
1692
- */
1693
-
1694
-
1695
- _exports.getEnablementMassEdit = getEnablementMassEdit;
1696
-
1697
- function getVisibilityMassEdit(converterContext, tableManifestConfiguration, targetCapabilities, selectionMode) {
1698
- var _entitySet$annotation, _entitySet$annotation2;
1699
-
1700
- var entitySet = converterContext.getEntitySet(),
1701
- bUpdateHidden = entitySet && (entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation = entitySet.annotations.UI) === null || _entitySet$annotation === void 0 ? void 0 : (_entitySet$annotation2 = _entitySet$annotation.UpdateHidden) === null || _entitySet$annotation2 === void 0 ? void 0 : _entitySet$annotation2.valueOf()),
1702
- bMassEditEnabled = (tableManifestConfiguration === null || tableManifestConfiguration === void 0 ? void 0 : tableManifestConfiguration.enableMassEdit) || false,
1703
- iSelectionLimit = tableManifestConfiguration === null || tableManifestConfiguration === void 0 ? void 0 : tableManifestConfiguration.selectionLimit;
1704
- var bMassEditVisible = true;
1705
-
1706
- if (selectionMode && selectionMode === "Single" || iSelectionLimit && iSelectionLimit < 2) {
1707
- bMassEditVisible = false;
1708
- } else if (selectionMode && (selectionMode === "Auto" || selectionMode === "None")) {
1709
- bMassEditVisible = true;
1710
- }
1711
-
1712
- if ((targetCapabilities === null || targetCapabilities === void 0 ? void 0 : targetCapabilities.isUpdatable) !== false && bMassEditVisible && bMassEditEnabled) {
1713
- if (bUpdateHidden && typeof bUpdateHidden === "boolean") {
1714
- return !bUpdateHidden && converterContext.getTemplateType() === TemplateType.ObjectPage ? compileBinding(UI.IsEditable) : false;
1715
- } else if (bUpdateHidden && bUpdateHidden !== null && bUpdateHidden !== void 0 && bUpdateHidden.path) {
1716
- return converterContext.getTemplateType() === TemplateType.ObjectPage ? compileBinding(and(equal(UI.IsEditable, true), equal(annotationExpression(bUpdateHidden), false))) : false;
1717
- }
1718
-
1719
- return converterContext.getTemplateType() === TemplateType.ObjectPage ? compileBinding(UI.IsEditable) : false;
1720
- }
1721
-
1722
- return false;
1723
- }
1724
- /**
1725
- * Function to determine the visibility of the Create button.
1726
- *
1727
- * @param converterContext The instance of the converter context
1728
- * @param creationMode The mode used for creation
1729
- * @param isInsertable Annotation expression of InsertRestrictions.Insertable
1730
- * @param viewConfiguration The instance of the configuration for the view path
1731
- * @returns {Expression<boolean>} Expression or Boolean value of the 'UI.CreateHidden' annotation
1732
- */
1733
-
1734
-
1735
- _exports.getVisibilityMassEdit = getVisibilityMassEdit;
1736
-
1737
- function getCreateVisible(converterContext, creationMode, isInsertable, viewConfiguration) {
1738
- var _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _currentEntitySet$ann5, _converterContext$get12, _converterContext$get13, _converterContext$get14;
1739
-
1740
- var currentEntitySet = converterContext.getEntitySet();
1741
- var dataModelObjectPath = converterContext.getDataModelObjectPath();
1742
- var visitedNavigationPaths = dataModelObjectPath.navigationProperties.map(function (navProp) {
1743
- return navProp.name;
1744
- });
1745
- var isCreateHidden = currentEntitySet ? annotationExpression((currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann2 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann2 === void 0 ? void 0 : _currentEntitySet$ann2.CreateHidden) || false, visitedNavigationPaths, undefined, function (path) {
1746
- return singletonPathVisitor(path, converterContext, visitedNavigationPaths);
1747
- }) : constant(false); // if there is a custom new action the create button will be bound against this new action (instead of a POST action).
1748
- // The visibility of the create button then depends on the new action's OperationAvailable annotation (instead of the insertRestrictions):
1749
- // OperationAvailable = true or undefined -> create is visible
1750
- // OperationAvailable = false -> create is not visible
1751
-
1752
- var newActionName = currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann3 = currentEntitySet.annotations.Common) === null || _currentEntitySet$ann3 === void 0 ? void 0 : (_currentEntitySet$ann4 = _currentEntitySet$ann3.DraftRoot) === null || _currentEntitySet$ann4 === void 0 ? void 0 : (_currentEntitySet$ann5 = _currentEntitySet$ann4.NewAction) === null || _currentEntitySet$ann5 === void 0 ? void 0 : _currentEntitySet$ann5.toString();
1753
- var showCreateForNewAction = newActionName ? annotationExpression(converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get12 = converterContext.getEntityType().actions[newActionName].annotations) === null || _converterContext$get12 === void 0 ? void 0 : (_converterContext$get13 = _converterContext$get12.Core) === null || _converterContext$get13 === void 0 ? void 0 : (_converterContext$get14 = _converterContext$get13.OperationAvailable) === null || _converterContext$get14 === void 0 ? void 0 : _converterContext$get14.valueOf(), [], true, function (path) {
1754
- return singletonPathVisitor(path, converterContext, []);
1755
- }) : undefined; // - If it's statically not insertable -> create is not visible
1756
- // - If create is statically hidden -> create is not visible
1757
- // - If it's an ALP template -> create is not visible
1758
- // -
1759
- // - Otherwise
1760
- // - If the create mode is external -> create is visible
1761
- // - If we're on the list report ->
1762
- // - If UI.CreateHidden points to a property path -> provide a negated binding to this path
1763
- // - Otherwise, create is visible
1764
- // - Otherwise
1765
- // - This depends on the value of the the UI.IsEditable
1766
-
1767
- return ifElse(or(or(equal(showCreateForNewAction, false), and(isConstant(isInsertable), equal(isInsertable, false), equal(showCreateForNewAction, undefined))), isConstant(isCreateHidden) && equal(isCreateHidden, true), or(viewConfiguration ? converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) : false, converterContext.getTemplateType() === TemplateType.AnalyticalListPage)), false, ifElse(creationMode === "External", true, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, ifElse(isBinding(isCreateHidden), not(isCreateHidden), true), and(not(isCreateHidden), UI.IsEditable))));
1768
- }
1769
- /**
1770
- * Returns the visibility for the Paste button.
1819
+ * Returns a JSON string containing the sort conditions for the presentation variant.
1771
1820
  *
1772
1821
  * @param converterContext The instance of the converter context
1773
- * @param creationBehaviour The chosen behavior of creation
1774
- * @param isInsertable The expression which denotes insert restrictions
1775
- * @param pasteEnabledInManifest The flag which denotes the paste enablement status via manifest
1776
- * @param viewConfiguration The instance of the configuration for the view path
1777
- * @returns {Expression<boolean>} Expression or Boolean value of the UI.CreateHidden annotation
1778
- */
1779
-
1780
-
1781
- _exports.getCreateVisible = getCreateVisible;
1782
-
1783
- function getPasteEnabled(converterContext, creationBehaviour, isInsertable, pasteEnabledInManifest, viewConfiguration) {
1784
- // If create is not visible -> it's not enabled
1785
- // If create is visible ->
1786
- // If it's in the ListReport -> not enabled
1787
- // If it's insertable -> enabled
1788
- return ifElse(pasteEnabledInManifest && equal(getCreateVisible(converterContext, creationBehaviour.mode, isInsertable, viewConfiguration), true), converterContext.getTemplateType() === TemplateType.ObjectPage && isInsertable, false);
1789
- }
1790
- /**
1791
- * Returns a JSON string containing Presentation Variant sort conditions.
1792
- *
1793
1822
  * @param {PresentationVariantTypeTypes | undefined} presentationVariantAnnotation Presentation variant annotation
1794
- * @param columns Converter processed table columns
1795
- * @returns {string | undefined} Sort conditions for a Presentation variant.
1823
+ * @param columns Table columns processed by the converter
1824
+ * @returns {string | undefined} Sort conditions for a presentation variant.
1796
1825
  */
1797
1826
 
1798
1827
 
1799
- _exports.getPasteEnabled = getPasteEnabled;
1828
+ _exports.getP13nMode = getP13nMode;
1800
1829
 
1801
- function getSortConditions(presentationVariantAnnotation, columns) {
1830
+ function getSortConditions(converterContext, presentationVariantAnnotation, columns) {
1831
+ // Currently navigation property is not supported as sorter
1832
+ var nonSortableProperties = getNonSortablePropertiesRestrictions(converterContext.getEntitySet());
1802
1833
  var sortConditions;
1803
1834
 
1804
1835
  if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.SortOrder) {
@@ -1807,26 +1838,19 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1807
1838
  sorters: sorters
1808
1839
  };
1809
1840
  presentationVariantAnnotation.SortOrder.forEach(function (condition) {
1810
- var _condition$Property, _condition$Property$$, _sortColumn$propertyI, _sortColumn$propertyI2;
1841
+ var _conditionProperty$$t;
1811
1842
 
1812
- var propertyName = (_condition$Property = condition.Property) === null || _condition$Property === void 0 ? void 0 : (_condition$Property$$ = _condition$Property.$target) === null || _condition$Property$$ === void 0 ? void 0 : _condition$Property$$.name;
1813
- var sortColumn = columns.find(function (column) {
1814
- return column.name === propertyName;
1815
- });
1816
- sortColumn === null || sortColumn === void 0 ? void 0 : (_sortColumn$propertyI = sortColumn.propertyInfos) === null || _sortColumn$propertyI === void 0 ? void 0 : _sortColumn$propertyI.forEach(function (relatedPropertyName) {
1817
- // Complex PropertyInfo. Add each related property for sorting.
1818
- conditions.sorters.push({
1819
- name: relatedPropertyName,
1820
- descending: !!condition.Descending
1821
- });
1822
- });
1843
+ var conditionProperty = condition.Property;
1823
1844
 
1824
- if (!(sortColumn !== null && sortColumn !== void 0 && (_sortColumn$propertyI2 = sortColumn.propertyInfos) !== null && _sortColumn$propertyI2 !== void 0 && _sortColumn$propertyI2.length)) {
1825
- // Not a complex PropertyInfo. Consider the property itself for sorting.
1826
- conditions.sorters.push({
1827
- name: propertyName,
1828
- descending: !!condition.Descending
1829
- });
1845
+ if (conditionProperty && nonSortableProperties.indexOf((_conditionProperty$$t = conditionProperty.$target) === null || _conditionProperty$$t === void 0 ? void 0 : _conditionProperty$$t.name) === -1) {
1846
+ var infoName = convertPropertyPathsToInfoNames([conditionProperty], columns)[0];
1847
+
1848
+ if (infoName) {
1849
+ conditions.sorters.push({
1850
+ name: infoName,
1851
+ descending: !!condition.Descending
1852
+ });
1853
+ }
1830
1854
  }
1831
1855
  });
1832
1856
  sortConditions = conditions.sorters.length ? JSON.stringify(conditions) : undefined;
@@ -1914,50 +1938,41 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1914
1938
  }
1915
1939
 
1916
1940
  function getTableAnnotationConfiguration(lineItemAnnotation, visualizationPath, converterContext, tableManifestConfiguration, columns, presentationVariantAnnotation, viewConfiguration) {
1917
- var _converterContext$get15, _converterContext$get16, _converterContext$get17;
1941
+ var _converterContext$get8, _converterContext$get9, _converterContext$get10;
1918
1942
 
1919
1943
  // Need to get the target
1920
1944
  var _splitPath2 = splitPath(visualizationPath),
1921
1945
  navigationPropertyPath = _splitPath2.navigationPropertyPath;
1922
1946
 
1923
- var title = (_converterContext$get15 = converterContext.getDataModelObjectPath().targetEntityType.annotations) === null || _converterContext$get15 === void 0 ? void 0 : (_converterContext$get16 = _converterContext$get15.UI) === null || _converterContext$get16 === void 0 ? void 0 : (_converterContext$get17 = _converterContext$get16.HeaderInfo) === null || _converterContext$get17 === void 0 ? void 0 : _converterContext$get17.TypeNamePlural;
1947
+ var title = (_converterContext$get8 = converterContext.getDataModelObjectPath().targetEntityType.annotations) === null || _converterContext$get8 === void 0 ? void 0 : (_converterContext$get9 = _converterContext$get8.UI) === null || _converterContext$get9 === void 0 ? void 0 : (_converterContext$get10 = _converterContext$get9.HeaderInfo) === null || _converterContext$get10 === void 0 ? void 0 : _converterContext$get10.TypeNamePlural;
1924
1948
  var entitySet = converterContext.getDataModelObjectPath().targetEntitySet;
1925
1949
  var pageManifestSettings = converterContext.getManifestWrapper();
1926
1950
  var hasAbsolutePath = navigationPropertyPath.length === 0,
1927
1951
  p13nMode = getP13nMode(visualizationPath, converterContext, tableManifestConfiguration),
1928
1952
  id = navigationPropertyPath ? TableID(visualizationPath) : TableID(converterContext.getContextPath(), "LineItem");
1929
1953
  var targetCapabilities = getCapabilityRestriction(converterContext);
1930
- var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities);
1954
+ var navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
1955
+ var navigationSettings = pageManifestSettings.getNavigationConfiguration(navigationTargetPath);
1956
+ var standardActionsContext = generateStandardActionsContext(converterContext, navigationSettings, tableManifestConfiguration, viewConfiguration);
1957
+ var isDeleteButtonVisible = getDeleteVisibility(converterContext, standardActionsContext);
1958
+ var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, isDeleteButtonVisible);
1931
1959
  var threshold = navigationPropertyPath ? 10 : 30;
1932
1960
 
1933
1961
  if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.MaxItems) {
1934
1962
  threshold = presentationVariantAnnotation.MaxItems.valueOf();
1935
1963
  }
1936
1964
 
1937
- var navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
1938
- var navigationSettings = pageManifestSettings.getNavigationConfiguration(navigationTargetPath);
1939
-
1940
1965
  var creationBehaviour = _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings);
1941
1966
 
1942
- var isParentDeletable, parentEntitySetDeletable;
1943
-
1944
- if (converterContext.getTemplateType() === TemplateType.ObjectPage) {
1945
- var _isParentDeletable;
1946
-
1947
- isParentDeletable = isPathDeletable(converterContext.getDataModelObjectPath(), undefined, true);
1948
-
1949
- if ((_isParentDeletable = isParentDeletable) !== null && _isParentDeletable !== void 0 && _isParentDeletable.currentEntityRestriction) {
1950
- parentEntitySetDeletable = undefined;
1951
- } else {
1952
- parentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable, true) : isParentDeletable;
1953
- }
1954
- }
1955
-
1956
- var dataModelObjectPath = converterContext.getDataModelObjectPath();
1957
- var isInsertable = isPathInsertable(dataModelObjectPath);
1958
1967
  var variantManagement = pageManifestSettings.getVariantManagement();
1959
- var bMassEditVisible = getVisibilityMassEdit(converterContext, tableManifestConfiguration, targetCapabilities, selectionMode);
1960
1968
  var isSearchable = isPathSearchable(converterContext.getDataModelObjectPath());
1969
+ var tableActions = {
1970
+ create: getStandardActionCreate(converterContext, standardActionsContext),
1971
+ "delete": getStandardActionDelete(converterContext, standardActionsContext),
1972
+ paste: getStandardActionPaste(converterContext, standardActionsContext),
1973
+ massEdit: getStandardActionMassEdit(converterContext, standardActionsContext, selectionMode)
1974
+ };
1975
+ var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), tableActions.create.visible === "false");
1961
1976
  return {
1962
1977
  id: id,
1963
1978
  entityName: entitySet ? entitySet.name : "",
@@ -1965,14 +1980,9 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1965
1980
  navigationPath: navigationPropertyPath,
1966
1981
  row: _getRowConfigurationProperty(lineItemAnnotation, visualizationPath, converterContext, navigationSettings, navigationTargetPath),
1967
1982
  p13nMode: p13nMode,
1968
- show: {
1969
- "delete": getDeleteVisible(converterContext, navigationPropertyPath, targetCapabilities.isDeletable, viewConfiguration),
1970
- create: compileBinding(getCreateVisible(converterContext, creationBehaviour === null || creationBehaviour === void 0 ? void 0 : creationBehaviour.mode, isInsertable)),
1971
- paste: compileBinding(getPasteEnabled(converterContext, creationBehaviour, isInsertable, tableManifestConfiguration.enablePaste, viewConfiguration)),
1972
- massEdit: {
1973
- visible: bMassEditVisible,
1974
- enabled: getEnablementMassEdit(converterContext, bMassEditVisible)
1975
- }
1983
+ standardActions: {
1984
+ actions: tableActions,
1985
+ isInsertUpdateTemplated: isInsertUpdateTemplated
1976
1986
  },
1977
1987
  displayMode: isInDisplayMode(converterContext, viewConfiguration),
1978
1988
  create: creationBehaviour,
@@ -1980,8 +1990,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1980
1990
  autoBindOnInit: converterContext.getTemplateType() !== TemplateType.ListReport && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage && !(viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)),
1981
1991
  variantManagement: variantManagement === "Control" && !p13nMode ? VariantManagementType.None : variantManagement,
1982
1992
  threshold: threshold,
1983
- sortConditions: getSortConditions(presentationVariantAnnotation, columns),
1984
- parentEntityDeleteEnabled: parentEntitySetDeletable,
1993
+ sortConditions: getSortConditions(converterContext, presentationVariantAnnotation, columns),
1985
1994
  title: title,
1986
1995
  searchable: tableManifestConfiguration.type !== "AnalyticalTable" && !(isConstant(isSearchable) && isSearchable.value === false)
1987
1996
  };
@@ -1989,6 +1998,47 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1989
1998
 
1990
1999
  _exports.getTableAnnotationConfiguration = getTableAnnotationConfiguration;
1991
2000
 
2001
+ function _getExportDataType(dataType) {
2002
+ var isComplexProperty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2003
+ var exportDataType = "String";
2004
+
2005
+ if (isComplexProperty) {
2006
+ return exportDataType;
2007
+ } else {
2008
+ switch (dataType) {
2009
+ case "Edm.Decimal":
2010
+ case "Edm.Int32":
2011
+ case "Edm.Int64":
2012
+ case "Edm.Double":
2013
+ case "Edm.Byte":
2014
+ exportDataType = "Number";
2015
+ break;
2016
+
2017
+ case "Edm.DateOfTime":
2018
+ case "Edm.Date":
2019
+ exportDataType = "Date";
2020
+ break;
2021
+
2022
+ case "Edm.DateTimeOffset":
2023
+ exportDataType = "DateTime";
2024
+ break;
2025
+
2026
+ case "Edm.TimeOfDay":
2027
+ exportDataType = "Time";
2028
+ break;
2029
+
2030
+ case "Edm.Boolean":
2031
+ exportDataType = "Boolean";
2032
+ break;
2033
+
2034
+ default:
2035
+ exportDataType = "String";
2036
+ }
2037
+ }
2038
+
2039
+ return exportDataType;
2040
+ }
2041
+
1992
2042
  function isInDisplayMode(converterContext, viewConfiguration) {
1993
2043
  var templateType = converterContext.getTemplateType();
1994
2044
 
@@ -2024,6 +2074,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2024
2074
  };
2025
2075
  }
2026
2076
 
2077
+ _exports.splitPath = splitPath;
2078
+
2027
2079
  function getSelectionVariantConfiguration(selectionVariantPath, converterContext) {
2028
2080
  var resolvedTarget = converterContext.getEntityTypeAnnotation(selectionVariantPath);
2029
2081
  var selection = resolvedTarget.annotation;
@@ -2052,7 +2104,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2052
2104
  _exports.getSelectionVariantConfiguration = getSelectionVariantConfiguration;
2053
2105
 
2054
2106
  function getTableManifestConfiguration(lineItemAnnotation, visualizationPath, converterContext) {
2055
- var _tableSettings$quickV5, _converterContext$get18;
2107
+ var _tableSettings$quickV5, _converterContext$get11;
2056
2108
 
2057
2109
  var checkCondensedLayout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2058
2110
  var tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
@@ -2071,13 +2123,15 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2071
2123
  var enableFullScreen = false;
2072
2124
  var selectionLimit = 200;
2073
2125
  var multiSelectMode;
2074
- var enablePaste = converterContext.getTemplateType() === "ObjectPage";
2126
+ var enableAutoColumnWidth = !converterContext.getManifestWrapper().isPhone();
2127
+ var enablePaste = tableSettings.enablePaste !== undefined ? tableSettings.enablePaste : converterContext.getTemplateType() === "ObjectPage"; // Paste is disabled by default excepted for OP
2128
+
2075
2129
  var isCondensedTableLayoutCompliant = checkCondensedLayout && converterContext.getManifestWrapper().isCondensedLayoutCompliant();
2076
2130
  var entityType = converterContext.getEntityType();
2077
2131
  var aggregationHelper = new AggregationHelper(entityType, converterContext);
2078
2132
 
2079
2133
  if (lineItemAnnotation) {
2080
- var _tableSettings$quickV, _tableSettings$quickV2, _tableSettings$creati, _tableSettings$creati2, _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$quickV4;
2134
+ var _tableSettings$quickV, _tableSettings$quickV2, _tableSettings$creati, _tableSettings$creati2, _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$quickV4, _tableSettings$enable;
2081
2135
 
2082
2136
  var targetEntityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
2083
2137
  tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV = tableSettings.quickVariantSelection) === null || _tableSettings$quickV === void 0 ? void 0 : (_tableSettings$quickV2 = _tableSettings$quickV.paths) === null || _tableSettings$quickV2 === void 0 ? void 0 : _tableSettings$quickV2.forEach(function (path) {
@@ -2120,11 +2174,12 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2120
2174
  tableType = "ResponsiveTable";
2121
2175
  }
2122
2176
  }
2123
- }
2177
+ } // If enableFullScreen is not set, use as default true on phone and false otherwise
2124
2178
 
2125
- enableFullScreen = tableSettings.enableFullScreen || false;
2126
2179
 
2127
- if (enableFullScreen === true && converterContext.getTemplateType() === TemplateType.ListReport) {
2180
+ enableFullScreen = (_tableSettings$enable = tableSettings.enableFullScreen) !== null && _tableSettings$enable !== void 0 ? _tableSettings$enable : converterContext.getManifestWrapper().isPhone(); // Make sure that enableFullScreen is not set on ListReport for desktop or tablet
2181
+
2182
+ if (!converterContext.getManifestWrapper().isPhone() && enableFullScreen && converterContext.getTemplateType() === TemplateType.ListReport) {
2128
2183
  enableFullScreen = false;
2129
2184
  converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, IssueType.FULLSCREENMODE_NOT_ON_LISTREPORT);
2130
2185
  }
@@ -2145,7 +2200,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2145
2200
  }
2146
2201
  }
2147
2202
 
2148
- enablePaste = converterContext.getTemplateType() === "ObjectPage" && tableSettings.enablePaste !== false;
2149
2203
  enableExport = tableSettings.enableExport !== undefined ? tableSettings.enableExport : converterContext.getTemplateType() !== "ObjectPage" || enablePaste;
2150
2204
  }
2151
2205
 
@@ -2163,12 +2217,52 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2163
2217
  selectionLimit: selectionLimit,
2164
2218
  multiSelectMode: multiSelectMode,
2165
2219
  enablePaste: enablePaste,
2166
- showRowCount: !(tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV5 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV5 !== void 0 && _tableSettings$quickV5.showCounts) && !((_converterContext$get18 = converterContext.getManifestWrapper().getViewConfiguration()) !== null && _converterContext$get18 !== void 0 && _converterContext$get18.showCounts),
2167
- enableMassEdit: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableMassEdit
2220
+ showRowCount: !(tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV5 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV5 !== void 0 && _tableSettings$quickV5.showCounts) && !((_converterContext$get11 = converterContext.getManifestWrapper().getViewConfiguration()) !== null && _converterContext$get11 !== void 0 && _converterContext$get11.showCounts),
2221
+ enableMassEdit: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableMassEdit,
2222
+ enableAutoColumnWidth: enableAutoColumnWidth
2168
2223
  };
2169
2224
  }
2170
2225
 
2171
2226
  _exports.getTableManifestConfiguration = getTableManifestConfiguration;
2227
+
2228
+ function getTypeConfig(oProperty, dataType) {
2229
+ var _targetType, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
2230
+
2231
+ var oTargetMapping = EDM_TYPE_MAPPING[oProperty === null || oProperty === void 0 ? void 0 : oProperty.type] || (dataType ? EDM_TYPE_MAPPING[dataType] : undefined);
2232
+
2233
+ if (!oTargetMapping && oProperty.targetType && ((_targetType = oProperty.targetType) === null || _targetType === void 0 ? void 0 : _targetType._type) === "TypeDefinition") {
2234
+ oTargetMapping = EDM_TYPE_MAPPING[oProperty.targetType.underlyingType];
2235
+ }
2236
+
2237
+ var propertyTypeConfig = {
2238
+ type: oTargetMapping.type,
2239
+ constraints: {},
2240
+ formatOptions: {}
2241
+ };
2242
+
2243
+ if (isProperty(oProperty)) {
2244
+ var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation2, _oProperty$annotation3, _oProperty$annotation4, _oProperty$annotation5, _oTargetMapping$const6, _oProperty$annotation6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oTargetMapping$const7, _annotations3, _annotations3$Common;
2245
+
2246
+ propertyTypeConfig.constraints = {
2247
+ scale: (_oTargetMapping$const = oTargetMapping.constraints) !== null && _oTargetMapping$const !== void 0 && _oTargetMapping$const.$Scale ? oProperty.scale : undefined,
2248
+ precision: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Precision ? oProperty.precision : undefined,
2249
+ maxLength: (_oTargetMapping$const3 = oTargetMapping.constraints) !== null && _oTargetMapping$const3 !== void 0 && _oTargetMapping$const3.$MaxLength ? oProperty.maxLength : undefined,
2250
+ nullable: (_oTargetMapping$const4 = oTargetMapping.constraints) !== null && _oTargetMapping$const4 !== void 0 && _oTargetMapping$const4.$Nullable ? oProperty.nullable : undefined,
2251
+ minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation2 = oProperty.annotations) === null || _oProperty$annotation2 === void 0 ? void 0 : (_oProperty$annotation3 = _oProperty$annotation2.Validation) === null || _oProperty$annotation3 === void 0 ? void 0 : _oProperty$annotation3.Minimum) ? "".concat((_oProperty$annotation4 = oProperty.annotations) === null || _oProperty$annotation4 === void 0 ? void 0 : (_oProperty$annotation5 = _oProperty$annotation4.Validation) === null || _oProperty$annotation5 === void 0 ? void 0 : _oProperty$annotation5.Minimum) : undefined,
2252
+ maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation6 = oProperty.annotations) === null || _oProperty$annotation6 === void 0 ? void 0 : (_oProperty$annotation7 = _oProperty$annotation6.Validation) === null || _oProperty$annotation7 === void 0 ? void 0 : _oProperty$annotation7.Maximum) ? "".concat((_oProperty$annotation8 = oProperty.annotations) === null || _oProperty$annotation8 === void 0 ? void 0 : (_oProperty$annotation9 = _oProperty$annotation8.Validation) === null || _oProperty$annotation9 === void 0 ? void 0 : _oProperty$annotation9.Maximum) : undefined,
2253
+ isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations3 = oProperty.annotations) !== null && _annotations3 !== void 0 && (_annotations3$Common = _annotations3.Common) !== null && _annotations3$Common !== void 0 && _annotations3$Common.IsDigitSequence ? true : undefined
2254
+ };
2255
+ }
2256
+
2257
+ propertyTypeConfig.formatOptions = {
2258
+ parseAsString: (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t = propertyTypeConfig.type) === null || _propertyTypeConfig$t === void 0 ? void 0 : _propertyTypeConfig$t.indexOf("sap.ui.model.odata.type.Int")) === 0 || (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t2 = propertyTypeConfig.type) === null || _propertyTypeConfig$t2 === void 0 ? void 0 : _propertyTypeConfig$t2.indexOf("sap.ui.model.odata.type.Double")) === 0 ? false : undefined,
2259
+ emptyString: (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t3 = propertyTypeConfig.type) === null || _propertyTypeConfig$t3 === void 0 ? void 0 : _propertyTypeConfig$t3.indexOf("sap.ui.model.odata.type.Int")) === 0 || (propertyTypeConfig === null || propertyTypeConfig === void 0 ? void 0 : (_propertyTypeConfig$t4 = propertyTypeConfig.type) === null || _propertyTypeConfig$t4 === void 0 ? void 0 : _propertyTypeConfig$t4.indexOf("sap.ui.model.odata.type.Double")) === 0 ? "" : undefined,
2260
+ parseKeepsEmptyString: propertyTypeConfig.type === "sap.ui.model.odata.type.String" ? true : undefined
2261
+ };
2262
+ return propertyTypeConfig;
2263
+ }
2264
+
2265
+ _exports.getTypeConfig = getTypeConfig;
2172
2266
  return _exports;
2173
2267
  }, false);
2174
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImhvcml6b250YWxBbGlnbiIsImZvcm1hdE9wdGlvbnMiLCJnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJmaW5kQ29sdW1uRnJvbVBhdGgiLCJwYXRoIiwiZmluZCIsImNvbHVtbiIsImFubm90YXRpb25Db2x1bW4iLCJwcm9wZXJ0eUluZm9zIiwidW5kZWZpbmVkIiwicmVsYXRpdmVQYXRoIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiZm9yRWFjaCIsIm9Db2x1bW4iLCJvVGFibGVDb2x1bW4iLCJ1bml0IiwiYWRkIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJtUmF3RGVmaW5pdGlvbnMiLCJhbm5vdGF0aW9uIiwib0FnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsIm9Qcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwib0N0eERlZlByb3BlcnR5IiwidmFsdWUiLCJtUmVzdWx0IiwiYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJoYXMiLCJpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eSIsImRlZmF1bHRBZ2dyZWdhdGUiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUiLCJwdXNoIiwibGVuZ3RoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsInR5cGUiLCJhZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJlbmFibGVBbmFseXRpY3MiLCJhZ2dyZWdhdGVzIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImZpbmRDb2x1bW5CeVBhdGgiLCJvUHJvcCIsInNVbml0IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5Iiwib1VuaXRDb2x1bW4iLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJDb21tb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJlbmFibGVEYXRhU3RhdGVGaWx0ZXIiLCJnZXRUZW1wbGF0ZVR5cGUiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiaW5kZXhPZiIsIkRldGVybWluaW5nIiwiYWN0aW9uVGFyZ2V0IiwiQWN0aW9uVGFyZ2V0IiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsInBhcmFtZXRlcnMiLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJ0YXJnZXRFeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yIiwicHJvcGVydGllcyIsInByb3BlcnR5TmFtZSIsInNpemUiLCJ0aXRsZVByb3BlcnR5IiwiVUkiLCJIZWFkZXJJbmZvIiwiVGl0bGUiLCJWYWx1ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiY3VycmVudEVudGl0eVR5cGUiLCJjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzRW50aXR5U2V0IiwiYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zIiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJSZXF1aXJlc0NvbnRleHQiLCJJbmxpbmUiLCJ2YWx1ZU9mIiwiSGlkZGVuIiwiZXF1YWwiLCJnZXRCaW5kaW5nRXhwRnJvbUNvbnRleHQiLCJzb3VyY2UiLCJzRXhwcmVzc2lvbiIsInZpc2libGUiLCJzUGF0aCIsInN1YnN0cmluZyIsImFTcGxpdFBhdGgiLCJzcGxpdCIsInNOYXZpZ2F0aW9uUGF0aCIsInRhcmdldE9iamVjdCIsIl90eXBlIiwicGFydG5lciIsImJpbmRpbmdFeHByZXNzaW9uIiwic2xpY2UiLCJjb25zdGFudCIsImhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJzb21lIiwiaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJtYW5pZmVzdEFjdGlvbnMiLCJhY3Rpb25LZXkiLCJhY3Rpb24iLCJyZXF1aXJlc1NlbGVjdGlvbiIsInRvU3RyaW5nIiwiZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiYVZpc2libGVQYXRoRXhwcmVzc2lvbnMiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldENhcGFiaWxpdHlSZXN0cmljdGlvbiIsImlzRGVsZXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiaXNVcGRhdGFibGUiLCJpc1BhdGhVcGRhdGFibGUiLCJpc0NvbnN0YW50IiwiZ2V0U2VsZWN0aW9uTW9kZSIsInRhcmdldENhcGFiaWxpdGllcyIsIlNlbGVjdGlvbk1vZGUiLCJOb25lIiwidGFibGVNYW5pZmVzdFNldHRpbmdzIiwic2VsZWN0aW9uTW9kZSIsInRhYmxlU2V0dGluZ3MiLCJhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zIiwiYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMiLCJpc1BhcmVudERlbGV0YWJsZSIsInBhcmVudEVudGl0eVNldERlbGV0YWJsZSIsIlRlbXBsYXRlVHlwZSIsIk9iamVjdFBhZ2UiLCJjb21waWxlQmluZGluZyIsIk11bHRpIiwiaWZFbHNlIiwiQXV0byIsIm9yIiwiY29uY2F0IiwidGFibGVBY3Rpb24iLCJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiQWN0aW9uVHlwZSIsIkRhdGFGaWVsZEZvckFjdGlvbiIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsIm5vdCIsImdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJEZWZhdWx0IiwiZ2V0SGlnaGxpZ2h0Um93QmluZGluZyIsImNyaXRpY2FsaXR5QW5ub3RhdGlvbiIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5VHlwZSIsImRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uIiwiTWVzc2FnZVR5cGUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJEcmFmdCIsIklzTmV3T2JqZWN0IiwiSW5mb3JtYXRpb24iLCJmb3JtYXRSZXN1bHQiLCJ0YWJsZUZvcm1hdHRlcnMiLCJyb3dIaWdobGlnaHRpbmciLCJfZ2V0Q3JlYXRpb25CZWhhdmlvdXIiLCJ0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm5hdmlnYXRpb24iLCJjcmVhdGUiLCJkZXRhaWwiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwibmV3QWN0aW9uIiwidGFyZ2V0QW5ub3RhdGlvbnMiLCJnZXRFbnRpdHlTZXQiLCJEcmFmdFJvb3QiLCJOZXdBY3Rpb24iLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiRXJyb3IiLCJyb3V0ZSIsImFwcGVuZCIsImNyZWF0ZUF0RW5kIiwibmF2aWdhdGVUb1RhcmdldCIsIk5ld1BhZ2UiLCJfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInByZXNzUHJvcGVydHkiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsImRpc3BsYXkiLCJ0YXJnZXQiLCJDcml0aWNhbGl0eSIsIkRyYWZ0Tm9kZSIsInJvd05hdmlnYXRlZEV4cHJlc3Npb24iLCJuYXZpZ2F0ZWRSb3ciLCJwcmVzcyIsInJvd05hdmlnYXRlZCIsImNvbHVtbnNUb0JlQ3JlYXRlZCIsIm5vblNvcnRhYmxlQ29sdW1ucyIsInRhYmxlVHlwZSIsInByb3BlcnR5IiwiZXhpc3RzIiwidGFyZ2V0VHlwZSIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNvbHVtbkluZm8iLCJnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5Iiwic2VtYW50aWNLZXlzIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJvQ29sdW1uRHJhZnRJbmRpY2F0b3IiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJleHBvcnRTZXR0aW5ncyIsInRlbXBsYXRlIiwiZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSIsIndyYXAiLCJleHBvcnRTZXR0aW5nc1dyYXBwaW5nIiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJmdWxsUHJvcGVydHlQYXRoIiwidXNlRGF0YUZpZWxkUHJlZml4IiwiYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoIiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwiaXNIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImlzRGF0YVBvaW50RmFrZVByb3BlcnR5IiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsImlzR3JvdXBhYmxlIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsIkFubm90YXRpb24iLCJsYWJlbCIsIl9nZXRMYWJlbCIsImdyb3VwTGFiZWwiLCJncm91cCIsInNlbWFudGljT2JqZWN0UGF0aCIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwiRGF0YUZpZWxkRGVmYXVsdCIsIlRhcmdldCIsIiR0YXJnZXQiLCJzb3J0YWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIl9pc1ZhbGlkQ29sdW1uIiwiaXNQcm9wZXJ0eSIsImRhdGFGaWVsZERlZmF1bHQiLCJMYWJlbCIsImlzRGF0YUZpZWxkVHlwZXMiLCJfY3JlYXRlUmVsYXRlZENvbHVtbnMiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwicmVsYXRlZENvbHVtbiIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJfZ2V0UmVsYXRpdmVQYXRoIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwiaXNTb3J0YWJsZSIsImZpbHRlckZ1bmN0aW9ucyIsIkNhcGFiaWxpdGllcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsImlzQXJyYXkiLCJnZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsImJTZW1hbnRpY0tleUZvdW5kIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiaSIsImhhc0RyYWZ0SW5kaWNhdG9yIiwic2VtYW50aWNrZXlzIiwiU29ydFJlc3RyaWN0aW9ucyIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsImxpbmVJdGVtIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJzTGFiZWwiLCJpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbiIsIkhUTUw1IiwiQ3NzRGVmYXVsdHMiLCJleHBvcnRDb250YWN0UHJvcGVydHkiLCJleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJyZXNvbHZlUGF0aCIsIl9hcHBlbmRDdXN0b21UZW1wbGF0ZSIsIl9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiaXNBbm5vdGF0aW9uQ29sdW1uIiwiaW50ZXJuYWxDb2x1bW5zIiwibWFuaWZlc3RDb2x1bW4iLCJ2YWxpZGF0ZUtleSIsImlkIiwiaGVhZGVyIiwiSG9yaXpvbnRhbEFsaWduIiwiQmVnaW4iLCJTbG90IiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZmllbGRMYWJlbCIsImdldFAxM25Nb2RlIiwidmFyaWFudE1hbmFnZW1lbnQiLCJnZXRWYXJpYW50TWFuYWdlbWVudCIsImFQZXJzb25hbGl6YXRpb24iLCJiQW5hbHl0aWNhbFRhYmxlIiwicGVyc29uYWxpemF0aW9uIiwic29ydCIsImZpbHRlciIsImFnZ3JlZ2F0ZSIsIlZhcmlhbnRNYW5hZ2VtZW50VHlwZSIsIkNvbnRyb2wiLCJnZXREZWxldGVWaXNpYmxlIiwibmF2aWdhdGlvblBhdGgiLCJpc1RhcmdldERlbGV0YWJsZSIsImN1cnJlbnRFbnRpdHlTZXQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwidmlzaXRlZE5hdmlnYXRpb25QYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibmF2UHJvcCIsImlzRGVsZXRlSGlkZGVuRXhwcmVzc2lvbiIsIkRlbGV0ZUhpZGRlbiIsInNpbmdsZXRvblBhdGhWaXNpdG9yIiwiaXNEZWxldGVIaWRkZW4iLCJoYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiQW5hbHl0aWNhbExpc3RQYWdlIiwiTGlzdFJlcG9ydCIsImlzQmluZGluZyIsImdldEVuYWJsZW1lbnRNYXNzRWRpdCIsImJNYXNzRWRpdFZpc2libGUiLCJpc1BhcmVudFVwZGF0YWJsZSIsImN1cnJlbnRFbnRpdHlSZXN0cmljdGlvbiIsIm9FeHByZXNzaW9uIiwiZ2V0VmlzaWJpbGl0eU1hc3NFZGl0IiwiZW50aXR5U2V0IiwiYlVwZGF0ZUhpZGRlbiIsIlVwZGF0ZUhpZGRlbiIsImJNYXNzRWRpdEVuYWJsZWQiLCJlbmFibGVNYXNzRWRpdCIsImlTZWxlY3Rpb25MaW1pdCIsInNlbGVjdGlvbkxpbWl0IiwiSXNFZGl0YWJsZSIsImFuZCIsImdldENyZWF0ZVZpc2libGUiLCJpc0luc2VydGFibGUiLCJpc0NyZWF0ZUhpZGRlbiIsIkNyZWF0ZUhpZGRlbiIsIm5ld0FjdGlvbk5hbWUiLCJzaG93Q3JlYXRlRm9yTmV3QWN0aW9uIiwiZ2V0UGFzdGVFbmFibGVkIiwiY3JlYXRpb25CZWhhdmlvdXIiLCJwYXN0ZUVuYWJsZWRJbk1hbmlmZXN0IiwiZ2V0U29ydENvbmRpdGlvbnMiLCJzb3J0Q29uZGl0aW9ucyIsIlNvcnRPcmRlciIsInNvcnRlcnMiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwiUHJvcGVydHkiLCJzb3J0Q29sdW1uIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsInBhdGhzIiwiaW5mb05hbWVzIiwiY3VycmVudFBhdGgiLCJHcm91cEJ5IiwiYUdyb3VwQnkiLCJhR3JvdXBMZXZlbHMiLCJpbmZvTmFtZSIsImdyb3VwTGV2ZWxzIiwiVG90YWwiLCJhVG90YWxzIiwidGl0bGUiLCJUeXBlTmFtZVBsdXJhbCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJUYWJsZUlEIiwidGhyZXNob2xkIiwiTWF4SXRlbXMiLCJpc1BhdGhJbnNlcnRhYmxlIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsImVudGl0eU5hbWUiLCJjb2xsZWN0aW9uIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInJvdyIsInNob3ciLCJwYXN0ZSIsImVuYWJsZVBhc3RlIiwibWFzc0VkaXQiLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsInBhcmVudEVudGl0eURlbGV0ZUVuYWJsZWQiLCJzZWFyY2hhYmxlIiwidGVtcGxhdGVUeXBlIiwic3Vic3RyIiwiZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24iLCJzZWxlY3Rpb25WYXJpYW50UGF0aCIsInJlc29sdmVkVGFyZ2V0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJzZWxlY3Rpb24iLCJwcm9wZXJ0eU5hbWVzIiwiU2VsZWN0T3B0aW9ucyIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsIlByb3BlcnR5UGF0aCIsInRleHQiLCJjaGVja0NvbmRlbnNlZExheW91dCIsInF1aWNrU2VsZWN0aW9uVmFyaWFudCIsInF1aWNrRmlsdGVyUGF0aHMiLCJlbmFibGVFeHBvcnQiLCJmaWx0ZXJzIiwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImNvbmRlbnNlZFRhYmxlTGF5b3V0IiwiaGlkZVRhYmxlVGl0bGUiLCJlbmFibGVGdWxsU2NyZWVuIiwibXVsdGlTZWxlY3RNb2RlIiwiaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQiLCJxdWlja1ZhcmlhbnRTZWxlY3Rpb24iLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwiaXNEZXNrdG9wIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZVR5cGUiLCJGVUxMU0NSRUVOTU9ERV9OT1RfT05fTElTVFJFUE9SVCIsInNlbGVjdEFsbCIsInVzZUljb25UYWJCYXIiLCJoZWFkZXJWaXNpYmxlIiwidXNlQ29uZGVuc2VkVGFibGVMYXlvdXQiLCJzaG93Um93Q291bnQiLCJnZXRWaWV3Q29uZmlndXJhdGlvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXdNS0EsVTs7YUFBQUEsVTtBQUFBQSxJQUFBQSxVO0FBQUFBLElBQUFBLFU7QUFBQUEsSUFBQUEsVTtLQUFBQSxVLEtBQUFBLFU7O0FBZ0ZMO0FBQ0E7QUFDQTtBQUNB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QUFBLFlBQVksRUFBRUEsWUFOUjtBQU9OTSxNQUFBQSxXQUFXLEVBQUVBLFdBUFA7QUFRTndQLE1BQUFBLCtCQUErQixFQUFFQSwrQkFSM0I7QUFTTkMsTUFBQUEsd0JBQXdCLEVBQUVBLHdCQVRwQjtBQVVOcUIsTUFBQUEsdUJBQXVCLEVBQUVwQixvQkFBb0IsSUFBSXpaLCtCQVYzQztBQVdONFUsTUFBQUEsY0FBYyxFQUFFQSxjQVhWO0FBWU5nRixNQUFBQSxlQUFlLEVBQUVBLGVBWlg7QUFhTjdCLE1BQUFBLFdBQVcsRUFBRUEsV0FiUDtBQWNOK0MsTUFBQUEsWUFBWSxFQUNYLEVBQUN6VSxhQUFELGFBQUNBLGFBQUQseUNBQUNBLGFBQWEsQ0FBRXlULHFCQUFoQixtREFBQyx1QkFBc0NFLFVBQXZDLEtBQXFELDZCQUFDemhCLGdCQUFnQixDQUFDMkYsa0JBQWpCLEdBQXNDNmMsb0JBQXRDLEVBQUQsb0RBQUMsd0JBQThEZixVQUEvRCxDQWZoRDtBQWdCTnRGLE1BQUFBLGNBQWMsRUFBRXJPLGFBQUYsYUFBRUEsYUFBRix1QkFBRUEsYUFBYSxDQUFFcU87QUFoQnpCLEtBQVA7QUFrQkEiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENyaXRpY2FsaXR5VHlwZSxcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RW51bVZhbHVlLFxuXHRMaW5lSXRlbSxcblx0UGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzLFxuXHRQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IFRhYmxlSUQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9JRFwiO1xuaW1wb3J0IHtcblx0QW5ub3RhdGlvbkFjdGlvbixcblx0QmFzZUFjdGlvbixcblx0Q3VzdG9tQWN0aW9uLFxuXHRnZXRBY3Rpb25zRnJvbU1hbmlmZXN0LFxuXHRpc0FjdGlvbk5hdmlnYWJsZSxcblx0cmVtb3ZlRHVwbGljYXRlQWN0aW9uc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBDb25maWd1cmFibGVPYmplY3QsIEN1c3RvbUVsZW1lbnQsIGluc2VydEN1c3RvbUVsZW1lbnRzLCBQbGFjZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Q29tcGxleFByb3BlcnR5SW5mbyxcblx0Z2V0U2VtYW50aWNPYmplY3RQYXRoLFxuXHRpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbixcblx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCxcblx0aXNEYXRhRmllbGRUeXBlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRiaW5kaW5nRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uLFxuXHRjb21waWxlQmluZGluZyxcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRFeHByZXNzaW9uLFxuXHRFeHByZXNzaW9uT3JQcmltaXRpdmUsXG5cdGZvcm1hdFJlc3VsdCxcblx0aWZFbHNlLFxuXHRpc0JpbmRpbmcsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aFNlYXJjaGFibGUsXG5cdGlzUGF0aEluc2VydGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGlzUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5cbmltcG9ydCB7IEFnZ3JlZ2F0aW9uSGVscGVyIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IERpc3BsYXlNb2RlLCBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IEZpbHRlckZ1bmN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcblxuZXhwb3J0IHR5cGUgVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiA9IHtcblx0YXV0b0JpbmRPbkluaXQ6IGJvb2xlYW47XG5cdGNvbGxlY3Rpb246IHN0cmluZztcblx0dmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZTtcblx0ZmlsdGVySWQ/OiBzdHJpbmc7XG5cdGlkOiBzdHJpbmc7XG5cdG5hdmlnYXRpb25QYXRoOiBzdHJpbmc7XG5cdHAxM25Nb2RlPzogc3RyaW5nO1xuXHRyb3c/OiB7XG5cdFx0YWN0aW9uPzogc3RyaW5nO1xuXHRcdHByZXNzPzogc3RyaW5nO1xuXHRcdHJvd0hpZ2hsaWdodGluZzogQmluZGluZ0V4cHJlc3Npb248TWVzc2FnZVR5cGU+O1xuXHRcdHJvd05hdmlnYXRlZDogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdHNlbGVjdGlvbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0c2hvdz86IHtcblx0XHRjcmVhdGU/OiBzdHJpbmcgfCBib29sZWFuO1xuXHRcdGRlbGV0ZT86IHN0cmluZyB8IGJvb2xlYW47XG5cdFx0cGFzdGU/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHRtYXNzRWRpdD86IHsgdmlzaWJsZTogYm9vbGVhbiB8IHN0cmluZzsgZW5hYmxlZDogYm9vbGVhbiB8IHN0cmluZyB9O1xuXHR9O1xuXHRkaXNwbGF5TW9kZT86IGJvb2xlYW47XG5cdHRocmVzaG9sZDogbnVtYmVyO1xuXHRlbnRpdHlOYW1lOiBzdHJpbmc7XG5cdHNvcnRDb25kaXRpb25zPzogc3RyaW5nO1xuXHRncm91cENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGFnZ3JlZ2F0ZUNvbmRpdGlvbnM/OiBzdHJpbmc7XG5cblx0LyoqIENyZWF0ZSBuZXcgZW50cmllcyAqL1xuXHRjcmVhdGU6IENyZWF0ZUJlaGF2aW91ciB8IENyZWF0ZUJlaGF2aW91ckV4dGVybmFsO1xuXHRwYXJlbnRFbnRpdHlEZWxldGVFbmFibGVkPzogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdHRpdGxlOiBzdHJpbmc7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYXBwIChkZWZhdWx0IGNhc2UpXG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogQm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVUeXBlID0gXCJHcmlkVGFibGVcIiB8IFwiUmVzcG9uc2l2ZVRhYmxlXCIgfCBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXG5lbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBCYXNlVGFibGVDb2x1bW4gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkOiBzdHJpbmc7XG5cdHdpZHRoPzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eT86IEF2YWlsYWJpbGl0eVR5cGU7XG5cdHR5cGU6IENvbHVtblR5cGU7IC8vT3JpZ2luIG9mIHRoZSBzb3VyY2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIHRlbXBsYXRlZCBpbmZvcm1hdGlvbiBmcm9tLFxuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEN1c3RvbVRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdHRlbXBsYXRlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGlzR3JvdXBhYmxlPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHRleHBvcnRTZXR0aW5ncz86IHtcblx0XHR0ZW1wbGF0ZT86IHN0cmluZztcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRmaWVsZExhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHR9O1xuXHRpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eT86IGJvb2xlYW47XG5cdHRleHRBcnJhbmdlbWVudD86IHtcblx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRtb2RlOiBEaXNwbGF5TW9kZTtcblx0fTtcblx0ZXhwb3J0Q29udGFjdFByb3BlcnR5Pzogc3RyaW5nO1xuXHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21UYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj47XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZURhdGEgPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGU6IHtcblx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH07XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcbn07XG5cbnR5cGUgU29ydGVyVHlwZSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRkZXNjZW5kaW5nOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhbm5vdGF0aW9uLWJhc2VkIGFuZCBtYW5pZmVzdC1iYXNlZCB0YWJsZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7QmFzZUFjdGlvbn0gVGhlIGNvbXBsZXRlIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgYVRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGFBbm5vdGF0aW9uQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMudGFibGVBY3Rpb25zO1xuXHRjb25zdCBhSGlkZGVuQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMuaGlkZGVuVGFibGVBY3Rpb25zO1xuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoXG5cdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdGFIaWRkZW5BY3Rpb25zXG5cdFx0KSxcblx0XHR7XG5cdFx0XHRpc05hdmlnYWJsZTogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZU9uU2VsZWN0OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZWQ6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IFwib3ZlcndyaXRlXCJcblx0XHR9XG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0IGJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zLFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQ29sdW1ucywgbWFuaWZlc3RDb2x1bW5zLCB7XG5cdFx0d2lkdGg6IFwib3ZlcndyaXRlXCIsXG5cdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0YXZhaWxhYmlsaXR5OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGhvcml6b250YWxBbGlnbjogXCJvdmVyd3JpdGVcIixcblx0XHRmb3JtYXRPcHRpb25zOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjdXN0b20gYWdncmVnYXRpb24gZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gZmluZENvbHVtbkZyb21QYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2gob0NvbHVtbiA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQob1Byb3BlcnR5ID0+IHtcblx0XHRcdHJldHVybiBvUHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cblx0XHRpZiAob0FnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdG1SYXdEZWZpbml0aW9uc1tvQWdncmVnYXRlZFByb3BlcnR5Lm5hbWVdID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcblx0XHRcdFx0PyBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5tYXAob0N0eERlZlByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gbVJhd0RlZmluaXRpb25zW29UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdO1xuXG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZSBhbmQgZHVtbXkgY3JlYXRlZCBwcm9wZXJ0eSBmb3IgZGF0YXBvaW50IHRhcmdldCBWYWx1ZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJlxuXHRcdFx0XHQhbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXMob1RhYmxlQ29sdW1uLm5hbWUpICYmXG5cdFx0XHRcdCFvVGFibGVDb2x1bW4uaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHlcblx0XHRcdCkge1xuXHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXSA9IHtcblx0XHRcdFx0XHRkZWZhdWx0QWdncmVnYXRlOiB7fSxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmZvckVhY2goY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQ29sdW1uID0gZmluZENvbHVtbkZyb21QYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0aWYgKG9Db2x1bW4pIHtcblx0XHRcdFx0XHRcdGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLnB1c2gob0NvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXS5kZWZhdWx0QWdncmVnYXRlLmNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG1SZXN1bHQ7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uIChpZiBhbnkpXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0dGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlc1xuKSB7XG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRlc0RlZmluaXRpb25zID0gZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCk7XG5cblx0XHRpZiAoYWdncmVnYXRlc0RlZmluaXRpb25zKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hZ2dyZWdhdGVzID0gYWdncmVnYXRlc0RlZmluaXRpb25zO1xuXG5cdFx0XHQvLyBBZGQgZ3JvdXAgYW5kIHNvcnQgY29uZGl0aW9ucyBmcm9tIHRoZSBwcmVzZW50YXRpb24gdmFyaWFudFxuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uZ3JvdXBDb25kaXRpb25zID0gZ2V0R3JvdXBDb25kaXRpb25zKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucyk7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5hZ2dyZWdhdGVDb25kaXRpb25zID0gZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyhcblx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRhYmxlVmlzdWFsaXphdGlvbi5jb250cm9sLnR5cGUgPSBcIkdyaWRUYWJsZVwiOyAvLyBBbmFseXRpY2FsVGFibGUgaXNuJ3QgYSByZWFsIHR5cGUgZm9yIHRoZSBNREM6VGFibGUsIHNvIHdlIGFsd2F5cyBzd2l0Y2ggYmFjayB0byBHcmlkXG5cdH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hdmlnYXRpb24gdGFyZ2V0IHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIFRoZSBuYXZpZ2F0aW9uIHBhdGggdG8gY2hlY2sgaW4gdGhlIG1hbmlmZXN0IHNldHRpbmdzXG4gKiBAcmV0dXJucyBOYXZpZ2F0aW9uIHBhdGggZnJvbSBtYW5pZmVzdCBzZXR0aW5nc1xuICovXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpKSB7XG5cdFx0Y29uc3QgbmF2Q29uZmlnID0gbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhuYXZDb25maWcpLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgY29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cdGNvbnN0IG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoID0gbWFuaWZlc3RXcmFwcGVyLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKGNvbnRleHRQYXRoKTtcblx0aWYgKG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoICYmIE9iamVjdC5rZXlzKG5hdkNvbmZpZ0ZvckNvbnRleHRQYXRoKS5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIGNvbnRleHRQYXRoO1xuXHR9XG5cblx0cmV0dXJuIGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0ID8gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSA6IGRhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSAndW5pdCcgYW5kICd0ZXh0QXJyYW5nZW1lbnQnIHByb3BlcnRpZXMgaW4gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSkge1xuXHRmdW5jdGlvbiBmaW5kQ29sdW1uQnlQYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0dGFibGVDb2x1bW5zLmZvckVhY2gob0NvbHVtbiA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQob1Byb3AgPT4gb1Byb3AubmFtZSA9PT0gb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRpZiAob1Byb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNVbml0ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KT8ubmFtZSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk/Lm5hbWU7XG5cdFx0XHRcdGlmIChzVW5pdCkge1xuXHRcdFx0XHRcdGNvbnN0IG9Vbml0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aChzVW5pdCk7XG5cblx0XHRcdFx0XHRvVGFibGVDb2x1bW4udW5pdCA9IG9Vbml0Q29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShvUHJvcGVydHkpLFxuXHRcdFx0XHRcdHRleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uVGV4dDtcblx0XHRcdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24odGV4dEFubm90YXRpb24pICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRcdFx0XHRjb25zdCBvVGV4dENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgodGV4dEFubm90YXRpb24ucGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9UZXh0Q29sdW1uICYmIG9UZXh0Q29sdW1uLm5hbWUgIT09IG9UYWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdFx0XHRvVGFibGVDb2x1bW4udGV4dEFycmFuZ2VtZW50ID0ge1xuXHRcdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IG9UZXh0Q29sdW1uLm5hbWUsXG5cdFx0XHRcdFx0XHRcdG1vZGU6IGRpc3BsYXlNb2RlXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0aXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudD86IGJvb2xlYW4sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBUYWJsZVZpc3VhbGl6YXRpb24ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0Q29uZmlnID0gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudFxuXHQpO1xuXHRjb25zdCB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfSA9IHNwbGl0UGF0aCh2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25UYXJnZXRQYXRoID0gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25TZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblRhcmdldFBhdGgpO1xuXHRjb25zdCBjb2x1bW5zID0gZ2V0VGFibGVDb2x1bW5zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0XHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0XHRjb2x1bW5zLFxuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sXG5cdFx0XHR2aWV3Q29uZmlndXJhdGlvblxuXHRcdCksXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiByZW1vdmVEdXBsaWNhdGVBY3Rpb25zKGdldFRhYmxlQWN0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpKSxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCIsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKHVuZGVmaW5lZCwgXCJcIiwgY29udmVydGVyQ29udGV4dCwgZmFsc2UpO1xuXHRjb25zdCBjb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKHt9LCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgW10sIFtdLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlnLnR5cGUpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKHVuZGVmaW5lZCwgXCJcIiwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZywgY29sdW1ucyksXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiBbXSxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCIsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3Mob1Zpc3VhbGl6YXRpb24sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIG9mIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzIGZvciBhbGwgRGF0YUZpZWxkRm9yQWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgbGluZSBpdGVtXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gVGhlIHJlY29yZCBjb250YWluaW5nIGFsbCBhY3Rpb24gbmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdGNvbnN0IGFkZFRvTWFwID0gZnVuY3Rpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRpZiAoa2V5KSB7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXBba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0fTtcblxuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goZGF0YUZpZWxkID0+IHtcblx0XHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZGF0YUZpZWxkLkFjdGlvbiBhcyBzdHJpbmc7XG5cdFx0XHRcdGlmIChhY3Rpb25OYW1lPy5pbmRleE9mKFwiL1wiKSA8IDAgJiYgIWRhdGFGaWVsZC5EZXRlcm1pbmluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvblRhcmdldCA9IGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ7XG5cdFx0XHRcdFx0aWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCBudWxsIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxhdGVkKVxuXHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgbnVsbCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb25UYXJnZXQ/LnBhcmFtZXRlcnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlckZ1bGxOYW1lID0gYWN0aW9uVGFyZ2V0LnBhcmFtZXRlcnNbMF0uZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHQocGF0aDogc3RyaW5nKSA9PiBiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSlcblx0XHRcdFx0XHRcdFx0KSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248c3RyaW5nPjtcblxuXHRcdFx0XHRcdFx0aWYgKHRhcmdldEV4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbi5wYXRoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbGwgcHJvcGVydHkgcGF0aHMgYXNzaWduZWQgdG8gdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvcGVyYXRpb25BdmFpbGFibGVNYXAgVGhlIHJlY29yZCBjb25zaXN0aW5nIG9mIGFjdGlvbnMgYW5kIHRoZWlyIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIENTViBzdHJpbmcgb2YgYWxsIHByb3BlcnR5IHBhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvblxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cblx0Zm9yIChjb25zdCBhY3Rpb25OYW1lIGluIG9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG9wZXJhdGlvbkF2YWlsYWJsZU1hcFthY3Rpb25OYW1lXTtcblx0XHRpZiAocHJvcGVydHlOYW1lID09PSBudWxsKSB7XG5cdFx0XHQvLyBBbm5vdGF0aW9uIGNvbmZpZ3VyZWQgd2l0aCBleHBsaWNpdCAnbnVsbCcgKGFjdGlvbiBhZHZlcnRpc2VtZW50IHJlbGV2YW50KVxuXHRcdFx0cHJvcGVydGllcy5hZGQoYWN0aW9uTmFtZSk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHQvLyBBZGQgcHJvcGVydHkgcGF0aHMgYW5kIG5vdCBDb25zdGFudCB2YWx1ZXMuXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChwcm9wZXJ0aWVzLnNpemUpIHtcblx0XHQvLyBTb21lIGFjdGlvbnMgaGF2ZSBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIGJhc2VkIG9uIHByb3BlcnR5IC0tPiB3ZSBuZWVkIHRvIGxvYWQgdGhlIEhlYWRlckluZm8uVGl0bGUgcHJvcGVydHlcblx0XHQvLyBzbyB0aGF0IHRoZSBkaWFsb2cgb24gcGFydGlhbCBhY3Rpb25zIGlzIGRpc3BsYXllZCBwcm9wZXJseSAoQkNQIDIxODAyNzE0MjUpXG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdGNvbnN0IHRpdGxlUHJvcGVydHkgPSAoZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGg7XG5cdFx0aWYgKHRpdGxlUHJvcGVydHkpIHtcblx0XHRcdHByb3BlcnRpZXMuYWRkKHRpdGxlUHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBBcnJheS5mcm9tKHByb3BlcnRpZXMpLmpvaW4oXCIsXCIpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9mIGEgbGluZSBpdGVtIGFuZFxuICogcmV0dXJucyBhbGwgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGV4cHJlc3Npb25zLlxuICpcbiAqIEBwYXJhbSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB1c2VkIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggT2JqZWN0IHBhdGggb2YgdGhlIGRhdGEgbW9kZWxcbiAqIEBwYXJhbSBpc0VudGl0eVNldFxuICogQHJldHVybnMgQWxsIHRoZSBgVUkuSGlkZGVuYCBwYXRoIGV4cHJlc3Npb25zIGZvdW5kIGluIHRoZSByZWxldmFudCBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdGN1cnJlbnRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSB7XG5cdGNvbnN0IGFVaUhpZGRlblBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdGlmIChcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LkFjdGlvblRhcmdldD8uaXNCb3VuZCAmJlxuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9PT0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkgfHxcblx0XHRcdChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiAmJlxuXHRcdFx0XHRkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0ICYmXG5cdFx0XHRcdGRhdGFGaWVsZD8uSW5saW5lPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdFx0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ0V4cEZyb21Db250ZXh0KFxuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0XHRcdFx0aXNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjb250ZXh0IGN1cnJlbnRseSByZWZlcmVuY2VkIGJ5IHRoaXMgYmluZGluZyBieSByZW1vdmluZyB0aGUgbGFzdCBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuICpcbiAqIEl0IGlzIHVzZWQgKHNwZWNpZmljYWxseSBpbiB0aGlzIGNhc2UpLCB0byB0cmFuc2Zvcm0gYSBiaW5kaW5nIG1hZGUgZm9yIGEgTmF2UHJvcCBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxL05hdlByb3AyLFxuICogaW50byBhIGJpbmRpbmcgb24gdGhlIHByZXZpb3VzIGNvbnRleHQgL01haW5PYmplY3QvTmF2UHJvcDEuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb25cbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gZ2V0QmluZGluZ0V4cEZyb21Db250ZXh0KFxuXHRzb3VyY2U6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IEN1c3RvbUFjdGlvbixcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGFueT4ge1xuXHRsZXQgc0V4cHJlc3Npb246IGFueSB8IHVuZGVmaW5lZDtcblx0aWYgKFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiB8fFxuXHRcdChzb3VyY2UgYXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuXHQpIHtcblx0XHRzRXhwcmVzc2lvbiA9IChzb3VyY2UgYXMgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKT8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdH0gZWxzZSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGU7XG5cdH1cblx0bGV0IHNQYXRoOiBzdHJpbmc7XG5cdGlmIChzRXhwcmVzc2lvbj8ucGF0aCkge1xuXHRcdHNQYXRoID0gc0V4cHJlc3Npb24ucGF0aDtcblx0fSBlbHNlIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChzUGF0aCkge1xuXHRcdGlmICgoc291cmNlIGFzIEN1c3RvbUFjdGlvbik/LnZpc2libGUpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEsIHNQYXRoLmxlbmd0aCAtIDEpO1xuXHRcdH1cblx0XHRpZiAoc1BhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvL2NoZWNrIGlmIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGlzIGNvcnJlY3Q6XG5cdFx0XHRjb25zdCBhU3BsaXRQYXRoID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYVNwbGl0UGF0aFswXTtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnBhcnRuZXIgPT09IHNOYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihhU3BsaXRQYXRoLnNsaWNlKDEpLmpvaW4oXCIvXCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSwgaWYgaXQncyBhbiBlbnRpdHlTZXQsIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaGFzIHRvIGJlIHJldHVybmVkOlxuXHRcdH0gZWxzZSBpZiAoaXNFbnRpdHlTZXQpIHtcblx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihzUGF0aCk7XG5cdFx0XHQvLyBvdGhlcndpc2UgdGhlIGV4cHJlc3Npb24gYmluZGluZyBjYW5ub3QgYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgZXZhbHVhdGlvbjpcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG59XG5cbi8qKlxuICogTG9vcCB0aHJvdWdoIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmQgY2hlY2tcbiAqIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFsd2F5cyB2aXNpYmxlIGluIHRoZSB0YWJsZSB0b29sYmFyIChhbmQgcmVxdWlyZXMgYSBjb250ZXh0KS5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgRW50aXR5IFR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBhY3Rpb24gdGhhdCBtZWV0cyB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLCBjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gbGluZUl0ZW1Bbm5vdGF0aW9uLnNvbWUoZGF0YUZpZWxkID0+IHtcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pICYmXG5cdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHQoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IGZhbHNlIHx8IGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiYgY3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBib29sZWFuIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykuc29tZShhY3Rpb25LZXkgPT4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdGlmIChhY3Rpb24ucmVxdWlyZXNTZWxlY3Rpb24gJiYgYWN0aW9uLnZpc2libGU/LnRvU3RyaW5nKCkgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBjdXN0b20gYWN0aW9ucyAod2l0aCBrZXkgcmVxdWlyZXNTZWxlY3Rpb24pIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGN1cnJlbnQgbGluZSBpdGVtIGFuZCByZXR1cm5zIGFsbCB0aGVcbiAqIHZpc2libGUga2V5IHZhbHVlcyBhcyBhbiBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdEFjdGlvbnMgVGhlIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEByZXR1cm5zIEFycmF5PEV4cHJlc3Npb248Ym9vbGVhbj4+IEFsbCB0aGUgdmlzaWJsZSBwYXRoIGV4cHJlc3Npb25zIG9mIHRoZSBhY3Rpb25zIHRoYXQgbWVldCB0aGUgY3JpdGVyaWFcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KG1hbmlmZXN0QWN0aW9uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWN0aW9uPik6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSB7XG5cdGNvbnN0IGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0aWYgKG1hbmlmZXN0QWN0aW9ucykge1xuXHRcdE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykuZm9yRWFjaChhY3Rpb25LZXkgPT4ge1xuXHRcdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uID09PSB0cnVlICYmIGFjdGlvbi52aXNpYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdC8qVGhlIGZpbmFsIGFpbSB3b3VsZCBiZSB0byBjaGVjayBpZiB0aGUgcGF0aCBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIHBhcmVudCBjb250ZXh0XG5cdFx0XHRcdFx0YW5kIGNvbnNpZGVycyBvbmx5IHRob3NlIGV4cHJlc3Npb25zIGZvciB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uLFxuXHRcdFx0XHRcdGJ1dCBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZyb20gdGhlIG1hbmlmZXN0IGFzIHRoZSB2aXNpYmxlIGtleSBpcyBib3VuZCBvbiB0aGUgcGFyZW50IGVudGl0eS5cblx0XHRcdFx0XHRUcmlja3kgdG8gZGlmZmVyZW50aWF0ZSB0aGUgcGF0aCBhcyBpdCdzIGRvbmUgZm9yIHRoZSBIaWRkZW4gYW5ub3RhdGlvbi5cblx0XHRcdFx0XHRGb3IgdGhlIHRpbWUgYmVpbmcgd2UgY29uc2lkZXIgYWxsIHRoZSBwYXRocyBvZiB0aGUgbWFuaWZlc3QqL1xuXG5cdFx0XHRcdFx0YVZpc2libGVQYXRoRXhwcmVzc2lvbnMucHVzaChyZXNvbHZlQmluZGluZ1N0cmluZyhhY3Rpb24/LnZpc2libGU/LnZhbHVlT2YoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIGlmIHRoZSBwYXRoIGlzIHN0YXRpY2FsbHkgZGVsZXRhYmxlIG9yIHVwZGF0YWJsZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9ufSBUaGUgdGFibGUgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uIHtcblx0Y29uc3QgaXNEZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRjb25zdCBpc1VwZGF0YWJsZSA9IGlzUGF0aFVwZGF0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNEZWxldGFibGU6ICEoaXNDb25zdGFudChpc0RlbGV0YWJsZSkgJiYgaXNEZWxldGFibGUudmFsdWUgPT09IGZhbHNlKSxcblx0XHRpc1VwZGF0YWJsZTogIShpc0NvbnN0YW50KGlzVXBkYXRhYmxlKSAmJiBpc1VwZGF0YWJsZS52YWx1ZSA9PT0gZmFsc2UpXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Nb2RlKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpc0VudGl0eVNldDogYm9vbGVhbixcblx0dGFyZ2V0Q2FwYWJpbGl0aWVzOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvblxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHR9XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGxldCBzZWxlY3Rpb25Nb2RlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3M/LnNlbGVjdGlvbk1vZGU7XG5cdGxldCBhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXSxcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0W10sXG5cdFx0dW5kZWZpbmVkLFxuXHRcdGZhbHNlXG5cdCk7XG5cdGxldCBpc1BhcmVudERlbGV0YWJsZSwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UpIHtcblx0XHRpc1BhcmVudERlbGV0YWJsZSA9IGlzUGF0aERlbGV0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgdW5kZWZpbmVkKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cdGlmIChzZWxlY3Rpb25Nb2RlICYmIHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuTm9uZSkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdFx0c2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRpZkVsc2UoZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFwiTm9uZVwiKSlcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc0VudGl0eVNldCkge1xuXHRcdFx0aWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSkge1xuXHRcdFx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHRcdFx0cmV0dXJuIHNlbGVjdGlvbk1vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmIGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdGlmRWxzZShlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpLCBjb25zdGFudChzZWxlY3Rpb25Nb2RlKSwgY29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKSlcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0fSBlbHNlIGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxCYXNlQWN0aW9uLCBCYXNlQWN0aW9uPn0gVGhlIHRhYmxlIGFubm90YXRpb24gYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0Y29uc3QgdGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0Y29uc3QgaGlkZGVuVGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGxldCB0YWJsZUFjdGlvbjogQW5ub3RhdGlvbkFjdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQpICYmXG5cdFx0XHRcdCEoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuSW5saW5lICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuRGV0ZXJtaW5pbmdcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0aGlkZGVuVGFibGVBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmICh0YWJsZUFjdGlvbikge1xuXHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0YWJsZUFjdGlvbnM6IHRhYmxlQWN0aW9ucyxcblx0XHRoaWRkZW5UYWJsZUFjdGlvbnM6IGhpZGRlblRhYmxlQWN0aW9uc1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRjcml0aWNhbGl0eUFubm90YXRpb246IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+IHwgRW51bVZhbHVlPENyaXRpY2FsaXR5VHlwZT4gfCB1bmRlZmluZWQsXG5cdGlzRHJhZnRSb290OiBib29sZWFuLFxuXHR0YXJnZXRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpZkVsc2UoXG5cdFx0aXNEcmFmdFJvb3QgJiYgRHJhZnQuSXNOZXdPYmplY3QsXG5cdFx0TWVzc2FnZVR5cGUuSW5mb3JtYXRpb24gYXMgTWVzc2FnZVR5cGUsXG5cdFx0Zm9ybWF0UmVzdWx0KFxuXHRcdFx0W2RlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLCBiaW5kaW5nRXhwcmVzc2lvbihgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0dGFibGVGb3JtYXR0ZXJzLnJvd0hpZ2hsaWdodGluZyxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpXG5cdCk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbltcImNyZWF0ZVwiXSB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSB8fCBuYXZpZ2F0aW9uU2V0dGluZ3M/LmRldGFpbDtcblxuXHQvLyBjcm9zcy1hcHBcblx0aWYgKG5hdmlnYXRpb24/Lm91dGJvdW5kICYmIG5hdmlnYXRpb24ub3V0Ym91bmREZXRhaWwgJiYgbmF2aWdhdGlvblNldHRpbmdzPy5jcmVhdGUpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bW9kZTogXCJFeHRlcm5hbFwiLFxuXHRcdFx0b3V0Ym91bmQ6IG5hdmlnYXRpb24ub3V0Ym91bmQsXG5cdFx0XHRvdXRib3VuZERldGFpbDogbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5nczogbmF2aWdhdGlvblNldHRpbmdzXG5cdFx0fTtcblx0fVxuXG5cdGxldCBuZXdBY3Rpb247XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHQvLyBpbi1hcHBcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdG5ld0FjdGlvbiA9IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247IC8vIFRPRE86IElzIHRoZXJlIHJlYWxseSBubyAnTmV3QWN0aW9uJyBvbiBEcmFmdE5vZGU/IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZT8uTmV3QWN0aW9uXG5cblx0XHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbmV3QWN0aW9uKSB7XG5cdFx0XHQvLyBBIGNvbWJpbmF0aW9uIG9mICdDcmVhdGlvblJvdycgYW5kICdOZXdBY3Rpb24nIGRvZXMgbm90IG1ha2Ugc2Vuc2Vcblx0XHRcdC8vIFRPRE86IE9yIGRvZXMgaXQ/XG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb24/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uLnJvdXRlIDogdW5kZWZpbmVkIC8vIG5hdmlnYXRlIG9ubHkgaW4gTmV3UGFnZSBtb2RlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuXG5jb25zdCBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XCIuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKCAkY29udHJvbGxlciAsJ1wiICsgbmF2aWdhdGlvblRhcmdldCArIFwiJywgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0pXCI7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksXG5cdFx0XHRcdFx0ISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCAhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlLFxuXHRcdFx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0XCJBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LCB7IGNhbGxFeHRlbnNpb246IHRydWUsIHRhcmdldFBhdGg6ICdcIiArXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCArXG5cdFx0XHRcdFx0XCInLCBlZGl0YWJsZSA6IFwiICtcblx0XHRcdFx0XHQodGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGVcblx0XHRcdFx0XHRcdD8gXCIhJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0uZ2V0UHJvcGVydHkoJ0lzQWN0aXZlRW50aXR5JylcIlxuXHRcdFx0XHRcdFx0OiBcInVuZGVmaW5lZFwiKSArXG5cdFx0XHRcdFx0XCJ9KVwiOyAvL05lZWQgdG8gYWNjZXNzIHRvIERyYWZ0Um9vdCBhbmQgRHJhZnROb2RlICEhISEhISFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LCBmYWxzZSwgdGFyZ2V0RW50aXR5VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W2JpbmRpbmdFeHByZXNzaW9uKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUJpbmRpbmcoY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlQmluZGluZyhyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKVxuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24gc29ydGFibGUgY29sdW1uIG5hbWVzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbihcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZVxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCB0YWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdFx0XSlbMF07XG5cdFx0XHRjb25zdCBvQ29sdW1uRHJhZnRJbmRpY2F0b3IgPSBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oY29sdW1uSW5mby5uYW1lLCBzZW1hbnRpY0tleXMpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGFibGVDb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXNcbiAqIEBwYXJhbSB7QWdncmVnYXRpb25IZWxwZXJ9IGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbn0gVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGl2ZVBhdGg7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRTZXR0aW5ncyA9IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdHRlbXBsYXRlOiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KVxuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRyZXR1cm4ge1xuXHRcdGtleToga2V5LFxuXHRcdGlzR3JvdXBhYmxlOiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgJiYgIWlzSGlkZGVuID8gYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBmYWxzZSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0bGFiZWw6IF9nZXRMYWJlbChwcm9wZXJ0eSwgaXNHcm91cCksXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IF9nZXRMYWJlbChwcm9wZXJ0eSkgOiBudWxsLFxuXHRcdGdyb3VwOiBpc0dyb3VwID8gZ3JvdXBQYXRoIDogbnVsbCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0Ly8gQSBmYWtlIHByb3BlcnR5IHdhcyBjcmVhdGVkIGZvciB0aGUgVGFyZ2V0VmFsdWUgdXNlZCBvbiBEYXRhUG9pbnRzLCB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW4gYW5kIG5vbiBzb3J0YWJsZVxuXHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdCFhdmFpbGFibGVGb3JBZGFwdGF0aW9uIHx8IGlzSGlkZGVuIHx8IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0XHQ/IChwcm9wZXJ0eSBhcyBhbnkpLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdD8uVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZT8ucGF0aCB8fCAocHJvcGVydHkgYXMgYW55KS5WYWx1ZS5wYXRoXG5cdFx0XHQ6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogIWlzSGlkZGVuICYmIG5vblNvcnRhYmxlQ29sdW1ucy5pbmRleE9mKHJlbGF0aXZlUGF0aCkgPT09IC0xICYmICFpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0fSBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG59O1xuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfaXNWYWxpZENvbHVtbiA9IGZ1bmN0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdC8vIFRvZG86IFJlcGxhY2Ugd2l0aCBwcm9wZXIgTG9nIHN0YXRlbWVudCBvbmNlIGF2YWlsYWJsZVxuXHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGxhYmVsIGZvciBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHl9IHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IG9yIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGlzR3JvdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9IExhYmVsIG9mIHRoZSBwcm9wZXJ0eSBvciBEYXRhRmllbGRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRMYWJlbCA9IGZ1bmN0aW9uKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKClcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT59IGNvbHVtbnNUb0JlQ3JlYXRlZCBJZGVudGlmaWVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmb3IgTGluZUl0ZW1zIGFuZCBQcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW4gbmFtZXMgd2hpY2ggY2Fubm90IGJlIHNvcnRlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcmV0dXJucyB7QW5ub3RhdGlvblRhYmxlQ29sdW1uW119IFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCByZWxhdGVkQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXTtcblx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRPYmplY3Qua2V5cyhjb2x1bW5zVG9CZUNyZWF0ZWQpLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydHkgPSBjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0sXG5cdFx0XHRhbm5vdGF0aW9uUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChuYW1lKSxcblx0XHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlbGF0ZWQgY29sdW1uIGFscmVhZHkgZXhpc3RzLlxuXHRcdFx0cmVsYXRlZENvbHVtbiA9IGV4aXN0aW5nQ29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fFxuXHRcdFx0KHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcyAmJiByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MuaW5kZXhPZihuYW1lKSAhPT0gLTEpXG5cdFx0KSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW4gYW5kXG5cdFx0XHQvLyBib3RoIGNhc2VzIHJlcXVpcmUgYSBkdW1teSBQcm9wZXJ0eUluZm8gZm9yIHNldHRpbmcgY29ycmVjdCBleHBvcnQgc2V0dGluZ3MuXG5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBcIlByb3BlcnR5OjpcIiArIG5hbWU7XG5cblx0XHRcdC8vIENoZWNraW5nIHdoZXRoZXIgdGhlIHJlbGF0ZWQgcHJvcGVydHkgY29sdW1uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi5cblx0XHRcdGlmICghZXhpc3RpbmdDb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBUaGUgcHJvcGVydHkgJ25hbWUnIGhhcyBiZWVuIHByZWZpeGVkIHdpdGggJ1Byb3BlcnR5OjonIGZvciB1bmlxdWVuZXNzLlxuXHQvLyBVcGRhdGUgdGhlIHNhbWUgaW4gb3RoZXIgcHJvcGVydHlJbmZvc1tdIHJlZmVyZW5jZXMgd2hpY2ggcG9pbnQgdG8gdGhpcyBwcm9wZXJ0eS5cblx0ZXhpc3RpbmdDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcblx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5tYXAocHJvcGVydHlJbmZvID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0cHJvcGVydHlJbmZvID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm9cblx0XHQpO1xuXHR9KTtcblxuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHRpbmcgdGhlIENvbHVtbiBOYW1lXG4gKiBJZiBpdCBwb2ludHMgdG8gYSBEYXRhRmllbGQgd2l0aCBvbmUgcHJvcGVydHkgb3IgRGF0YVBvaW50IHdpdGggb25lIHByb3BlcnR5LCBpdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgbmFtZVxuICogaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGZsZXggY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiBhbm5vdGF0aW9uIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSA9IGZ1bmN0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aDtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LnBhdGgpIHtcblx0XHQvLyBUaGlzIGlzIGZvciByZW1vdmluZyBkdXBsaWNhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsICdQcm9ncmVzcycgUHJvcGVydHkgaXMgcmVtb3ZlZCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBEYXRhUG9pbnRcblx0XHRyZXR1cm4gKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWUucGF0aDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblxuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgbm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRpZiAobm9uU29ydGFibGVDb2x1bW5zLmluZGV4T2YocHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHQvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRcdGlzU29ydGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdFx0Ly8gQWN0aW9uIGNvbHVtbnMgYXJlIG5vdCBzb3J0YWJsZVxuXHRcdFx0XHRpc1NvcnRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaXNTb3J0YWJsZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpOiBGb3JtYXRPcHRpb25zVHlwZSB7XG5cdHJldHVybiB7XG5cdFx0dGV4dExpbmVzRWRpdDogNFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZTogc3RyaW5nLCBzZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdGlmIChiU2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNlbWFudGlja2V5czogYVNlbWFudGljS2V5VmFsdWVzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB3aXRoIHRoZWlyIGFubm90YXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ29sdW1uW119IFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID1cblx0XHRcdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zXG5cdFx0XHRcdD8uTm9uU29ydGFibGVQcm9wZXJ0aWVzIGFzIEVkbS5Qcm9wZXJ0eVBhdGhbXSk/Lm1hcCgocHJvcGVydHk6IFByb3BlcnR5UGF0aCkgPT4gcHJvcGVydHkudmFsdWUpID8/IFtdLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Ly8gR2V0IGNvbHVtbnMgZnJvbSB0aGUgTGluZUl0ZW0gQW5ub3RhdGlvblxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKGxpbmVJdGVtID0+IHtcblx0XHRcdGlmICghX2lzVmFsaWRDb2x1bW4obGluZUl0ZW0pKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgbGluZUl0ZW0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGxpbmVJdGVtKTtcblx0XHRcdC8vIERldGVybWluZSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBjb25zdW1lZCBieSB0aGlzIExpbmVJdGVtLlxuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkobGluZUl0ZW0sIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgPSBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBzTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IF9nZXRMYWJlbChsaW5lSXRlbSwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGxpbmVJdGVtKTtcblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goe1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQobGluZUl0ZW0pLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwobGluZUl0ZW0pIDogbnVsbCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiBudWxsLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGxpbmVJdGVtLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbihsaW5lSXRlbSkgPyBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA6IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBfaXNDb2x1bW5Tb3J0YWJsZShsaW5lSXRlbSwgcmVsYXRpdmVQYXRoLCBub25Tb3J0YWJsZUNvbHVtbnMpLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiB7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1RlbXBsYXRlLFxuXHRcdFx0XHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1dyYXBwaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHdpZHRoOiBsaW5lSXRlbS5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHRcdC4uLmdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH0gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKTtcblxuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaChuYW1lID0+IHtcblx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEdldCBjb2x1bW5zIGZyb20gdGhlIFByb3BlcnRpZXMgb2YgRW50aXR5VHlwZVxuXHRsZXQgdGFibGVDb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlVHlwZVxuXHQpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KGFubm90YXRpb25Db2x1bW5zKTtcblxuXHQvLyBDcmVhdGUgYSBwcm9wZXJ0eUluZm8gZm9yIGVhY2ggcmVsYXRlZCBwcm9wZXJ0eS5cblx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoY29sdW1uc1RvQmVDcmVhdGVkLCB0YWJsZUNvbHVtbnMsIG5vblNvcnRhYmxlQ29sdW1ucywgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdHRhYmxlQ29sdW1ucyA9IHRhYmxlQ29sdW1ucy5jb25jYXQocmVsYXRlZENvbHVtbnMpO1xuXG5cdHJldHVybiB0YWJsZUNvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBjaGVja3MgYWdhaW5zdCBleGlzdGluZyBwcm9wZXJ0aWVzIGFscmVhZHkgYWRkZWQgYnkgYW5ub3RhdGlvbnMuXG4gKiBJZiBhIG5vdCB5ZXQgc3RvcmVkIHByb3BlcnR5IGlzIGZvdW5kIGl0IGFkZHMgaXQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvbmx5IHRvIHRoZSBhbm5vdGF0aW9uQ29sdW1ucy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRhYmxlQ29sdW1uW119IGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IF9nZXRQcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24oXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0bGV0IG1hdGNoZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRtYXRjaGVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uKHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoZnVuY3Rpb24oYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbihwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0Lm1hcChwcm9wZXJ0eSA9PiB7XG5cdFx0XHRyZXR1cm4gYHske3Byb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSl9fWA7XG5cdFx0fSlcblx0XHQuam9pbihgJHtcIlxcblwifWApO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRhYmxlIGNvbHVtbiBwcm9wZXJ0eSB2YWx1ZSBiYXNlZCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuXG4gKlxuICogTWFuaWZlc3QgZGVmaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIC8gYW5ub3RhdGlvbiBjb2x1bW5zXG4gKiBEZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciBjdXN0b20gY29sdW1uIGlmIG5vdCBvdmVyd3JpdHRlbiBpbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcHJvcGVydHkgVGhlIGNvbHVtbiBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHBhcmFtIHthbnl9IGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBbm5vdGF0aW9uQ29sdW1uIFdoZXRoZXIgdGhlIGNvbHVtbiwgZGVmaW5lZCBpbiBtYW5pZmVzdCwgY29ycmVzcG9uZHMgdG8gYW4gZXhpc3RpbmcgYW5ub3RhdGlvbiBjb2x1bW4uXG4gKiBAcmV0dXJucyB7YW55fSBEZXRlcm1pbmVkIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgY29sdW1uXG4gKi9cbmNvbnN0IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24ocHJvcGVydHk6IGFueSwgZGVmYXVsdFZhbHVlOiBhbnksIGlzQW5ub3RhdGlvbkNvbHVtbjogYm9vbGVhbik6IGFueSB7XG5cdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gSWYgYW5ub3RhdGlvbiBjb2x1bW4gaGFzIG5vIHByb3BlcnR5IGRlZmluZWQgaW4gbWFuaWZlc3QsXG5cdFx0Ly8gZG8gbm90IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbmlmZXN0IGNvbHVtbidzIGRlZmF1bHQgdmFsdWUuXG5cdFx0cmV0dXJuIGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGRlZmF1bHRWYWx1ZTtcblx0fVxuXHQvLyBSZXR1cm4gd2hhdCBpcyBkZWZpbmVkIGluIG1hbmlmZXN0LlxuXHRyZXR1cm4gcHJvcGVydHk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+fSBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24oXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0VGFibGVDb2x1bW4+LFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUNvbHVtbj4ge1xuXHRjb25zdCBpbnRlcm5hbENvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUNvbHVtbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBjb2x1bW5zKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3RDb2x1bW4gPSBjb2x1bW5zW2tleV07XG5cdFx0Ly8gVG8gaWRlbnRpZnkgdGhlIGFubm90YXRpb24gY29sdW1uIHByb3BlcnR5IG92ZXJ3cml0ZSB2aWEgbWFuaWZlc3QgdXNlLWNhc2UuXG5cdFx0Y29uc3QgaXNBbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRQcm9wZXJ0eU5hbWVzKFxuXHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdGVudGl0eVR5cGVcblx0XHQpO1xuXG5cdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSB7XG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRuYW1lOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRoZWFkZXI6IG1hbmlmZXN0Q29sdW1uLmhlYWRlcixcblx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlKG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24sIEhvcml6b250YWxBbGlnbi5CZWdpbiwgaXNBbm5vdGF0aW9uQ29sdW1uKSxcblx0XHRcdHR5cGU6IG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IFwiU2xvdFwiID8gQ29sdW1uVHlwZS5TbG90IDogQ29sdW1uVHlwZS5EZWZhdWx0LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHR0ZW1wbGF0ZTogbWFuaWZlc3RDb2x1bW4udGVtcGxhdGUgfHwgXCJ1bmRlZmluZWRcIixcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0c2V0dGluZ3M6IG1hbmlmZXN0Q29sdW1uLnNldHRpbmdzLFxuXHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IHtcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHQuLi5tYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zXG5cdFx0XHR9LFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IHtcblx0XHRcdFx0dGVtcGxhdGU6IHByb3BlcnR5SW5mb3MgPyBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcykgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZpZWxkTGFiZWw6IHByb3BlcnR5SW5mb3MgPyBtYW5pZmVzdENvbHVtbi5oZWFkZXIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdHdyYXA6IHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gaW50ZXJuYWxDb2x1bW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFAxM25Nb2RlKFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZSA9IG1hbmlmZXN0V3JhcHBlci5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBhUGVyc29uYWxpemF0aW9uOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBiQW5hbHl0aWNhbFRhYmxlID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0aWYgKHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8ucGVyc29uYWxpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyBQZXJzb25hbGl6YXRpb24gY29uZmlndXJlZCBpbiBtYW5pZmVzdC5cblx0XHRjb25zdCBwZXJzb25hbGl6YXRpb246IGFueSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzLnBlcnNvbmFsaXphdGlvbjtcblx0XHRpZiAocGVyc29uYWxpemF0aW9uID09PSB0cnVlKSB7XG5cdFx0XHQvLyBUYWJsZSBwZXJzb25hbGl6YXRpb24gZnVsbHkgZW5hYmxlZC5cblx0XHRcdHJldHVybiBiQW5hbHl0aWNhbFRhYmxlID8gXCJTb3J0LENvbHVtbixGaWx0ZXIsR3JvdXAsQWdncmVnYXRlXCIgOiBcIlNvcnQsQ29sdW1uLEZpbHRlclwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHBlcnNvbmFsaXphdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Ly8gU3BlY2lmaWMgcGVyc29uYWxpemF0aW9uIG9wdGlvbnMgZW5hYmxlZCBpbiBtYW5pZmVzdC4gVXNlIHRoZW0gYXMgaXMuXG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLnNvcnQpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uY29sdW1uKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkNvbHVtblwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZmlsdGVyKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZ3JvdXAgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uYWdncmVnYXRlICYmIGJBbmFseXRpY2FsVGFibGUpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQWdncmVnYXRlXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24ubGVuZ3RoID4gMCA/IGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIikgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIE5vIHBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIlNvcnRcIik7XG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCA9PT0gVmFyaWFudE1hbmFnZW1lbnRUeXBlLkNvbnRyb2wpIHtcblx0XHRcdC8vIEZlYXR1cmUgcGFyaXR5IHdpdGggVjIuXG5cdFx0XHQvLyBFbmFibGUgdGFibGUgZmlsdGVyaW5nIGJ5IGRlZmF1bHQgb25seSBpbiBjYXNlIG9mIENvbnRyb2wgbGV2ZWwgdmFyaWFudCBtYW5hZ2VtZW50LlxuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdH1cblx0XHRpZiAoYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0fVxuXHRcdHJldHVybiBhUGVyc29uYWxpemF0aW9uLmpvaW4oXCIsXCIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBEZWxldGUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aCBQYXRoIHRvIHRoZSBuYXZpZ2F0aW9uIGVudGl0eVxuICogQHBhcmFtIGlzVGFyZ2V0RGVsZXRhYmxlIEZsYWcgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdGFyZ2V0IGlzIGRlbGV0YWJsZVxuICogQHBhcmFtIHZpZXdDb25maWd1cmF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZpZXcgcGF0aFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgRGVsZXRlIGJ1dHRvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlVmlzaWJsZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZyxcblx0aXNUYXJnZXREZWxldGFibGU6IGJvb2xlYW4sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IG5hdlByb3AubmFtZSk7XG5cdGNvbnN0IGlzRGVsZXRlSGlkZGVuRXhwcmVzc2lvbiA9IGN1cnJlbnRFbnRpdHlTZXRcblx0XHQ/IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHQoY3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcblx0Y29uc3QgaXNEZWxldGVIaWRkZW46IGFueSA9IGNvbXBpbGVCaW5kaW5nKGlzRGVsZXRlSGlkZGVuRXhwcmVzc2lvbik7XG5cdGxldCBpc1BhcmVudERlbGV0YWJsZSwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UpIHtcblx0XHRpc1BhcmVudERlbGV0YWJsZSA9IGlzUGF0aERlbGV0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgbmF2aWdhdGlvblBhdGgpO1xuXHRcdHBhcmVudEVudGl0eVNldERlbGV0YWJsZSA9IGlzUGFyZW50RGVsZXRhYmxlID8gY29tcGlsZUJpbmRpbmcoaXNQYXJlbnREZWxldGFibGUpIDogaXNQYXJlbnREZWxldGFibGU7XG5cdH1cblx0Ly9kbyBub3Qgc2hvdyBjYXNlIHRoZSBkZWxldGUgYnV0dG9uIGlmIHBhcmVudEVudGl0eVNldERlbGV0YWJsZSBpcyBmYWxzZVxuXHRpZiAocGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID09PSBcImZhbHNlXCIpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZWxzZSBpZiAocGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICYmIGlzRGVsZXRlSGlkZGVuICE9PSBcInRydWVcIikge1xuXHRcdC8vRGVsZXRlIEhpZGRlbiBpbiBjYXNlIG9mIHRydWUgYW5kIHBhdGggYmFzZWRcblx0XHRpZiAoaXNEZWxldGVIaWRkZW4gJiYgaXNEZWxldGVIaWRkZW4gIT09IFwiZmFsc2VcIikge1xuXHRcdFx0cmV0dXJuIFwiez0gISRcIiArIGlzRGVsZXRlSGlkZGVuICsgXCIgJiYgJHt1aT4vZWRpdE1vZGV9ID09PSAnRWRpdGFibGUnfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJ7PSAke3VpPi9lZGl0TW9kZX0gPT09ICdFZGl0YWJsZSd9XCI7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKFxuXHRcdGlzRGVsZXRlSGlkZGVuID09PSBcInRydWVcIiB8fFxuXHRcdCFpc1RhcmdldERlbGV0YWJsZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKSB8fFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGVsc2UgaWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0aWYgKGlzRGVsZXRlSGlkZGVuICYmIGlzRGVsZXRlSGlkZGVuID09PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybiBcIns9ICEkXCIgKyBpc0RlbGV0ZUhpZGRlbiArIFwiICYmICR7dWk+L2VkaXRNb2RlfSA9PT0gJ0VkaXRhYmxlJ31cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiez0gJHt1aT4vZWRpdE1vZGV9ID09PSAnRWRpdGFibGUnfVwiO1xuXHRcdH1cblx0fSBlbHNlIGlmIChpc0JpbmRpbmcoaXNEZWxldGVIaWRkZW5FeHByZXNzaW9uKSkge1xuXHRcdC8vIFVJLkRlbGV0ZUhpZGRlbiBhbm5vdGF0aW9uIHBvaW50cyB0byBhIHBhdGhcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcobm90KGlzRGVsZXRlSGlkZGVuRXhwcmVzc2lvbikpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZW5hYmxlbWVudCBmb3IgdGhlICdNYXNzIEVkaXQnIGJ1dHRvblxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gYk1hc3NFZGl0VmlzaWJsZSBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgJ01hc3MgRWRpdCcgYnV0dG9uXG4gKiBAcmV0dXJucyB7Kn0gRXhwcmVzc2lvbiBvciBCb29sZWFuIHZhbHVlIGZvciB0aGUgZW5hYmxlbWVudCBvZiB0aGUgJ01hc3MgRWRpdCcgYnV0dG9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuYWJsZW1lbnRNYXNzRWRpdChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0Yk1hc3NFZGl0VmlzaWJsZTogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgYm9vbGVhbiB7XG5cdGlmIChiTWFzc0VkaXRWaXNpYmxlKSB7XG5cdFx0Y29uc3QgaXNQYXJlbnRVcGRhdGFibGU6IGFueSA9IGlzUGF0aFVwZGF0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHQvL3doZW4gdXBkYXRhYmxlIGlzIHBhdGggYmFzZWQgYW5kIHBvaW50aW5nIHRvIGN1cnJlbnQgZW50aXR5IHNldCBwcm9wZXJ0eSwgdGhhdCBjYXNlIGlzIGhhbmRsZWQgaW4gdGFibGUgaGVscGVyIGFuZCBydW50aW1lXG5cdFx0aWYgKGlzUGFyZW50VXBkYXRhYmxlPy5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgb0V4cHJlc3Npb246IGFueSA9IGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50VXBkYXRhYmxlKTtcblx0XHRyZXR1cm4gaXNQYXJlbnRVcGRhdGFibGVcblx0XHRcdD8gXCJ7PSAle2ludGVybmFsPm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c30gPj0gMiAmJiBcIiArIGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50VXBkYXRhYmxlLCBvRXhwcmVzc2lvbikgKyBcIn1cIlxuXHRcdFx0OiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlICdNYXNzIEVkaXQnIGJ1dHRvblxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gVGhlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhcmdldENhcGFiaWxpdGllcyBUaGUgdGFyZ2V0IGNhcGFiaWxpdHkgcmVzdHJpY3Rpb25zIGZvciB0aGUgdGFibGVcbiAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlIFRoZSBzZWxlY3Rpb24gbW9kZSBmb3IgdGhlIHRhYmxlXG4gKiBAcmV0dXJucyB7Kn0gRXhwcmVzc2lvbiBvciBCb29sZWFuIHZhbHVlIGZvciB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgJ01hc3MgRWRpdCcgYnV0dG9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpc2liaWxpdHlNYXNzRWRpdChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdHNlbGVjdGlvbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCksXG5cdFx0YlVwZGF0ZUhpZGRlbjogYW55ID0gZW50aXR5U2V0ICYmIGVudGl0eVNldD8uYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbj8udmFsdWVPZigpLFxuXHRcdGJNYXNzRWRpdEVuYWJsZWQ6IGJvb2xlYW4gPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj8uZW5hYmxlTWFzc0VkaXQgfHwgZmFsc2UsXG5cdFx0aVNlbGVjdGlvbkxpbWl0OiBudW1iZXIgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj8uc2VsZWN0aW9uTGltaXQ7XG5cdGxldCBiTWFzc0VkaXRWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcblx0aWYgKChzZWxlY3Rpb25Nb2RlICYmIHNlbGVjdGlvbk1vZGUgPT09IFwiU2luZ2xlXCIpIHx8IChpU2VsZWN0aW9uTGltaXQgJiYgaVNlbGVjdGlvbkxpbWl0IDwgMikpIHtcblx0XHRiTWFzc0VkaXRWaXNpYmxlID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAoc2VsZWN0aW9uTW9kZSAmJiAoc2VsZWN0aW9uTW9kZSA9PT0gXCJBdXRvXCIgfHwgc2VsZWN0aW9uTW9kZSA9PT0gXCJOb25lXCIpKSB7XG5cdFx0Yk1hc3NFZGl0VmlzaWJsZSA9IHRydWU7XG5cdH1cblx0aWYgKHRhcmdldENhcGFiaWxpdGllcz8uaXNVcGRhdGFibGUgIT09IGZhbHNlICYmIGJNYXNzRWRpdFZpc2libGUgJiYgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdGlmIChiVXBkYXRlSGlkZGVuICYmIHR5cGVvZiBiVXBkYXRlSGlkZGVuID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0cmV0dXJuICFiVXBkYXRlSGlkZGVuICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlID8gY29tcGlsZUJpbmRpbmcoVUkuSXNFZGl0YWJsZSkgOiBmYWxzZTtcblx0XHR9IGVsc2UgaWYgKGJVcGRhdGVIaWRkZW4gJiYgYlVwZGF0ZUhpZGRlbj8ucGF0aCkge1xuXHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlXG5cdFx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5kKGVxdWFsKFVJLklzRWRpdGFibGUsIHRydWUpLCBlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihiVXBkYXRlSGlkZGVuKSwgZmFsc2UpKSlcblx0XHRcdFx0OiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlID8gY29tcGlsZUJpbmRpbmcoVUkuSXNFZGl0YWJsZSkgOiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBDcmVhdGUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGlvbk1vZGUgVGhlIG1vZGUgdXNlZCBmb3IgY3JlYXRpb25cbiAqIEBwYXJhbSBpc0luc2VydGFibGUgQW5ub3RhdGlvbiBleHByZXNzaW9uIG9mIEluc2VydFJlc3RyaWN0aW9ucy5JbnNlcnRhYmxlXG4gKiBAcGFyYW0gdmlld0NvbmZpZ3VyYXRpb24gVGhlIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgdmlldyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBvciBCb29sZWFuIHZhbHVlIG9mIHRoZSAnVUkuQ3JlYXRlSGlkZGVuJyBhbm5vdGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmxlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSB8IFwiRXh0ZXJuYWxcIixcblx0aXNJbnNlcnRhYmxlOiBFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IG5hdlByb3AubmFtZSk7XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuOiBFeHByZXNzaW9uPGJvb2xlYW4+ID0gY3VycmVudEVudGl0eVNldFxuXHRcdD8gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VST8uQ3JlYXRlSGlkZGVuIGFzIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+KSB8fCBmYWxzZSxcblx0XHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHQocGF0aDogc3RyaW5nKSA9PiBzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzKVxuXHRcdCAgKVxuXHRcdDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIGlmIHRoZXJlIGlzIGEgY3VzdG9tIG5ldyBhY3Rpb24gdGhlIGNyZWF0ZSBidXR0b24gd2lsbCBiZSBib3VuZCBhZ2FpbnN0IHRoaXMgbmV3IGFjdGlvbiAoaW5zdGVhZCBvZiBhIFBPU1QgYWN0aW9uKS5cblx0Ly8gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGNyZWF0ZSBidXR0b24gdGhlbiBkZXBlbmRzIG9uIHRoZSBuZXcgYWN0aW9uJ3MgT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb24gKGluc3RlYWQgb2YgdGhlIGluc2VydFJlc3RyaWN0aW9ucyk6XG5cdC8vIE9wZXJhdGlvbkF2YWlsYWJsZSA9IHRydWUgb3IgdW5kZWZpbmVkIC0+IGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIE9wZXJhdGlvbkF2YWlsYWJsZSA9IGZhbHNlIC0+IGNyZWF0ZSBpcyBub3QgdmlzaWJsZVxuXHRjb25zdCBuZXdBY3Rpb25OYW1lOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+ID0gY3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Q/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblx0Y29uc3Qgc2hvd0NyZWF0ZUZvck5ld0FjdGlvbiA9IG5ld0FjdGlvbk5hbWVcblx0XHQ/IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXS5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlPy52YWx1ZU9mKCksXG5cdFx0XHRcdFtdLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHQocGF0aDogc3RyaW5nKSA9PiBzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBbXSlcblx0XHQgIClcblx0XHQ6IHVuZGVmaW5lZDtcblxuXHQvLyAtIElmIGl0J3Mgc3RhdGljYWxseSBub3QgaW5zZXJ0YWJsZSAtPiBjcmVhdGUgaXMgbm90IHZpc2libGVcblx0Ly8gLSBJZiBjcmVhdGUgaXMgc3RhdGljYWxseSBoaWRkZW4gLT4gY3JlYXRlIGlzIG5vdCB2aXNpYmxlXG5cdC8vIC0gSWYgaXQncyBhbiBBTFAgdGVtcGxhdGUgLT4gY3JlYXRlIGlzIG5vdCB2aXNpYmxlXG5cdC8vIC1cblx0Ly8gLSBPdGhlcndpc2Vcblx0Ly8gXHQgLSBJZiB0aGUgY3JlYXRlIG1vZGUgaXMgZXh0ZXJuYWwgLT4gY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgLSBJZiB3ZSdyZSBvbiB0aGUgbGlzdCByZXBvcnQgLT5cblx0Ly8gXHQgXHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0LSBPdGhlcndpc2UsIGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIFx0IC0gT3RoZXJ3aXNlXG5cdC8vIFx0ICAgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0b3IoXG5cdFx0XHRcdGVxdWFsKHNob3dDcmVhdGVGb3JOZXdBY3Rpb24sIGZhbHNlKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksIGVxdWFsKHNob3dDcmVhdGVGb3JOZXdBY3Rpb24sIHVuZGVmaW5lZCkpXG5cdFx0XHQpLFxuXHRcdFx0aXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbikgJiYgZXF1YWwoaXNDcmVhdGVIaWRkZW4sIHRydWUpLFxuXHRcdFx0b3IoXG5cdFx0XHRcdHZpZXdDb25maWd1cmF0aW9uID8gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSA6IGZhbHNlLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHQpXG5cdFx0KSxcblx0XHRmYWxzZSxcblx0XHRpZkVsc2UoXG5cdFx0XHRjcmVhdGlvbk1vZGUgPT09IFwiRXh0ZXJuYWxcIixcblx0XHRcdHRydWUsXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzQ3JlYXRlSGlkZGVuKSwgbm90KGlzQ3JlYXRlSGlkZGVuKSwgdHJ1ZSksXG5cdFx0XHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgUGFzdGUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGlvbkJlaGF2aW91ciBUaGUgY2hvc2VuIGJlaGF2aW9yIG9mIGNyZWF0aW9uXG4gKiBAcGFyYW0gaXNJbnNlcnRhYmxlIFRoZSBleHByZXNzaW9uIHdoaWNoIGRlbm90ZXMgaW5zZXJ0IHJlc3RyaWN0aW9uc1xuICogQHBhcmFtIHBhc3RlRW5hYmxlZEluTWFuaWZlc3QgVGhlIGZsYWcgd2hpY2ggZGVub3RlcyB0aGUgcGFzdGUgZW5hYmxlbWVudCBzdGF0dXMgdmlhIG1hbmlmZXN0XG4gKiBAcGFyYW0gdmlld0NvbmZpZ3VyYXRpb24gVGhlIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgdmlldyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBvciBCb29sZWFuIHZhbHVlIG9mIHRoZSBVSS5DcmVhdGVIaWRkZW4gYW5ub3RhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFzdGVFbmFibGVkKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjcmVhdGlvbkJlaGF2aW91cjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbltcImNyZWF0ZVwiXSxcblx0aXNJbnNlcnRhYmxlOiBFeHByZXNzaW9uPGJvb2xlYW4+LFxuXHRwYXN0ZUVuYWJsZWRJbk1hbmlmZXN0OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdC8vIElmIGNyZWF0ZSBpcyBub3QgdmlzaWJsZSAtPiBpdCdzIG5vdCBlbmFibGVkXG5cdC8vIElmIGNyZWF0ZSBpcyB2aXNpYmxlIC0+XG5cdC8vIFx0IElmIGl0J3MgaW4gdGhlIExpc3RSZXBvcnQgLT4gbm90IGVuYWJsZWRcblx0Ly9cdCBJZiBpdCdzIGluc2VydGFibGUgLT4gZW5hYmxlZFxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHBhc3RlRW5hYmxlZEluTWFuaWZlc3QgJiYgZXF1YWwoZ2V0Q3JlYXRlVmlzaWJsZShjb252ZXJ0ZXJDb250ZXh0LCBjcmVhdGlvbkJlaGF2aW91ci5tb2RlLCBpc0luc2VydGFibGUsIHZpZXdDb25maWd1cmF0aW9uKSwgdHJ1ZSksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgaXNJbnNlcnRhYmxlLFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgc29ydCBjb25kaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3J0IGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IHNvcnRDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uU29ydE9yZGVyKSB7XG5cdFx0Y29uc3Qgc29ydGVyczogU29ydGVyVHlwZVtdID0gW107XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHtcblx0XHRcdHNvcnRlcnM6IHNvcnRlcnNcblx0XHR9O1xuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlNvcnRPcmRlci5mb3JFYWNoKGNvbmRpdGlvbiA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSAoY29uZGl0aW9uLlByb3BlcnR5IGFzIFByb3BlcnR5UGF0aCk/LiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHRjb25zdCBzb3J0Q29sdW1uID0gY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHlOYW1lKSBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRzb3J0Q29sdW1uPy5wcm9wZXJ0eUluZm9zPy5mb3JFYWNoKHJlbGF0ZWRQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHQvLyBDb21wbGV4IFByb3BlcnR5SW5mby4gQWRkIGVhY2ggcmVsYXRlZCBwcm9wZXJ0eSBmb3Igc29ydGluZy5cblx0XHRcdFx0Y29uZGl0aW9ucy5zb3J0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IHJlbGF0ZWRQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoIXNvcnRDb2x1bW4/LnByb3BlcnR5SW5mb3M/Lmxlbmd0aCkge1xuXHRcdFx0XHQvLyBOb3QgYSBjb21wbGV4IFByb3BlcnR5SW5mby4gQ29uc2lkZXIgdGhlIHByb3BlcnR5IGl0c2VsZiBmb3Igc29ydGluZy5cblx0XHRcdFx0Y29uZGl0aW9ucy5zb3J0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRkZXNjZW5kaW5nOiAhIWNvbmRpdGlvbi5EZXNjZW5kaW5nXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHNvcnRDb25kaXRpb25zID0gY29uZGl0aW9ucy5zb3J0ZXJzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpIDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBzb3J0Q29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBwcm9wZXJ0eVBhdGggdG8gYW4gYXJyYXkgb2YgcHJvcGVydHlJbmZvIG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXRocyB0aGUgYXJyYXkgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0gY29sdW1ucyB0aGUgYXJyYXkgb2YgcHJvcGVydHlJbmZvc1xuICogQHJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHlJbmZvIG5hbWVzXG4gKi9cblxuZnVuY3Rpb24gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhwYXRoczogUHJvcGVydHlQYXRoW10sIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGluZm9OYW1lczogc3RyaW5nW10gPSBbXTtcblx0cGF0aHMuZm9yRWFjaChjdXJyZW50UGF0aCA9PiB7XG5cdFx0aWYgKGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUluZm8gPSBjb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRcdHJldHVybiAhYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBjdXJyZW50UGF0aD8uJHRhcmdldD8ubmFtZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mbykge1xuXHRcdFx0XHRpbmZvTmFtZXMucHVzaChwcm9wZXJ0eUluZm8ubmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gaW5mb05hbWVzO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIFByZXNlbnRhdGlvbiBWYXJpYW50IGdyb3VwIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBncm91cENvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Hcm91cEJ5KSB7XG5cdFx0Y29uc3QgYUdyb3VwQnkgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Hcm91cEJ5IGFzIFByb3BlcnR5UGF0aFtdO1xuXHRcdGNvbnN0IGFHcm91cExldmVscyA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYUdyb3VwQnksIGNvbHVtbnMpLm1hcChpbmZvTmFtZSA9PiB7XG5cdFx0XHRyZXR1cm4geyBuYW1lOiBpbmZvTmFtZSB9O1xuXHRcdH0pO1xuXG5cdFx0Z3JvdXBDb25kaXRpb25zID0gYUdyb3VwTGV2ZWxzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KHsgZ3JvdXBMZXZlbHM6IGFHcm91cExldmVscyB9KSA6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gZ3JvdXBDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIFByZXNlbnRhdGlvbiBWYXJpYW50IGFnZ3JlZ2F0ZSBjb25kaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGFnZ3JlZ2F0ZUNvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Ub3RhbCkge1xuXHRcdGNvbnN0IGFUb3RhbHMgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Ub3RhbCBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0XHRjb25zdCBhZ2dyZWdhdGVzOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+ID0ge307XG5cdFx0Y29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhVG90YWxzLCBjb2x1bW5zKS5mb3JFYWNoKGluZm9OYW1lID0+IHtcblx0XHRcdGFnZ3JlZ2F0ZXNbaW5mb05hbWVdID0ge307XG5cdFx0fSk7XG5cblx0XHRhZ2dyZWdhdGVDb25kaXRpb25zID0gSlNPTi5zdHJpbmdpZnkoYWdncmVnYXRlcyk7XG5cdH1cblxuXHRyZXR1cm4gYWdncmVnYXRlQ29uZGl0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uIHtcblx0Ly8gTmVlZCB0byBnZXQgdGhlIHRhcmdldFxuXHRjb25zdCB7IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfSA9IHNwbGl0UGF0aCh2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRpdGxlOiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWVQbHVyYWw7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVNldDtcblx0Y29uc3QgcGFnZU1hbmlmZXN0U2V0dGluZ3M6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IGhhc0Fic29sdXRlUGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoID09PSAwLFxuXHRcdHAxM25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXRQMTNuTW9kZSh2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24pLFxuXHRcdGlkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IFRhYmxlSUQodmlzdWFsaXphdGlvblBhdGgpIDogVGFibGVJRChjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCksIFwiTGluZUl0ZW1cIik7XG5cdGNvbnN0IHRhcmdldENhcGFiaWxpdGllcyA9IGdldENhcGFiaWxpdHlSZXN0cmljdGlvbihjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgaGFzQWJzb2x1dGVQYXRoLCB0YXJnZXRDYXBhYmlsaXRpZXMpO1xuXHRsZXQgdGhyZXNob2xkID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IDEwIDogMzA7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uTWF4SXRlbXMpIHtcblx0XHR0aHJlc2hvbGQgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5NYXhJdGVtcy52YWx1ZU9mKCkgYXMgbnVtYmVyO1xuXHR9XG5cdGNvbnN0IG5hdmlnYXRpb25UYXJnZXRQYXRoID0gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25TZXR0aW5ncyA9IHBhZ2VNYW5pZmVzdFNldHRpbmdzLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY3JlYXRpb25CZWhhdmlvdXIgPSBfZ2V0Q3JlYXRpb25CZWhhdmlvdXIobGluZUl0ZW1Bbm5vdGF0aW9uLCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKTtcblx0bGV0IGlzUGFyZW50RGVsZXRhYmxlOiBhbnksIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0aWYgKGlzUGFyZW50RGVsZXRhYmxlPy5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb24pIHtcblx0XHRcdHBhcmVudEVudGl0eVNldERlbGV0YWJsZSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID0gaXNQYXJlbnREZWxldGFibGUgPyBjb21waWxlQmluZGluZyhpc1BhcmVudERlbGV0YWJsZSwgdHJ1ZSkgOiBpc1BhcmVudERlbGV0YWJsZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBpc0luc2VydGFibGU6IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBpc1BhdGhJbnNlcnRhYmxlKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgYk1hc3NFZGl0VmlzaWJsZTogYW55ID0gZ2V0VmlzaWJpbGl0eU1hc3NFZGl0KGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLCB0YXJnZXRDYXBhYmlsaXRpZXMsIHNlbGVjdGlvbk1vZGUpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblxuXHRyZXR1cm4ge1xuXHRcdGlkOiBpZCxcblx0XHRlbnRpdHlOYW1lOiBlbnRpdHlTZXQgPyBlbnRpdHlTZXQubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0bmF2aWdhdGlvblRhcmdldFBhdGhcblx0XHQpLFxuXHRcdHAxM25Nb2RlOiBwMTNuTW9kZSxcblx0XHRzaG93OiB7XG5cdFx0XHRcImRlbGV0ZVwiOiBnZXREZWxldGVWaXNpYmxlKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSwgdmlld0NvbmZpZ3VyYXRpb24pLFxuXHRcdFx0Y3JlYXRlOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVWaXNpYmxlKGNvbnZlcnRlckNvbnRleHQsIGNyZWF0aW9uQmVoYXZpb3VyPy5tb2RlLCBpc0luc2VydGFibGUpKSxcblx0XHRcdHBhc3RlOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0Z2V0UGFzdGVFbmFibGVkKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0Y3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmVuYWJsZVBhc3RlLFxuXHRcdFx0XHRcdHZpZXdDb25maWd1cmF0aW9uXG5cdFx0XHRcdClcblx0XHRcdCksXG5cdFx0XHRtYXNzRWRpdDoge1xuXHRcdFx0XHR2aXNpYmxlOiBiTWFzc0VkaXRWaXNpYmxlLFxuXHRcdFx0XHRlbmFibGVkOiBnZXRFbmFibGVtZW50TWFzc0VkaXQoY29udmVydGVyQ29udGV4dCwgYk1hc3NFZGl0VmlzaWJsZSlcblx0XHRcdH1cblx0XHR9LFxuXHRcdGRpc3BsYXlNb2RlOiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24pLFxuXHRcdGNyZWF0ZTogY3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0c2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSxcblx0XHRhdXRvQmluZE9uSW5pdDpcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlICYmXG5cdFx0XHQhKHZpZXdDb25maWd1cmF0aW9uICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbikpLFxuXHRcdHZhcmlhbnRNYW5hZ2VtZW50OiB2YXJpYW50TWFuYWdlbWVudCA9PT0gXCJDb250cm9sXCIgJiYgIXAxM25Nb2RlID8gVmFyaWFudE1hbmFnZW1lbnRUeXBlLk5vbmUgOiB2YXJpYW50TWFuYWdlbWVudCxcblx0XHR0aHJlc2hvbGQ6IHRocmVzaG9sZCxcblx0XHRzb3J0Q29uZGl0aW9uczogZ2V0U29ydENvbmRpdGlvbnMocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGNvbHVtbnMpLFxuXHRcdHBhcmVudEVudGl0eURlbGV0ZUVuYWJsZWQ6IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0aWYgKFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHR0ZW1wbGF0ZVR5cGUgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgfHxcblx0XHQodmlld0NvbmZpZ3VyYXRpb24gJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0Ly8gdXBkYXRhYmxlIHdpbGwgYmUgaGFuZGxlZCBhdCB0aGUgcHJvcGVydHkgbGV2ZWxcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSB2aXN1YWxpemF0aW9uIHBhdGggaW50byB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBwYXRoIGFuZCBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2goUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dDogYm9vbGVhbiA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0bGV0IHF1aWNrU2VsZWN0aW9uVmFyaWFudDogYW55O1xuXHRjb25zdCBxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdID0gW107XG5cdGxldCBlbmFibGVFeHBvcnQgPSB0cnVlO1xuXHRsZXQgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGxldCBmaWx0ZXJzO1xuXHRsZXQgY3JlYXRlQXRFbmQgPSB0cnVlO1xuXHRsZXQgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9IGZhbHNlO1xuXHRsZXQgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRsZXQgY29uZGVuc2VkVGFibGVMYXlvdXQgPSBmYWxzZTtcblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGxldCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdGxldCBzZWxlY3Rpb25MaW1pdCA9IDIwMDtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTtcblx0bGV0IGVuYWJsZVBhc3RlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cdGNvbnN0IGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQgPSBjaGVja0NvbmRlbnNlZExheW91dCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50KCk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pO1xuXHRcdHRhYmxlU2V0dGluZ3M/LnF1aWNrVmFyaWFudFNlbGVjdGlvbj8ucGF0aHM/LmZvckVhY2goKHBhdGg6IHsgYW5ub3RhdGlvblBhdGg6IHN0cmluZyB9KSA9PiB7XG5cdFx0XHRxdWlja1NlbGVjdGlvblZhcmlhbnQgPSB0YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKFwiQFwiICsgcGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHQvLyBxdWlja1NlbGVjdGlvblZhcmlhbnQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0aWYgKHF1aWNrU2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRxdWlja0ZpbHRlclBhdGhzLnB1c2goeyBhbm5vdGF0aW9uUGF0aDogcGF0aC5hbm5vdGF0aW9uUGF0aCB9KTtcblx0XHRcdH1cblx0XHRcdGZpbHRlcnMgPSB7XG5cdFx0XHRcdHF1aWNrRmlsdGVyczoge1xuXHRcdFx0XHRcdGVuYWJsZWQ6XG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydFxuXHRcdFx0XHRcdFx0XHQ/IFwiez0gJHtwYWdlSW50ZXJuYWw+aGFzUGVuZGluZ0ZpbHRlcnN9ICE9PSB0cnVlfVwiXG5cdFx0XHRcdFx0XHRcdDogdHJ1ZSxcblx0XHRcdFx0XHRzaG93Q291bnRzOiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMsXG5cdFx0XHRcdFx0cGF0aHM6IHF1aWNrRmlsdGVyUGF0aHNcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRjcmVhdGlvbk1vZGUgPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8ubmFtZSB8fCBjcmVhdGlvbk1vZGU7XG5cdFx0Y3JlYXRlQXRFbmQgPSB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgIT09IHVuZGVmaW5lZCA/IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jcmVhdGVBdEVuZCA6IHRydWU7XG5cdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHQvLyBpZiBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCwgaS5lLiBzZXQgdG8gZmFsc2Vcblx0XHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhID0gIWN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA/ICEhdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgOiBmYWxzZTtcblx0XHRjb25kZW5zZWRUYWJsZUxheW91dCA9IHRhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgIT09IHVuZGVmaW5lZCA/IHRhYmxlU2V0dGluZ3MuY29uZGVuc2VkVGFibGVMYXlvdXQgOiBmYWxzZTtcblx0XHRoaWRlVGFibGVUaXRsZSA9ICEhdGFibGVTZXR0aW5ncy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LmhpZGVUYWJsZVRpdGxlO1xuXHRcdHRhYmxlVHlwZSA9IHRhYmxlU2V0dGluZ3M/LnR5cGUgfHwgXCJSZXNwb25zaXZlVGFibGVcIjtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIpIHtcblx0XHRcdGlmICh0YWJsZVNldHRpbmdzPy50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0XHRcdHRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRhYmxlU2V0dGluZ3M/LnR5cGUpIHtcblx0XHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNEZXNrdG9wKCkgJiYgYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHRcdHRhYmxlVHlwZSA9IFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFibGVUeXBlID0gXCJSZXNwb25zaXZlVGFibGVcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuIHx8IGZhbHNlO1xuXHRcdGlmIChlbmFibGVGdWxsU2NyZWVuID09PSB0cnVlICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0XHRlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkxvdywgSXNzdWVUeXBlLkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUKTtcblx0XHR9XG5cdFx0c2VsZWN0aW9uTGltaXQgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gdHJ1ZSB8fCB0YWJsZVNldHRpbmdzLnNlbGVjdGlvbkxpbWl0ID09PSAwID8gMCA6IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgfHwgMjAwO1xuXHRcdGlmICh0YWJsZVR5cGUgPT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0KSB7XG5cdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICEhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkRlZmF1bHRcIiA6IFwiQ2xlYXJBbGxcIjtcblx0XHRcdH1cblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSkge1xuXHRcdFx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS51c2VJY29uVGFiQmFyKCkpIHtcblx0XHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhIXRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID8gXCJEZWZhdWx0XCIgOiBcIkNsZWFyQWxsXCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IGZhbHNlID8gXCJDbGVhckFsbFwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZW5hYmxlUGFzdGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBcIk9iamVjdFBhZ2VcIiAmJiB0YWJsZVNldHRpbmdzLmVuYWJsZVBhc3RlICE9PSBmYWxzZTtcblx0XHRlbmFibGVFeHBvcnQgPVxuXHRcdFx0dGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIgfHwgZW5hYmxlUGFzdGU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBlbmFibGVGdWxsU2NyZWVuLFxuXHRcdGhlYWRlclZpc2libGU6ICEocXVpY2tTZWxlY3Rpb25WYXJpYW50ICYmIGhpZGVUYWJsZVRpdGxlKSxcblx0XHRlbmFibGVFeHBvcnQ6IGVuYWJsZUV4cG9ydCxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRjcmVhdGVBdEVuZDogY3JlYXRlQXRFbmQsXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRzZWxlY3Rpb25MaW1pdDogc2VsZWN0aW9uTGltaXQsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBtdWx0aVNlbGVjdE1vZGUsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHRlbmFibGVNYXNzRWRpdDogdGFibGVTZXR0aW5ncz8uZW5hYmxlTWFzc0VkaXRcblx0fTtcbn1cbiJdfQ==
2268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImhvcml6b250YWxBbGlnbiIsImZvcm1hdE9wdGlvbnMiLCJnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJmaW5kQ29sdW1uRnJvbVBhdGgiLCJwYXRoIiwiZmluZCIsImNvbHVtbiIsImFubm90YXRpb25Db2x1bW4iLCJwcm9wZXJ0eUluZm9zIiwidW5kZWZpbmVkIiwicmVsYXRpdmVQYXRoIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiZm9yRWFjaCIsIm9Db2x1bW4iLCJvVGFibGVDb2x1bW4iLCJ1bml0IiwiYWRkIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJtUmF3RGVmaW5pdGlvbnMiLCJhbm5vdGF0aW9uIiwib0FnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsIm9Qcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwib0N0eERlZlByb3BlcnR5IiwidmFsdWUiLCJtUmVzdWx0IiwiYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJoYXMiLCJpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eSIsImRlZmF1bHRBZ2dyZWdhdGUiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUiLCJwdXNoIiwibGVuZ3RoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsInR5cGUiLCJhZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJlbmFibGVBbmFseXRpY3MiLCJhZ2dyZWdhdGVzIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJpbmRleE9mIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImZpbmRDb2x1bW5CeVBhdGgiLCJvUHJvcCIsInNVbml0IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5Iiwib1VuaXRDb2x1bW4iLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJDb21tb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJlbmFibGVEYXRhU3RhdGVGaWx0ZXIiLCJnZXRUZW1wbGF0ZVR5cGUiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiRGV0ZXJtaW5pbmciLCJhY3Rpb25UYXJnZXQiLCJBY3Rpb25UYXJnZXQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwicGFyYW1ldGVycyIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldEV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEJpbmRpbmdFeHBGcm9tQ29udGV4dCIsInNvdXJjZSIsInNFeHByZXNzaW9uIiwidmlzaWJsZSIsInNQYXRoIiwic3Vic3RyaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic05hdmlnYXRpb25QYXRoIiwidGFyZ2V0T2JqZWN0IiwiX3R5cGUiLCJwYXJ0bmVyIiwiYmluZGluZ0V4cHJlc3Npb24iLCJzbGljZSIsImNvbnN0YW50IiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsInNvbWUiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsIm1hbmlmZXN0QWN0aW9ucyIsImFjdGlvbktleSIsImFjdGlvbiIsInJlcXVpcmVzU2VsZWN0aW9uIiwidG9TdHJpbmciLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1VwZGF0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzQ29uc3RhbnQiLCJnZXRTZWxlY3Rpb25Nb2RlIiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiaXNEZWxldGVCdXR0b25WaXNpYmxlIiwiU2VsZWN0aW9uTW9kZSIsIk5vbmUiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiVGVtcGxhdGVUeXBlIiwiT2JqZWN0UGFnZSIsImNvbXBpbGVCaW5kaW5nIiwiaWZFbHNlIiwiQXV0byIsIk11bHRpIiwiYW5kIiwib3IiLCJjb25jYXQiLCJ0YWJsZUFjdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwibm90IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsIkRlZmF1bHQiLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJJbmZvcm1hdGlvbiIsImZvcm1hdFJlc3VsdCIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibmF2aWdhdGlvbiIsImNyZWF0ZSIsImRldGFpbCIsImlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsIm5ld0FjdGlvbiIsInRhcmdldEFubm90YXRpb25zIiwiZ2V0RW50aXR5U2V0IiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJhcHBlbmQiLCJjcmVhdGVBdEVuZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJOZXdQYWdlIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJwcmVzc1Byb3BlcnR5IiwibmF2aWdhdGlvblRhcmdldCIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJkaXNwbGF5IiwidGFyZ2V0IiwiQ3JpdGljYWxpdHkiLCJEcmFmdE5vZGUiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJyb3dOYXZpZ2F0ZWQiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsInNlbWFudGljS2V5cyIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJfZ2V0RXhwb3J0RGF0YVR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJvVHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsIm9Gb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaW5wdXRGb3JtYXQiLCJzY2FsZSIsImRlbGltaXRlciIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJpc0dyb3VwYWJsZSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJBbm5vdGF0aW9uIiwibGFiZWwiLCJfZ2V0TGFiZWwiLCJncm91cExhYmVsIiwiZ3JvdXAiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXQiLCIkdGFyZ2V0Iiwic29ydGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJ0eXBlQ29uZmlnIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwic1Rvb2x0aXAiLCJfZ2V0VG9vbHRpcCIsInRvb2x0aXAiLCJfaXNWYWxpZENvbHVtbiIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInJldHVybkV4cHJlc3Npb24iLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJOb2RlTGV2ZWwiLCJleHByZXNzaW9uIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRGb3JtYXRPcHRpb25zIiwiYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImlzUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZENvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsIm9Db2x1bW5zIiwiYUNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsImlzU29ydGFibGUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJpc0FycmF5IiwiZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJiU2VtYW50aWNLZXlGb3VuZCIsImFTZW1hbnRpY0tleVZhbHVlcyIsImkiLCJoYXNEcmFmdEluZGljYXRvciIsInNlbWFudGlja2V5cyIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImxpbmVJdGVtIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJzTGFiZWwiLCJpc0ZpZWxkR3JvdXBDb2x1bW4iLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJ2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwid2lkdGhPdmVycmlkZSIsIkZFIiwiU2l0dWF0aW9ucyIsIkZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImV4cG9ydENvbnRhY3RQcm9wZXJ0eSIsImV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5IiwiX2dldFByb3BlcnR5TmFtZXMiLCJtYXRjaGVkUHJvcGVydGllcyIsInJlc29sdmVQYXRoIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJpc0Fubm90YXRpb25Db2x1bW4iLCJpbnRlcm5hbENvbHVtbnMiLCJtYW5pZmVzdENvbHVtbiIsInZhbGlkYXRlS2V5IiwiTWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJpZCIsImhlYWRlciIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiU2xvdCIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc0FjdGlvbk5hdmlnYWJsZSIsImZpZWxkTGFiZWwiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJhUGVyc29uYWxpemF0aW9uIiwiYkFuYWx5dGljYWxUYWJsZSIsInBlcnNvbmFsaXphdGlvbiIsInNvcnQiLCJmaWx0ZXIiLCJhZ2dyZWdhdGUiLCJWYXJpYW50TWFuYWdlbWVudFR5cGUiLCJDb250cm9sIiwiZ2V0U29ydENvbmRpdGlvbnMiLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJzb3J0Q29uZGl0aW9ucyIsIlNvcnRPcmRlciIsInNvcnRlcnMiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwicGF0aHMiLCJpbmZvTmFtZXMiLCJjdXJyZW50UGF0aCIsIkdyb3VwQnkiLCJhR3JvdXBCeSIsImFHcm91cExldmVscyIsImdyb3VwTGV2ZWxzIiwiVG90YWwiLCJhVG90YWxzIiwidGl0bGUiLCJUeXBlTmFtZVBsdXJhbCIsImVudGl0eVNldCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJUYWJsZUlEIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImNyZWF0aW9uQmVoYXZpb3VyIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJwYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uUGFzdGUiLCJtYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwiZW50aXR5TmFtZSIsImNvbGxlY3Rpb24iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwibmF2aWdhdGlvblBhdGgiLCJyb3ciLCJzdGFuZGFyZEFjdGlvbnMiLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsIkxpc3RSZXBvcnQiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJoYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwic2VhcmNoYWJsZSIsImlzQ29tcGxleFByb3BlcnR5IiwiZXhwb3J0RGF0YVR5cGUiLCJ0ZW1wbGF0ZVR5cGUiLCJzdWJzdHIiLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInNlbGVjdGlvbiIsInByb3BlcnR5TmFtZXMiLCJTZWxlY3RPcHRpb25zIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwiUHJvcGVydHlQYXRoIiwidGV4dCIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwicXVpY2tTZWxlY3Rpb25WYXJpYW50IiwicXVpY2tGaWx0ZXJQYXRocyIsImVuYWJsZUV4cG9ydCIsImZpbHRlcnMiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJoaWRlVGFibGVUaXRsZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJzZWxlY3Rpb25MaW1pdCIsIm11bHRpU2VsZWN0TW9kZSIsImVuYWJsZUF1dG9Db2x1bW5XaWR0aCIsImlzUGhvbmUiLCJlbmFibGVQYXN0ZSIsImlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50IiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwicXVpY2tGaWx0ZXJzIiwic2hvd0NvdW50cyIsImlzRGVza3RvcCIsIklzc3VlVHlwZSIsIkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsImhlYWRlclZpc2libGUiLCJ1c2VDb25kZW5zZWRUYWJsZUxheW91dCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwiZW5hYmxlTWFzc0VkaXQiLCJvVGFyZ2V0TWFwcGluZyIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwi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a0MsZ0NBQWxDLE9BQXdFLENBRHhFLEdBRUcsS0FGSCxHQUdHL0MsU0FMOEI7QUFNbEMrakIsTUFBQUEsV0FBVyxFQUNWLENBQUFsUixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHNDQUFBQSxrQkFBa0IsQ0FBRXJRLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsNkJBQWxDLE9BQXFFLENBQXJFLElBQ0EsQ0FBQThQLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFclEsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyxnQ0FBbEMsT0FBd0UsQ0FEeEUsR0FFRyxFQUZILEdBR0cvQyxTQVY4QjtBQVdsQ2drQixNQUFBQSxxQkFBcUIsRUFBRW5SLGtCQUFrQixDQUFDclEsSUFBbkIsS0FBNEIsZ0NBQTVCLEdBQStELElBQS9ELEdBQXNFeEM7QUFYM0QsS0FBbkM7QUFhQSxXQUFPNlMsa0JBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEVudW1WYWx1ZSxcblx0TGluZUl0ZW0sXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5LCBUeXBlRGVmaW5pdGlvbiB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdEN1c3RvbUFjdGlvbixcblx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdCxcblx0aXNBY3Rpb25OYXZpZ2FibGUsXG5cdHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZFR5cGVzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlLCBJc3N1ZUNhdGVnb3J5VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5cbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGlzUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZSwgRURNX1RZUEVfTUFQUElORywgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IEZpbHRlckZ1bmN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCxcblx0U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlLFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uUGFzdGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCxcblx0Z2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmdcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGF1dG9CaW5kT25Jbml0OiBib29sZWFuO1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IHN0cmluZztcblx0cm93Pzoge1xuXHRcdGFjdGlvbj86IHN0cmluZztcblx0XHRwcmVzcz86IHN0cmluZztcblx0XHRyb3dIaWdobGlnaHRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHRyb3dOYXZpZ2F0ZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZT47XG5cdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGJvb2xlYW47XG5cdH07XG5cdGRpc3BsYXlNb2RlPzogYm9vbGVhbjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdGVudGl0eU5hbWU6IHN0cmluZztcblx0c29ydENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGdyb3VwQ29uZGl0aW9ucz86IHN0cmluZztcblx0YWdncmVnYXRlQ29uZGl0aW9ucz86IHN0cmluZztcblxuXHQvKiogQ3JlYXRlIG5ldyBlbnRyaWVzICovXG5cdGNyZWF0ZTogQ3JlYXRlQmVoYXZpb3VyIHwgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWw7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYXBwIChkZWZhdWx0IGNhc2UpXG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogQm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiIHwgXCJSZXNwb25zaXZlVGFibGVcIiB8IFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cbmVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlXG5cdEFubm90YXRpb24gPSBcIkFubm90YXRpb25cIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmV4cG9ydCB0eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0aWQ6IHN0cmluZztcblx0d2lkdGg/OiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb20sXG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRzZW1hbnRpY09iamVjdFBhdGg/OiBzdHJpbmc7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0Y2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG5cdHNvcnRhYmxlOiBib29sZWFuO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0b29sdGlwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHRleHBvcnRTZXR0aW5ncz86IHtcblx0XHR0ZW1wbGF0ZT86IHN0cmluZztcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRmaWVsZExhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0aW5wdXRGb3JtYXQ/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdHNjYWxlPzogbnVtYmVyO1xuXHRcdGRlbGltaXRlcj86IGJvb2xlYW47XG5cdFx0dHJ1ZVZhbHVlPzogYm9vbGVhbjtcblx0XHRmYWxzZVZhbHVlPzogYm9vbGVhbjtcblx0fTtcblx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk/OiBib29sZWFuO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGV4cG9ydENvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0dmlzdWFsU2V0dGluZ3M/OiBWaXN1YWxTZXR0aW5ncztcblx0dHlwZUNvbmZpZz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFZpc3VhbFNldHRpbmdzID0ge1xuXHR3aWR0aENhbGN1bGF0aW9uPzogV2lkdGhDYWxjdWxhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdpZHRoQ2FsY3VsYXRpb24gPSBudWxsIHwge1xuXHRtaW5XaWR0aD86IG51bWJlcjtcblx0bWF4V2lkdGg/OiBudW1iZXI7XG5cdGRlZmF1bHRXaWR0aD86IG51bWJlcjtcblx0aW5jbHVkZUxhYmVsPzogYm9vbGVhbjtcblx0Z2FwPzogbnVtYmVyO1xuXHQvLyBvbmx5IHJlbGV2YW50IGZvciBjb21wbGV4IHR5cGVzXG5cdGV4Y2x1ZGVQcm9wZXJ0aWVzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cdHZlcnRpY2FsQXJyYW5nZW1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21UYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj47XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZURhdGEgPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGU6IHtcblx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH07XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUFuYWx5dGljc1NlYXJjaD86IGJvb2xlYW47XG5cdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcbn07XG5cbnR5cGUgU29ydGVyVHlwZSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRkZXNjZW5kaW5nOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhbm5vdGF0aW9uLWJhc2VkIGFuZCBtYW5pZmVzdC1iYXNlZCB0YWJsZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7QmFzZUFjdGlvbn0gVGhlIGNvbXBsZXRlIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgYVRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGFBbm5vdGF0aW9uQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMudGFibGVBY3Rpb25zO1xuXHRjb25zdCBhSGlkZGVuQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMuaGlkZGVuVGFibGVBY3Rpb25zO1xuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoXG5cdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdGFIaWRkZW5BY3Rpb25zXG5cdFx0KSxcblx0XHR7XG5cdFx0XHRpc05hdmlnYWJsZTogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZU9uU2VsZWN0OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZWQ6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IFwib3ZlcndyaXRlXCJcblx0XHR9XG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0IGJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zLFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQ29sdW1ucywgbWFuaWZlc3RDb2x1bW5zLCB7XG5cdFx0d2lkdGg6IFwib3ZlcndyaXRlXCIsXG5cdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0YXZhaWxhYmlsaXR5OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGhvcml6b250YWxBbGlnbjogXCJvdmVyd3JpdGVcIixcblx0XHRmb3JtYXRPcHRpb25zOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjdXN0b20gYWdncmVnYXRpb24gZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gZmluZENvbHVtbkZyb21QYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2gob0NvbHVtbiA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQob1Byb3BlcnR5ID0+IHtcblx0XHRcdHJldHVybiBvUHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cblx0XHRpZiAob0FnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdG1SYXdEZWZpbml0aW9uc1tvQWdncmVnYXRlZFByb3BlcnR5Lm5hbWVdID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcblx0XHRcdFx0PyBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5tYXAob0N0eERlZlByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gbVJhd0RlZmluaXRpb25zW29UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdO1xuXG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZSBhbmQgZHVtbXkgY3JlYXRlZCBwcm9wZXJ0eSBmb3IgZGF0YXBvaW50IHRhcmdldCBWYWx1ZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJlxuXHRcdFx0XHQhbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXMob1RhYmxlQ29sdW1uLm5hbWUpICYmXG5cdFx0XHRcdCFvVGFibGVDb2x1bW4uaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHlcblx0XHRcdCkge1xuXHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXSA9IHtcblx0XHRcdFx0XHRkZWZhdWx0QWdncmVnYXRlOiB7fSxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmZvckVhY2goY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQ29sdW1uID0gZmluZENvbHVtbkZyb21QYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0aWYgKG9Db2x1bW4pIHtcblx0XHRcdFx0XHRcdGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLnB1c2gob0NvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXS5kZWZhdWx0QWdncmVnYXRlLmNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG1SZXN1bHQ7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uIChpZiBhbnkpXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0dGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlc1xuKSB7XG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRlc0RlZmluaXRpb25zID0gZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCk7XG5cblx0XHRpZiAoYWdncmVnYXRlc0RlZmluaXRpb25zKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hZ2dyZWdhdGVzID0gYWdncmVnYXRlc0RlZmluaXRpb25zO1xuXG5cdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzU2VhcmNoID0gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA/IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMuaW5kZXhPZihcInNlYXJjaFwiKSA+PSAwIDogdHJ1ZTtcblxuXHRcdFx0Ly8gQWRkIGdyb3VwIGFuZCBzb3J0IGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uYWdncmVnYXRlQ29uZGl0aW9ucyA9IGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1uc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID0gXCJHcmlkVGFibGVcIjsgLy8gQW5hbHl0aWNhbFRhYmxlIGlzbid0IGEgcmVhbCB0eXBlIGZvciB0aGUgTURDOlRhYmxlLCBzbyB3ZSBhbHdheXMgc3dpdGNoIGJhY2sgdG8gR3JpZFxuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYXZpZ2F0aW9uIHRhcmdldCBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoIHRvIGNoZWNrIGluIHRoZSBtYW5pZmVzdCBzZXR0aW5nc1xuICogQHJldHVybnMgTmF2aWdhdGlvbiBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBuYXZDb25maWdGb3JDb250ZXh0UGF0aCA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihjb250ZXh0UGF0aCk7XG5cdGlmIChuYXZDb25maWdGb3JDb250ZXh0UGF0aCAmJiBPYmplY3Qua2V5cyhuYXZDb25maWdGb3JDb250ZXh0UGF0aCkubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBjb250ZXh0UGF0aDtcblx0fVxuXG5cdHJldHVybiBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldCA/IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWUgOiBkYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnIGFuZCAndGV4dEFycmFuZ2VtZW50JyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHtcblx0ZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKG9Qcm9wID0+IG9Qcm9wLm5hbWUgPT09IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBzVW5pdCA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSk/Lm5hbWUgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpPy5uYW1lO1xuXHRcdFx0XHRpZiAoc1VuaXQpIHtcblx0XHRcdFx0XHRjb25zdCBvVW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoc1VuaXQpO1xuXG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnVuaXQgPSBvVW5pdENvbHVtbj8ubmFtZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHR0ZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHRleHRBbm5vdGF0aW9uKSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgpO1xuXHRcdFx0XHRcdGlmIChvVGV4dENvbHVtbiAmJiBvVGV4dENvbHVtbi5uYW1lICE9PSBvVGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5OiBvVGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ/OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdFx0Y29sdW1ucyxcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0XHQpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyhnZXRUYWJsZUFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKSksXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSwgY29sdW1ucyk7XG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0XHRvVmlzdWFsaXphdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSh7fSwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIFtdLCBbXSwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZy50eXBlKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcsIGNvbHVtbnMpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogW10sXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKG9WaXN1YWxpemF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGxpbmUgaXRlbVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRjb25zdCBhZGRUb01hcCA9IGZ1bmN0aW9uKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKGtleSkge1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nO1xuXHRcdFx0XHRpZiAoYWN0aW9uTmFtZT8uaW5kZXhPZihcIi9cIikgPCAwICYmICFkYXRhRmllbGQuRGV0ZXJtaW5pbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb25UYXJnZXQgPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0O1xuXHRcdFx0XHRcdGlmIChhY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdC8vIEFubm90YXRpb24gZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggbnVsbCAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsYXRlZClcblx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIG51bGwpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0RXhwcmVzc2lvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpXG5cdFx0XHRcdFx0XHRcdCkgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz47XG5cblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFeHByZXNzaW9uPy5wYXRoKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaChkYXRhRmllbGQgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRcdGlzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0bGV0IHNFeHByZXNzaW9uOiBhbnkgfCB1bmRlZmluZWQ7XG5cdGlmIChcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cblx0KSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHR9IGVsc2Uge1xuXHRcdHNFeHByZXNzaW9uID0gKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlO1xuXHR9XG5cdGxldCBzUGF0aDogc3RyaW5nO1xuXHRpZiAoc0V4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0c1BhdGggPSBzRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoc1BhdGgpIHtcblx0XHRpZiAoKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlKSB7XG5cdFx0XHRzUGF0aCA9IHNQYXRoLnN1YnN0cmluZygxLCBzUGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFTcGxpdFBhdGhbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBzTmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYVNwbGl0UGF0aC5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gcHJvcGVydHksIGlmIGl0J3MgYW4gZW50aXR5U2V0LCB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGhhcyB0byBiZSByZXR1cm5lZDpcblx0XHR9IGVsc2UgaWYgKGlzRW50aXR5U2V0KSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oc1BhdGgpO1xuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgY2Fubm90IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlIGV2YWx1YXRpb246XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kIGNoZWNrXG4gKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciAoYW5kIHJlcXVpcmVzIGEgY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKGRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoYWN0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goYWN0aW9uS2V5ID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblxuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbn0gVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGlzRGVsZXRlQnV0dG9uVmlzaWJsZT86IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuTm9uZTtcblx0fVxuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRsZXQgc2VsZWN0aW9uTW9kZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy5zZWxlY3Rpb25Nb2RlO1xuXHRsZXQgYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW10sXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRmYWxzZVxuXHQpO1xuXHRsZXQgaXNQYXJlbnREZWxldGFibGUsIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHVuZGVmaW5lZCk7XG5cdFx0cGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID0gaXNQYXJlbnREZWxldGFibGUgPyBjb21waWxlQmluZGluZyhpc1BhcmVudERlbGV0YWJsZSwgdHJ1ZSkgOiBpc1BhcmVudERlbGV0YWJsZTtcblx0fVxuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgaXNEZWxldGVCdXR0b25WaXNpYmxlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmIGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJiBpc0RlbGV0ZUJ1dHRvblZpc2libGUpIHtcblx0XHRpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRhbmQoZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSwgaXNEZWxldGVCdXR0b25WaXNpYmxlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGlzRGVsZXRlQnV0dG9uVmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLCBjb25zdGFudChcIk5vbmVcIikpKTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0fSBlbHNlIGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxCYXNlQWN0aW9uLCBCYXNlQWN0aW9uPn0gVGhlIHRhYmxlIGFubm90YXRpb24gYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0Y29uc3QgdGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0Y29uc3QgaGlkZGVuVGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGxldCB0YWJsZUFjdGlvbjogQW5ub3RhdGlvbkFjdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQpICYmXG5cdFx0XHRcdCEoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuSW5saW5lICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuRGV0ZXJtaW5pbmdcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0aGlkZGVuVGFibGVBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmICh0YWJsZUFjdGlvbikge1xuXHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0YWJsZUFjdGlvbnM6IHRhYmxlQWN0aW9ucyxcblx0XHRoaWRkZW5UYWJsZUFjdGlvbnM6IGhpZGRlblRhYmxlQWN0aW9uc1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRjcml0aWNhbGl0eUFubm90YXRpb246IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+IHwgRW51bVZhbHVlPENyaXRpY2FsaXR5VHlwZT4gfCB1bmRlZmluZWQsXG5cdGlzRHJhZnRSb290OiBib29sZWFuLFxuXHR0YXJnZXRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpZkVsc2UoXG5cdFx0aXNEcmFmdFJvb3QgJiYgRHJhZnQuSXNOZXdPYmplY3QsXG5cdFx0TWVzc2FnZVR5cGUuSW5mb3JtYXRpb24gYXMgTWVzc2FnZVR5cGUsXG5cdFx0Zm9ybWF0UmVzdWx0KFxuXHRcdFx0W2RlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLCBiaW5kaW5nRXhwcmVzc2lvbihgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0dGFibGVGb3JtYXR0ZXJzLnJvd0hpZ2hsaWdodGluZyxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpXG5cdCk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbltcImNyZWF0ZVwiXSB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSB8fCBuYXZpZ2F0aW9uU2V0dGluZ3M/LmRldGFpbDtcblxuXHQvLyBjcm9zcy1hcHBcblx0aWYgKGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncykgJiYgbmF2aWdhdGlvbikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCBhcyBzdHJpbmcsXG5cdFx0XHRvdXRib3VuZERldGFpbDogbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5nczogbmF2aWdhdGlvblNldHRpbmdzXG5cdFx0fTtcblx0fVxuXG5cdGxldCBuZXdBY3Rpb247XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHQvLyBpbi1hcHBcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdG5ld0FjdGlvbiA9IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247IC8vIFRPRE86IElzIHRoZXJlIHJlYWxseSBubyAnTmV3QWN0aW9uJyBvbiBEcmFmdE5vZGU/IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZT8uTmV3QWN0aW9uXG5cblx0XHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbmV3QWN0aW9uKSB7XG5cdFx0XHQvLyBBIGNvbWJpbmF0aW9uIG9mICdDcmVhdGlvblJvdycgYW5kICdOZXdBY3Rpb24nIGRvZXMgbm90IG1ha2Ugc2Vuc2Vcblx0XHRcdC8vIFRPRE86IE9yIGRvZXMgaXQ/XG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb24/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uLnJvdXRlIDogdW5kZWZpbmVkIC8vIG5hdmlnYXRlIG9ubHkgaW4gTmV3UGFnZSBtb2RlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuXG5jb25zdCBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XCIuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKCAkY29udHJvbGxlciAsJ1wiICsgbmF2aWdhdGlvblRhcmdldCArIFwiJywgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0pXCI7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksXG5cdFx0XHRcdFx0ISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCAhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlLFxuXHRcdFx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0XCJBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LCB7IGNhbGxFeHRlbnNpb246IHRydWUsIHRhcmdldFBhdGg6ICdcIiArXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCArXG5cdFx0XHRcdFx0XCInLCBlZGl0YWJsZSA6IFwiICtcblx0XHRcdFx0XHQodGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGVcblx0XHRcdFx0XHRcdD8gXCIhJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0uZ2V0UHJvcGVydHkoJ0lzQWN0aXZlRW50aXR5JylcIlxuXHRcdFx0XHRcdFx0OiBcInVuZGVmaW5lZFwiKSArXG5cdFx0XHRcdFx0XCJ9KVwiOyAvL05lZWQgdG8gYWNjZXNzIHRvIERyYWZ0Um9vdCBhbmQgRHJhZnROb2RlICEhISEhISFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LCBmYWxzZSwgdGFyZ2V0RW50aXR5VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W2JpbmRpbmdFeHByZXNzaW9uKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUJpbmRpbmcoY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlQmluZGluZyhyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKVxuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24gc29ydGFibGUgY29sdW1uIG5hbWVzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbihcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZVxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCB0YWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdFx0XSlbMF07XG5cdFx0XHRjb25zdCBvQ29sdW1uRHJhZnRJbmRpY2F0b3IgPSBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oY29sdW1uSW5mby5uYW1lLCBzZW1hbnRpY0tleXMpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGFibGVDb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXNcbiAqIEBwYXJhbSB7QWdncmVnYXRpb25IZWxwZXJ9IGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbn0gVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGl2ZVBhdGg7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRUeXBlOiBzdHJpbmcgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgPyBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9UeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBleHBvcnRTZXR0aW5ncyA9IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdHRlbXBsYXRlOiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KVxuXHRcdCAgfVxuXHRcdDoge1xuXHRcdFx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogc0RhdGVJbnB1dEZvcm1hdCxcblx0XHRcdFx0c2NhbGU6IHByb3BlcnR5LnNjYWxlLFxuXHRcdFx0XHRkZWxpbWl0ZXI6IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJZZXNcIiA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZmFsc2VWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJOb1wiIDogdW5kZWZpbmVkXG5cdFx0ICB9O1xuXG5cdGNvbnN0IG9Db2x1bW46IGFueSA9IHtcblx0XHRrZXk6IGtleSxcblx0XHRpc0dyb3VwYWJsZTogIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5ICYmICFpc0hpZGRlbiA/IGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpIDogZmFsc2UsXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHksXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5OiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdHZpc3VhbFNldHRpbmdzOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9IDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpO1xuXHRpZiAoc1Rvb2x0aXApIHtcblx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0fVxuXG5cdHJldHVybiBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0Ly8gIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBEYXRhRmllbGQgQWJzdHJhY3QgdHlwZTogXCIgKyBkYXRhRmllbGQuJFR5cGUpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBhIERhdGFGaWVsZCBvciBEYXRhUG9pbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBTQVAgRmlvcmkgZWxlbWVudHMgd2lsbCBldmFsdWF0ZSBlaXRoZXIgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGRlZmluZWQgb24gdGhlIGFubm90YXRpb24gaXRzZWxmIG9yIG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcGFyYW0ge0ZpZWxkRm9ybWF0T3B0aW9uc30gW2Zvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVybkV4cHJlc3Npb25dIFJldHVybkV4cHJlc3Npb24gb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gQW4gZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gYmluZCB0byB0aGUgVUkuXG4gKi9cbmV4cG9ydCBjb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbihcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXRPcHRpb25zPzogYW55LFxuXHRyZXR1cm5FeHByZXNzaW9uPzogQm9vbGVhblxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRjb25zdCBleHByZXNzaW9uID0gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKCEhcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSwgdHJ1ZSksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xuXHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbiA/IChleHByZXNzaW9uIGFzIEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4pIDogY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmaWVsZEZvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24oXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IGFueVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0YUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCB0cnVlKVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRpZkVsc2Uob3IoLi4uKGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSlcblx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgcHJvcGVydHkgYW5kIGRhdGFGaWVsZC5cbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5fSBbcHJvcGVydHldIFByb3BlcnR5IG9yIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGlzR3JvdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9IExhYmVsIG9mIHRoZSBwcm9wZXJ0eSBvciBEYXRhRmllbGRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRMYWJlbCA9IGZ1bmN0aW9uKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKClcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFByb3BlcnR5Pn0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc29ydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24oXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaChuYW1lID0+IHtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSxcblx0XHRcdGFubm90YXRpb25QYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG5hbWUpLFxuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgcmVsYXRlZCBjb2x1bW4gYWxyZWFkeSBleGlzdHMuXG5cdFx0XHRyZWxhdGVkQ29sdW1uID0gZXhpc3RpbmdDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goXG5cdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8XG5cdFx0XHQocmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zICYmIHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcy5pbmRleE9mKG5hbWUpICE9PSAtMSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtbiBhbmRcblx0XHRcdC8vIGJvdGggY2FzZXMgcmVxdWlyZSBhIGR1bW15IFByb3BlcnR5SW5mbyBmb3Igc2V0dGluZyBjb3JyZWN0IGV4cG9ydCBzZXR0aW5ncy5cblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IFwiUHJvcGVydHk6OlwiICsgbmFtZTtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuXHRcdGNvbHVtbi5wcm9wZXJ0eUluZm9zID0gY29sdW1uLnByb3BlcnR5SW5mb3M/Lm1hcChwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHRwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3Qgb0NvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBhQ29sdW1uS2V5cyA9IG9Db2x1bW5zICYmIE9iamVjdC5rZXlzKG9Db2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRhQ29sdW1uS2V5cyAmJlxuXHRcdCEhYUNvbHVtbktleXMuZmluZChmdW5jdGlvbihrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgb0NvbHVtbnNba2V5XS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblxuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgbm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRpZiAobm9uU29ydGFibGVDb2x1bW5zLmluZGV4T2YocHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHQvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRcdGlzU29ydGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdFx0Ly8gQWN0aW9uIGNvbHVtbnMgYXJlIG5vdCBzb3J0YWJsZVxuXHRcdFx0XHRpc1NvcnRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaXNTb3J0YWJsZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpOiBGb3JtYXRPcHRpb25zVHlwZSB7XG5cdHJldHVybiB7XG5cdFx0dGV4dExpbmVzRWRpdDogNFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZTogc3RyaW5nLCBzZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdGlmIChiU2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNlbWFudGlja2V5czogYVNlbWFudGljS2V5VmFsdWVzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB3aXRoIHRoZWlyIGFubm90YXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ29sdW1uW119IFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2gobGluZUl0ZW0gPT4ge1xuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihsaW5lSXRlbSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9XG5cdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMobGluZUl0ZW0pICYmIGxpbmVJdGVtLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBsaW5lSXRlbSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IF9nZXRSZWxhdGl2ZVBhdGgobGluZUl0ZW0pO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShsaW5lSXRlbSwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyA9IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gX2dldExhYmVsKGxpbmVJdGVtLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEdyb3VwQ29sdW1uOiBib29sZWFuID0gZ3JvdXBQYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFwiKSA+IC0xO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGxpbmVJdGVtKTtcblx0XHRcdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cylcblx0XHRcdH07XG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRsaW5lSXRlbS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRsaW5lSXRlbS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMobGluZUl0ZW0sIGZvcm1hdE9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzV3JhcHBpbmcsXG5cdFx0XHRcdHR5cGU6IGRhdGFUeXBlID8gX2dldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAxKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0aW5wdXRGb3JtYXQ6IHNEYXRlSW5wdXRGb3JtYXQsXG5cdFx0XHRcdGRlbGltaXRlcjogZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogZGF0YVR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiWWVzXCIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZhbHNlVmFsdWU6IGRhdGFUeXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIk5vXCIgOiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBkYXRhVHlwZSAmJiBnZXRUeXBlQ29uZmlnKGxpbmVJdGVtLCBkYXRhVHlwZSk7XG5cdFx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IHByb3BlcnR5VHlwZUNvbmZpZ1xuXHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUsXG5cdFx0XHRcdFx0XHRvRm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHQuLi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9Db25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0XHRcdCAgfVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGxldCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8udmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24gd2l0aCBkaXNwbGF5IG1vZGUgYXMgdGV4dCBvbmx5LCBleGNsdWRlIHRleHQgcHJvcGVydHkgZnJvbSB0aGUgd2lkdGggY2FsY3VsYXRpb25cblx0XHRcdFx0dmlzdWFsU2V0dGluZ3MgPSB7XG5cdFx0XHRcdFx0d2lkdGhDYWxjdWxhdGlvbjoge1xuXHRcdFx0XHRcdFx0ZXhjbHVkZVByb3BlcnRpZXM6IFwiUHJvcGVydHk6OlwiICsgcmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICghZGF0YVR5cGUgfHwgIW9UeXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRPRE86IEZvciBzaXR1YXRpb24gUE9DIC0gaW5jcmVhc2Ugd2lkdGggb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciAtIHdvcmtzIGZvciB0aGUgc2l0dWF0aW9ucyBkZW1vIGFwcCBvbmx5IVxuXHRcdFx0Ly8gTWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gbW92ZSB0aGUgY29tcGxldGUgY29sdW1uIHdpZHRoIGRldGVybWluYXRpb24gdG8gdGhlIGNvbnZlcnRlciwgdGhhdCB3b3VsZCBhbGxvdyB1cyB0byB3aWRlbiB0aGUgY29sdW1ucyBhcyBuZWVkZWQuIFRoaXMgd29ya2Fyb3VuZCBvbmx5IGRlYWxzIHdpdGggRGF0ZSBjb2x1bW5zLlxuXHRcdFx0Y29uc3QgeyBoYXNEcmFmdEluZGljYXRvciB9ID0gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cyk7XG5cdFx0XHRjb25zdCB3aWR0aE92ZXJyaWRlID1cblx0XHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmFubm90YXRpb25zIGFzIGFueSkuRkU/LlNpdHVhdGlvbnMgJiZcblx0XHRcdFx0aGFzRHJhZnRJbmRpY2F0b3IgJiZcblx0XHRcdFx0bGluZUl0ZW0uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCAmJlxuXHRcdFx0XHRsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0LnR5cGUgPT09IFwiRWRtLkRhdGVcIlxuXHRcdFx0XHRcdD8gXCIxMWVtXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3Qgb0NvbHVtbjogYW55ID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQobGluZUl0ZW0pLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwobGluZUl0ZW0pIDogbnVsbCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiBudWxsLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChsaW5lSXRlbS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogaXNEYXRhRmllbGRBbHdheXNIaWRkZW4obGluZUl0ZW0pID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogX2lzQ29sdW1uU29ydGFibGUobGluZUl0ZW0sIHJlbGF0aXZlUGF0aCwgbm9uU29ydGFibGVDb2x1bW5zKSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiBsaW5lSXRlbS5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aCB8fCB3aWR0aE92ZXJyaWRlIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3Ncblx0XHRcdH07XG5cdFx0XHRjb25zdCBzVG9vbHRpcCA9IF9nZXRUb29sdGlwKGxpbmVJdGVtKTtcblx0XHRcdGlmIChzVG9vbHRpcCkge1xuXHRcdFx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbik7XG5cblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0bGV0IHRhYmxlQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGVcblx0KTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChhbm5vdGF0aW9uQ29sdW1ucyk7XG5cblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKGNvbHVtbnNUb0JlQ3JlYXRlZCwgdGFibGVDb2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24ocHJvcGVydGllczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdC5tYXAocHJvcGVydHkgPT4ge1xuXHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdH0pXG5cdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB0YWJsZSBjb2x1bW4gcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIE1hbmlmZXN0IGRlZmluZWQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSAvIGFubm90YXRpb24gY29sdW1uc1xuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIGNvbHVtbiBpZiBub3Qgb3ZlcndyaXR0ZW4gaW4gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHByb3BlcnR5IFRoZSBjb2x1bW4gcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQW5ub3RhdGlvbkNvbHVtbiBXaGV0aGVyIHRoZSBjb2x1bW4sIGRlZmluZWQgaW4gbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gY29sdW1uLlxuICogQHJldHVybnMge2FueX0gRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbHVtblxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBpc0Fubm90YXRpb25Db2x1bW46IGJvb2xlYW4pOiBhbnkge1xuXHRpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIElmIGFubm90YXRpb24gY29sdW1uIGhhcyBubyBwcm9wZXJ0eSBkZWZpbmVkIGluIG1hbmlmZXN0LFxuXHRcdC8vIGRvIG5vdCBvdmVyd3JpdGUgaXQgd2l0aCBtYW5pZmVzdCBjb2x1bW4ncyBkZWZhdWx0IHZhbHVlLlxuXHRcdHJldHVybiBpc0Fubm90YXRpb25Db2x1bW4gPyB1bmRlZmluZWQgOiBkZWZhdWx0VmFsdWU7XG5cdH1cblx0Ly8gUmV0dXJuIHdoYXQgaXMgZGVmaW5lZCBpbiBtYW5pZmVzdC5cblx0cmV0dXJuIHByb3BlcnR5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tQ29sdW1uPn0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRlbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRpZiAoIW1hbmlmZXN0Q29sdW1uPy50ZW1wbGF0ZSAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gXCJUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJ1wiICsga2V5ICsgXCInIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZFwiO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRcdG5hbWU6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0aGVhZGVyOiBtYW5pZmVzdENvbHVtbi5oZWFkZXIsXG5cdFx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLCBpc0Fubm90YXRpb25Db2x1bW4pLFxuXHRcdFx0XHR0eXBlOiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBcIlNsb3RcIiA/IENvbHVtblR5cGUuU2xvdCA6IENvbHVtblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSB8fCBcInVuZGVmaW5lZFwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHQuLi5tYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiB7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHByb3BlcnR5SW5mb3MgPyBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcykgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZmllbGRMYWJlbDogcHJvcGVydHlJbmZvcyA/IG1hbmlmZXN0Q29sdW1uLmhlYWRlciA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR3cmFwOiBwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IGFQZXJzb25hbGl6YXRpb246IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGJBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbjogYW55ID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0cmV0dXJuIGJBbmFseXRpY2FsVGFibGUgPyBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cCxBZ2dyZWdhdGVcIiA6IFwiU29ydCxDb2x1bW4sRmlsdGVyXCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcGVyc29uYWxpemF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBTcGVjaWZpYyBwZXJzb25hbGl6YXRpb24gb3B0aW9ucyBlbmFibGVkIGluIG1hbmlmZXN0LiBVc2UgdGhlbSBhcyBpcy5cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uc29ydCkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5maWx0ZXIpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5ncm91cCAmJiBiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVBlcnNvbmFsaXphdGlvbi5sZW5ndGggPiAwID8gYVBlcnNvbmFsaXphdGlvbi5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCkge1xuXHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXHRcdGlmIChiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc29ydCBjb25kaXRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBUYWJsZSBjb2x1bW5zIHByb2Nlc3NlZCBieSB0aGUgY29udmVydGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3J0IGNvbmRpdGlvbnMgZm9yIGEgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRDb25kaXRpb25zKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRsZXQgc29ydENvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRjb25zdCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb25kaXRpb25zID0ge1xuXHRcdFx0c29ydGVyczogc29ydGVyc1xuXHRcdH07XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uU29ydE9yZGVyLmZvckVhY2goY29uZGl0aW9uID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblByb3BlcnR5ID0gY29uZGl0aW9uLlByb3BlcnR5O1xuXHRcdFx0aWYgKGNvbmRpdGlvblByb3BlcnR5ICYmIG5vblNvcnRhYmxlUHJvcGVydGllcy5pbmRleE9mKGNvbmRpdGlvblByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdGNvbmRpdGlvbnMuc29ydGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IGluZm9OYW1lLFxuXHRcdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c29ydENvbmRpdGlvbnMgPSBjb25kaXRpb25zLnNvcnRlcnMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucykgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHNvcnRDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKlxuICogQHBhcmFtIHBhdGhzIHRoZSBhcnJheSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBjb2x1bW5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eUluZm9zXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXNcbiAqL1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwYXRocy5mb3JFYWNoKGN1cnJlbnRQYXRoID0+IHtcblx0XHRpZiAoY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdFx0cmV0dXJuICFhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBpbmZvTmFtZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgZ3JvdXAgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGdyb3VwQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRjb25zdCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnkgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0Y29uc3QgYUdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKGluZm9OYW1lID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cblx0XHRncm91cENvbmRpdGlvbnMgPSBhR3JvdXBMZXZlbHMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoeyBncm91cExldmVsczogYUdyb3VwTGV2ZWxzIH0pIDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBncm91cENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgYWdncmVnYXRlIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgYWdncmVnYXRlQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlRvdGFsKSB7XG5cdFx0Y29uc3QgYVRvdGFscyA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlRvdGFsIGFzIFByb3BlcnR5UGF0aFtdO1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gPSB7fTtcblx0XHRjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKGFUb3RhbHMsIGNvbHVtbnMpLmZvckVhY2goaW5mb05hbWUgPT4ge1xuXHRcdFx0YWdncmVnYXRlc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblxuXHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShhZ2dyZWdhdGVzKTtcblx0fVxuXG5cdHJldHVybiBhZ2dyZWdhdGVDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGl0bGU6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZVBsdXJhbDtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5U2V0O1xuXHRjb25zdCBwYWdlTWFuaWZlc3RTZXR0aW5nczogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgaGFzQWJzb2x1dGVQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAsXG5cdFx0cDEzbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiksXG5cdFx0aWQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gVGFibGVJRCh2aXN1YWxpemF0aW9uUGF0aCkgOiBUYWJsZUlEKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSwgXCJMaW5lSXRlbVwiKTtcblx0Y29uc3QgdGFyZ2V0Q2FwYWJpbGl0aWVzID0gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0KTtcblx0Y29uc3QgaXNEZWxldGVCdXR0b25WaXNpYmxlID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRpc0RlbGV0ZUJ1dHRvblZpc2libGVcblx0KTtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpIGFzIG51bWJlcjtcblx0fVxuXG5cdGNvbnN0IGNyZWF0aW9uQmVoYXZpb3VyID0gX2dldENyZWF0aW9uQmVoYXZpb3VyKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgdGFibGVBY3Rpb25zID0ge1xuXHRcdGNyZWF0ZTogZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0XCJkZWxldGVcIjogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0bWFzc0VkaXQ6IGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgc2VsZWN0aW9uTW9kZSlcblx0fTtcblx0Y29uc3QgaXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZUFjdGlvbnMuY3JlYXRlLnZpc2libGUgPT09IFwiZmFsc2VcIlxuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0UGF0aFxuXHRcdCksXG5cdFx0cDEzbk1vZGU6IHAxM25Nb2RlLFxuXHRcdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdFx0YWN0aW9uczogdGFibGVBY3Rpb25zLFxuXHRcdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkXG5cdFx0fSxcblx0XHRkaXNwbGF5TW9kZTogaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQsIHZpZXdDb25maWd1cmF0aW9uKSxcblx0XHRjcmVhdGU6IGNyZWF0aW9uQmVoYXZpb3VyLFxuXHRcdHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUsXG5cdFx0YXV0b0JpbmRPbkluaXQ6XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSAmJlxuXHRcdFx0ISh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGU6IHN0cmluZywgaXNDb21wbGV4UHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZTogc3RyaW5nID0gXCJTdHJpbmdcIjtcblx0aWYgKGlzQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2goUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dDogYm9vbGVhbiA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0bGV0IHF1aWNrU2VsZWN0aW9uVmFyaWFudDogYW55O1xuXHRjb25zdCBxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdID0gW107XG5cdGxldCBlbmFibGVFeHBvcnQgPSB0cnVlO1xuXHRsZXQgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGxldCBmaWx0ZXJzO1xuXHRsZXQgY3JlYXRlQXRFbmQgPSB0cnVlO1xuXHRsZXQgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9IGZhbHNlO1xuXHRsZXQgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRsZXQgY29uZGVuc2VkVGFibGVMYXlvdXQgPSBmYWxzZTtcblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGxldCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdGxldCBzZWxlY3Rpb25MaW1pdCA9IDIwMDtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTtcblx0Y29uc3QgZW5hYmxlQXV0b0NvbHVtbldpZHRoID0gIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRjb25zdCBlbmFibGVQYXN0ZSA9XG5cdFx0dGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSAhPT0gdW5kZWZpbmVkID8gdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSA6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiOyAvLyBQYXN0ZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGV4Y2VwdGVkIGZvciBPUFxuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0XHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdFx0cXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gdGFyZ2V0RW50aXR5VHlwZS5yZXNvbHZlUGF0aChcIkBcIiArIHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Ly8gcXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0cXVpY2tGaWx0ZXJQYXRocy5wdXNoKHsgYW5ub3RhdGlvblBhdGg6IHBhdGguYW5ub3RhdGlvblBhdGggfSk7XG5cdFx0XHR9XG5cdFx0XHRmaWx0ZXJzID0ge1xuXHRcdFx0XHRxdWlja0ZpbHRlcnM6IHtcblx0XHRcdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0XHRcdFx0PyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIlxuXHRcdFx0XHRcdFx0XHQ6IHRydWUsXG5cdFx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncz8ucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5zaG93Q291bnRzLFxuXHRcdFx0XHRcdHBhdGhzOiBxdWlja0ZpbHRlclBhdGhzXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0Y3JlYXRpb25Nb2RlID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgfHwgY3JlYXRpb25Nb2RlO1xuXHRcdGNyZWF0ZUF0RW5kID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgOiB0cnVlO1xuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9ICFjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPyAhIXRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIDogZmFsc2U7XG5cdFx0Y29uZGVuc2VkVGFibGVMYXlvdXQgPSB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0ICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0IDogZmFsc2U7XG5cdFx0aGlkZVRhYmxlVGl0bGUgPSAhIXRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5oaWRlVGFibGVUaXRsZTtcblx0XHR0YWJsZVR5cGUgPSB0YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiKSB7XG5cdFx0XHRpZiAodGFibGVTZXR0aW5ncz8udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHR0YWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0YWJsZVNldHRpbmdzPy50eXBlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzRGVza3RvcCgpICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdFx0XHR0YWJsZVR5cGUgPSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRcdGlmIChcblx0XHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKSAmJlxuXHRcdFx0ZW5hYmxlRnVsbFNjcmVlbiAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHQpIHtcblx0XHRcdGVuYWJsZUZ1bGxTY3JlZW4gPSBmYWxzZTtcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHRcdH1cblx0XHRzZWxlY3Rpb25MaW1pdCA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSB0cnVlIHx8IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDA7XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHQpIHtcblx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gISF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiRGVmYXVsdFwiIDogXCJDbGVhckFsbFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICEhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkRlZmF1bHRcIiA6IFwiQ2xlYXJBbGxcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbmFibGVFeHBvcnQgPVxuXHRcdFx0dGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIgfHwgZW5hYmxlUGFzdGU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBlbmFibGVGdWxsU2NyZWVuLFxuXHRcdGhlYWRlclZpc2libGU6ICEocXVpY2tTZWxlY3Rpb25WYXJpYW50ICYmIGhpZGVUYWJsZVRpdGxlKSxcblx0XHRlbmFibGVFeHBvcnQ6IGVuYWJsZUV4cG9ydCxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRjcmVhdGVBdEVuZDogY3JlYXRlQXRFbmQsXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRzZWxlY3Rpb25MaW1pdDogc2VsZWN0aW9uTGltaXQsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBtdWx0aVNlbGVjdE1vZGUsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHRlbmFibGVNYXNzRWRpdDogdGFibGVTZXR0aW5ncz8uZW5hYmxlTWFzc0VkaXQsXG5cdFx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBlbmFibGVBdXRvQ29sdW1uV2lkdGhcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSAmJiAob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5fdHlwZSA9PT0gXCJUeXBlRGVmaW5pdGlvblwiKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWygob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlIGFzIFR5cGVEZWZpbml0aW9uKS51bmRlcmx5aW5nVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdChvUHJvcGVydHkgYXMgUHJvcGVydHkpLmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0fTtcblx0fVxuXHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRwYXJzZUFzU3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRlbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuIl19