@sapui5/sap.fe.core 1.96.4 → 1.99.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 (253) hide show
  1. package/package.json +6 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +5 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -195
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2606
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -809
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +63 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1627
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +559 -581
  27. package/src/sap/fe/core/actions/draft.ts +593 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -435
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1192
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +235 -264
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +35 -25
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +79 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +86 -10
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +109 -31
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +237 -104
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +36 -8
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +112 -113
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +8 -1
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +76 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +79 -15
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +85 -46
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +16 -4
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -5
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +60 -19
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +66 -14
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +503 -399
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +615 -480
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  108. package/src/sap/fe/core/converters/helpers/ID.ts +4 -0
  109. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  110. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  112. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.js +29 -11
  114. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -20
  115. package/src/sap/fe/core/designtime/AppComponent.designtime.js +13 -3
  116. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  118. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  120. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  121. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  122. package/src/sap/fe/core/formatters/TableFormatter.js +65 -31
  123. package/src/sap/fe/core/formatters/TableFormatter.ts +62 -30
  124. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  125. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  126. package/src/sap/fe/core/fpm/Component.js +3 -2
  127. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  128. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  129. package/src/sap/fe/core/helpers/BindingExpression.js +479 -464
  130. package/src/sap/fe/core/helpers/BindingExpression.ts +477 -483
  131. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  132. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  133. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  134. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  135. package/src/sap/fe/core/helpers/EditState.js +81 -84
  136. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  137. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  138. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  139. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  140. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  141. package/src/sap/fe/core/helpers/KeepAliveHelper.js +210 -0
  142. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  143. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  144. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  145. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  146. package/src/sap/fe/core/helpers/ModelHelper.js +229 -174
  147. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  148. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  149. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  150. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  151. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  152. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  153. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  154. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  155. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  156. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  157. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  158. package/src/sap/fe/core/library.js +30 -3
  159. package/src/sap/fe/core/library.support.js +12 -5
  160. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  161. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  162. package/src/sap/fe/core/messagebundle.properties +72 -10
  163. package/src/sap/fe/core/messagebundle_ar.properties +41 -0
  164. package/src/sap/fe/core/messagebundle_bg.properties +41 -0
  165. package/src/sap/fe/core/messagebundle_ca.properties +41 -0
  166. package/src/sap/fe/core/messagebundle_cs.properties +42 -1
  167. package/src/sap/fe/core/messagebundle_cy.properties +41 -0
  168. package/src/sap/fe/core/messagebundle_da.properties +41 -0
  169. package/src/sap/fe/core/messagebundle_de.properties +41 -0
  170. package/src/sap/fe/core/messagebundle_el.properties +41 -0
  171. package/src/sap/fe/core/messagebundle_en.properties +41 -0
  172. package/src/sap/fe/core/messagebundle_en_GB.properties +41 -0
  173. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -0
  174. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +35 -0
  175. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +41 -0
  176. package/src/sap/fe/core/messagebundle_es.properties +41 -0
  177. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -0
  178. package/src/sap/fe/core/messagebundle_et.properties +41 -0
  179. package/src/sap/fe/core/messagebundle_fi.properties +41 -0
  180. package/src/sap/fe/core/messagebundle_fr.properties +46 -5
  181. package/src/sap/fe/core/messagebundle_fr_CA.properties +41 -0
  182. package/src/sap/fe/core/messagebundle_hi.properties +41 -0
  183. package/src/sap/fe/core/messagebundle_hr.properties +41 -0
  184. package/src/sap/fe/core/messagebundle_hu.properties +42 -1
  185. package/src/sap/fe/core/messagebundle_id.properties +45 -4
  186. package/src/sap/fe/core/messagebundle_it.properties +41 -0
  187. package/src/sap/fe/core/messagebundle_iw.properties +41 -0
  188. package/src/sap/fe/core/messagebundle_ja.properties +50 -9
  189. package/src/sap/fe/core/messagebundle_kk.properties +41 -0
  190. package/src/sap/fe/core/messagebundle_ko.properties +41 -0
  191. package/src/sap/fe/core/messagebundle_lt.properties +41 -0
  192. package/src/sap/fe/core/messagebundle_lv.properties +41 -0
  193. package/src/sap/fe/core/messagebundle_ms.properties +41 -0
  194. package/src/sap/fe/core/messagebundle_nl.properties +41 -0
  195. package/src/sap/fe/core/messagebundle_no.properties +41 -0
  196. package/src/sap/fe/core/messagebundle_pl.properties +41 -0
  197. package/src/sap/fe/core/messagebundle_pt.properties +43 -2
  198. package/src/sap/fe/core/messagebundle_pt_PT.properties +41 -0
  199. package/src/sap/fe/core/messagebundle_ro.properties +41 -0
  200. package/src/sap/fe/core/messagebundle_ru.properties +41 -0
  201. package/src/sap/fe/core/messagebundle_sh.properties +41 -0
  202. package/src/sap/fe/core/messagebundle_sk.properties +41 -0
  203. package/src/sap/fe/core/messagebundle_sl.properties +41 -0
  204. package/src/sap/fe/core/messagebundle_sv.properties +42 -1
  205. package/src/sap/fe/core/messagebundle_th.properties +41 -0
  206. package/src/sap/fe/core/messagebundle_tr.properties +41 -0
  207. package/src/sap/fe/core/messagebundle_uk.properties +41 -0
  208. package/src/sap/fe/core/messagebundle_vi.properties +41 -0
  209. package/src/sap/fe/core/messagebundle_zh_CN.properties +41 -0
  210. package/src/sap/fe/core/messagebundle_zh_TW.properties +41 -0
  211. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  212. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  213. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  214. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  215. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  216. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  217. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  218. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  219. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  220. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  221. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1166
  222. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  223. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  224. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  225. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +41 -84
  226. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +56 -99
  227. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  228. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  229. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  230. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  231. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  232. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  233. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  234. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  235. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  236. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  237. package/src/sap/fe/core/templating/DataModelPathHelper.js +6 -24
  238. package/src/sap/fe/core/templating/DataModelPathHelper.ts +10 -23
  239. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  240. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  241. package/src/sap/fe/core/templating/EntitySetHelper.js +80 -7
  242. package/src/sap/fe/core/templating/EntitySetHelper.ts +42 -2
  243. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  244. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  245. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  246. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  247. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  248. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  249. package/src/sap/fe/core/templating/UIFormatters.js +45 -113
  250. package/src/sap/fe/core/templating/UIFormatters.ts +39 -76
  251. package/src/sap/fe/core/type/Email.js +1 -1
  252. package/src/sap/fe/core/type/Email.ts +4 -6
  253. package/ui5.yaml +0 -3
@@ -16,6 +16,12 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
16
16
 
17
17
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
18
 
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
20
+
21
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
+
23
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
24
+
19
25
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
20
26
 
21
27
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -34,15 +40,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
34
40
  _exports.unresolveableExpression = unresolveableExpression;
35
41
 
36
42
  function escapeXmlAttribute(inputString) {
37
- return inputString.replace(/[']/g, function (c) {
38
- switch (c) {
39
- case "'":
40
- return "\\'";
41
-
42
- default:
43
- return c;
44
- }
45
- });
43
+ return inputString.replace(/'/g, "\\'");
46
44
  }
47
45
 
48
46
  function hasUnresolveableExpression() {
@@ -97,7 +95,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
97
95
  return _checkExpressionsAreEqual(a.condition, b.condition) && _checkExpressionsAreEqual(a.onTrue, b.onTrue) && _checkExpressionsAreEqual(a.onFalse, b.onFalse);
98
96
 
99
97
  case "Comparison":
100
- return a.operator == b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
98
+ return a.operator === b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
101
99
 
102
100
  case "Concat":
103
101
  var aExpressions = a.expressions;
@@ -111,6 +109,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
111
109
  return _checkExpressionsAreEqual(expression, bExpressions[index]);
112
110
  });
113
111
 
112
+ case "Length":
113
+ return _checkExpressionsAreEqual(a.bindingExpression, b.bindingExpression);
114
+
114
115
  case "Binding":
115
116
  return a.modelName === b.modelName && a.path === b.path && a.targetEntitySet === b.targetEntitySet;
116
117
 
@@ -141,6 +142,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
141
142
  case "Ref":
142
143
  return a.ref === b.ref;
143
144
  }
145
+
146
+ return false;
144
147
  }
145
148
  /**
146
149
  * Converts a nested SetExpression by inlining operands of type SetExpression with the same operator.
@@ -178,24 +181,16 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
178
181
 
179
182
 
180
183
  function hasOppositeExpressions(expressions) {
181
- if (expressions.length < 2) {
182
- return false;
183
- }
184
-
185
- var i = expressions.length;
186
-
187
- while (i--) {
188
- var expression = expressions[i];
189
- var negatedExpression = not(expression);
190
-
191
- for (var j = 0; j < i; j++) {
192
- if (_checkExpressionsAreEqual(expressions[j], negatedExpression)) {
184
+ var negatedExpressions = expressions.map(not);
185
+ return expressions.some(function (expression, index) {
186
+ for (var i = index + 1; i < negatedExpressions.length; i++) {
187
+ if (_checkExpressionsAreEqual(expression, negatedExpressions[i])) {
193
188
  return true;
194
189
  }
195
190
  }
196
- }
197
191
 
198
- return false;
192
+ return false;
193
+ });
199
194
  }
200
195
  /**
201
196
  * Logical `and` expression.
@@ -225,7 +220,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
225
220
 
226
221
  var isStaticFalse = false;
227
222
  var nonTrivialExpression = expressions.filter(function (expression) {
228
- if (isConstant(expression) && !expression.value) {
223
+ if (isFalse(expression)) {
229
224
  isStaticFalse = true;
230
225
  }
231
226
 
@@ -236,8 +231,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
236
231
  return constant(false);
237
232
  } else if (nonTrivialExpression.length === 0) {
238
233
  // Resolve the constant then
239
- var isValid = expressions.reduce(function (isValid, expression) {
240
- return isValid && isConstant(expression) && expression.value;
234
+ var isValid = expressions.reduce(function (result, expression) {
235
+ return result && isTrue(expression);
241
236
  }, true);
242
237
  return constant(isValid);
243
238
  } else if (nonTrivialExpression.length === 1) {
@@ -282,7 +277,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
282
277
 
283
278
  var isStaticTrue = false;
284
279
  var nonTrivialExpression = expressions.filter(function (expression) {
285
- if (isConstant(expression) && expression.value) {
280
+ if (isTrue(expression)) {
286
281
  isStaticTrue = true;
287
282
  }
288
283
 
@@ -293,8 +288,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
293
288
  return constant(true);
294
289
  } else if (nonTrivialExpression.length === 0) {
295
290
  // Resolve the constant then
296
- var isValid = expressions.reduce(function (isValid, expression) {
297
- return isValid && isConstant(expression) && expression.value;
291
+ var isValid = expressions.reduce(function (result, expression) {
292
+ return result && isTrue(expression);
298
293
  }, true);
299
294
  return constant(isValid);
300
295
  } else if (nonTrivialExpression.length === 1) {
@@ -342,31 +337,43 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
342
337
  // Create the reverse comparison
343
338
  switch (operand.operator) {
344
339
  case "!==":
345
- return equal(operand.operand1, operand.operand2);
340
+ return _objectSpread(_objectSpread({}, operand), {}, {
341
+ operator: "==="
342
+ });
346
343
 
347
344
  case "<":
348
- return greaterOrEqual(operand.operand1, operand.operand2);
345
+ return _objectSpread(_objectSpread({}, operand), {}, {
346
+ operator: ">="
347
+ });
349
348
 
350
349
  case "<=":
351
- return greaterThan(operand.operand1, operand.operand2);
350
+ return _objectSpread(_objectSpread({}, operand), {}, {
351
+ operator: ">"
352
+ });
352
353
 
353
354
  case "===":
354
- return notEqual(operand.operand1, operand.operand2);
355
+ return _objectSpread(_objectSpread({}, operand), {}, {
356
+ operator: "!=="
357
+ });
355
358
 
356
359
  case ">":
357
- return lessOrEqual(operand.operand1, operand.operand2);
360
+ return _objectSpread(_objectSpread({}, operand), {}, {
361
+ operator: "<="
362
+ });
358
363
 
359
364
  case ">=":
360
- return lessThan(operand.operand1, operand.operand2);
365
+ return _objectSpread(_objectSpread({}, operand), {}, {
366
+ operator: "<"
367
+ });
361
368
  }
362
369
  } else if (operand._type === "Not") {
363
370
  return operand.operand;
364
- } else {
365
- return {
366
- _type: "Not",
367
- operand: operand
368
- };
369
371
  }
372
+
373
+ return {
374
+ _type: "Not",
375
+ operand: operand
376
+ };
370
377
  }
371
378
  /**
372
379
  * Evaluates whether a binding expression is equal to true with a loose equality.
@@ -449,17 +456,19 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
449
456
  } else if (isPrimitiveObject(value)) {
450
457
  constantValue = value.valueOf();
451
458
  } else {
452
- var val = value;
453
- var obj = Object.keys(val).reduce(function (obj, key) {
454
- var value = wrapPrimitive(val[key]);
459
+ constantValue = Object.entries(value).reduce(function (plainExpression, _ref) {
460
+ var _ref2 = _slicedToArray(_ref, 2),
461
+ key = _ref2[0],
462
+ val = _ref2[1];
463
+
464
+ var wrappedValue = wrapPrimitive(val);
455
465
 
456
- if (value._type !== "Constant" || value.value !== undefined) {
457
- obj[key] = value;
466
+ if (wrappedValue._type !== "Constant" || wrappedValue.value !== undefined) {
467
+ plainExpression[key] = wrappedValue;
458
468
  }
459
469
 
460
- return obj;
470
+ return plainExpression;
461
471
  }, {});
462
- constantValue = obj;
463
472
  }
464
473
  } else {
465
474
  constantValue = value;
@@ -487,18 +496,10 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
487
496
  value: value
488
497
  };
489
498
  }
499
+ } else if (targetType === "boolean" && typeof value === "string" && (value === "true" || value === "false")) {
500
+ return constant(value === "true");
490
501
  } else {
491
- switch (targetType) {
492
- case "boolean":
493
- if (typeof value === "string" && (value === "true" || value === "false")) {
494
- return constant(value === "true");
495
- }
496
-
497
- return constant(value);
498
-
499
- default:
500
- return constant(value);
501
- }
502
+ return constant(value);
502
503
  }
503
504
  }
504
505
  /**
@@ -506,17 +507,17 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
506
507
  *
507
508
  * @see fn
508
509
  *
509
- * @param ref Reference
510
+ * @param reference Reference
510
511
  * @returns {ReferenceExpression} The object reference binding part
511
512
  */
512
513
 
513
514
 
514
515
  _exports.resolveBindingString = resolveBindingString;
515
516
 
516
- function ref(ref) {
517
+ function ref(reference) {
517
518
  return {
518
519
  _type: "Ref",
519
- ref: ref
520
+ ref: reference
520
521
  };
521
522
  }
522
523
  /**
@@ -563,6 +564,16 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
563
564
  function isConstant(maybeConstant) {
564
565
  return typeof maybeConstant !== "object" || maybeConstant._type === "Constant";
565
566
  }
567
+
568
+ _exports.isConstant = isConstant;
569
+
570
+ function isTrue(expression) {
571
+ return isConstant(expression) && expression.value === true;
572
+ }
573
+
574
+ function isFalse(expression) {
575
+ return isConstant(expression) && expression.value === false;
576
+ }
566
577
  /**
567
578
  * Checks if the expression or value provided is binding or not.
568
579
  *
@@ -572,8 +583,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
572
583
  */
573
584
 
574
585
 
575
- _exports.isConstant = isConstant;
576
-
577
586
  function isBinding(maybeBinding) {
578
587
  return typeof maybeBinding === "object" && maybeBinding._type === "Binding";
579
588
  }
@@ -604,83 +613,85 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
604
613
  }
605
614
  }
606
615
  /**
607
- * Check if the passed annotation expression is a ComplexAnnotationExpression.
616
+ * Check if the passed annotation annotationValue is a ComplexAnnotationExpression.
608
617
  *
609
618
  * @template T The target type
610
- * @param annotationExpression The annotation expression to evaluate
619
+ * @param annotationValue The annotation annotationValue to evaluate
611
620
  * @returns {boolean} `true` if the object is a {ComplexAnnotationExpression}
612
621
  */
613
622
 
614
623
 
615
- function isComplexAnnotationExpression(annotationExpression) {
616
- return typeof annotationExpression === "object" && !isPrimitiveObject(annotationExpression);
624
+ function isComplexAnnotationExpression(annotationValue) {
625
+ return typeof annotationValue === "object" && !isPrimitiveObject(annotationValue);
617
626
  }
618
627
  /**
619
- * Generate the corresponding expression for a given annotation expression.
628
+ * Generate the corresponding annotationValue for a given annotation annotationValue.
620
629
  *
621
630
  * @template T The target type
622
- * @param annotationExpression The source annotation expression
631
+ * @param annotationValue The source annotation annotationValue
623
632
  * @param visitedNavigationPaths The path from the root entity set
624
- * @param defaultValue Default value if the annotationExpression is undefined
633
+ * @param defaultValue Default value if the annotationValue is undefined
625
634
  * @param pathVisitor A function to modify the resulting path
626
- * @returns {Expression<T>} The expression equivalent to that annotation expression
635
+ * @returns {Expression<T>} The annotationValue equivalent to that annotation annotationValue
627
636
  */
628
637
 
629
638
 
630
- function annotationExpression(annotationExpression) {
639
+ function annotationExpression(annotationValue) {
631
640
  var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
632
641
  var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
633
642
  var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
634
643
 
635
- if (annotationExpression === undefined) {
644
+ if (annotationValue === undefined) {
636
645
  return wrapPrimitive(defaultValue);
637
646
  }
638
647
 
639
- if (!isComplexAnnotationExpression(annotationExpression)) {
640
- return constant(annotationExpression);
641
- } else {
642
- switch (annotationExpression.type) {
643
- case "Path":
644
- return bindingExpression(annotationExpression.path, undefined, visitedNavigationPaths, pathVisitor);
648
+ if (!isComplexAnnotationExpression(annotationValue)) {
649
+ return constant(annotationValue);
650
+ }
645
651
 
646
- case "If":
647
- return annotationIfExpression(annotationExpression.If, visitedNavigationPaths, pathVisitor);
652
+ switch (annotationValue.type) {
653
+ case "Path":
654
+ return bindingExpression(annotationValue.path, undefined, visitedNavigationPaths, pathVisitor);
648
655
 
649
- case "Not":
650
- return not(parseAnnotationCondition(annotationExpression.Not, visitedNavigationPaths, pathVisitor));
656
+ case "If":
657
+ return annotationIfExpression(annotationValue.If, visitedNavigationPaths, pathVisitor);
651
658
 
652
- case "Eq":
653
- return equal(parseAnnotationCondition(annotationExpression.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Eq[1], visitedNavigationPaths, pathVisitor));
659
+ case "Not":
660
+ return not(parseAnnotationCondition(annotationValue.Not, visitedNavigationPaths, pathVisitor));
654
661
 
655
- case "Ne":
656
- return notEqual(parseAnnotationCondition(annotationExpression.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Ne[1], visitedNavigationPaths, pathVisitor));
662
+ case "Eq":
663
+ return equal(parseAnnotationCondition(annotationValue.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Eq[1], visitedNavigationPaths, pathVisitor));
657
664
 
658
- case "Gt":
659
- return greaterThan(parseAnnotationCondition(annotationExpression.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Gt[1], visitedNavigationPaths, pathVisitor));
665
+ case "Ne":
666
+ return notEqual(parseAnnotationCondition(annotationValue.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ne[1], visitedNavigationPaths, pathVisitor));
660
667
 
661
- case "Ge":
662
- return greaterOrEqual(parseAnnotationCondition(annotationExpression.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Ge[1], visitedNavigationPaths, pathVisitor));
668
+ case "Gt":
669
+ return greaterThan(parseAnnotationCondition(annotationValue.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Gt[1], visitedNavigationPaths, pathVisitor));
663
670
 
664
- case "Lt":
665
- return lessThan(parseAnnotationCondition(annotationExpression.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Lt[1], visitedNavigationPaths, pathVisitor));
671
+ case "Ge":
672
+ return greaterOrEqual(parseAnnotationCondition(annotationValue.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ge[1], visitedNavigationPaths, pathVisitor));
666
673
 
667
- case "Le":
668
- return lessOrEqual(parseAnnotationCondition(annotationExpression.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationExpression.Le[1], visitedNavigationPaths, pathVisitor));
674
+ case "Lt":
675
+ return lessThan(parseAnnotationCondition(annotationValue.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Lt[1], visitedNavigationPaths, pathVisitor));
669
676
 
670
- case "Or":
671
- return or.apply(void 0, _toConsumableArray(annotationExpression.Or.map(function (orCondition) {
672
- return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
673
- })));
677
+ case "Le":
678
+ return lessOrEqual(parseAnnotationCondition(annotationValue.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Le[1], visitedNavigationPaths, pathVisitor));
674
679
 
675
- case "And":
676
- return and.apply(void 0, _toConsumableArray(annotationExpression.And.map(function (andCondition) {
677
- return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
678
- })));
680
+ case "Or":
681
+ return or.apply(void 0, _toConsumableArray(annotationValue.Or.map(function (orCondition) {
682
+ return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
683
+ })));
679
684
 
680
- case "Apply":
681
- return annotationApplyExpression(annotationExpression, visitedNavigationPaths, pathVisitor);
682
- }
685
+ case "And":
686
+ return and.apply(void 0, _toConsumableArray(annotationValue.And.map(function (andCondition) {
687
+ return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
688
+ })));
689
+
690
+ case "Apply":
691
+ return annotationApplyExpression(annotationValue, visitedNavigationPaths, pathVisitor);
683
692
  }
693
+
694
+ return unresolveableExpression;
684
695
  }
685
696
  /**
686
697
  * Parse the annotation condition into an expression.
@@ -738,36 +749,36 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
738
749
  }, visitedNavigationPaths, undefined, pathVisitor);
739
750
  } else if (annotationValue.hasOwnProperty("$EnumMember")) {
740
751
  return constant(resolveEnumValue(annotationValue.$EnumMember));
741
- } else {
742
- return constant(false);
743
752
  }
753
+
754
+ return constant(false);
744
755
  }
745
756
  /**
746
757
  * Process the {IfAnnotationExpressionValue} into an expression.
747
758
  *
748
759
  * @template T The target type
749
- * @param annotationIfExpression An If expression returning the type T
760
+ * @param annotationValue An If expression returning the type T
750
761
  * @param visitedNavigationPaths The path from the root entity set
751
762
  * @param pathVisitor A function to modify the resulting path
752
763
  * @returns {Expression<T>} The equivalent ifElse expression
753
764
  */
754
765
 
755
766
 
756
- function annotationIfExpression(annotationIfExpression) {
767
+ function annotationIfExpression(annotationValue) {
757
768
  var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
758
769
  var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
759
- return ifElse(parseAnnotationCondition(annotationIfExpression[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationIfExpression[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationIfExpression[2], visitedNavigationPaths, pathVisitor));
770
+ return ifElse(parseAnnotationCondition(annotationValue[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[2], visitedNavigationPaths, pathVisitor));
760
771
  }
761
772
 
762
773
  _exports.annotationIfExpression = annotationIfExpression;
763
774
 
764
- function annotationApplyExpression(annotationApplyExpression) {
775
+ function annotationApplyExpression(applyExpression) {
765
776
  var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
766
777
  var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
767
778
 
768
- switch (annotationApplyExpression.Function) {
779
+ switch (applyExpression.Function) {
769
780
  case "odata.concat":
770
- return concat.apply(void 0, _toConsumableArray(annotationApplyExpression.Apply.map(function (applyParam) {
781
+ return concat.apply(void 0, _toConsumableArray(applyExpression.Apply.map(function (applyParam) {
771
782
  var applyParamConverted = applyParam;
772
783
 
773
784
  if (applyParam.hasOwnProperty("$Path")) {
@@ -790,8 +801,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
790
801
 
791
802
  return annotationExpression(applyParamConverted, visitedNavigationPaths, undefined, pathVisitor);
792
803
  })));
793
- break;
794
804
  }
805
+
806
+ return unresolveableExpression;
795
807
  }
796
808
  /**
797
809
  * Generic helper for the comparison operations (equal, notEqual, ...).
@@ -815,10 +827,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
815
827
  }
816
828
 
817
829
  if (isConstant(leftExpression) && isConstant(rightExpression)) {
818
- if (leftExpression.value === undefined || rightExpression.value === undefined) {
819
- return constant(leftExpression.value === rightExpression.value);
820
- }
821
-
822
830
  switch (operator) {
823
831
  case "!==":
824
832
  return constant(leftExpression.value !== rightExpression.value);
@@ -836,7 +844,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
836
844
  return constant(leftExpression.value >= rightExpression.value);
837
845
 
838
846
  case "===":
839
- default:
840
847
  return constant(leftExpression.value === rightExpression.value);
841
848
  }
842
849
  } else {
@@ -848,6 +855,17 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
848
855
  };
849
856
  }
850
857
  }
858
+
859
+ function length(expression) {
860
+ if (expression._type === "Unresolveable") {
861
+ return expression;
862
+ }
863
+
864
+ return {
865
+ _type: "Length",
866
+ bindingExpression: expression
867
+ };
868
+ }
851
869
  /**
852
870
  * Comparison: "equal" (===).
853
871
  *
@@ -858,7 +876,11 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
858
876
  */
859
877
 
860
878
 
879
+ _exports.length = length;
880
+
861
881
  function equal(leftOperand, rightOperand) {
882
+ var _reduce;
883
+
862
884
  var leftExpression = wrapPrimitive(leftOperand);
863
885
  var rightExpression = wrapPrimitive(rightOperand);
864
886
 
@@ -868,27 +890,31 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
868
890
 
869
891
  if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
870
892
  return constant(true);
871
- } // ((a === c) === true) => (a === c)
872
-
873
-
874
- if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
875
- return leftExpression;
876
- } else if (rightExpression._type === "Comparison" && isConstant(leftExpression) && leftExpression.value === true) {
877
- // (true === (a === c)) => (a === c)
878
- return rightExpression;
879
- } else if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
880
- // ((a === c) === false) => !(a === c)
881
- return not(leftExpression);
882
- } else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onTrue, rightExpression)) {
883
- // (if(xxxx) { aaa } else { bbb } ) === aaa )
884
- return or(leftExpression.condition, equal(leftExpression.onFalse, rightExpression));
885
- } else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
886
- return or(not(leftExpression.condition), equal(leftExpression.onTrue, rightExpression));
887
- } else if (leftExpression._type === "IfElse" && isConstant(leftExpression.onTrue) && isConstant(rightExpression) && isConstant(leftExpression.onFalse) && !_checkExpressionsAreEqual(leftExpression.onTrue, rightExpression) && !_checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
888
- return constant(false);
889
893
  }
890
894
 
891
- return comparison("===", leftExpression, rightExpression);
895
+ function reduce(left, right) {
896
+ if (left._type === "Comparison" && isTrue(right)) {
897
+ // compare(a, b) === true ~~> compare(a, b)
898
+ return left;
899
+ } else if (left._type === "Comparison" && isFalse(right)) {
900
+ // compare(a, b) === false ~~> !compare(a, b)
901
+ return not(left);
902
+ } else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onTrue, right)) {
903
+ // (if (x) { a } else { b }) === a ~~> x || (b === a)
904
+ return or(left.condition, equal(left.onFalse, right));
905
+ } else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onFalse, right)) {
906
+ // (if (x) { a } else { b }) === b ~~> !x || (a === b)
907
+ return or(not(left.condition), equal(left.onTrue, right));
908
+ } else if (left._type === "IfElse" && isConstant(left.onTrue) && isConstant(left.onFalse) && isConstant(right) && !_checkExpressionsAreEqual(left.onTrue, right) && !_checkExpressionsAreEqual(left.onFalse, right)) {
909
+ return constant(false);
910
+ }
911
+
912
+ return undefined;
913
+ } // exploit symmetry: a === b <~> b === a
914
+
915
+
916
+ var reduced = (_reduce = reduce(leftExpression, rightExpression)) !== null && _reduce !== void 0 ? _reduce : reduce(rightExpression, leftExpression);
917
+ return reduced !== null && reduced !== void 0 ? reduced : comparison("===", leftExpression, rightExpression);
892
918
  }
893
919
  /**
894
920
  * Comparison: "not equal" (!==).
@@ -903,29 +929,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
903
929
  _exports.equal = equal;
904
930
 
905
931
  function notEqual(leftOperand, rightOperand) {
906
- var leftExpression = wrapPrimitive(leftOperand);
907
- var rightExpression = wrapPrimitive(rightOperand);
908
-
909
- if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
910
- return constant(false);
911
- } // ((a === c) !== true) => !(a === c)
912
-
913
-
914
- if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
915
- return not(leftExpression);
916
- } else if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
917
- // ((a === c) !== false) => (a === c)
918
- return leftExpression;
919
- } else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onTrue, rightExpression)) {
920
- return and(not(leftExpression.condition), notEqual(leftExpression.onFalse, rightExpression));
921
- } else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
922
- return and(leftExpression.condition, notEqual(leftExpression.onTrue, rightExpression));
923
- } else if (leftExpression._type === "IfElse" && isConstant(leftExpression.onTrue) && isConstant(rightExpression) && isConstant(leftExpression.onFalse) && !_checkExpressionsAreEqual(leftExpression.onTrue, rightExpression) && !_checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
924
- // If the left expression is an if else where both onTrue and onFalse are not equals to the right expression -> simplify as true
925
- return constant(true);
926
- }
927
-
928
- return comparison("!==", leftExpression, rightExpression);
932
+ return not(equal(leftOperand, rightOperand));
929
933
  }
930
934
  /**
931
935
  * Comparison: "greater or equal" (>=).
@@ -1014,9 +1018,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1014
1018
 
1015
1019
  if (conditionExpression._type === "Not") {
1016
1020
  // ifElse(not(X), a, b) --> ifElse(X, b, a)
1017
- var _ref = [onFalseExpression, onTrueExpression];
1018
- onTrueExpression = _ref[0];
1019
- onFalseExpression = _ref[1];
1021
+ var _ref3 = [onFalseExpression, onTrueExpression];
1022
+ onTrueExpression = _ref3[0];
1023
+ onFalseExpression = _ref3[1];
1020
1024
  conditionExpression = not(conditionExpression);
1021
1025
  } // inline nested if-else expressions: onTrue branch
1022
1026
  // ifElse(X, ifElse(X, a, b), c) ==> ifElse(X, a, c)
@@ -1030,50 +1034,40 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1030
1034
 
1031
1035
  if (onFalseExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onFalseExpression.condition)) {
1032
1036
  onFalseExpression = onFalseExpression.onFalse;
1033
- } // inline nested if-else expressions: condition
1034
-
1035
-
1036
- if (conditionExpression._type === "IfElse") {
1037
- if (isConstant(conditionExpression.onFalse) && !conditionExpression.onFalse.value && isConstant(conditionExpression.onTrue) && conditionExpression.onTrue.value) {
1038
- // ifElse(ifElse(X, true, false), a, b) ==> ifElse(X, a, b)
1039
- conditionExpression = conditionExpression.condition;
1040
- } else if (isConstant(conditionExpression.onFalse) && conditionExpression.onFalse.value && isConstant(conditionExpression.onTrue) && !conditionExpression.onTrue.value) {
1041
- // ifElse(ifElse(X, false, true), a, b) ==> ifElse(not(X), a, b)
1042
- conditionExpression = not(conditionExpression.condition);
1043
- } else if (isConstant(conditionExpression.onTrue) && !conditionExpression.onTrue.value && !isConstant(conditionExpression.onFalse)) {
1044
- // ifElse(ifElse(X, false, a), b, c) ==> ifElse(and(not(X), a), b, c)
1045
- conditionExpression = and(not(conditionExpression.condition), conditionExpression.onFalse);
1046
- }
1047
- } // again swap branches if needed (in case one of the optimizations above led to a negated condition)
1048
-
1049
-
1050
- if (conditionExpression._type === "Not") {
1051
- // ifElse(not(X), a, b) --> ifElse(X, b, a)
1052
- var _ref2 = [onFalseExpression, onTrueExpression];
1053
- onTrueExpression = _ref2[0];
1054
- onFalseExpression = _ref2[1];
1055
- conditionExpression = not(conditionExpression);
1056
- } // compute expression result for constant conditions
1037
+ } // (if true then a else b) ~~> a
1038
+ // (if false then a else b) ~~> b
1057
1039
 
1058
1040
 
1059
1041
  if (isConstant(conditionExpression)) {
1060
1042
  return conditionExpression.value ? onTrueExpression : onFalseExpression;
1061
- } // compute expression result if onTrue and onFalse branches are equal
1043
+ } // if (isConstantBoolean(onTrueExpression) || isConstantBoolean(onFalseExpression)) {
1044
+ // return or(and(condition, onTrueExpression as Expression<boolean>), and(not(condition), onFalseExpression as Expression<boolean>)) as Expression<T>
1045
+ // }
1046
+ // (if X then a else a) ~~> a
1062
1047
 
1063
1048
 
1064
1049
  if (_checkExpressionsAreEqual(onTrueExpression, onFalseExpression)) {
1065
1050
  return onTrueExpression;
1066
- } // If either trueExpression or falseExpression is a value equals to false the expression can be simplified
1067
- // If(Condition) Then XXX Else False -> Condition && XXX
1051
+ } // if X then a else false ~~> X && a
1068
1052
 
1069
1053
 
1070
- if (isConstant(onFalseExpression) && onFalseExpression.value === false) {
1054
+ if (isFalse(onFalseExpression)) {
1071
1055
  return and(conditionExpression, onTrueExpression);
1072
- } // If(Condition) Then False Else XXX -> !Condition && XXX
1056
+ } // if X then a else true ~~> !X || a
1057
+
1058
+
1059
+ if (isTrue(onFalseExpression)) {
1060
+ return or(not(conditionExpression), onTrueExpression);
1061
+ } // if X then false else a ~~> !X && a
1073
1062
 
1074
1063
 
1075
- if (isConstant(onTrueExpression) && onTrueExpression.value === false) {
1064
+ if (isFalse(onTrueExpression)) {
1076
1065
  return and(not(conditionExpression), onFalseExpression);
1066
+ } // if X then true else a ~~> X || a
1067
+
1068
+
1069
+ if (isTrue(onTrueExpression)) {
1070
+ return or(conditionExpression, onFalseExpression);
1077
1071
  }
1078
1072
 
1079
1073
  return {
@@ -1218,7 +1212,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1218
1212
  /**
1219
1213
  * Function call, optionally with arguments.
1220
1214
  *
1221
- * @param fn Function name or reference to function
1215
+ * @param func Function name or reference to function
1222
1216
  * @param parameters Arguments
1223
1217
  * @param on Object to call the function on
1224
1218
  * @returns {FunctionExpression<T>} Expression representing the function call (not the result of the function call!)
@@ -1227,8 +1221,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1227
1221
 
1228
1222
  _exports.addTypeInformation = addTypeInformation;
1229
1223
 
1230
- function fn(fn, parameters, on) {
1231
- var functionName = typeof fn === "string" ? fn : fn.__functionName;
1224
+ function fn(func, parameters, on) {
1225
+ var functionName = typeof func === "string" ? func : func.__functionName;
1232
1226
  return {
1233
1227
  _type: "Function",
1234
1228
  obj: on !== undefined ? wrapPrimitive(on) : undefined,
@@ -1287,26 +1281,21 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1287
1281
 
1288
1282
  switch (expression._type) {
1289
1283
  case "Function":
1290
- expression.parameters = expression.parameters.map(function (expression) {
1291
- return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
1284
+ case "Formatter":
1285
+ expression.parameters = expression.parameters.map(function (parameter) {
1286
+ return transformRecursively(parameter, expressionType, transformFunction, includeAllExpression);
1292
1287
  });
1293
1288
  break;
1294
1289
 
1295
1290
  case "Concat":
1296
- expression.expressions = expression.expressions.map(function (expression) {
1297
- return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
1291
+ expression.expressions = expression.expressions.map(function (subExpression) {
1292
+ return transformRecursively(subExpression, expressionType, transformFunction, includeAllExpression);
1298
1293
  });
1299
1294
  break;
1300
1295
 
1301
1296
  case "ComplexType":
1302
- expression.bindingParameters = expression.bindingParameters.map(function (expression) {
1303
- return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
1304
- });
1305
- break;
1306
-
1307
- case "Formatter":
1308
- expression.parameters = expression.parameters.map(function (expression) {
1309
- return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
1297
+ expression.bindingParameters = expression.bindingParameters.map(function (bindingParameter) {
1298
+ return transformRecursively(bindingParameter, expressionType, transformFunction, includeAllExpression);
1310
1299
  });
1311
1300
  break;
1312
1301
 
@@ -1335,8 +1324,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1335
1324
 
1336
1325
  case "Set":
1337
1326
  if (includeAllExpression) {
1338
- expression.operands = expression.operands.map(function (expression) {
1339
- return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
1327
+ expression.operands = expression.operands.map(function (operand) {
1328
+ return transformRecursively(operand, expressionType, transformFunction, includeAllExpression);
1340
1329
  });
1341
1330
  }
1342
1331
 
@@ -1353,6 +1342,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1353
1342
 
1354
1343
  case "DefaultBinding":
1355
1344
  case "Ref":
1345
+ case "Length":
1356
1346
  case "Binding":
1357
1347
  case "Constant":
1358
1348
  // Do nothing
@@ -1371,6 +1361,173 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1371
1361
  var needParenthesis = function (expr) {
1372
1362
  return !isConstant(expr) && !isBinding(expr) && isExpression(expr) && expr._type !== "IfElse" && expr._type !== "Function";
1373
1363
  };
1364
+ /**
1365
+ * Compiles a constant object to a string.
1366
+ * @param expr
1367
+ * @param isNullable
1368
+ * @returns {string} The compiled string
1369
+ */
1370
+
1371
+
1372
+ function compileConstantObject(expr) {
1373
+ var isNullable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1374
+
1375
+ if (isNullable && Object.keys(expr.value).length === 0) {
1376
+ return "";
1377
+ } // Objects
1378
+
1379
+
1380
+ var o = expr.value;
1381
+ var properties = [];
1382
+ Object.keys(o).forEach(function (key) {
1383
+ var value = o[key];
1384
+ var childResult = compileBinding(value, true, false, true);
1385
+
1386
+ if (childResult && childResult.length > 0) {
1387
+ properties.push("".concat(key, ": ").concat(childResult));
1388
+ }
1389
+ });
1390
+ return "{".concat(properties.join(", "), "}");
1391
+ }
1392
+ /**
1393
+ * Compiles a Constant Binding Expression.
1394
+ * @param expr
1395
+ * @param embeddedInBinding
1396
+ * @param isNullable
1397
+ * @returns {string} The compiled string
1398
+ */
1399
+
1400
+
1401
+ function compileConstant(expr, embeddedInBinding) {
1402
+ var isNullable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1403
+
1404
+ if (expr.value === null) {
1405
+ return "null";
1406
+ }
1407
+
1408
+ if (expr.value === undefined) {
1409
+ return "undefined";
1410
+ }
1411
+
1412
+ if (typeof expr.value === "object") {
1413
+ if (Array.isArray(expr.value)) {
1414
+ var entries = expr.value.map(function (expression) {
1415
+ return compileBinding(expression, true);
1416
+ });
1417
+ return "[".concat(entries.join(", "), "]");
1418
+ } else {
1419
+ return compileConstantObject(expr, isNullable);
1420
+ }
1421
+ }
1422
+
1423
+ if (embeddedInBinding) {
1424
+ switch (typeof expr.value) {
1425
+ case "number":
1426
+ case "bigint":
1427
+ case "boolean":
1428
+ return expr.value.toString();
1429
+
1430
+ case "string":
1431
+ return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
1432
+
1433
+ default:
1434
+ return "";
1435
+ }
1436
+ } else {
1437
+ return expr.value.toString();
1438
+ }
1439
+ }
1440
+ /**
1441
+ * Generates the binding string for a Binding expression.
1442
+ *
1443
+ * @param expressionForBinding The expression to compile
1444
+ * @param embeddedInBinding Whether the expression to compile is embedded into another expression
1445
+ * @param embeddedSeparator The binding value evaluator ($ or % depending on whether we want to force the type or not)
1446
+ * @returns {BindingExpression<T>} The corresponding expression binding
1447
+ */
1448
+
1449
+
1450
+ function compileBindingForBinding(expressionForBinding, embeddedInBinding, embeddedSeparator) {
1451
+ if (expressionForBinding.type || expressionForBinding.parameters || expressionForBinding.targetType || expressionForBinding.formatOptions || expressionForBinding.constraints) {
1452
+ // This is now a complex binding definition, let's prepare for it
1453
+ var complexBindingDefinition = {
1454
+ path: compileBindingPath(expressionForBinding),
1455
+ type: expressionForBinding.type,
1456
+ targetType: expressionForBinding.targetType,
1457
+ parameters: expressionForBinding.parameters,
1458
+ formatOptions: expressionForBinding.formatOptions,
1459
+ constraints: expressionForBinding.constraints
1460
+ };
1461
+ var outBinding = compileBinding(complexBindingDefinition);
1462
+
1463
+ if (embeddedInBinding) {
1464
+ outBinding = "".concat(embeddedSeparator) + outBinding;
1465
+ }
1466
+
1467
+ return outBinding;
1468
+ } else if (embeddedInBinding) {
1469
+ return "".concat(embeddedSeparator, "{").concat(compileBindingPath(expressionForBinding), "}");
1470
+ } else {
1471
+ return "{".concat(compileBindingPath(expressionForBinding), "}");
1472
+ }
1473
+ }
1474
+
1475
+ function compileComplexTypeExpression(expression) {
1476
+ if (expression.bindingParameters.length === 1) {
1477
+ return "{".concat(compilePathParameter(expression.bindingParameters[0], true), ", type: '").concat(expression.type, "'}");
1478
+ }
1479
+
1480
+ var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
1481
+
1482
+ switch (expression.type) {
1483
+ case "sap.ui.model.odata.type.Unit":
1484
+ outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
1485
+ break;
1486
+
1487
+ case "sap.ui.model.odata.type.Currency":
1488
+ outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
1489
+ break;
1490
+
1491
+ default:
1492
+ outputEnd = "], type: '".concat(expression.type, "'");
1493
+ }
1494
+
1495
+ if (hasElements(expression.formatOptions)) {
1496
+ outputEnd += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
1497
+ }
1498
+
1499
+ if (hasElements(expression.parameters)) {
1500
+ outputEnd += ", parameters: ".concat(compileBinding(expression.parameters));
1501
+ }
1502
+
1503
+ outputEnd += "}";
1504
+ return "{mode:'TwoWay', parts:[".concat(expression.bindingParameters.map(function (param) {
1505
+ return compilePathParameter(param);
1506
+ }).join(",")).concat(outputEnd);
1507
+ }
1508
+ /**
1509
+ * Wrap the compiled binding string as required dependening on its context.
1510
+ *
1511
+ * @param expression The compiled expression
1512
+ * @param embeddedInBinding True if the compiled expression is to be embedded in a binding
1513
+ * @param parenthesisRequired True if the embedded binding needs to be wrapped in parethesis so that it is evaluated as one
1514
+ * @returns {BindingExpression<string>} Finalized compiled expression
1515
+ */
1516
+
1517
+
1518
+ function wrapBindingExpression(expression, embeddedInBinding) {
1519
+ var parenthesisRequired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1520
+
1521
+ if (embeddedInBinding) {
1522
+ if (parenthesisRequired) {
1523
+ return "(".concat(expression, ")");
1524
+ } else {
1525
+ return expression;
1526
+ }
1527
+ } else {
1528
+ return "{= ".concat(expression, "}");
1529
+ }
1530
+ }
1374
1531
  /**
1375
1532
  * Compile an expression into an expression binding.
1376
1533
  *
@@ -1378,6 +1535,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1378
1535
  * @param expression The expression to compile
1379
1536
  * @param embeddedInBinding Whether the expression to compile is embedded into another expression
1380
1537
  * @param keepTargetType Keep the target type of the embedded bindings instead of casting them to any
1538
+ * @param isNullable Whether binding expression can resolve to empty string or not
1381
1539
  * @returns {BindingExpression<T>} The corresponding expression binding
1382
1540
  */
1383
1541
 
@@ -1385,56 +1543,16 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1385
1543
  function compileBinding(expression) {
1386
1544
  var embeddedInBinding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1387
1545
  var keepTargetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1546
+ var isNullable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1388
1547
  var expr = wrapPrimitive(expression);
1389
1548
  var embeddedSeparator = keepTargetType ? "$" : "%";
1390
- var outProperty = "";
1391
1549
 
1392
1550
  switch (expr._type) {
1393
1551
  case "Unresolveable":
1394
1552
  return undefined;
1395
1553
 
1396
1554
  case "Constant":
1397
- if (expr.value === null) {
1398
- return "null";
1399
- }
1400
-
1401
- if (expr.value === undefined) {
1402
- return "undefined";
1403
- }
1404
-
1405
- if (typeof expr.value === "object") {
1406
- if (Array.isArray(expr.value)) {
1407
- var entries = expr.value.map(function (expression) {
1408
- return compileBinding(expression, true);
1409
- });
1410
- return "[".concat(entries.join(", "), "]");
1411
- } else {
1412
- // Objects
1413
- var o = expr.value;
1414
- var properties = Object.keys(o).map(function (key) {
1415
- var value = o[key];
1416
- return "".concat(key, ": ").concat(compileBinding(value, true));
1417
- });
1418
- return "{".concat(properties.join(", "), "}");
1419
- }
1420
- }
1421
-
1422
- if (embeddedInBinding) {
1423
- switch (typeof expr.value) {
1424
- case "number":
1425
- case "bigint":
1426
- case "boolean":
1427
- return expr.value.toString();
1428
-
1429
- case "string":
1430
- return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
1431
-
1432
- default:
1433
- return "";
1434
- }
1435
- } else {
1436
- return expr.value.toString();
1437
- }
1555
+ return compileConstant(expr, embeddedInBinding, isNullable);
1438
1556
 
1439
1557
  case "Ref":
1440
1558
  return expr.ref || "null";
@@ -1446,192 +1564,95 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1446
1564
  return expr.obj === undefined ? "".concat(expr.fn, "(").concat(argumentString, ")") : "".concat(compileBinding(expr.obj, true), ".").concat(expr.fn, "(").concat(argumentString, ")");
1447
1565
 
1448
1566
  case "EmbeddedExpressionBinding":
1449
- if (embeddedInBinding) {
1450
- return "(".concat(expr.value.substr(2, expr.value.length - 3), ")");
1451
- } else {
1452
- return "".concat(expr.value);
1453
- }
1567
+ return embeddedInBinding ? "(".concat(expr.value.substr(2, expr.value.length - 3), ")") : "".concat(expr.value);
1454
1568
 
1455
1569
  case "EmbeddedBinding":
1456
- if (embeddedInBinding) {
1457
- return "".concat(embeddedSeparator).concat(expr.value);
1458
- } else {
1459
- return "".concat(expr.value);
1460
- }
1570
+ return embeddedInBinding ? "".concat(embeddedSeparator).concat(expr.value) : "".concat(expr.value);
1461
1571
 
1462
1572
  case "DefaultBinding":
1463
1573
  case "Binding":
1464
- if (expr.type || expr.parameters || expr.targetType) {
1465
- var outBinding = "";
1466
-
1467
- if (embeddedInBinding) {
1468
- outBinding += "".concat(embeddedSeparator);
1469
- }
1470
-
1471
- outBinding += "{path:'".concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "'");
1472
-
1473
- if (expr.type) {
1474
- outBinding += ", type: '".concat(expr.type, "'");
1475
- }
1476
-
1477
- if (expr.constraints && Object.keys(expr.constraints).length > 0) {
1478
- outBinding += ", constraints: ".concat(compileBinding(expr.constraints));
1479
- }
1480
-
1481
- if (expr.formatOptions) {
1482
- outBinding += ", formatOptions: ".concat(compileBinding(expr.formatOptions));
1483
- }
1484
-
1485
- if (expr.parameters && Object.keys(expr.parameters).length > 0) {
1486
- outBinding += ", parameters: ".concat(compileBinding(expr.parameters));
1487
- }
1488
-
1489
- if (expr.targetType) {
1490
- outBinding += ", targetType: '".concat(expr.targetType, "'");
1491
- }
1492
-
1493
- outBinding += "}";
1494
- return outBinding;
1495
- } else {
1496
- if (embeddedInBinding) {
1497
- return "".concat(embeddedSeparator, "{").concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "}");
1498
- } else {
1499
- return "{".concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "}");
1500
- }
1501
- }
1574
+ return compileBindingForBinding(expr, embeddedInBinding, embeddedSeparator);
1502
1575
 
1503
1576
  case "Comparison":
1504
- var isOperand1Complex = needParenthesis(expr.operand1);
1505
- var isOperand2Complex = needParenthesis(expr.operand2);
1506
- var comparisonPart = "";
1507
-
1508
- if (isOperand1Complex) {
1509
- comparisonPart += "(";
1510
- }
1511
-
1512
- comparisonPart += "".concat(compileBinding(expr.operand1, true));
1513
-
1514
- if (isOperand1Complex) {
1515
- comparisonPart += ")";
1516
- }
1517
-
1518
- comparisonPart += " ".concat(expr.operator, " ");
1519
-
1520
- if (isOperand2Complex) {
1521
- comparisonPart += "(";
1522
- }
1523
-
1524
- comparisonPart += "".concat(compileBinding(expr.operand2, true));
1525
-
1526
- if (isOperand2Complex) {
1527
- comparisonPart += ")";
1528
- }
1529
-
1530
- if (embeddedInBinding) {
1531
- return comparisonPart;
1532
- }
1533
-
1534
- return "{= ".concat(comparisonPart, "}");
1577
+ var comparisonExpression = compileComparisonExpression(expr);
1578
+ return wrapBindingExpression(comparisonExpression, embeddedInBinding);
1535
1579
 
1536
1580
  case "IfElse":
1537
- if (embeddedInBinding) {
1538
- return "(".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true), ")");
1539
- } else {
1540
- return "{= ".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true), "}");
1541
- }
1581
+ var ifElseExpression = "".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true));
1582
+ return wrapBindingExpression(ifElseExpression, embeddedInBinding, true);
1542
1583
 
1543
1584
  case "Set":
1544
- if (embeddedInBinding) {
1545
- return "(".concat(expr.operands.map(function (expression) {
1546
- return compileBinding(expression, true);
1547
- }).join(" ".concat(expr.operator, " ")), ")");
1548
- } else {
1549
- return "{= (".concat(expr.operands.map(function (expression) {
1550
- return compileBinding(expression, true);
1551
- }).join(" ".concat(expr.operator, " ")), ")}");
1552
- }
1585
+ var setExpression = expr.operands.map(function (operand) {
1586
+ return compileBinding(operand, true);
1587
+ }).join(" ".concat(expr.operator, " "));
1588
+ return wrapBindingExpression(setExpression, embeddedInBinding, true);
1553
1589
 
1554
1590
  case "Concat":
1555
- if (embeddedInBinding) {
1556
- return "".concat(expr.expressions.map(function (expression) {
1557
- return compileBinding(expression, true, true);
1558
- }).join(" + "));
1559
- } else {
1560
- return "{= ".concat(expr.expressions.map(function (expression) {
1561
- return compileBinding(expression, true, true);
1562
- }).join(" + "), " }");
1563
- }
1591
+ var concatExpression = expr.expressions.map(function (nestedExpression) {
1592
+ return compileBinding(nestedExpression, true, true);
1593
+ }).join(" + ");
1594
+ return wrapBindingExpression(concatExpression, embeddedInBinding);
1595
+
1596
+ case "Length":
1597
+ var lengthExpression = "".concat(compileBinding(expr.bindingExpression, true), ".length");
1598
+ return wrapBindingExpression(lengthExpression, embeddedInBinding);
1564
1599
 
1565
1600
  case "Not":
1566
- if (embeddedInBinding) {
1567
- return "!".concat(compileBinding(expr.operand, true));
1568
- } else {
1569
- return "{= !".concat(compileBinding(expr.operand, true), "}");
1570
- }
1601
+ var notExpression = "!".concat(compileBinding(expr.operand, true));
1602
+ return wrapBindingExpression(notExpression, embeddedInBinding);
1571
1603
 
1572
1604
  case "Truthy":
1573
- if (embeddedInBinding) {
1574
- return "!!".concat(compileBinding(expr.operand, true));
1575
- } else {
1576
- return "{= !!".concat(compileBinding(expr.operand, true), "}");
1577
- }
1605
+ var truthyExpression = "!!".concat(compileBinding(expr.operand, true));
1606
+ return wrapBindingExpression(truthyExpression, embeddedInBinding);
1578
1607
 
1579
1608
  case "Formatter":
1580
- if (expr.parameters.length === 1) {
1581
- outProperty += "{".concat(compilePathParameter(expr.parameters[0], true), ", formatter: '").concat(expr.fn, "'}");
1582
- } else {
1583
- outProperty += "{parts:[".concat(expr.parameters.map(function (param) {
1584
- return compilePathParameter(param);
1585
- }).join(","), "], formatter: '").concat(expr.fn, "'}");
1586
- }
1609
+ var formatterExpression = compileFormatterExpression(expr);
1610
+ return embeddedInBinding ? "$".concat(formatterExpression) : formatterExpression;
1587
1611
 
1588
- if (embeddedInBinding) {
1589
- outProperty = "$".concat(outProperty);
1590
- }
1612
+ case "ComplexType":
1613
+ var complexTypeExpression = compileComplexTypeExpression(expr);
1614
+ return embeddedInBinding ? "$".concat(complexTypeExpression) : complexTypeExpression;
1591
1615
 
1592
- return outProperty;
1616
+ default:
1617
+ return "";
1618
+ }
1619
+ }
1620
+ /**
1621
+ * Compile a comparison expression.
1622
+ *
1623
+ * @param expression The comparison expression.
1624
+ * @returns The compiled expression. Needs wrapping before it can be used as an expression binding.
1625
+ */
1593
1626
 
1594
- case "ComplexType":
1595
- if (expr.bindingParameters.length === 1) {
1596
- outProperty += "{".concat(compilePathParameter(expr.bindingParameters[0], true), ", type: '").concat(expr.type, "'}");
1597
- } else {
1598
- var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
1599
-
1600
- switch (expr.type) {
1601
- case "sap.ui.model.odata.type.Unit":
1602
- outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
1603
- break;
1604
-
1605
- case "sap.ui.model.odata.type.Currency":
1606
- outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
1607
- break;
1608
-
1609
- default:
1610
- outputEnd = "], type: '".concat(expr.type, "'");
1611
- }
1612
1627
 
1613
- if (expr.formatOptions && Object.keys(expr.formatOptions).length > 0) {
1614
- outputEnd += ", formatOptions: ".concat(compileBinding(expr.formatOptions));
1615
- }
1628
+ _exports.compileBinding = compileBinding;
1616
1629
 
1617
- if (expr.parameters && Object.keys(expr.parameters).length > 0) {
1618
- outputEnd += ", parameters: ".concat(compileBinding(expr.parameters));
1619
- }
1630
+ function compileComparisonExpression(expression) {
1631
+ function compileOperand(operand) {
1632
+ var _compileBinding;
1620
1633
 
1621
- outputEnd += "}";
1622
- outProperty += "{mode:'TwoWay', parts:[".concat(expr.bindingParameters.map(function (param) {
1623
- return compilePathParameter(param);
1624
- }).join(",")).concat(outputEnd);
1625
- }
1634
+ var compiledOperand = (_compileBinding = compileBinding(operand, true)) !== null && _compileBinding !== void 0 ? _compileBinding : "undefined";
1635
+ return wrapBindingExpression(compiledOperand, true, needParenthesis(operand));
1636
+ }
1626
1637
 
1627
- if (embeddedInBinding) {
1628
- outProperty = "$".concat(outProperty);
1629
- }
1638
+ return "".concat(compileOperand(expression.operand1), " ").concat(expression.operator, " ").concat(compileOperand(expression.operand2));
1639
+ }
1640
+ /**
1641
+ * Compile a formatter expression.
1642
+ *
1643
+ * @param expression The formatter expression.
1644
+ * @returns The compiled expression.
1645
+ */
1630
1646
 
1631
- return outProperty;
1632
1647
 
1633
- default:
1634
- return "";
1648
+ function compileFormatterExpression(expression) {
1649
+ if (expression.parameters.length === 1) {
1650
+ return "{".concat(compilePathParameter(expression.parameters[0], true), ", formatter: '").concat(expression.fn, "'}");
1651
+ } else {
1652
+ var parts = expression.parameters.map(function (param) {
1653
+ return compilePathParameter(param);
1654
+ });
1655
+ return "{parts: [".concat(parts.join(", "), "], formatter: '").concat(expression.fn, "'}");
1635
1656
  }
1636
1657
  }
1637
1658
  /**
@@ -1643,72 +1664,66 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
1643
1664
  */
1644
1665
 
1645
1666
 
1646
- _exports.compileBinding = compileBinding;
1647
-
1648
1667
  function compilePathParameter(expression) {
1649
1668
  var singlePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1650
1669
  var outValue = "";
1651
1670
 
1652
- switch (expression._type) {
1653
- case "Constant":
1654
- switch (typeof expression.value) {
1655
- case "number":
1656
- case "bigint":
1657
- outValue = "value: ".concat(expression.value.toString());
1658
- break;
1659
-
1660
- case "string":
1661
- outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
1662
- break;
1663
-
1664
- case "boolean":
1665
- outValue = "value: '".concat(expression.value.toString(), "'");
1666
- break;
1667
-
1668
- default:
1669
- outValue = "value: ''";
1670
- break;
1671
- }
1671
+ if (expression._type === "Constant") {
1672
+ switch (typeof expression.value) {
1673
+ case "number":
1674
+ case "bigint":
1675
+ outValue = "value: ".concat(expression.value.toString());
1676
+ break;
1672
1677
 
1673
- if (singlePath) {
1674
- return outValue;
1675
- }
1678
+ case "string":
1679
+ outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
1680
+ break;
1676
1681
 
1677
- return "{".concat(outValue, "}");
1682
+ case "boolean":
1683
+ outValue = "value: '".concat(expression.value.toString(), "'");
1684
+ break;
1678
1685
 
1679
- case "DefaultBinding":
1680
- case "Binding":
1681
- outValue = "path:'".concat(expression.modelName ? "".concat(expression.modelName, ">") : "").concat(expression.path, "'");
1686
+ default:
1687
+ outValue = "value: ''";
1688
+ break;
1689
+ }
1690
+ } else if (expression._type === "DefaultBinding" || expression._type === "Binding") {
1691
+ outValue = "path: '".concat(compileBindingPath(expression), "'");
1692
+ outValue += expression.type ? ", type: '".concat(expression.type, "'") : ", targetType: 'any'";
1682
1693
 
1683
- if (expression.type) {
1684
- outValue += ", type : '".concat(expression.type, "'");
1685
- } else {
1686
- outValue += ", targetType : 'any'";
1687
- }
1694
+ if (hasElements(expression.constraints)) {
1695
+ outValue += ", constraints: ".concat(compileBinding(expression.constraints));
1696
+ }
1688
1697
 
1689
- if (expression.constraints && Object.keys(expression.constraints).length > 0) {
1690
- outValue += ", constraints: ".concat(compileBinding(expression.constraints));
1691
- }
1698
+ if (hasElements(expression.formatOptions)) {
1699
+ outValue += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
1700
+ }
1692
1701
 
1693
- if (expression.formatOptions && Object.keys(expression.formatOptions).length > 0) {
1694
- outValue += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
1695
- }
1702
+ if (hasElements(expression.parameters)) {
1703
+ outValue += ", parameters: ".concat(compileBinding(expression.parameters));
1704
+ }
1705
+ } else {
1706
+ return "";
1707
+ }
1696
1708
 
1697
- if (expression.parameters && Object.keys(expression.parameters).length > 0) {
1698
- outValue += ", parameters: ".concat(compileBinding(expression.parameters));
1699
- }
1709
+ return singlePath ? outValue : "{".concat(outValue, "}");
1710
+ }
1700
1711
 
1701
- if (singlePath) {
1702
- return outValue;
1703
- }
1712
+ function hasElements(obj) {
1713
+ return obj && Object.keys(obj).length > 0;
1714
+ }
1715
+ /**
1716
+ * Compile a binding expression path.
1717
+ *
1718
+ * @param expression The expression to compile.
1719
+ * @returns The compiled path.
1720
+ */
1704
1721
 
1705
- return "{".concat(outValue, "}");
1706
1722
 
1707
- default:
1708
- return "";
1709
- }
1723
+ function compileBindingPath(expression) {
1724
+ return "".concat(expression.modelName ? expression.modelName + ">" : "").concat(expression.path);
1710
1725
  }
1711
1726
 
1712
1727
  return _exports;
1713
1728
  }, false);
1714
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJjIiwiaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24iLCJleHByZXNzaW9ucyIsImZpbmQiLCJleHByIiwidW5kZWZpbmVkIiwiX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbCIsImEiLCJiIiwidmFsdWUiLCJvcGVyYW5kIiwib3BlcmF0b3IiLCJvcGVyYW5kcyIsImxlbmd0aCIsImV2ZXJ5IiwiZXhwcmVzc2lvbiIsInNvbWUiLCJvdGhlckV4cHJlc3Npb24iLCJjb25kaXRpb24iLCJvblRydWUiLCJvbkZhbHNlIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsImFFeHByZXNzaW9ucyIsImJFeHByZXNzaW9ucyIsImluZGV4IiwibW9kZWxOYW1lIiwicGF0aCIsInRhcmdldEVudGl0eVNldCIsImZuIiwicGFyYW1ldGVycyIsInR5cGUiLCJiaW5kaW5nUGFyYW1ldGVycyIsIm90aGVyRnVuY3Rpb24iLCJvYmoiLCJyZWYiLCJmbGF0dGVuU2V0RXhwcmVzc2lvbiIsInJlZHVjZSIsInJlc3VsdCIsImNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nIiwiZm9yRWFjaCIsImNhbmRpZGF0ZSIsImUiLCJwdXNoIiwiaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyIsImkiLCJuZWdhdGVkRXhwcmVzc2lvbiIsIm5vdCIsImoiLCJhbmQiLCJtYXAiLCJ3cmFwUHJpbWl0aXZlIiwiaXNTdGF0aWNGYWxzZSIsIm5vblRyaXZpYWxFeHByZXNzaW9uIiwiZmlsdGVyIiwiaXNDb25zdGFudCIsImNvbnN0YW50IiwiaXNWYWxpZCIsIm9yIiwiaXNTdGF0aWNUcnVlIiwiaXNDb21wYXJpc29uIiwiZXF1YWwiLCJncmVhdGVyT3JFcXVhbCIsImdyZWF0ZXJUaGFuIiwibm90RXF1YWwiLCJsZXNzT3JFcXVhbCIsImxlc3NUaGFuIiwiaXNUcnV0aHkiLCJiaW5kaW5nRXhwcmVzc2lvbiIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsInZhbCIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiRXEiLCJOZSIsIkd0IiwiR2UiLCJMdCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJhbm5vdGF0aW9uVmFsdWUiLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImNvbmRpdGlvbkV4cHJlc3Npb24iLCJvblRydWVFeHByZXNzaW9uIiwib25GYWxzZUV4cHJlc3Npb24iLCJoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0IiwiZm9ybWF0UmVzdWx0IiwiZm9ybWF0dGVyRnVuY3Rpb24iLCJjb250ZXh0RW50aXR5VHlwZSIsInBhcmFtZXRlckV4cHJlc3Npb25zIiwiX19mdW5jdGlvbk5hbWUiLCJzcGxpdCIsImZvcm1hdHRlckNsYXNzIiwiZm9ybWF0dGVyTmFtZSIsInVuc2hpZnQiLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJvRm9ybWF0T3B0aW9ucyIsImluZGV4T2YiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJmb3JtYXRPcHRpb25zIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJuZWVkUGFyZW50aGVzaXMiLCJjb21waWxlQmluZGluZyIsImVtYmVkZGVkSW5CaW5kaW5nIiwia2VlcFRhcmdldFR5cGUiLCJlbWJlZGRlZFNlcGFyYXRvciIsIm91dFByb3BlcnR5IiwiZW50cmllcyIsIm8iLCJwcm9wZXJ0aWVzIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJvdXRCaW5kaW5nIiwiY29uc3RyYWludHMiLCJpc09wZXJhbmQxQ29tcGxleCIsImlzT3BlcmFuZDJDb21wbGV4IiwiY29tcGFyaXNvblBhcnQiLCJjb21waWxlUGF0aFBhcmFtZXRlciIsInBhcmFtIiwib3V0cHV0RW5kIiwic2luZ2xlUGF0aCIsIm91dFZhbHVlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwS08sTUFBTUEsdUJBQXVELEdB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QzdFa0wsVUFBQUEsUUFBUSw2QkFBc0JwQixjQUFjLENBQUM1SixVQUFVLENBQUN3SyxXQUFaLENBQXBDLENBQVI7QUFDQTs7QUFDRCxZQUFJeEssVUFBVSxDQUFDK0ksYUFBWCxJQUE0QjdFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZbkUsVUFBVSxDQUFDK0ksYUFBdkIsRUFBc0NqSixNQUF0QyxHQUErQyxDQUEvRSxFQUFrRjtBQUNqRmtMLFVBQUFBLFFBQVEsK0JBQXdCcEIsY0FBYyxDQUFDNUosVUFBVSxDQUFDK0ksYUFBWixDQUF0QyxDQUFSO0FBQ0E7O0FBQ0QsWUFBSS9JLFVBQVUsQ0FBQ2UsVUFBWCxJQUF5Qm1ELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZbkUsVUFBVSxDQUFDZSxVQUF2QixFQUFtQ2pCLE1BQW5DLEdBQTRDLENBQXpFLEVBQTRFO0FBQzNFa0wsVUFBQUEsUUFBUSw0QkFBcUJwQixjQUFjLENBQUM1SixVQUFVLENBQUNlLFVBQVosQ0FBbkMsQ0FBUjtBQUNBOztBQUNELFlBQUlnSyxVQUFKLEVBQWdCO0FBQ2YsaUJBQU9DLFFBQVA7QUFDQTs7QUFDRCwwQkFBV0EsUUFBWDs7QUFDRDtBQUNDLGVBQU8sRUFBUDtBQTdDRjtBQStDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QW5kQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0Q29uZGl0aW9uYWxDaGVja09yVmFsdWUsXG5cdEVudGl0eVR5cGUsXG5cdEVxQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0R3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0R3RDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdElmQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdElmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZSxcblx0TGVBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0TGVDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEx0QW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHROZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0Tm90QW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5vdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0T3JBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0T3JDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdFBhdGhDb25kaXRpb25FeHByZXNzaW9uLFxuXHRQcm9wZXJ0eUFubm90YXRpb25WYWx1ZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb24sIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9FZG1cIjtcbmltcG9ydCB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0NvbnZlcnRlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZUVudW1WYWx1ZSB9IGZyb20gXCIuL0Fubm90YXRpb25FbnVtXCI7XG5cbnR5cGUgUHJpbWl0aXZlVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG50eXBlIEJhc2VFeHByZXNzaW9uPFQ+ID0ge1xuXHRfdHlwZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkNvbnN0YW50XCI7XG5cdHZhbHVlOiBUO1xufTtcblxudHlwZSBTZXRPcGVyYXRvciA9IFwiJiZcIiB8IFwifHxcIjtcbmV4cG9ydCB0eXBlIFNldEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiU2V0XCI7XG5cdG9wZXJhdG9yOiBTZXRPcGVyYXRvcjtcblx0b3BlcmFuZHM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5vdEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiTm90XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuXG5leHBvcnQgdHlwZSBUcnV0aHlFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIlRydXRoeVwiO1xuXHRvcGVyYW5kOiBFeHByZXNzaW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgdHlwZSBSZWZlcmVuY2VFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248b2JqZWN0PiAmIHtcblx0X3R5cGU6IFwiUmVmXCI7XG5cdHJlZjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIEZvcm1hdHRlckV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRm9ybWF0dGVyXCI7XG5cdGZuOiBzdHJpbmc7XG5cdHBhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkNvbXBsZXhUeXBlXCI7XG5cdHR5cGU6IHN0cmluZztcblx0Zm9ybWF0T3B0aW9uczogb2JqZWN0O1xuXHRwYXJhbWV0ZXJzOiBvYmplY3Q7XG5cdGJpbmRpbmdQYXJhbWV0ZXJzOiBFeHByZXNzaW9uPGFueT5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGdW5jdGlvblwiO1xuXHRvYmo/OiBFeHByZXNzaW9uPG9iamVjdD47XG5cdGZuOiBzdHJpbmc7XG5cdHBhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uY2F0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPHN0cmluZz4gJiB7XG5cdF90eXBlOiBcIkNvbmNhdFwiO1xuXHRleHByZXNzaW9uczogRXhwcmVzc2lvbjxzdHJpbmc+W107XG59O1xuXG5leHBvcnQgdHlwZSBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJVbnJlc29sdmVhYmxlXCI7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvblxuICovXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQmluZGluZ1wiO1xuXHRtb2RlbE5hbWU/OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0O1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IGFueTtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRGVmYXVsdEJpbmRpbmdcIjtcblx0bW9kZWxOYW1lPzogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogYW55O1xuXHR0YXJnZXRUeXBlPzogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIjtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9PT1cIiB8IFwiIT09XCIgfCBcIj49XCIgfCBcIj5cIiB8IFwiPD1cIiB8IFwiPFwiO1xuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbkV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiQ29tcGFyaXNvblwiO1xuXHRvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yO1xuXHRvcGVyYW5kMTogRXhwcmVzc2lvbjxhbnk+O1xuXHRvcGVyYW5kMjogRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgSWZFbHNlRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJJZkVsc2VcIjtcblx0Y29uZGl0aW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRvblRydWU6IEV4cHJlc3Npb248VD47XG5cdG9uRmFsc2U6IEV4cHJlc3Npb248VD47XG59O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULlxuICpcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvbjxUPiA9XG5cdHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uXG5cdHwgQ29uc3RhbnRFeHByZXNzaW9uPFQ+XG5cdHwgU2V0RXhwcmVzc2lvblxuXHR8IE5vdEV4cHJlc3Npb25cblx0fCBUcnV0aHlFeHByZXNzaW9uXG5cdHwgQ29uY2F0RXhwcmVzc2lvblxuXHR8IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPlxuXHR8IEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD5cblx0fCBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPlxuXHR8IERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD5cblx0fCBDb21wYXJpc29uRXhwcmVzc2lvblxuXHR8IElmRWxzZUV4cHJlc3Npb248VD5cblx0fCBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+XG5cdHwgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+XG5cdHwgUmVmZXJlbmNlRXhwcmVzc2lvblxuXHR8IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblxuLyoqXG4gKiBBbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHR5cGUgVCwgb3IgYSBjb25zdGFudCB2YWx1ZSBvZiB0eXBlIFRcbiAqL1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPiA9IEV4cHJlc3Npb248VD4gfCBUO1xuXG5leHBvcnQgY29uc3QgdW5yZXNvbHZlYWJsZUV4cHJlc3Npb246IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvbiA9IHtcblx0X3R5cGU6IFwiVW5yZXNvbHZlYWJsZVwiXG59O1xuXG5mdW5jdGlvbiBlc2NhcGVYbWxBdHRyaWJ1dGUoaW5wdXRTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gaW5wdXRTdHJpbmcucmVwbGFjZSgvWyddL2csIGZ1bmN0aW9uKGM6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoYykge1xuXHRcdFx0Y2FzZSBcIidcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFxcXCdcIjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBjO1xuXHRcdH1cblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9uczogRXhwcmVzc2lvbjxhbnk+W10pOiBib29sZWFuIHtcblx0cmV0dXJuIGV4cHJlc3Npb25zLmZpbmQoZXhwciA9PiBleHByLl90eXBlID09PSBcIlVucmVzb2x2ZWFibGVcIikgIT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ2hlY2sgdHdvIGV4cHJlc3Npb25zIGZvciAoZGVlcCkgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGVxdWFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsPFQ+KGE6IEV4cHJlc3Npb248VD4sIGI6IEV4cHJlc3Npb248VD4pOiBib29sZWFuIHtcblx0aWYgKGEuX3R5cGUgIT09IGIuX3R5cGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzd2l0Y2ggKGEuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZlYWJsZVwiOlxuXHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBVbnJlc29sdmVhYmxlIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nIGV2ZW4gaXRzZWxmXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gYS52YWx1ZSA9PT0gKGIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+KS52YWx1ZTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgTm90RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBUcnV0aHlFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmxlbmd0aCA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMubGVuZ3RoICYmXG5cdFx0XHRcdGEub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PlxuXHRcdFx0XHRcdChiIGFzIFNldEV4cHJlc3Npb24pLm9wZXJhbmRzLnNvbWUob3RoZXJFeHByZXNzaW9uID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgb3RoZXJFeHByZXNzaW9uKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5jb25kaXRpb24sIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLmNvbmRpdGlvbikgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uVHJ1ZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25UcnVlKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub25GYWxzZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25GYWxzZSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5vcGVyYXRvciA9PSAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmF0b3IgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQxLCAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmFuZDEpICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kMiwgKGIgYXMgQ29tcGFyaXNvbkV4cHJlc3Npb24pLm9wZXJhbmQyKVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGNvbnN0IGFFeHByZXNzaW9ucyA9IGEuZXhwcmVzc2lvbnM7XG5cdFx0XHRjb25zdCBiRXhwcmVzc2lvbnMgPSAoYiBhcyBDb25jYXRFeHByZXNzaW9uKS5leHByZXNzaW9ucztcblx0XHRcdGlmIChhRXhwcmVzc2lvbnMubGVuZ3RoICE9PSBiRXhwcmVzc2lvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhRXhwcmVzc2lvbnMuZXZlcnkoKGV4cHJlc3Npb24sIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb24sIGJFeHByZXNzaW9uc1tpbmRleF0pO1xuXHRcdFx0fSk7XG5cblx0XHRjYXNlIFwiQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5tb2RlbE5hbWUgPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikubW9kZWxOYW1lICYmXG5cdFx0XHRcdGEucGF0aCA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5wYXRoICYmXG5cdFx0XHRcdGEudGFyZ2V0RW50aXR5U2V0ID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLnRhcmdldEVudGl0eVNldFxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5tb2RlbE5hbWUgPT09IChiIGFzIERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLm1vZGVsTmFtZSAmJlxuXHRcdFx0XHRhLnBhdGggPT09IChiIGFzIERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLnBhdGhcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiRm9ybWF0dGVyXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLmZuID09PSAoYiBhcyBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+KS5mbiAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMubGVuZ3RoID09PSAoYiBhcyBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+KS5wYXJhbWV0ZXJzLmxlbmd0aCAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbCgoYiBhcyBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+KS5wYXJhbWV0ZXJzW2luZGV4XSwgdmFsdWUpKVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEudHlwZSA9PT0gKGIgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+KS50eXBlICYmXG5cdFx0XHRcdGEuYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoID09PSAoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLmJpbmRpbmdQYXJhbWV0ZXJzLmxlbmd0aCAmJlxuXHRcdFx0XHRhLmJpbmRpbmdQYXJhbWV0ZXJzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+XG5cdFx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbCgoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLmJpbmRpbmdQYXJhbWV0ZXJzW2luZGV4XSwgdmFsdWUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRjb25zdCBvdGhlckZ1bmN0aW9uID0gYiBhcyBGdW5jdGlvbkV4cHJlc3Npb248VD47XG5cdFx0XHRpZiAoYS5vYmogPT09IHVuZGVmaW5lZCB8fCBvdGhlckZ1bmN0aW9uLm9iaiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBhLm9iaiA9PT0gb3RoZXJGdW5jdGlvbjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5mbiA9PT0gb3RoZXJGdW5jdGlvbi5mbiAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub2JqLCBvdGhlckZ1bmN0aW9uLm9iaikgJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gb3RoZXJGdW5jdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChvdGhlckZ1bmN0aW9uLnBhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSkpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdFx0cmV0dXJuIGEucmVmID09PSAoYiBhcyBSZWZlcmVuY2VFeHByZXNzaW9uKS5yZWY7XG5cdH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5lc3RlZCBTZXRFeHByZXNzaW9uIGJ5IGlubGluaW5nIG9wZXJhbmRzIG9mIHR5cGUgU2V0RXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGZsYXR0ZW5cbiAqIEByZXR1cm5zIHtTZXRFeHByZXNzaW9ufSBBIG5ldyBTZXRFeHByZXNzaW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAqL1xuZnVuY3Rpb24gZmxhdHRlblNldEV4cHJlc3Npb24oZXhwcmVzc2lvbjogU2V0RXhwcmVzc2lvbik6IFNldEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5yZWR1Y2UoXG5cdFx0KHJlc3VsdDogU2V0RXhwcmVzc2lvbiwgb3BlcmFuZCkgPT4ge1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcgPVxuXHRcdFx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmIG9wZXJhbmQub3BlcmF0b3IgPT09IGV4cHJlc3Npb24ub3BlcmF0b3IgPyBvcGVyYW5kLm9wZXJhbmRzIDogW29wZXJhbmRdO1xuXHRcdFx0Y2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcuZm9yRWFjaChjYW5kaWRhdGUgPT4ge1xuXHRcdFx0XHRpZiAocmVzdWx0Lm9wZXJhbmRzLmV2ZXJ5KGUgPT4gIV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZSwgY2FuZGlkYXRlKSkpIHtcblx0XHRcdFx0XHRyZXN1bHQub3BlcmFuZHMucHVzaChjYW5kaWRhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblx0XHR7IF90eXBlOiBcIlNldFwiLCBvcGVyYXRvcjogZXhwcmVzc2lvbi5vcGVyYXRvciwgb3BlcmFuZHM6IFtdIH1cblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYW4gYXJyYXkgb2YgYm9vbGVhbiBleHByZXNzaW9ucyBjb250YWlucyBhbiBleHByZXNzaW9uIGFuZCBpdHMgbmVnYXRpb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb25zIEFycmF5IG9mIGV4cHJlc3Npb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBzZXQgb2YgZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGhhc09wcG9zaXRlRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSk6IGJvb2xlYW4ge1xuXHRpZiAoZXhwcmVzc2lvbnMubGVuZ3RoIDwgMikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGxldCBpID0gZXhwcmVzc2lvbnMubGVuZ3RoO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0Y29uc3QgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zW2ldO1xuXHRcdGNvbnN0IG5lZ2F0ZWRFeHByZXNzaW9uID0gbm90KGV4cHJlc3Npb24pO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKSB7XG5cdFx0XHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uc1tqXSwgbmVnYXRlZEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTG9naWNhbCBgYW5kYCBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBleHByZXNzaW9uIGlzIHNpbXBsaWZpZWQgdG8gZmFsc2UgaWYgdGhpcyBjYW4gYmUgZGVjaWRlZCBzdGF0aWNhbGx5ICh0aGF0IGlzLCBpZiBvbmUgb3BlcmFuZCBpcyBhIGNvbnN0YW50XG4gKiBmYWxzZSBvciBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhbiBvcGVyYW5kIGFuZCBpdHMgbmVnYXRpb24pLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kcyBFeHByZXNzaW9ucyB0byBjb25uZWN0IGJ5IGBhbmRgXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZCguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgZXhwcmVzc2lvbnMgPSBmbGF0dGVuU2V0RXhwcmVzc2lvbih7XG5cdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0b3BlcmF0b3I6IFwiJiZcIixcblx0XHRvcGVyYW5kczogb3BlcmFuZHMubWFwKHdyYXBQcmltaXRpdmUpXG5cdH0pLm9wZXJhbmRzO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljRmFsc2U6IGJvb2xlYW4gPSBmYWxzZTtcblx0Y29uc3Qgbm9uVHJpdmlhbEV4cHJlc3Npb24gPSBleHByZXNzaW9ucy5maWx0ZXIoZXhwcmVzc2lvbiA9PiB7XG5cdFx0aWYgKGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgIWV4cHJlc3Npb24udmFsdWUpIHtcblx0XHRcdGlzU3RhdGljRmFsc2UgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbik7XG5cdH0pO1xuXHRpZiAoaXNTdGF0aWNGYWxzZSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKGlzVmFsaWQsIGV4cHJlc3Npb24pID0+IHtcblx0XHRcdHJldHVybiBpc1ZhbGlkICYmIGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi52YWx1ZTtcblx0XHR9LCB0cnVlKTtcblx0XHRyZXR1cm4gY29uc3RhbnQoaXNWYWxpZCk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5vblRyaXZpYWxFeHByZXNzaW9uWzBdO1xuXHR9IGVsc2UgaWYgKGhhc09wcG9zaXRlRXhwcmVzc2lvbnMobm9uVHJpdmlhbEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG9yYCBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBleHByZXNzaW9uIGlzIHNpbXBsaWZpZWQgdG8gdHJ1ZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIHRydWUgb3IgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYW4gb3BlcmFuZCBhbmQgaXRzIG5lZ2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZHMgRXhwcmVzc2lvbnMgdG8gY29ubmVjdCBieSBgb3JgXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljVHJ1ZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlKSB7XG5cdFx0XHRpc1N0YXRpY1RydWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi52YWx1ZTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY1RydWUpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKGlzVmFsaWQsIGV4cHJlc3Npb24pID0+IHtcblx0XHRcdHJldHVybiBpc1ZhbGlkICYmIGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi52YWx1ZTtcblx0XHR9LCB0cnVlKTtcblx0XHRyZXR1cm4gY29uc3RhbnQoaXNWYWxpZCk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5vblRyaXZpYWxFeHByZXNzaW9uWzBdO1xuXHR9IGVsc2UgaWYgKGhhc09wcG9zaXRlRXhwcmVzc2lvbnMobm9uVHJpdmlhbEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRcdG9wZXJhdG9yOiBcInx8XCIsXG5cdFx0XHRvcGVyYW5kczogbm9uVHJpdmlhbEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogTG9naWNhbCBgbm90YCBvcGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZCBUaGUgZXhwcmVzc2lvbiB0byByZXZlcnNlXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gVGhlIHJlc3VsdGluZyBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdChvcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0b3BlcmFuZCA9IHdyYXBQcmltaXRpdmUob3BlcmFuZCk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihvcGVyYW5kKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmIChpc0NvbnN0YW50KG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KCFvcGVyYW5kLnZhbHVlKTtcblx0fSBlbHNlIGlmIChcblx0XHR0eXBlb2Ygb3BlcmFuZCA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdG9wZXJhbmQuX3R5cGUgPT09IFwiU2V0XCIgJiZcblx0XHRvcGVyYW5kLm9wZXJhdG9yID09PSBcInx8XCIgJiZcblx0XHRvcGVyYW5kLm9wZXJhbmRzLmV2ZXJ5KGV4cHJlc3Npb24gPT4gaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBpc0NvbXBhcmlzb24oZXhwcmVzc2lvbikpXG5cdCkge1xuXHRcdHJldHVybiBhbmQoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PiBub3QoZXhwcmVzc2lvbikpKTtcblx0fSBlbHNlIGlmIChcblx0XHR0eXBlb2Ygb3BlcmFuZCA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdG9wZXJhbmQuX3R5cGUgPT09IFwiU2V0XCIgJiZcblx0XHRvcGVyYW5kLm9wZXJhdG9yID09PSBcIiYmXCIgJiZcblx0XHRvcGVyYW5kLm9wZXJhbmRzLmV2ZXJ5KGV4cHJlc3Npb24gPT4gaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBpc0NvbXBhcmlzb24oZXhwcmVzc2lvbikpXG5cdCkge1xuXHRcdHJldHVybiBvciguLi5vcGVyYW5kLm9wZXJhbmRzLm1hcChleHByZXNzaW9uID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKGlzQ29tcGFyaXNvbihvcGVyYW5kKSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgcmV2ZXJzZSBjb21wYXJpc29uXG5cdFx0c3dpdGNoIChvcGVyYW5kLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiBlcXVhbChvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHRcdGNhc2UgXCI8XCI6XG5cdFx0XHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHRcdGNhc2UgXCI8PVwiOlxuXHRcdFx0XHRyZXR1cm4gZ3JlYXRlclRoYW4ob3BlcmFuZC5vcGVyYW5kMSwgb3BlcmFuZC5vcGVyYW5kMik7XG5cdFx0XHRjYXNlIFwiPT09XCI6XG5cdFx0XHRcdHJldHVybiBub3RFcXVhbChvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHRcdGNhc2UgXCI+XCI6XG5cdFx0XHRcdHJldHVybiBsZXNzT3JFcXVhbChvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHRcdGNhc2UgXCI+PVwiOlxuXHRcdFx0XHRyZXR1cm4gbGVzc1RoYW4ob3BlcmFuZC5vcGVyYW5kMSwgb3BlcmFuZC5vcGVyYW5kMik7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wZXJhbmQuX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHRyZXR1cm4gb3BlcmFuZC5vcGVyYW5kO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJOb3RcIixcblx0XHRcdG9wZXJhbmQ6IG9wZXJhbmRcblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIHdoZXRoZXIgYSBiaW5kaW5nIGV4cHJlc3Npb24gaXMgZXF1YWwgdG8gdHJ1ZSB3aXRoIGEgbG9vc2UgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcnV0aHkob3BlcmFuZDogRXhwcmVzc2lvbjxzdHJpbmc+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmIChpc0NvbnN0YW50KG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KCEhb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlRydXRoeVwiLFxuXHRcdFx0b3BlcmFuZDogb3BlcmFuZFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYmluZGluZyBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwuXG4gKlxuICogQHRlbXBsYXRlIFRhcmdldFR5cGVcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIFttb2RlbE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBtb2RlbFxuICogQHBhcmFtIFt2aXNpdGVkTmF2aWdhdGlvblBhdGhzXSBUaGUgcGF0aHMgZnJvbSB0aGUgcm9vdCBlbnRpdHlTZXRcbiAqIEBwYXJhbSBbcGF0aFZpc2l0b3JdIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUYXJnZXRUeXBlPn0gVGhlIGRlZmF1bHQgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kaW5nRXhwcmVzc2lvbjxUYXJnZXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxOYW1lPzogc3RyaW5nLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VGFyZ2V0VHlwZT4gfCBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24ge1xuXHRpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCB0YXJnZXRQYXRoO1xuXHRpZiAocGF0aFZpc2l0b3IpIHtcblx0XHR0YXJnZXRQYXRoID0gcGF0aFZpc2l0b3IocGF0aCk7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBsb2NhbFBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLmNvbmNhdCgpO1xuXHRcdGxvY2FsUGF0aC5wdXNoKHBhdGgpO1xuXHRcdHRhcmdldFBhdGggPSBsb2NhbFBhdGguam9pbihcIi9cIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJCaW5kaW5nXCIsXG5cdFx0bW9kZWxOYW1lOiBtb2RlbE5hbWUsXG5cdFx0cGF0aDogdGFyZ2V0UGF0aFxuXHR9O1xufVxuXG50eXBlIFBsYWluRXhwcmVzc2lvbk9iamVjdCA9IHsgW2luZGV4OiBzdHJpbmddOiBFeHByZXNzaW9uPGFueT4gfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiYXNlZCBvbiBhIHByaW1pdGl2ZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHZhbHVlIFRoZSBjb25zdGFudCB0byB3cmFwIGluIGFuIGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtDb25zdGFudEV4cHJlc3Npb248VD59IFRoZSBjb25zdGFudCBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4odmFsdWU6IFQpOiBDb25zdGFudEV4cHJlc3Npb248VD4ge1xuXHRsZXQgY29uc3RhbnRWYWx1ZTogVDtcblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS5tYXAod3JhcFByaW1pdGl2ZSkgYXMgVDtcblx0XHR9IGVsc2UgaWYgKGlzUHJpbWl0aXZlT2JqZWN0KHZhbHVlIGFzIG9iamVjdCkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS52YWx1ZU9mKCkgYXMgVDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgdmFsID0gdmFsdWUgYXMgeyBbbmFtZTogc3RyaW5nXTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGFueT4gfTtcblx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5rZXlzKHZhbCkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IHdyYXBQcmltaXRpdmUodmFsW2tleV0pO1xuXHRcdFx0XHRpZiAodmFsdWUuX3R5cGUgIT09IFwiQ29uc3RhbnRcIiB8fCB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b2JqW2tleV0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0fSwge30gYXMgUGxhaW5FeHByZXNzaW9uT2JqZWN0KTtcblxuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IG9iaiBhcyBUO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdGFudFZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRyZXR1cm4geyBfdHlwZTogXCJDb25zdGFudFwiLCB2YWx1ZTogY29uc3RhbnRWYWx1ZSB9O1xufVxuXG50eXBlIEV2YWx1YXRpb25UeXBlID0gXCJib29sZWFuXCI7XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmdTdHJpbmc8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHR2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcixcblx0dGFyZ2V0VHlwZT86IEV2YWx1YXRpb25UeXBlXG4pOiBDb25zdGFudEV4cHJlc3Npb248VD4gfCBFbWJlZGRlZEJpbmRpbmdFeHByZXNzaW9uPFQ+IHwgRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD4ge1xuXHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRpZiAodmFsdWUuc3RhcnRzV2l0aChcIns9XCIpKSB7XG5cdFx0XHQvLyBFeHByZXNzaW9uIGJpbmRpbmcsIHdlIGNhbiBqdXN0IHJlbW92ZSB0aGUgb3V0ZXIgYmluZGluZyB0aGluZ3Ncblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIixcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRfdHlwZTogXCJFbWJlZGRlZEJpbmRpbmdcIixcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRzd2l0Y2ggKHRhcmdldFR5cGUpIHtcblx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgKHZhbHVlID09PSBcInRydWVcIiB8fCB2YWx1ZSA9PT0gXCJmYWxzZVwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSA9PT0gXCJ0cnVlXCIpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodmFsdWUpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSkgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEEgbmFtZWQgcmVmZXJlbmNlLlxuICpcbiAqIEBzZWUgZm5cbiAqXG4gKiBAcGFyYW0gcmVmIFJlZmVyZW5jZVxuICogQHJldHVybnMge1JlZmVyZW5jZUV4cHJlc3Npb259IFRoZSBvYmplY3QgcmVmZXJlbmNlIGJpbmRpbmcgcGFydFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmKHJlZjogc3RyaW5nIHwgbnVsbCk6IFJlZmVyZW5jZUV4cHJlc3Npb24ge1xuXHRyZXR1cm4geyBfdHlwZTogXCJSZWZcIiwgcmVmIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBFdmVyeSBvYmplY3QgaGF2aW5nIGEgcHJvcGVydHkgbmFtZWQgYF90eXBlYCBvZiBzb21lIHZhbHVlIGlzIGNvbnNpZGVyZWQgYW4gZXhwcmVzc2lvbiwgZXZlbiBpZiB0aGVyZSBpcyBhY3R1YWxseVxuICogbm8gc3VjaCBleHByZXNzaW9uIHR5cGUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSBzb21ldGhpbmcgVHlwZSB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHlwZSBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gaXNFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihzb21ldGhpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IHNvbWV0aGluZyBpcyBFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHNvbWV0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2Ygc29tZXRoaW5nID09PSBcIm9iamVjdFwiICYmIChzb21ldGhpbmcgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV3JhcCBhIHByaW1pdGl2ZSBpbnRvIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gc29tZXRoaW5nIFRoZSBvYmplY3QgdG8gd3JhcCBpbiBhIENvbnN0YW50IGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBFaXRoZXIgdGhlIG9yaWdpbmFsIG9iamVjdCBvciB0aGUgd3JhcHBlZCBvbmUgZGVwZW5kaW5nIG9uIHRoZSBjYXNlXG4gKi9cbmZ1bmN0aW9uIHdyYXBQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG5cdGlmIChpc0V4cHJlc3Npb24oc29tZXRoaW5nKSkge1xuXHRcdHJldHVybiBzb21ldGhpbmc7XG5cdH1cblxuXHRyZXR1cm4gY29uc3RhbnQoc29tZXRoaW5nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUgcHJvdmlkZWQgaXMgY29uc3RhbnQgb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBtYXliZUNvbnN0YW50IFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgY29uc3RhbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RhbnQ8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KG1heWJlQ29uc3RhbnQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IG1heWJlQ29uc3RhbnQgaXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBtYXliZUNvbnN0YW50ICE9PSBcIm9iamVjdFwiIHx8IChtYXliZUNvbnN0YW50IGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSA9PT0gXCJDb25zdGFudFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBiaW5kaW5nIG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVCaW5kaW5nIFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgYmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUJpbmRpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IG1heWJlQmluZGluZyBpcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIG1heWJlQmluZGluZyA9PT0gXCJvYmplY3RcIiAmJiAobWF5YmVCaW5kaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSA9PT0gXCJCaW5kaW5nXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIHByb3ZpZGVkIGlzIGEgY29tcGFyaXNvbiBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIENvbXBhcmlzb25FeHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPik6IGV4cHJlc3Npb24gaXMgQ29tcGFyaXNvbkV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCI7XG59XG5cbnR5cGUgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFA+ID1cblx0fCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgSWZBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE9yQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE5lQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBFcUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTm90QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBHdEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgR2VBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IExlQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBMdEFubm90YXRpb25FeHByZXNzaW9uPFA+O1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZU9iamVjdChvYmplY3RUeXBlOiBvYmplY3QpOiBib29sZWFuIHtcblx0c3dpdGNoIChvYmplY3RUeXBlLmNvbnN0cnVjdG9yLm5hbWUpIHtcblx0XHRjYXNlIFwiU3RyaW5nXCI6XG5cdFx0Y2FzZSBcIk51bWJlclwiOlxuXHRcdGNhc2UgXCJCb29sZWFuXCI6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBwYXNzZWQgYW5ub3RhdGlvbiBleHByZXNzaW9uIGlzIGEgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBhbm5vdGF0aW9uRXhwcmVzc2lvbiBUaGUgYW5ub3RhdGlvbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBvYmplY3QgaXMgYSB7Q29tcGxleEFubm90YXRpb25FeHByZXNzaW9ufVxuICovXG5mdW5jdGlvbiBpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUPihcblx0YW5ub3RhdGlvbkV4cHJlc3Npb246IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFQ+XG4pOiBhbm5vdGF0aW9uRXhwcmVzc2lvbiBpcyBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIGFubm90YXRpb25FeHByZXNzaW9uID09PSBcIm9iamVjdFwiICYmICFpc1ByaW1pdGl2ZU9iamVjdChhbm5vdGF0aW9uRXhwcmVzc2lvbiBhcyBvYmplY3QpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb24gZm9yIGEgZ2l2ZW4gYW5ub3RhdGlvbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25FeHByZXNzaW9uIFRoZSBzb3VyY2UgYW5ub3RhdGlvbiBleHByZXNzaW9uXG4gKiBAcGFyYW0gdmlzaXRlZE5hdmlnYXRpb25QYXRocyBUaGUgcGF0aCBmcm9tIHRoZSByb290IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSBpZiB0aGUgYW5ub3RhdGlvbkV4cHJlc3Npb24gaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGV4cHJlc3Npb24gZXF1aXZhbGVudCB0byB0aGF0IGFubm90YXRpb24gZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbjogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdGRlZmF1bHRWYWx1ZT86IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGlmIChhbm5vdGF0aW9uRXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHdyYXBQcmltaXRpdmUoZGVmYXVsdFZhbHVlIGFzIFQpO1xuXHR9XG5cdGlmICghaXNDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb24oYW5ub3RhdGlvbkV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGFubm90YXRpb25FeHByZXNzaW9uKTtcblx0fSBlbHNlIHtcblx0XHRzd2l0Y2ggKGFubm90YXRpb25FeHByZXNzaW9uLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJQYXRoXCI6XG5cdFx0XHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5wYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdGNhc2UgXCJJZlwiOlxuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbklmRXhwcmVzc2lvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5JZiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0XHRyZXR1cm4gbm90KHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5Ob3QsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJFcVwiOlxuXHRcdFx0XHRyZXR1cm4gZXF1YWwoXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkVxWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkVxWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIk5lXCI6XG5cdFx0XHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uTmVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRjYXNlIFwiR3RcIjpcblx0XHRcdFx0cmV0dXJuIGdyZWF0ZXJUaGFuKFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5HdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5HdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJHZVwiOlxuXHRcdFx0XHRyZXR1cm4gZ3JlYXRlck9yRXF1YWwoXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkdlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkdlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIkx0XCI6XG5cdFx0XHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uTHRbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRjYXNlIFwiTGVcIjpcblx0XHRcdFx0cmV0dXJuIGxlc3NPckVxdWFsKFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5MZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5MZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJPclwiOlxuXHRcdFx0XHRyZXR1cm4gb3IoXG5cdFx0XHRcdFx0Li4uKGFubm90YXRpb25FeHByZXNzaW9uLk9yLm1hcChmdW5jdGlvbihvckNvbmRpdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihvckNvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIkFuZFwiOlxuXHRcdFx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0XHRcdC4uLihhbm5vdGF0aW9uRXhwcmVzc2lvbi5BbmQubWFwKGZ1bmN0aW9uKGFuZENvbmRpdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbmRDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0XHR9KSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJBcHBseVwiOlxuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkFwcGx5RXhwcmVzc2lvbihcblx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbiBhcyBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdFx0XHRwYXRoVmlzaXRvclxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGFubm90YXRpb24gY29uZGl0aW9uIGludG8gYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uVmFsdWUgVGhlIGNvbmRpdGlvbiBvciB2YWx1ZSBmcm9tIHRoZSBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzaXRlZE5hdmlnYXRpb25QYXRocyBUaGUgcGF0aCBmcm9tIHRoZSByb290IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBBbiBlcXVpdmFsZW50IGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvblZhbHVlOiBDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGlmIChhbm5vdGF0aW9uVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGFubm90YXRpb25WYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiBjb25zdGFudChhbm5vdGF0aW9uVmFsdWUgYXMgVCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0cmV0dXJuIG9yKFxuXHRcdFx0Li4uKCgoYW5ub3RhdGlvblZhbHVlIGFzIE9yQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kT3IubWFwKGZ1bmN0aW9uKG9yQ29uZGl0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24ob3JDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdH0pIGFzIHVua25vd24pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdHJldHVybiBhbmQoXG5cdFx0XHQuLi4oKChhbm5vdGF0aW9uVmFsdWUgYXMgQW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kQW5kLm1hcChmdW5jdGlvbihhbmRDb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbmRDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdH0pIGFzIHVua25vd24pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdHJldHVybiBub3QoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOb3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiROb3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkRXFcIikpIHtcblx0XHRyZXR1cm4gZXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBFcUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEVxWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBFcUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEVxWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0cmV0dXJuIG5vdEVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTmVDb25kaXRpb25hbEV4cHJlc3Npb24pLiROZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTmVDb25kaXRpb25hbEV4cHJlc3Npb24pLiROZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHdFwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRyZXR1cm4gZ3JlYXRlck9yRXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEdlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEdlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0cmV0dXJuIGxlc3NUaGFuKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTHRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTHRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMZVwiKSkge1xuXHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdHJldHVybiBiaW5kaW5nRXhwcmVzc2lvbigoYW5ub3RhdGlvblZhbHVlIGFzIFBhdGhDb25kaXRpb25FeHByZXNzaW9uPFQ+KS4kUGF0aCwgdW5kZWZpbmVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEFwcGx5XCIpKSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIkFwcGx5XCIsXG5cdFx0XHRcdEZ1bmN0aW9uOiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEZ1bmN0aW9uLFxuXHRcdFx0XHRBcHBseTogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRBcHBseVxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IFwiSWZcIixcblx0XHRcdFx0SWY6IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kSWZcblx0XHRcdH0gYXMgVCxcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRwYXRoVmlzaXRvclxuXHRcdCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEVudW1NZW1iZXJcIikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQocmVzb2x2ZUVudW1WYWx1ZSgoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEVudW1NZW1iZXIpIGFzIFQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSBhcyBUKTtcblx0fVxufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHtJZkFubm90YXRpb25FeHByZXNzaW9uVmFsdWV9IGludG8gYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uSWZFeHByZXNzaW9uIEFuIElmIGV4cHJlc3Npb24gcmV0dXJuaW5nIHRoZSB0eXBlIFRcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBlcXVpdmFsZW50IGlmRWxzZSBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvbklmRXhwcmVzc2lvbjogSWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlPFQ+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIGlmRWxzZShcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbklmRXhwcmVzc2lvblswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uSWZFeHByZXNzaW9uWzFdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uSWZFeHByZXNzaW9uWzJdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uOiBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdHN3aXRjaCAoYW5ub3RhdGlvbkFwcGx5RXhwcmVzc2lvbi5GdW5jdGlvbikge1xuXHRcdGNhc2UgXCJvZGF0YS5jb25jYXRcIjpcblx0XHRcdHJldHVybiBjb25jYXQoXG5cdFx0XHRcdC4uLmFubm90YXRpb25BcHBseUV4cHJlc3Npb24uQXBwbHkubWFwKChhcHBseVBhcmFtOiBhbnkpID0+IHtcblx0XHRcdFx0XHRsZXQgYXBwbHlQYXJhbUNvbnZlcnRlZCA9IGFwcGx5UGFyYW07XG5cdFx0XHRcdFx0aWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJQYXRoXCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFwcGx5UGFyYW0uJFBhdGhcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhcHBseVBhcmFtLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIklmXCIsXG5cdFx0XHRcdFx0XHRcdElmOiBhcHBseVBhcmFtLiRJZlxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiQXBwbHlcIixcblx0XHRcdFx0XHRcdFx0RnVuY3Rpb246IGFwcGx5UGFyYW0uJEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRBcHBseTogYXBwbHlQYXJhbS4kQXBwbHlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihhcHBseVBhcmFtQ29udmVydGVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0fVxufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIGZvciB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb25zIChlcXVhbCwgbm90RXF1YWwsIC4uLikuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIHRvIGFwcGx5XG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG9wZXJhdG9yXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZnVuY3Rpb24gY29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgbGVmdEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGxlZnRPcGVyYW5kKTtcblx0Y29uc3QgcmlnaHRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShyaWdodE9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24pICYmIGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdGlmIChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPT09IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChvcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIiE9PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgIT09IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPFwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPCByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIjw9XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA8PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj5cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID4gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI+PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPj0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI9PT1cIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA9PT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIkNvbXBhcmlzb25cIixcblx0XHRcdG9wZXJhdG9yOiBvcGVyYXRvcixcblx0XHRcdG9wZXJhbmQxOiBsZWZ0RXhwcmVzc2lvbixcblx0XHRcdG9wZXJhbmQyOiByaWdodEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJlcXVhbFwiICg9PT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0Ly8gKChhID09PSBjKSA9PT0gdHJ1ZSkgPT4gKGEgPT09IGMpXG5cdGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pICYmIHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiBsZWZ0RXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmIChyaWdodEV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24pICYmIGxlZnRFeHByZXNzaW9uLnZhbHVlID09PSB0cnVlKSB7XG5cdFx0Ly8gKHRydWUgPT09IChhID09PSBjKSkgPT4gKGEgPT09IGMpXG5cdFx0cmV0dXJuIHJpZ2h0RXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pICYmIHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdC8vICgoYSA9PT0gYykgPT09IGZhbHNlKSA9PiAhKGEgPT09IGMpXG5cdFx0cmV0dXJuIG5vdChsZWZ0RXhwcmVzc2lvbik7XG5cdH0gZWxzZSBpZiAobGVmdEV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vblRydWUsIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHQvLyAoaWYoeHh4eCkgeyBhYWEgfSBlbHNlIHsgYmJiIH0gKSA9PT0gYWFhIClcblx0XHRyZXR1cm4gb3IobGVmdEV4cHJlc3Npb24uY29uZGl0aW9uLCBlcXVhbChsZWZ0RXhwcmVzc2lvbi5vbkZhbHNlLCByaWdodEV4cHJlc3Npb24pKTtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uRmFsc2UsIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3Iobm90KGxlZnRFeHByZXNzaW9uLmNvbmRpdGlvbiksIGVxdWFsKGxlZnRFeHByZXNzaW9uLm9uVHJ1ZSwgcmlnaHRFeHByZXNzaW9uKSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0bGVmdEV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiZcblx0XHRpc0NvbnN0YW50KGxlZnRFeHByZXNzaW9uLm9uVHJ1ZSkgJiZcblx0XHRpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikgJiZcblx0XHRpc0NvbnN0YW50KGxlZnRFeHByZXNzaW9uLm9uRmFsc2UpICYmXG5cdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24ub25UcnVlLCByaWdodEV4cHJlc3Npb24pICYmXG5cdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24ub25GYWxzZSwgcmlnaHRFeHByZXNzaW9uKVxuXHQpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBhcmlzb24oXCI9PT1cIiwgbGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbik7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJub3QgZXF1YWxcIiAoIT09KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdEVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBsZWZ0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUobGVmdE9wZXJhbmQpO1xuXHRjb25zdCByaWdodEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKHJpZ2h0T3BlcmFuZCk7XG5cblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9XG5cblx0Ly8gKChhID09PSBjKSAhPT0gdHJ1ZSkgPT4gIShhID09PSBjKVxuXHRpZiAobGVmdEV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSAmJiByaWdodEV4cHJlc3Npb24udmFsdWUgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gbm90KGxlZnRFeHByZXNzaW9uKTtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pICYmIHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdC8vICgoYSA9PT0gYykgIT09IGZhbHNlKSA9PiAoYSA9PT0gYylcblx0XHRyZXR1cm4gbGVmdEV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAobGVmdEV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vblRydWUsIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gYW5kKG5vdChsZWZ0RXhwcmVzc2lvbi5jb25kaXRpb24pLCBub3RFcXVhbChsZWZ0RXhwcmVzc2lvbi5vbkZhbHNlLCByaWdodEV4cHJlc3Npb24pKTtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uRmFsc2UsIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gYW5kKGxlZnRFeHByZXNzaW9uLmNvbmRpdGlvbiwgbm90RXF1YWwobGVmdEV4cHJlc3Npb24ub25UcnVlLCByaWdodEV4cHJlc3Npb24pKTtcblx0fSBlbHNlIGlmIChcblx0XHRsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJlxuXHRcdGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24ub25UcnVlKSAmJlxuXHRcdGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSAmJlxuXHRcdGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24ub25GYWxzZSkgJiZcblx0XHQhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vblRydWUsIHJpZ2h0RXhwcmVzc2lvbikgJiZcblx0XHQhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vbkZhbHNlLCByaWdodEV4cHJlc3Npb24pXG5cdCkge1xuXHRcdC8vIElmIHRoZSBsZWZ0IGV4cHJlc3Npb24gaXMgYW4gaWYgZWxzZSB3aGVyZSBib3RoIG9uVHJ1ZSBhbmQgb25GYWxzZSBhcmUgbm90IGVxdWFscyB0byB0aGUgcmlnaHQgZXhwcmVzc2lvbiAtPiBzaW1wbGlmeSBhcyB0cnVlXG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBhcmlzb24oXCIhPT1cIiwgbGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbik7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJncmVhdGVyIG9yIGVxdWFsXCIgKD49KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyZWF0ZXJPckVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIj49XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZ3JlYXRlciB0aGFuXCIgKD4pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlclRoYW48VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPlwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3Mgb3IgZXF1YWxcIiAoPD0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc09yRXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPD1cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJsZXNzIHRoYW5cIiAoPCkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzVGhhbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIElmLXRoZW4tZWxzZSBleHByZXNzaW9uLlxuICpcbiAqIEV2YWx1YXRlcyB0byBvblRydWUgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZWxzZSBldmFsdWF0ZXMgdG8gb25GYWxzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZVxuICogQHBhcmFtIG9uVHJ1ZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlXG4gKiBAcGFyYW0gb25GYWxzZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZkVsc2U8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRjb25kaXRpb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPixcblx0b25UcnVlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdG9uRmFsc2U6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25kaXRpb25FeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShjb25kaXRpb24pO1xuXHRsZXQgb25UcnVlRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUob25UcnVlKTtcblx0bGV0IG9uRmFsc2VFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvbkZhbHNlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIHN3YXAgYnJhbmNoZXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhIG5lZ2F0aW9uXG5cdGlmIChjb25kaXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0Ly8gaWZFbHNlKG5vdChYKSwgYSwgYikgLS0+IGlmRWxzZShYLCBiLCBhKVxuXHRcdFtvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbl0gPSBbb25GYWxzZUV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb25dO1xuXHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbik7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IG9uVHJ1ZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGlmRWxzZShYLCBhLCBiKSwgYykgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25UcnVlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24uY29uZGl0aW9uKSkge1xuXHRcdG9uVHJ1ZUV4cHJlc3Npb24gPSBvblRydWVFeHByZXNzaW9uLm9uVHJ1ZTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25GYWxzZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGEsIGlmRWxzZShYLCBiLCBjKSkgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25GYWxzZUV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChjb25kaXRpb25FeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25GYWxzZUV4cHJlc3Npb24gPSBvbkZhbHNlRXhwcmVzc2lvbi5vbkZhbHNlO1xuXHR9XG5cblx0Ly8gaW5saW5lIG5lc3RlZCBpZi1lbHNlIGV4cHJlc3Npb25zOiBjb25kaXRpb25cblx0aWYgKGNvbmRpdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIpIHtcblx0XHRpZiAoXG5cdFx0XHRpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24ub25GYWxzZSkgJiZcblx0XHRcdCFjb25kaXRpb25FeHByZXNzaW9uLm9uRmFsc2UudmFsdWUgJiZcblx0XHRcdGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbi5vblRydWUpICYmXG5cdFx0XHRjb25kaXRpb25FeHByZXNzaW9uLm9uVHJ1ZS52YWx1ZVxuXHRcdCkge1xuXHRcdFx0Ly8gaWZFbHNlKGlmRWxzZShYLCB0cnVlLCBmYWxzZSksIGEsIGIpID09PiBpZkVsc2UoWCwgYSwgYilcblx0XHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBjb25kaXRpb25FeHByZXNzaW9uLmNvbmRpdGlvbjtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0aXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uLm9uRmFsc2UpICYmXG5cdFx0XHRjb25kaXRpb25FeHByZXNzaW9uLm9uRmFsc2UudmFsdWUgJiZcblx0XHRcdGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbi5vblRydWUpICYmXG5cdFx0XHQhY29uZGl0aW9uRXhwcmVzc2lvbi5vblRydWUudmFsdWVcblx0XHQpIHtcblx0XHRcdC8vIGlmRWxzZShpZkVsc2UoWCwgZmFsc2UsIHRydWUpLCBhLCBiKSA9PT4gaWZFbHNlKG5vdChYKSwgYSwgYilcblx0XHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbi5jb25kaXRpb24pO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24ub25UcnVlKSAmJlxuXHRcdFx0IWNvbmRpdGlvbkV4cHJlc3Npb24ub25UcnVlLnZhbHVlICYmXG5cdFx0XHQhaXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uLm9uRmFsc2UpXG5cdFx0KSB7XG5cdFx0XHQvLyBpZkVsc2UoaWZFbHNlKFgsIGZhbHNlLCBhKSwgYiwgYykgPT0+IGlmRWxzZShhbmQobm90KFgpLCBhKSwgYiwgYylcblx0XHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBhbmQobm90KGNvbmRpdGlvbkV4cHJlc3Npb24uY29uZGl0aW9uKSwgY29uZGl0aW9uRXhwcmVzc2lvbi5vbkZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvLyBhZ2FpbiBzd2FwIGJyYW5jaGVzIGlmIG5lZWRlZCAoaW4gY2FzZSBvbmUgb2YgdGhlIG9wdGltaXphdGlvbnMgYWJvdmUgbGVkIHRvIGEgbmVnYXRlZCBjb25kaXRpb24pXG5cdGlmIChjb25kaXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0Ly8gaWZFbHNlKG5vdChYKSwgYSwgYikgLS0+IGlmRWxzZShYLCBiLCBhKVxuXHRcdFtvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbl0gPSBbb25GYWxzZUV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb25dO1xuXHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbik7XG5cdH1cblxuXHQvLyBjb21wdXRlIGV4cHJlc3Npb24gcmVzdWx0IGZvciBjb25zdGFudCBjb25kaXRpb25zXG5cdGlmIChpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbkV4cHJlc3Npb24udmFsdWUgPyBvblRydWVFeHByZXNzaW9uIDogb25GYWxzZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBjb21wdXRlIGV4cHJlc3Npb24gcmVzdWx0IGlmIG9uVHJ1ZSBhbmQgb25GYWxzZSBicmFuY2hlcyBhcmUgZXF1YWxcblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9uVHJ1ZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBJZiBlaXRoZXIgdHJ1ZUV4cHJlc3Npb24gb3IgZmFsc2VFeHByZXNzaW9uIGlzIGEgdmFsdWUgZXF1YWxzIHRvIGZhbHNlIHRoZSBleHByZXNzaW9uIGNhbiBiZSBzaW1wbGlmaWVkXG5cdC8vIElmKENvbmRpdGlvbikgVGhlbiBYWFggRWxzZSBGYWxzZSAtPiBDb25kaXRpb24gJiYgWFhYXG5cdGlmIChpc0NvbnN0YW50KG9uRmFsc2VFeHByZXNzaW9uKSAmJiBvbkZhbHNlRXhwcmVzc2lvbi52YWx1ZSA9PT0gZmFsc2UpIHtcblx0XHRyZXR1cm4gYW5kKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24gYXMgRXhwcmVzc2lvbjxib29sZWFuPikgYXMgRXhwcmVzc2lvbjxUPjtcblx0fVxuXHQvLyBJZihDb25kaXRpb24pIFRoZW4gRmFsc2UgRWxzZSBYWFggLT4gIUNvbmRpdGlvbiAmJiBYWFhcblx0aWYgKGlzQ29uc3RhbnQob25UcnVlRXhwcmVzc2lvbikgJiYgb25UcnVlRXhwcmVzc2lvbi52YWx1ZSA9PT0gZmFsc2UpIHtcblx0XHRyZXR1cm4gYW5kKG5vdChjb25kaXRpb25FeHByZXNzaW9uKSwgb25GYWxzZUV4cHJlc3Npb24gYXMgRXhwcmVzc2lvbjxib29sZWFuPikgYXMgRXhwcmVzc2lvbjxUPjtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiSWZFbHNlXCIsXG5cdFx0Y29uZGl0aW9uOiBjb25kaXRpb25FeHByZXNzaW9uLFxuXHRcdG9uVHJ1ZTogb25UcnVlRXhwcmVzc2lvbixcblx0XHRvbkZhbHNlOiBvbkZhbHNlRXhwcmVzc2lvblxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBkZWZhdWx0IG1vZGVsICh1bmRlZmluZWQpLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBkZWZhdWx0IGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4pOiBib29sZWFuIHtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdHJldHVybiBleHByZXNzaW9uLm9wZXJhbmRzLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCk7XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBleHByZXNzaW9uLm1vZGVsTmFtZSA9PT0gdW5kZWZpbmVkO1xuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRyZXR1cm4gaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQxKSB8fCBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZDIpO1xuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSBcIklmRWxzZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLmNvbmRpdGlvbikgfHxcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9uVHJ1ZSkgfHxcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9uRmFsc2UpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRyZXR1cm4gaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxudHlwZSBGbjxUPiA9ICgoLi4ucGFyYW1zOiBhbnkpID0+IFQpICYge1xuXHRfX2Z1bmN0aW9uTmFtZTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBXcmFwcGVkVHVwbGVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxudHlwZSBXcmFwcGVkVHVwbGU8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBXcmFwcGVkVHVwbGU8VFtLXT4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8VFtLXT4gfTtcblxuLy8gU28sIHRoaXMgd29ya3MgYnV0IEkgY2Fubm90IGdldCBpdCB0byBjb21waWxlIDpELCBidXQgaXQgc3RpbGwgZG9lcyB3aGF0IGlzIGV4cGVjdGVkLi4uXG5cbi8qKlxuICogQSBmdW5jdGlvbiByZWZlcmVuY2Ugb3IgYSBmdW5jdGlvbiBuYW1lLlxuICovXG50eXBlIEZ1bmN0aW9uT3JOYW1lPFQ+ID0gRm48VD4gfCBzdHJpbmc7XG5cbi8qKlxuICogRnVuY3Rpb24gcGFyYW1ldGVycywgZWl0aGVyIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24gb3IgYW4gdW50eXBlZCBhcnJheS5cbiAqL1xudHlwZSBGdW5jdGlvblBhcmFtZXRlcnM8VCwgRiBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+PiA9IEYgZXh0ZW5kcyBGbjxUPiA/IFBhcmFtZXRlcnM8Rj4gOiBhbnlbXTtcblxuLyoqXG4gKiBDYWxscyBhIGZvcm1hdHRlciBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBwYXJhbWV0ZXJzLlxuICogSWYgcmVxdWlyZUNvbnRleHQgaXMgc2V0IHRvIHRydWUgYW5kIG5vIGNvbnRleHQgaXMgcGFzc2VkIGEgZGVmYXVsdCBjb250ZXh0IHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBsaXN0IG9mIHBhcmFtZXRlciB0aGF0IHNob3VsZCBtYXRjaCB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBmb3JtYXR0ZXJGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gY2FsbFxuICogQHBhcmFtIFtjb250ZXh0RW50aXR5VHlwZV0gVGhlIGNvbnRleHQgZW50aXR5IHR5cGUgdG8gY29uc2lkZXJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZXN1bHQ8VCwgVSBleHRlbmRzIEZuPFQ+Pihcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPFBhcmFtZXRlcnM8VT4+LFxuXHRmb3JtYXR0ZXJGdW5jdGlvbjogVSxcblx0Y29udGV4dEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgcGFyYW1ldGVyRXhwcmVzc2lvbnMgPSAocGFyYW1ldGVycyBhcyBhbnlbXSkubWFwKHdyYXBQcmltaXRpdmUpO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5wYXJhbWV0ZXJFeHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKCEhY29udGV4dEVudGl0eVR5cGUpIHtcblx0XHQvLyBPdGhlcndpc2UsIGlmIHRoZSBjb250ZXh0IGlzIHJlcXVpcmVkIGFuZCBubyBjb250ZXh0IGlzIHByb3ZpZGVkIG1ha2Ugc3VyZSB0byBhZGQgdGhlIGRlZmF1bHQgYmluZGluZ1xuXHRcdGlmICghcGFyYW1ldGVyRXhwcmVzc2lvbnMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KSkge1xuXHRcdFx0Y29udGV4dEVudGl0eVR5cGUua2V5cy5mb3JFYWNoKGtleSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEZvcm1hdHRlck5hbWUgY2FuIGJlIG9mIGZvcm1hdCBzYXAuZmUuY29yZS54eHgjbWV0aG9kTmFtZSB0byBoYXZlIG11bHRpcGxlIGZvcm1hdHRlciBpbiBvbmUgY2xhc3Ncblx0Y29uc3QgW2Zvcm1hdHRlckNsYXNzLCBmb3JtYXR0ZXJOYW1lXSA9IGZvcm1hdHRlckZ1bmN0aW9uLl9fZnVuY3Rpb25OYW1lLnNwbGl0KFwiI1wiKTtcblxuXHRpZiAoISFmb3JtYXR0ZXJOYW1lICYmIGZvcm1hdHRlck5hbWUubGVuZ3RoID4gMCkge1xuXHRcdHBhcmFtZXRlckV4cHJlc3Npb25zLnVuc2hpZnQoY29uc3RhbnQoZm9ybWF0dGVyTmFtZSkpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGb3JtYXR0ZXJcIixcblx0XHRmbjogZm9ybWF0dGVyQ2xhc3MsXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGNvbXBsZXggdHlwZSAgdG8gcHJvY2VzcyB0aGUgcGFyYW1ldGVycy5cbiAqIElmIHJlcXVpcmVDb250ZXh0IGlzIHNldCB0byB0cnVlIGFuZCBubyBjb250ZXh0IGlzIHBhc3NlZCBhIGRlZmF1bHQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbGlzdCBvZiBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIHR5cGUgZm9yIHRoZSBjb21wcGxleCB0eXBlXG4gKiBAcGFyYW0gdHlwZSBUaGUgY29tcGxleCB0eXBlIHRvIHVzZVxuICogQHBhcmFtIFtjb250ZXh0RW50aXR5VHlwZV0gVGhlIGNvbnRleHQgZW50aXR5IHR5cGUgdG8gY29uc2lkZXJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUeXBlSW5mb3JtYXRpb248VCwgVSBleHRlbmRzIEZuPFQ+Pihcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPFBhcmFtZXRlcnM8VT4+LFxuXHR0eXBlOiBzdHJpbmcsXG5cdGNvbnRleHRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IHBhcmFtZXRlckV4cHJlc3Npb25zID0gKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLnBhcmFtZXRlckV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHQvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJhbWV0ZXIgYW5kIGl0IGlzIGEgY29uc3RhbnQgYW5kIHdlIGRvbid0IGV4cGVjdCB0aGUgY29udGV4dCB0aGVuIHJldHVybiB0aGUgY29uc3RhbnRcblx0aWYgKHBhcmFtZXRlckV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSAmJiBpc0NvbnN0YW50KHBhcmFtZXRlckV4cHJlc3Npb25zWzBdKSAmJiAhY29udGV4dEVudGl0eVR5cGUpIHtcblx0XHRyZXR1cm4gcGFyYW1ldGVyRXhwcmVzc2lvbnNbMF07XG5cdH0gZWxzZSBpZiAoISFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdC8vIE90aGVyd2lzZSwgaWYgdGhlIGNvbnRleHQgaXMgcmVxdWlyZWQgYW5kIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgbWFrZSBzdXJlIHRvIGFkZCB0aGUgZGVmYXVsdCBiaW5kaW5nXG5cdFx0aWYgKCFwYXJhbWV0ZXJFeHByZXNzaW9ucy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpKSB7XG5cdFx0XHRjb250ZXh0RW50aXR5VHlwZS5rZXlzLmZvckVhY2goa2V5ID0+IHBhcmFtZXRlckV4cHJlc3Npb25zLnB1c2goYmluZGluZ0V4cHJlc3Npb24oa2V5Lm5hbWUsIFwiXCIpKSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb0Zvcm1hdE9wdGlvbnMgPVxuXHRcdChwYXJhbWV0ZXJzWzBdIGFzIGFueSk/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgPyB7IHBhcnNlQXNTdHJpbmc6IGZhbHNlLCBlbXB0eVN0cmluZzogXCJcIiB9IDoge307XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIixcblx0XHR0eXBlOiB0eXBlLFxuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zLFxuXHRcdHBhcmFtZXRlcnM6IHt9LFxuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJFeHByZXNzaW9uc1xuXHR9O1xufVxuLyoqXG4gKiBGdW5jdGlvbiBjYWxsLCBvcHRpb25hbGx5IHdpdGggYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBmbiBGdW5jdGlvbiBuYW1lIG9yIHJlZmVyZW5jZSB0byBmdW5jdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJndW1lbnRzXG4gKiBAcGFyYW0gb24gT2JqZWN0IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIG9uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb25FeHByZXNzaW9uPFQ+fSBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gY2FsbCAobm90IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwhKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm48VCwgVSBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+Pihcblx0Zm46IFUsXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxGdW5jdGlvblBhcmFtZXRlcnM8VCwgVT4+LFxuXHRvbj86IEV4cHJlc3Npb25PclByaW1pdGl2ZTxvYmplY3Q+XG4pOiBGdW5jdGlvbkV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlb2YgZm4gPT09IFwic3RyaW5nXCIgPyBmbiA6IChmbiBhcyBGbjxUPikuX19mdW5jdGlvbk5hbWU7XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiRnVuY3Rpb25cIixcblx0XHRvYmo6IG9uICE9PSB1bmRlZmluZWQgPyB3cmFwUHJpbWl0aXZlKG9uKSA6IHVuZGVmaW5lZCxcblx0XHRmbjogZnVuY3Rpb25OYW1lLFxuXHRcdHBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSlcblx0fTtcbn1cblxuLyoqXG4gKiBTaG9ydGN1dCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBiaW5kaW5nIHZhbHVlIGlzIG51bGwsIHVuZGVmaW5lZCBvciBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvblxuICogQHJldHVybnMgQSBib29sZWFuIGV4cHJlc3Npb24gZXZhbHVhdGluZyB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgZW1wdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxzdHJpbmc+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIkNvbmNhdFwiKSB7XG5cdFx0cmV0dXJuIG9yKC4uLmV4cHJlc3Npb24uZXhwcmVzc2lvbnMubWFwKGlzRW1wdHkpKTtcblx0fVxuXHRyZXR1cm4gb3IoZXF1YWwoZXhwcmVzc2lvbiwgXCJcIiksIGVxdWFsKGV4cHJlc3Npb24sIHVuZGVmaW5lZCksIGVxdWFsKGV4cHJlc3Npb24sIG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdCguLi5pbkV4cHJlc3Npb25zOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPltdKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgZXhwcmVzc2lvbnMgPSBpbkV4cHJlc3Npb25zLm1hcCh3cmFwUHJpbWl0aXZlKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoZXhwcmVzc2lvbnMuZXZlcnkoaXNDb25zdGFudCkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoXG5cdFx0XHRleHByZXNzaW9ucy5yZWR1Y2UoKGNvbmNhdGVuYXRlZDogc3RyaW5nLCB2YWx1ZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gY29uY2F0ZW5hdGVkICsgKHZhbHVlIGFzIENvbnN0YW50RXhwcmVzc2lvbjxhbnk+KS52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0fSwgXCJcIilcblx0XHQpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiQ29uY2F0XCIsXG5cdFx0ZXhwcmVzc2lvbnM6IGV4cHJlc3Npb25zXG5cdH07XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybUZ1bmN0aW9uID0gPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oZXhwcmVzc2lvblBhcnQ6IGFueSkgPT4gRXhwcmVzc2lvbjxUPjtcbmV4cG9ydCB0eXBlIEV4cHJlc3Npb25UeXBlID0gUGljazxFeHByZXNzaW9uPGFueT4sIFwiX3R5cGVcIj5bXCJfdHlwZVwiXTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1SZWN1cnNpdmVseTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSB8IHVua25vd24+KFxuXHRpbkV4cHJlc3Npb246IEV4cHJlc3Npb248VD4sXG5cdGV4cHJlc3Npb25UeXBlOiBFeHByZXNzaW9uVHlwZSxcblx0dHJhbnNmb3JtRnVuY3Rpb246IFRyYW5zZm9ybUZ1bmN0aW9uLFxuXHRpbmNsdWRlQWxsRXhwcmVzc2lvbjogYm9vbGVhbiA9IGZhbHNlXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0bGV0IGV4cHJlc3Npb24gPSBpbkV4cHJlc3Npb247XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGNhc2UgXCJGdW5jdGlvblwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcChleHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5leHByZXNzaW9ucyA9IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubWFwKGV4cHJlc3Npb24gPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMgPSBleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzLm1hcChleHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcChleHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRjb25zdCBvblRydWUgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uVHJ1ZSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRjb25zdCBvbkZhbHNlID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vbkZhbHNlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGxldCBjb25kaXRpb24gPSBleHByZXNzaW9uLmNvbmRpdGlvbjtcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRjb25kaXRpb24gPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLmNvbmRpdGlvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHR9XG5cdFx0XHRleHByZXNzaW9uID0gaWZFbHNlKGNvbmRpdGlvbiwgb25UcnVlLCBvbkZhbHNlKSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9wZXJhbmQsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0XHRleHByZXNzaW9uID0gbm90KG9wZXJhbmQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0ZXhwcmVzc2lvbi5vcGVyYW5kcyA9IGV4cHJlc3Npb24ub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT5cblx0XHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRjb25zdCBvcGVyYW5kMSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZDEsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0XHRjb25zdCBvcGVyYW5kMiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZDIsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0XHRleHByZXNzaW9uID0gY29tcGFyaXNvbihleHByZXNzaW9uLm9wZXJhdG9yLCBvcGVyYW5kMSwgb3BlcmFuZDIpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChleHByZXNzaW9uVHlwZSA9PT0gZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGV4cHJlc3Npb24gPSB0cmFuc2Zvcm1GdW5jdGlvbihpbkV4cHJlc3Npb24pO1xuXHR9XG5cdHJldHVybiBleHByZXNzaW9uO1xufVxuXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IFQgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG5lZWRQYXJlbnRoZXNpcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBib29sZWFuIHtcblx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHIpICYmICFpc0JpbmRpbmcoZXhwcikgJiYgaXNFeHByZXNzaW9uKGV4cHIpICYmIGV4cHIuX3R5cGUgIT09IFwiSWZFbHNlXCIgJiYgZXhwci5fdHlwZSAhPT0gXCJGdW5jdGlvblwiO1xufTtcbi8qKlxuICogQ29tcGlsZSBhbiBleHByZXNzaW9uIGludG8gYW4gZXhwcmVzc2lvbiBiaW5kaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZVxuICogQHBhcmFtIGVtYmVkZGVkSW5CaW5kaW5nIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgZXhwcmVzc2lvblxuICogQHBhcmFtIGtlZXBUYXJnZXRUeXBlIEtlZXAgdGhlIHRhcmdldCB0eXBlIG9mIHRoZSBlbWJlZGRlZCBiaW5kaW5ncyBpbnN0ZWFkIG9mIGNhc3RpbmcgdGhlbSB0byBhbnlcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvbiBiaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlQmluZGluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGV4cHJlc3Npb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0ZW1iZWRkZWRJbkJpbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcblx0a2VlcFRhcmdldFR5cGU6IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGV4cHIgPSB3cmFwUHJpbWl0aXZlKGV4cHJlc3Npb24pO1xuXHRjb25zdCBlbWJlZGRlZFNlcGFyYXRvciA9IGtlZXBUYXJnZXRUeXBlID8gXCIkXCIgOiBcIiVcIjtcblx0bGV0IG91dFByb3BlcnR5ID0gXCJcIjtcblx0c3dpdGNoIChleHByLl90eXBlKSB7XG5cdFx0Y2FzZSBcIlVucmVzb2x2ZWFibGVcIjpcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0XHRpZiAoZXhwci52YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhwci52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBcInVuZGVmaW5lZFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBleHByLnZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGV4cHIudmFsdWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZW50cmllcyA9IGV4cHIudmFsdWUubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSkpO1xuXHRcdFx0XHRcdHJldHVybiBgWyR7ZW50cmllcy5qb2luKFwiLCBcIil9XWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gT2JqZWN0c1xuXHRcdFx0XHRcdGNvbnN0IG8gPSBleHByLnZhbHVlIGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdDtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMobykubWFwKGtleSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG9ba2V5XTtcblx0XHRcdFx0XHRcdHJldHVybiBgJHtrZXl9OiAke2NvbXBpbGVCaW5kaW5nKHZhbHVlLCB0cnVlKX1gO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBgeyR7cHJvcGVydGllcy5qb2luKFwiLCBcIil9fWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHN3aXRjaCAodHlwZW9mIGV4cHIudmFsdWUpIHtcblx0XHRcdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRcdFx0Y2FzZSBcImJpZ2ludFwiOlxuXHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0XHRcdHJldHVybiBgJyR7ZXNjYXBlWG1sQXR0cmlidXRlKGV4cHIudmFsdWUudG9TdHJpbmcoKSl9J2A7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdFx0cmV0dXJuIGV4cHIucmVmIHx8IFwibnVsbFwiO1xuXG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRjb25zdCBhcmd1bWVudFN0cmluZyA9IGAke2V4cHIucGFyYW1ldGVycy5tYXAoYXJnID0+IGNvbXBpbGVCaW5kaW5nKGFyZywgdHJ1ZSkpLmpvaW4oXCIsIFwiKX1gO1xuXHRcdFx0cmV0dXJuIGV4cHIub2JqID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyBgJHtleHByLmZufSgke2FyZ3VtZW50U3RyaW5nfSlgXG5cdFx0XHRcdDogYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5vYmosIHRydWUpfS4ke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWA7XG5cdFx0Y2FzZSBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIjpcblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gYCgke2V4cHIudmFsdWUuc3Vic3RyKDIsIGV4cHIudmFsdWUubGVuZ3RoIC0gMyl9KWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYCR7ZXhwci52YWx1ZX1gO1xuXHRcdFx0fVxuXHRcdGNhc2UgXCJFbWJlZGRlZEJpbmRpbmdcIjpcblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9JHtleHByLnZhbHVlfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYCR7ZXhwci52YWx1ZX1gO1xuXHRcdFx0fVxuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRpZiAoZXhwci50eXBlIHx8IGV4cHIucGFyYW1ldGVycyB8fCBleHByLnRhcmdldFR5cGUpIHtcblx0XHRcdFx0bGV0IG91dEJpbmRpbmcgPSBcIlwiO1xuXHRcdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAke2VtYmVkZGVkU2VwYXJhdG9yfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0QmluZGluZyArPSBge3BhdGg6JyR7ZXhwci5tb2RlbE5hbWUgPyBgJHtleHByLm1vZGVsTmFtZX0+YCA6IFwiXCJ9JHtleHByLnBhdGh9J2A7XG5cdFx0XHRcdGlmIChleHByLnR5cGUpIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAsIHR5cGU6ICcke2V4cHIudHlwZX0nYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhwci5jb25zdHJhaW50cyAmJiBPYmplY3Qua2V5cyhleHByLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b3V0QmluZGluZyArPSBgLCBjb25zdHJhaW50czogJHtjb21waWxlQmluZGluZyhleHByLmNvbnN0cmFpbnRzKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleHByLmZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAsIGZvcm1hdE9wdGlvbnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwci5mb3JtYXRPcHRpb25zKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleHByLnBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMoZXhwci5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b3V0QmluZGluZyArPSBgLCBwYXJhbWV0ZXJzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHIucGFyYW1ldGVycyl9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhwci50YXJnZXRUeXBlKSB7XG5cdFx0XHRcdFx0b3V0QmluZGluZyArPSBgLCB0YXJnZXRUeXBlOiAnJHtleHByLnRhcmdldFR5cGV9J2A7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0QmluZGluZyArPSBcIn1cIjtcblx0XHRcdFx0cmV0dXJuIG91dEJpbmRpbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9eyR7ZXhwci5tb2RlbE5hbWUgPyBgJHtleHByLm1vZGVsTmFtZX0+YCA6IFwiXCJ9JHtleHByLnBhdGh9fWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGB7JHtleHByLm1vZGVsTmFtZSA/IGAke2V4cHIubW9kZWxOYW1lfT5gIDogXCJcIn0ke2V4cHIucGF0aH19YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdGNvbnN0IGlzT3BlcmFuZDFDb21wbGV4ID0gbmVlZFBhcmVudGhlc2lzKGV4cHIub3BlcmFuZDEpO1xuXHRcdFx0Y29uc3QgaXNPcGVyYW5kMkNvbXBsZXggPSBuZWVkUGFyZW50aGVzaXMoZXhwci5vcGVyYW5kMik7XG5cdFx0XHRsZXQgY29tcGFyaXNvblBhcnQgPSBcIlwiO1xuXHRcdFx0aWYgKGlzT3BlcmFuZDFDb21wbGV4KSB7XG5cdFx0XHRcdGNvbXBhcmlzb25QYXJ0ICs9IFwiKFwiO1xuXHRcdFx0fVxuXHRcdFx0Y29tcGFyaXNvblBhcnQgKz0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kMSwgdHJ1ZSl9YDtcblx0XHRcdGlmIChpc09wZXJhbmQxQ29tcGxleCkge1xuXHRcdFx0XHRjb21wYXJpc29uUGFydCArPSBcIilcIjtcblx0XHRcdH1cblx0XHRcdGNvbXBhcmlzb25QYXJ0ICs9IGAgJHtleHByLm9wZXJhdG9yfSBgO1xuXHRcdFx0aWYgKGlzT3BlcmFuZDJDb21wbGV4KSB7XG5cdFx0XHRcdGNvbXBhcmlzb25QYXJ0ICs9IFwiKFwiO1xuXHRcdFx0fVxuXHRcdFx0Y29tcGFyaXNvblBhcnQgKz0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kMiwgdHJ1ZSl9YDtcblx0XHRcdGlmIChpc09wZXJhbmQyQ29tcGxleCkge1xuXHRcdFx0XHRjb21wYXJpc29uUGFydCArPSBcIilcIjtcblx0XHRcdH1cblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gY29tcGFyaXNvblBhcnQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYHs9ICR7Y29tcGFyaXNvblBhcnR9fWA7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGAoJHtjb21waWxlQmluZGluZyhleHByLmNvbmRpdGlvbiwgdHJ1ZSl9ID8gJHtjb21waWxlQmluZGluZyhleHByLm9uVHJ1ZSwgdHJ1ZSl9IDogJHtjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRleHByLm9uRmFsc2UsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpfSlgO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGB7PSAke2NvbXBpbGVCaW5kaW5nKGV4cHIuY29uZGl0aW9uLCB0cnVlKX0gPyAke2NvbXBpbGVCaW5kaW5nKGV4cHIub25UcnVlLCB0cnVlKX0gOiAke2NvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdGV4cHIub25GYWxzZSxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCl9fWA7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGAoJHtleHByLm9wZXJhbmRzLm1hcChleHByZXNzaW9uID0+IGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24sIHRydWUpKS5qb2luKGAgJHtleHByLm9wZXJhdG9yfSBgKX0pYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgez0gKCR7ZXhwci5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PiBjb21waWxlQmluZGluZyhleHByZXNzaW9uLCB0cnVlKSkuam9pbihgICR7ZXhwci5vcGVyYXRvcn0gYCl9KX1gO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiBgJHtleHByLmV4cHJlc3Npb25zLm1hcChleHByZXNzaW9uID0+IGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24sIHRydWUsIHRydWUpKS5qb2luKGAgKyBgKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGB7PSAke2V4cHIuZXhwcmVzc2lvbnMubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSwgdHJ1ZSkpLmpvaW4oYCArIGApfSB9YDtcblx0XHRcdH1cblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gYCEke2NvbXBpbGVCaW5kaW5nKGV4cHIub3BlcmFuZCwgdHJ1ZSl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgez0gISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX19YDtcblx0XHRcdH1cblxuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gYCEhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYHs9ICEhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfX1gO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0aWYgKGV4cHIucGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0b3V0UHJvcGVydHkgKz0gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHIucGFyYW1ldGVyc1swXSwgdHJ1ZSl9LCBmb3JtYXR0ZXI6ICcke2V4cHIuZm59J31gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0UHJvcGVydHkgKz0gYHtwYXJ0czpbJHtleHByLnBhcmFtZXRlcnMubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpLmpvaW4oXCIsXCIpfV0sIGZvcm1hdHRlcjogJyR7XG5cdFx0XHRcdFx0ZXhwci5mblxuXHRcdFx0XHR9J31gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdG91dFByb3BlcnR5ID0gYFxcJCR7b3V0UHJvcGVydHl9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXRQcm9wZXJ0eTtcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGlmIChleHByLmJpbmRpbmdQYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvdXRQcm9wZXJ0eSArPSBgeyR7Y29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwci5iaW5kaW5nUGFyYW1ldGVyc1swXSwgdHJ1ZSl9LCB0eXBlOiAnJHtleHByLnR5cGV9J31gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IG91dHB1dEVuZDtcblx0XHRcdFx0Ly8gdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHNhcC51aS5tb2RlbC5vZGF0YS52NC5fQW5ub3RhdGlvbkhlbHBlckV4cHJlc3Npb24uZmV0Y2hDdXJyZW5jeU9yVW5pdFxuXHRcdFx0XHRzd2l0Y2ggKGV4cHIudHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCI6XG5cdFx0XHRcdFx0XHRvdXRwdXRFbmQgPSBgLHttb2RlOidPbmVUaW1lJyxwYXRoOicvIyNAQHJlcXVlc3RVbml0c09mTWVhc3VyZScsdGFyZ2V0VHlwZTonYW55J31dLHR5cGU6J3NhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXQnYDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiOlxuXHRcdFx0XHRcdFx0b3V0cHV0RW5kID0gYCx7bW9kZTonT25lVGltZScscGF0aDonLyMjQEByZXF1ZXN0Q3VycmVuY3lDb2RlcycsdGFyZ2V0VHlwZTonYW55J31dLHR5cGU6J3NhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5J2A7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0b3V0cHV0RW5kID0gYF0sIHR5cGU6ICcke2V4cHIudHlwZX0nYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhwci5mb3JtYXRPcHRpb25zICYmIE9iamVjdC5rZXlzKGV4cHIuZm9ybWF0T3B0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG91dHB1dEVuZCArPSBgLCBmb3JtYXRPcHRpb25zOiAke2NvbXBpbGVCaW5kaW5nKGV4cHIuZm9ybWF0T3B0aW9ucyl9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhwci5wYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKGV4cHIucGFyYW1ldGVycykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG91dHB1dEVuZCArPSBgLCBwYXJhbWV0ZXJzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHIucGFyYW1ldGVycyl9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRwdXRFbmQgKz0gXCJ9XCI7XG5cdFx0XHRcdG91dFByb3BlcnR5ICs9IGB7bW9kZTonVHdvV2F5JywgcGFydHM6WyR7ZXhwci5iaW5kaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHRcdC5tYXAoKHBhcmFtOiBhbnkpID0+IGNvbXBpbGVQYXRoUGFyYW1ldGVyKHBhcmFtKSlcblx0XHRcdFx0XHQuam9pbihcIixcIil9JHtvdXRwdXRFbmR9YDtcblx0XHRcdH1cblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRvdXRQcm9wZXJ0eSA9IGBcXCQke291dFByb3BlcnR5fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0UHJvcGVydHk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlwiO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSB0aGUgcGF0aCBwYXJhbWV0ZXIgb2YgYSBmb3JtYXR0ZXIgY2FsbC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgYmluZGluZyBwYXJ0IHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gc2luZ2xlUGF0aCBXaGV0aGVyIHRoZXJlIGlzIG9uZSBvciBtdWx0aXBsZSBwYXRoIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHNuaXBwZXQgdG8gaW5jbHVkZSBpbiB0aGUgb3ZlcmFsbCBiaW5kaW5nIGRlZmluaXRpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+LCBzaW5nbGVQYXRoOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgb3V0VmFsdWUgPSBcIlwiO1xuXHRzd2l0Y2ggKGV4cHJlc3Npb24uX3R5cGUpIHtcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdHN3aXRjaCAodHlwZW9mIGV4cHJlc3Npb24udmFsdWUpIHtcblx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRcdFx0b3V0VmFsdWUgPSBgdmFsdWU6ICR7ZXhwcmVzc2lvbi52YWx1ZS50b1N0cmluZygpfWA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0XHRvdXRWYWx1ZSA9IGB2YWx1ZTogJyR7ZXNjYXBlWG1sQXR0cmlidXRlKGV4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKSl9J2A7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0b3V0VmFsdWUgPSBgdmFsdWU6ICcke2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKX0nYDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRvdXRWYWx1ZSA9IFwidmFsdWU6ICcnXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2luZ2xlUGF0aCkge1xuXHRcdFx0XHRyZXR1cm4gb3V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYHske291dFZhbHVlfX1gO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdG91dFZhbHVlID0gYHBhdGg6JyR7ZXhwcmVzc2lvbi5tb2RlbE5hbWUgPyBgJHtleHByZXNzaW9uLm1vZGVsTmFtZX0+YCA6IFwiXCJ9JHtleHByZXNzaW9uLnBhdGh9J2A7XG5cblx0XHRcdGlmIChleHByZXNzaW9uLnR5cGUpIHtcblx0XHRcdFx0b3V0VmFsdWUgKz0gYCwgdHlwZSA6ICcke2V4cHJlc3Npb24udHlwZX0nYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dFZhbHVlICs9IGAsIHRhcmdldFR5cGUgOiAnYW55J2A7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhwcmVzc2lvbi5jb25zdHJhaW50cyAmJiBPYmplY3Qua2V5cyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG91dFZhbHVlICs9IGAsIGNvbnN0cmFpbnRzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24uY29uc3RyYWludHMpfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zICYmIE9iamVjdC5rZXlzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvdXRWYWx1ZSArPSBgLCBmb3JtYXRPcHRpb25zOiAke2NvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyl9YDtcblx0XHRcdH1cblx0XHRcdGlmIChleHByZXNzaW9uLnBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG91dFZhbHVlICs9IGAsIHBhcmFtZXRlcnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpbmdsZVBhdGgpIHtcblx0XHRcdFx0cmV0dXJuIG91dFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGB7JHtvdXRWYWx1ZX19YDtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdH1cbn1cbiJdfQ==
1729
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiZmluZCIsImV4cHIiLCJ1bmRlZmluZWQiLCJfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsIiwiYSIsImIiLCJ2YWx1ZSIsIm9wZXJhbmQiLCJvcGVyYXRvciIsIm9wZXJhbmRzIiwibGVuZ3RoIiwiZXZlcnkiLCJleHByZXNzaW9uIiwic29tZSIsIm90aGVyRXhwcmVzc2lvbiIsImNvbmRpdGlvbiIsIm9uVHJ1ZSIsIm9uRmFsc2UiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwiYUV4cHJlc3Npb25zIiwiYkV4cHJlc3Npb25zIiwiaW5kZXgiLCJiaW5kaW5nRXhwcmVzc2lvbiIsIm1vZGVsTmFtZSIsInBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJmbiIsInBhcmFtZXRlcnMiLCJ0eXBlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJvdGhlckZ1bmN0aW9uIiwib2JqIiwicmVmIiwiZmxhdHRlblNldEV4cHJlc3Npb24iLCJyZWR1Y2UiLCJyZXN1bHQiLCJjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyIsImZvckVhY2giLCJjYW5kaWRhdGUiLCJlIiwicHVzaCIsImhhc09wcG9zaXRlRXhwcmVzc2lvbnMiLCJuZWdhdGVkRXhwcmVzc2lvbnMiLCJtYXAiLCJub3QiLCJpIiwiYW5kIiwid3JhcFByaW1pdGl2ZSIsImlzU3RhdGljRmFsc2UiLCJub25Ucml2aWFsRXhwcmVzc2lvbiIsImZpbHRlciIsImlzRmFsc2UiLCJpc0NvbnN0YW50IiwiY29uc3RhbnQiLCJpc1ZhbGlkIiwiaXNUcnVlIiwib3IiLCJpc1N0YXRpY1RydWUiLCJpc0NvbXBhcmlzb24iLCJpc1RydXRoeSIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsIk9iamVjdCIsImVudHJpZXMiLCJwbGFpbkV4cHJlc3Npb24iLCJrZXkiLCJ2YWwiLCJ3cmFwcGVkVmFsdWUiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwicmVmZXJlbmNlIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25WYWx1ZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiZXF1YWwiLCJFcSIsIm5vdEVxdWFsIiwiTmUiLCJncmVhdGVyVGhhbiIsIkd0IiwiZ3JlYXRlck9yRXF1YWwiLCJHZSIsImxlc3NUaGFuIiwiTHQiLCJsZXNzT3JFcXVhbCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlFeHByZXNzaW9uIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImxlZnQiLCJyaWdodCIsInJlZHVjZWQiLCJjb25kaXRpb25FeHByZXNzaW9uIiwib25UcnVlRXhwcmVzc2lvbiIsIm9uRmFsc2VFeHByZXNzaW9uIiwiaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCIsImZvcm1hdFJlc3VsdCIsImZvcm1hdHRlckZ1bmN0aW9uIiwiY29udGV4dEVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFeHByZXNzaW9ucyIsImtleXMiLCJfX2Z1bmN0aW9uTmFtZSIsInNwbGl0IiwiZm9ybWF0dGVyQ2xhc3MiLCJmb3JtYXR0ZXJOYW1lIiwidW5zaGlmdCIsImFkZFR5cGVJbmZvcm1hdGlvbiIsIm9Gb3JtYXRPcHRpb25zIiwiaW5kZXhPZiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsImZvcm1hdE9wdGlvbnMiLCJmdW5jIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJwYXJhbWV0ZXIiLCJzdWJFeHByZXNzaW9uIiwiYmluZGluZ1BhcmFtZXRlciIsIm5lZWRQYXJlbnRoZXNpcyIsImNvbXBpbGVDb25zdGFudE9iamVjdCIsImlzTnVsbGFibGUiLCJvIiwicHJvcGVydGllcyIsImNoaWxkUmVzdWx0IiwiY29tcGlsZUJpbmRpbmciLCJjb21waWxlQ29uc3RhbnQiLCJlbWJlZGRlZEluQmluZGluZyIsImNvbXBpbGVCaW5kaW5nRm9yQmluZGluZyIsImV4cHJlc3Npb25Gb3JCaW5kaW5nIiwiZW1iZWRkZWRTZXBhcmF0b3IiLCJjb25zdHJhaW50cyIsImNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiIsImNvbXBpbGVCaW5kaW5nUGF0aCIsIm91dEJpbmRpbmciLCJjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uIiwiY29tcGlsZVBhdGhQYXJhbWV0ZXIiLCJvdXRwdXRFbmQiLCJoYXNFbGVtZW50cyIsInBhcmFtIiwid3JhcEJpbmRpbmdFeHByZXNzaW9uIiwicGFyZW50aGVzaXNSZXF1aXJlZCIsImtlZXBUYXJnZXRUeXBlIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJjb21wYXJpc29uRXhwcmVzc2lvbiIsImNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbiIsImlmRWxzZUV4cHJlc3Npb24iLCJzZXRFeHByZXNzaW9uIiwiY29uY2F0RXhwcmVzc2lvbiIsIm5lc3RlZEV4cHJlc3Npb24iLCJsZW5ndGhFeHByZXNzaW9uIiwibm90RXhwcmVzc2lvbiIsInRydXRoeUV4cHJlc3Npb24iLCJmb3JtYXR0ZXJFeHByZXNzaW9uIiwiY29tcGlsZUZvcm1hdHRlckV4cHJlc3Npb24iLCJjb21wbGV4VHlwZUV4cHJlc3Npb24iLCJjb21waWxlT3BlcmFuZCIsImNvbXBpbGVkT3BlcmFuZCIsInBhcnRzIiwic2luZ2xlUGF0aCIsIm91dFZhbHVlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnTE8sTUFBTUEsdUJBQXVELEdBQUc7QUFDdEVDLElBQUFBLEtBQUssRUFBRTtBQUQrRCxHQUFoRTs7O0FBSVAsV0FBU0Msa0JBQVQsQ0FBNEJDLFdBQTVCLEVBQWlEO0FBQ2hELFdBQU9BLFdBQVcsQ0FBQ0MsT0FBWixDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFQO0FBQ0E7O0FBRU0sV0FBU0MsMEJBQVQsR0FBZ0Y7QUFBQSxzQ0FBekNDLFdBQXlDO0FBQXpDQSxNQUFBQSxXQUF5QztBQUFBOztBQUN0RixXQUFPQSxXQUFXLENBQUNDLElBQVosQ0FBaUIsVUFBQUMsSUFBSTtBQUFB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QXFCckMsY0FBYyxDQUFDOUssVUFBVSxDQUFDZ0IsVUFBWixDQUFuQyxDQUFSO0FBQ0E7QUFDRCxLQWRNLE1BY0E7QUFDTixhQUFPLEVBQVA7QUFDQTs7QUFDRCxXQUFPa00sVUFBVSxHQUFHQyxRQUFILGNBQWtCQSxRQUFsQixNQUFqQjtBQUNBOztBQUVELFdBQVN4QixXQUFULENBQXFCdkssR0FBckIsRUFBK0I7QUFDOUIsV0FBT0EsR0FBRyxJQUFJd0MsTUFBTSxDQUFDaUYsSUFBUCxDQUFZekgsR0FBWixFQUFpQnRCLE1BQWpCLEdBQTBCLENBQXhDO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVN3TCxrQkFBVCxDQUFxRHRMLFVBQXJELEVBQXlJO0FBQ3hJLHFCQUFVQSxVQUFVLENBQUNZLFNBQVgsR0FBdUJaLFVBQVUsQ0FBQ1ksU0FBWCxHQUF1QixHQUE5QyxHQUFvRCxFQUE5RCxTQUFtRVosVUFBVSxDQUFDYSxJQUE5RTtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aENvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFByb3BlcnR5QW5ub3RhdGlvblZhbHVlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogRXhwcmVzc2lvbjxib29sZWFuPltdO1xufTtcblxuZXhwb3J0IHR5cGUgTm90RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJOb3RcIjtcblx0b3BlcmFuZDogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRydXRoeUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiVHJ1dGh5XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIjtcblx0dHlwZTogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zOiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM6IG9iamVjdDtcblx0YmluZGluZ1BhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEV4cHJlc3Npb248b2JqZWN0Pjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb25jYXRFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiQ29uY2F0XCI7XG5cdGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIExlbmd0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJMZW5ndGhcIjtcblx0YmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiVW5yZXNvbHZlYWJsZVwiO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkJpbmRpbmdcIjtcblx0bW9kZWxOYW1lPzogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldDtcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBhbnk7XG5cdHBhcmFtZXRlcnM/OiBhbnk7XG5cdHRhcmdldFR5cGU/OiBzdHJpbmc7XG5cdGZvcm1hdE9wdGlvbnM/OiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkRlZmF1bHRCaW5kaW5nXCI7XG5cdG1vZGVsTmFtZT86IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IG9iamVjdDtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRW1iZWRkZWRCaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPT09XCIgfCBcIiE9PVwiIHwgXCI+PVwiIHwgXCI+XCIgfCBcIjw9XCIgfCBcIjxcIjtcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25FeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIkNvbXBhcmlzb25cIjtcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcjtcblx0b3BlcmFuZDE6IEV4cHJlc3Npb248YW55Pjtcblx0b3BlcmFuZDI6IEV4cHJlc3Npb248YW55Pjtcbn07XG5cbmV4cG9ydCB0eXBlIElmRWxzZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiSWZFbHNlXCI7XG5cdGNvbmRpdGlvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0b25UcnVlOiBFeHByZXNzaW9uPFQ+O1xuXHRvbkZhbHNlOiBFeHByZXNzaW9uPFQ+O1xufTtcblxuLyoqXG4gKiBBbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHR5cGUgVC5cbiAqXG4gKiBAdHlwZWRlZiBFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb248VD4gPVxuXHR8IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvblxuXHR8IENvbnN0YW50RXhwcmVzc2lvbjxUPlxuXHR8IFNldEV4cHJlc3Npb25cblx0fCBOb3RFeHByZXNzaW9uXG5cdHwgVHJ1dGh5RXhwcmVzc2lvblxuXHR8IENvbmNhdEV4cHJlc3Npb25cblx0fCBMZW5ndGhFeHByZXNzaW9uXG5cdHwgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPlxuXHR8IEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPlxuXHR8IENvbXBhcmlzb25FeHByZXNzaW9uXG5cdHwgSWZFbHNlRXhwcmVzc2lvbjxUPlxuXHR8IEZvcm1hdHRlckV4cHJlc3Npb248VD5cblx0fCBDb21wbGV4VHlwZUV4cHJlc3Npb248VD5cblx0fCBSZWZlcmVuY2VFeHByZXNzaW9uXG5cdHwgRnVuY3Rpb25FeHByZXNzaW9uPFQ+O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULCBvciBhIGNvbnN0YW50IHZhbHVlIG9mIHR5cGUgVFxuICovXG5leHBvcnQgdHlwZSBFeHByZXNzaW9uT3JQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+ID0gRXhwcmVzc2lvbjxUPiB8IFQ7XG5cbmV4cG9ydCBjb25zdCB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjogVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0ge1xuXHRfdHlwZTogXCJVbnJlc29sdmVhYmxlXCJcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZVhtbEF0dHJpYnV0ZShpbnB1dFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBpbnB1dFN0cmluZy5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9uczogRXhwcmVzc2lvbjxhbnk+W10pOiBib29sZWFuIHtcblx0cmV0dXJuIGV4cHJlc3Npb25zLmZpbmQoZXhwciA9PiBleHByLl90eXBlID09PSBcIlVucmVzb2x2ZWFibGVcIikgIT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ2hlY2sgdHdvIGV4cHJlc3Npb25zIGZvciAoZGVlcCkgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGVxdWFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsPFQ+KGE6IEV4cHJlc3Npb248VD4sIGI6IEV4cHJlc3Npb248VD4pOiBib29sZWFuIHtcblx0aWYgKGEuX3R5cGUgIT09IGIuX3R5cGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzd2l0Y2ggKGEuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZlYWJsZVwiOlxuXHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBVbnJlc29sdmVhYmxlIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nIGV2ZW4gaXRzZWxmXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gYS52YWx1ZSA9PT0gKGIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+KS52YWx1ZTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgTm90RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBUcnV0aHlFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmxlbmd0aCA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMubGVuZ3RoICYmXG5cdFx0XHRcdGEub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PlxuXHRcdFx0XHRcdChiIGFzIFNldEV4cHJlc3Npb24pLm9wZXJhbmRzLnNvbWUob3RoZXJFeHByZXNzaW9uID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgb3RoZXJFeHByZXNzaW9uKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5jb25kaXRpb24sIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLmNvbmRpdGlvbikgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uVHJ1ZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25UcnVlKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub25GYWxzZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25GYWxzZSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5vcGVyYXRvciA9PT0gKGIgYXMgQ29tcGFyaXNvbkV4cHJlc3Npb24pLm9wZXJhdG9yICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kMSwgKGIgYXMgQ29tcGFyaXNvbkV4cHJlc3Npb24pLm9wZXJhbmQxKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDIsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMilcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRjb25zdCBhRXhwcmVzc2lvbnMgPSBhLmV4cHJlc3Npb25zO1xuXHRcdFx0Y29uc3QgYkV4cHJlc3Npb25zID0gKGIgYXMgQ29uY2F0RXhwcmVzc2lvbikuZXhwcmVzc2lvbnM7XG5cdFx0XHRpZiAoYUV4cHJlc3Npb25zLmxlbmd0aCAhPT0gYkV4cHJlc3Npb25zLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYUV4cHJlc3Npb25zLmV2ZXJ5KChleHByZXNzaW9uLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uLCBiRXhwcmVzc2lvbnNbaW5kZXhdKTtcblx0XHRcdH0pO1xuXG5cdFx0Y2FzZSBcIkxlbmd0aFwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5iaW5kaW5nRXhwcmVzc2lvbiwgKGIgYXMgTGVuZ3RoRXhwcmVzc2lvbikuYmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEubW9kZWxOYW1lID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLm1vZGVsTmFtZSAmJlxuXHRcdFx0XHRhLnBhdGggPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikucGF0aCAmJlxuXHRcdFx0XHRhLnRhcmdldEVudGl0eVNldCA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS50YXJnZXRFbnRpdHlTZXRcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEubW9kZWxOYW1lID09PSAoYiBhcyBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5tb2RlbE5hbWUgJiZcblx0XHRcdFx0YS5wYXRoID09PSAoYiBhcyBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5wYXRoXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5mbiA9PT0gKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikuZm4gJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikucGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLnR5cGUgPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikudHlwZSAmJlxuXHRcdFx0XHRhLmJpbmRpbmdQYXJhbWV0ZXJzLmxlbmd0aCA9PT0gKGIgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+KS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PlxuXHRcdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoKGIgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+KS5iaW5kaW5nUGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJGdW5jdGlvblwiOlxuXHRcdFx0Y29uc3Qgb3RoZXJGdW5jdGlvbiA9IGIgYXMgRnVuY3Rpb25FeHByZXNzaW9uPFQ+O1xuXHRcdFx0aWYgKGEub2JqID09PSB1bmRlZmluZWQgfHwgb3RoZXJGdW5jdGlvbi5vYmogPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gYS5vYmogPT09IG90aGVyRnVuY3Rpb247XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IG90aGVyRnVuY3Rpb24uZm4gJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9iaiwgb3RoZXJGdW5jdGlvbi5vYmopICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IG90aGVyRnVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob3RoZXJGdW5jdGlvbi5wYXJhbWV0ZXJzW2luZGV4XSwgdmFsdWUpKVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRcdHJldHVybiBhLnJlZiA9PT0gKGIgYXMgUmVmZXJlbmNlRXhwcmVzc2lvbikucmVmO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5lc3RlZCBTZXRFeHByZXNzaW9uIGJ5IGlubGluaW5nIG9wZXJhbmRzIG9mIHR5cGUgU2V0RXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGZsYXR0ZW5cbiAqIEByZXR1cm5zIHtTZXRFeHByZXNzaW9ufSBBIG5ldyBTZXRFeHByZXNzaW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAqL1xuZnVuY3Rpb24gZmxhdHRlblNldEV4cHJlc3Npb24oZXhwcmVzc2lvbjogU2V0RXhwcmVzc2lvbik6IFNldEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5yZWR1Y2UoXG5cdFx0KHJlc3VsdDogU2V0RXhwcmVzc2lvbiwgb3BlcmFuZCkgPT4ge1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcgPVxuXHRcdFx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmIG9wZXJhbmQub3BlcmF0b3IgPT09IGV4cHJlc3Npb24ub3BlcmF0b3IgPyBvcGVyYW5kLm9wZXJhbmRzIDogW29wZXJhbmRdO1xuXHRcdFx0Y2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcuZm9yRWFjaChjYW5kaWRhdGUgPT4ge1xuXHRcdFx0XHRpZiAocmVzdWx0Lm9wZXJhbmRzLmV2ZXJ5KGUgPT4gIV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZSwgY2FuZGlkYXRlKSkpIHtcblx0XHRcdFx0XHRyZXN1bHQub3BlcmFuZHMucHVzaChjYW5kaWRhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblx0XHR7IF90eXBlOiBcIlNldFwiLCBvcGVyYXRvcjogZXhwcmVzc2lvbi5vcGVyYXRvciwgb3BlcmFuZHM6IFtdIH1cblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYW4gYXJyYXkgb2YgYm9vbGVhbiBleHByZXNzaW9ucyBjb250YWlucyBhbiBleHByZXNzaW9uIGFuZCBpdHMgbmVnYXRpb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb25zIEFycmF5IG9mIGV4cHJlc3Npb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBzZXQgb2YgZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGhhc09wcG9zaXRlRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSk6IGJvb2xlYW4ge1xuXHRjb25zdCBuZWdhdGVkRXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucy5tYXAobm90KTtcblx0cmV0dXJuIGV4cHJlc3Npb25zLnNvbWUoKGV4cHJlc3Npb24sIGluZGV4KSA9PiB7XG5cdFx0Zm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IG5lZ2F0ZWRFeHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgbmVnYXRlZEV4cHJlc3Npb25zW2ldKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBhbmRgIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGV4cHJlc3Npb24gaXMgc2ltcGxpZmllZCB0byBmYWxzZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIGZhbHNlIG9yIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGFuIG9wZXJhbmQgYW5kIGl0cyBuZWdhdGlvbikuXG4gKlxuICogQHBhcmFtIG9wZXJhbmRzIEV4cHJlc3Npb25zIHRvIGNvbm5lY3QgYnkgYGFuZGBcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBFeHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgaXNTdGF0aWNGYWxzZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNGYWxzZShleHByZXNzaW9uKSkge1xuXHRcdFx0aXNTdGF0aWNGYWxzZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAhaXNDb25zdGFudChleHByZXNzaW9uKTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY0ZhbHNlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDApIHtcblx0XHQvLyBSZXNvbHZlIHRoZSBjb25zdGFudCB0aGVuXG5cdFx0Y29uc3QgaXNWYWxpZCA9IGV4cHJlc3Npb25zLnJlZHVjZSgocmVzdWx0LCBleHByZXNzaW9uKSA9PiByZXN1bHQgJiYgaXNUcnVlKGV4cHJlc3Npb24pLCB0cnVlKTtcblx0XHRyZXR1cm4gY29uc3RhbnQoaXNWYWxpZCk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5vblRyaXZpYWxFeHByZXNzaW9uWzBdO1xuXHR9IGVsc2UgaWYgKGhhc09wcG9zaXRlRXhwcmVzc2lvbnMobm9uVHJpdmlhbEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG9yYCBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBleHByZXNzaW9uIGlzIHNpbXBsaWZpZWQgdG8gdHJ1ZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIHRydWUgb3IgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYW4gb3BlcmFuZCBhbmQgaXRzIG5lZ2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZHMgRXhwcmVzc2lvbnMgdG8gY29ubmVjdCBieSBgb3JgXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljVHJ1ZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNUcnVlKGV4cHJlc3Npb24pKSB7XG5cdFx0XHRpc1N0YXRpY1RydWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi52YWx1ZTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY1RydWUpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKHJlc3VsdCwgZXhwcmVzc2lvbikgPT4gcmVzdWx0ICYmIGlzVHJ1ZShleHByZXNzaW9uKSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGlzVmFsaWQpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBub25Ucml2aWFsRXhwcmVzc2lvblswXTtcblx0fSBlbHNlIGlmIChoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKG5vblRyaXZpYWxFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG5vdGAgb3BlcmF0b3IuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gcmV2ZXJzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3Qob3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdG9wZXJhbmQgPSB3cmFwUHJpbWl0aXZlKG9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24ob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCJ8fFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeShleHByZXNzaW9uID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gYW5kKC4uLm9wZXJhbmQub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT4gbm90KGV4cHJlc3Npb24pKSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCImJlwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeShleHByZXNzaW9uID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gb3IoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PiBub3QoZXhwcmVzc2lvbikpKTtcblx0fSBlbHNlIGlmIChpc0NvbXBhcmlzb24ob3BlcmFuZCkpIHtcblx0XHQvLyBDcmVhdGUgdGhlIHJldmVyc2UgY29tcGFyaXNvblxuXHRcdHN3aXRjaCAob3BlcmFuZC5vcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIiE9PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI9PT1cIiB9O1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPj1cIiB9O1xuXHRcdFx0Y2FzZSBcIjw9XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIj5cIiB9O1xuXHRcdFx0Y2FzZSBcIj09PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCIhPT1cIiB9O1xuXHRcdFx0Y2FzZSBcIj5cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPD1cIiB9O1xuXHRcdFx0Y2FzZSBcIj49XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIjxcIiB9O1xuXHRcdH1cblx0fSBlbHNlIGlmIChvcGVyYW5kLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0cmV0dXJuIG9wZXJhbmQub3BlcmFuZDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiTm90XCIsXG5cdFx0b3BlcmFuZDogb3BlcmFuZFxuXHR9O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyB3aGV0aGVyIGEgYmluZGluZyBleHByZXNzaW9uIGlzIGVxdWFsIHRvIHRydWUgd2l0aCBhIGxvb3NlIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kIFRoZSBleHByZXNzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gVGhlIHJlc3VsdGluZyBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1dGh5KG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghIW9wZXJhbmQudmFsdWUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJUcnV0aHlcIixcblx0XHRcdG9wZXJhbmQ6IG9wZXJhbmRcblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUYXJnZXRUeXBlXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvbiB0aGUgbW9kZWxcbiAqIEBwYXJhbSBbbW9kZWxOYW1lXSBUaGUgbmFtZSBvZiB0aGUgbW9kZWxcbiAqIEBwYXJhbSBbdmlzaXRlZE5hdmlnYXRpb25QYXRoc10gVGhlIHBhdGhzIGZyb20gdGhlIHJvb3QgZW50aXR5U2V0XG4gKiBAcGFyYW0gW3BhdGhWaXNpdG9yXSBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VGFyZ2V0VHlwZT59IFRoZSBkZWZhdWx0IGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZGluZ0V4cHJlc3Npb248VGFyZ2V0VHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsTmFtZT86IHN0cmluZyxcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFRhcmdldFR5cGU+IHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uIHtcblx0aWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgdGFyZ2V0UGF0aDtcblx0aWYgKHBhdGhWaXNpdG9yKSB7XG5cdFx0dGFyZ2V0UGF0aCA9IHBhdGhWaXNpdG9yKHBhdGgpO1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgbG9jYWxQYXRoID0gdmlzaXRlZE5hdmlnYXRpb25QYXRocy5jb25jYXQoKTtcblx0XHRsb2NhbFBhdGgucHVzaChwYXRoKTtcblx0XHR0YXJnZXRQYXRoID0gbG9jYWxQYXRoLmpvaW4oXCIvXCIpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiQmluZGluZ1wiLFxuXHRcdG1vZGVsTmFtZTogbW9kZWxOYW1lLFxuXHRcdHBhdGg6IHRhcmdldFBhdGhcblx0fTtcbn1cblxudHlwZSBQbGFpbkV4cHJlc3Npb25PYmplY3QgPSB7IFtpbmRleDogc3RyaW5nXTogRXhwcmVzc2lvbjxhbnk+IH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmFzZWQgb24gYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgY29uc3RhbnQgdG8gd3JhcCBpbiBhbiBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7Q29uc3RhbnRFeHByZXNzaW9uPFQ+fSBUaGUgY29uc3RhbnQgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RhbnQ8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHZhbHVlOiBUKTogQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHtcblx0bGV0IGNvbnN0YW50VmFsdWU6IFQ7XG5cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRjb25zdGFudFZhbHVlID0gdmFsdWUubWFwKHdyYXBQcmltaXRpdmUpIGFzIFQ7XG5cdFx0fSBlbHNlIGlmIChpc1ByaW1pdGl2ZU9iamVjdCh2YWx1ZSkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS52YWx1ZU9mKCkgYXMgVDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IE9iamVjdC5lbnRyaWVzKHZhbHVlKS5yZWR1Y2UoKHBsYWluRXhwcmVzc2lvbiwgW2tleSwgdmFsXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB3cmFwcGVkVmFsdWUgPSB3cmFwUHJpbWl0aXZlKHZhbCk7XG5cdFx0XHRcdGlmICh3cmFwcGVkVmFsdWUuX3R5cGUgIT09IFwiQ29uc3RhbnRcIiB8fCB3cmFwcGVkVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHBsYWluRXhwcmVzc2lvbltrZXldID0gd3JhcHBlZFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwbGFpbkV4cHJlc3Npb247XG5cdFx0XHR9LCB7fSBhcyBQbGFpbkV4cHJlc3Npb25PYmplY3QpIGFzIFQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB7IF90eXBlOiBcIkNvbnN0YW50XCIsIHZhbHVlOiBjb25zdGFudFZhbHVlIH07XG59XG5cbnR5cGUgRXZhbHVhdGlvblR5cGUgPSBcImJvb2xlYW5cIjtcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQmluZGluZ1N0cmluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyLFxuXHR0YXJnZXRUeXBlPzogRXZhbHVhdGlvblR5cGVcbik6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB8IEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD4gfCBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiez1cIikpIHtcblx0XHRcdC8vIEV4cHJlc3Npb24gYmluZGluZywgd2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBvdXRlciBiaW5kaW5nIHRoaW5nc1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0X3R5cGU6IFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAodmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlID09PSBcInRydWVcIikgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSkgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHR9XG59XG5cbi8qKlxuICogQSBuYW1lZCByZWZlcmVuY2UuXG4gKlxuICogQHNlZSBmblxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlXG4gKiBAcmV0dXJucyB7UmVmZXJlbmNlRXhwcmVzc2lvbn0gVGhlIG9iamVjdCByZWZlcmVuY2UgYmluZGluZyBwYXJ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWYocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsKTogUmVmZXJlbmNlRXhwcmVzc2lvbiB7XG5cdHJldHVybiB7IF90eXBlOiBcIlJlZlwiLCByZWY6IHJlZmVyZW5jZSB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSB0eXBlIGlzIGFuIGV4cHJlc3Npb24uXG4gKlxuICogRXZlcnkgb2JqZWN0IGhhdmluZyBhIHByb3BlcnR5IG5hbWVkIGBfdHlwZWAgb2Ygc29tZSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFuIGV4cHJlc3Npb24sIGV2ZW4gaWYgdGhlcmUgaXMgYWN0dWFsbHlcbiAqIG5vIHN1Y2ggZXhwcmVzc2lvbiB0eXBlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gc29tZXRoaW5nIFR5cGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR5cGUgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oc29tZXRoaW5nOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBzb21ldGhpbmcgaXMgRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiBzb21ldGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHNvbWV0aGluZyA9PT0gXCJvYmplY3RcIiAmJiAoc29tZXRoaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyYXAgYSBwcmltaXRpdmUgaW50byBhIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgaXQgaXMgbm90IGFscmVhZHkgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHNvbWV0aGluZyBUaGUgb2JqZWN0IHRvIHdyYXAgaW4gYSBDb25zdGFudCBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gRWl0aGVyIHRoZSBvcmlnaW5hbCBvYmplY3Qgb3IgdGhlIHdyYXBwZWQgb25lIGRlcGVuZGluZyBvbiB0aGUgY2FzZVxuICovXG5mdW5jdGlvbiB3cmFwUHJpbWl0aXZlPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihzb21ldGhpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoaXNFeHByZXNzaW9uKHNvbWV0aGluZykpIHtcblx0XHRyZXR1cm4gc29tZXRoaW5nO1xuXHR9XG5cblx0cmV0dXJuIGNvbnN0YW50KHNvbWV0aGluZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlIHByb3ZpZGVkIGlzIGNvbnN0YW50IG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVDb25zdGFudCBUaGUgZXhwcmVzc2lvbiBvciBwcmltaXRpdmUgdmFsdWUgdGhhdCBpcyB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGl0IGlzIGNvbnN0YW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUNvbnN0YW50OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBtYXliZUNvbnN0YW50IGlzIENvbnN0YW50RXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVDb25zdGFudCAhPT0gXCJvYmplY3RcIiB8fCAobWF5YmVDb25zdGFudCBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgPT09IFwiQ29uc3RhbnRcIjtcbn1cblxuZnVuY3Rpb24gaXNUcnVlKGV4cHJlc3Npb246IEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0cmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNGYWxzZShleHByZXNzaW9uOiBFeHByZXNzaW9uPFByaW1pdGl2ZVR5cGU+KSB7XG5cdHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24udmFsdWUgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBiaW5kaW5nIG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVCaW5kaW5nIFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgYmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUJpbmRpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IG1heWJlQmluZGluZyBpcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIG1heWJlQmluZGluZyA9PT0gXCJvYmplY3RcIiAmJiAobWF5YmVCaW5kaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSA9PT0gXCJCaW5kaW5nXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIHByb3ZpZGVkIGlzIGEgY29tcGFyaXNvbiBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIENvbXBhcmlzb25FeHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPik6IGV4cHJlc3Npb24gaXMgQ29tcGFyaXNvbkV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCI7XG59XG5cbnR5cGUgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFA+ID1cblx0fCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgSWZBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE9yQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE5lQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBFcUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTm90QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBHdEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgR2VBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IExlQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBMdEFubm90YXRpb25FeHByZXNzaW9uPFA+O1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZU9iamVjdChvYmplY3RUeXBlOiBvYmplY3QpOiBib29sZWFuIHtcblx0c3dpdGNoIChvYmplY3RUeXBlLmNvbnN0cnVjdG9yLm5hbWUpIHtcblx0XHRjYXNlIFwiU3RyaW5nXCI6XG5cdFx0Y2FzZSBcIk51bWJlclwiOlxuXHRcdGNhc2UgXCJCb29sZWFuXCI6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBwYXNzZWQgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUgaXMgYSBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIGFubm90YXRpb25WYWx1ZSBUaGUgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUgdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBpcyBhIHtDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb259XG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+KGFubm90YXRpb25WYWx1ZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD4pOiBhbm5vdGF0aW9uVmFsdWUgaXMgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBhbm5vdGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIWlzUHJpbWl0aXZlT2JqZWN0KGFubm90YXRpb25WYWx1ZSBhcyBvYmplY3QpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGFubm90YXRpb25WYWx1ZSBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uVmFsdWUgVGhlIHNvdXJjZSBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgaWYgdGhlIGFubm90YXRpb25WYWx1ZSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgYW5ub3RhdGlvblZhbHVlIGVxdWl2YWxlbnQgdG8gdGhhdCBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFQ+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRkZWZhdWx0VmFsdWU/OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoYW5ub3RhdGlvblZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gd3JhcFByaW1pdGl2ZShkZWZhdWx0VmFsdWUgYXMgVCk7XG5cdH1cblxuXHRpZiAoIWlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZSkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvblZhbHVlKTtcblx0fVxuXG5cdHN3aXRjaCAoYW5ub3RhdGlvblZhbHVlLnR5cGUpIHtcblx0XHRjYXNlIFwiUGF0aFwiOlxuXHRcdFx0cmV0dXJuIGJpbmRpbmdFeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZS5wYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRjYXNlIFwiSWZcIjpcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZS5JZiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBub3QocGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5Ob3QsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiRXFcIjpcblx0XHRcdHJldHVybiBlcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5FcVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkVxWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTmVcIjpcblx0XHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5OZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLk5lWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiR3RcIjpcblx0XHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiR2VcIjpcblx0XHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkdlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTHRcIjpcblx0XHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkx0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTGVcIjpcblx0XHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkxlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiT3JcIjpcblx0XHRcdHJldHVybiBvcihcblx0XHRcdFx0Li4uKGFubm90YXRpb25WYWx1ZS5Pci5tYXAoZnVuY3Rpb24ob3JDb25kaXRpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiQW5kXCI6XG5cdFx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0XHQuLi4oYW5ub3RhdGlvblZhbHVlLkFuZC5tYXAoZnVuY3Rpb24oYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbmRDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSkgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJBcHBseVwiOlxuXHRcdFx0cmV0dXJuIGFubm90YXRpb25BcHBseUV4cHJlc3Npb24oXG5cdFx0XHRcdGFubm90YXRpb25WYWx1ZSBhcyBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBhbm5vdGF0aW9uIGNvbmRpdGlvbiBpbnRvIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIFRoZSBjb25kaXRpb24gb3IgdmFsdWUgZnJvbSB0aGUgYW5ub3RhdGlvblxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gQW4gZXF1aXZhbGVudCBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogQ29uZGl0aW9uYWxDaGVja09yVmFsdWUsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoYW5ub3RhdGlvblZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBhbm5vdGF0aW9uVmFsdWUgIT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvblZhbHVlIGFzIFQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdHJldHVybiBvcihcblx0XHRcdC4uLigoKGFubm90YXRpb25WYWx1ZSBhcyBPckNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE9yLm1hcChmdW5jdGlvbihvckNvbmRpdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHR9KSBhcyB1bmtub3duKSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRBbmRcIikpIHtcblx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0Li4uKCgoYW5ub3RhdGlvblZhbHVlIGFzIEFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEFuZC5tYXAoZnVuY3Rpb24oYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5kQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHR9KSBhcyB1bmtub3duKSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRyZXR1cm4gbm90KFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTm90Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTm90WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0cmV0dXJuIGVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgRXFDb25kaXRpb25hbEV4cHJlc3Npb24pLiRFcVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgRXFDb25kaXRpb25hbEV4cHJlc3Npb24pLiRFcVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiROZVwiKSkge1xuXHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRyZXR1cm4gZ3JlYXRlclRoYW4oXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEd0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEdlXCIpKSB7XG5cdFx0cmV0dXJuIGdyZWF0ZXJPckVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR2VDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR2VDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMdFwiKSkge1xuXHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRyZXR1cm4gbGVzc09yRXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJExlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJExlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oKGFubm90YXRpb25WYWx1ZSBhcyBQYXRoQ29uZGl0aW9uRXhwcmVzc2lvbjxUPikuJFBhdGgsIHVuZGVmaW5lZCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0XHRGdW5jdGlvbjogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRGdW5jdGlvbixcblx0XHRcdFx0QXBwbHk6IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kQXBwbHlcblx0XHRcdH0gYXMgVCxcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRwYXRoVmlzaXRvclxuXHRcdCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIklmXCIsXG5cdFx0XHRcdElmOiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJElmXG5cdFx0XHR9IGFzIFQsXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0cGF0aFZpc2l0b3Jcblx0XHQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRFbnVtTWVtYmVyXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHJlc29sdmVFbnVtVmFsdWUoKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRFbnVtTWVtYmVyKSBhcyBUKTtcblx0fVxuXHRyZXR1cm4gY29uc3RhbnQoZmFsc2UgYXMgVCk7XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUge0lmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZX0gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBBbiBJZiBleHByZXNzaW9uIHJldHVybmluZyB0aGUgdHlwZSBUXG4gKiBAcGFyYW0gdmlzaXRlZE5hdmlnYXRpb25QYXRocyBUaGUgcGF0aCBmcm9tIHRoZSByb290IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgZXF1aXZhbGVudCBpZkVsc2UgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbklmRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogSWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlPFQ+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIGlmRWxzZShcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZVsxXSBhcyBhbnksIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzJdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRhcHBseUV4cHJlc3Npb246IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0c3dpdGNoIChhcHBseUV4cHJlc3Npb24uRnVuY3Rpb24pIHtcblx0XHRjYXNlIFwib2RhdGEuY29uY2F0XCI6XG5cdFx0XHRyZXR1cm4gY29uY2F0KFxuXHRcdFx0XHQuLi5hcHBseUV4cHJlc3Npb24uQXBwbHkubWFwKChhcHBseVBhcmFtOiBhbnkpID0+IHtcblx0XHRcdFx0XHRsZXQgYXBwbHlQYXJhbUNvbnZlcnRlZCA9IGFwcGx5UGFyYW07XG5cdFx0XHRcdFx0aWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJQYXRoXCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFwcGx5UGFyYW0uJFBhdGhcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhcHBseVBhcmFtLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIklmXCIsXG5cdFx0XHRcdFx0XHRcdElmOiBhcHBseVBhcmFtLiRJZlxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiQXBwbHlcIixcblx0XHRcdFx0XHRcdFx0RnVuY3Rpb246IGFwcGx5UGFyYW0uJEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRBcHBseTogYXBwbHlQYXJhbS4kQXBwbHlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihhcHBseVBhcmFtQ29udmVydGVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdH1cblx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIGZvciB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb25zIChlcXVhbCwgbm90RXF1YWwsIC4uLikuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIHRvIGFwcGx5XG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG9wZXJhdG9yXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZnVuY3Rpb24gY29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgbGVmdEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGxlZnRPcGVyYW5kKTtcblx0Y29uc3QgcmlnaHRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShyaWdodE9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24pICYmIGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHN3aXRjaCAob3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCIhPT1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlICE9PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlIDwgcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI8PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPD0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI+XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA+IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPj1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID49IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPT09XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA9PT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIkNvbXBhcmlzb25cIixcblx0XHRcdG9wZXJhdG9yOiBvcGVyYXRvcixcblx0XHRcdG9wZXJhbmQxOiBsZWZ0RXhwcmVzc2lvbixcblx0XHRcdG9wZXJhbmQyOiByaWdodEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoZXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPGFueT4gfCBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24pOiBFeHByZXNzaW9uPG51bWJlcj4ge1xuXHRpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmVhYmxlXCIpIHtcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkxlbmd0aFwiLFxuXHRcdGJpbmRpbmdFeHByZXNzaW9uOiBleHByZXNzaW9uXG5cdH07XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJlcXVhbFwiICg9PT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlKGxlZnQ6IEV4cHJlc3Npb248VD4sIHJpZ2h0OiBFeHByZXNzaW9uPFQ+KSB7XG5cdFx0aWYgKGxlZnQuX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzVHJ1ZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IHRydWUgfn4+IGNvbXBhcmUoYSwgYilcblx0XHRcdHJldHVybiBsZWZ0O1xuXHRcdH0gZWxzZSBpZiAobGVmdC5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNGYWxzZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IGZhbHNlIH5+PiAhY29tcGFyZShhLCBiKVxuXHRcdFx0cmV0dXJuIG5vdChsZWZ0KTtcblx0XHR9IGVsc2UgaWYgKGxlZnQuX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0Lm9uVHJ1ZSwgcmlnaHQpKSB7XG5cdFx0XHQvLyAoaWYgKHgpIHsgYSB9IGVsc2UgeyBiIH0pID09PSBhIH5+PiB4IHx8IChiID09PSBhKVxuXHRcdFx0cmV0dXJuIG9yKGxlZnQuY29uZGl0aW9uLCBlcXVhbChsZWZ0Lm9uRmFsc2UsIHJpZ2h0KSk7XG5cdFx0fSBlbHNlIGlmIChsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodCkpIHtcblx0XHRcdC8vIChpZiAoeCkgeyBhIH0gZWxzZSB7IGIgfSkgPT09IGIgfn4+ICF4IHx8IChhID09PSBiKVxuXHRcdFx0cmV0dXJuIG9yKG5vdChsZWZ0LmNvbmRpdGlvbiksIGVxdWFsKGxlZnQub25UcnVlLCByaWdodCkpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmXG5cdFx0XHRpc0NvbnN0YW50KGxlZnQub25UcnVlKSAmJlxuXHRcdFx0aXNDb25zdGFudChsZWZ0Lm9uRmFsc2UpICYmXG5cdFx0XHRpc0NvbnN0YW50KHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vblRydWUsIHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodClcblx0XHQpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBleHBsb2l0IHN5bW1ldHJ5OiBhID09PSBiIDx+PiBiID09PSBhXG5cdGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UobGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikgPz8gcmVkdWNlKHJpZ2h0RXhwcmVzc2lvbiwgbGVmdEV4cHJlc3Npb24pO1xuXHRyZXR1cm4gcmVkdWNlZCA/PyBjb21wYXJpc29uKFwiPT09XCIsIGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwibm90IGVxdWFsXCIgKCE9PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5vdChlcXVhbChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJncmVhdGVyIG9yIGVxdWFsXCIgKD49KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyZWF0ZXJPckVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIj49XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZ3JlYXRlciB0aGFuXCIgKD4pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlclRoYW48VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPlwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3Mgb3IgZXF1YWxcIiAoPD0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc09yRXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPD1cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJsZXNzIHRoYW5cIiAoPCkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzVGhhbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIElmLXRoZW4tZWxzZSBleHByZXNzaW9uLlxuICpcbiAqIEV2YWx1YXRlcyB0byBvblRydWUgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZWxzZSBldmFsdWF0ZXMgdG8gb25GYWxzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZVxuICogQHBhcmFtIG9uVHJ1ZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlXG4gKiBAcGFyYW0gb25GYWxzZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZkVsc2U8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRjb25kaXRpb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPixcblx0b25UcnVlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdG9uRmFsc2U6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25kaXRpb25FeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShjb25kaXRpb24pO1xuXHRsZXQgb25UcnVlRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUob25UcnVlKTtcblx0bGV0IG9uRmFsc2VFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvbkZhbHNlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIHN3YXAgYnJhbmNoZXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhIG5lZ2F0aW9uXG5cdGlmIChjb25kaXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0Ly8gaWZFbHNlKG5vdChYKSwgYSwgYikgLS0+IGlmRWxzZShYLCBiLCBhKVxuXHRcdFtvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbl0gPSBbb25GYWxzZUV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb25dO1xuXHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbik7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IG9uVHJ1ZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGlmRWxzZShYLCBhLCBiKSwgYykgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25UcnVlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24uY29uZGl0aW9uKSkge1xuXHRcdG9uVHJ1ZUV4cHJlc3Npb24gPSBvblRydWVFeHByZXNzaW9uLm9uVHJ1ZTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25GYWxzZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGEsIGlmRWxzZShYLCBiLCBjKSkgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25GYWxzZUV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChjb25kaXRpb25FeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25GYWxzZUV4cHJlc3Npb24gPSBvbkZhbHNlRXhwcmVzc2lvbi5vbkZhbHNlO1xuXHR9XG5cblx0Ly8gKGlmIHRydWUgdGhlbiBhIGVsc2UgYikgIH5+PiBhXG5cdC8vIChpZiBmYWxzZSB0aGVuIGEgZWxzZSBiKSB+fj4gYlxuXHRpZiAoaXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25kaXRpb25FeHByZXNzaW9uLnZhbHVlID8gb25UcnVlRXhwcmVzc2lvbiA6IG9uRmFsc2VFeHByZXNzaW9uO1xuXHR9XG5cblx0Ly8gaWYgKGlzQ29uc3RhbnRCb29sZWFuKG9uVHJ1ZUV4cHJlc3Npb24pIHx8IGlzQ29uc3RhbnRCb29sZWFuKG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHQvLyBcdHJldHVybiBvcihhbmQoY29uZGl0aW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pLCBhbmQobm90KGNvbmRpdGlvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pKSBhcyBFeHByZXNzaW9uPFQ+XG5cdC8vIH1cblx0Ly8gKGlmIFggdGhlbiBhIGVsc2UgYSkgfn4+IGFcblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9uVHJ1ZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIGZhbHNlIH5+PiBYICYmIGFcblx0aWYgKGlzRmFsc2Uob25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIHRydWUgfn4+ICFYIHx8IGFcblx0aWYgKGlzVHJ1ZShvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3Iobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gZmFsc2UgZWxzZSBhIH5+PiAhWCAmJiBhXG5cdGlmIChpc0ZhbHNlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChub3QoY29uZGl0aW9uRXhwcmVzc2lvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gdHJ1ZSBlbHNlIGEgfn4+IFggfHwgYVxuXHRpZiAoaXNUcnVlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9yKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIklmRWxzZVwiLFxuXHRcdGNvbmRpdGlvbjogY29uZGl0aW9uRXhwcmVzc2lvbixcblx0XHRvblRydWU6IG9uVHJ1ZUV4cHJlc3Npb24sXG5cdFx0b25GYWxzZTogb25GYWxzZUV4cHJlc3Npb25cblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBleHByZXNzaW9uIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBtb2RlbCAodW5kZWZpbmVkKS5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpO1xuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5tb2RlbE5hbWUgPT09IHVuZGVmaW5lZDtcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMSkgfHwgaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQyKTtcblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5jb25kaXRpb24pIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vblRydWUpIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vbkZhbHNlKVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbnR5cGUgRm48VD4gPSAoKC4uLnBhcmFtczogYW55KSA9PiBUKSAmIHtcblx0X19mdW5jdGlvbk5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgV3JhcHBlZFR1cGxlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbnR5cGUgV3JhcHBlZFR1cGxlPFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogV3JhcHBlZFR1cGxlPFRbS10+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFRbS10+IH07XG5cbi8vIFNvLCB0aGlzIHdvcmtzIGJ1dCBJIGNhbm5vdCBnZXQgaXQgdG8gY29tcGlsZSA6RCwgYnV0IGl0IHN0aWxsIGRvZXMgd2hhdCBpcyBleHBlY3RlZC4uLlxuXG4vKipcbiAqIEEgZnVuY3Rpb24gcmVmZXJlbmNlIG9yIGEgZnVuY3Rpb24gbmFtZS5cbiAqL1xudHlwZSBGdW5jdGlvbk9yTmFtZTxUPiA9IEZuPFQ+IHwgc3RyaW5nO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHBhcmFtZXRlcnMsIGVpdGhlciBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uIG9yIGFuIHVudHlwZWQgYXJyYXkuXG4gKi9cbnR5cGUgRnVuY3Rpb25QYXJhbWV0ZXJzPFQsIEYgZXh0ZW5kcyBGdW5jdGlvbk9yTmFtZTxUPj4gPSBGIGV4dGVuZHMgRm48VD4gPyBQYXJhbWV0ZXJzPEY+IDogYW55W107XG5cbi8qKlxuICogQ2FsbHMgYSBmb3JtYXR0ZXIgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgcGFyYW1ldGVycy5cbiAqIElmIHJlcXVpcmVDb250ZXh0IGlzIHNldCB0byB0cnVlIGFuZCBubyBjb250ZXh0IGlzIHBhc3NlZCBhIGRlZmF1bHQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbGlzdCBvZiBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIHR5cGUgYW5kIG51bWJlciBvZiB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZm9ybWF0dGVyRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzdWx0PFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0Zm9ybWF0dGVyRnVuY3Rpb246IFUsXG5cdGNvbnRleHRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IHBhcmFtZXRlckV4cHJlc3Npb25zID0gKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmICghIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaChrZXkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGb3JtYXR0ZXJOYW1lIGNhbiBiZSBvZiBmb3JtYXQgc2FwLmZlLmNvcmUueHh4I21ldGhvZE5hbWUgdG8gaGF2ZSBtdWx0aXBsZSBmb3JtYXR0ZXIgaW4gb25lIGNsYXNzXG5cdGNvbnN0IFtmb3JtYXR0ZXJDbGFzcywgZm9ybWF0dGVyTmFtZV0gPSBmb3JtYXR0ZXJGdW5jdGlvbi5fX2Z1bmN0aW9uTmFtZS5zcGxpdChcIiNcIik7XG5cblx0aWYgKCEhZm9ybWF0dGVyTmFtZSAmJiBmb3JtYXR0ZXJOYW1lLmxlbmd0aCA+IDApIHtcblx0XHRwYXJhbWV0ZXJFeHByZXNzaW9ucy51bnNoaWZ0KGNvbnN0YW50KGZvcm1hdHRlck5hbWUpKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiRm9ybWF0dGVyXCIsXG5cdFx0Zm46IGZvcm1hdHRlckNsYXNzLFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlckV4cHJlc3Npb25zXG5cdH07XG59XG5cbi8qKlxuICogQ2FsbHMgYSBjb21wbGV4IHR5cGUgIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGZvciB0aGUgY29tcHBsZXggdHlwZVxuICogQHBhcmFtIHR5cGUgVGhlIGNvbXBsZXggdHlwZSB0byB1c2VcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVHlwZUluZm9ybWF0aW9uPFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0dHlwZTogc3RyaW5nLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBwYXJhbWV0ZXJFeHByZXNzaW9ucyA9IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5wYXJhbWV0ZXJFeHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0Ly8gSWYgdGhlcmUgaXMgb25seSBvbmUgcGFyYW1ldGVyIGFuZCBpdCBpcyBhIGNvbnN0YW50IGFuZCB3ZSBkb24ndCBleHBlY3QgdGhlIGNvbnRleHQgdGhlbiByZXR1cm4gdGhlIGNvbnN0YW50XG5cdGlmIChwYXJhbWV0ZXJFeHByZXNzaW9ucy5sZW5ndGggPT09IDEgJiYgaXNDb25zdGFudChwYXJhbWV0ZXJFeHByZXNzaW9uc1swXSkgJiYgIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0cmV0dXJuIHBhcmFtZXRlckV4cHJlc3Npb25zWzBdO1xuXHR9IGVsc2UgaWYgKCEhY29udGV4dEVudGl0eVR5cGUpIHtcblx0XHQvLyBPdGhlcndpc2UsIGlmIHRoZSBjb250ZXh0IGlzIHJlcXVpcmVkIGFuZCBubyBjb250ZXh0IGlzIHByb3ZpZGVkIG1ha2Ugc3VyZSB0byBhZGQgdGhlIGRlZmF1bHQgYmluZGluZ1xuXHRcdGlmICghcGFyYW1ldGVyRXhwcmVzc2lvbnMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KSkge1xuXHRcdFx0Y29udGV4dEVudGl0eVR5cGUua2V5cy5mb3JFYWNoKGtleSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG9Gb3JtYXRPcHRpb25zID1cblx0XHQocGFyYW1ldGVyc1swXSBhcyBhbnkpPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwID8geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfSA6IHt9O1xuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0dHlwZTogdHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBvRm9ybWF0T3B0aW9ucyxcblx0XHRwYXJhbWV0ZXJzOiB7fSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cbi8qKlxuICogRnVuY3Rpb24gY2FsbCwgb3B0aW9uYWxseSB3aXRoIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBuYW1lIG9yIHJlZmVyZW5jZSB0byBmdW5jdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJndW1lbnRzXG4gKiBAcGFyYW0gb24gT2JqZWN0IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIG9uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb25FeHByZXNzaW9uPFQ+fSBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gY2FsbCAobm90IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwhKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm48VCwgVSBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+Pihcblx0ZnVuYzogVSxcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPEZ1bmN0aW9uUGFyYW1ldGVyczxULCBVPj4sXG5cdG9uPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPG9iamVjdD5cbik6IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHR5cGVvZiBmdW5jID09PSBcInN0cmluZ1wiID8gZnVuYyA6IChmdW5jIGFzIEZuPFQ+KS5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29uY2F0XCIpIHtcblx0XHRyZXR1cm4gb3IoLi4uZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoaXNFbXB0eSkpO1xuXHR9XG5cdHJldHVybiBvcihlcXVhbChleHByZXNzaW9uLCBcIlwiKSwgZXF1YWwoZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSwgZXF1YWwoZXhwcmVzc2lvbiwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGluRXhwcmVzc2lvbnMubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChleHByZXNzaW9ucy5ldmVyeShpc0NvbnN0YW50KSkge1xuXHRcdHJldHVybiBjb25zdGFudChcblx0XHRcdGV4cHJlc3Npb25zLnJlZHVjZSgoY29uY2F0ZW5hdGVkOiBzdHJpbmcsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQgKyAodmFsdWUgYXMgQ29uc3RhbnRFeHByZXNzaW9uPGFueT4pLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBFeHByZXNzaW9uPFQ+O1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblR5cGUgPSBQaWNrPEV4cHJlc3Npb248YW55PiwgXCJfdHlwZVwiPltcIl90eXBlXCJdO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oXG5cdGluRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uID0gZmFsc2Vcbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgZXhwcmVzc2lvbiA9IGluRXhwcmVzc2lvbjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkocGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGV4cHJlc3Npb24uZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uLmV4cHJlc3Npb25zLm1hcChzdWJFeHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KHN1YkV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5tYXAoYmluZGluZ1BhcmFtZXRlciA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nUGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IG9uVHJ1ZSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub25UcnVlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGNvbnN0IG9uRmFsc2UgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uRmFsc2UsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IGV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHRcdGV4cHJlc3Npb24gPSBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRleHByZXNzaW9uLm9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAob3BlcmFuZCA9PlxuXHRcdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KG9wZXJhbmQsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQxID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQyID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBjb21wYXJpc29uKGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmQxLCBvcGVyYW5kMikgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChleHByZXNzaW9uVHlwZSA9PT0gZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGV4cHJlc3Npb24gPSB0cmFuc2Zvcm1GdW5jdGlvbihpbkV4cHJlc3Npb24pO1xuXHR9XG5cdHJldHVybiBleHByZXNzaW9uO1xufVxuXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IFQgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG5lZWRQYXJlbnRoZXNpcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBib29sZWFuIHtcblx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHIpICYmICFpc0JpbmRpbmcoZXhwcikgJiYgaXNFeHByZXNzaW9uKGV4cHIpICYmIGV4cHIuX3R5cGUgIT09IFwiSWZFbHNlXCIgJiYgZXhwci5fdHlwZSAhPT0gXCJGdW5jdGlvblwiO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGNvbnN0YW50IG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gaXNOdWxsYWJsZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbXBpbGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjb21waWxlQ29uc3RhbnRPYmplY3Q8VD4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPG9iamVjdD4sIGlzTnVsbGFibGUgPSBmYWxzZSkge1xuXHRpZiAoaXNOdWxsYWJsZSAmJiBPYmplY3Qua2V5cyhleHByLnZhbHVlKS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHQvLyBPYmplY3RzXG5cdGNvbnN0IG8gPSBleHByLnZhbHVlIGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdDtcblx0Y29uc3QgcHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0T2JqZWN0LmtleXMobykuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb1trZXldO1xuXHRcdGNvbnN0IGNoaWxkUmVzdWx0ID0gY29tcGlsZUJpbmRpbmcodmFsdWUsIHRydWUsIGZhbHNlLCB0cnVlKTtcblx0XHRpZiAoY2hpbGRSZXN1bHQgJiYgY2hpbGRSZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0cHJvcGVydGllcy5wdXNoKGAke2tleX06ICR7Y2hpbGRSZXN1bHR9YCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmpvaW4oXCIsIFwiKX19YDtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBhIENvbnN0YW50IEJpbmRpbmcgRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmdcbiAqIEBwYXJhbSBpc051bGxhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tcGlsZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPFQ+LCBlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbiwgaXNOdWxsYWJsZSA9IGZhbHNlKSB7XG5cdGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIFwibnVsbFwiO1xuXHR9XG5cdGlmIChleHByLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gXCJ1bmRlZmluZWRcIjtcblx0fVxuXHRpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShleHByLnZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGV4cHIudmFsdWUubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSkpO1xuXHRcdFx0cmV0dXJuIGBbJHtlbnRyaWVzLmpvaW4oXCIsIFwiKX1dYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVDb25zdGFudE9iamVjdChleHByIGFzIENvbnN0YW50RXhwcmVzc2lvbjxvYmplY3Q+LCBpc051bGxhYmxlKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRzd2l0Y2ggKHR5cGVvZiBleHByLnZhbHVlKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRyZXR1cm4gYCcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGJpbmRpbmcgc3RyaW5nIGZvciBhIEJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbkZvckJpbmRpbmcgVGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZVxuICogQHBhcmFtIGVtYmVkZGVkSW5CaW5kaW5nIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgZXhwcmVzc2lvblxuICogQHBhcmFtIGVtYmVkZGVkU2VwYXJhdG9yIFRoZSBiaW5kaW5nIHZhbHVlIGV2YWx1YXRvciAoJCBvciAlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZm9yY2UgdGhlIHR5cGUgb3Igbm90KVxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJpbmRpbmdGb3JCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbkZvckJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiB8IERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4sXG5cdGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLFxuXHRlbWJlZGRlZFNlcGFyYXRvcjogc3RyaW5nXG4pIHtcblx0aWYgKFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLnR5cGUgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5wYXJhbWV0ZXJzIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSB8fFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLmZvcm1hdE9wdGlvbnMgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5jb25zdHJhaW50c1xuXHQpIHtcblx0XHQvLyBUaGlzIGlzIG5vdyBhIGNvbXBsZXggYmluZGluZyBkZWZpbml0aW9uLCBsZXQncyBwcmVwYXJlIGZvciBpdFxuXHRcdGNvbnN0IGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiA9IHtcblx0XHRcdHBhdGg6IGNvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyksXG5cdFx0XHR0eXBlOiBleHByZXNzaW9uRm9yQmluZGluZy50eXBlLFxuXHRcdFx0dGFyZ2V0VHlwZTogZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSxcblx0XHRcdHBhcmFtZXRlcnM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLnBhcmFtZXRlcnMsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBleHByZXNzaW9uRm9yQmluZGluZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0Y29uc3RyYWludHM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLmNvbnN0cmFpbnRzXG5cdFx0fTtcblx0XHRsZXQgb3V0QmluZGluZyA9IGNvbXBpbGVCaW5kaW5nKGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbik7XG5cdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRvdXRCaW5kaW5nID0gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9YCArIG91dEJpbmRpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRCaW5kaW5nO1xuXHR9IGVsc2UgaWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0cmV0dXJuIGAke2VtYmVkZGVkU2VwYXJhdG9yfXske2NvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyl9fWA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlQmluZGluZ1BhdGgoZXhwcmVzc2lvbkZvckJpbmRpbmcpfX1gO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHJlc3Npb246IENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnNbMF0sIHRydWUpfSwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSd9YDtcblx0fVxuXG5cdGxldCBvdXRwdXRFbmQ7XG5cdC8vIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBzYXAudWkubW9kZWwub2RhdGEudjQuX0Fubm90YXRpb25IZWxwZXJFeHByZXNzaW9uLmZldGNoQ3VycmVuY3lPclVuaXRcblx0c3dpdGNoIChleHByZXNzaW9uLnR5cGUpIHtcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiOlxuXHRcdFx0b3V0cHV0RW5kID0gYCx7bW9kZTonT25lVGltZScscGF0aDonLyMjQEByZXF1ZXN0VW5pdHNPZk1lYXN1cmUnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0J2A7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjpcblx0XHRcdG91dHB1dEVuZCA9IGAse21vZGU6J09uZVRpbWUnLHBhdGg6Jy8jI0BAcmVxdWVzdEN1cnJlbmN5Q29kZXMnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeSdgO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdG91dHB1dEVuZCA9IGBdLCB0eXBlOiAnJHtleHByZXNzaW9uLnR5cGV9J2A7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24ucGFyYW1ldGVycykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdH1cblx0b3V0cHV0RW5kICs9IFwifVwiO1xuXG5cdHJldHVybiBge21vZGU6J1R3b1dheScsIHBhcnRzOlske2V4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpLmpvaW4oXCIsXCIpfSR7b3V0cHV0RW5kfWA7XG59XG5cbi8qKlxuICogV3JhcCB0aGUgY29tcGlsZWQgYmluZGluZyBzdHJpbmcgYXMgcmVxdWlyZWQgZGVwZW5kZW5pbmcgb24gaXRzIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZyBUcnVlIGlmIHRoZSBjb21waWxlZCBleHByZXNzaW9uIGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgYmluZGluZ1xuICogQHBhcmFtIHBhcmVudGhlc2lzUmVxdWlyZWQgVHJ1ZSBpZiB0aGUgZW1iZWRkZWQgYmluZGluZyBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmV0aGVzaXMgc28gdGhhdCBpdCBpcyBldmFsdWF0ZWQgYXMgb25lXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gRmluYWxpemVkIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgZW1iZWRkZWRJbkJpbmRpbmc6IGJvb2xlYW4sIHBhcmVudGhlc2lzUmVxdWlyZWQgPSBmYWxzZSk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRpZiAocGFyZW50aGVzaXNSZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuIGAoJHtleHByZXNzaW9ufSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7PSAke2V4cHJlc3Npb259fWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIGV4cHJlc3Npb24gaW50byBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0ga2VlcFRhcmdldFR5cGUgS2VlcCB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGVtYmVkZGVkIGJpbmRpbmdzIGluc3RlYWQgb2YgY2FzdGluZyB0aGVtIHRvIGFueVxuICogQHBhcmFtIGlzTnVsbGFibGUgV2hldGhlciBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIHJlc29sdmUgdG8gZW1wdHkgc3RyaW5nIG9yIG5vdFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZyA9IGZhbHNlLFxuXHRrZWVwVGFyZ2V0VHlwZSA9IGZhbHNlLFxuXHRpc051bGxhYmxlID0gZmFsc2Vcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByID0gd3JhcFByaW1pdGl2ZShleHByZXNzaW9uKTtcblx0Y29uc3QgZW1iZWRkZWRTZXBhcmF0b3IgPSBrZWVwVGFyZ2V0VHlwZSA/IFwiJFwiIDogXCIlXCI7XG5cblx0c3dpdGNoIChleHByLl90eXBlKSB7XG5cdFx0Y2FzZSBcIlVucmVzb2x2ZWFibGVcIjpcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdHJldHVybiBjb21waWxlQ29uc3RhbnQoZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGlzTnVsbGFibGUpO1xuXG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdFx0cmV0dXJuIGV4cHIucmVmIHx8IFwibnVsbFwiO1xuXG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRjb25zdCBhcmd1bWVudFN0cmluZyA9IGAke2V4cHIucGFyYW1ldGVycy5tYXAoYXJnID0+IGNvbXBpbGVCaW5kaW5nKGFyZywgdHJ1ZSkpLmpvaW4oXCIsIFwiKX1gO1xuXHRcdFx0cmV0dXJuIGV4cHIub2JqID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyBgJHtleHByLmZufSgke2FyZ3VtZW50U3RyaW5nfSlgXG5cdFx0XHRcdDogYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5vYmosIHRydWUpfS4ke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGVtYmVkZGVkSW5CaW5kaW5nID8gYCgke2V4cHIudmFsdWUuc3Vic3RyKDIsIGV4cHIudmFsdWUubGVuZ3RoIC0gMyl9KWAgOiBgJHtleHByLnZhbHVlfWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgJHtlbWJlZGRlZFNlcGFyYXRvcn0ke2V4cHIudmFsdWV9YCA6IGAke2V4cHIudmFsdWV9YDtcblxuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmdGb3JCaW5kaW5nKGV4cHIsIGVtYmVkZGVkSW5CaW5kaW5nLCBlbWJlZGRlZFNlcGFyYXRvcik7XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0Y29uc3QgY29tcGFyaXNvbkV4cHJlc3Npb24gPSBjb21waWxlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcik7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbXBhcmlzb25FeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRjb25zdCBpZkVsc2VFeHByZXNzaW9uID0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5jb25kaXRpb24sIHRydWUpfSA/ICR7Y29tcGlsZUJpbmRpbmcoZXhwci5vblRydWUsIHRydWUpfSA6ICR7Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGV4cHIub25GYWxzZSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KX1gO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihpZkVsc2VFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZywgdHJ1ZSk7XG5cblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRjb25zdCBzZXRFeHByZXNzaW9uID0gZXhwci5vcGVyYW5kcy5tYXAob3BlcmFuZCA9PiBjb21waWxlQmluZGluZyhvcGVyYW5kLCB0cnVlKSkuam9pbihgICR7ZXhwci5vcGVyYXRvcn0gYCk7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKHNldEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nLCB0cnVlKTtcblxuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGNvbnN0IGNvbmNhdEV4cHJlc3Npb24gPSBleHByLmV4cHJlc3Npb25zLm1hcChuZXN0ZWRFeHByZXNzaW9uID0+IGNvbXBpbGVCaW5kaW5nKG5lc3RlZEV4cHJlc3Npb24sIHRydWUsIHRydWUpKS5qb2luKFwiICsgXCIpO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihjb25jYXRFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0XHRjb25zdCBsZW5ndGhFeHByZXNzaW9uID0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5iaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSl9Lmxlbmd0aGA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGxlbmd0aEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdGNvbnN0IG5vdEV4cHJlc3Npb24gPSBgISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX1gO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihub3RFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRjb25zdCB0cnV0aHlFeHByZXNzaW9uID0gYCEhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKHRydXRoeUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdGNvbnN0IGZvcm1hdHRlckV4cHJlc3Npb24gPSBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGBcXCQke2Zvcm1hdHRlckV4cHJlc3Npb259YCA6IGZvcm1hdHRlckV4cHJlc3Npb247XG5cblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGNvbnN0IGNvbXBsZXhUeXBlRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb24oZXhwcik7XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgXFwkJHtjb21wbGV4VHlwZUV4cHJlc3Npb259YCA6IGNvbXBsZXhUeXBlRXhwcmVzc2lvbjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0fVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBjb21wYXJpc29uIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLiBOZWVkcyB3cmFwcGluZyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvbiBiaW5kaW5nLlxuICovXG5mdW5jdGlvbiBjb21waWxlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogQ29tcGFyaXNvbkV4cHJlc3Npb24pIHtcblx0ZnVuY3Rpb24gY29tcGlsZU9wZXJhbmQob3BlcmFuZDogRXhwcmVzc2lvbjxhbnk+KSB7XG5cdFx0Y29uc3QgY29tcGlsZWRPcGVyYW5kID0gY29tcGlsZUJpbmRpbmcob3BlcmFuZCwgdHJ1ZSkgPz8gXCJ1bmRlZmluZWRcIjtcblx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbXBpbGVkT3BlcmFuZCwgdHJ1ZSwgbmVlZFBhcmVudGhlc2lzKG9wZXJhbmQpKTtcblx0fVxuXG5cdHJldHVybiBgJHtjb21waWxlT3BlcmFuZChleHByZXNzaW9uLm9wZXJhbmQxKX0gJHtleHByZXNzaW9uLm9wZXJhdG9yfSAke2NvbXBpbGVPcGVyYW5kKGV4cHJlc3Npb24ub3BlcmFuZDIpfWA7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGZvcm1hdHRlciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBmb3JtYXR0ZXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBgeyR7Y29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzWzBdLCB0cnVlKX0sIGZvcm1hdHRlcjogJyR7ZXhwcmVzc2lvbi5mbn0nfWA7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgcGFydHMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+IGNvbXBpbGVQYXRoUGFyYW1ldGVyKHBhcmFtKSk7XG5cdFx0cmV0dXJuIGB7cGFydHM6IFske3BhcnRzLmpvaW4oXCIsIFwiKX1dLCBmb3JtYXR0ZXI6ICcke2V4cHJlc3Npb24uZm59J31gO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSB0aGUgcGF0aCBwYXJhbWV0ZXIgb2YgYSBmb3JtYXR0ZXIgY2FsbC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgYmluZGluZyBwYXJ0IHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gc2luZ2xlUGF0aCBXaGV0aGVyIHRoZXJlIGlzIG9uZSBvciBtdWx0aXBsZSBwYXRoIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHNuaXBwZXQgdG8gaW5jbHVkZSBpbiB0aGUgb3ZlcmFsbCBiaW5kaW5nIGRlZmluaXRpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+LCBzaW5nbGVQYXRoID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgb3V0VmFsdWUgPSBcIlwiO1xuXHRpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb25zdGFudFwiKSB7XG5cdFx0c3dpdGNoICh0eXBlb2YgZXhwcmVzc2lvbi52YWx1ZSkge1xuXHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0Y2FzZSBcImJpZ2ludFwiOlxuXHRcdFx0XHRvdXRWYWx1ZSA9IGB2YWx1ZTogJHtleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCl9YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAnJHtlc2NhcGVYbWxBdHRyaWJ1dGUoZXhwcmVzc2lvbi52YWx1ZS50b1N0cmluZygpKX0nYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRvdXRWYWx1ZSA9IGB2YWx1ZTogJyR7ZXhwcmVzc2lvbi52YWx1ZS50b1N0cmluZygpfSdgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG91dFZhbHVlID0gXCJ2YWx1ZTogJydcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiRGVmYXVsdEJpbmRpbmdcIiB8fCBleHByZXNzaW9uLl90eXBlID09PSBcIkJpbmRpbmdcIikge1xuXHRcdG91dFZhbHVlID0gYHBhdGg6ICcke2NvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uKX0nYDtcblxuXHRcdG91dFZhbHVlICs9IGV4cHJlc3Npb24udHlwZSA/IGAsIHR5cGU6ICcke2V4cHJlc3Npb24udHlwZX0nYCA6IGAsIHRhcmdldFR5cGU6ICdhbnknYDtcblxuXHRcdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgY29uc3RyYWludHM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5jb25zdHJhaW50cyl9YDtcblx0XHR9XG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRcdG91dFZhbHVlICs9IGAsIGZvcm1hdE9wdGlvbnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKX1gO1xuXHRcdH1cblx0XHRpZiAoaGFzRWxlbWVudHMoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdHJldHVybiBzaW5nbGVQYXRoID8gb3V0VmFsdWUgOiBgeyR7b3V0VmFsdWV9fWA7XG59XG5cbmZ1bmN0aW9uIGhhc0VsZW1lbnRzKG9iajogYW55KSB7XG5cdHJldHVybiBvYmogJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBiaW5kaW5nIGV4cHJlc3Npb24gcGF0aC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nUGF0aDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+IHwgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikge1xuXHRyZXR1cm4gYCR7ZXhwcmVzc2lvbi5tb2RlbE5hbWUgPyBleHByZXNzaW9uLm1vZGVsTmFtZSArIFwiPlwiIDogXCJcIn0ke2V4cHJlc3Npb24ucGF0aH1gO1xufVxuIl19