@sapui5/sap.fe.macros 1.139.0 → 1.141.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 (254) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Chart.js +53 -2
  4. package/src/sap/fe/macros/Chart.tsx +55 -0
  5. package/src/sap/fe/macros/CollaborativeDraftHandler.js +230 -0
  6. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +218 -0
  7. package/src/sap/fe/macros/CommonHelper.js +59 -15
  8. package/src/sap/fe/macros/CommonHelper.ts +65 -14
  9. package/src/sap/fe/macros/ConditionalSwitch.js +174 -0
  10. package/src/sap/fe/macros/ConditionalSwitch.tsx +141 -0
  11. package/src/sap/fe/macros/ConditionalSwitchProperty.js +78 -0
  12. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +62 -0
  13. package/src/sap/fe/macros/Field.js +78 -64
  14. package/src/sap/fe/macros/Field.ts +97 -68
  15. package/src/sap/fe/macros/FooterContent.js +5 -2
  16. package/src/sap/fe/macros/FooterContent.tsx +4 -1
  17. package/src/sap/fe/macros/MacroAPI.js +9 -4
  18. package/src/sap/fe/macros/MacroAPI.ts +9 -4
  19. package/src/sap/fe/macros/MessageButton.js +1 -2
  20. package/src/sap/fe/macros/MessageButton.tsx +0 -1
  21. package/src/sap/fe/macros/MultiValueField.js +10 -7
  22. package/src/sap/fe/macros/MultiValueField.tsx +7 -3
  23. package/src/sap/fe/macros/Page.js +5 -7
  24. package/src/sap/fe/macros/Page.tsx +4 -6
  25. package/src/sap/fe/macros/Paginator.js +9 -4
  26. package/src/sap/fe/macros/Paginator.tsx +12 -3
  27. package/src/sap/fe/macros/RichTextEditor.js +3 -2
  28. package/src/sap/fe/macros/RichTextEditor.tsx +2 -1
  29. package/src/sap/fe/macros/Share.js +14 -2
  30. package/src/sap/fe/macros/Share.tsx +13 -0
  31. package/src/sap/fe/macros/Status.js +251 -0
  32. package/src/sap/fe/macros/Status.tsx +212 -0
  33. package/src/sap/fe/macros/ValueHelp.js +4 -28
  34. package/src/sap/fe/macros/ValueHelp.tsx +2 -42
  35. package/src/sap/fe/macros/ai/EasyFillDialog.js +11 -17
  36. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +11 -16
  37. package/src/sap/fe/macros/ai/EasyFilterBar.js +246 -97
  38. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +302 -106
  39. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +76 -33
  40. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +89 -40
  41. package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
  42. package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
  43. package/src/sap/fe/macros/chart/Chart.js +2 -2
  44. package/src/sap/fe/macros/chart/Chart.tsx +1 -1
  45. package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
  46. package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
  47. package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
  48. package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
  49. package/src/sap/fe/macros/chart/MdcChartTemplate.js +5 -5
  50. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -5
  51. package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.js +9 -2
  52. package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.tsx +8 -0
  53. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +5 -1
  54. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +4 -0
  55. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +4 -2
  56. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +3 -1
  57. package/src/sap/fe/macros/controls/FilterBar.js +14 -5
  58. package/src/sap/fe/macros/controls/FilterBar.ts +3 -0
  59. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
  60. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
  61. package/src/sap/fe/macros/controls/RadioButtons.js +61 -38
  62. package/src/sap/fe/macros/controls/RadioButtons.tsx +39 -18
  63. package/src/sap/fe/macros/controls/Section.js +4 -3
  64. package/src/sap/fe/macros/controls/Section.ts +3 -2
  65. package/src/sap/fe/macros/controls/section/SubSection.js +63 -8
  66. package/src/sap/fe/macros/controls/section/SubSection.ts +67 -1
  67. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
  68. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
  69. package/src/sap/fe/macros/designtime/Designtime.helper.js +28 -1
  70. package/src/sap/fe/macros/designtime/Designtime.helper.ts +27 -0
  71. package/src/sap/fe/macros/field/Field.js +2 -2
  72. package/src/sap/fe/macros/field/Field.tsx +1 -1
  73. package/src/sap/fe/macros/field/FieldBaseDelegate.js +13 -7
  74. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +12 -8
  75. package/src/sap/fe/macros/field/FieldFormatOptions.js +25 -2
  76. package/src/sap/fe/macros/field/FieldFormatOptions.ts +13 -0
  77. package/src/sap/fe/macros/field/FieldHelper.js +2 -2
  78. package/src/sap/fe/macros/field/FieldHelper.ts +1 -4
  79. package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
  80. package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
  81. package/src/sap/fe/macros/field/FieldTemplating.js +3 -3
  82. package/src/sap/fe/macros/field/FieldTemplating.ts +4 -2
  83. package/src/sap/fe/macros/filter/FilterUtils.js +233 -5
  84. package/src/sap/fe/macros/filter/FilterUtils.ts +291 -7
  85. package/src/sap/fe/macros/filterBar/FilterBar.block.js +5 -3
  86. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +4 -2
  87. package/src/sap/fe/macros/filterBar/FilterBar.js +2 -2
  88. package/src/sap/fe/macros/filterBar/FilterBar.tsx +1 -1
  89. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +63 -27
  90. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +49 -3
  91. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +5 -3
  92. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +5 -2
  93. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +7 -2
  94. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +6 -1
  95. package/src/sap/fe/macros/form/Form.block.js +7 -8
  96. package/src/sap/fe/macros/form/Form.block.ts +4 -6
  97. package/src/sap/fe/macros/form/Form.js +1 -4
  98. package/src/sap/fe/macros/form/Form.tsx +0 -3
  99. package/src/sap/fe/macros/form/FormContainer.block.js +555 -5
  100. package/src/sap/fe/macros/form/FormContainer.block.ts +665 -7
  101. package/src/sap/fe/macros/form/FormContainer.fragment.xml +1 -0
  102. package/src/sap/fe/macros/form/FormDelegate.js +24 -8
  103. package/src/sap/fe/macros/form/FormDelegate.ts +29 -7
  104. package/src/sap/fe/macros/form/FormHelper.js +1 -2
  105. package/src/sap/fe/macros/form/FormHelper.ts +0 -1
  106. package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
  107. package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
  108. package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
  109. package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
  110. package/src/sap/fe/macros/internal/DataPoint.js +3 -2
  111. package/src/sap/fe/macros/internal/DataPoint.tsx +10 -1
  112. package/src/sap/fe/macros/internal/FilterField.block.js +19 -5
  113. package/src/sap/fe/macros/internal/FilterField.block.ts +16 -4
  114. package/src/sap/fe/macros/internal/field/DisplayStyle.js +9 -3
  115. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +10 -2
  116. package/src/sap/fe/macros/internal/field/EditStyle.js +21 -4
  117. package/src/sap/fe/macros/internal/field/EditStyle.tsx +18 -4
  118. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +3 -2
  119. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +5 -1
  120. package/src/sap/fe/macros/internal/filterField/FilterFieldTemplate.fragment.xml +1 -0
  121. package/src/sap/fe/macros/internal/helpers/ActionHelper.js +36 -5
  122. package/src/sap/fe/macros/internal/helpers/ActionHelper.ts +34 -4
  123. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
  124. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
  125. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
  126. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
  127. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  128. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +10 -3
  129. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +13 -2
  130. package/src/sap/fe/macros/library.js +1 -1
  131. package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.js +2 -1
  132. package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.ts +1 -0
  133. package/src/sap/fe/macros/messagebundle.properties +24 -4
  134. package/src/sap/fe/macros/messagebundle_ar.properties +8 -2
  135. package/src/sap/fe/macros/messagebundle_bg.properties +8 -2
  136. package/src/sap/fe/macros/messagebundle_ca.properties +11 -5
  137. package/src/sap/fe/macros/messagebundle_cnr.properties +8 -2
  138. package/src/sap/fe/macros/messagebundle_cs.properties +7 -1
  139. package/src/sap/fe/macros/messagebundle_cy.properties +9 -3
  140. package/src/sap/fe/macros/messagebundle_da.properties +8 -2
  141. package/src/sap/fe/macros/messagebundle_de.properties +13 -7
  142. package/src/sap/fe/macros/messagebundle_el.properties +7 -1
  143. package/src/sap/fe/macros/messagebundle_en.properties +11 -5
  144. package/src/sap/fe/macros/messagebundle_en_GB.properties +9 -3
  145. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +11 -5
  146. package/src/sap/fe/macros/messagebundle_es.properties +10 -4
  147. package/src/sap/fe/macros/messagebundle_es_MX.properties +11 -5
  148. package/src/sap/fe/macros/messagebundle_et.properties +9 -3
  149. package/src/sap/fe/macros/messagebundle_fi.properties +7 -1
  150. package/src/sap/fe/macros/messagebundle_fr.properties +9 -3
  151. package/src/sap/fe/macros/messagebundle_fr_CA.properties +8 -2
  152. package/src/sap/fe/macros/messagebundle_hi.properties +8 -2
  153. package/src/sap/fe/macros/messagebundle_hr.properties +8 -2
  154. package/src/sap/fe/macros/messagebundle_hu.properties +7 -1
  155. package/src/sap/fe/macros/messagebundle_id.properties +15 -9
  156. package/src/sap/fe/macros/messagebundle_it.properties +7 -1
  157. package/src/sap/fe/macros/messagebundle_iw.properties +8 -2
  158. package/src/sap/fe/macros/messagebundle_ja.properties +13 -7
  159. package/src/sap/fe/macros/messagebundle_kk.properties +11 -5
  160. package/src/sap/fe/macros/messagebundle_ko.properties +8 -2
  161. package/src/sap/fe/macros/messagebundle_lt.properties +9 -3
  162. package/src/sap/fe/macros/messagebundle_lv.properties +8 -2
  163. package/src/sap/fe/macros/messagebundle_mk.properties +8 -2
  164. package/src/sap/fe/macros/messagebundle_ms.properties +7 -1
  165. package/src/sap/fe/macros/messagebundle_nl.properties +7 -1
  166. package/src/sap/fe/macros/messagebundle_no.properties +7 -1
  167. package/src/sap/fe/macros/messagebundle_pl.properties +8 -2
  168. package/src/sap/fe/macros/messagebundle_pt.properties +7 -1
  169. package/src/sap/fe/macros/messagebundle_pt_PT.properties +7 -1
  170. package/src/sap/fe/macros/messagebundle_ro.properties +8 -2
  171. package/src/sap/fe/macros/messagebundle_ru.properties +10 -4
  172. package/src/sap/fe/macros/messagebundle_sh.properties +8 -2
  173. package/src/sap/fe/macros/messagebundle_sk.properties +7 -1
  174. package/src/sap/fe/macros/messagebundle_sl.properties +7 -1
  175. package/src/sap/fe/macros/messagebundle_sr.properties +8 -2
  176. package/src/sap/fe/macros/messagebundle_sv.properties +7 -1
  177. package/src/sap/fe/macros/messagebundle_th.properties +8 -2
  178. package/src/sap/fe/macros/messagebundle_tr.properties +7 -1
  179. package/src/sap/fe/macros/messagebundle_uk.properties +10 -4
  180. package/src/sap/fe/macros/messagebundle_vi.properties +10 -4
  181. package/src/sap/fe/macros/messagebundle_zh_CN.properties +7 -1
  182. package/src/sap/fe/macros/messagebundle_zh_TW.properties +8 -2
  183. package/src/sap/fe/macros/messages/MessageButton.js +39 -18
  184. package/src/sap/fe/macros/messages/MessageButton.ts +42 -19
  185. package/src/sap/fe/macros/messages/MessagePopover.js +4 -2
  186. package/src/sap/fe/macros/messages/MessagePopover.ts +6 -4
  187. package/src/sap/fe/macros/microchart/MicroChart.js +2 -2
  188. package/src/sap/fe/macros/microchart/MicroChart.tsx +1 -1
  189. package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
  190. package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
  191. package/src/sap/fe/macros/microchart/MicroChartHelper.js +2 -3
  192. package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +1 -2
  193. package/src/sap/fe/macros/share/ShareAPI.js +4 -29
  194. package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
  195. package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
  196. package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
  197. package/src/sap/fe/macros/table/ActionsTemplating.js +4 -8
  198. package/src/sap/fe/macros/table/ActionsTemplating.tsx +5 -8
  199. package/src/sap/fe/macros/table/BasicSearch.js +1 -1
  200. package/src/sap/fe/macros/table/BasicSearch.ts +2 -1
  201. package/src/sap/fe/macros/table/Column.js +14 -2
  202. package/src/sap/fe/macros/table/Column.ts +7 -0
  203. package/src/sap/fe/macros/table/ColumnExportSettings.js +83 -15
  204. package/src/sap/fe/macros/table/ColumnExportSettings.ts +44 -0
  205. package/src/sap/fe/macros/table/ColumnOverride.js +14 -2
  206. package/src/sap/fe/macros/table/ColumnOverride.ts +7 -0
  207. package/src/sap/fe/macros/table/MdcTableTemplate.js +7 -5
  208. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +21 -11
  209. package/src/sap/fe/macros/table/QuickFilterSelector.js +12 -3
  210. package/src/sap/fe/macros/table/QuickFilterSelector.tsx +15 -2
  211. package/src/sap/fe/macros/table/Table.block.js +188 -147
  212. package/src/sap/fe/macros/table/Table.block.tsx +41 -11
  213. package/src/sap/fe/macros/table/Table.js +16 -10
  214. package/src/sap/fe/macros/table/Table.tsx +16 -10
  215. package/src/sap/fe/macros/table/TableAPI.js +224 -184
  216. package/src/sap/fe/macros/table/TableAPI.ts +63 -19
  217. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -6
  218. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +5 -4
  219. package/src/sap/fe/macros/table/TableHelper.js +2 -3
  220. package/src/sap/fe/macros/table/TableHelper.ts +1 -2
  221. package/src/sap/fe/macros/table/TableRuntime.js +24 -5
  222. package/src/sap/fe/macros/table/TableRuntime.ts +31 -3
  223. package/src/sap/fe/macros/table/TreeTable.js +16 -10
  224. package/src/sap/fe/macros/table/TreeTable.tsx +16 -10
  225. package/src/sap/fe/macros/table/Utils.js +8 -3
  226. package/src/sap/fe/macros/table/Utils.ts +12 -3
  227. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
  228. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
  229. package/src/sap/fe/macros/table/delegates/TableDelegate.js +69 -34
  230. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +75 -33
  231. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
  232. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
  233. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +10 -10
  234. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +11 -9
  235. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -12
  236. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +11 -10
  237. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +34 -4
  238. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +45 -2
  239. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +55 -12
  240. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +71 -9
  241. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +53 -2
  242. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +55 -0
  243. package/src/sap/fe/macros/table/mixin/TableExport.js +22 -3
  244. package/src/sap/fe/macros/table/mixin/TableExport.ts +25 -4
  245. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +5 -1
  246. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +7 -0
  247. package/src/sap/fe/macros/table/mixin/TableSharing.js +4 -2
  248. package/src/sap/fe/macros/table/mixin/TableSharing.ts +10 -1
  249. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +36 -10
  250. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +44 -9
  251. package/src/sap/fe/macros/visualfilters/VisualFilter.js +5 -4
  252. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +3 -2
  253. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +2 -3
  254. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +1 -2
@@ -31,6 +31,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
31
31
  const oBaseType = TypeMap.getBaseType(oDataClass, {}, {});
32
32
  return FilterOperatorUtil.getOperatorsForType(oBaseType);
33
33
  }
34
+
35
+ /**
36
+ * Helper function to check if an operator is excluded by manifest configuration.
37
+ * @param operatorName The operator name to check
38
+ * @param oSettings The settings object containing operator configuration
39
+ * @returns True if the operator is excluded, false otherwise
40
+ */
41
+ function _isOperatorExcludedByManifest(operatorName, oSettings) {
42
+ if (!oSettings?.operatorConfiguration) return false;
43
+ return oSettings.operatorConfiguration.some(config => config.path === "key" && config.equals === operatorName && config.exclude === true);
44
+ }
45
+
46
+ /**
47
+ * Helper function to get Empty/NotEmpty operators with manifest configuration support.
48
+ * @param sType The field type
49
+ * @param oSettings The settings object containing operator configuration
50
+ * @returns Array of Empty/NotEmpty operators if not excluded by manifest
51
+ */
52
+ function _getEmptyOps(sType, oSettings) {
53
+ // Only return Empty/NotEmpty for date types
54
+ if (sType !== "Edm.Date" && sType !== "Edm.DateTimeOffset") {
55
+ return [];
56
+ }
57
+ const result = [];
58
+
59
+ // Check manifest configuration and add operators in correct order (NotEmpty first to match test expectations)
60
+ const notEmptyExcluded = _isOperatorExcludedByManifest("NotEmpty", oSettings);
61
+ const emptyExcluded = _isOperatorExcludedByManifest("Empty", oSettings);
62
+ if (!notEmptyExcluded) {
63
+ result.push("NotEmpty");
64
+ }
65
+ if (!emptyExcluded) {
66
+ result.push("Empty");
67
+ }
68
+ return result;
69
+ }
34
70
  const ValueColor = mLibrary.ValueColor;
35
71
  const CommonHelper = {
36
72
  getPathToKey: function (oCtx) {
@@ -524,6 +560,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
524
560
  * To fetch measure attribute index.
525
561
  * @param iMeasure Chart Annotations
526
562
  * @param oChartAnnotations Chart Annotations
563
+ * @param isMicroChart Whether this is a micro chart
527
564
  * @returns MeasureAttribute index.
528
565
  * @private
529
566
  */
@@ -747,6 +784,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
747
784
  const bSemanticDateRange = bUseSemanticDateRange === "true" || bUseSemanticDateRange === true;
748
785
  let aSemanticDateOps = [];
749
786
  const oSettings = settings && typeof settings === "string" ? JSON.parse(settings).customData : settings;
787
+
788
+ // Initialize Empty/NotEmpty operators based on field type and manifest settings
789
+ const emptyOps = _getEmptyOps(sType || "", oSettings);
750
790
  if (oContext.getObject(`${sEntitySetPath}/@com.sap.vocabularies.Common.v1.ResultContext`) === true) {
751
791
  return aEqualsOps;
752
792
  }
@@ -775,7 +815,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
775
815
  switch (sAllowedExpression) {
776
816
  case "SingleValue":
777
817
  const singleValueDateOps = DefaultSemanticDateOperators.getSingleValueDateOperations();
778
- const aSingleValueOps = sType === "Edm.Date" && bSemanticDateRange ? singleValueDateOps : aEqualsOps;
818
+ let aSingleValueOps;
819
+ if (sType === "Edm.Date" && bSemanticDateRange) {
820
+ aSingleValueOps = [...singleValueDateOps, ...emptyOps];
821
+ } else if (sType === "Edm.Date" || sType === "Edm.DateTimeOffset") {
822
+ aSingleValueOps = [...aEqualsOps, ...emptyOps]; // ["EQ", "Empty", "NotEmpty"]
823
+ } else {
824
+ aSingleValueOps = aEqualsOps; // ["EQ"]
825
+ }
779
826
  restrictions = _getRestrictions(supportedOperators, aSingleValueOps);
780
827
  break;
781
828
  case "MultiValue":
@@ -784,24 +831,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
784
831
  break;
785
832
  case "SingleRange":
786
833
  let aExpressionOps;
787
- if (bSemanticDateRange) {
788
- if (sType === "Edm.Date") {
789
- aExpressionOps = aSemanticDateOps;
790
- } else if (sType === "Edm.DateTimeOffset") {
791
- aExpressionOps = aSemanticDateOps;
792
- } else {
793
- aExpressionOps = aSingleRangeOps;
794
- }
834
+ if (bSemanticDateRange && (sType === "Edm.Date" || sType === "Edm.DateTimeOffset")) {
835
+ // Only Edm.Date and Edm.DateTimeOffset get semantic operators
836
+ aExpressionOps = [...aSemanticDateOps, ...emptyOps];
795
837
  } else if (sType === "Edm.DateTimeOffset") {
796
- aExpressionOps = aSingleRangeDTBasicOps;
838
+ aExpressionOps = [...aSingleRangeDTBasicOps, ...emptyOps];
839
+ } else if (sType === "Edm.Date") {
840
+ aExpressionOps = [...aSingleRangeOps, ...emptyOps];
797
841
  } else {
798
842
  aExpressionOps = aSingleRangeOps;
799
843
  }
800
- const sOperators = _getRestrictions(supportedOperators, aExpressionOps);
801
- restrictions = sOperators;
844
+ restrictions = _getRestrictions(supportedOperators, aExpressionOps);
802
845
  break;
803
846
  case "MultiRange":
804
- restrictions = _getRestrictions(supportedOperators, aMultiRangeOps);
847
+ const multiRangeOps = sType === "Edm.Date" || sType === "Edm.DateTimeOffset" ? [...aMultiRangeOps, ...emptyOps] : aMultiRangeOps;
848
+ restrictions = _getRestrictions(supportedOperators, multiRangeOps);
805
849
  break;
806
850
  case "SearchExpression":
807
851
  restrictions = _getRestrictions(supportedOperators, aSearchExpressionOps);
@@ -821,7 +865,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
821
865
  // In case AllowedExpressions is not provided for type Edm.Date then all the default
822
866
  // operators for the type should be returned excluding semantic operators from the list.
823
867
  const aDefaultOperators = _getDefaultOperators(propertyType);
824
- const aMultiRangeOps = ["EQ", "GE", "LE", "LT", "GT", "BT", "NE", "NOTBT", "NOTLE", "NOTLT", "NOTGE", "NOTGT"];
868
+ const aMultiRangeOps = ["EQ", "GE", "LE", "LT", "GT", "BT", "NE", "NOTBT", "NOTLE", "NOTLT", "NOTGE", "NOTGT", "Empty", "NotEmpty"];
825
869
  return _getRestrictions(aDefaultOperators, aMultiRangeOps);
826
870
  },
827
871
  getAIIcon: function () {
@@ -831,4 +875,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/core/Common
831
875
  CommonHelper.getSortConditions.requiresIContext = true;
832
876
  return CommonHelper;
833
877
  }, false);
834
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2V0UmVzdHJpY3Rpb25zIiwiYURlZmF1bHRPcHMiLCJhRXhwcmVzc2lvbk9wcyIsImZpbHRlciIsInNFbGVtZW50IiwiaW5jbHVkZXMiLCJfZ2V0RGVmYXVsdE9wZXJhdG9ycyIsInNQcm9wZXJ0eVR5cGUiLCJvRGF0YUNsYXNzIiwiVHlwZU1hcCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiVmFsdWVDb2xvciIsIm1MaWJyYXJ5IiwiQ29tbW9uSGVscGVyIiwiZ2V0UGF0aFRvS2V5Iiwib0N0eCIsImdldE9iamVjdCIsImdldFBhcmFtZXRlckVkaXRNb2RlIiwidGFyZ2V0Iiwib0ludGVyZmFjZSIsIm9Nb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsInNQcm9wZXJ0eVBhdGgiLCJnZXRQYXRoIiwib0Fubm90YXRpb25zIiwiZmllbGRDb250cm9sIiwiaW1tdXRhYmxlIiwiY29tcHV0ZWQiLCJzRWRpdE1vZGUiLCJGaWVsZEVkaXRNb2RlIiwiRWRpdGFibGUiLCJSZWFkT25seSIsIiRFbnVtTWVtYmVyIiwiRGlzYWJsZWQiLCIkUGF0aCIsImdldE1ldGFQYXRoIiwidW5kZWZpbmVkIiwiZ2V0TWV0YU1vZGVsSWQiLCJjb252ZXJ0VHlwZXMiLCJnZXRJZCIsImlzRGVza3RvcCIsIkRldmljZSIsInN5c3RlbSIsImRlc2t0b3AiLCJnZXRUYXJnZXRDb2xsZWN0aW9uUGF0aCIsIm5hdkNvbGxlY3Rpb24iLCJzUGF0aCIsIm1vZGVsIiwibWV0YU1vZGVsIiwiaXNBIiwiZ2V0TWV0YU1vZGVsIiwiYVBhcnRzIiwic3BsaXQiLCJzUGFydCIsImVudGl0eVNldCIsImxlbmd0aCIsIm5hdmlnYXRpb25Db2xsZWN0aW9uIiwic2xpY2UiLCJqb2luIiwiaXNQcm9wZXJ0eUZpbHRlcmFibGUiLCJvRGF0YUZpZWxkIiwic2tpcEhpZGRlbkZpbHRlcnMiLCJzUHJvcGVydHlMb2NhdGlvblBhdGgiLCJnZXRMb2NhdGlvbkZvclByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eSIsInJlcGxhY2UiLCIkVHlwZSIsImlMZW5ndGgiLCJzQ29sbGVjdGlvblBhdGgiLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJnb3RvQWN0aW9uUGFyYW1ldGVyIiwib0NvbnRleHQiLCJzUHJvcGVydHlOYW1lIiwiQ29tbW9uVXRpbHMiLCJnZXRQYXJhbWV0ZXJQYXRoIiwiZ2V0RW50aXR5U2V0TmFtZSIsIm9NZXRhTW9kZWwiLCJzRW50aXR5VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJrZXkiLCJnZXRBY3Rpb25QYXRoIiwib0FjdGlvbiIsImJSZXR1cm5Pbmx5UGF0aCIsInNBY3Rpb25OYW1lIiwiYkNoZWNrU3RhdGljVmFsdWUiLCJzQ29udGV4dFBhdGgiLCJzRW50aXR5VHlwZU5hbWUiLCJzRW50aXR5TmFtZSIsInNCaW5kaW5nUGFyYW1ldGVyIiwiZ2V0TmF2aWdhdGlvbkNvbnRleHQiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiYktlZXBQcm9wZXJ0eSIsImJTdGFydHNXaXRoRW50aXR5VHlwZSIsInN0YXJ0c1dpdGgiLCJwYXJ0Iiwic2hpZnQiLCJwb3AiLCJnZXRBY3Rpb25Db250ZXh0IiwiZ2V0UGF0aFRvQm91bmRBY3Rpb25PdmVybG9hZCIsImFkZFNpbmdsZVF1b3RlcyIsInNWYWx1ZSIsImJFc2NhcGUiLCJlc2NhcGVTaW5nbGVRdW90ZXMiLCJnZW5lcmF0ZUZ1bmN0aW9uIiwic0Z1bmNOYW1lIiwic1BhcmFtcyIsImkiLCJhcmd1bWVudHMiLCJzRnVuY3Rpb24iLCJnZXRIZWFkZXJEYXRhUG9pbnRMaW5rVmlzaWJpbGl0eSIsInBhdGgiLCJpc0NsaWNrYWJsZSIsImNvbXBpbGVFeHByZXNzaW9uIiwiaWZFbHNlIiwiY29uc3RhbnQiLCJlcXVhbCIsInBhdGhJbk1vZGVsIiwibm90RXF1YWwiLCJvYmplY3RUb1N0cmluZyIsIm9QYXJhbXMiLCJpTnVtYmVyT2ZLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNLZXkiLCJyZW1vdmVFc2NhcGVDaGFyYWN0ZXJzIiwic0V4cHJlc3Npb24iLCJzdHJpbmdpZnlPYmplY3QiLCJzU3RyaW5naWZpZWQiLCJvT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1VJNU9iamVjdCIsInVpNW9iamVjdCIsImFzc2lnbiIsInN0cmluZ2lmeSIsInNUeXBlIiwiTG9nIiwiZXJyb3IiLCJFcnJvciIsInN0cmluZ2lmeUN1c3RvbURhdGEiLCJ2RGF0YSIsIkNvbnRleHQiLCJwYXJzZUN1c3RvbURhdGEiLCJoYXNPd25Qcm9wZXJ0eSIsImdldENvbnRleHRQYXRoIiwib1ZhbHVlIiwiZ2V0U29ydENvbmRpdGlvbnMiLCJvUHJlc2VudGF0aW9uVmFyaWFudCIsInNQcmVzZW50YXRpb25WYXJpYW50UGF0aCIsIl9pc1ByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiU29ydE9yZGVyIiwiYVNvcnRDb25kaXRpb25zIiwic29ydGVycyIsInNFbnRpdHlQYXRoIiwiZm9yRWFjaCIsIm9Db25kaXRpb24iLCJvU29ydFByb3BlcnR5Iiwib1NvcnRlciIsIkR5bmFtaWNQcm9wZXJ0eSIsIiRBbm5vdGF0aW9uUGF0aCIsIk5hbWUiLCJQcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJuYW1lIiwiZGVzY2VuZGluZyIsIkRlc2NlbmRpbmciLCJwdXNoIiwiYW5ub3RhdGlvblBhdGgiLCJjcmVhdGVQcmVzZW50YXRpb25QYXRoQ29udGV4dCIsIm9QcmVzZW50YXRpb25Db250ZXh0IiwiYVBhdGhzIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJnZXRQcmVzc0hhbmRsZXJGb3JEYXRhRmllbGRGb3JJQk4iLCJzQ29udGV4dCIsImJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2ciLCJmb3JDb250ZXh0TWVudSIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm5hdmlnYXRpb25Db250ZXh0cyIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsImFwcGxpY2FibGVQcm9wZXJ0eSIsIm5vdEFwcGxpY2FibGVQcm9wZXJ0eSIsImFwcGxpY2FibGVDb250ZXh0cyIsIlNlbWFudGljT2JqZWN0IiwiQWN0aW9uIiwibm90QXBwbGljYWJsZUNvbnRleHRzIiwibGFiZWwiLCJMYWJlbCIsIk1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJnZXRFbnRpdHlTZXQiLCJNb2RlbEhlbHBlciIsImdldEVudGl0eVNldFBhdGgiLCJnZXRDcml0aWNhbGl0eUNhbGN1bGF0aW9uQmluZGluZyIsInNJbXByb3ZlbWVudERpcmVjdGlvbiIsInNEZXZpYXRpb25Mb3ciLCJzVG9sZXJhbmNlTG93Iiwic0FjY2VwdGFuY2VMb3ciLCJzQWNjZXB0YW5jZUhpZ2giLCJzVG9sZXJhbmNlSGlnaCIsInNEZXZpYXRpb25IaWdoIiwic0NyaXRpY2FsaXR5RXhwcmVzc2lvbiIsIk5ldXRyYWwiLCJJbmZpbml0eSIsIkdvb2QiLCJDcml0aWNhbCIsIndhcm5pbmciLCJnZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgiLCJpTWVhc3VyZSIsIm9DaGFydEFubm90YXRpb25zIiwiaXNNaWNyb0NoYXJ0IiwiYU1lYXN1cmVzIiwic01lYXN1cmVQcm9wZXJ0eVBhdGgiLCJNZWFzdXJlcyIsInZhbHVlIiwiRHluYW1pY01lYXN1cmVzIiwiYk1lYXN1cmVBdHRyaWJ1dGVFeGlzdHMiLCJhTWVhc3VyZUF0dHJpYnV0ZXMiLCJNZWFzdXJlQXR0cmlidXRlcyIsImlNZWFzdXJlQXR0cmlidXRlIiwiZm5DaGVja01lYXN1cmUiLCJzTWVhc3VyZVBhdGgiLCJvTWVhc3VyZUF0dHJpYnV0ZSIsImluZGV4IiwiTWVhc3VyZSIsIkR5bmFtaWNNZWFzdXJlIiwic29tZSIsImJpbmQiLCJnZXRNZWFzdXJlQXR0cmlidXRlIiwic0NoYXJ0QW5ub3RhdGlvblBhdGgiLCJyZXF1ZXN0T2JqZWN0IiwidGhlbiIsInNNZWFzdXJlQXR0cmlidXRlUGF0aCIsIkRhdGFQb2ludCIsImdldE1lYXN1cmVBdHRyaWJ1dGVGb3JNZWFzdXJlIiwic3Vic3RyaW5nIiwiaXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50Iiwib1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCIsIm9UYWJsZU1ldGFkYXRhIiwicGFyZW50RW50aXR5U2V0Iiwic1BhcmVudEVudGl0eVNldFBhdGgiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsImdldERhdGFGcm9tVGVtcGxhdGUiLCJkYXRhRWxlbWVudCIsInNwbGl0UGF0aCIsImRhdGFLZXkiLCJjb25uZWN0ZWREYXRhUGF0aCIsImNvbm5lY3RlZE9iamVjdCIsInRlbXBsYXRlIiwiVGVtcGxhdGUiLCJzcGxpdFRlbXAiLCJ0ZW1wQXJyYXkiLCJ0cmltIiwiRGF0YSIsIm5vdExhc3RJbmRleCIsImVsZW1lbnQiLCJpc0xhc3RJbmRleCIsInRlbXBsYXRlSW5mbyIsImxhc3RJbmRleCIsImdldERlbGltaXRlciIsInNldE1ldGFNb2RlbCIsImdldFBhcmFtZXRlcnMiLCJvUGFyYW1ldGVySW5mbyIsImdldFBhcmFtZXRlckluZm8iLCJwYXJhbWV0ZXJQcm9wZXJ0aWVzIiwiYnVpbGRBY3Rpb25XcmFwcGVyIiwib1RoaXMiLCJhUGFyYW1zIiwicmVmIiwiaGFuZGxlck1vZHVsZSIsImhhbmRsZXJNZXRob2QiLCJpZCIsImludGVybmFsTW9kZWxQYXRoIiwib0FkZGl0aW9uYWxQYXJhbXMiLCJjb250ZXh0cyIsImZuIiwiZ2V0SGlkZGVuUGF0aEV4cHJlc3Npb24iLCJkYXRhRmllbGRBbm5vdGF0aW9ucyIsImhpZGRlbiIsImdldE9wZXJhdG9yc0ZvclByb3BlcnR5Iiwic0VudGl0eVNldFBhdGgiLCJiVXNlU2VtYW50aWNEYXRlUmFuZ2UiLCJzZXR0aW5ncyIsIm9GaWx0ZXJSZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgiLCJhRXF1YWxzT3BzIiwiYVNpbmdsZVJhbmdlT3BzIiwiYVNpbmdsZVJhbmdlRFRCYXNpY09wcyIsImFNdWx0aVJhbmdlT3BzIiwiYVNlYXJjaEV4cHJlc3Npb25PcHMiLCJhQmFzaWNTZW1hbnRpY0RhdGVPcHMiLCJTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJnZXRCYXNpY1NlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJiU2VtYW50aWNEYXRlUmFuZ2UiLCJhU2VtYW50aWNEYXRlT3BzIiwib1NldHRpbmdzIiwiY3VzdG9tRGF0YSIsIm9wZXJhdG9yQ29uZmlndXJhdGlvbiIsImdldEZpbHRlck9wZXJhdGlvbnMiLCJEZWZhdWx0U2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiZ2V0U2VtYW50aWNEYXRlT3BlcmF0aW9ucyIsImFEZWZhdWx0T3BlcmF0b3JzIiwic3VwcG9ydGVkT3BlcmF0b3JzIiwiZXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJFeHRlbmRlZFNlbWFudGljRGF0ZU9wZXJhdG9ycyIsInJlc3RyaWN0aW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsInNBbGxvd2VkRXhwcmVzc2lvbiIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJzaW5nbGVWYWx1ZURhdGVPcHMiLCJnZXRTaW5nbGVWYWx1ZURhdGVPcGVyYXRpb25zIiwiYVNpbmdsZVZhbHVlT3BzIiwibXVsdGlWYWx1ZU9wZXJhdG9ycyIsInNPcGVyYXRvcnMiLCJjb25jYXQiLCJnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHkiLCJwcm9wZXJ0eVR5cGUiLCJnZXRBSUljb24iLCJhaUljb24iLCJyZXF1aXJlc0lDb250ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb21tb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuXHRDaGFydCxcblx0Q2hhcnRNZWFzdXJlQXR0cmlidXRlVHlwZSxcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0UHJlc2VudGF0aW9uVmFyaWFudFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGNvbnN0YW50LCBlcXVhbCwgZm4sIGlmRWxzZSwgbm90RXF1YWwsIHBhdGhJbk1vZGVsLCByZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyU2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5cbmltcG9ydCB0eXBlIHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBhaUljb24sIHR5cGUgQ3VzdG9tQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5RmlsdGVyYWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgKiBhcyBEZWZhdWx0U2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlckJhci9EZWZhdWx0U2VtYW50aWNEYXRlT3BlcmF0b3JzXCI7XG5pbXBvcnQgRXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyQmFyL0V4dGVuZGVkU2VtYW50aWNEYXRlT3BlcmF0b3JzXCI7XG5pbXBvcnQgU2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlckJhci9TZW1hbnRpY0RhdGVPcGVyYXRvcnNcIjtcbmltcG9ydCBtTGlicmFyeSBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yVXRpbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vRmlsdGVyT3BlcmF0b3JVdGlsXCI7XG5pbXBvcnQgRmllbGRFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9GaWVsZEVkaXRNb2RlXCI7XG5pbXBvcnQgVHlwZU1hcCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0Fubm90YXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbnR5cGUgTWV0YU1vZGVsTWVhc3VyZSA9IHtcblx0JFByb3BlcnR5UGF0aDogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wczogc3RyaW5nW10sIGFFeHByZXNzaW9uT3BzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0Ly8gRnJvbSB0aGUgZGVmYXVsdCBzZXQgb2YgT3BlcmF0b3JzIGZvciB0aGUgQmFzZSBUeXBlLCBzZWxlY3QgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgQWxsb3dlZCBWYWx1ZS5cblx0Ly8gSW4gY2FzZSB0aGF0IG5vIG9wZXJhdG9ycyBhcmUgZm91bmQsIHJldHVybiB1bmRlZmluZWQgc28gdGhhdCB0aGUgZGVmYXVsdCBzZXQgaXMgdXNlZC5cblx0cmV0dXJuIGFEZWZhdWx0T3BzLmZpbHRlcihmdW5jdGlvbiAoc0VsZW1lbnQpIHtcblx0XHRyZXR1cm4gYUV4cHJlc3Npb25PcHMuaW5jbHVkZXMoc0VsZW1lbnQpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gX2dldERlZmF1bHRPcGVyYXRvcnMoc1Byb3BlcnR5VHlwZT86IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Ly8gbWRjIGRlZmluZXMgdGhlIGZ1bGwgc2V0IG9mIG9wZXJhdGlvbnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBmb3IgZWFjaCBFZG0gVHlwZVxuXHQvLyBUT0RPIFJlcGxhY2Ugd2l0aCBtb2RlbCAvIGludGVybmFsIHdheSBvZiByZXRyaWV2aW5nIHRoZSBhY3R1YWwgbW9kZWwgdHlwZSB1c2VkIGZvciB0aGUgcHJvcGVydHlcblx0Y29uc3Qgb0RhdGFDbGFzcyA9IFR5cGVNYXAuZ2V0RGF0YVR5cGVDbGFzc05hbWUoc1Byb3BlcnR5VHlwZSk7XG5cdC8vIFRPRE8gbmVlZCB0byBwYXNzIHByb3BlciBmb3JtYXRPcHRpb25zLCBjb25zdHJhaW50cyBoZXJlXG5cdGNvbnN0IG9CYXNlVHlwZSA9IFR5cGVNYXAuZ2V0QmFzZVR5cGUob0RhdGFDbGFzcywge30sIHt9KTtcblx0cmV0dXJuIEZpbHRlck9wZXJhdG9yVXRpbC5nZXRPcGVyYXRvcnNGb3JUeXBlKG9CYXNlVHlwZSk7XG59XG5cbmNvbnN0IFZhbHVlQ29sb3IgPSBtTGlicmFyeS5WYWx1ZUNvbG9yO1xuY29uc3QgQ29tbW9uSGVscGVyID0ge1xuXHRnZXRQYXRoVG9LZXk6IGZ1bmN0aW9uIChvQ3R4OiBDb250ZXh0KTogb2JqZWN0IHtcblx0XHRyZXR1cm4gb0N0eC5nZXRPYmplY3QoKTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIGlmIGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gb0ludGVyZmFjZSBJbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHJldHVybnMgQSBCaW5kaW5nIEV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgZmllbGQgc2hvdWxkIGJlIGVkaXRhYmxlIG9yIG5vdC5cblx0ICovXG5cdGdldFBhcmFtZXRlckVkaXRNb2RlOiBmdW5jdGlvbiAodGFyZ2V0OiBvYmplY3QsIG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9Nb2RlbC5nZXRPYmplY3QoYCR7c1Byb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRmaWVsZENvbnRyb2wgPSBvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXSxcblx0XHRcdGltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0sXG5cdFx0XHRjb21wdXRlZCA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXTtcblxuXHRcdGxldCBzRWRpdE1vZGU6IEZpZWxkRWRpdE1vZGUgfCBzdHJpbmcgPSBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlO1xuXG5cdFx0aWYgKGltbXV0YWJsZSB8fCBjb21wdXRlZCkge1xuXHRcdFx0c0VkaXRNb2RlID0gRmllbGRFZGl0TW9kZS5SZWFkT25seTtcblx0XHR9IGVsc2UgaWYgKGZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kRW51bU1lbWJlcikge1xuXHRcdFx0XHRpZiAoZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCIpIHtcblx0XHRcdFx0XHRzRWRpdE1vZGUgPSBGaWVsZEVkaXRNb2RlLlJlYWRPbmx5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRmaWVsZENvbnRyb2wuJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGUvSW5hcHBsaWNhYmxlXCIgfHxcblx0XHRcdFx0XHRmaWVsZENvbnRyb2wuJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGUvSGlkZGVuXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c0VkaXRNb2RlID0gRmllbGRFZGl0TW9kZS5EaXNhYmxlZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kUGF0aCkge1xuXHRcdFx0XHRzRWRpdE1vZGUgPVxuXHRcdFx0XHRcdFwiez0gJXtcIiArXG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPCAzID8gKCV7XCIgK1xuXHRcdFx0XHRcdGZpZWxkQ29udHJvbC4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAwID8gJ1wiICtcblx0XHRcdFx0XHRGaWVsZEVkaXRNb2RlLkRpc2FibGVkICtcblx0XHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRcdEZpZWxkRWRpdE1vZGUuUmVhZE9ubHkgK1xuXHRcdFx0XHRcdFwiJykgOiAnXCIgK1xuXHRcdFx0XHRcdEZpZWxkRWRpdE1vZGUuRWRpdGFibGUgK1xuXHRcdFx0XHRcdFwiJ31cIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc0VkaXRNb2RlO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IHRoZSBjb21wbGV0ZSBtZXRhcGF0aCB0byB0aGUgdGFyZ2V0LlxuXHQgKiBAcGFyYW0gdGFyZ2V0XG5cdCAqIEBwYXJhbSBvSW50ZXJmYWNlXG5cdCAqIEByZXR1cm5zIFRoZSBtZXRhcGF0aFxuXHQgKi9cblx0Z2V0TWV0YVBhdGg6IGZ1bmN0aW9uICh0YXJnZXQ6IHVua25vd24sIG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCAmJiBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0UGF0aCgpKSB8fCB1bmRlZmluZWQ7XG5cdH0sXG5cdGdldE1ldGFNb2RlbElkOiBmdW5jdGlvbiAodGFyZ2V0OiBDb250ZXh0LCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBzdHJpbmcge1xuXHRcdGNvbnZlcnRUeXBlcyhvSW50ZXJmYWNlLmNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0cmV0dXJuIG9JbnRlcmZhY2UuY29udGV4dC5nZXRNb2RlbCgpLmdldElkKCk7XG5cdH0sXG5cdGlzRGVza3RvcDogZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBEZXZpY2Uuc3lzdGVtLmRlc2t0b3AgPT09IHRydWU7XG5cdH0sXG5cdGdldFRhcmdldENvbGxlY3Rpb25QYXRoOiBmdW5jdGlvbiAoY29udGV4dDogQ29udGV4dCwgbmF2Q29sbGVjdGlvbj86IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IHNQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKFxuXHRcdFx0KGNvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHQoY29udGV4dC5nZXRPYmplY3QoXCIkQ29udGFpbnNUYXJnZXRcIikgYXMgdW5rbm93biBhcyBib29sZWFuKSA9PT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwgfCBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5pc0E8T0RhdGFNZXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpID8gbW9kZWwgOiBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRzUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cblx0XHQvL1N1cHBvcnRpbmcgc1BhdGggb2YgYW55IGZvcm1hdCwgZWl0aGVyICcvPGVudGl0eVNldD4vPG5hdmlnYXRpb25Db2xsZWN0aW9uPicgPE9SPiAnLzxlbnRpdHlTZXQ+LyRUeXBlLzxuYXZpZ2F0aW9uQ29sbGVjdGlvbj4nXG5cdFx0Y29uc3QgYVBhcnRzID0gc1BhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihmdW5jdGlvbiAoc1BhcnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuICEhc1BhcnQgJiYgc1BhcnQgIT0gXCIkVHlwZVwiO1xuXHRcdH0pOyAvL2ZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBhbmQgcGFydHMgcmVmZXJyaW5nIHRvICckVHlwZSdcblx0XHRjb25zdCBlbnRpdHlTZXQgPSBgLyR7YVBhcnRzWzBdfWA7XG5cdFx0aWYgKGFQYXJ0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQ7XG5cdFx0fVxuXHRcdGNvbnN0IG5hdmlnYXRpb25Db2xsZWN0aW9uID0gbmF2Q29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkID8gYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpIDogbmF2Q29sbGVjdGlvbjtcblx0XHRyZXR1cm4gYCR7ZW50aXR5U2V0fS8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke25hdmlnYXRpb25Db2xsZWN0aW9ufWA7IC8vIHVzZWQgaW4gZ290b1RhcmdldEVudGl0eVNldCBtZXRob2QgaW4gdGhlIHNhbWUgZmlsZVxuXHR9LFxuXG5cdGlzUHJvcGVydHlGaWx0ZXJhYmxlOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRvRGF0YUZpZWxkPzogTWV0YU1vZGVsVHlwZTxEYXRhRmllbGRUeXBlcz4sXG5cdFx0c2tpcEhpZGRlbkZpbHRlcnM/OiBib29sZWFuXG5cdCk6IGJvb2xlYW4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0c1Byb3BlcnR5UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0Ly8gTG9hY2F0aW9uUGF0aCB3b3VsZCBiZSB0aGUgcHJlZml4IG9mIHNQcm9wZXJ0eVBhdGgsIGV4YW1wbGU6IHNQcm9wZXJ0eVBhdGggPSAnL0N1c3RvbWVyL1NldC9OYW1lJyAtPiBzUHJvcGVydHlMb2NhdGlvblBhdGggPSAnL0N1c3RvbWVyL1NldCdcblx0XHRcdHNQcm9wZXJ0eUxvY2F0aW9uUGF0aCA9IENvbW1vbkhlbHBlci5nZXRMb2NhdGlvbkZvclByb3BlcnR5UGF0aChvTW9kZWwsIHNQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0c1Byb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5yZXBsYWNlKGAke3NQcm9wZXJ0eUxvY2F0aW9uUGF0aH0vYCwgXCJcIik7XG5cblx0XHRpZiAoXG5cdFx0XHRvRGF0YUZpZWxkICYmXG5cdFx0XHQob0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb25cIiB8fFxuXHRcdFx0XHRvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc1Byb3BlcnR5RmlsdGVyYWJsZShvTW9kZWwsIHNQcm9wZXJ0eUxvY2F0aW9uUGF0aCwgc1Byb3BlcnR5LCBza2lwSGlkZGVuRmlsdGVycyk7XG5cdH0sXG5cblx0Z2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChvTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBpTGVuZ3RoO1xuXHRcdGxldCBzQ29sbGVjdGlvblBhdGggPSBzUHJvcGVydHlQYXRoLnNsaWNlKDAsIHNQcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRpZiAob01vZGVsLmdldE9iamVjdChgJHtzQ29sbGVjdGlvblBhdGh9LyRraW5kYCkgPT09IFwiRW50aXR5Q29udGFpbmVyXCIpIHtcblx0XHRcdGlMZW5ndGggPSBzQ29sbGVjdGlvblBhdGgubGVuZ3RoICsgMTtcblx0XHRcdHNDb2xsZWN0aW9uUGF0aCA9IHNQcm9wZXJ0eVBhdGguc2xpY2UoaUxlbmd0aCwgc1Byb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiLCBpTGVuZ3RoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBzQ29sbGVjdGlvblBhdGg7XG5cdH0sXG5cdGdvdG9BY3Rpb25QYXJhbWV0ZXI6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRzUHJvcGVydHlOYW1lID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXRofS8kTmFtZWApO1xuXG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLmdldFBhcmFtZXRlclBhdGgoc1BhdGgsIHNQcm9wZXJ0eU5hbWUpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZW50aXR5IHNldCBuYW1lIGZyb20gdGhlIGVudGl0eSB0eXBlIG5hbWUuXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIE9EYXRhIHY0IG1ldGFtb2RlbCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGUgRW50aXR5VHlwZSBvZiB0aGUgYWN0aW9tXG5cdCAqIEByZXR1cm5zIFRoZSBFbnRpdHlTZXQgb2YgdGhlIGJvdW5kIGFjdGlvblxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0RW50aXR5U2V0TmFtZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvRW50aXR5Q29udGFpbmVyID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRcdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRcdGlmICh0eXBlb2Ygb0VudGl0eUNvbnRhaW5lcltrZXldID09PSBcIm9iamVjdFwiICYmIG9FbnRpdHlDb250YWluZXJba2V5XS4kVHlwZSA9PT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIGtleTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG1ldGFtb2RlbCBwYXRoIGNvcnJlY3RseSBmb3IgYm91bmQgYWN0aW9ucyBpZiB1c2VkIHdpdGggYlJldHVybk9ubHlQYXRoIGFzIHRydWUsXG5cdCAqIGVsc2UgcmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaGFzIDMgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBhY3Rpb24uIFRoZXkgYXJlIHRoZSBlbnRpdHkgc2V0IG5hbWUsXG5cdCAqIHRoZSAkUGF0aCB2YWx1ZSBvZiB0aGUgT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb24gYW5kIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBuYW1lLiBJZlxuXHQgKiBiQ2hlY2tTdGF0aWNWYWx1ZSBpcyB0cnVlLCByZXR1cm5zIHRoZSBzdGF0aWMgdmFsdWUgb2YgT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb24sIGlmIHByZXNlbnQuXG5cdCAqIGUuZy4gZm9yIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvblxuXHQgKiBvZiBlbnRpdHkgc2V0IFNvbWVFbnRpdHlTZXQsIHRoZSBzdHJpbmcgXCIvU29tZUVudGl0eVNldC9zb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvblwiIGlzIHJldHVybmVkLlxuXHQgKiBAcGFyYW0gb0FjdGlvbiBUaGUgY29udGV4dCBvYmplY3Qgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gYlJldHVybk9ubHlQYXRoIElmIGZhbHNlLCBhZGRpdGlvbmFsIGluZm8gaXMgcmV0dXJuZWQgYWxvbmcgd2l0aCBtZXRhbW9kZWwgcGF0aCB0byB0aGUgYm91bmQgYWN0aW9uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYm91bmQgYWN0aW9uIG9mIHRoZSBmb3JtIHNvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uXG5cdCAqIEBwYXJhbSBiQ2hlY2tTdGF0aWNWYWx1ZSBJZiB0cnVlLCB0aGUgc3RhdGljIHZhbHVlIG9mIE9wZXJhdGlvbkF2YWlsYWJsZSBpcyByZXR1cm5lZCwgaWYgcHJlc2VudFxuXHQgKiBAcmV0dXJucyBUaGUgc3RyaW5nIG9yIG9iamVjdCBhcyBzcGVjaWZpZWQgYnkgYlJldHVybk9ubHlQYXRoXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXRoOiBmdW5jdGlvbiAoXG5cdFx0b0FjdGlvbjogQ29udGV4dCxcblx0XHRiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sXG5cdFx0c0FjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0YkNoZWNrU3RhdGljVmFsdWU/OiBib29sZWFuXG5cdCk6XG5cdFx0fCBzdHJpbmdcblx0XHR8IHtcblx0XHRcdFx0c0NvbnRleHRQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdHNQcm9wZXJ0eTogc3RyaW5nO1xuXHRcdFx0XHRzQmluZGluZ1BhcmFtZXRlcjogc3RyaW5nO1xuXHRcdCAgfSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9BY3Rpb24uZ2V0UGF0aCgpLnNwbGl0KFwiL0BcIilbMF07XG5cblx0XHRzQWN0aW9uTmFtZSA9ICFzQWN0aW9uTmFtZSA/IG9BY3Rpb24uZ2V0T2JqZWN0KG9BY3Rpb24uZ2V0UGF0aCgpKSA6IHNBY3Rpb25OYW1lO1xuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gYWN0aW9uIGJvdW5kIHRvIGFub3RoZXIgZW50aXR5IHR5cGVcblx0XHRcdHNBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpWzBdO1xuXHRcdH0gZWxzZSBpZiAob0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKSkge1xuXHRcdFx0Ly8gVE9ETzogdGhpcyBsb2dpYyBzb3VuZHMgd3JvbmcsIHRvIGJlIGNvcnJlY3RlZFxuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGVOYW1lID0gb0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKS4kVHlwZTtcblx0XHRcdGNvbnN0IHNFbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlTZXROYW1lKG9BY3Rpb24uZ2V0TW9kZWwoKSwgc0VudGl0eVR5cGVOYW1lKTtcblx0XHRcdGlmIChzRW50aXR5TmFtZSkge1xuXHRcdFx0XHRzQ29udGV4dFBhdGggPSBgLyR7c0VudGl0eU5hbWV9YDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNDb250ZXh0UGF0aDtcblx0XHR9XG5cblx0XHRpZiAoYkNoZWNrU3RhdGljVmFsdWUpIHtcblx0XHRcdHJldHVybiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWApO1xuXHRcdH1cblx0XHRpZiAoYlJldHVybk9ubHlQYXRoKSB7XG5cdFx0XHRyZXR1cm4gYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNDb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0XHRzUHJvcGVydHk6IG9BY3Rpb24uZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlLyRQYXRoYCksXG5cdFx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyOiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlci8wLyROYW1lYClcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdGdldE5hdmlnYXRpb25Db250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlci5nZXROYXZpZ2F0aW9uUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhvdXQgdGhlIGVudGl0eSB0eXBlIChwb3RlbnRpYWxseSBmaXJzdCkgYW5kIHByb3BlcnR5IChsYXN0KSBwYXJ0IChvcHRpb25hbCkuXG5cdCAqIFRoZSByZXN1bHQgY2FuIGJlIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBhIHNpbXBsZSBkaXJlY3QgcHJvcGVydHkuXG5cdCAqXG5cdCAqIElmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBwYXRoIHN0YXJ0cyB3aXRoIGEgc2xhc2ggKC8pLCBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGVudGl0eSB0eXBlXG5cdCAqIGlzIHBhcnQgb2YgdGhlIHBhdGggYW5kIHdpbGwgYmUgc3RyaXBwZWQgYXdheS5cblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGhcblx0ICogQHBhcmFtIGJLZWVwUHJvcGVydHlcblx0ICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gcGF0aFxuXHQgKi9cblx0Z2V0TmF2aWdhdGlvblBhdGg6IGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcsIGJLZWVwUHJvcGVydHk/OiBib29sZWFuKTogc3RyaW5nIHtcblx0XHRjb25zdCBiU3RhcnRzV2l0aEVudGl0eVR5cGUgPSBzUHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpO1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihmdW5jdGlvbiAocGFydDogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gISFwYXJ0O1xuXHRcdH0pO1xuXHRcdGlmIChiU3RhcnRzV2l0aEVudGl0eVR5cGUpIHtcblx0XHRcdGFQYXJ0cy5zaGlmdCgpO1xuXHRcdH1cblx0XHRpZiAoIWJLZWVwUHJvcGVydHkpIHtcblx0XHRcdGFQYXJ0cy5wb3AoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQYXJ0cy5qb2luKFwiL1wiKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYWN0aW9ucy5cblx0ICpcblx0ICogU2luY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGlycmVzcGVjdGl2ZSBvZiB0aGUgYWN0aW9uIHR5cGUsIHRoaXMgd2lsbCBiZSBhcHBsaWVkIHRvIHVuYm91bmQgYWN0aW9ucy5cblx0ICogSW4gc3VjaCBhIGNhc2UsIGlmIGFuIGluY29ycmVjdCBwYXRoIGlzIHJldHVybmVkLCBpdCBpcyBpZ25vcmVkIGR1cmluZyB0ZW1wbGF0aW5nLlxuXHQgKlxuXHQgKiBFeGFtcGxlOiBmb3IgdGhlIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbiBvZiBlbnRpdHkgc2V0IFNvbWVFbnRpdHlTZXQsXG5cdCAqIHRoZSBzdHJpbmcgXCIvU29tZUVudGl0eVNldC9zb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvblwiIGlzIHJldHVybmVkLlxuXHQgKiBAcGFyYW0gb0FjdGlvbiBDb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBDb3JyZWN0IG1ldGFtb2RlbCBwYXRoIGZvciBib3VuZCBhbmQgaW5jb3JyZWN0IHBhdGggZm9yIHVuYm91bmQgYWN0aW9uc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0QWN0aW9uQ29udGV4dDogZnVuY3Rpb24gKG9BY3Rpb246IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2V0QWN0aW9uUGF0aChvQWN0aW9uLCB0cnVlKSBhcyBzdHJpbmc7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtZXRhbW9kZWwgcGF0aCBjb3JyZWN0bHkgZm9yIG92ZXJsb2FkZWQgYm91bmQgYWN0aW9ucy4gRm9yIHVuYm91bmQgYWN0aW9ucyxcblx0ICogdGhlIGluY29ycmVjdCBwYXRoIGlzIHJldHVybmVkLCBidXQgaWdub3JlZCBkdXJpbmcgdGVtcGxhdGluZy5cblx0ICogZS5nLiBmb3IgYm91bmQgYWN0aW9uIHNvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uIG9mIGVudGl0eSBzZXQgU29tZUVudGl0eVNldCxcblx0ICogdGhlIHN0cmluZyBcIi9Tb21lRW50aXR5U2V0L3NvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uL0AkdWk1Lm92ZXJsb2FkLzBcIiBpcyByZXR1cm5lZC5cblx0ICogQHBhcmFtIG9BY3Rpb24gVGhlIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IG1ldGFtb2RlbCBwYXRoIGZvciBib3VuZCBhY3Rpb24gb3ZlcmxvYWQgYW5kIGluY29ycmVjdCBwYXRoIGZvciB1bmJvdW5kIGFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWQ6IGZ1bmN0aW9uIChvQWN0aW9uOiBDb250ZXh0KTogc3RyaW5nIHtcblx0XHRjb25zdCBzUGF0aCA9IENvbW1vbkhlbHBlci5nZXRBY3Rpb25QYXRoKG9BY3Rpb24sIHRydWUpO1xuXHRcdHJldHVybiBgJHtzUGF0aH0vQCR1aTUub3ZlcmxvYWQvMGA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRoIHNpbmdsZSBxdW90ZXMuXG5cdCAqIEBwYXJhbSBzVmFsdWUgU29tZSBzdHJpbmcgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgaW50byBzaW5nbGUgcXVvdGVzXG5cdCAqIEBwYXJhbSBbYkVzY2FwZV0gU2hvdWxkIHRoZSBzdHJpbmcgYmUgZXNjYXBlZCBiZWZvcmVoYW5kXG5cdCAqIEByZXR1cm5zIC0gU3RyaW5nIHdpdGggc2luZ2xlIHF1b3Rlc1xuXHQgKi9cblx0YWRkU2luZ2xlUXVvdGVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGJFc2NhcGU/OiBib29sZWFuKTogc3RyaW5nIHtcblx0XHRpZiAoYkVzY2FwZSAmJiBzVmFsdWUpIHtcblx0XHRcdHNWYWx1ZSA9IHRoaXMuZXNjYXBlU2luZ2xlUXVvdGVzKHNWYWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBgJyR7c1ZhbHVlfSdgO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdHJpbmcgd2l0aCBlc2NhcGVkIHNpbmdsZSBxdW90ZXMuXG5cdCAqIEBwYXJhbSBzVmFsdWUgU29tZSBzdHJpbmcgdGhhdCBuZWVkcyBlc2NhcGluZyBvZiBzaW5nbGUgcXVvdGVzXG5cdCAqIEByZXR1cm5zIC0gU3RyaW5nIHdpdGggZXNjYXBlZCBzaW5nbGUgcXVvdGVzXG5cdCAqL1xuXHRlc2NhcGVTaW5nbGVRdW90ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHNWYWx1ZS5yZXBsYWNlKC9bJ10vZywgXCJcXFxcJ1wiKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZnVuY3Rpb24gc3RyaW5nXG5cdCAqIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBnZW5lcmF0ZUZ1bmN0aW9uIGlzIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBmdW5jdGlvbiBzdHJpbmcuXG5cdCAqIFJlbWFpbmluZyBhcmd1bWVudHMgb2YgZ2VuZXJhdGVGdW5jdGlvbiBhcmUgYXJndW1lbnRzIG9mIHRoZSBuZXdseSBnZW5lcmF0ZWQgZnVuY3Rpb24gc3RyaW5nLlxuXHQgKiBAcGFyYW0gc0Z1bmNOYW1lIFNvbWUgc3RyaW5nIGZvciB0aGUgZnVuY3Rpb24gbmFtZVxuXHQgKiBAcGFyYW0gYXJncyBUaGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyAtIEZ1bmN0aW9uIHN0cmluZyBkZXBlbmRzIG9uIGFyZ3VtZW50cyBwYXNzZWRcblx0ICovXG5cdGdlbmVyYXRlRnVuY3Rpb246IGZ1bmN0aW9uIChzRnVuY05hbWU6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdGxldCBzUGFyYW1zID0gXCJcIjtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNQYXJhbXMgKz0gYXJnc1tpXTtcblx0XHRcdGlmIChpIDwgYXJncy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHNQYXJhbXMgKz0gXCIsIFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzRnVuY3Rpb24gPSBgJHtzRnVuY05hbWV9KClgO1xuXHRcdGlmIChzUGFyYW1zKSB7XG5cdFx0XHRzRnVuY3Rpb24gPSBgJHtzRnVuY05hbWV9KCR7c1BhcmFtc30pYDtcblx0XHR9XG5cdFx0cmV0dXJuIHNGdW5jdGlvbjtcblx0fSxcblx0Lypcblx0ICogUmV0dXJucyB0aGUgdmlzaWJpbGl0eSBleHByZXNzaW9uIGZvciBkYXRhcG9pbnQgdGl0bGUvbGlua1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSBhbm5vdGF0aW9uIHBhdGggb2YgZGF0YSBwb2ludCBvciBNaWNyb2NoYXJ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzQ2xpY2thYmxlXSB0cnVlIGlmIGxpbmsgaXMgdmlzaWJsZVxuXHQgKiBAcmV0dXJucyB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb259IHZpc2liaWxpdHlFeHAgVXNlZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgYmluZGluZyBmb3IgRGF0YVBvaW50cyB0aXRsZSBpbiB0aGUgSGVhZGVyLlxuXHQgKlxuXHQgKi9cblxuXHRnZXRIZWFkZXJEYXRhUG9pbnRMaW5rVmlzaWJpbGl0eTogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNDbGlja2FibGU6IGJvb2xlYW4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb25zdGFudChpc0NsaWNrYWJsZSksXG5cdFx0XHRcdGVxdWFsKHBhdGhJbk1vZGVsKGBpc0hlYWRlckRQTGlua1Zpc2libGUvJHtwYXRofWAsIFwiaW50ZXJuYWxcIiksIHRydWUpLFxuXHRcdFx0XHRub3RFcXVhbChwYXRoSW5Nb2RlbChgaXNIZWFkZXJEUExpbmtWaXNpYmxlLyR7cGF0aH1gLCBcImludGVybmFsXCIpLCB0cnVlKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIG9iamVjdCB0byBzdHJpbmcoZGlmZmVyZW50IGZyb20gSlNPTi5zdHJpbmdpZnkgb3IudG9TdHJpbmcpLlxuXHQgKiBAcGFyYW0gb1BhcmFtcyBTb21lIG9iamVjdFxuXHQgKiBAcmV0dXJucyAtIE9iamVjdCBzdHJpbmdcblx0ICovXG5cdG9iamVjdFRvU3RyaW5nOiBmdW5jdGlvbiAob1BhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuXHRcdGxldCBpTnVtYmVyT2ZLZXlzID0gT2JqZWN0LmtleXMob1BhcmFtcykubGVuZ3RoLFxuXHRcdFx0c1BhcmFtcyA9IFwiXCI7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb1BhcmFtcykge1xuXHRcdFx0bGV0IHNWYWx1ZSA9IG9QYXJhbXNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlICYmIHR5cGVvZiBzVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0c1ZhbHVlID0gdGhpcy5vYmplY3RUb1N0cmluZyhzVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0fVxuXHRcdFx0c1BhcmFtcyArPSBgJHtzS2V5fTogJHtzVmFsdWV9YDtcblx0XHRcdGlmIChpTnVtYmVyT2ZLZXlzID4gMSkge1xuXHRcdFx0XHQtLWlOdW1iZXJPZktleXM7XG5cdFx0XHRcdHNQYXJhbXMgKz0gXCIsIFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBgeyAke3NQYXJhbXN9fWA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgZXNjYXBlIGNoYXJhY3RlcnMgKFxcKSBmcm9tIGFuIGV4cHJlc3Npb24uXG5cdCAqIEBwYXJhbSBzRXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHdpdGggZXNjYXBlIGNoYXJhY3RlcnNcblx0ICogQHJldHVybnMgRXhwcmVzc2lvbiBzdHJpbmcgd2l0aG91dCBlc2NhcGUgY2hhcmFjdGVycyBvciB1bmRlZmluZWRcblx0ICovXG5cdHJlbW92ZUVzY2FwZUNoYXJhY3RlcnM6IGZ1bmN0aW9uIChzRXhwcmVzc2lvbj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHNFeHByZXNzaW9uID8gc0V4cHJlc3Npb24ucmVwbGFjZSgvXFxcXD9cXFxcKFt7fV0pL2csIFwiJDFcIikgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ha2VzIHVwZGF0ZXMgdG8gYSBzdHJpbmdpZmllZCBvYmplY3Qgc28gdGhhdCBpdCB3b3JrcyBwcm9wZXJseSBpbiBhIHRlbXBsYXRlIGJ5IGFkZGluZyB1aTVPYmplY3Q6dHJ1ZS5cblx0ICogQHBhcmFtIHNTdHJpbmdpZmllZFxuXHQgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdFxuXHQgKi9cblx0c3RyaW5naWZ5T2JqZWN0OiBmdW5jdGlvbiAoc1N0cmluZ2lmaWVkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmICghc1N0cmluZ2lmaWVkIHx8IHNTdHJpbmdpZmllZCA9PT0gXCJ7fVwiKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvT2JqZWN0ID0gSlNPTi5wYXJzZShzU3RyaW5naWZpZWQpO1xuXHRcdFx0aWYgKHR5cGVvZiBvT2JqZWN0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KG9PYmplY3QpKSB7XG5cdFx0XHRcdGNvbnN0IG9VSTVPYmplY3QgPSB7XG5cdFx0XHRcdFx0dWk1b2JqZWN0OiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24ob1VJNU9iamVjdCwgb09iamVjdCk7XG5cdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvVUk1T2JqZWN0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNUeXBlID0gQXJyYXkuaXNBcnJheShvT2JqZWN0KSA/IFwiQXJyYXlcIiA6IHR5cGVvZiBvT2JqZWN0O1xuXHRcdFx0XHRMb2cuZXJyb3IoYFVuZXhwZWN0ZWQgb2JqZWN0IHR5cGUgaW4gc3RyaW5naWZ5T2JqZWN0ICgke3NUeXBlfSkgLSBvbmx5IHdvcmtzIHdpdGggb2JqZWN0YCk7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN0cmluZ2lmeU9iamVjdCBvbmx5IHdvcmtzIHdpdGggb2JqZWN0cyFcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRhdGEsIHRha2luZyBjYXJlIHRoYXQgaXQgaXMgbm90IHRyZWF0ZWQgYXMgYSBiaW5kaW5nIGV4cHJlc3Npb24uXG5cdCAqIEBwYXJhbSB2RGF0YSBUaGUgZGF0YSB0byBzdHJpbmdpZnlcblx0ICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YS5cblx0ICovXG5cdHN0cmluZ2lmeUN1c3RvbURhdGE6IGZ1bmN0aW9uICh2RGF0YTogb2JqZWN0IHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcblx0XHRjb25zdCBvT2JqZWN0OiB7IHVpNW9iamVjdDogdHJ1ZTsgY3VzdG9tRGF0YT86IHVua25vd24gfSA9IHtcblx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdH07XG5cdFx0b09iamVjdFtcImN1c3RvbURhdGFcIl0gPSB2RGF0YSBpbnN0YW5jZW9mIENvbnRleHQgPyB2RGF0YS5nZXRPYmplY3QoKSA6IHZEYXRhO1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvT2JqZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBkYXRhLCBwb3RlbnRpYWxseSB1bndyYXBzIHRoZSBkYXRhLlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gcGFyc2Vcblx0ICogQHBhcmFtIHZEYXRhLnVpNW9iamVjdFxuXHQgKiBAcGFyYW0gdkRhdGEuY3VzdG9tRGF0YVxuXHQgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBkYXRhIHBhcnNpbmdcblx0ICovXG5cdHBhcnNlQ3VzdG9tRGF0YTogZnVuY3Rpb24gKHZEYXRhPzogc3RyaW5nIHwgeyB1aTVvYmplY3Q6IHRydWU7IGN1c3RvbURhdGE/OiB1bmtub3duIH0pOiB1bmtub3duIHtcblx0XHR2RGF0YSA9IHR5cGVvZiB2RGF0YSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodkRhdGEpIDogdkRhdGE7XG5cdFx0aWYgKHZEYXRhICYmIHZEYXRhLmhhc093blByb3BlcnR5KFwiY3VzdG9tRGF0YVwiKSkge1xuXHRcdFx0cmV0dXJuICh2RGF0YSBhcyB7IHVpNW9iamVjdDogdHJ1ZTsgY3VzdG9tRGF0YT86IHVua25vd24gfSlbXCJjdXN0b21EYXRhXCJdO1xuXHRcdH1cblx0XHRyZXR1cm4gdkRhdGE7XG5cdH0sXG5cdGdldENvbnRleHRQYXRoOiBmdW5jdGlvbiAob1ZhbHVlOiB1bmtub3duLCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQgJiYgb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gc1BhdGhbc1BhdGgubGVuZ3RoIC0gMV0gPT09IFwiL1wiID8gc1BhdGguc2xpY2UoMCwgLTEpIDogc1BhdGg7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QgY29udGFpbmluZyAgUHJlc2VudGF0aW9uIFZhcmlhbnQgc29ydCBjb25kaXRpb25zLlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHBhcmFtIG9Db250ZXh0LmdldFBhdGhcblx0ICogQHBhcmFtIG9Db250ZXh0LmdldE1vZGVsXG5cdCAqIEBwYXJhbSBvUHJlc2VudGF0aW9uVmFyaWFudCBQcmVzZW50YXRpb24gdmFyaWFudCBBbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzUHJlc2VudGF0aW9uVmFyaWFudFBhdGhcblx0ICogQHJldHVybnMgU3RyaW5naWZpZWQgSlNPTiBvYmplY3Rcblx0ICovXG5cdGdldFNvcnRDb25kaXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b0NvbnRleHQ6IHsgZ2V0UGF0aChudW06IG51bWJlcik6IHN0cmluZzsgZ2V0TW9kZWwobnVtOiBudW1iZXIpOiBPRGF0YU1ldGFNb2RlbCB9LFxuXHRcdG9QcmVzZW50YXRpb25WYXJpYW50OiBNZXRhTW9kZWxUeXBlPFByZXNlbnRhdGlvblZhcmlhbnQ+LFxuXHRcdHNQcmVzZW50YXRpb25WYXJpYW50UGF0aDogc3RyaW5nXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKFxuXHRcdFx0b1ByZXNlbnRhdGlvblZhcmlhbnQgJiZcblx0XHRcdENvbW1vbkhlbHBlci5faXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbihzUHJlc2VudGF0aW9uVmFyaWFudFBhdGgpICYmXG5cdFx0XHRvUHJlc2VudGF0aW9uVmFyaWFudC5Tb3J0T3JkZXJcblx0XHQpIHtcblx0XHRcdGNvbnN0IGFTb3J0Q29uZGl0aW9uczogeyBzb3J0ZXJzOiB7IG5hbWU/OiBzdHJpbmc7IGRlc2NlbmRpbmc/OiBib29sZWFuIH1bXSB9ID0ge1xuXHRcdFx0XHRzb3J0ZXJzOiBbXVxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKDApLnNwbGl0KFwiQFwiKVswXTtcblx0XHRcdG9QcmVzZW50YXRpb25WYXJpYW50LlNvcnRPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChvQ29uZGl0aW9uID0ge30pIHtcblx0XHRcdFx0bGV0IG9Tb3J0UHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3Qgb1NvcnRlcjogeyBuYW1lPzogc3RyaW5nOyBkZXNjZW5kaW5nPzogYm9vbGVhbiB9ID0ge307XG5cdFx0XHRcdGlmIChvQ29uZGl0aW9uLkR5bmFtaWNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdG9Tb3J0UHJvcGVydHkgPSBvQ29udGV4dC5nZXRNb2RlbCgwKS5nZXRPYmplY3Qoc0VudGl0eVBhdGggKyBvQ29uZGl0aW9uLkR5bmFtaWNQcm9wZXJ0eS4kQW5ub3RhdGlvblBhdGgpPy5OYW1lO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9Db25kaXRpb24uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRvU29ydFByb3BlcnR5ID0gb0NvbmRpdGlvbi5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvU29ydFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0b1NvcnRlci5uYW1lID0gb1NvcnRQcm9wZXJ0eTtcblx0XHRcdFx0XHRvU29ydGVyLmRlc2NlbmRpbmcgPSAhIW9Db25kaXRpb24uRGVzY2VuZGluZztcblx0XHRcdFx0XHRhU29ydENvbmRpdGlvbnMuc29ydGVycy5wdXNoKG9Tb3J0ZXIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBkZWZpbmUgdGhlIHJpZ2h0IHBhdGggdG8gdGhlIHNvcnQgcHJvcGVydHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KGFTb3J0Q29uZGl0aW9ucyk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0sXG5cdF9pc1ByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBmdW5jdGlvbiAoYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRhbm5vdGF0aW9uUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuUHJlc2VudGF0aW9uVmFyaWFudH1gKSB8fFxuXHRcdFx0YW5ub3RhdGlvblBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnR9YClcblx0XHQpO1xuXHR9LFxuXHRjcmVhdGVQcmVzZW50YXRpb25QYXRoQ29udGV4dDogZnVuY3Rpb24gKG9QcmVzZW50YXRpb25Db250ZXh0OiBDb250ZXh0KTogQ29udGV4dCB7XG5cdFx0Y29uc3QgYVBhdGhzID0gb1ByZXNlbnRhdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiQFwiKSB8fCBbXTtcblx0XHRjb25zdCBvTW9kZWwgPSBvUHJlc2VudGF0aW9uQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGlmIChhUGF0aHMubGVuZ3RoICYmIGFQYXRoc1thUGF0aHMubGVuZ3RoIC0gMV0uaW5jbHVkZXMoXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50XCIpKSB7XG5cdFx0XHRjb25zdCBzUGF0aCA9IG9QcmVzZW50YXRpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9QcmVzZW50YXRpb25WYXJpYW50XCIpWzBdO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdH1cblx0XHRyZXR1cm4gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke29QcmVzZW50YXRpb25Db250ZXh0LmdldFBhdGgoKX1Ac2FwdWkubmFtZWApO1xuXHR9LFxuXHRnZXRQcmVzc0hhbmRsZXJGb3JEYXRhRmllbGRGb3JJQk46IGZ1bmN0aW9uIChcblx0XHRvRGF0YUZpZWxkOiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0c0NvbnRleHQ/OiBzdHJpbmcsXG5cdFx0Yk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZz86IGJvb2xlYW4sXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmICghb0RhdGFGaWVsZCkgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHRjb25zdCBtTmF2aWdhdGlvblBhcmFtZXRlcnM6IHtcblx0XHRcdG5hdmlnYXRpb25Db250ZXh0cz86IHN0cmluZztcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogc3RyaW5nO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogc3RyaW5nO1xuXHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogc3RyaW5nO1xuXHRcdH0gPSB7XG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IHNDb250ZXh0ID8gc0NvbnRleHQgOiBcIiR7JHNvdXJjZT4vfS5nZXRCaW5kaW5nQ29udGV4dCgpXCJcblx0XHR9O1xuXHRcdGlmIChvRGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJiAhb0RhdGFGaWVsZC5JbmxpbmUgJiYgYk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZykge1xuXHRcdFx0Y29uc3QgYXBwbGljYWJsZVByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJhQXBwbGljYWJsZVwiIDogXCJhQXBwbGljYWJsZUZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRjb25zdCBub3RBcHBsaWNhYmxlUHJvcGVydHkgPSAhZm9yQ29udGV4dE1lbnUgPyBcImFOb3RBcHBsaWNhYmxlXCIgOiBcImFOb3RBcHBsaWNhYmxlRm9yQ29udGV4dE1lbnVcIjtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgPSBgXFwke2ludGVybmFsPmlibi8ke29EYXRhRmllbGQuU2VtYW50aWNPYmplY3R9LSR7b0RhdGFGaWVsZC5BY3Rpb259LyR7YXBwbGljYWJsZVByb3BlcnR5fS99YDtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgPSBgXFwke2ludGVybmFsPmlibi8ke29EYXRhRmllbGQuU2VtYW50aWNPYmplY3R9LSR7b0RhdGFGaWVsZC5BY3Rpb259LyR7bm90QXBwbGljYWJsZVByb3BlcnR5fS99YDtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5sYWJlbCA9IHRoaXMuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQuTGFiZWwgYXMgc3RyaW5nLCB0cnVlKTtcblx0XHR9XG5cdFx0aWYgKG9EYXRhRmllbGQuTWFwcGluZykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzLnNlbWFudGljT2JqZWN0TWFwcGluZyA9IHRoaXMuYWRkU2luZ2xlUXVvdGVzKEpTT04uc3RyaW5naWZ5KG9EYXRhRmllbGQuTWFwcGluZykpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uKFxuXHRcdFx0Yk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZyA/IFwiLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nXCIgOiBcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlXCIsXG5cdFx0XHR0aGlzLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkLlNlbWFudGljT2JqZWN0IGFzIHVua25vd24gYXMgc3RyaW5nKSxcblx0XHRcdHRoaXMuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQuQWN0aW9uIGFzIHVua25vd24gYXMgc3RyaW5nKSxcblx0XHRcdHRoaXMub2JqZWN0VG9TdHJpbmcobU5hdmlnYXRpb25QYXJhbWV0ZXJzKSxcblx0XHRcdFwiJHskc291cmNlPi99XCJcblx0XHQpO1xuXHR9LFxuXHRnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZG8gdGhlIGNhbGN1bGF0aW9uIG9mIGNyaXRpY2FsaXR5IGluIGNhc2UgQ3JpdGljYWxpdHlDYWxjdWxhdGlvbiBwcmVzZW50IGluIHRoZSBhbm5vdGF0aW9uXG5cdCAqXG5cdCAqIFRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGJ5IGNvbXBhcmluZyBhIHZhbHVlIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWVzIHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWVkIGltcHJvdmVtZW50IGRpcmVjdGlvbi5cblx0ICogRm9yIGltcHJvdmVtZW50IGRpcmVjdGlvbiBUYXJnZXQsIHRoZSBjcml0aWNhbGl0eSBpcyBjYWxjdWxhdGVkIHVzaW5nIGJvdGggbG93IGFuZCBoaWdoIHRocmVzaG9sZCB2YWx1ZXMuIEl0IHdpbGwgYmVcblx0ICpcblx0ICogLSBQb3NpdGl2ZSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBsb3dlciB0aGFuIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlIE9SIGdyZWF0ZXIgdGhhbiBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlTG93VmFsdWUgYW5kIGxvd2VyIHRoYW4gVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSBPUiBncmVhdGVyIHRoYW4gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBOZWdhdGl2ZSBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlIG9yIGdyZWF0ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKlxuXHQgKiBGb3IgaW1wcm92ZW1lbnQgZGlyZWN0aW9uIE1pbmltaXplLCB0aGUgY3JpdGljYWxpdHkgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgaGlnaCB0aHJlc2hvbGQgdmFsdWVzLiBJdCBpc1xuXHQgKiAtIFBvc2l0aXZlIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gTmVnYXRpdmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKlxuXHQgKiBGb3IgaW1wcm92ZW1lbnQgZGlyZWN0aW9uIE1heGltaXplLCB0aGUgY3JpdGljYWxpdHkgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgbG93IHRocmVzaG9sZCB2YWx1ZXMuIEl0IGlzXG5cdCAqXG5cdCAqIC0gUG9zaXRpdmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFRvbGVyYW5jZVJhbmdlTG93VmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZVxuXHQgKiAtIE5lZ2F0aXZlIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIERldmlhdGlvblJhbmdlTG93VmFsdWVcblx0ICpcblx0ICogVGhyZXNob2xkcyBhcmUgb3B0aW9uYWwuIEZvciB1bmFzc2lnbmVkIHZhbHVlcywgZGVmYXVsdHMgYXJlIGRldGVybWluZWQgaW4gdGhpcyBvcmRlcjpcblx0ICpcblx0ICogLSBGb3IgRGV2aWF0aW9uUmFuZ2UsIGFuIG9taXR0ZWQgTG93VmFsdWUgdHJhbnNsYXRlcyBpbnRvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBudW1iZXIgKC1JTkYpLCBhbiBvbWl0dGVkIEhpZ2hWYWx1ZSB0cmFuc2xhdGVzIGludG8gdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyICgrSU5GKVxuXHQgKiAtIEZvciBUb2xlcmFuY2VSYW5nZSwgYW4gb21pdHRlZCBMb3dWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSwgYW4gb21pdHRlZCBIaWdoVmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gRm9yIEFjY2VwdGFuY2VSYW5nZSwgYW4gb21pdHRlZCBMb3dWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSwgYW4gb21pdHRlZCBIaWdoVmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLlxuXHQgKiBAcGFyYW0gc0ltcHJvdmVtZW50RGlyZWN0aW9uIEltcHJvdmVtZW50RGlyZWN0aW9uIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBjcml0aWNhbGl0eSBiaW5kaW5nXG5cdCAqIEBwYXJhbSBzVmFsdWUgVmFsdWUgZnJvbSBEYXRhcG9pbnQgdG8gYmUgbWVhc3VyZWRcblx0ICogQHBhcmFtIHNEZXZpYXRpb25Mb3cgRXhwcmVzc2lvbkJpbmRpbmcgZm9yIExvd2VyIERldmlhdGlvbiBsZXZlbFxuXHQgKiBAcGFyYW0gc1RvbGVyYW5jZUxvdyBFeHByZXNzaW9uQmluZGluZyBmb3IgTG93ZXIgVG9sZXJhbmNlIGxldmVsXG5cdCAqIEBwYXJhbSBzQWNjZXB0YW5jZUxvdyBFeHByZXNzaW9uQmluZGluZyBmb3IgTG93ZXIgQWNjZXB0YW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc0FjY2VwdGFuY2VIaWdoIEV4cHJlc3Npb25CaW5kaW5nIGZvciBIaWdoZXIgQWNjZXB0YW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc1RvbGVyYW5jZUhpZ2ggRXhwcmVzc2lvbkJpbmRpbmcgZm9yIEhpZ2hlciBUb2xlcmFuY2UgbGV2ZWxcblx0ICogQHBhcmFtIHNEZXZpYXRpb25IaWdoIEV4cHJlc3Npb25CaW5kaW5nIGZvciBIaWdoZXIgRGV2aWF0aW9uIGxldmVsXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gYXMgZXhwcmVzc2lvbiBiaW5kaW5nXG5cdCAqL1xuXHRnZXRDcml0aWNhbGl0eUNhbGN1bGF0aW9uQmluZGluZzogZnVuY3Rpb24gKFxuXHRcdHNJbXByb3ZlbWVudERpcmVjdGlvbjogc3RyaW5nLFxuXHRcdHNWYWx1ZTogc3RyaW5nLFxuXHRcdHNEZXZpYXRpb25Mb3c6IHN0cmluZyB8IG51bWJlcixcblx0XHRzVG9sZXJhbmNlTG93OiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c0FjY2VwdGFuY2VMb3c6IHN0cmluZyB8IG51bWJlcixcblx0XHRzQWNjZXB0YW5jZUhpZ2g6IHN0cmluZyB8IG51bWJlcixcblx0XHRzVG9sZXJhbmNlSGlnaDogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNEZXZpYXRpb25IaWdoOiBzdHJpbmcgfCBudW1iZXJcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc0NyaXRpY2FsaXR5RXhwcmVzc2lvbjogdHlwZW9mIFZhbHVlQ29sb3IgfCBzdHJpbmcgPSBWYWx1ZUNvbG9yLk5ldXRyYWw7IC8vIERlZmF1bHQgQ3JpdGljYWxpdHkgU3RhdGVcblxuXHRcdHNWYWx1ZSA9IGAlJHtzVmFsdWV9YDtcblxuXHRcdC8vIFNldHRpbmcgVW5hc3NpZ25lZCBWYWx1ZXNcblx0XHRzRGV2aWF0aW9uTG93ID0gc0RldmlhdGlvbkxvdyB8fCAtSW5maW5pdHk7XG5cdFx0c1RvbGVyYW5jZUxvdyA9IHNUb2xlcmFuY2VMb3cgfHwgc0RldmlhdGlvbkxvdztcblx0XHRzQWNjZXB0YW5jZUxvdyA9IHNBY2NlcHRhbmNlTG93IHx8IHNUb2xlcmFuY2VMb3c7XG5cdFx0c0RldmlhdGlvbkhpZ2ggPSBzRGV2aWF0aW9uSGlnaCB8fCBJbmZpbml0eTtcblx0XHRzVG9sZXJhbmNlSGlnaCA9IHNUb2xlcmFuY2VIaWdoIHx8IHNEZXZpYXRpb25IaWdoO1xuXHRcdHNBY2NlcHRhbmNlSGlnaCA9IHNBY2NlcHRhbmNlSGlnaCB8fCBzVG9sZXJhbmNlSGlnaDtcblxuXHRcdC8vIERlYWxpbmcgd2l0aCBEZWNpbWFsIGFuZCBQYXRoIGJhc2VkIGJpbmdkaW5nc1xuXHRcdHNEZXZpYXRpb25Mb3cgPSBzRGV2aWF0aW9uTG93ICYmICgrc0RldmlhdGlvbkxvdyA/ICtzRGV2aWF0aW9uTG93IDogYCUke3NEZXZpYXRpb25Mb3d9YCk7XG5cdFx0c1RvbGVyYW5jZUxvdyA9IHNUb2xlcmFuY2VMb3cgJiYgKCtzVG9sZXJhbmNlTG93ID8gK3NUb2xlcmFuY2VMb3cgOiBgJSR7c1RvbGVyYW5jZUxvd31gKTtcblx0XHRzQWNjZXB0YW5jZUxvdyA9IHNBY2NlcHRhbmNlTG93ICYmICgrc0FjY2VwdGFuY2VMb3cgPyArc0FjY2VwdGFuY2VMb3cgOiBgJSR7c0FjY2VwdGFuY2VMb3d9YCk7XG5cdFx0c0FjY2VwdGFuY2VIaWdoID0gc0FjY2VwdGFuY2VIaWdoICYmICgrc0FjY2VwdGFuY2VIaWdoID8gK3NBY2NlcHRhbmNlSGlnaCA6IGAlJHtzQWNjZXB0YW5jZUhpZ2h9YCk7XG5cdFx0c1RvbGVyYW5jZUhpZ2ggPSBzVG9sZXJhbmNlSGlnaCAmJiAoK3NUb2xlcmFuY2VIaWdoID8gK3NUb2xlcmFuY2VIaWdoIDogYCUke3NUb2xlcmFuY2VIaWdofWApO1xuXHRcdHNEZXZpYXRpb25IaWdoID0gc0RldmlhdGlvbkhpZ2ggJiYgKCtzRGV2aWF0aW9uSGlnaCA/ICtzRGV2aWF0aW9uSGlnaCA6IGAlJHtzRGV2aWF0aW9uSGlnaH1gKTtcblxuXHRcdC8vIENyZWF0aW5nIHJ1bnRpbWUgZXhwcmVzc2lvbiBiaW5kaW5nIGZyb20gY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gZm9yIENyaXRpY2FsaXR5IFN0YXRlXG5cdFx0aWYgKHNJbXByb3ZlbWVudERpcmVjdGlvbi5pbmNsdWRlcyhcIk1pbmltaXplXCIpKSB7XG5cdFx0XHRzQ3JpdGljYWxpdHlFeHByZXNzaW9uID1cblx0XHRcdFx0XCJ7PSBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VIaWdoICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkdvb2QgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuTmV1dHJhbCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0XCIoXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uSGlnaCArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uSGlnaCArXG5cdFx0XHRcdFwiKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuQ3JpdGljYWwgK1xuXHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkVycm9yICtcblx0XHRcdFx0XCInIH1cIjtcblx0XHR9IGVsc2UgaWYgKHNJbXByb3ZlbWVudERpcmVjdGlvbi5pbmNsdWRlcyhcIk1heGltaXplXCIpKSB7XG5cdFx0XHRzQ3JpdGljYWxpdHlFeHByZXNzaW9uID1cblx0XHRcdFx0XCJ7PSBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIiA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuR29vZCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkxvdyArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIpID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Dcml0aWNhbCArXG5cdFx0XHRcdFwiJyA6ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuRXJyb3IgK1xuXHRcdFx0XHRcIicgfVwiO1xuXHRcdH0gZWxzZSBpZiAoc0ltcHJvdmVtZW50RGlyZWN0aW9uLmluY2x1ZGVzKFwiVGFyZ2V0XCIpKSB7XG5cdFx0XHRzQ3JpdGljYWxpdHlFeHByZXNzaW9uID1cblx0XHRcdFx0XCJ7PSAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUxvdyArXG5cdFx0XHRcdFwiKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuR29vZCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0XCIoKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIgJiYgXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIikgfHwgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPiBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlSGlnaCArXG5cdFx0XHRcdFwiKSkgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKChcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIiAmJiAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIikgJiYgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPCBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VMb3cgK1xuXHRcdFx0XHRcIikpIHx8ICgoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUhpZ2ggK1xuXHRcdFx0XHRcIikgJiYgXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uSGlnaCArXG5cdFx0XHRcdFwiICYmIChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIikpKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuQ3JpdGljYWwgK1xuXHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkVycm9yICtcblx0XHRcdFx0XCInIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJDYXNlIG5vdCBzdXBwb3J0ZWQsIHJldHVybmluZyB0aGUgZGVmYXVsdCBWYWx1ZSBOZXV0cmFsXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzQ3JpdGljYWxpdHlFeHByZXNzaW9uO1xuXHR9LFxuXHQvKipcblx0ICogVG8gZmV0Y2ggbWVhc3VyZSBhdHRyaWJ1dGUgaW5kZXguXG5cdCAqIEBwYXJhbSBpTWVhc3VyZSBDaGFydCBBbm5vdGF0aW9uc1xuXHQgKiBAcGFyYW0gb0NoYXJ0QW5ub3RhdGlvbnMgQ2hhcnQgQW5ub3RhdGlvbnNcblx0ICogQHJldHVybnMgTWVhc3VyZUF0dHJpYnV0ZSBpbmRleC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGVJbmRleDogZnVuY3Rpb24gKGlNZWFzdXJlOiBudW1iZXIsIG9DaGFydEFubm90YXRpb25zOiBNZXRhTW9kZWxUeXBlPENoYXJ0PiB8IENoYXJ0LCBpc01pY3JvQ2hhcnQ/OiBib29sZWFuKTogbnVtYmVyIHtcblx0XHRsZXQgYU1lYXN1cmVzLCBzTWVhc3VyZVByb3BlcnR5UGF0aDtcblx0XHRpZiAob0NoYXJ0QW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5sZW5ndGggJiYgb0NoYXJ0QW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhTWVhc3VyZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlcztcblx0XHRcdHNNZWFzdXJlUHJvcGVydHlQYXRoID0gaXNNaWNyb0NoYXJ0XG5cdFx0XHRcdD8gKGFNZWFzdXJlc1tpTWVhc3VyZV0gYXMgUHJvcGVydHlQYXRoKS52YWx1ZVxuXHRcdFx0XHQ6IChhTWVhc3VyZXNbaU1lYXN1cmVdIGFzIE1ldGFNb2RlbE1lYXN1cmUpLiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSBlbHNlIGlmIChvQ2hhcnRBbm5vdGF0aW9ucz8uRHluYW1pY01lYXN1cmVzPy5sZW5ndGggJiYgb0NoYXJ0QW5ub3RhdGlvbnM/LkR5bmFtaWNNZWFzdXJlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0YU1lYXN1cmVzID0gKG9DaGFydEFubm90YXRpb25zIGFzIE1ldGFNb2RlbFR5cGU8Q2hhcnQ+KS5EeW5hbWljTWVhc3VyZXM7XG5cdFx0XHRzTWVhc3VyZVByb3BlcnR5UGF0aCA9IGFNZWFzdXJlcz8uW2lNZWFzdXJlXS4kQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdGxldCBiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cztcblx0XHRjb25zdCBhTWVhc3VyZUF0dHJpYnV0ZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlQXR0cmlidXRlcztcblx0XHRsZXQgaU1lYXN1cmVBdHRyaWJ1dGUgPSAtMTtcblx0XHRjb25zdCBmbkNoZWNrTWVhc3VyZSA9IGZ1bmN0aW9uIChcblx0XHRcdHNNZWFzdXJlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0b01lYXN1cmVBdHRyaWJ1dGU6IE1ldGFNb2RlbFR5cGU8Q2hhcnRNZWFzdXJlQXR0cmlidXRlVHlwZT4gfCBDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlLFxuXHRcdFx0aW5kZXg6IG51bWJlclxuXHRcdCk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKG9NZWFzdXJlQXR0cmlidXRlKSB7XG5cdFx0XHRcdGNvbnN0IHBhdGggPSBpc01pY3JvQ2hhcnRcblx0XHRcdFx0XHQ/IChvTWVhc3VyZUF0dHJpYnV0ZSBhcyBDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlKS5NZWFzdXJlPy52YWx1ZVxuXHRcdFx0XHRcdDogKG9NZWFzdXJlQXR0cmlidXRlIGFzIE1ldGFNb2RlbFR5cGU8Q2hhcnRNZWFzdXJlQXR0cmlidXRlVHlwZT4pLk1lYXN1cmU/LiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChvTWVhc3VyZUF0dHJpYnV0ZS5NZWFzdXJlICYmIHBhdGggPT09IHNNZWFzdXJlUGF0aCkge1xuXHRcdFx0XHRcdGlNZWFzdXJlQXR0cmlidXRlID0gaW5kZXg7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0b01lYXN1cmVBdHRyaWJ1dGUuRHluYW1pY01lYXN1cmUgJiZcblx0XHRcdFx0XHQob01lYXN1cmVBdHRyaWJ1dGUgYXMgTWV0YU1vZGVsVHlwZTxDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlPik/LkR5bmFtaWNNZWFzdXJlPy4kQW5ub3RhdGlvblBhdGggPT09IHNNZWFzdXJlUGF0aFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IGluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0XHRpZiAoYU1lYXN1cmVBdHRyaWJ1dGVzKSB7XG5cdFx0XHRiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cyA9IGFNZWFzdXJlQXR0cmlidXRlcy5zb21lKGZuQ2hlY2tNZWFzdXJlLmJpbmQobnVsbCwgc01lYXN1cmVQcm9wZXJ0eVBhdGgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJNZWFzdXJlQXR0cmlidXRlRXhpc3RzICYmIGlNZWFzdXJlQXR0cmlidXRlID4gLTEgPyBpTWVhc3VyZUF0dHJpYnV0ZSA6IC0xO1xuXHR9LFxuXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGU6IGFzeW5jIGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRzQ2hhcnRBbm5vdGF0aW9uUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gb01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KHNDaGFydEFubm90YXRpb25QYXRoKS50aGVuKGZ1bmN0aW9uIChvQ2hhcnRBbm5vdGF0aW9uczogTWV0YU1vZGVsVHlwZTxDaGFydD4pIHtcblx0XHRcdGNvbnN0IGFNZWFzdXJlQXR0cmlidXRlcyA9IG9DaGFydEFubm90YXRpb25zLk1lYXN1cmVBdHRyaWJ1dGVzLFxuXHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoMCwgb0NoYXJ0QW5ub3RhdGlvbnMpO1xuXHRcdFx0Y29uc3Qgc01lYXN1cmVBdHRyaWJ1dGVQYXRoID1cblx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXM/LltpTWVhc3VyZUF0dHJpYnV0ZV0gJiYgYU1lYXN1cmVBdHRyaWJ1dGVzW2lNZWFzdXJlQXR0cmlidXRlXS5EYXRhUG9pbnRcblx0XHRcdFx0XHQ/IGAke3NDaGFydEFubm90YXRpb25QYXRofS9NZWFzdXJlQXR0cmlidXRlcy8ke2lNZWFzdXJlQXR0cmlidXRlfS9gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc01lYXN1cmVBdHRyaWJ1dGVQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJEYXRhUG9pbnQgbWlzc2luZyBmb3IgdGhlIG1lYXN1cmVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc01lYXN1cmVBdHRyaWJ1dGVQYXRoID8gYCR7c01lYXN1cmVBdHRyaWJ1dGVQYXRofURhdGFQb2ludC8kQW5ub3RhdGlvblBhdGgvYCA6IHNNZWFzdXJlQXR0cmlidXRlUGF0aDtcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBmb3IgdGhlIG1lYXN1cmUuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIHRoZSBtZWFzdXJlIGFubm90YXRpb25cblx0ICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBvZiB0aGUgbWVhc3VyZVxuXHQgKi9cblx0Z2V0TWVhc3VyZUF0dHJpYnV0ZUZvck1lYXN1cmU6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRzTWVhc3VyZVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRzQ2hhcnRBbm5vdGF0aW9uUGF0aCA9IHNNZWFzdXJlUGF0aC5zdWJzdHJpbmcoMCwgc01lYXN1cmVQYXRoLmxhc3RJbmRleE9mKFwiTWVhc3VyZVwiKSksXG5cdFx0XHRpTWVhc3VyZSA9IHNNZWFzdXJlUGF0aC5yZXBsYWNlKC8uKlxcLy8sIFwiXCIpO1xuXG5cdFx0Y29uc3Qgb0NoYXJ0QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ2hhcnRBbm5vdGF0aW9uUGF0aCk7XG5cdFx0Y29uc3QgYU1lYXN1cmVBdHRyaWJ1dGVzID0gb0NoYXJ0QW5ub3RhdGlvbnMuTWVhc3VyZUF0dHJpYnV0ZXMsXG5cdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoaU1lYXN1cmUgYXMgdW5rbm93biBhcyBudW1iZXIsIG9DaGFydEFubm90YXRpb25zKTtcblx0XHRjb25zdCBzTWVhc3VyZUF0dHJpYnV0ZVBhdGggPVxuXHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXNbaU1lYXN1cmVBdHRyaWJ1dGVdICYmIGFNZWFzdXJlQXR0cmlidXRlc1tpTWVhc3VyZUF0dHJpYnV0ZV0uRGF0YVBvaW50XG5cdFx0XHRcdD8gYCR7c0NoYXJ0QW5ub3RhdGlvblBhdGh9TWVhc3VyZUF0dHJpYnV0ZXMvJHtpTWVhc3VyZUF0dHJpYnV0ZX0vYFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRpZiAoc01lYXN1cmVBdHRyaWJ1dGVQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiRGF0YVBvaW50IG1pc3NpbmcgZm9yIHRoZSBtZWFzdXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gc01lYXN1cmVBdHRyaWJ1dGVQYXRoID8gYCR7c01lYXN1cmVBdHRyaWJ1dGVQYXRofURhdGFQb2ludC8kQW5ub3RhdGlvblBhdGgvYCA6IHNNZWFzdXJlQXR0cmlidXRlUGF0aDtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbnRhaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnR5IGhhcyBhIGRyYWZ0IHJvb3Qvbm9kZSBwYXJlbnQgZW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gb1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCBUYXJnZXQgY29sbGVjdGlvbiBoYXMgQ29udGFpbnNUYXJnZXQgcHJvcGVydHlcblx0ICogQHBhcmFtIG9UYWJsZU1ldGFkYXRhIFRhYmxlIG1ldGFkYXRhIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldFxuXHQgKiBAcGFyYW0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0Lm9Nb2RlbFxuXHQgKiBAcGFyYW0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0LnNQYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdFxuXHQgKi9cblx0aXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50OiBmdW5jdGlvbiAoXG5cdFx0b1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldDogb2JqZWN0LFxuXHRcdG9UYWJsZU1ldGFkYXRhOiB7XG5cdFx0XHRwYXJlbnRFbnRpdHlTZXQ/OiB7XG5cdFx0XHRcdG9Nb2RlbDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdHNQYXRoPzogc3RyaW5nO1xuXHRcdFx0fTtcblx0XHR9XG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChvVGFyZ2V0Q29sbGVjdGlvbkNvbnRhaW5zVGFyZ2V0KSB7XG5cdFx0XHRpZiAob1RhYmxlTWV0YWRhdGEgJiYgb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0ICYmIG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5zUGF0aCkge1xuXHRcdFx0XHRjb25zdCBzUGFyZW50RW50aXR5U2V0UGF0aCA9IG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5zUGF0aDtcblx0XHRcdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5vTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdGAke3NQYXJlbnRFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBvRHJhZnROb2RlID0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0Lm9Nb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0YCR7c1BhcmVudEVudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBFbnN1cmVzIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhcyBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICogU2luY2UgdGhlIHByb3BlcnR5IERhdGEgaXMgb2YgdGhlIHR5cGUgJ29iamVjdCcsIGl0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHRlbXBsYXRlLlxuXHQgKiBAcGFyYW0gZGF0YUVsZW1lbnQgVGhlIGRhdGEgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBwYXRoIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUuXG5cdCAqL1xuXHRnZXREYXRhRnJvbVRlbXBsYXRlOiBmdW5jdGlvbiAoZGF0YUVsZW1lbnQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0UGF0aCA9IGRhdGFFbGVtZW50LmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3QgY29ubmVjdGVkRGF0YVBhdGggPSBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vQGA7XG5cdFx0Y29uc3QgY29ubmVjdGVkT2JqZWN0ID0gZGF0YUVsZW1lbnQuZ2V0T2JqZWN0KGNvbm5lY3RlZERhdGFQYXRoKTtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IGNvbm5lY3RlZE9iamVjdC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5ID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFRlbXAubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBzcGxpdFRlbXBbaV0uc3BsaXQoXCJ7XCIpWzFdLnRyaW0oKTtcblx0XHRcdHRlbXBBcnJheS5wdXNoKGtleSk7XG5cdFx0fVxuXHRcdE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdGlmIChzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpKSB7XG5cdFx0XHRcdGRlbGV0ZSBjb25uZWN0ZWRPYmplY3QuRGF0YVtzS2V5XTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRjb25zdCBpbmRleCA9IE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5pbmRleE9mKGRhdGFLZXkpO1xuXHRcdHJldHVybiBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vRGF0YS8ke3RlbXBBcnJheVtpbmRleF19YDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBlbmQgb2YgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHJlYWNoZWQuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgY29ubmVjdGVkIGZpZWxkcy5cblx0ICogQHBhcmFtIHRhcmdldC5UZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGFyZ2V0LkRhdGFcblx0ICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBUcnVlIG9yIEZhbHNlIChkZXBlbmRpbmcgb24gdGhlIHRlbXBsYXRlIGluZGV4KS5cblx0ICovXG5cdG5vdExhc3RJbmRleDogZnVuY3Rpb24gKHRhcmdldDogeyBUZW1wbGF0ZTogc3RyaW5nOyBEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBlbGVtZW50OiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRhcmdldC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBpc0xhc3RJbmRleCA9IGZhbHNlO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRUZW1wLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0VGVtcFtpXS5zcGxpdChcIntcIilbMV0udHJpbSgpO1xuXHRcdFx0dGVtcEFycmF5LnB1c2goZGF0YUtleSk7XG5cdFx0fVxuXG5cdFx0dGVtcEFycmF5LmZvckVhY2goZnVuY3Rpb24gKHRlbXBsYXRlSW5mbzogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSB0ZW1wQXJyYXkubGVuZ3RoIC0gMTtcblx0XHRcdGlmICh0YXJnZXQuRGF0YVt0ZW1wbGF0ZUluZm9dID09PSBlbGVtZW50ICYmIHRlbXBBcnJheS5pbmRleE9mKHRlbXBsYXRlSW5mbykgPCBsYXN0SW5kZXgpIHtcblx0XHRcdFx0aXNMYXN0SW5kZXggPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBpc0xhc3RJbmRleDtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUgZGVsaW1pdGVyIGZyb20gdGhlIHRlbXBsYXRlLlxuXHQgKiBAcGFyYW0gdGVtcGxhdGUgVGhlIHRlbXBsYXRlIHN0cmluZy5cblx0ICogQHJldHVybnMgVGhlIGRlbGltaXRlciBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nLlxuXHQgKi9cblx0Z2V0RGVsaW1pdGVyOiBmdW5jdGlvbiAodGVtcGxhdGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRlbXBsYXRlLnNwbGl0KFwifVwiKVsxXS5zcGxpdChcIntcIilbMF0udHJpbSgpO1xuXHR9LFxuXG5cdG9NZXRhTW9kZWw6IHVuZGVmaW5lZCBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZCxcblx0c2V0TWV0YU1vZGVsOiBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiB2b2lkIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9LFxuXG5cdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKCk6IE9EYXRhTWV0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YU1vZGVsITtcblx0fSxcblxuXHRnZXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgbWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKG1ldGFNb2RlbCkge1xuXHRcdFx0Y29uc3Qgb1BhcmFtZXRlckluZm8gPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJJbmZvKG1ldGFNb2RlbCwgc1BhdGgpO1xuXHRcdFx0aWYgKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gY2FsbGluZyBhbiBhY3Rpb24gaGFuZGxlciB2aWEgdGhlIEZQTSBoZWxwZXIncyBhY3Rpb25XcmFwcGVyIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAnRlBNLmFjdGlvbldyYXBwZXIoKScgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBvQWN0aW9uIEFjdGlvbiBtZXRhZGF0YVxuXHQgKiBAcGFyYW0gb0FjdGlvbi5oYW5kbGVyTW9kdWxlIE1vZHVsZSBjb250YWluaW5nIHRoZSBhY3Rpb24gaGFuZGxlciBtZXRob2Rcblx0ICogQHBhcmFtIG9BY3Rpb24uaGFuZGxlck1ldGhvZCBBY3Rpb24gaGFuZGxlciBtZXRob2QgbmFtZVxuXHQgKiBAcGFyYW0gW29UaGlzXSBgdGhpc2AgKGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIG1hY3JvKVxuXHQgKiBAcGFyYW0gb1RoaXMuaWQgVGhlIHRhYmxlJ3MgSURcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudS4gSWYgZmFsc2UsIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhclxuXHQgKiBAcmV0dXJucyBUaGUgYWN0aW9uIHdyYXBwZXIgYmluZGluZ1x0ZXhwcmVzc2lvblxuXHQgKi9cblx0YnVpbGRBY3Rpb25XcmFwcGVyOiBmdW5jdGlvbiAoXG5cdFx0b0FjdGlvbjogQ3VzdG9tQWN0aW9uLFxuXHRcdG9UaGlzOiB7IGlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdFx0Y29uc3QgYVBhcmFtczogdW5rbm93bltdID0gW3JlZihcIiRldmVudFwiKSwgb0FjdGlvbi5oYW5kbGVyTW9kdWxlLCBvQWN0aW9uLmhhbmRsZXJNZXRob2RdO1xuXG5cdFx0aWYgKG9UaGlzICYmIG9UaGlzLmlkKSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsUGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiJHtpbnRlcm5hbD5zZWxlY3RlZENvbnRleHRzfVwiIDogXCIke2ludGVybmFsPmNvbnRleHRtZW51L3NlbGVjdGVkQ29udGV4dHN9XCI7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFBhcmFtcyA9IHsgY29udGV4dHM6IHJlZihpbnRlcm5hbE1vZGVsUGF0aCkgfTtcblx0XHRcdGFQYXJhbXMucHVzaChvQWRkaXRpb25hbFBhcmFtcyk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmbihcIkZQTS5hY3Rpb25XcmFwcGVyXCIsIGFQYXJhbXMpKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIHdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIGRlcGVuZGluZyBvbiB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdCAqIEl0IGlzIGludmVydGVkIGFzIHRoZSBVSSBlbGVtZW50cyBoYXZlIGEgdmlzaWJsZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGlkZGVuIG9uZS5cblx0ICogQHBhcmFtIGRhdGFGaWVsZEFubm90YXRpb25zIFRoZSBkYXRhRmllbGQgb2JqZWN0XG5cdCAqIEByZXR1cm5zIEEgcGF0aCBvciBhIEJvb2xlYW5cblx0ICovXG5cdGdldEhpZGRlblBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiAoZGF0YUZpZWxkQW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgJFBhdGg/OiBzdHJpbmcgfT4pOiBzdHJpbmcgfCBib29sZWFuIHtcblx0XHRpZiAoZGF0YUZpZWxkQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBoaWRkZW4gPSBkYXRhRmllbGRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGhpZGRlbiA9PT0gXCJvYmplY3RcIiA/IFwiez0gISR7XCIgKyBoaWRkZW4uJFBhdGggKyBcIn0gfVwiIDogIWhpZGRlbjtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBmZXRjaCB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIGZpbHRlciByZXN0cmljdGlvbnMgdGhhdCBjYW4gYmUgYW5ub3RhdGVkIG9uIGFuIGVudGl0eSBzZXQgb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHQgKiBXZSByZXR1cm4gdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVzdHJpY3Rpb24gYW5kIGFsc28gY2hlY2sgZm9yIHRoZSBvcGVyYXRvcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZW0uXG5cdCAqIEBwYXJhbSBzUHJvcGVydHkgU3RyaW5nIG5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0UGF0aCBTdHJpbmcgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdCAqIEBwYXJhbSBzVHlwZSBTdHJpbmcgZGF0YSB0eXBlIG9kIHRoZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgZWRtLkRhdGVcblx0ICogQHBhcmFtIGJVc2VTZW1hbnRpY0RhdGVSYW5nZSBCb29sZWFuIHBhc3NlZCBmcm9tIHRoZSBtYW5pZmVzdCBmb3Igc2VtYW50aWMgZGF0ZSByYW5nZVxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgU3RyaW5naWZpZWQgb2JqZWN0IG9mIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBvciBwcm9wZXJ0eSBzZXR0aW5ncyBhcyBhIHdob2xlXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG9wZXJhdG9ycyBmb3IgZmlsdGVyaW5nXG5cdCAqL1xuXHRnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdFx0b0NvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNUeXBlPzogc3RyaW5nLFxuXHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4gfCBzdHJpbmcsXG5cdFx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncyB8IHN0cmluZ1xuXHQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb0NvbnRleHQpO1xuXHRcdGNvbnN0IGFFcXVhbHNPcHMgPSBbXCJFUVwiXTtcblx0XHRjb25zdCBhU2luZ2xlUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdFx0Y29uc3QgYVNpbmdsZVJhbmdlRFRCYXNpY09wcyA9IFtcIkVRXCIsIFwiQlRcIl07XG5cdFx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdFx0Y29uc3QgYVNlYXJjaEV4cHJlc3Npb25PcHMgPSBbXCJDb250YWluc1wiLCBcIk5vdENvbnRhaW5zXCIsIFwiU3RhcnRzV2l0aFwiLCBcIk5vdFN0YXJ0c1dpdGhcIiwgXCJFbmRzV2l0aFwiLCBcIk5vdEVuZHNXaXRoXCJdO1xuXHRcdGNvbnN0IGFCYXNpY1NlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRCYXNpY1NlbWFudGljRGF0ZU9wZXJhdGlvbnMoKTtcblx0XHRjb25zdCBiU2VtYW50aWNEYXRlUmFuZ2UgPSBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgPT09IFwidHJ1ZVwiIHx8IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gdHJ1ZTtcblx0XHRsZXQgYVNlbWFudGljRGF0ZU9wczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBvU2V0dGluZ3MgPSBzZXR0aW5ncyAmJiB0eXBlb2Ygc2V0dGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNldHRpbmdzKS5jdXN0b21EYXRhIDogc2V0dGluZ3M7XG5cblx0XHRpZiAoKG9Db250ZXh0LmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCkgYXMgdW5rbm93bikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBhRXF1YWxzT3BzO1xuXHRcdH1cblxuXHRcdGlmIChvU2V0dGluZ3MgJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbiAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0RmlsdGVyT3BlcmF0aW9ucyhvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLCBzVHlwZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBEZWZhdWx0U2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMoc1R5cGUpO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgT3BlcmF0b3JzIGZvciB0aGlzIFByb3BlcnR5IFR5cGVcblx0XHRjb25zdCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHNUeXBlKTtcblx0XHRsZXQgc3VwcG9ydGVkT3BlcmF0b3JzID0gYURlZmF1bHRPcGVyYXRvcnM7XG5cdFx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdFx0Y29uc3QgZXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnMgPSBFeHRlbmRlZFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zKCk7XG5cdFx0XHRzdXBwb3J0ZWRPcGVyYXRvcnMgPSBbLi4uYUJhc2ljU2VtYW50aWNEYXRlT3BzLCAuLi5hRGVmYXVsdE9wZXJhdG9ycywgLi4uZXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnNdO1xuXHRcdH1cblxuXHRcdGxldCByZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBJcyB0aGVyZSBhIEZpbHRlciBSZXN0cmljdGlvbiBkZWZpbmVkIGZvciB0aGlzIHByb3BlcnR5P1xuXHRcdGlmIChcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMgJiZcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zICYmXG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldXG5cdFx0KSB7XG5cdFx0XHQvLyBFeHRlbmRpbmcgdGhlIGRlZmF1bHQgb3BlcmF0b3JzIGxpc3Qgd2l0aCBTZW1hbnRpYyBEYXRlIG9wdGlvbnMgREFURVJBTkdFLCBEQVRFLCBGUk9NIGFuZCBUT1xuXHRcdFx0Y29uc3Qgc0FsbG93ZWRFeHByZXNzaW9uID0gQ29tbW9uVXRpbHMuZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKTtcblx0XHRcdC8vIEluIGNhc2UgbW9yZSB0aGFuIG9uZSBBbGxvd2VkIEV4cHJlc3Npb25zIGhhcyBiZWVuIGRlZmluZWQgZm9yIGEgcHJvcGVydHlcblx0XHRcdC8vIGNob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBBbGxvd2VkIEV4cHJlc3Npb25cblxuXHRcdFx0Ly8gTXVsdGlWYWx1ZSBoYXMgc2FtZSBPcGVyYXRvciBhcyBTaW5nbGVWYWx1ZSwgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIChtYXhDb25kaXRpb25zKVxuXHRcdFx0c3dpdGNoIChzQWxsb3dlZEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRcdFx0Y29uc3Qgc2luZ2xlVmFsdWVEYXRlT3BzID0gRGVmYXVsdFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTaW5nbGVWYWx1ZURhdGVPcGVyYXRpb25zKCk7XG5cdFx0XHRcdFx0Y29uc3QgYVNpbmdsZVZhbHVlT3BzID0gc1R5cGUgPT09IFwiRWRtLkRhdGVcIiAmJiBiU2VtYW50aWNEYXRlUmFuZ2UgPyBzaW5nbGVWYWx1ZURhdGVPcHMgOiBhRXF1YWxzT3BzO1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoc3VwcG9ydGVkT3BlcmF0b3JzLCBhU2luZ2xlVmFsdWVPcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiTXVsdGlWYWx1ZVwiOlxuXHRcdFx0XHRcdGNvbnN0IG11bHRpVmFsdWVPcGVyYXRvcnMgPSBbLi4uYUVxdWFsc09wcywgXCJFbXB0eVwiLCBcIk5vdEVtcHR5XCJdO1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoc3VwcG9ydGVkT3BlcmF0b3JzLCBtdWx0aVZhbHVlT3BlcmF0b3JzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlNpbmdsZVJhbmdlXCI6XG5cdFx0XHRcdFx0bGV0IGFFeHByZXNzaW9uT3BzOiBzdHJpbmdbXTtcblx0XHRcdFx0XHRpZiAoYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRcdFx0XHRpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVcIikge1xuXHRcdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTZW1hbnRpY0RhdGVPcHM7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHNUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNlbWFudGljRGF0ZU9wcztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlT3BzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlRFRCYXNpY09wcztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2luZ2xlUmFuZ2VPcHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNPcGVyYXRvcnMgPSBfZ2V0UmVzdHJpY3Rpb25zKHN1cHBvcnRlZE9wZXJhdG9ycywgYUV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IHNPcGVyYXRvcnM7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlXCI6XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhzdXBwb3J0ZWRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKHN1cHBvcnRlZE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoc3VwcG9ydGVkT3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcy5jb25jYXQoYU11bHRpUmFuZ2VPcHMpKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCByZWNvZ25pc2VkLCB1bmRlZmluZWQgaW4gcmV0dXJuIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgc2V0IG9mXG5cdFx0XHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlLlxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdHJpY3Rpb25zO1xuXHR9LFxuXHRnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChwcm9wZXJ0eVR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcHJvdmlkZWQgZm9yIHR5cGUgRWRtLkRhdGUgdGhlbiBhbGwgdGhlIGRlZmF1bHRcblx0XHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlIHNob3VsZCBiZSByZXR1cm5lZCBleGNsdWRpbmcgc2VtYW50aWMgb3BlcmF0b3JzIGZyb20gdGhlIGxpc3QuXG5cdFx0Y29uc3QgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhwcm9wZXJ0eVR5cGUpO1xuXHRcdGNvbnN0IGFNdWx0aVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTkVcIiwgXCJOT1RCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRcdHJldHVybiBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhTXVsdGlSYW5nZU9wcyk7XG5cdH0sXG5cdGdldEFJSWNvbjogZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFpSWNvbjtcblx0fVxufTtcbihDb21tb25IZWxwZXIuZ2V0U29ydENvbmRpdGlvbnMgYXMgeyByZXF1aXJlc0lDb250ZXh0PzogYm9vbGVhbiB9KS5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tbW9uSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFzQ0EsU0FBU0EsZ0JBQWdCQSxDQUFDQyxXQUFxQixFQUFFQyxjQUF3QixFQUFZO0lBQ3BGO0lBQ0E7SUFDQSxPQUFPRCxXQUFXLENBQUNFLE1BQU0sQ0FBQyxVQUFVQyxRQUFRLEVBQUU7TUFDN0MsT0FBT0YsY0FBYyxDQUFDRyxRQUFRLENBQUNELFFBQVEsQ0FBQztJQUN6QyxDQUFDLENBQUM7RUFDSDtFQUVBLFNBQVNFLG9CQUFvQkEsQ0FBQ0MsYUFBc0IsRUFBWTtJQUMvRDtJQUNBO0lBQ0EsTUFBTUMsVUFBVSxHQUFHQyxPQUFPLENBQUNDLG9CQUFvQixDQUFDSCxhQUFhLENBQUM7SUFDOUQ7SUFDQSxNQUFNSSxTQUFTLEdBQUdGLE9BQU8sQ0FBQ0csV0FBVyxDQUFDSixVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBT0ssa0JBQWtCLENBQUNDLG1CQUFtQixDQUFDSCxTQUFTLENBQUM7RUFDekQ7RUFFQSxNQUFNSSxVQUFVLEdBQUdDLFFBQVEsQ0FBQ0QsVUFBVTtFQUN0QyxNQUFNRSxZQUFZLEdBQUc7SUFDcEJDLFlBQVksRUFBRSxTQUFBQSxDQUFVQyxJQUFhLEVBQVU7TUFDOUMsT0FBT0EsSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG9CQUFvQixFQUFFLFNBQUFBLENBQVVDLE1BQWMsRUFBRUMsVUFBdUMsRUFBVTtNQUNoRyxNQUFNQyxNQUFNLEdBQUdELFVBQVUsQ0FBQ0UsT0FBTyxDQUFDQyxRQUFRLENBQUMsQ0FBQztRQUMzQ0MsYUFBYSxHQUFHSixVQUFVLENBQUNFLE9BQU8sQ0FBQ0csT0FBTyxDQUFDLENBQUM7UUFDNUNDLFlBQVksR0FBR0wsTUFBTSxDQUFDSixTQUFTLENBQUMsR0FBR08sYUFBYSxHQUFHLENBQUM7UUFDcERHLFlBQVksR0FBR0QsWUFBWSxDQUFDLDhDQUE4QyxDQUFDO1FBQzNFRSxTQUFTLEdBQUdGLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQztRQUN4REcsUUFBUSxHQUFHSCxZQUFZLENBQUMsNkJBQTZCLENBQUM7TUFFdkQsSUFBSUksU0FBaUMsR0FBR0MsYUFBYSxDQUFDQyxRQUFRO01BRTlELElBQUlKLFNBQVMsSUFBSUMsUUFBUSxFQUFFO1FBQzFCQyxTQUFTLEdBQUdDLGFBQWEsQ0FBQ0UsUUFBUTtNQUNuQyxDQUFDLE1BQU0sSUFBSU4sWUFBWSxFQUFFO1FBQ3hCLElBQUlBLFlBQVksQ0FBQ08sV0FBVyxFQUFFO1VBQzdCLElBQUlQLFlBQVksQ0FBQ08sV0FBVyxLQUFLLDBEQUEwRCxFQUFFO1lBQzVGSixTQUFTLEdBQUdDLGFBQWEsQ0FBQ0UsUUFBUTtVQUNuQztVQUNBLElBQ0NOLFlBQVksQ0FBQ08sV0FBVyxLQUFLLDhEQUE4RCxJQUMzRlAsWUFBWSxDQUFDTyxXQUFXLEtBQUssd0RBQXdELEVBQ3BGO1lBQ0RKLFNBQVMsR0FBR0MsYUFBYSxDQUFDSSxRQUFRO1VBQ25DO1FBQ0Q7UUFDQSxJQUFJUixZQUFZLENBQUNTLEtBQUssRUFBRTtVQUN2Qk4sU0FBUyxHQUNSLE9BQU8sR0FDUEgsWUFBWSxDQUFDUyxLQUFLLEdBQ2xCLGFBQWEsR0FDYlQsWUFBWSxDQUFDUyxLQUFLLEdBQ2xCLGFBQWEsR0FDYkwsYUFBYSxDQUFDSSxRQUFRLEdBQ3RCLE9BQU8sR0FDUEosYUFBYSxDQUFDRSxRQUFRLEdBQ3RCLFFBQVEsR0FDUkYsYUFBYSxDQUFDQyxRQUFRLEdBQ3RCLElBQUk7UUFDTjtNQUNEO01BRUEsT0FBT0YsU0FBUztJQUNqQixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NPLFdBQVcsRUFBRSxTQUFBQSxDQUFVbEIsTUFBZSxFQUFFQyxVQUF1QyxFQUFzQjtNQUNwRyxPQUFRQSxVQUFVLElBQUlBLFVBQVUsQ0FBQ0UsT0FBTyxJQUFJRixVQUFVLENBQUNFLE9BQU8sQ0FBQ0csT0FBTyxDQUFDLENBQUMsSUFBS2EsU0FBUztJQUN2RixDQUFDO0lBQ0RDLGNBQWMsRUFBRSxTQUFBQSxDQUFVcEIsTUFBZSxFQUFFQyxVQUF1QyxFQUFVO01BQzNGb0IsWUFBWSxDQUFDcEIsVUFBVSxDQUFDRSxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDM0MsT0FBT0gsVUFBVSxDQUFDRSxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUNrQixLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0RDLFNBQVMsRUFBRSxTQUFBQSxDQUFBLEVBQXFCO01BQy9CLE9BQU9DLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDQyxPQUFPLEtBQUssSUFBSTtJQUN0QyxDQUFDO0lBQ0RDLHVCQUF1QixFQUFFLFNBQUFBLENBQVV4QixPQUFnQixFQUFFeUIsYUFBc0IsRUFBVTtNQUNwRixJQUFJQyxLQUFLLEdBQUcxQixPQUFPLENBQUNHLE9BQU8sQ0FBQyxDQUFDO01BQzdCLElBQ0VILE9BQU8sQ0FBQ0wsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUEyQixXQUFXLElBQ2hFSyxPQUFPLENBQUNMLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUE0QixJQUFJLEVBQ3BFO1FBQ0QsT0FBTytCLEtBQUs7TUFDYjtNQUVBLE1BQU1DLEtBQUssR0FBRzNCLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLENBQWdDO01BQy9ELE1BQU0yQixTQUFTLEdBQUdELEtBQUssQ0FBQ0UsR0FBRyxDQUFpQixzQ0FBc0MsQ0FBQyxHQUFHRixLQUFLLEdBQUdBLEtBQUssQ0FBQ0csWUFBWSxDQUFDLENBQUM7TUFDbEhKLEtBQUssR0FBR0UsU0FBUyxDQUFDYixXQUFXLENBQUNXLEtBQUssQ0FBQzs7TUFFcEM7TUFDQSxNQUFNSyxNQUFNLEdBQUdMLEtBQUssQ0FBQ00sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDdEQsTUFBTSxDQUFDLFVBQVV1RCxLQUFhLEVBQVc7UUFDeEUsT0FBTyxDQUFDLENBQUNBLEtBQUssSUFBSUEsS0FBSyxJQUFJLE9BQU87TUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNKLE1BQU1DLFNBQVMsR0FBRyxJQUFJSCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDakMsSUFBSUEsTUFBTSxDQUFDSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU9ELFNBQVM7TUFDakI7TUFDQSxNQUFNRSxvQkFBb0IsR0FBR1gsYUFBYSxLQUFLVCxTQUFTLEdBQUdlLE1BQU0sQ0FBQ00sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBR2IsYUFBYTtNQUMvSCxPQUFPLEdBQUdTLFNBQVMsK0JBQStCRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVERyxvQkFBb0IsRUFBRSxTQUFBQSxDQUNyQnZDLE9BQWdCLEVBQ2hCd0MsVUFBMEMsRUFDMUNDLGlCQUEyQixFQUNrQjtNQUM3QyxNQUFNMUMsTUFBTSxHQUFHQyxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFtQjtRQUNsREMsYUFBYSxHQUFHRixPQUFPLENBQUNHLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDO1FBQ0F1QyxxQkFBcUIsR0FBR2xELFlBQVksQ0FBQ21ELDBCQUEwQixDQUFDNUMsTUFBTSxFQUFFRyxhQUFhLENBQUM7UUFDdEYwQyxTQUFTLEdBQUcxQyxhQUFhLENBQUMyQyxPQUFPLENBQUMsR0FBR0gscUJBQXFCLEdBQUcsRUFBRSxFQUFFLENBQUM7TUFFbkUsSUFDQ0YsVUFBVSxLQUNUQSxVQUFVLENBQUNNLEtBQUssS0FBSywrQ0FBK0MsSUFDcEVOLFVBQVUsQ0FBQ00sS0FBSyxLQUFLLDhEQUE4RCxDQUFDLEVBQ3BGO1FBQ0QsT0FBTyxLQUFLO01BQ2I7TUFFQSxPQUFPUCxvQkFBb0IsQ0FBQ3hDLE1BQU0sRUFBRTJDLHFCQUFxQixFQUFFRSxTQUFTLEVBQUVILGlCQUFpQixDQUFDO0lBQ3pGLENBQUM7SUFFREUsMEJBQTBCLEVBQUUsU0FBQUEsQ0FBVTVDLE1BQXNCLEVBQUVHLGFBQXFCLEVBQVU7TUFDNUYsSUFBSTZDLE9BQU87TUFDWCxJQUFJQyxlQUFlLEdBQUc5QyxhQUFhLENBQUNtQyxLQUFLLENBQUMsQ0FBQyxFQUFFbkMsYUFBYSxDQUFDK0MsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQzVFLElBQUlsRCxNQUFNLENBQUNKLFNBQVMsQ0FBQyxHQUFHcUQsZUFBZSxRQUFRLENBQUMsS0FBSyxpQkFBaUIsRUFBRTtRQUN2RUQsT0FBTyxHQUFHQyxlQUFlLENBQUNiLE1BQU0sR0FBRyxDQUFDO1FBQ3BDYSxlQUFlLEdBQUc5QyxhQUFhLENBQUNtQyxLQUFLLENBQUNVLE9BQU8sRUFBRTdDLGFBQWEsQ0FBQ2dELE9BQU8sQ0FBQyxHQUFHLEVBQUVILE9BQU8sQ0FBQyxDQUFDO01BQ3BGO01BQ0EsT0FBT0MsZUFBZTtJQUN2QixDQUFDO0lBQ0RHLG1CQUFtQixFQUFFLFNBQUFBLENBQVVDLFFBQWlCLEVBQVU7TUFDekQsTUFBTTFCLEtBQUssR0FBRzBCLFFBQVEsQ0FBQ2pELE9BQU8sQ0FBQyxDQUFDO1FBQy9Ca0QsYUFBYSxHQUFHRCxRQUFRLENBQUN6RCxTQUFTLENBQUMsR0FBRytCLEtBQUssUUFBUSxDQUFDO01BRXJELE9BQU80QixXQUFXLENBQUNDLGdCQUFnQixDQUFDN0IsS0FBSyxFQUFFMkIsYUFBYSxDQUFDO0lBQzFELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDRyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVQyxVQUEwQixFQUFFQyxXQUFtQixFQUFzQjtNQUNoRyxNQUFNQyxnQkFBZ0IsR0FBR0YsVUFBVSxDQUFDOUQsU0FBUyxDQUFDLEdBQUcsQ0FBQztNQUNsRCxLQUFLLE1BQU1pRSxHQUFHLElBQUlELGdCQUFnQixFQUFFO1FBQ25DLElBQUksT0FBT0EsZ0JBQWdCLENBQUNDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSUQsZ0JBQWdCLENBQUNDLEdBQUcsQ0FBQyxDQUFDZCxLQUFLLEtBQUtZLFdBQVcsRUFBRTtVQUM3RixPQUFPRSxHQUFHO1FBQ1g7TUFDRDtNQUNBLE9BQU81QyxTQUFTO0lBQ2pCLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0M2QyxhQUFhLEVBQUUsU0FBQUEsQ0FDZEMsT0FBZ0IsRUFDaEJDLGVBQXdCLEVBQ3hCQyxXQUFvQixFQUNwQkMsaUJBQTJCLEVBT3ZCO01BQ0osSUFBSUMsWUFBWSxHQUFHSixPQUFPLENBQUMzRCxPQUFPLENBQUMsQ0FBQyxDQUFDNkIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUVuRGdDLFdBQVcsR0FBRyxDQUFDQSxXQUFXLEdBQUdGLE9BQU8sQ0FBQ25FLFNBQVMsQ0FBQ21FLE9BQU8sQ0FBQzNELE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRzZELFdBQVc7TUFFL0UsSUFBSUEsV0FBVyxJQUFJQSxXQUFXLENBQUNwRixRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDN0M7UUFDQW9GLFdBQVcsR0FBR0EsV0FBVyxDQUFDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4QyxDQUFDLE1BQU0sSUFBSThCLE9BQU8sQ0FBQ25FLFNBQVMsQ0FBQ3VFLFlBQVksQ0FBQyxFQUFFO1FBQzNDO1FBQ0EsTUFBTUMsZUFBZSxHQUFHTCxPQUFPLENBQUNuRSxTQUFTLENBQUN1RSxZQUFZLENBQUMsQ0FBQ3BCLEtBQUs7UUFDN0QsTUFBTXNCLFdBQVcsR0FBRyxJQUFJLENBQUNaLGdCQUFnQixDQUFDTSxPQUFPLENBQUM3RCxRQUFRLENBQUMsQ0FBQyxFQUFFa0UsZUFBZSxDQUFDO1FBQzlFLElBQUlDLFdBQVcsRUFBRTtVQUNoQkYsWUFBWSxHQUFHLElBQUlFLFdBQVcsRUFBRTtRQUNqQztNQUNELENBQUMsTUFBTTtRQUNOLE9BQU9GLFlBQVk7TUFDcEI7TUFFQSxJQUFJRCxpQkFBaUIsRUFBRTtRQUN0QixPQUFPSCxPQUFPLENBQUNuRSxTQUFTLENBQUMsR0FBR3VFLFlBQVksSUFBSUYsV0FBVyx1Q0FBdUMsQ0FBQztNQUNoRztNQUNBLElBQUlELGVBQWUsRUFBRTtRQUNwQixPQUFPLEdBQUdHLFlBQVksSUFBSUYsV0FBVyxFQUFFO01BQ3hDLENBQUMsTUFBTTtRQUNOLE9BQU87VUFDTkUsWUFBWSxFQUFFQSxZQUFZO1VBQzFCdEIsU0FBUyxFQUFFa0IsT0FBTyxDQUFDbkUsU0FBUyxDQUFDLEdBQUd1RSxZQUFZLElBQUlGLFdBQVcsNkNBQTZDLENBQUM7VUFDekdLLGlCQUFpQixFQUFFUCxPQUFPLENBQUNuRSxTQUFTLENBQUMsR0FBR3VFLFlBQVksSUFBSUYsV0FBVyxzQ0FBc0M7UUFDMUcsQ0FBQztNQUNGO0lBQ0QsQ0FBQztJQUVETSxvQkFBb0IsRUFBRSxTQUFBQSxDQUFVbEIsUUFBaUIsRUFBVTtNQUMxRCxPQUFPbUIsMEJBQTBCLENBQUNDLGlCQUFpQixDQUFDcEIsUUFBUSxDQUFDakQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3FFLGlCQUFpQixFQUFFLFNBQUFBLENBQVV0RSxhQUFxQixFQUFFdUUsYUFBdUIsRUFBVTtNQUNwRixNQUFNQyxxQkFBcUIsR0FBR3hFLGFBQWEsQ0FBQ3lFLFVBQVUsQ0FBQyxHQUFHLENBQUM7TUFDM0QsTUFBTTVDLE1BQU0sR0FBRzdCLGFBQWEsQ0FBQzhCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ3RELE1BQU0sQ0FBQyxVQUFVa0csSUFBWSxFQUFFO1FBQ3RFLE9BQU8sQ0FBQyxDQUFDQSxJQUFJO01BQ2QsQ0FBQyxDQUFDO01BQ0YsSUFBSUYscUJBQXFCLEVBQUU7UUFDMUIzQyxNQUFNLENBQUM4QyxLQUFLLENBQUMsQ0FBQztNQUNmO01BQ0EsSUFBSSxDQUFDSixhQUFhLEVBQUU7UUFDbkIxQyxNQUFNLENBQUMrQyxHQUFHLENBQUMsQ0FBQztNQUNiO01BQ0EsT0FBTy9DLE1BQU0sQ0FBQ08sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0N5QyxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVakIsT0FBZ0IsRUFBVTtNQUNyRCxPQUFPdEUsWUFBWSxDQUFDcUUsYUFBYSxDQUFDQyxPQUFPLEVBQUUsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ2tCLDRCQUE0QixFQUFFLFNBQUFBLENBQVVsQixPQUFnQixFQUFVO01BQ2pFLE1BQU1wQyxLQUFLLEdBQUdsQyxZQUFZLENBQUNxRSxhQUFhLENBQUNDLE9BQU8sRUFBRSxJQUFJLENBQUM7TUFDdkQsT0FBTyxHQUFHcEMsS0FBSyxtQkFBbUI7SUFDbkMsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDdUQsZUFBZSxFQUFFLFNBQUFBLENBQVVDLE1BQWMsRUFBRUMsT0FBaUIsRUFBVTtNQUNyRSxJQUFJQSxPQUFPLElBQUlELE1BQU0sRUFBRTtRQUN0QkEsTUFBTSxHQUFHLElBQUksQ0FBQ0Usa0JBQWtCLENBQUNGLE1BQU0sQ0FBQztNQUN6QztNQUNBLE9BQU8sSUFBSUEsTUFBTSxHQUFHO0lBQ3JCLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLGtCQUFrQixFQUFFLFNBQUFBLENBQVVGLE1BQWMsRUFBVTtNQUNyRCxPQUFPQSxNQUFNLENBQUNyQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDd0MsZ0JBQWdCLEVBQUUsU0FBQUEsQ0FBVUMsU0FBaUIsRUFBNkI7TUFDekUsSUFBSUMsT0FBTyxHQUFHLEVBQUU7TUFDaEIsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLElBQUFDLFNBQUEsQ0FBQXRELE1BQUEsWUFBQXNELFNBQUEsQ0FBQXRELE1BQUEsS0FBYyxFQUFFcUQsQ0FBQyxFQUFFLEVBQUU7UUFDckNELE9BQU8sSUFBU0MsQ0FBQyxZQUFBQyxTQUFBLENBQUF0RCxNQUFBLElBQURxRCxDQUFDLE9BQUF4RSxTQUFBLEdBQUF5RSxTQUFBLENBQURELENBQUMsS0FBQztRQUNsQixJQUFJQSxDQUFDLEdBQUcsQ0FBQUMsU0FBQSxDQUFBdEQsTUFBQSxZQUFBc0QsU0FBQSxDQUFBdEQsTUFBQSxRQUFjLENBQUMsRUFBRTtVQUN4Qm9ELE9BQU8sSUFBSSxJQUFJO1FBQ2hCO01BQ0Q7TUFFQSxJQUFJRyxTQUFTLEdBQUcsR0FBR0osU0FBUyxJQUFJO01BQ2hDLElBQUlDLE9BQU8sRUFBRTtRQUNaRyxTQUFTLEdBQUcsR0FBR0osU0FBUyxJQUFJQyxPQUFPLEdBQUc7TUFDdkM7TUFDQSxPQUFPRyxTQUFTO0lBQ2pCLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRUNDLGdDQUFnQyxFQUFFLFNBQUFBLENBQVVDLElBQVksRUFBRUMsV0FBb0IsRUFBb0M7TUFDakgsT0FBT0MsaUJBQWlCLENBQ3ZCQyxNQUFNLENBQ0xDLFFBQVEsQ0FBQ0gsV0FBVyxDQUFDLEVBQ3JCSSxLQUFLLENBQUNDLFdBQVcsQ0FBQyx5QkFBeUJOLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUNyRU8sUUFBUSxDQUFDRCxXQUFXLENBQUMseUJBQXlCTixJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLENBQ3hFLENBQ0QsQ0FBQztJQUNGLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NRLGNBQWMsRUFBRSxTQUFBQSxDQUFVQyxPQUFnQyxFQUFVO01BQ25FLElBQUlDLGFBQWEsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNILE9BQU8sQ0FBQyxDQUFDbEUsTUFBTTtRQUM5Q29ELE9BQU8sR0FBRyxFQUFFO01BRWIsS0FBSyxNQUFNa0IsSUFBSSxJQUFJSixPQUFPLEVBQUU7UUFDM0IsSUFBSW5CLE1BQU0sR0FBR21CLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDO1FBQzFCLElBQUl2QixNQUFNLElBQUksT0FBT0EsTUFBTSxLQUFLLFFBQVEsRUFBRTtVQUN6Q0EsTUFBTSxHQUFHLElBQUksQ0FBQ2tCLGNBQWMsQ0FBQ2xCLE1BQWlDLENBQUM7UUFDaEU7UUFDQUssT0FBTyxJQUFJLEdBQUdrQixJQUFJLEtBQUt2QixNQUFNLEVBQUU7UUFDL0IsSUFBSW9CLGFBQWEsR0FBRyxDQUFDLEVBQUU7VUFDdEIsRUFBRUEsYUFBYTtVQUNmZixPQUFPLElBQUksSUFBSTtRQUNoQjtNQUNEO01BRUEsT0FBTyxLQUFLQSxPQUFPLEdBQUc7SUFDdkIsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ21CLHNCQUFzQixFQUFFLFNBQUFBLENBQVVDLFdBQW9CLEVBQXNCO01BQzNFLE9BQU9BLFdBQVcsR0FBR0EsV0FBVyxDQUFDOUQsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsR0FBRzdCLFNBQVM7SUFDM0UsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQzRGLGVBQWUsRUFBRSxTQUFBQSxDQUFVQyxZQUFvQixFQUFzQjtNQUNwRSxJQUFJLENBQUNBLFlBQVksSUFBSUEsWUFBWSxLQUFLLElBQUksRUFBRTtRQUMzQyxPQUFPN0YsU0FBUztNQUNqQixDQUFDLE1BQU07UUFDTixNQUFNOEYsT0FBTyxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsWUFBWSxDQUFDO1FBQ3hDLElBQUksT0FBT0MsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDRyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0osT0FBTyxDQUFDLEVBQUU7VUFDM0QsTUFBTUssVUFBVSxHQUFHO1lBQ2xCQyxTQUFTLEVBQUU7VUFDWixDQUFDO1VBQ0RiLE1BQU0sQ0FBQ2MsTUFBTSxDQUFDRixVQUFVLEVBQUVMLE9BQU8sQ0FBQztVQUNsQyxPQUFPQyxJQUFJLENBQUNPLFNBQVMsQ0FBQ0gsVUFBVSxDQUFDO1FBQ2xDLENBQUMsTUFBTTtVQUNOLE1BQU1JLEtBQUssR0FBR04sS0FBSyxDQUFDQyxPQUFPLENBQUNKLE9BQU8sQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPQSxPQUFPO1VBQy9EVSxHQUFHLENBQUNDLEtBQUssQ0FBQyw4Q0FBOENGLEtBQUssNEJBQTRCLENBQUM7VUFDMUYsTUFBTSxJQUFJRyxLQUFLLENBQUMsMENBQTBDLENBQUM7UUFDNUQ7TUFDRDtJQUNELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG1CQUFtQixFQUFFLFNBQUFBLENBQVVDLEtBQWtDLEVBQVU7TUFDMUUsTUFBTWQsT0FBa0QsR0FBRztRQUMxRE0sU0FBUyxFQUFFO01BQ1osQ0FBQztNQUNETixPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUdjLEtBQUssWUFBWUMsT0FBTyxHQUFHRCxLQUFLLENBQUNqSSxTQUFTLENBQUMsQ0FBQyxHQUFHaUksS0FBSztNQUM1RSxPQUFPYixJQUFJLENBQUNPLFNBQVMsQ0FBQ1IsT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDZ0IsZUFBZSxFQUFFLFNBQUFBLENBQVVGLEtBQTBELEVBQVc7TUFDL0ZBLEtBQUssR0FBRyxPQUFPQSxLQUFLLEtBQUssUUFBUSxHQUFHYixJQUFJLENBQUNDLEtBQUssQ0FBQ1ksS0FBSyxDQUFDLEdBQUdBLEtBQUs7TUFDN0QsSUFBSUEsS0FBSyxJQUFJQSxLQUFLLENBQUNHLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNoRCxPQUFRSCxLQUFLLENBQStDLFlBQVksQ0FBQztNQUMxRTtNQUNBLE9BQU9BLEtBQUs7SUFDYixDQUFDO0lBQ0RJLGNBQWMsRUFBRSxTQUFBQSxDQUFVQyxNQUFlLEVBQUVuSSxVQUF1QyxFQUFVO01BQzNGLE1BQU00QixLQUFLLEdBQUc1QixVQUFVLElBQUlBLFVBQVUsQ0FBQ0UsT0FBTyxJQUFJRixVQUFVLENBQUNFLE9BQU8sQ0FBQ0csT0FBTyxDQUFDLENBQUM7TUFDOUUsT0FBT3VCLEtBQUssQ0FBQ0EsS0FBSyxDQUFDUyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHVCxLQUFLLENBQUNXLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBR1gsS0FBSztJQUNwRSxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0N3RyxpQkFBaUIsRUFBRSxTQUFBQSxDQUNsQjlFLFFBQWlGLEVBQ2pGK0Usb0JBQXdELEVBQ3hEQyx3QkFBZ0MsRUFDWDtNQUNyQixJQUNDRCxvQkFBb0IsSUFDcEIzSSxZQUFZLENBQUM2SSxnQ0FBZ0MsQ0FBQ0Qsd0JBQXdCLENBQUMsSUFDdkVELG9CQUFvQixDQUFDRyxTQUFTLEVBQzdCO1FBQ0QsTUFBTUMsZUFBdUUsR0FBRztVQUMvRUMsT0FBTyxFQUFFO1FBQ1YsQ0FBQztRQUVELE1BQU1DLFdBQVcsR0FBR3JGLFFBQVEsQ0FBQ2pELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzZCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckRtRyxvQkFBb0IsQ0FBQ0csU0FBUyxDQUFDSSxPQUFPLENBQUMsWUFBMkI7VUFBQSxJQUFqQkMsVUFBVSxHQUFBbEQsU0FBQSxDQUFBdEQsTUFBQSxRQUFBc0QsU0FBQSxRQUFBekUsU0FBQSxHQUFBeUUsU0FBQSxNQUFHLENBQUMsQ0FBQztVQUMvRCxJQUFJbUQsYUFBaUM7VUFDckMsTUFBTUMsT0FBZ0QsR0FBRyxDQUFDLENBQUM7VUFDM0QsSUFBSUYsVUFBVSxDQUFDRyxlQUFlLEVBQUU7WUFDL0JGLGFBQWEsR0FBR3hGLFFBQVEsQ0FBQ25ELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ04sU0FBUyxDQUFDOEksV0FBVyxHQUFHRSxVQUFVLENBQUNHLGVBQWUsQ0FBQ0MsZUFBZSxDQUFDLEVBQUVDLElBQUk7VUFDL0csQ0FBQyxNQUFNLElBQUlMLFVBQVUsQ0FBQ00sUUFBUSxFQUFFO1lBQy9CTCxhQUFhLEdBQUdELFVBQVUsQ0FBQ00sUUFBUSxDQUFDQyxhQUFhO1VBQ2xEO1VBQ0EsSUFBSU4sYUFBYSxFQUFFO1lBQ2xCQyxPQUFPLENBQUNNLElBQUksR0FBR1AsYUFBYTtZQUM1QkMsT0FBTyxDQUFDTyxVQUFVLEdBQUcsQ0FBQyxDQUFDVCxVQUFVLENBQUNVLFVBQVU7WUFDNUNkLGVBQWUsQ0FBQ0MsT0FBTyxDQUFDYyxJQUFJLENBQUNULE9BQU8sQ0FBQztVQUN0QyxDQUFDLE1BQU07WUFDTixNQUFNLElBQUluQixLQUFLLENBQUMsbURBQW1ELENBQUM7VUFDckU7UUFDRCxDQUFDLENBQUM7UUFDRixPQUFPWCxJQUFJLENBQUNPLFNBQVMsQ0FBQ2lCLGVBQWUsQ0FBQztNQUN2QztNQUNBLE9BQU92SCxTQUFTO0lBQ2pCLENBQUM7SUFDRHFILGdDQUFnQyxFQUFFLFNBQUFBLENBQVVrQixjQUFzQixFQUFXO01BQzVFLE9BQ0NBLGNBQWMsQ0FBQzNLLFFBQVEsQ0FBQyxzREFBMkMsQ0FBQyxJQUNwRTJLLGNBQWMsQ0FBQzNLLFFBQVEsQ0FBQywrREFBb0QsQ0FBQztJQUUvRSxDQUFDO0lBQ0Q0Syw2QkFBNkIsRUFBRSxTQUFBQSxDQUFVQyxvQkFBNkIsRUFBVztNQUNoRixNQUFNQyxNQUFNLEdBQUdELG9CQUFvQixDQUFDdEosT0FBTyxDQUFDLENBQUMsQ0FBQzZCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO01BQzlELE1BQU1qQyxNQUFNLEdBQUcwSixvQkFBb0IsQ0FBQ3hKLFFBQVEsQ0FBQyxDQUFDO01BQzlDLElBQUl5SixNQUFNLENBQUN2SCxNQUFNLElBQUl1SCxNQUFNLENBQUNBLE1BQU0sQ0FBQ3ZILE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQ3ZELFFBQVEsQ0FBQyx5REFBeUQsQ0FBQyxFQUFFO1FBQ25ILE1BQU04QyxLQUFLLEdBQUcrSCxvQkFBb0IsQ0FBQ3RKLE9BQU8sQ0FBQyxDQUFDLENBQUM2QixLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsT0FBT2pDLE1BQU0sQ0FBQzRKLG9CQUFvQixDQUFDLEdBQUdqSSxLQUFLLGFBQWEsQ0FBQztNQUMxRDtNQUNBLE9BQU8zQixNQUFNLENBQUM0SixvQkFBb0IsQ0FBQyxHQUFHRixvQkFBb0IsQ0FBQ3RKLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUNuRixDQUFDO0lBQ0R5SixpQ0FBaUMsRUFBRSxTQUFBQSxDQUNsQ3BILFVBQTZDLEVBQzdDcUgsUUFBaUIsRUFDakJDLCtCQUF5QyxFQUVwQjtNQUFBLElBRHJCQyxjQUFjLEdBQUF0RSxTQUFBLENBQUF0RCxNQUFBLFFBQUFzRCxTQUFBLFFBQUF6RSxTQUFBLEdBQUF5RSxTQUFBLE1BQUcsS0FBSztNQUV0QixJQUFJLENBQUNqRCxVQUFVLEVBQUUsT0FBT3hCLFNBQVM7TUFDakMsTUFBTWdKLHFCQU1MLEdBQUc7UUFDSEMsa0JBQWtCLEVBQUVKLFFBQVEsR0FBR0EsUUFBUSxHQUFHO01BQzNDLENBQUM7TUFDRCxJQUFJckgsVUFBVSxDQUFDMEgsZUFBZSxJQUFJLENBQUMxSCxVQUFVLENBQUMySCxNQUFNLElBQUlMLCtCQUErQixFQUFFO1FBQ3hGLE1BQU1NLGtCQUFrQixHQUFHLENBQUNMLGNBQWMsR0FBRyxhQUFhLEdBQUcsMkJBQTJCO1FBQ3hGLE1BQU1NLHFCQUFxQixHQUFHLENBQUNOLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyw4QkFBOEI7UUFDakdDLHFCQUFxQixDQUFDTSxrQkFBa0IsR0FBRyxtQkFBbUI5SCxVQUFVLENBQUMrSCxjQUFjLElBQUkvSCxVQUFVLENBQUNnSSxNQUFNLElBQUlKLGtCQUFrQixJQUFJO1FBQ3RJSixxQkFBcUIsQ0FBQ1MscUJBQXFCLEdBQUcsbUJBQW1CakksVUFBVSxDQUFDK0gsY0FBYyxJQUFJL0gsVUFBVSxDQUFDZ0ksTUFBTSxJQUFJSCxxQkFBcUIsSUFBSTtRQUM1SUwscUJBQXFCLENBQUNVLEtBQUssR0FBRyxJQUFJLENBQUN6RixlQUFlLENBQUN6QyxVQUFVLENBQUNtSSxLQUFLLEVBQVksSUFBSSxDQUFDO01BQ3JGO01BQ0EsSUFBSW5JLFVBQVUsQ0FBQ29JLE9BQU8sRUFBRTtRQUN2QloscUJBQXFCLENBQUNhLHFCQUFxQixHQUFHLElBQUksQ0FBQzVGLGVBQWUsQ0FBQzhCLElBQUksQ0FBQ08sU0FBUyxDQUFDOUUsVUFBVSxDQUFDb0ksT0FBTyxDQUFDLENBQUM7TUFDdkc7TUFDQSxPQUFPLElBQUksQ0FBQ3ZGLGdCQUFnQixDQUMzQnlFLCtCQUErQixHQUFHLHdEQUF3RCxHQUFHLGtDQUFrQyxFQUMvSCxJQUFJLENBQUM3RSxlQUFlLENBQUN6QyxVQUFVLENBQUMrSCxjQUFtQyxDQUFDLEVBQ3BFLElBQUksQ0FBQ3RGLGVBQWUsQ0FBQ3pDLFVBQVUsQ0FBQ2dJLE1BQTJCLENBQUMsRUFDNUQsSUFBSSxDQUFDcEUsY0FBYyxDQUFDNEQscUJBQXFCLENBQUMsRUFDMUMsY0FDRCxDQUFDO0lBQ0YsQ0FBQztJQUNEYyxZQUFZLEVBQUUsU0FBQUEsQ0FBVTFILFFBQWlCLEVBQVU7TUFDbEQsTUFBTTFCLEtBQUssR0FBRzBCLFFBQVEsQ0FBQ2pELE9BQU8sQ0FBQyxDQUFDO01BQ2hDLE9BQU80SyxXQUFXLENBQUNDLGdCQUFnQixDQUFDdEosS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ3VKLGdDQUFnQyxFQUFFLFNBQUFBLENBQ2pDQyxxQkFBNkIsRUFDN0JoRyxNQUFjLEVBQ2RpRyxhQUE4QixFQUM5QkMsYUFBOEIsRUFDOUJDLGNBQStCLEVBQy9CQyxlQUFnQyxFQUNoQ0MsY0FBK0IsRUFDL0JDLGNBQStCLEVBQ3RCO01BQ1QsSUFBSUMsc0JBQWtELEdBQUduTSxVQUFVLENBQUNvTSxPQUFPLENBQUMsQ0FBQzs7TUFFN0V4RyxNQUFNLEdBQUcsSUFBSUEsTUFBTSxFQUFFOztNQUVyQjtNQUNBaUcsYUFBYSxHQUFHQSxhQUFhLElBQUksQ0FBQ1EsUUFBUTtNQUMxQ1AsYUFBYSxHQUFHQSxhQUFhLElBQUlELGFBQWE7TUFDOUNFLGNBQWMsR0FBR0EsY0FBYyxJQUFJRCxhQUFhO01BQ2hESSxjQUFjLEdBQUdBLGNBQWMsSUFBSUcsUUFBUTtNQUMzQ0osY0FBYyxHQUFHQSxjQUFjLElBQUlDLGNBQWM7TUFDakRGLGVBQWUsR0FBR0EsZUFBZSxJQUFJQyxjQUFjOztNQUVuRDtNQUNBSixhQUFhLEdBQUdBLGFBQWEsS0FBSyxDQUFDQSxhQUFhLEdBQUcsQ0FBQ0EsYUFBYSxHQUFHLElBQUlBLGFBQWEsRUFBRSxDQUFDO01BQ3hGQyxhQUFhLEdBQUdBLGFBQWEsS0FBSyxDQUFDQSxhQUFhLEdBQUcsQ0FBQ0EsYUFBYSxHQUFHLElBQUlBLGFBQWEsRUFBRSxDQUFDO01BQ3hGQyxjQUFjLEdBQUdBLGNBQWMsS0FBSyxDQUFDQSxjQUFjLEdBQUcsQ0FBQ0EsY0FBYyxHQUFHLElBQUlBLGNBQWMsRUFBRSxDQUFDO01BQzdGQyxlQUFlLEdBQUdBLGVBQWUsS0FBSyxDQUFDQSxlQUFlLEdBQUcsQ0FBQ0EsZUFBZSxHQUFHLElBQUlBLGVBQWUsRUFBRSxDQUFDO01BQ2xHQyxjQUFjLEdBQUdBLGNBQWMsS0FBSyxDQUFDQSxjQUFjLEdBQUcsQ0FBQ0EsY0FBYyxHQUFHLElBQUlBLGNBQWMsRUFBRSxDQUFDO01BQzdGQyxjQUFjLEdBQUdBLGNBQWMsS0FBSyxDQUFDQSxjQUFjLEdBQUcsQ0FBQ0EsY0FBYyxHQUFHLElBQUlBLGNBQWMsRUFBRSxDQUFDOztNQUU3RjtNQUNBLElBQUlOLHFCQUFxQixDQUFDdE0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQy9DNk0sc0JBQXNCLEdBQ3JCLEtBQUssR0FDTHZHLE1BQU0sR0FDTixNQUFNLEdBQ05vRyxlQUFlLEdBQ2YsTUFBTSxHQUNOaE0sVUFBVSxDQUFDc00sSUFBSSxHQUNmLE1BQU0sR0FDTjFHLE1BQU0sR0FDTixNQUFNLEdBQ05xRyxjQUFjLEdBQ2QsTUFBTSxHQUNOak0sVUFBVSxDQUFDb00sT0FBTyxHQUNsQixNQUFNLEdBQ04sR0FBRyxHQUNIRixjQUFjLEdBQ2QsTUFBTSxHQUNOdEcsTUFBTSxHQUNOLE1BQU0sR0FDTnNHLGNBQWMsR0FDZCxPQUFPLEdBQ1BsTSxVQUFVLENBQUN1TSxRQUFRLEdBQ25CLE9BQU8sR0FDUHZNLFVBQVUsQ0FBQ29JLEtBQUssR0FDaEIsS0FBSztNQUNQLENBQUMsTUFBTSxJQUFJd0QscUJBQXFCLENBQUN0TSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDdEQ2TSxzQkFBc0IsR0FDckIsS0FBSyxHQUNMdkcsTUFBTSxHQUNOLE1BQU0sR0FDTm1HLGNBQWMsR0FDZCxNQUFNLEdBQ04vTCxVQUFVLENBQUNzTSxJQUFJLEdBQ2YsTUFBTSxHQUNOMUcsTUFBTSxHQUNOLE1BQU0sR0FDTmtHLGFBQWEsR0FDYixNQUFNLEdBQ045TCxVQUFVLENBQUNvTSxPQUFPLEdBQ2xCLE1BQU0sR0FDTixHQUFHLEdBQ0hQLGFBQWEsR0FDYixNQUFNLEdBQ05qRyxNQUFNLEdBQ04sTUFBTSxHQUNOaUcsYUFBYSxHQUNiLE9BQU8sR0FDUDdMLFVBQVUsQ0FBQ3VNLFFBQVEsR0FDbkIsT0FBTyxHQUNQdk0sVUFBVSxDQUFDb0ksS0FBSyxHQUNoQixLQUFLO01BQ1AsQ0FBQyxNQUFNLElBQUl3RCxxQkFBcUIsQ0FBQ3RNLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNwRDZNLHNCQUFzQixHQUNyQixNQUFNLEdBQ052RyxNQUFNLEdBQ04sTUFBTSxHQUNOb0csZUFBZSxHQUNmLE1BQU0sR0FDTnBHLE1BQU0sR0FDTixNQUFNLEdBQ05tRyxjQUFjLEdBQ2QsT0FBTyxHQUNQL0wsVUFBVSxDQUFDc00sSUFBSSxHQUNmLE1BQU0sR0FDTixJQUFJLEdBQ0oxRyxNQUFNLEdBQ04sTUFBTSxHQUNOa0csYUFBYSxHQUNiLE1BQU0sR0FDTmxHLE1BQU0sR0FDTixLQUFLLEdBQ0xtRyxjQUFjLEdBQ2QsUUFBUSxHQUNSbkcsTUFBTSxHQUNOLEtBQUssR0FDTG9HLGVBQWUsR0FDZixNQUFNLEdBQ05wRyxNQUFNLEdBQ04sTUFBTSxHQUNOcUcsY0FBYyxHQUNkLFFBQVEsR0FDUmpNLFVBQVUsQ0FBQ29NLE9BQU8sR0FDbEIsTUFBTSxHQUNOLElBQUksR0FDSlAsYUFBYSxHQUNiLE9BQU8sR0FDUGpHLE1BQU0sR0FDTixNQUFNLEdBQ05pRyxhQUFhLEdBQ2IsUUFBUSxHQUNSakcsTUFBTSxHQUNOLEtBQUssR0FDTGtHLGFBQWEsR0FDYixVQUFVLEdBQ1ZsRyxNQUFNLEdBQ04sS0FBSyxHQUNMcUcsY0FBYyxHQUNkLE9BQU8sR0FDUEMsY0FBYyxHQUNkLE9BQU8sR0FDUHRHLE1BQU0sR0FDTixNQUFNLEdBQ05zRyxjQUFjLEdBQ2QsU0FBUyxHQUNUbE0sVUFBVSxDQUFDdU0sUUFBUSxHQUNuQixPQUFPLEdBQ1B2TSxVQUFVLENBQUNvSSxLQUFLLEdBQ2hCLEtBQUs7TUFDUCxDQUFDLE1BQU07UUFDTkYsR0FBRyxDQUFDc0UsT0FBTyxDQUFDLHlEQUF5RCxDQUFDO01BQ3ZFO01BRUEsT0FBT0wsc0JBQXNCO0lBQzlCLENBQUM7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDTSx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxRQUFnQixFQUFFQyxpQkFBK0MsRUFBRUMsWUFBc0IsRUFBVTtNQUN0SSxJQUFJQyxTQUFTLEVBQUVDLG9CQUFvQjtNQUNuQyxJQUFJSCxpQkFBaUIsRUFBRUksUUFBUSxFQUFFbEssTUFBTSxJQUFJOEosaUJBQWlCLEVBQUVJLFFBQVEsRUFBRWxLLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDbkZnSyxTQUFTLEdBQUdGLGlCQUFpQixDQUFDSSxRQUFRO1FBQ3RDRCxvQkFBb0IsR0FBR0YsWUFBWSxHQUMvQkMsU0FBUyxDQUFDSCxRQUFRLENBQUMsQ0FBa0JNLEtBQUssR0FDMUNILFNBQVMsQ0FBQ0gsUUFBUSxDQUFDLENBQXNCOUMsYUFBYTtNQUMzRCxDQUFDLE1BQU0sSUFBSStDLGlCQUFpQixFQUFFTSxlQUFlLEVBQUVwSyxNQUFNLElBQUk4SixpQkFBaUIsRUFBRU0sZUFBZSxFQUFFcEssTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4R2dLLFNBQVMsR0FBSUYsaUJBQWlCLENBQTBCTSxlQUFlO1FBQ3ZFSCxvQkFBb0IsR0FBR0QsU0FBUyxHQUFHSCxRQUFRLENBQUMsQ0FBQ2pELGVBQWU7TUFDN0Q7TUFDQSxJQUFJeUQsdUJBQXVCO01BQzNCLE1BQU1DLGtCQUFrQixHQUFHUixpQkFBaUIsQ0FBQ1MsaUJBQWlCO01BQzlELElBQUlDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztNQUMxQixNQUFNQyxjQUFjLEdBQUcsU0FBQUEsQ0FDdEJDLFlBQWdDLEVBQ2hDQyxpQkFBdUYsRUFDdkZDLEtBQWEsRUFDSDtRQUNWLElBQUlELGlCQUFpQixFQUFFO1VBQ3RCLE1BQU1sSCxJQUFJLEdBQUdzRyxZQUFZLEdBQ3JCWSxpQkFBaUIsQ0FBK0JFLE9BQU8sRUFBRVYsS0FBSyxHQUM5RFEsaUJBQWlCLENBQThDRSxPQUFPLEVBQUU5RCxhQUFhO1VBQ3pGLElBQUk0RCxpQkFBaUIsQ0FBQ0UsT0FBTyxJQUFJcEgsSUFBSSxLQUFLaUgsWUFBWSxFQUFFO1lBQ3ZERixpQkFBaUIsR0FBR0ksS0FBSztZQUN6QixPQUFPLElBQUk7VUFDWixDQUFDLE1BQU0sSUFDTkQsaUJBQWlCLENBQUNHLGNBQWMsSUFDL0JILGlCQUFpQixFQUErQ0csY0FBYyxFQUFFbEUsZUFBZSxLQUFLOEQsWUFBWSxFQUNoSDtZQUNERixpQkFBaUIsR0FBR0ksS0FBSztZQUN6QixPQUFPLElBQUk7VUFDWjtRQUNEO1FBQ0EsT0FBTyxLQUFLO01BQ2IsQ0FBQztNQUNELElBQUlOLGtCQUFrQixFQUFFO1FBQ3ZCRCx1QkFBdUIsR0FBR0Msa0JBQWtCLENBQUNTLElBQUksQ0FBQ04sY0FBYyxDQUFDTyxJQUFJLENBQUMsSUFBSSxFQUFFZixvQkFBb0IsQ0FBQyxDQUFDO01BQ25HO01BQ0EsT0FBT0ksdUJBQXVCLElBQUlHLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxHQUFHQSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVEUyxtQkFBbUIsRUFBRSxlQUFBQSxDQUFnQmhLLFFBQWlCLEVBQStCO01BQ3BGLE1BQU1LLFVBQVUsR0FBR0wsUUFBUSxDQUFDbkQsUUFBUSxDQUFDLENBQW1CO1FBQ3ZEb04sb0JBQW9CLEdBQUdqSyxRQUFRLENBQUNqRCxPQUFPLENBQUMsQ0FBQztNQUMxQyxPQUFPc0QsVUFBVSxDQUFDNkosYUFBYSxDQUFDRCxvQkFBb0IsQ0FBQyxDQUFDRSxJQUFJLENBQUMsVUFBVXRCLGlCQUF1QyxFQUFFO1FBQzdHLE1BQU1RLGtCQUFrQixHQUFHUixpQkFBaUIsQ0FBQ1MsaUJBQWlCO1VBQzdEQyxpQkFBaUIsR0FBR25OLFlBQVksQ0FBQ3VNLHdCQUF3QixDQUFDLENBQUMsRUFBRUUsaUJBQWlCLENBQUM7UUFDaEYsTUFBTXVCLHFCQUFxQixHQUMxQmIsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUlGLGtCQUFrQixHQUFHRSxpQkFBaUIsQ0FBQyxJQUFJRixrQkFBa0IsQ0FBQ0UsaUJBQWlCLENBQUMsQ0FBQ2MsU0FBUyxHQUNqSCxHQUFHSixvQkFBb0Isc0JBQXNCVixpQkFBaUIsR0FBRyxHQUNqRTNMLFNBQVM7UUFDYixJQUFJd00scUJBQXFCLEtBQUt4TSxTQUFTLEVBQUU7VUFDeEN3RyxHQUFHLENBQUNzRSxPQUFPLENBQUMsbUNBQW1DLENBQUM7UUFDakQ7UUFDQSxPQUFPMEIscUJBQXFCLEdBQUcsR0FBR0EscUJBQXFCLDRCQUE0QixHQUFHQSxxQkFBcUI7TUFDNUcsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0UsNkJBQTZCLEVBQUUsU0FBQUEsQ0FBVXRLLFFBQWlCLEVBQXNCO01BQy9FLE1BQU1LLFVBQVUsR0FBR0wsUUFBUSxDQUFDbkQsUUFBUSxDQUFDLENBQW1CO1FBQ3ZENE0sWUFBWSxHQUFHekosUUFBUSxDQUFDakQsT0FBTyxDQUFDLENBQUM7UUFDakNrTixvQkFBb0IsR0FBR1IsWUFBWSxDQUFDYyxTQUFTLENBQUMsQ0FBQyxFQUFFZCxZQUFZLENBQUM1SixXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckYrSSxRQUFRLEdBQUdhLFlBQVksQ0FBQ2hLLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO01BRTVDLE1BQU1vSixpQkFBaUIsR0FBR3hJLFVBQVUsQ0FBQzlELFNBQVMsQ0FBQzBOLG9CQUFvQixDQUFDO01BQ3BFLE1BQU1aLGtCQUFrQixHQUFHUixpQkFBaUIsQ0FBQ1MsaUJBQWlCO1FBQzdEQyxpQkFBaUIsR0FBR25OLFlBQVksQ0FBQ3VNLHdCQUF3QixDQUFDQyxRQUFRLEVBQXVCQyxpQkFBaUIsQ0FBQztNQUM1RyxNQUFNdUIscUJBQXFCLEdBQzFCYixpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSUYsa0JBQWtCLENBQUNFLGlCQUFpQixDQUFDLElBQUlGLGtCQUFrQixDQUFDRSxpQkFBaUIsQ0FBQyxDQUFDYyxTQUFTLEdBQy9HLEdBQUdKLG9CQUFvQixxQkFBcUJWLGlCQUFpQixHQUFHLEdBQ2hFM0wsU0FBUztNQUNiLElBQUl3TSxxQkFBcUIsS0FBS3hNLFNBQVMsRUFBRTtRQUN4Q3dHLEdBQUcsQ0FBQ3NFLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQztNQUNqRDtNQUNBLE9BQU8wQixxQkFBcUIsR0FBRyxHQUFHQSxxQkFBcUIsNEJBQTRCLEdBQUdBLHFCQUFxQjtJQUM1RyxDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NJLGlDQUFpQyxFQUFFLFNBQUFBLENBQ2xDQywrQkFBdUMsRUFDdkNDLGNBS0MsRUFDUztNQUNWLElBQUlELCtCQUErQixFQUFFO1FBQ3BDLElBQUlDLGNBQWMsSUFBSUEsY0FBYyxDQUFDQyxlQUFlLElBQUlELGNBQWMsQ0FBQ0MsZUFBZSxDQUFDck0sS0FBSyxFQUFFO1VBQzdGLE1BQU1zTSxvQkFBb0IsR0FBR0YsY0FBYyxDQUFDQyxlQUFlLENBQUNyTSxLQUFLO1VBQ2pFLE1BQU11TSxVQUFVLEdBQUdILGNBQWMsQ0FBQ0MsZUFBZSxDQUFDaE8sTUFBTSxDQUFDSixTQUFTLENBQ2pFLEdBQUdxTyxvQkFBb0IsMkNBQ3hCLENBQUM7VUFDRCxNQUFNRSxVQUFVLEdBQUdKLGNBQWMsQ0FBQ0MsZUFBZSxDQUFDaE8sTUFBTSxDQUFDSixTQUFTLENBQ2pFLEdBQUdxTyxvQkFBb0IsMkNBQ3hCLENBQUM7VUFDRCxJQUFJQyxVQUFVLElBQUlDLFVBQVUsRUFBRTtZQUM3QixPQUFPLElBQUk7VUFDWixDQUFDLE1BQU07WUFDTixPQUFPLEtBQUs7VUFDYjtRQUNEO01BQ0Q7TUFDQSxPQUFPLEtBQUs7SUFDYixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG1CQUFtQixFQUFFLFNBQUFBLENBQVVDLFdBQW9CLEVBQVU7TUFDNUQsTUFBTUMsU0FBUyxHQUFHRCxXQUFXLENBQUNqTyxPQUFPLENBQUMsQ0FBQyxDQUFDNkIsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUNsRCxNQUFNc00sT0FBTyxHQUFHRCxTQUFTLENBQUNBLFNBQVMsQ0FBQ2xNLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDL0MsTUFBTW9NLGlCQUFpQixHQUFHLElBQUlGLFNBQVMsQ0FBQ2hNLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO01BQ2xFLE1BQU1rTSxlQUFlLEdBQUdKLFdBQVcsQ0FBQ3pPLFNBQVMsQ0FBQzRPLGlCQUFpQixDQUFDO01BQ2hFLE1BQU1FLFFBQVEsR0FBR0QsZUFBZSxDQUFDRSxRQUFRO01BQ3pDLE1BQU1DLFNBQVMsR0FBR0YsUUFBUSxDQUFDek0sS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUNyQyxNQUFNNE0sU0FBUyxHQUFHLEVBQUU7TUFDcEIsS0FBSyxJQUFJcEosQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHbUosU0FBUyxDQUFDeE0sTUFBTSxHQUFHLENBQUMsRUFBRXFELENBQUMsRUFBRSxFQUFFO1FBQzlDLE1BQU01QixHQUFHLEdBQUcrSyxTQUFTLENBQUNuSixDQUFDLENBQUMsQ0FBQ3hELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzZNLElBQUksQ0FBQyxDQUFDO1FBQzdDRCxTQUFTLENBQUN0RixJQUFJLENBQUMxRixHQUFHLENBQUM7TUFDcEI7TUFDQTJDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZ0ksZUFBZSxDQUFDTSxJQUFJLENBQUMsQ0FBQ3BHLE9BQU8sQ0FBQyxVQUFVakMsSUFBWSxFQUFFO1FBQ2pFLElBQUlBLElBQUksQ0FBQzlCLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUN6QixPQUFPNkosZUFBZSxDQUFDTSxJQUFJLENBQUNySSxJQUFJLENBQUM7UUFDbEM7TUFDRCxDQUFDLENBQUM7TUFDRixNQUFNc0csS0FBSyxHQUFHeEcsTUFBTSxDQUFDQyxJQUFJLENBQUNnSSxlQUFlLENBQUNNLElBQUksQ0FBQyxDQUFDNUwsT0FBTyxDQUFDb0wsT0FBTyxDQUFDO01BQ2hFLE9BQU8sSUFBSUQsU0FBUyxDQUFDaE0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVNzTSxTQUFTLENBQUM3QixLQUFLLENBQUMsRUFBRTtJQUN2RSxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDZ0MsWUFBWSxFQUFFLFNBQUFBLENBQVVsUCxNQUEyRCxFQUFFbVAsT0FBZSxFQUFXO01BQzlHLE1BQU1QLFFBQVEsR0FBRzVPLE1BQU0sQ0FBQzZPLFFBQVE7TUFDaEMsTUFBTUMsU0FBUyxHQUFHRixRQUFRLENBQUN6TSxLQUFLLENBQUMsR0FBRyxDQUFDO01BQ3JDLE1BQU00TSxTQUFtQixHQUFHLEVBQUU7TUFDOUIsSUFBSUssV0FBVyxHQUFHLEtBQUs7TUFDdkIsS0FBSyxJQUFJekosQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHbUosU0FBUyxDQUFDeE0sTUFBTSxHQUFHLENBQUMsRUFBRXFELENBQUMsRUFBRSxFQUFFO1FBQzlDLE1BQU04SSxPQUFPLEdBQUdLLFNBQVMsQ0FBQ25KLENBQUMsQ0FBQyxDQUFDeEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDNk0sSUFBSSxDQUFDLENBQUM7UUFDakRELFNBQVMsQ0FBQ3RGLElBQUksQ0FBQ2dGLE9BQU8sQ0FBQztNQUN4QjtNQUVBTSxTQUFTLENBQUNsRyxPQUFPLENBQUMsVUFBVXdHLFlBQW9CLEVBQUU7UUFDakQsTUFBTUMsU0FBUyxHQUFHUCxTQUFTLENBQUN6TSxNQUFNLEdBQUcsQ0FBQztRQUN0QyxJQUFJdEMsTUFBTSxDQUFDaVAsSUFBSSxDQUFDSSxZQUFZLENBQUMsS0FBS0YsT0FBTyxJQUFJSixTQUFTLENBQUMxTCxPQUFPLENBQUNnTSxZQUFZLENBQUMsR0FBR0MsU0FBUyxFQUFFO1VBQ3pGRixXQUFXLEdBQUcsSUFBSTtRQUNuQjtNQUNELENBQUMsQ0FBQztNQUNGLE9BQU9BLFdBQVc7SUFDbkIsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0csWUFBWSxFQUFFLFNBQUFBLENBQVVYLFFBQWdCLEVBQVU7TUFDakQsT0FBT0EsUUFBUSxDQUFDek0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM2TSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRURwTCxVQUFVLEVBQUV6QyxTQUF1QztJQUNuRHFPLFlBQVksRUFBRSxTQUFBQSxDQUFVNUwsVUFBMEIsRUFBUTtNQUN6RCxJQUFJLENBQUNBLFVBQVUsR0FBR0EsVUFBVTtJQUM3QixDQUFDO0lBRUQzQixZQUFZLEVBQUUsU0FBQUEsQ0FBQSxFQUE0QjtNQUN6QyxPQUFPLElBQUksQ0FBQzJCLFVBQVU7SUFDdkIsQ0FBQztJQUVENkwsYUFBYSxFQUFFLFNBQUFBLENBQVU1TixLQUFhLEVBQUVFLFNBQTBCLEVBQVk7TUFDN0UsSUFBSUEsU0FBUyxFQUFFO1FBQ2QsTUFBTTJOLGNBQWMsR0FBR2pNLFdBQVcsQ0FBQ2tNLGdCQUFnQixDQUFDNU4sU0FBUyxFQUFFRixLQUFLLENBQUM7UUFDckUsSUFBSTZOLGNBQWMsQ0FBQ0UsbUJBQW1CLEVBQUU7VUFDdkMsT0FBT2xKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDK0ksY0FBYyxDQUFDRSxtQkFBbUIsQ0FBQztRQUN2RDtNQUNEO01BQ0EsT0FBTyxFQUFFO0lBQ1YsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxrQkFBa0IsRUFBRSxTQUFBQSxDQUNuQjVMLE9BQXFCLEVBQ3JCNkwsS0FBa0MsRUFFQztNQUFBLElBRG5DNUYsY0FBYyxHQUFBdEUsU0FBQSxDQUFBdEQsTUFBQSxRQUFBc0QsU0FBQSxRQUFBekUsU0FBQSxHQUFBeUUsU0FBQSxNQUFHLEtBQUs7TUFFdEIsTUFBTW1LLE9BQWtCLEdBQUcsQ0FBQ0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFL0wsT0FBTyxDQUFDZ00sYUFBYSxFQUFFaE0sT0FBTyxDQUFDaU0sYUFBYSxDQUFDO01BRXhGLElBQUlKLEtBQUssSUFBSUEsS0FBSyxDQUFDSyxFQUFFLEVBQUU7UUFDdEIsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQ2xHLGNBQWMsR0FBRyw4QkFBOEIsR0FBRywwQ0FBMEM7UUFDdkgsTUFBTW1HLGlCQUFpQixHQUFHO1VBQUVDLFFBQVEsRUFBRU4sR0FBRyxDQUFDSSxpQkFBaUI7UUFBRSxDQUFDO1FBQzlETCxPQUFPLENBQUN0RyxJQUFJLENBQUM0RyxpQkFBaUIsQ0FBQztNQUNoQztNQUNBLE9BQU9wSyxpQkFBaUIsQ0FBQ3NLLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRVIsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDUyx1QkFBdUIsRUFBRSxTQUFBQSxDQUFVQyxvQkFBd0QsRUFBb0I7TUFDOUcsSUFBSUEsb0JBQW9CLENBQUMsb0NBQW9DLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDeEUsTUFBTUMsTUFBTSxHQUFHRCxvQkFBb0IsQ0FBQyxvQ0FBb0MsQ0FBQztRQUN6RSxPQUFPLE9BQU9DLE1BQU0sS0FBSyxRQUFRLEdBQUcsUUFBUSxHQUFHQSxNQUFNLENBQUN6UCxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUN5UCxNQUFNO01BQzlFO01BQ0EsT0FBTyxJQUFJO0lBQ1osQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsdUJBQXVCLEVBQUUsU0FBQUEsQ0FDeEI1TixTQUFpQixFQUNqQjZOLGNBQXNCLEVBQ3RCck4sUUFBd0IsRUFDeEJtRSxLQUFjLEVBQ2RtSixxQkFBd0MsRUFDeENDLFFBQWtDLEVBQ3ZCO01BQ1gsTUFBTUMsbUJBQW1CLEdBQUd0TixXQUFXLENBQUN1TiwyQkFBMkIsQ0FBQ0osY0FBYyxFQUFFck4sUUFBUSxDQUFDO01BQzdGLE1BQU0wTixVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUM7TUFDekIsTUFBTUMsZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7TUFDL0csTUFBTUMsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO01BQzNDLE1BQU1DLGNBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO01BQzlHLE1BQU1DLG9CQUFvQixHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUM7TUFDbEgsTUFBTUMscUJBQXFCLEdBQUdDLHFCQUFxQixDQUFDQyw4QkFBOEIsQ0FBQyxDQUFDO01BQ3BGLE1BQU1DLGtCQUFrQixHQUFHWixxQkFBcUIsS0FBSyxNQUFNLElBQUlBLHFCQUFxQixLQUFLLElBQUk7TUFDN0YsSUFBSWEsZ0JBQTBCLEdBQUcsRUFBRTtNQUNuQyxNQUFNQyxTQUFTLEdBQUdiLFFBQVEsSUFBSSxPQUFPQSxRQUFRLEtBQUssUUFBUSxHQUFHNUosSUFBSSxDQUFDQyxLQUFLLENBQUMySixRQUFRLENBQUMsQ0FBQ2MsVUFBVSxHQUFHZCxRQUFRO01BRXZHLElBQUt2TixRQUFRLENBQUN6RCxTQUFTLENBQUMsR0FBRzhRLGNBQWMsZ0RBQWdELENBQUMsS0FBaUIsSUFBSSxFQUFFO1FBQ2hILE9BQU9LLFVBQVU7TUFDbEI7TUFFQSxJQUFJVSxTQUFTLElBQUlBLFNBQVMsQ0FBQ0UscUJBQXFCLElBQUlGLFNBQVMsQ0FBQ0UscUJBQXFCLENBQUN2UCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQy9Gb1AsZ0JBQWdCLEdBQUdILHFCQUFxQixDQUFDTyxtQkFBbUIsQ0FBQ0gsU0FBUyxDQUFDRSxxQkFBcUIsRUFBRW5LLEtBQUssQ0FBQztNQUNyRyxDQUFDLE1BQU07UUFDTmdLLGdCQUFnQixHQUFHSyw0QkFBNEIsQ0FBQ0MseUJBQXlCLENBQUN0SyxLQUFLLENBQUM7TUFDakY7TUFDQTtNQUNBLE1BQU11SyxpQkFBaUIsR0FBR2pULG9CQUFvQixDQUFDMEksS0FBSyxDQUFDO01BQ3JELElBQUl3SyxrQkFBa0IsR0FBR0QsaUJBQWlCO01BQzFDLElBQUlSLGtCQUFrQixFQUFFO1FBQ3ZCLE1BQU1VLDZCQUE2QixHQUFHQyw2QkFBNkIsQ0FBQ0oseUJBQXlCLENBQUMsQ0FBQztRQUMvRkUsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHWixxQkFBcUIsRUFBRSxHQUFHVyxpQkFBaUIsRUFBRSxHQUFHRSw2QkFBNkIsQ0FBQztNQUN4RztNQUVBLElBQUlFLFlBQXNCLEdBQUcsRUFBRTs7TUFFL0I7TUFDQSxJQUNDdEIsbUJBQW1CLElBQ25CQSxtQkFBbUIsQ0FBQ3VCLHdCQUF3QixJQUM1Q3ZCLG1CQUFtQixDQUFDdUIsd0JBQXdCLENBQUN2UCxTQUFTLENBQUMsRUFDdEQ7UUFDRDtRQUNBLE1BQU13UCxrQkFBa0IsR0FBRzlPLFdBQVcsQ0FBQytPLDRCQUE0QixDQUFDekIsbUJBQW1CLENBQUN1Qix3QkFBd0IsQ0FBQ3ZQLFNBQVMsQ0FBQyxDQUFDO1FBQzVIO1FBQ0E7O1FBRUE7UUFDQSxRQUFRd1Asa0JBQWtCO1VBQ3pCLEtBQUssYUFBYTtZQUNqQixNQUFNRSxrQkFBa0IsR0FBR1YsNEJBQTRCLENBQUNXLDRCQUE0QixDQUFDLENBQUM7WUFDdEYsTUFBTUMsZUFBZSxHQUFHakwsS0FBSyxLQUFLLFVBQVUsSUFBSStKLGtCQUFrQixHQUFHZ0Isa0JBQWtCLEdBQUd4QixVQUFVO1lBQ3BHb0IsWUFBWSxHQUFHM1QsZ0JBQWdCLENBQUN3VCxrQkFBa0IsRUFBRVMsZUFBZSxDQUFDO1lBQ3BFO1VBQ0QsS0FBSyxZQUFZO1lBQ2hCLE1BQU1DLG1CQUFtQixHQUFHLENBQUMsR0FBRzNCLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ2hFb0IsWUFBWSxHQUFHM1QsZ0JBQWdCLENBQUN3VCxrQkFBa0IsRUFBRVUsbUJBQW1CLENBQUM7WUFDeEU7VUFDRCxLQUFLLGFBQWE7WUFDakIsSUFBSWhVLGNBQXdCO1lBQzVCLElBQUk2UyxrQkFBa0IsRUFBRTtjQUN2QixJQUFJL0osS0FBSyxLQUFLLFVBQVUsRUFBRTtnQkFDekI5SSxjQUFjLEdBQUc4UyxnQkFBZ0I7Y0FDbEMsQ0FBQyxNQUFNLElBQUloSyxLQUFLLEtBQUssb0JBQW9CLEVBQUU7Z0JBQzFDOUksY0FBYyxHQUFHOFMsZ0JBQWdCO2NBQ2xDLENBQUMsTUFBTTtnQkFDTjlTLGNBQWMsR0FBR3NTLGVBQWU7Y0FDakM7WUFDRCxDQUFDLE1BQU0sSUFBSXhKLEtBQUssS0FBSyxvQkFBb0IsRUFBRTtjQUMxQzlJLGNBQWMsR0FBR3VTLHNCQUFzQjtZQUN4QyxDQUFDLE1BQU07Y0FDTnZTLGNBQWMsR0FBR3NTLGVBQWU7WUFDakM7WUFDQSxNQUFNMkIsVUFBVSxHQUFHblUsZ0JBQWdCLENBQUN3VCxrQkFBa0IsRUFBRXRULGNBQWMsQ0FBQztZQUN2RXlULFlBQVksR0FBR1EsVUFBVTtZQUN6QjtVQUNELEtBQUssWUFBWTtZQUNoQlIsWUFBWSxHQUFHM1QsZ0JBQWdCLENBQUN3VCxrQkFBa0IsRUFBRWQsY0FBYyxDQUFDO1lBQ25FO1VBQ0QsS0FBSyxrQkFBa0I7WUFDdEJpQixZQUFZLEdBQUczVCxnQkFBZ0IsQ0FBQ3dULGtCQUFrQixFQUFFYixvQkFBb0IsQ0FBQztZQUN6RTtVQUNELEtBQUssOEJBQThCO1lBQ2xDZ0IsWUFBWSxHQUFHM1QsZ0JBQWdCLENBQUN3VCxrQkFBa0IsRUFBRWIsb0JBQW9CLENBQUN5QixNQUFNLENBQUMxQixjQUFjLENBQUMsQ0FBQztZQUNoRztVQUNEO1lBQ0M7UUFDRjtRQUNBO1FBQ0E7TUFDRDtNQUNBLE9BQU9pQixZQUFZO0lBQ3BCLENBQUM7SUFDRFUsMkJBQTJCLEVBQUUsU0FBQUEsQ0FBVUMsWUFBb0IsRUFBWTtNQUN0RTtNQUNBO01BQ0EsTUFBTWYsaUJBQWlCLEdBQUdqVCxvQkFBb0IsQ0FBQ2dVLFlBQVksQ0FBQztNQUM1RCxNQUFNNUIsY0FBYyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7TUFDOUcsT0FBTzFTLGdCQUFnQixDQUFDdVQsaUJBQWlCLEVBQUViLGNBQWMsQ0FBQztJQUMzRCxDQUFDO0lBQ0Q2QixTQUFTLEVBQUUsU0FBQUEsQ0FBQSxFQUFvQjtNQUM5QixPQUFPQyxNQUFNO0lBQ2Q7RUFDRCxDQUFDO0VBQ0F2VCxZQUFZLENBQUMwSSxpQkFBaUIsQ0FBb0M4SyxnQkFBZ0IsR0FBRyxJQUFJO0VBQUMsT0FFNUV4VCxZQUFZO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
878
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2V0UmVzdHJpY3Rpb25zIiwiYURlZmF1bHRPcHMiLCJhRXhwcmVzc2lvbk9wcyIsImZpbHRlciIsInNFbGVtZW50IiwiaW5jbHVkZXMiLCJfZ2V0RGVmYXVsdE9wZXJhdG9ycyIsInNQcm9wZXJ0eVR5cGUiLCJvRGF0YUNsYXNzIiwiVHlwZU1hcCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2lzT3BlcmF0b3JFeGNsdWRlZEJ5TWFuaWZlc3QiLCJvcGVyYXRvck5hbWUiLCJvU2V0dGluZ3MiLCJvcGVyYXRvckNvbmZpZ3VyYXRpb24iLCJzb21lIiwiY29uZmlnIiwicGF0aCIsImVxdWFscyIsImV4Y2x1ZGUiLCJfZ2V0RW1wdHlPcHMiLCJzVHlwZSIsInJlc3VsdCIsIm5vdEVtcHR5RXhjbHVkZWQiLCJlbXB0eUV4Y2x1ZGVkIiwicHVzaCIsIlZhbHVlQ29sb3IiLCJtTGlicmFyeSIsIkNvbW1vbkhlbHBlciIsImdldFBhdGhUb0tleSIsIm9DdHgiLCJnZXRPYmplY3QiLCJnZXRQYXJhbWV0ZXJFZGl0TW9kZSIsInRhcmdldCIsIm9JbnRlcmZhY2UiLCJvTW9kZWwiLCJjb250ZXh0IiwiZ2V0TW9kZWwiLCJzUHJvcGVydHlQYXRoIiwiZ2V0UGF0aCIsIm9Bbm5vdGF0aW9ucyIsImZpZWxkQ29udHJvbCIsImltbXV0YWJsZSIsImNvbXB1dGVkIiwic0VkaXRNb2RlIiwiRmllbGRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiUmVhZE9ubHkiLCIkRW51bU1lbWJlciIsIkRpc2FibGVkIiwiJFBhdGgiLCJnZXRNZXRhUGF0aCIsInVuZGVmaW5lZCIsImdldE1ldGFNb2RlbElkIiwiY29udmVydFR5cGVzIiwiZ2V0SWQiLCJpc0Rlc2t0b3AiLCJEZXZpY2UiLCJzeXN0ZW0iLCJkZXNrdG9wIiwiZ2V0VGFyZ2V0Q29sbGVjdGlvblBhdGgiLCJuYXZDb2xsZWN0aW9uIiwic1BhdGgiLCJtb2RlbCIsIm1ldGFNb2RlbCIsImlzQSIsImdldE1ldGFNb2RlbCIsImFQYXJ0cyIsInNwbGl0Iiwic1BhcnQiLCJlbnRpdHlTZXQiLCJsZW5ndGgiLCJuYXZpZ2F0aW9uQ29sbGVjdGlvbiIsInNsaWNlIiwiam9pbiIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwib0RhdGFGaWVsZCIsInNraXBIaWRkZW5GaWx0ZXJzIiwic1Byb3BlcnR5TG9jYXRpb25QYXRoIiwiZ2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGgiLCJzUHJvcGVydHkiLCJyZXBsYWNlIiwiJFR5cGUiLCJpTGVuZ3RoIiwic0NvbGxlY3Rpb25QYXRoIiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwiZ290b0FjdGlvblBhcmFtZXRlciIsIm9Db250ZXh0Iiwic1Byb3BlcnR5TmFtZSIsIkNvbW1vblV0aWxzIiwiZ2V0UGFyYW1ldGVyUGF0aCIsImdldEVudGl0eVNldE5hbWUiLCJvTWV0YU1vZGVsIiwic0VudGl0eVR5cGUiLCJvRW50aXR5Q29udGFpbmVyIiwia2V5IiwiZ2V0QWN0aW9uUGF0aCIsIm9BY3Rpb24iLCJiUmV0dXJuT25seVBhdGgiLCJzQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0NvbnRleHRQYXRoIiwic0VudGl0eVR5cGVOYW1lIiwic0VudGl0eU5hbWUiLCJzQmluZGluZ1BhcmFtZXRlciIsImdldE5hdmlnYXRpb25Db250ZXh0IiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImJLZWVwUHJvcGVydHkiLCJiU3RhcnRzV2l0aEVudGl0eVR5cGUiLCJzdGFydHNXaXRoIiwicGFydCIsInNoaWZ0IiwicG9wIiwiZ2V0QWN0aW9uQ29udGV4dCIsImdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWQiLCJhZGRTaW5nbGVRdW90ZXMiLCJzVmFsdWUiLCJiRXNjYXBlIiwiZXNjYXBlU2luZ2xlUXVvdGVzIiwiZ2VuZXJhdGVGdW5jdGlvbiIsInNGdW5jTmFtZSIsInNQYXJhbXMiLCJpIiwiYXJndW1lbnRzIiwic0Z1bmN0aW9uIiwiZ2V0SGVhZGVyRGF0YVBvaW50TGlua1Zpc2liaWxpdHkiLCJpc0NsaWNrYWJsZSIsImNvbXBpbGVFeHByZXNzaW9uIiwiaWZFbHNlIiwiY29uc3RhbnQiLCJlcXVhbCIsInBhdGhJbk1vZGVsIiwibm90RXF1YWwiLCJvYmplY3RUb1N0cmluZyIsIm9QYXJhbXMiLCJpTnVtYmVyT2ZLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNLZXkiLCJyZW1vdmVFc2NhcGVDaGFyYWN0ZXJzIiwic0V4cHJlc3Npb24iLCJzdHJpbmdpZnlPYmplY3QiLCJzU3RyaW5naWZpZWQiLCJvT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1VJNU9iamVjdCIsInVpNW9iamVjdCIsImFzc2lnbiIsInN0cmluZ2lmeSIsIkxvZyIsImVycm9yIiwiRXJyb3IiLCJzdHJpbmdpZnlDdXN0b21EYXRhIiwidkRhdGEiLCJDb250ZXh0IiwicGFyc2VDdXN0b21EYXRhIiwiaGFzT3duUHJvcGVydHkiLCJnZXRDb250ZXh0UGF0aCIsIm9WYWx1ZSIsImdldFNvcnRDb25kaXRpb25zIiwib1ByZXNlbnRhdGlvblZhcmlhbnQiLCJzUHJlc2VudGF0aW9uVmFyaWFudFBhdGgiLCJfaXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsIlNvcnRPcmRlciIsImFTb3J0Q29uZGl0aW9ucyIsInNvcnRlcnMiLCJzRW50aXR5UGF0aCIsImZvckVhY2giLCJvQ29uZGl0aW9uIiwib1NvcnRQcm9wZXJ0eSIsIm9Tb3J0ZXIiLCJEeW5hbWljUHJvcGVydHkiLCIkQW5ub3RhdGlvblBhdGgiLCJOYW1lIiwiUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibmFtZSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJjcmVhdGVQcmVzZW50YXRpb25QYXRoQ29udGV4dCIsIm9QcmVzZW50YXRpb25Db250ZXh0IiwiYVBhdGhzIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJnZXRQcmVzc0hhbmRsZXJGb3JEYXRhRmllbGRGb3JJQk4iLCJzQ29udGV4dCIsImJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2ciLCJmb3JDb250ZXh0TWVudSIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm5hdmlnYXRpb25Db250ZXh0cyIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsImFwcGxpY2FibGVQcm9wZXJ0eSIsIm5vdEFwcGxpY2FibGVQcm9wZXJ0eSIsImFwcGxpY2FibGVDb250ZXh0cyIsIlNlbWFudGljT2JqZWN0IiwiQWN0aW9uIiwibm90QXBwbGljYWJsZUNvbnRleHRzIiwibGFiZWwiLCJMYWJlbCIsIk1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJnZXRFbnRpdHlTZXQiLCJNb2RlbEhlbHBlciIsImdldEVudGl0eVNldFBhdGgiLCJnZXRDcml0aWNhbGl0eUNhbGN1bGF0aW9uQmluZGluZyIsInNJbXByb3ZlbWVudERpcmVjdGlvbiIsInNEZXZpYXRpb25Mb3ciLCJzVG9sZXJhbmNlTG93Iiwic0FjY2VwdGFuY2VMb3ciLCJzQWNjZXB0YW5jZUhpZ2giLCJzVG9sZXJhbmNlSGlnaCIsInNEZXZpYXRpb25IaWdoIiwic0NyaXRpY2FsaXR5RXhwcmVzc2lvbiIsIk5ldXRyYWwiLCJJbmZpbml0eSIsIkdvb2QiLCJDcml0aWNhbCIsIndhcm5pbmciLCJnZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgiLCJpTWVhc3VyZSIsIm9DaGFydEFubm90YXRpb25zIiwiaXNNaWNyb0NoYXJ0IiwiYU1lYXN1cmVzIiwic01lYXN1cmVQcm9wZXJ0eVBhdGgiLCJNZWFzdXJlcyIsInZhbHVlIiwiRHluYW1pY01lYXN1cmVzIiwiYk1lYXN1cmVBdHRyaWJ1dGVFeGlzdHMiLCJhTWVhc3VyZUF0dHJpYnV0ZXMiLCJNZWFzdXJlQXR0cmlidXRlcyIsImlNZWFzdXJlQXR0cmlidXRlIiwiZm5DaGVja01lYXN1cmUiLCJzTWVhc3VyZVBhdGgiLCJvTWVhc3VyZUF0dHJpYnV0ZSIsImluZGV4IiwiTWVhc3VyZSIsIkR5bmFtaWNNZWFzdXJlIiwiYmluZCIsImdldE1lYXN1cmVBdHRyaWJ1dGUiLCJzQ2hhcnRBbm5vdGF0aW9uUGF0aCIsInJlcXVlc3RPYmplY3QiLCJ0aGVuIiwic01lYXN1cmVBdHRyaWJ1dGVQYXRoIiwiRGF0YVBvaW50IiwiZ2V0TWVhc3VyZUF0dHJpYnV0ZUZvck1lYXN1cmUiLCJzdWJzdHJpbmciLCJpc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQiLCJvVGFyZ2V0Q29sbGVjdGlvbkNvbnRhaW5zVGFyZ2V0Iiwib1RhYmxlTWV0YWRhdGEiLCJwYXJlbnRFbnRpdHlTZXQiLCJzUGFyZW50RW50aXR5U2V0UGF0aCIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiZ2V0RGF0YUZyb21UZW1wbGF0ZSIsImRhdGFFbGVtZW50Iiwic3BsaXRQYXRoIiwiZGF0YUtleSIsImNvbm5lY3RlZERhdGFQYXRoIiwiY29ubmVjdGVkT2JqZWN0IiwidGVtcGxhdGUiLCJUZW1wbGF0ZSIsInNwbGl0VGVtcCIsInRlbXBBcnJheSIsInRyaW0iLCJEYXRhIiwibm90TGFzdEluZGV4IiwiZWxlbWVudCIsImlzTGFzdEluZGV4IiwidGVtcGxhdGVJbmZvIiwibGFzdEluZGV4IiwiZ2V0RGVsaW1pdGVyIiwic2V0TWV0YU1vZGVsIiwiZ2V0UGFyYW1ldGVycyIsIm9QYXJhbWV0ZXJJbmZvIiwiZ2V0UGFyYW1ldGVySW5mbyIsInBhcmFtZXRlclByb3BlcnRpZXMiLCJidWlsZEFjdGlvbldyYXBwZXIiLCJvVGhpcyIsImFQYXJhbXMiLCJyZWYiLCJoYW5kbGVyTW9kdWxlIiwiaGFuZGxlck1ldGhvZCIsImlkIiwiaW50ZXJuYWxNb2RlbFBhdGgiLCJvQWRkaXRpb25hbFBhcmFtcyIsImNvbnRleHRzIiwiZm4iLCJnZXRIaWRkZW5QYXRoRXhwcmVzc2lvbiIsImRhdGFGaWVsZEFubm90YXRpb25zIiwiaGlkZGVuIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzRW50aXR5U2V0UGF0aCIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNldHRpbmdzIiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCIsImFFcXVhbHNPcHMiLCJhU2luZ2xlUmFuZ2VPcHMiLCJhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzIiwiYU11bHRpUmFuZ2VPcHMiLCJhU2VhcmNoRXhwcmVzc2lvbk9wcyIsImFCYXNpY1NlbWFudGljRGF0ZU9wcyIsIlNlbWFudGljRGF0ZU9wZXJhdG9ycyIsImdldEJhc2ljU2VtYW50aWNEYXRlT3BlcmF0aW9ucyIsImJTZW1hbnRpY0RhdGVSYW5nZSIsImFTZW1hbnRpY0RhdGVPcHMiLCJjdXN0b21EYXRhIiwiZW1wdHlPcHMiLCJnZXRGaWx0ZXJPcGVyYXRpb25zIiwiRGVmYXVsdFNlbWFudGljRGF0ZU9wZXJhdG9ycyIsImdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJhRGVmYXVsdE9wZXJhdG9ycyIsInN1cHBvcnRlZE9wZXJhdG9ycyIsImV4dGVuZGVkU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiRXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJyZXN0cmljdGlvbnMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJzQWxsb3dlZEV4cHJlc3Npb24iLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwic2luZ2xlVmFsdWVEYXRlT3BzIiwiZ2V0U2luZ2xlVmFsdWVEYXRlT3BlcmF0aW9ucyIsImFTaW5nbGVWYWx1ZU9wcyIsIm11bHRpVmFsdWVPcGVyYXRvcnMiLCJtdWx0aVJhbmdlT3BzIiwiY29uY2F0IiwiZ2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5IiwicHJvcGVydHlUeXBlIiwiZ2V0QUlJY29uIiwiYWlJY29uIiwicmVxdWlyZXNJQ29udGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29tbW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0Q2hhcnQsXG5cdENoYXJ0TWVhc3VyZUF0dHJpYnV0ZVR5cGUsXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdFByZXNlbnRhdGlvblZhcmlhbnRcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBjb25zdGFudCwgZXF1YWwsIGZuLCBpZkVsc2UsIG5vdEVxdWFsLCBwYXRoSW5Nb2RlbCwgcmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgYWlJY29uLCB0eXBlIEN1c3RvbUFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNQcm9wZXJ0eUZpbHRlcmFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0ICogYXMgRGVmYXVsdFNlbWFudGljRGF0ZU9wZXJhdG9ycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXJCYXIvRGVmYXVsdFNlbWFudGljRGF0ZU9wZXJhdG9yc1wiO1xuaW1wb3J0IEV4dGVuZGVkU2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlckJhci9FeHRlbmRlZFNlbWFudGljRGF0ZU9wZXJhdG9yc1wiO1xuaW1wb3J0IFNlbWFudGljRGF0ZU9wZXJhdG9ycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXJCYXIvU2VtYW50aWNEYXRlT3BlcmF0b3JzXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBEZXZpY2UgZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvclV0aWwgZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0ZpbHRlck9wZXJhdG9yVXRpbFwiO1xuaW1wb3J0IEZpZWxkRWRpdE1vZGUgZnJvbSBcInNhcC91aS9tZGMvZW51bXMvRmllbGRFZGl0TW9kZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL3R5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG50eXBlIE1ldGFNb2RlbE1lYXN1cmUgPSB7XG5cdCRQcm9wZXJ0eVBhdGg6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcHM6IHN0cmluZ1tdLCBhRXhwcmVzc2lvbk9wczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cdC8vIEZyb20gdGhlIGRlZmF1bHQgc2V0IG9mIE9wZXJhdG9ycyBmb3IgdGhlIEJhc2UgVHlwZSwgc2VsZWN0IHRob3NlIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIEFsbG93ZWQgVmFsdWUuXG5cdC8vIEluIGNhc2UgdGhhdCBubyBvcGVyYXRvcnMgYXJlIGZvdW5kLCByZXR1cm4gdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGRlZmF1bHQgc2V0IGlzIHVzZWQuXG5cdHJldHVybiBhRGVmYXVsdE9wcy5maWx0ZXIoZnVuY3Rpb24gKHNFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGFFeHByZXNzaW9uT3BzLmluY2x1ZGVzKHNFbGVtZW50KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIF9nZXREZWZhdWx0T3BlcmF0b3JzKHNQcm9wZXJ0eVR5cGU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdC8vIG1kYyBkZWZpbmVzIHRoZSBmdWxsIHNldCBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIG1lYW5pbmdmdWwgZm9yIGVhY2ggRWRtIFR5cGVcblx0Ly8gVE9ETyBSZXBsYWNlIHdpdGggbW9kZWwgLyBpbnRlcm5hbCB3YXkgb2YgcmV0cmlldmluZyB0aGUgYWN0dWFsIG1vZGVsIHR5cGUgdXNlZCBmb3IgdGhlIHByb3BlcnR5XG5cdGNvbnN0IG9EYXRhQ2xhc3MgPSBUeXBlTWFwLmdldERhdGFUeXBlQ2xhc3NOYW1lKHNQcm9wZXJ0eVR5cGUpO1xuXHQvLyBUT0RPIG5lZWQgdG8gcGFzcyBwcm9wZXIgZm9ybWF0T3B0aW9ucywgY29uc3RyYWludHMgaGVyZVxuXHRjb25zdCBvQmFzZVR5cGUgPSBUeXBlTWFwLmdldEJhc2VUeXBlKG9EYXRhQ2xhc3MsIHt9LCB7fSk7XG5cdHJldHVybiBGaWx0ZXJPcGVyYXRvclV0aWwuZ2V0T3BlcmF0b3JzRm9yVHlwZShvQmFzZVR5cGUpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhbiBvcGVyYXRvciBpcyBleGNsdWRlZCBieSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIG9wZXJhdG9yTmFtZSBUaGUgb3BlcmF0b3IgbmFtZSB0byBjaGVja1xuICogQHBhcmFtIG9TZXR0aW5ncyBUaGUgc2V0dGluZ3Mgb2JqZWN0IGNvbnRhaW5pbmcgb3BlcmF0b3IgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb3BlcmF0b3IgaXMgZXhjbHVkZWQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBfaXNPcGVyYXRvckV4Y2x1ZGVkQnlNYW5pZmVzdChvcGVyYXRvck5hbWU6IHN0cmluZywgb1NldHRpbmdzOiBGaWx0ZXJTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRpZiAoIW9TZXR0aW5ncz8ub3BlcmF0b3JDb25maWd1cmF0aW9uKSByZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24uc29tZShcblx0XHQoY29uZmlnKSA9PiBjb25maWcucGF0aCA9PT0gXCJrZXlcIiAmJiBjb25maWcuZXF1YWxzID09PSBvcGVyYXRvck5hbWUgJiYgY29uZmlnLmV4Y2x1ZGUgPT09IHRydWVcblx0KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IEVtcHR5L05vdEVtcHR5IG9wZXJhdG9ycyB3aXRoIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gc3VwcG9ydC5cbiAqIEBwYXJhbSBzVHlwZSBUaGUgZmllbGQgdHlwZVxuICogQHBhcmFtIG9TZXR0aW5ncyBUaGUgc2V0dGluZ3Mgb2JqZWN0IGNvbnRhaW5pbmcgb3BlcmF0b3IgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQXJyYXkgb2YgRW1wdHkvTm90RW1wdHkgb3BlcmF0b3JzIGlmIG5vdCBleGNsdWRlZCBieSBtYW5pZmVzdFxuICovXG5mdW5jdGlvbiBfZ2V0RW1wdHlPcHMoc1R5cGU6IHN0cmluZywgb1NldHRpbmdzOiBGaWx0ZXJTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcblx0Ly8gT25seSByZXR1cm4gRW1wdHkvTm90RW1wdHkgZm9yIGRhdGUgdHlwZXNcblx0aWYgKHNUeXBlICE9PSBcIkVkbS5EYXRlXCIgJiYgc1R5cGUgIT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG5cblx0Ly8gQ2hlY2sgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBhbmQgYWRkIG9wZXJhdG9ycyBpbiBjb3JyZWN0IG9yZGVyIChOb3RFbXB0eSBmaXJzdCB0byBtYXRjaCB0ZXN0IGV4cGVjdGF0aW9ucylcblx0Y29uc3Qgbm90RW1wdHlFeGNsdWRlZCA9IF9pc09wZXJhdG9yRXhjbHVkZWRCeU1hbmlmZXN0KFwiTm90RW1wdHlcIiwgb1NldHRpbmdzKTtcblx0Y29uc3QgZW1wdHlFeGNsdWRlZCA9IF9pc09wZXJhdG9yRXhjbHVkZWRCeU1hbmlmZXN0KFwiRW1wdHlcIiwgb1NldHRpbmdzKTtcblxuXHRpZiAoIW5vdEVtcHR5RXhjbHVkZWQpIHtcblx0XHRyZXN1bHQucHVzaChcIk5vdEVtcHR5XCIpO1xuXHR9XG5cdGlmICghZW1wdHlFeGNsdWRlZCkge1xuXHRcdHJlc3VsdC5wdXNoKFwiRW1wdHlcIik7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBWYWx1ZUNvbG9yID0gbUxpYnJhcnkuVmFsdWVDb2xvcjtcbmNvbnN0IENvbW1vbkhlbHBlciA9IHtcblx0Z2V0UGF0aFRvS2V5OiBmdW5jdGlvbiAob0N0eDogQ29udGV4dCk6IG9iamVjdCB7XG5cdFx0cmV0dXJuIG9DdHguZ2V0T2JqZWN0KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERldGVybWluZSBpZiBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICogQHBhcmFtIHRhcmdldCBUYXJnZXQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG9JbnRlcmZhY2UgSW50ZXJmYWNlIGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIEEgQmluZGluZyBFeHByZXNzaW9uIHRvIGRldGVybWluZSBpZiBhIGZpZWxkIHNob3VsZCBiZSBlZGl0YWJsZSBvciBub3QuXG5cdCAqL1xuXHRnZXRQYXJhbWV0ZXJFZGl0TW9kZTogZnVuY3Rpb24gKHRhcmdldDogb2JqZWN0LCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0c1Byb3BlcnR5UGF0aCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvQW5ub3RhdGlvbnMgPSBvTW9kZWwuZ2V0T2JqZWN0KGAke3NQcm9wZXJ0eVBhdGh9QGApLFxuXHRcdFx0ZmllbGRDb250cm9sID0gb0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0sXG5cdFx0XHRpbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLFxuXHRcdFx0Y29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cblx0XHRsZXQgc0VkaXRNb2RlOiBGaWVsZEVkaXRNb2RlIHwgc3RyaW5nID0gRmllbGRFZGl0TW9kZS5FZGl0YWJsZTtcblxuXHRcdGlmIChpbW11dGFibGUgfHwgY29tcHV0ZWQpIHtcblx0XHRcdHNFZGl0TW9kZSA9IEZpZWxkRWRpdE1vZGUuUmVhZE9ubHk7XG5cdFx0fSBlbHNlIGlmIChmaWVsZENvbnRyb2wpIHtcblx0XHRcdGlmIChmaWVsZENvbnRyb2wuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9SZWFkT25seVwiKSB7XG5cdFx0XHRcdFx0c0VkaXRNb2RlID0gRmllbGRFZGl0TW9kZS5SZWFkT25seTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL0luYXBwbGljYWJsZVwiIHx8XG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL0hpZGRlblwiXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHNFZGl0TW9kZSA9IEZpZWxkRWRpdE1vZGUuRGlzYWJsZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChmaWVsZENvbnRyb2wuJFBhdGgpIHtcblx0XHRcdFx0c0VkaXRNb2RlID1cblx0XHRcdFx0XHRcIns9ICV7XCIgK1xuXHRcdFx0XHRcdGZpZWxkQ29udHJvbC4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9IDwgMyA/ICgle1wiICtcblx0XHRcdFx0XHRmaWVsZENvbnRyb2wuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gMCA/ICdcIiArXG5cdFx0XHRcdFx0RmllbGRFZGl0TW9kZS5EaXNhYmxlZCArXG5cdFx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0XHRGaWVsZEVkaXRNb2RlLlJlYWRPbmx5ICtcblx0XHRcdFx0XHRcIicpIDogJ1wiICtcblx0XHRcdFx0XHRGaWVsZEVkaXRNb2RlLkVkaXRhYmxlICtcblx0XHRcdFx0XHRcIid9XCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNFZGl0TW9kZTtcblx0fSxcblx0LyoqXG5cdCAqIEdldCB0aGUgY29tcGxldGUgbWV0YXBhdGggdG8gdGhlIHRhcmdldC5cblx0ICogQHBhcmFtIHRhcmdldFxuXHQgKiBAcGFyYW0gb0ludGVyZmFjZVxuXHQgKiBAcmV0dXJucyBUaGUgbWV0YXBhdGhcblx0ICovXG5cdGdldE1ldGFQYXRoOiBmdW5jdGlvbiAodGFyZ2V0OiB1bmtub3duLCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQgJiYgb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSkgfHwgdW5kZWZpbmVkO1xuXHR9LFxuXHRnZXRNZXRhTW9kZWxJZDogZnVuY3Rpb24gKHRhcmdldDogQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogc3RyaW5nIHtcblx0XHRjb252ZXJ0VHlwZXMob0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdHJldHVybiBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0TW9kZWwoKS5nZXRJZCgpO1xuXHR9LFxuXHRpc0Rlc2t0b3A6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gRGV2aWNlLnN5c3RlbS5kZXNrdG9wID09PSB0cnVlO1xuXHR9LFxuXHRnZXRUYXJnZXRDb2xsZWN0aW9uUGF0aDogZnVuY3Rpb24gKGNvbnRleHQ6IENvbnRleHQsIG5hdkNvbGxlY3Rpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBzUGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdChjb250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gXCJFbnRpdHlTZXRcIiB8fFxuXHRcdFx0KGNvbnRleHQuZ2V0T2JqZWN0KFwiJENvbnRhaW5zVGFyZ2V0XCIpIGFzIHVua25vd24gYXMgYm9vbGVhbikgPT09IHRydWVcblx0XHQpIHtcblx0XHRcdHJldHVybiBzUGF0aDtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsIHwgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuaXNBPE9EYXRhTWV0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiKSA/IG1vZGVsIDogbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0c1BhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXG5cdFx0Ly9TdXBwb3J0aW5nIHNQYXRoIG9mIGFueSBmb3JtYXQsIGVpdGhlciAnLzxlbnRpdHlTZXQ+LzxuYXZpZ2F0aW9uQ29sbGVjdGlvbj4nIDxPUj4gJy88ZW50aXR5U2V0Pi8kVHlwZS88bmF2aWdhdGlvbkNvbGxlY3Rpb24+J1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoZnVuY3Rpb24gKHNQYXJ0OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiAhIXNQYXJ0ICYmIHNQYXJ0ICE9IFwiJFR5cGVcIjtcblx0XHR9KTsgLy9maWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgYW5kIHBhcnRzIHJlZmVycmluZyB0byAnJFR5cGUnXG5cdFx0Y29uc3QgZW50aXR5U2V0ID0gYC8ke2FQYXJ0c1swXX1gO1xuXHRcdGlmIChhUGFydHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gZW50aXR5U2V0O1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uQ29sbGVjdGlvbiA9IG5hdkNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCA/IGFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSA6IG5hdkNvbGxlY3Rpb247XG5cdFx0cmV0dXJuIGAke2VudGl0eVNldH0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtuYXZpZ2F0aW9uQ29sbGVjdGlvbn1gOyAvLyB1c2VkIGluIGdvdG9UYXJnZXRFbnRpdHlTZXQgbWV0aG9kIGluIHRoZSBzYW1lIGZpbGVcblx0fSxcblxuXHRpc1Byb3BlcnR5RmlsdGVyYWJsZTogZnVuY3Rpb24gKFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0b0RhdGFGaWVsZD86IE1ldGFNb2RlbFR5cGU8RGF0YUZpZWxkVHlwZXM+LFxuXHRcdHNraXBIaWRkZW5GaWx0ZXJzPzogYm9vbGVhblxuXHQpOiBib29sZWFuIHwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdHNQcm9wZXJ0eVBhdGggPSBjb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdC8vIExvYWNhdGlvblBhdGggd291bGQgYmUgdGhlIHByZWZpeCBvZiBzUHJvcGVydHlQYXRoLCBleGFtcGxlOiBzUHJvcGVydHlQYXRoID0gJy9DdXN0b21lci9TZXQvTmFtZScgLT4gc1Byb3BlcnR5TG9jYXRpb25QYXRoID0gJy9DdXN0b21lci9TZXQnXG5cdFx0XHRzUHJvcGVydHlMb2NhdGlvblBhdGggPSBDb21tb25IZWxwZXIuZ2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGgob01vZGVsLCBzUHJvcGVydHlQYXRoKSxcblx0XHRcdHNQcm9wZXJ0eSA9IHNQcm9wZXJ0eVBhdGgucmVwbGFjZShgJHtzUHJvcGVydHlMb2NhdGlvblBhdGh9L2AsIFwiXCIpO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGFGaWVsZCAmJlxuXHRcdFx0KG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgfHxcblx0XHRcdFx0b0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcblx0XHQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNQcm9wZXJ0eUZpbHRlcmFibGUob01vZGVsLCBzUHJvcGVydHlMb2NhdGlvblBhdGgsIHNQcm9wZXJ0eSwgc2tpcEhpZGRlbkZpbHRlcnMpO1xuXHR9LFxuXG5cdGdldExvY2F0aW9uRm9yUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAob01vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc1Byb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgaUxlbmd0aDtcblx0XHRsZXQgc0NvbGxlY3Rpb25QYXRoID0gc1Byb3BlcnR5UGF0aC5zbGljZSgwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0aWYgKG9Nb2RlbC5nZXRPYmplY3QoYCR7c0NvbGxlY3Rpb25QYXRofS8ka2luZGApID09PSBcIkVudGl0eUNvbnRhaW5lclwiKSB7XG5cdFx0XHRpTGVuZ3RoID0gc0NvbGxlY3Rpb25QYXRoLmxlbmd0aCArIDE7XG5cdFx0XHRzQ29sbGVjdGlvblBhdGggPSBzUHJvcGVydHlQYXRoLnNsaWNlKGlMZW5ndGgsIHNQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIiwgaUxlbmd0aCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gc0NvbGxlY3Rpb25QYXRoO1xuXHR9LFxuXHRnb3RvQWN0aW9uUGFyYW1ldGVyOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0c1Byb3BlcnR5TmFtZSA9IG9Db250ZXh0LmdldE9iamVjdChgJHtzUGF0aH0vJE5hbWVgKTtcblxuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJQYXRoKHNQYXRoLCBzUHJvcGVydHlOYW1lKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGVudGl0eSBzZXQgbmFtZSBmcm9tIHRoZSBlbnRpdHkgdHlwZSBuYW1lLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBPRGF0YSB2NCBtZXRhbW9kZWwgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNFbnRpdHlUeXBlIEVudGl0eVR5cGUgb2YgdGhlIGFjdGlvbVxuXHQgKiBAcmV0dXJucyBUaGUgRW50aXR5U2V0IG9mIHRoZSBib3VuZCBhY3Rpb25cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldEVudGl0eVNldE5hbWU6IGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVR5cGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAodHlwZW9mIG9FbnRpdHlDb250YWluZXJba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBvRW50aXR5Q29udGFpbmVyW2tleV0uJFR5cGUgPT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtZXRhbW9kZWwgcGF0aCBjb3JyZWN0bHkgZm9yIGJvdW5kIGFjdGlvbnMgaWYgdXNlZCB3aXRoIGJSZXR1cm5Pbmx5UGF0aCBhcyB0cnVlLFxuXHQgKiBlbHNlIHJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGhhcyAzIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgYWN0aW9uLiBUaGV5IGFyZSB0aGUgZW50aXR5IHNldCBuYW1lLFxuXHQgKiB0aGUgJFBhdGggdmFsdWUgb2YgdGhlIE9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uIGFuZCB0aGUgYmluZGluZyBwYXJhbWV0ZXIgbmFtZS4gSWZcblx0ICogYkNoZWNrU3RhdGljVmFsdWUgaXMgdHJ1ZSwgcmV0dXJucyB0aGUgc3RhdGljIHZhbHVlIG9mIE9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLCBpZiBwcmVzZW50LlxuXHQgKiBlLmcuIGZvciBib3VuZCBhY3Rpb24gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cblx0ICogb2YgZW50aXR5IHNldCBTb21lRW50aXR5U2V0LCB0aGUgc3RyaW5nIFwiL1NvbWVFbnRpdHlTZXQvc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cIiBpcyByZXR1cm5lZC5cblx0ICogQHBhcmFtIG9BY3Rpb24gVGhlIGNvbnRleHQgb2JqZWN0IG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGJSZXR1cm5Pbmx5UGF0aCBJZiBmYWxzZSwgYWRkaXRpb25hbCBpbmZvIGlzIHJldHVybmVkIGFsb25nIHdpdGggbWV0YW1vZGVsIHBhdGggdG8gdGhlIGJvdW5kIGFjdGlvblxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGJvdW5kIGFjdGlvbiBvZiB0aGUgZm9ybSBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvblxuXHQgKiBAcGFyYW0gYkNoZWNrU3RhdGljVmFsdWUgSWYgdHJ1ZSwgdGhlIHN0YXRpYyB2YWx1ZSBvZiBPcGVyYXRpb25BdmFpbGFibGUgaXMgcmV0dXJuZWQsIGlmIHByZXNlbnRcblx0ICogQHJldHVybnMgVGhlIHN0cmluZyBvciBvYmplY3QgYXMgc3BlY2lmaWVkIGJ5IGJSZXR1cm5Pbmx5UGF0aFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0QWN0aW9uUGF0aDogZnVuY3Rpb24gKFxuXHRcdG9BY3Rpb246IENvbnRleHQsXG5cdFx0YlJldHVybk9ubHlQYXRoOiBib29sZWFuLFxuXHRcdHNBY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdGJDaGVja1N0YXRpY1ZhbHVlPzogYm9vbGVhblxuXHQpOlxuXHRcdHwgc3RyaW5nXG5cdFx0fCB7XG5cdFx0XHRcdHNDb250ZXh0UGF0aDogc3RyaW5nO1xuXHRcdFx0XHRzUHJvcGVydHk6IHN0cmluZztcblx0XHRcdFx0c0JpbmRpbmdQYXJhbWV0ZXI6IHN0cmluZztcblx0XHQgIH0ge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQWN0aW9uLmdldFBhdGgoKS5zcGxpdChcIi9AXCIpWzBdO1xuXG5cdFx0c0FjdGlvbk5hbWUgPSAhc0FjdGlvbk5hbWUgPyBvQWN0aW9uLmdldE9iamVjdChvQWN0aW9uLmdldFBhdGgoKSkgOiBzQWN0aW9uTmFtZTtcblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIihcIikpIHtcblx0XHRcdC8vIGFjdGlvbiBib3VuZCB0byBhbm90aGVyIGVudGl0eSB0eXBlXG5cdFx0XHRzQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKVswXTtcblx0XHR9IGVsc2UgaWYgKG9BY3Rpb24uZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCkpIHtcblx0XHRcdC8vIFRPRE86IHRoaXMgbG9naWMgc291bmRzIHdyb25nLCB0byBiZSBjb3JyZWN0ZWRcblx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCkuJFR5cGU7XG5cdFx0XHRjb25zdCBzRW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5U2V0TmFtZShvQWN0aW9uLmdldE1vZGVsKCksIHNFbnRpdHlUeXBlTmFtZSk7XG5cdFx0XHRpZiAoc0VudGl0eU5hbWUpIHtcblx0XHRcdFx0c0NvbnRleHRQYXRoID0gYC8ke3NFbnRpdHlOYW1lfWA7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzQ29udGV4dFBhdGg7XG5cdFx0fVxuXG5cdFx0aWYgKGJDaGVja1N0YXRpY1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfUBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVgKTtcblx0XHR9XG5cdFx0aWYgKGJSZXR1cm5Pbmx5UGF0aCkge1xuXHRcdFx0cmV0dXJuIGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzQ29udGV4dFBhdGg6IHNDb250ZXh0UGF0aCxcblx0XHRcdFx0c1Byb3BlcnR5OiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZS8kUGF0aGApLFxuXHRcdFx0XHRzQmluZGluZ1BhcmFtZXRlcjogb0FjdGlvbi5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXIvMC8kTmFtZWApXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHRnZXROYXZpZ2F0aW9uQ29udGV4dDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB3aXRob3V0IHRoZSBlbnRpdHkgdHlwZSAocG90ZW50aWFsbHkgZmlyc3QpIGFuZCBwcm9wZXJ0eSAobGFzdCkgcGFydCAob3B0aW9uYWwpLlxuXHQgKiBUaGUgcmVzdWx0IGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgYSBzaW1wbGUgZGlyZWN0IHByb3BlcnR5LlxuXHQgKlxuXHQgKiBJZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gcHJvcGVydHkgcGF0aCBzdGFydHMgd2l0aCBhIHNsYXNoICgvKSwgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBpcyBwYXJ0IG9mIHRoZSBwYXRoIGFuZCB3aWxsIGJlIHN0cmlwcGVkIGF3YXkuXG5cdCAqIEBwYXJhbSBzUHJvcGVydHlQYXRoXG5cdCAqIEBwYXJhbSBiS2VlcFByb3BlcnR5XG5cdCAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGhcblx0ICovXG5cdGdldE5hdmlnYXRpb25QYXRoOiBmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBiS2VlcFByb3BlcnR5PzogYm9vbGVhbik6IHN0cmluZyB7XG5cdFx0Y29uc3QgYlN0YXJ0c1dpdGhFbnRpdHlUeXBlID0gc1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKTtcblx0XHRjb25zdCBhUGFydHMgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoZnVuY3Rpb24gKHBhcnQ6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuICEhcGFydDtcblx0XHR9KTtcblx0XHRpZiAoYlN0YXJ0c1dpdGhFbnRpdHlUeXBlKSB7XG5cdFx0XHRhUGFydHMuc2hpZnQoKTtcblx0XHR9XG5cdFx0aWYgKCFiS2VlcFByb3BlcnR5KSB7XG5cdFx0XHRhUGFydHMucG9wKCk7XG5cdFx0fVxuXHRcdHJldHVybiBhUGFydHMuam9pbihcIi9cIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNvcnJlY3QgbWV0YW1vZGVsIHBhdGggZm9yIGJvdW5kIGFjdGlvbnMuXG5cdCAqXG5cdCAqIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpcnJlc3BlY3RpdmUgb2YgdGhlIGFjdGlvbiB0eXBlLCB0aGlzIHdpbGwgYmUgYXBwbGllZCB0byB1bmJvdW5kIGFjdGlvbnMuXG5cdCAqIEluIHN1Y2ggYSBjYXNlLCBpZiBhbiBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgaXQgaXMgaWdub3JlZCBkdXJpbmcgdGVtcGxhdGluZy5cblx0ICpcblx0ICogRXhhbXBsZTogZm9yIHRoZSBib3VuZCBhY3Rpb24gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb24gb2YgZW50aXR5IHNldCBTb21lRW50aXR5U2V0LFxuXHQgKiB0aGUgc3RyaW5nIFwiL1NvbWVFbnRpdHlTZXQvc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cIiBpcyByZXR1cm5lZC5cblx0ICogQHBhcmFtIG9BY3Rpb24gQ29udGV4dCBvYmplY3QgZm9yIHRoZSBhY3Rpb25cblx0ICogQHJldHVybnMgQ29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYW5kIGluY29ycmVjdCBwYXRoIGZvciB1bmJvdW5kIGFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldEFjdGlvbkNvbnRleHQ6IGZ1bmN0aW9uIChvQWN0aW9uOiBDb250ZXh0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gQ29tbW9uSGVscGVyLmdldEFjdGlvblBhdGgob0FjdGlvbiwgdHJ1ZSkgYXMgc3RyaW5nO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbWV0YW1vZGVsIHBhdGggY29ycmVjdGx5IGZvciBvdmVybG9hZGVkIGJvdW5kIGFjdGlvbnMuIEZvciB1bmJvdW5kIGFjdGlvbnMsXG5cdCAqIHRoZSBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgYnV0IGlnbm9yZWQgZHVyaW5nIHRlbXBsYXRpbmcuXG5cdCAqIGUuZy4gZm9yIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbiBvZiBlbnRpdHkgc2V0IFNvbWVFbnRpdHlTZXQsXG5cdCAqIHRoZSBzdHJpbmcgXCIvU29tZUVudGl0eVNldC9zb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbi9AJHVpNS5vdmVybG9hZC8wXCIgaXMgcmV0dXJuZWQuXG5cdCAqIEBwYXJhbSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYWN0aW9uIG92ZXJsb2FkIGFuZCBpbmNvcnJlY3QgcGF0aCBmb3IgdW5ib3VuZCBhY3Rpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRQYXRoVG9Cb3VuZEFjdGlvbk92ZXJsb2FkOiBmdW5jdGlvbiAob0FjdGlvbjogQ29udGV4dCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc1BhdGggPSBDb21tb25IZWxwZXIuZ2V0QWN0aW9uUGF0aChvQWN0aW9uLCB0cnVlKTtcblx0XHRyZXR1cm4gYCR7c1BhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdHJpbmcgd2l0aCBzaW5nbGUgcXVvdGVzLlxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIGludG8gc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcGFyYW0gW2JFc2NhcGVdIFNob3VsZCB0aGUgc3RyaW5nIGJlIGVzY2FwZWQgYmVmb3JlaGFuZFxuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIHNpbmdsZSBxdW90ZXNcblx0ICovXG5cdGFkZFNpbmdsZVF1b3RlczogZnVuY3Rpb24gKHNWYWx1ZTogc3RyaW5nLCBiRXNjYXBlPzogYm9vbGVhbik6IHN0cmluZyB7XG5cdFx0aWYgKGJFc2NhcGUgJiYgc1ZhbHVlKSB7XG5cdFx0XHRzVmFsdWUgPSB0aGlzLmVzY2FwZVNpbmdsZVF1b3RlcyhzVmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYCcke3NWYWx1ZX0nYDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgc3RyaW5nIHdpdGggZXNjYXBlZCBzaW5nbGUgcXVvdGVzLlxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgZXNjYXBpbmcgb2Ygc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIGVzY2FwZWQgc2luZ2xlIHF1b3Rlc1xuXHQgKi9cblx0ZXNjYXBlU2luZ2xlUXVvdGVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBzVmFsdWUucmVwbGFjZSgvWyddL2csIFwiXFxcXCdcIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGZ1bmN0aW9uIHN0cmluZ1xuXHQgKiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgZ2VuZXJhdGVGdW5jdGlvbiBpcyBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgZnVuY3Rpb24gc3RyaW5nLlxuXHQgKiBSZW1haW5pbmcgYXJndW1lbnRzIG9mIGdlbmVyYXRlRnVuY3Rpb24gYXJlIGFyZ3VtZW50cyBvZiB0aGUgbmV3bHkgZ2VuZXJhdGVkIGZ1bmN0aW9uIHN0cmluZy5cblx0ICogQHBhcmFtIHNGdW5jTmFtZSBTb21lIHN0cmluZyBmb3IgdGhlIGZ1bmN0aW9uIG5hbWVcblx0ICogQHBhcmFtIGFyZ3MgVGhlIHJlbWFpbmluZyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgLSBGdW5jdGlvbiBzdHJpbmcgZGVwZW5kcyBvbiBhcmd1bWVudHMgcGFzc2VkXG5cdCAqL1xuXHRnZW5lcmF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoc0Z1bmNOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0XHRsZXQgc1BhcmFtcyA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzUGFyYW1zICs9IGFyZ3NbaV07XG5cdFx0XHRpZiAoaSA8IGFyZ3MubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRzUGFyYW1zICs9IFwiLCBcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc0Z1bmN0aW9uID0gYCR7c0Z1bmNOYW1lfSgpYDtcblx0XHRpZiAoc1BhcmFtcykge1xuXHRcdFx0c0Z1bmN0aW9uID0gYCR7c0Z1bmNOYW1lfSgke3NQYXJhbXN9KWA7XG5cdFx0fVxuXHRcdHJldHVybiBzRnVuY3Rpb247XG5cdH0sXG5cdC8qXG5cdCAqIFJldHVybnMgdGhlIHZpc2liaWxpdHkgZXhwcmVzc2lvbiBmb3IgZGF0YXBvaW50IHRpdGxlL2xpbmtcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gYW5ub3RhdGlvbiBwYXRoIG9mIGRhdGEgcG9pbnQgb3IgTWljcm9jaGFydFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0NsaWNrYWJsZV0gdHJ1ZSBpZiBsaW5rIGlzIHZpc2libGVcblx0ICogQHJldHVybnMge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9ufSB2aXNpYmlsaXR5RXhwIFVzZWQgdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGJpbmRpbmcgZm9yIERhdGFQb2ludHMgdGl0bGUgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cblx0Z2V0SGVhZGVyRGF0YVBvaW50TGlua1Zpc2liaWxpdHk6IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIGlzQ2xpY2thYmxlOiBib29sZWFuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0Y29uc3RhbnQoaXNDbGlja2FibGUpLFxuXHRcdFx0XHRlcXVhbChwYXRoSW5Nb2RlbChgaXNIZWFkZXJEUExpbmtWaXNpYmxlLyR7cGF0aH1gLCBcImludGVybmFsXCIpLCB0cnVlKSxcblx0XHRcdFx0bm90RXF1YWwocGF0aEluTW9kZWwoYGlzSGVhZGVyRFBMaW5rVmlzaWJsZS8ke3BhdGh9YCwgXCJpbnRlcm5hbFwiKSwgdHJ1ZSlcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBvYmplY3QgdG8gc3RyaW5nKGRpZmZlcmVudCBmcm9tIEpTT04uc3RyaW5naWZ5IG9yLnRvU3RyaW5nKS5cblx0ICogQHBhcmFtIG9QYXJhbXMgU29tZSBvYmplY3Rcblx0ICogQHJldHVybnMgLSBPYmplY3Qgc3RyaW5nXG5cdCAqL1xuXHRvYmplY3RUb1N0cmluZzogZnVuY3Rpb24gKG9QYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcblx0XHRsZXQgaU51bWJlck9mS2V5cyA9IE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCxcblx0XHRcdHNQYXJhbXMgPSBcIlwiO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG9QYXJhbXMpIHtcblx0XHRcdGxldCBzVmFsdWUgPSBvUGFyYW1zW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSAmJiB0eXBlb2Ygc1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHNWYWx1ZSA9IHRoaXMub2JqZWN0VG9TdHJpbmcoc1ZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblx0XHRcdH1cblx0XHRcdHNQYXJhbXMgKz0gYCR7c0tleX06ICR7c1ZhbHVlfWA7XG5cdFx0XHRpZiAoaU51bWJlck9mS2V5cyA+IDEpIHtcblx0XHRcdFx0LS1pTnVtYmVyT2ZLZXlzO1xuXHRcdFx0XHRzUGFyYW1zICs9IFwiLCBcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYHsgJHtzUGFyYW1zfX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGVzY2FwZSBjaGFyYWN0ZXJzIChcXCkgZnJvbSBhbiBleHByZXNzaW9uLlxuXHQgKiBAcGFyYW0gc0V4cHJlc3Npb24gQW4gZXhwcmVzc2lvbiB3aXRoIGVzY2FwZSBjaGFyYWN0ZXJzXG5cdCAqIEByZXR1cm5zIEV4cHJlc3Npb24gc3RyaW5nIHdpdGhvdXQgZXNjYXBlIGNoYXJhY3RlcnMgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRyZW1vdmVFc2NhcGVDaGFyYWN0ZXJzOiBmdW5jdGlvbiAoc0V4cHJlc3Npb24/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBzRXhwcmVzc2lvbiA/IHNFeHByZXNzaW9uLnJlcGxhY2UoL1xcXFw/XFxcXChbe31dKS9nLCBcIiQxXCIpIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNYWtlcyB1cGRhdGVzIHRvIGEgc3RyaW5naWZpZWQgb2JqZWN0IHNvIHRoYXQgaXQgd29ya3MgcHJvcGVybHkgaW4gYSB0ZW1wbGF0ZSBieSBhZGRpbmcgdWk1T2JqZWN0OnRydWUuXG5cdCAqIEBwYXJhbSBzU3RyaW5naWZpZWRcblx0ICogQHJldHVybnMgVGhlIHVwZGF0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3Rcblx0ICovXG5cdHN0cmluZ2lmeU9iamVjdDogZnVuY3Rpb24gKHNTdHJpbmdpZmllZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXNTdHJpbmdpZmllZCB8fCBzU3RyaW5naWZpZWQgPT09IFwie31cIikge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb09iamVjdCA9IEpTT04ucGFyc2Uoc1N0cmluZ2lmaWVkKTtcblx0XHRcdGlmICh0eXBlb2Ygb09iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShvT2JqZWN0KSkge1xuXHRcdFx0XHRjb25zdCBvVUk1T2JqZWN0ID0ge1xuXHRcdFx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRPYmplY3QuYXNzaWduKG9VSTVPYmplY3QsIG9PYmplY3QpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob1VJNU9iamVjdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzVHlwZSA9IEFycmF5LmlzQXJyYXkob09iamVjdCkgPyBcIkFycmF5XCIgOiB0eXBlb2Ygb09iamVjdDtcblx0XHRcdFx0TG9nLmVycm9yKGBVbmV4cGVjdGVkIG9iamVjdCB0eXBlIGluIHN0cmluZ2lmeU9iamVjdCAoJHtzVHlwZX0pIC0gb25seSB3b3JrcyB3aXRoIG9iamVjdGApO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmdpZnlPYmplY3Qgb25seSB3b3JrcyB3aXRoIG9iamVjdHMhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkYXRhLCB0YWtpbmcgY2FyZSB0aGF0IGl0IGlzIG5vdCB0cmVhdGVkIGFzIGEgYmluZGluZyBleHByZXNzaW9uLlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gc3RyaW5naWZ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEuXG5cdCAqL1xuXHRzdHJpbmdpZnlDdXN0b21EYXRhOiBmdW5jdGlvbiAodkRhdGE6IG9iamVjdCB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb09iamVjdDogeyB1aTVvYmplY3Q6IHRydWU7IGN1c3RvbURhdGE/OiB1bmtub3duIH0gPSB7XG5cdFx0XHR1aTVvYmplY3Q6IHRydWVcblx0XHR9O1xuXHRcdG9PYmplY3RbXCJjdXN0b21EYXRhXCJdID0gdkRhdGEgaW5zdGFuY2VvZiBDb250ZXh0ID8gdkRhdGEuZ2V0T2JqZWN0KCkgOiB2RGF0YTtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob09iamVjdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gZGF0YSwgcG90ZW50aWFsbHkgdW53cmFwcyB0aGUgZGF0YS5cblx0ICogQHBhcmFtIHZEYXRhIFRoZSBkYXRhIHRvIHBhcnNlXG5cdCAqIEBwYXJhbSB2RGF0YS51aTVvYmplY3Rcblx0ICogQHBhcmFtIHZEYXRhLmN1c3RvbURhdGFcblx0ICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZGF0YSBwYXJzaW5nXG5cdCAqL1xuXHRwYXJzZUN1c3RvbURhdGE6IGZ1bmN0aW9uICh2RGF0YT86IHN0cmluZyB8IHsgdWk1b2JqZWN0OiB0cnVlOyBjdXN0b21EYXRhPzogdW5rbm93biB9KTogdW5rbm93biB7XG5cdFx0dkRhdGEgPSB0eXBlb2YgdkRhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEYXRhKSA6IHZEYXRhO1xuXHRcdGlmICh2RGF0YSAmJiB2RGF0YS5oYXNPd25Qcm9wZXJ0eShcImN1c3RvbURhdGFcIikpIHtcblx0XHRcdHJldHVybiAodkRhdGEgYXMgeyB1aTVvYmplY3Q6IHRydWU7IGN1c3RvbURhdGE/OiB1bmtub3duIH0pW1wiY3VzdG9tRGF0YVwiXTtcblx0XHR9XG5cdFx0cmV0dXJuIHZEYXRhO1xuXHR9LFxuXHRnZXRDb250ZXh0UGF0aDogZnVuY3Rpb24gKG9WYWx1ZTogdW5rbm93biwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogc3RyaW5nIHtcblx0XHRjb25zdCBzUGF0aCA9IG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0ICYmIG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIHNQYXRoW3NQYXRoLmxlbmd0aCAtIDFdID09PSBcIi9cIiA/IHNQYXRoLnNsaWNlKDAsIC0xKSA6IHNQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgIFByZXNlbnRhdGlvbiBWYXJpYW50IHNvcnQgY29uZGl0aW9ucy5cblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEBwYXJhbSBvQ29udGV4dC5nZXRQYXRoXG5cdCAqIEBwYXJhbSBvQ29udGV4dC5nZXRNb2RlbFxuXHQgKiBAcGFyYW0gb1ByZXNlbnRhdGlvblZhcmlhbnQgUHJlc2VudGF0aW9uIHZhcmlhbnQgQW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc1ByZXNlbnRhdGlvblZhcmlhbnRQYXRoXG5cdCAqIEByZXR1cm5zIFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0XG5cdCAqL1xuXHRnZXRTb3J0Q29uZGl0aW9uczogZnVuY3Rpb24gKFxuXHRcdG9Db250ZXh0OiB7IGdldFBhdGgobnVtOiBudW1iZXIpOiBzdHJpbmc7IGdldE1vZGVsKG51bTogbnVtYmVyKTogT0RhdGFNZXRhTW9kZWwgfSxcblx0XHRvUHJlc2VudGF0aW9uVmFyaWFudDogTWV0YU1vZGVsVHlwZTxQcmVzZW50YXRpb25WYXJpYW50Pixcblx0XHRzUHJlc2VudGF0aW9uVmFyaWFudFBhdGg6IHN0cmluZ1xuXHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmIChcblx0XHRcdG9QcmVzZW50YXRpb25WYXJpYW50ICYmXG5cdFx0XHRDb21tb25IZWxwZXIuX2lzUHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24oc1ByZXNlbnRhdGlvblZhcmlhbnRQYXRoKSAmJlxuXHRcdFx0b1ByZXNlbnRhdGlvblZhcmlhbnQuU29ydE9yZGVyXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBhU29ydENvbmRpdGlvbnM6IHsgc29ydGVyczogeyBuYW1lPzogc3RyaW5nOyBkZXNjZW5kaW5nPzogYm9vbGVhbiB9W10gfSA9IHtcblx0XHRcdFx0c29ydGVyczogW11cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgwKS5zcGxpdChcIkBcIilbMF07XG5cdFx0XHRvUHJlc2VudGF0aW9uVmFyaWFudC5Tb3J0T3JkZXIuZm9yRWFjaChmdW5jdGlvbiAob0NvbmRpdGlvbiA9IHt9KSB7XG5cdFx0XHRcdGxldCBvU29ydFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IG9Tb3J0ZXI6IHsgbmFtZT86IHN0cmluZzsgZGVzY2VuZGluZz86IGJvb2xlYW4gfSA9IHt9O1xuXHRcdFx0XHRpZiAob0NvbmRpdGlvbi5EeW5hbWljUHJvcGVydHkpIHtcblx0XHRcdFx0XHRvU29ydFByb3BlcnR5ID0gb0NvbnRleHQuZ2V0TW9kZWwoMCkuZ2V0T2JqZWN0KHNFbnRpdHlQYXRoICsgb0NvbmRpdGlvbi5EeW5hbWljUHJvcGVydHkuJEFubm90YXRpb25QYXRoKT8uTmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmIChvQ29uZGl0aW9uLlByb3BlcnR5KSB7XG5cdFx0XHRcdFx0b1NvcnRQcm9wZXJ0eSA9IG9Db25kaXRpb24uUHJvcGVydHkuJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1NvcnRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdG9Tb3J0ZXIubmFtZSA9IG9Tb3J0UHJvcGVydHk7XG5cdFx0XHRcdFx0b1NvcnRlci5kZXNjZW5kaW5nID0gISFvQ29uZGl0aW9uLkRlc2NlbmRpbmc7XG5cdFx0XHRcdFx0YVNvcnRDb25kaXRpb25zLnNvcnRlcnMucHVzaChvU29ydGVyKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgZGVmaW5lIHRoZSByaWdodCBwYXRoIHRvIHRoZSBzb3J0IHByb3BlcnR5XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShhU29ydENvbmRpdGlvbnMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXHRfaXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogZnVuY3Rpb24gKGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0YW5ub3RhdGlvblBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLlByZXNlbnRhdGlvblZhcmlhbnR9YCkgfHxcblx0XHRcdGFubm90YXRpb25QYXRoLmluY2x1ZGVzKGBAJHtVSUFubm90YXRpb25UZXJtcy5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50fWApXG5cdFx0KTtcblx0fSxcblx0Y3JlYXRlUHJlc2VudGF0aW9uUGF0aENvbnRleHQ6IGZ1bmN0aW9uIChvUHJlc2VudGF0aW9uQ29udGV4dDogQ29udGV4dCk6IENvbnRleHQge1xuXHRcdGNvbnN0IGFQYXRocyA9IG9QcmVzZW50YXRpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIkBcIikgfHwgW107XG5cdFx0Y29uc3Qgb01vZGVsID0gb1ByZXNlbnRhdGlvbkNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoYVBhdGhzLmxlbmd0aCAmJiBhUGF0aHNbYVBhdGhzLmxlbmd0aCAtIDFdLmluY2x1ZGVzKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFwiKSkge1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBvUHJlc2VudGF0aW9uQ29udGV4dC5nZXRQYXRoKCkuc3BsaXQoXCIvUHJlc2VudGF0aW9uVmFyaWFudFwiKVswXTtcblx0XHRcdHJldHVybiBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c1BhdGh9QHNhcHVpLm5hbWVgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtvUHJlc2VudGF0aW9uQ29udGV4dC5nZXRQYXRoKCl9QHNhcHVpLm5hbWVgKTtcblx0fSxcblx0Z2V0UHJlc3NIYW5kbGVyRm9yRGF0YUZpZWxkRm9ySUJOOiBmdW5jdGlvbiAoXG5cdFx0b0RhdGFGaWVsZDogRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdHNDb250ZXh0Pzogc3RyaW5nLFxuXHRcdGJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2c/OiBib29sZWFuLFxuXHRcdGZvckNvbnRleHRNZW51ID0gZmFsc2Vcblx0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIW9EYXRhRmllbGQpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbU5hdmlnYXRpb25QYXJhbWV0ZXJzOiB7XG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBzdHJpbmc7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IHN0cmluZztcblx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IHN0cmluZztcblx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZz86IHN0cmluZztcblx0XHR9ID0ge1xuXHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBzQ29udGV4dCA/IHNDb250ZXh0IDogXCIkeyRzb3VyY2U+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiXG5cdFx0fTtcblx0XHRpZiAob0RhdGFGaWVsZC5SZXF1aXJlc0NvbnRleHQgJiYgIW9EYXRhRmllbGQuSW5saW5lICYmIGJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2cpIHtcblx0XHRcdGNvbnN0IGFwcGxpY2FibGVQcm9wZXJ0eSA9ICFmb3JDb250ZXh0TWVudSA/IFwiYUFwcGxpY2FibGVcIiA6IFwiYUFwcGxpY2FibGVGb3JDb250ZXh0TWVudVwiO1xuXHRcdFx0Y29uc3Qgbm90QXBwbGljYWJsZVByb3BlcnR5ID0gIWZvckNvbnRleHRNZW51ID8gXCJhTm90QXBwbGljYWJsZVwiIDogXCJhTm90QXBwbGljYWJsZUZvckNvbnRleHRNZW51XCI7XG5cdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzID0gYFxcJHtpbnRlcm5hbD5pYm4vJHtvRGF0YUZpZWxkLlNlbWFudGljT2JqZWN0fS0ke29EYXRhRmllbGQuQWN0aW9ufS8ke2FwcGxpY2FibGVQcm9wZXJ0eX0vfWA7XG5cdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzID0gYFxcJHtpbnRlcm5hbD5pYm4vJHtvRGF0YUZpZWxkLlNlbWFudGljT2JqZWN0fS0ke29EYXRhRmllbGQuQWN0aW9ufS8ke25vdEFwcGxpY2FibGVQcm9wZXJ0eX0vfWA7XG5cdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubGFiZWwgPSB0aGlzLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkLkxhYmVsIGFzIHN0cmluZywgdHJ1ZSk7XG5cdFx0fVxuXHRcdGlmIChvRGF0YUZpZWxkLk1hcHBpbmcpIHtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmcgPSB0aGlzLmFkZFNpbmdsZVF1b3RlcyhKU09OLnN0cmluZ2lmeShvRGF0YUZpZWxkLk1hcHBpbmcpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdGJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2cgPyBcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZ1wiIDogXCIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZVwiLFxuXHRcdFx0dGhpcy5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZC5TZW1hbnRpY09iamVjdCBhcyB1bmtub3duIGFzIHN0cmluZyksXG5cdFx0XHR0aGlzLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkLkFjdGlvbiBhcyB1bmtub3duIGFzIHN0cmluZyksXG5cdFx0XHR0aGlzLm9iamVjdFRvU3RyaW5nKG1OYXZpZ2F0aW9uUGFyYW1ldGVycyksXG5cdFx0XHRcIiR7JHNvdXJjZT4vfVwiXG5cdFx0KTtcblx0fSxcblx0Z2V0RW50aXR5U2V0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKHNQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRvIHRoZSBjYWxjdWxhdGlvbiBvZiBjcml0aWNhbGl0eSBpbiBjYXNlIENyaXRpY2FsaXR5Q2FsY3VsYXRpb24gcHJlc2VudCBpbiB0aGUgYW5ub3RhdGlvblxuXHQgKlxuXHQgKiBUaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBieSBjb21wYXJpbmcgYSB2YWx1ZSB0byB0aGUgdGhyZXNob2xkIHZhbHVlcyByZWxldmFudCBmb3IgdGhlIHNwZWNpZmllZCBpbXByb3ZlbWVudCBkaXJlY3Rpb24uXG5cdCAqIEZvciBpbXByb3ZlbWVudCBkaXJlY3Rpb24gVGFyZ2V0LCB0aGUgY3JpdGljYWxpdHkgaXMgY2FsY3VsYXRlZCB1c2luZyBib3RoIGxvdyBhbmQgaGlnaCB0aHJlc2hvbGQgdmFsdWVzLiBJdCB3aWxsIGJlXG5cdCAqXG5cdCAqIC0gUG9zaXRpdmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSBhbmQgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBOZXV0cmFsIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSBhbmQgbG93ZXIgdGhhbiBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSBPUiBncmVhdGVyIHRoYW4gQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gQ3JpdGljYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlIGFuZCBsb3dlciB0aGFuIFRvbGVyYW5jZVJhbmdlTG93VmFsdWUgT1IgZ3JlYXRlciB0aGFuIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gTmVnYXRpdmUgaWYgdGhlIHZhbHVlIGlzIGxvd2VyIHRoYW4gRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSBvciBncmVhdGVyIHRoYW4gRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICpcblx0ICogRm9yIGltcHJvdmVtZW50IGRpcmVjdGlvbiBNaW5pbWl6ZSwgdGhlIGNyaXRpY2FsaXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGhpZ2ggdGhyZXNob2xkIHZhbHVlcy4gSXQgaXNcblx0ICogLSBQb3NpdGl2ZSBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBOZXV0cmFsIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gQ3JpdGljYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSBhbmQgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5lZ2F0aXZlIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICpcblx0ICogRm9yIGltcHJvdmVtZW50IGRpcmVjdGlvbiBNYXhpbWl6ZSwgdGhlIGNyaXRpY2FsaXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGxvdyB0aHJlc2hvbGQgdmFsdWVzLiBJdCBpc1xuXHQgKlxuXHQgKiAtIFBvc2l0aXZlIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQWNjZXB0YW5jZVJhbmdlTG93VmFsdWVcblx0ICogLSBOZXV0cmFsIGlmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlXG5cdCAqIC0gQ3JpdGljYWwgaWYgdGhlIHZhbHVlIGlzIGxvd2VyIHRoYW4gVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlTG93VmFsdWVcblx0ICogLSBOZWdhdGl2ZSBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlXG5cdCAqXG5cdCAqIFRocmVzaG9sZHMgYXJlIG9wdGlvbmFsLiBGb3IgdW5hc3NpZ25lZCB2YWx1ZXMsIGRlZmF1bHRzIGFyZSBkZXRlcm1pbmVkIGluIHRoaXMgb3JkZXI6XG5cdCAqXG5cdCAqIC0gRm9yIERldmlhdGlvblJhbmdlLCBhbiBvbWl0dGVkIExvd1ZhbHVlIHRyYW5zbGF0ZXMgaW50byB0aGUgc21hbGxlc3QgcG9zc2libGUgbnVtYmVyICgtSU5GKSwgYW4gb21pdHRlZCBIaWdoVmFsdWUgdHJhbnNsYXRlcyBpbnRvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG51bWJlciAoK0lORilcblx0ICogLSBGb3IgVG9sZXJhbmNlUmFuZ2UsIGFuIG9taXR0ZWQgTG93VmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIERldmlhdGlvblJhbmdlTG93VmFsdWUsIGFuIG9taXR0ZWQgSGlnaFZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIEZvciBBY2NlcHRhbmNlUmFuZ2UsIGFuIG9taXR0ZWQgTG93VmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIFRvbGVyYW5jZVJhbmdlTG93VmFsdWUsIGFuIG9taXR0ZWQgSGlnaFZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZS5cblx0ICogQHBhcmFtIHNJbXByb3ZlbWVudERpcmVjdGlvbiBJbXByb3ZlbWVudERpcmVjdGlvbiB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgY3JpdGljYWxpdHkgYmluZGluZ1xuXHQgKiBAcGFyYW0gc1ZhbHVlIFZhbHVlIGZyb20gRGF0YXBvaW50IHRvIGJlIG1lYXN1cmVkXG5cdCAqIEBwYXJhbSBzRGV2aWF0aW9uTG93IEV4cHJlc3Npb25CaW5kaW5nIGZvciBMb3dlciBEZXZpYXRpb24gbGV2ZWxcblx0ICogQHBhcmFtIHNUb2xlcmFuY2VMb3cgRXhwcmVzc2lvbkJpbmRpbmcgZm9yIExvd2VyIFRvbGVyYW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc0FjY2VwdGFuY2VMb3cgRXhwcmVzc2lvbkJpbmRpbmcgZm9yIExvd2VyIEFjY2VwdGFuY2UgbGV2ZWxcblx0ICogQHBhcmFtIHNBY2NlcHRhbmNlSGlnaCBFeHByZXNzaW9uQmluZGluZyBmb3IgSGlnaGVyIEFjY2VwdGFuY2UgbGV2ZWxcblx0ICogQHBhcmFtIHNUb2xlcmFuY2VIaWdoIEV4cHJlc3Npb25CaW5kaW5nIGZvciBIaWdoZXIgVG9sZXJhbmNlIGxldmVsXG5cdCAqIEBwYXJhbSBzRGV2aWF0aW9uSGlnaCBFeHByZXNzaW9uQmluZGluZyBmb3IgSGlnaGVyIERldmlhdGlvbiBsZXZlbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIGFzIGV4cHJlc3Npb24gYmluZGluZ1xuXHQgKi9cblx0Z2V0Q3JpdGljYWxpdHlDYWxjdWxhdGlvbkJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRzSW1wcm92ZW1lbnREaXJlY3Rpb246IHN0cmluZyxcblx0XHRzVmFsdWU6IHN0cmluZyxcblx0XHRzRGV2aWF0aW9uTG93OiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c1RvbGVyYW5jZUxvdzogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNBY2NlcHRhbmNlTG93OiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c0FjY2VwdGFuY2VIaWdoOiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c1RvbGVyYW5jZUhpZ2g6IHN0cmluZyB8IG51bWJlcixcblx0XHRzRGV2aWF0aW9uSGlnaDogc3RyaW5nIHwgbnVtYmVyXG5cdCk6IHN0cmluZyB7XG5cdFx0bGV0IHNDcml0aWNhbGl0eUV4cHJlc3Npb246IHR5cGVvZiBWYWx1ZUNvbG9yIHwgc3RyaW5nID0gVmFsdWVDb2xvci5OZXV0cmFsOyAvLyBEZWZhdWx0IENyaXRpY2FsaXR5IFN0YXRlXG5cblx0XHRzVmFsdWUgPSBgJSR7c1ZhbHVlfWA7XG5cblx0XHQvLyBTZXR0aW5nIFVuYXNzaWduZWQgVmFsdWVzXG5cdFx0c0RldmlhdGlvbkxvdyA9IHNEZXZpYXRpb25Mb3cgfHwgLUluZmluaXR5O1xuXHRcdHNUb2xlcmFuY2VMb3cgPSBzVG9sZXJhbmNlTG93IHx8IHNEZXZpYXRpb25Mb3c7XG5cdFx0c0FjY2VwdGFuY2VMb3cgPSBzQWNjZXB0YW5jZUxvdyB8fCBzVG9sZXJhbmNlTG93O1xuXHRcdHNEZXZpYXRpb25IaWdoID0gc0RldmlhdGlvbkhpZ2ggfHwgSW5maW5pdHk7XG5cdFx0c1RvbGVyYW5jZUhpZ2ggPSBzVG9sZXJhbmNlSGlnaCB8fCBzRGV2aWF0aW9uSGlnaDtcblx0XHRzQWNjZXB0YW5jZUhpZ2ggPSBzQWNjZXB0YW5jZUhpZ2ggfHwgc1RvbGVyYW5jZUhpZ2g7XG5cblx0XHQvLyBEZWFsaW5nIHdpdGggRGVjaW1hbCBhbmQgUGF0aCBiYXNlZCBiaW5nZGluZ3Ncblx0XHRzRGV2aWF0aW9uTG93ID0gc0RldmlhdGlvbkxvdyAmJiAoK3NEZXZpYXRpb25Mb3cgPyArc0RldmlhdGlvbkxvdyA6IGAlJHtzRGV2aWF0aW9uTG93fWApO1xuXHRcdHNUb2xlcmFuY2VMb3cgPSBzVG9sZXJhbmNlTG93ICYmICgrc1RvbGVyYW5jZUxvdyA/ICtzVG9sZXJhbmNlTG93IDogYCUke3NUb2xlcmFuY2VMb3d9YCk7XG5cdFx0c0FjY2VwdGFuY2VMb3cgPSBzQWNjZXB0YW5jZUxvdyAmJiAoK3NBY2NlcHRhbmNlTG93ID8gK3NBY2NlcHRhbmNlTG93IDogYCUke3NBY2NlcHRhbmNlTG93fWApO1xuXHRcdHNBY2NlcHRhbmNlSGlnaCA9IHNBY2NlcHRhbmNlSGlnaCAmJiAoK3NBY2NlcHRhbmNlSGlnaCA/ICtzQWNjZXB0YW5jZUhpZ2ggOiBgJSR7c0FjY2VwdGFuY2VIaWdofWApO1xuXHRcdHNUb2xlcmFuY2VIaWdoID0gc1RvbGVyYW5jZUhpZ2ggJiYgKCtzVG9sZXJhbmNlSGlnaCA/ICtzVG9sZXJhbmNlSGlnaCA6IGAlJHtzVG9sZXJhbmNlSGlnaH1gKTtcblx0XHRzRGV2aWF0aW9uSGlnaCA9IHNEZXZpYXRpb25IaWdoICYmICgrc0RldmlhdGlvbkhpZ2ggPyArc0RldmlhdGlvbkhpZ2ggOiBgJSR7c0RldmlhdGlvbkhpZ2h9YCk7XG5cblx0XHQvLyBDcmVhdGluZyBydW50aW1lIGV4cHJlc3Npb24gYmluZGluZyBmcm9tIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIGZvciBDcml0aWNhbGl0eSBTdGF0ZVxuXHRcdGlmIChzSW1wcm92ZW1lbnREaXJlY3Rpb24uaW5jbHVkZXMoXCJNaW5pbWl6ZVwiKSkge1xuXHRcdFx0c0NyaXRpY2FsaXR5RXhwcmVzc2lvbiA9XG5cdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Hb29kICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VIaWdoICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIikgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkNyaXRpY2FsICtcblx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5FcnJvciArXG5cdFx0XHRcdFwiJyB9XCI7XG5cdFx0fSBlbHNlIGlmIChzSW1wcm92ZW1lbnREaXJlY3Rpb24uaW5jbHVkZXMoXCJNYXhpbWl6ZVwiKSkge1xuXHRcdFx0c0NyaXRpY2FsaXR5RXhwcmVzc2lvbiA9XG5cdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+PSBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlTG93ICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkdvb2QgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUxvdyArXG5cdFx0XHRcdFwiID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5OZXV0cmFsICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRcIihcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkxvdyArXG5cdFx0XHRcdFwiKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuQ3JpdGljYWwgK1xuXHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkVycm9yICtcblx0XHRcdFx0XCInIH1cIjtcblx0XHR9IGVsc2UgaWYgKHNJbXByb3ZlbWVudERpcmVjdGlvbi5pbmNsdWRlcyhcIlRhcmdldFwiKSkge1xuXHRcdFx0c0NyaXRpY2FsaXR5RXhwcmVzc2lvbiA9XG5cdFx0XHRcdFwiez0gKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIikgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkdvb2QgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUxvdyArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPCBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlTG93ICtcblx0XHRcdFx0XCIpIHx8IChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID4gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUhpZ2ggK1xuXHRcdFx0XHRcIikpID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5OZXV0cmFsICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRcIigoXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIgJiYgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIpICYmIChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDwgXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIpKSB8fCAoKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPiBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VIaWdoICtcblx0XHRcdFx0XCIpICYmIFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIiAmJiAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25IaWdoICtcblx0XHRcdFx0XCIpKSkgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkNyaXRpY2FsICtcblx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5FcnJvciArXG5cdFx0XHRcdFwiJyB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy53YXJuaW5nKFwiQ2FzZSBub3Qgc3VwcG9ydGVkLCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgVmFsdWUgTmV1dHJhbFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc0NyaXRpY2FsaXR5RXhwcmVzc2lvbjtcblx0fSxcblx0LyoqXG5cdCAqIFRvIGZldGNoIG1lYXN1cmUgYXR0cmlidXRlIGluZGV4LlxuXHQgKiBAcGFyYW0gaU1lYXN1cmUgQ2hhcnQgQW5ub3RhdGlvbnNcblx0ICogQHBhcmFtIG9DaGFydEFubm90YXRpb25zIENoYXJ0IEFubm90YXRpb25zXG5cdCAqIEBwYXJhbSBpc01pY3JvQ2hhcnQgV2hldGhlciB0aGlzIGlzIGEgbWljcm8gY2hhcnRcblx0ICogQHJldHVybnMgTWVhc3VyZUF0dHJpYnV0ZSBpbmRleC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGVJbmRleDogZnVuY3Rpb24gKGlNZWFzdXJlOiBudW1iZXIsIG9DaGFydEFubm90YXRpb25zOiBNZXRhTW9kZWxUeXBlPENoYXJ0PiB8IENoYXJ0LCBpc01pY3JvQ2hhcnQ/OiBib29sZWFuKTogbnVtYmVyIHtcblx0XHRsZXQgYU1lYXN1cmVzLCBzTWVhc3VyZVByb3BlcnR5UGF0aDtcblx0XHRpZiAob0NoYXJ0QW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5sZW5ndGggJiYgb0NoYXJ0QW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhTWVhc3VyZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlcztcblx0XHRcdHNNZWFzdXJlUHJvcGVydHlQYXRoID0gaXNNaWNyb0NoYXJ0XG5cdFx0XHRcdD8gKGFNZWFzdXJlc1tpTWVhc3VyZV0gYXMgUHJvcGVydHlQYXRoKS52YWx1ZVxuXHRcdFx0XHQ6IChhTWVhc3VyZXNbaU1lYXN1cmVdIGFzIE1ldGFNb2RlbE1lYXN1cmUpLiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSBlbHNlIGlmIChvQ2hhcnRBbm5vdGF0aW9ucz8uRHluYW1pY01lYXN1cmVzPy5sZW5ndGggJiYgb0NoYXJ0QW5ub3RhdGlvbnM/LkR5bmFtaWNNZWFzdXJlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0YU1lYXN1cmVzID0gKG9DaGFydEFubm90YXRpb25zIGFzIE1ldGFNb2RlbFR5cGU8Q2hhcnQ+KS5EeW5hbWljTWVhc3VyZXM7XG5cdFx0XHRzTWVhc3VyZVByb3BlcnR5UGF0aCA9IGFNZWFzdXJlcz8uW2lNZWFzdXJlXS4kQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdGxldCBiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cztcblx0XHRjb25zdCBhTWVhc3VyZUF0dHJpYnV0ZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlQXR0cmlidXRlcztcblx0XHRsZXQgaU1lYXN1cmVBdHRyaWJ1dGUgPSAtMTtcblx0XHRjb25zdCBmbkNoZWNrTWVhc3VyZSA9IGZ1bmN0aW9uIChcblx0XHRcdHNNZWFzdXJlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0b01lYXN1cmVBdHRyaWJ1dGU6IE1ldGFNb2RlbFR5cGU8Q2hhcnRNZWFzdXJlQXR0cmlidXRlVHlwZT4gfCBDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlLFxuXHRcdFx0aW5kZXg6IG51bWJlclxuXHRcdCk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKG9NZWFzdXJlQXR0cmlidXRlKSB7XG5cdFx0XHRcdGNvbnN0IHBhdGggPSBpc01pY3JvQ2hhcnRcblx0XHRcdFx0XHQ/IChvTWVhc3VyZUF0dHJpYnV0ZSBhcyBDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlKS5NZWFzdXJlPy52YWx1ZVxuXHRcdFx0XHRcdDogKG9NZWFzdXJlQXR0cmlidXRlIGFzIE1ldGFNb2RlbFR5cGU8Q2hhcnRNZWFzdXJlQXR0cmlidXRlVHlwZT4pLk1lYXN1cmU/LiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChvTWVhc3VyZUF0dHJpYnV0ZS5NZWFzdXJlICYmIHBhdGggPT09IHNNZWFzdXJlUGF0aCkge1xuXHRcdFx0XHRcdGlNZWFzdXJlQXR0cmlidXRlID0gaW5kZXg7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0b01lYXN1cmVBdHRyaWJ1dGUuRHluYW1pY01lYXN1cmUgJiZcblx0XHRcdFx0XHQob01lYXN1cmVBdHRyaWJ1dGUgYXMgTWV0YU1vZGVsVHlwZTxDaGFydE1lYXN1cmVBdHRyaWJ1dGVUeXBlPik/LkR5bmFtaWNNZWFzdXJlPy4kQW5ub3RhdGlvblBhdGggPT09IHNNZWFzdXJlUGF0aFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IGluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblx0XHRpZiAoYU1lYXN1cmVBdHRyaWJ1dGVzKSB7XG5cdFx0XHRiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cyA9IGFNZWFzdXJlQXR0cmlidXRlcy5zb21lKGZuQ2hlY2tNZWFzdXJlLmJpbmQobnVsbCwgc01lYXN1cmVQcm9wZXJ0eVBhdGgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJNZWFzdXJlQXR0cmlidXRlRXhpc3RzICYmIGlNZWFzdXJlQXR0cmlidXRlID4gLTEgPyBpTWVhc3VyZUF0dHJpYnV0ZSA6IC0xO1xuXHR9LFxuXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGU6IGFzeW5jIGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRzQ2hhcnRBbm5vdGF0aW9uUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gb01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KHNDaGFydEFubm90YXRpb25QYXRoKS50aGVuKGZ1bmN0aW9uIChvQ2hhcnRBbm5vdGF0aW9uczogTWV0YU1vZGVsVHlwZTxDaGFydD4pIHtcblx0XHRcdGNvbnN0IGFNZWFzdXJlQXR0cmlidXRlcyA9IG9DaGFydEFubm90YXRpb25zLk1lYXN1cmVBdHRyaWJ1dGVzLFxuXHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoMCwgb0NoYXJ0QW5ub3RhdGlvbnMpO1xuXHRcdFx0Y29uc3Qgc01lYXN1cmVBdHRyaWJ1dGVQYXRoID1cblx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXM/LltpTWVhc3VyZUF0dHJpYnV0ZV0gJiYgYU1lYXN1cmVBdHRyaWJ1dGVzW2lNZWFzdXJlQXR0cmlidXRlXS5EYXRhUG9pbnRcblx0XHRcdFx0XHQ/IGAke3NDaGFydEFubm90YXRpb25QYXRofS9NZWFzdXJlQXR0cmlidXRlcy8ke2lNZWFzdXJlQXR0cmlidXRlfS9gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc01lYXN1cmVBdHRyaWJ1dGVQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJEYXRhUG9pbnQgbWlzc2luZyBmb3IgdGhlIG1lYXN1cmVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc01lYXN1cmVBdHRyaWJ1dGVQYXRoID8gYCR7c01lYXN1cmVBdHRyaWJ1dGVQYXRofURhdGFQb2ludC8kQW5ub3RhdGlvblBhdGgvYCA6IHNNZWFzdXJlQXR0cmlidXRlUGF0aDtcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBmb3IgdGhlIG1lYXN1cmUuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIHRoZSBtZWFzdXJlIGFubm90YXRpb25cblx0ICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBvZiB0aGUgbWVhc3VyZVxuXHQgKi9cblx0Z2V0TWVhc3VyZUF0dHJpYnV0ZUZvck1lYXN1cmU6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRzTWVhc3VyZVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRzQ2hhcnRBbm5vdGF0aW9uUGF0aCA9IHNNZWFzdXJlUGF0aC5zdWJzdHJpbmcoMCwgc01lYXN1cmVQYXRoLmxhc3RJbmRleE9mKFwiTWVhc3VyZVwiKSksXG5cdFx0XHRpTWVhc3VyZSA9IHNNZWFzdXJlUGF0aC5yZXBsYWNlKC8uKlxcLy8sIFwiXCIpO1xuXG5cdFx0Y29uc3Qgb0NoYXJ0QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQ2hhcnRBbm5vdGF0aW9uUGF0aCk7XG5cdFx0Y29uc3QgYU1lYXN1cmVBdHRyaWJ1dGVzID0gb0NoYXJ0QW5ub3RhdGlvbnMuTWVhc3VyZUF0dHJpYnV0ZXMsXG5cdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoaU1lYXN1cmUgYXMgdW5rbm93biBhcyBudW1iZXIsIG9DaGFydEFubm90YXRpb25zKTtcblx0XHRjb25zdCBzTWVhc3VyZUF0dHJpYnV0ZVBhdGggPVxuXHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXNbaU1lYXN1cmVBdHRyaWJ1dGVdICYmIGFNZWFzdXJlQXR0cmlidXRlc1tpTWVhc3VyZUF0dHJpYnV0ZV0uRGF0YVBvaW50XG5cdFx0XHRcdD8gYCR7c0NoYXJ0QW5ub3RhdGlvblBhdGh9TWVhc3VyZUF0dHJpYnV0ZXMvJHtpTWVhc3VyZUF0dHJpYnV0ZX0vYFxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRpZiAoc01lYXN1cmVBdHRyaWJ1dGVQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiRGF0YVBvaW50IG1pc3NpbmcgZm9yIHRoZSBtZWFzdXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gc01lYXN1cmVBdHRyaWJ1dGVQYXRoID8gYCR7c01lYXN1cmVBdHRyaWJ1dGVQYXRofURhdGFQb2ludC8kQW5ub3RhdGlvblBhdGgvYCA6IHNNZWFzdXJlQXR0cmlidXRlUGF0aDtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbnRhaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnR5IGhhcyBhIGRyYWZ0IHJvb3Qvbm9kZSBwYXJlbnQgZW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gb1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCBUYXJnZXQgY29sbGVjdGlvbiBoYXMgQ29udGFpbnNUYXJnZXQgcHJvcGVydHlcblx0ICogQHBhcmFtIG9UYWJsZU1ldGFkYXRhIFRhYmxlIG1ldGFkYXRhIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldFxuXHQgKiBAcGFyYW0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0Lm9Nb2RlbFxuXHQgKiBAcGFyYW0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0LnNQYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdFxuXHQgKi9cblx0aXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50OiBmdW5jdGlvbiAoXG5cdFx0b1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldDogb2JqZWN0LFxuXHRcdG9UYWJsZU1ldGFkYXRhOiB7XG5cdFx0XHRwYXJlbnRFbnRpdHlTZXQ/OiB7XG5cdFx0XHRcdG9Nb2RlbDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdHNQYXRoPzogc3RyaW5nO1xuXHRcdFx0fTtcblx0XHR9XG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChvVGFyZ2V0Q29sbGVjdGlvbkNvbnRhaW5zVGFyZ2V0KSB7XG5cdFx0XHRpZiAob1RhYmxlTWV0YWRhdGEgJiYgb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0ICYmIG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5zUGF0aCkge1xuXHRcdFx0XHRjb25zdCBzUGFyZW50RW50aXR5U2V0UGF0aCA9IG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5zUGF0aDtcblx0XHRcdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5vTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdGAke3NQYXJlbnRFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBvRHJhZnROb2RlID0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0Lm9Nb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0YCR7c1BhcmVudEVudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBFbnN1cmVzIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhcyBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICogU2luY2UgdGhlIHByb3BlcnR5IERhdGEgaXMgb2YgdGhlIHR5cGUgJ29iamVjdCcsIGl0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHRlbXBsYXRlLlxuXHQgKiBAcGFyYW0gZGF0YUVsZW1lbnQgVGhlIGRhdGEgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBwYXRoIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUuXG5cdCAqL1xuXHRnZXREYXRhRnJvbVRlbXBsYXRlOiBmdW5jdGlvbiAoZGF0YUVsZW1lbnQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNwbGl0UGF0aCA9IGRhdGFFbGVtZW50LmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3QgY29ubmVjdGVkRGF0YVBhdGggPSBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vQGA7XG5cdFx0Y29uc3QgY29ubmVjdGVkT2JqZWN0ID0gZGF0YUVsZW1lbnQuZ2V0T2JqZWN0KGNvbm5lY3RlZERhdGFQYXRoKTtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IGNvbm5lY3RlZE9iamVjdC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5ID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFRlbXAubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBzcGxpdFRlbXBbaV0uc3BsaXQoXCJ7XCIpWzFdLnRyaW0oKTtcblx0XHRcdHRlbXBBcnJheS5wdXNoKGtleSk7XG5cdFx0fVxuXHRcdE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdGlmIChzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpKSB7XG5cdFx0XHRcdGRlbGV0ZSBjb25uZWN0ZWRPYmplY3QuRGF0YVtzS2V5XTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRjb25zdCBpbmRleCA9IE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5pbmRleE9mKGRhdGFLZXkpO1xuXHRcdHJldHVybiBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vRGF0YS8ke3RlbXBBcnJheVtpbmRleF19YDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBlbmQgb2YgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHJlYWNoZWQuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgY29ubmVjdGVkIGZpZWxkcy5cblx0ICogQHBhcmFtIHRhcmdldC5UZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGFyZ2V0LkRhdGFcblx0ICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBUcnVlIG9yIEZhbHNlIChkZXBlbmRpbmcgb24gdGhlIHRlbXBsYXRlIGluZGV4KS5cblx0ICovXG5cdG5vdExhc3RJbmRleDogZnVuY3Rpb24gKHRhcmdldDogeyBUZW1wbGF0ZTogc3RyaW5nOyBEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBlbGVtZW50OiBvYmplY3QpOiBib29sZWFuIHtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRhcmdldC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBpc0xhc3RJbmRleCA9IGZhbHNlO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRUZW1wLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0VGVtcFtpXS5zcGxpdChcIntcIilbMV0udHJpbSgpO1xuXHRcdFx0dGVtcEFycmF5LnB1c2goZGF0YUtleSk7XG5cdFx0fVxuXG5cdFx0dGVtcEFycmF5LmZvckVhY2goZnVuY3Rpb24gKHRlbXBsYXRlSW5mbzogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSB0ZW1wQXJyYXkubGVuZ3RoIC0gMTtcblx0XHRcdGlmICh0YXJnZXQuRGF0YVt0ZW1wbGF0ZUluZm9dID09PSBlbGVtZW50ICYmIHRlbXBBcnJheS5pbmRleE9mKHRlbXBsYXRlSW5mbykgPCBsYXN0SW5kZXgpIHtcblx0XHRcdFx0aXNMYXN0SW5kZXggPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBpc0xhc3RJbmRleDtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUgZGVsaW1pdGVyIGZyb20gdGhlIHRlbXBsYXRlLlxuXHQgKiBAcGFyYW0gdGVtcGxhdGUgVGhlIHRlbXBsYXRlIHN0cmluZy5cblx0ICogQHJldHVybnMgVGhlIGRlbGltaXRlciBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nLlxuXHQgKi9cblx0Z2V0RGVsaW1pdGVyOiBmdW5jdGlvbiAodGVtcGxhdGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRlbXBsYXRlLnNwbGl0KFwifVwiKVsxXS5zcGxpdChcIntcIilbMF0udHJpbSgpO1xuXHR9LFxuXG5cdG9NZXRhTW9kZWw6IHVuZGVmaW5lZCBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZCxcblx0c2V0TWV0YU1vZGVsOiBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiB2b2lkIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9LFxuXG5cdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKCk6IE9EYXRhTWV0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YU1vZGVsITtcblx0fSxcblxuXHRnZXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgbWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKG1ldGFNb2RlbCkge1xuXHRcdFx0Y29uc3Qgb1BhcmFtZXRlckluZm8gPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJJbmZvKG1ldGFNb2RlbCwgc1BhdGgpO1xuXHRcdFx0aWYgKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gY2FsbGluZyBhbiBhY3Rpb24gaGFuZGxlciB2aWEgdGhlIEZQTSBoZWxwZXIncyBhY3Rpb25XcmFwcGVyIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAnRlBNLmFjdGlvbldyYXBwZXIoKScgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBvQWN0aW9uIEFjdGlvbiBtZXRhZGF0YVxuXHQgKiBAcGFyYW0gb0FjdGlvbi5oYW5kbGVyTW9kdWxlIE1vZHVsZSBjb250YWluaW5nIHRoZSBhY3Rpb24gaGFuZGxlciBtZXRob2Rcblx0ICogQHBhcmFtIG9BY3Rpb24uaGFuZGxlck1ldGhvZCBBY3Rpb24gaGFuZGxlciBtZXRob2QgbmFtZVxuXHQgKiBAcGFyYW0gW29UaGlzXSBgdGhpc2AgKGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIG1hY3JvKVxuXHQgKiBAcGFyYW0gb1RoaXMuaWQgVGhlIHRhYmxlJ3MgSURcblx0ICogQHBhcmFtIGZvckNvbnRleHRNZW51IEluZGljYXRlcyBpZiB0aGUgYWN0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbnRleHQgbWVudS4gSWYgZmFsc2UsIHRoZSBhY3Rpb24gYXBwZWFycyBpbiB0aGUgdGFibGUgdG9vbGJhclxuXHQgKiBAcmV0dXJucyBUaGUgYWN0aW9uIHdyYXBwZXIgYmluZGluZ1x0ZXhwcmVzc2lvblxuXHQgKi9cblx0YnVpbGRBY3Rpb25XcmFwcGVyOiBmdW5jdGlvbiAoXG5cdFx0b0FjdGlvbjogQ3VzdG9tQWN0aW9uLFxuXHRcdG9UaGlzOiB7IGlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG5cdFx0Zm9yQ29udGV4dE1lbnUgPSBmYWxzZVxuXHQpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdFx0Y29uc3QgYVBhcmFtczogdW5rbm93bltdID0gW3JlZihcIiRldmVudFwiKSwgb0FjdGlvbi5oYW5kbGVyTW9kdWxlLCBvQWN0aW9uLmhhbmRsZXJNZXRob2RdO1xuXG5cdFx0aWYgKG9UaGlzICYmIG9UaGlzLmlkKSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsUGF0aCA9ICFmb3JDb250ZXh0TWVudSA/IFwiJHtpbnRlcm5hbD5zZWxlY3RlZENvbnRleHRzfVwiIDogXCIke2ludGVybmFsPmNvbnRleHRtZW51L3NlbGVjdGVkQ29udGV4dHN9XCI7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFBhcmFtcyA9IHsgY29udGV4dHM6IHJlZihpbnRlcm5hbE1vZGVsUGF0aCkgfTtcblx0XHRcdGFQYXJhbXMucHVzaChvQWRkaXRpb25hbFBhcmFtcyk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmbihcIkZQTS5hY3Rpb25XcmFwcGVyXCIsIGFQYXJhbXMpKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIHdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIGRlcGVuZGluZyBvbiB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdCAqIEl0IGlzIGludmVydGVkIGFzIHRoZSBVSSBlbGVtZW50cyBoYXZlIGEgdmlzaWJsZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGlkZGVuIG9uZS5cblx0ICogQHBhcmFtIGRhdGFGaWVsZEFubm90YXRpb25zIFRoZSBkYXRhRmllbGQgb2JqZWN0XG5cdCAqIEByZXR1cm5zIEEgcGF0aCBvciBhIEJvb2xlYW5cblx0ICovXG5cdGdldEhpZGRlblBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiAoZGF0YUZpZWxkQW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgJFBhdGg/OiBzdHJpbmcgfT4pOiBzdHJpbmcgfCBib29sZWFuIHtcblx0XHRpZiAoZGF0YUZpZWxkQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBoaWRkZW4gPSBkYXRhRmllbGRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGhpZGRlbiA9PT0gXCJvYmplY3RcIiA/IFwiez0gISR7XCIgKyBoaWRkZW4uJFBhdGggKyBcIn0gfVwiIDogIWhpZGRlbjtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBmZXRjaCB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIGZpbHRlciByZXN0cmljdGlvbnMgdGhhdCBjYW4gYmUgYW5ub3RhdGVkIG9uIGFuIGVudGl0eSBzZXQgb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHQgKiBXZSByZXR1cm4gdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVzdHJpY3Rpb24gYW5kIGFsc28gY2hlY2sgZm9yIHRoZSBvcGVyYXRvcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZW0uXG5cdCAqIEBwYXJhbSBzUHJvcGVydHkgU3RyaW5nIG5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0UGF0aCBTdHJpbmcgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB1c2VkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdCAqIEBwYXJhbSBzVHlwZSBTdHJpbmcgZGF0YSB0eXBlIG9kIHRoZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgZWRtLkRhdGVcblx0ICogQHBhcmFtIGJVc2VTZW1hbnRpY0RhdGVSYW5nZSBCb29sZWFuIHBhc3NlZCBmcm9tIHRoZSBtYW5pZmVzdCBmb3Igc2VtYW50aWMgZGF0ZSByYW5nZVxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgU3RyaW5naWZpZWQgb2JqZWN0IG9mIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBvciBwcm9wZXJ0eSBzZXR0aW5ncyBhcyBhIHdob2xlXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG9wZXJhdG9ycyBmb3IgZmlsdGVyaW5nXG5cdCAqL1xuXHRnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKFxuXHRcdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHNFbnRpdHlTZXRQYXRoOiBzdHJpbmcsXG5cdFx0b0NvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNUeXBlPzogc3RyaW5nLFxuXHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4gfCBzdHJpbmcsXG5cdFx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncyB8IHN0cmluZ1xuXHQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb0NvbnRleHQpO1xuXHRcdGNvbnN0IGFFcXVhbHNPcHMgPSBbXCJFUVwiXTtcblx0XHRjb25zdCBhU2luZ2xlUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdFx0Y29uc3QgYVNpbmdsZVJhbmdlRFRCYXNpY09wcyA9IFtcIkVRXCIsIFwiQlRcIl07XG5cdFx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdFx0Y29uc3QgYVNlYXJjaEV4cHJlc3Npb25PcHMgPSBbXCJDb250YWluc1wiLCBcIk5vdENvbnRhaW5zXCIsIFwiU3RhcnRzV2l0aFwiLCBcIk5vdFN0YXJ0c1dpdGhcIiwgXCJFbmRzV2l0aFwiLCBcIk5vdEVuZHNXaXRoXCJdO1xuXHRcdGNvbnN0IGFCYXNpY1NlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRCYXNpY1NlbWFudGljRGF0ZU9wZXJhdGlvbnMoKTtcblx0XHRjb25zdCBiU2VtYW50aWNEYXRlUmFuZ2UgPSBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgPT09IFwidHJ1ZVwiIHx8IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gdHJ1ZTtcblx0XHRsZXQgYVNlbWFudGljRGF0ZU9wczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBvU2V0dGluZ3MgPSBzZXR0aW5ncyAmJiB0eXBlb2Ygc2V0dGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNldHRpbmdzKS5jdXN0b21EYXRhIDogc2V0dGluZ3M7XG5cblx0XHQvLyBJbml0aWFsaXplIEVtcHR5L05vdEVtcHR5IG9wZXJhdG9ycyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCBtYW5pZmVzdCBzZXR0aW5nc1xuXHRcdGNvbnN0IGVtcHR5T3BzID0gX2dldEVtcHR5T3BzKHNUeXBlIHx8IFwiXCIsIG9TZXR0aW5ncyk7XG5cblx0XHRpZiAoKG9Db250ZXh0LmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCkgYXMgdW5rbm93bikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBhRXF1YWxzT3BzO1xuXHRcdH1cblxuXHRcdGlmIChvU2V0dGluZ3MgJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbiAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0RmlsdGVyT3BlcmF0aW9ucyhvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLCBzVHlwZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBEZWZhdWx0U2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMoc1R5cGUpO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGRlZmF1bHQgT3BlcmF0b3JzIGZvciB0aGlzIFByb3BlcnR5IFR5cGVcblx0XHRjb25zdCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHNUeXBlKTtcblx0XHRsZXQgc3VwcG9ydGVkT3BlcmF0b3JzID0gYURlZmF1bHRPcGVyYXRvcnM7XG5cdFx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdFx0Y29uc3QgZXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnMgPSBFeHRlbmRlZFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zKCk7XG5cdFx0XHRzdXBwb3J0ZWRPcGVyYXRvcnMgPSBbLi4uYUJhc2ljU2VtYW50aWNEYXRlT3BzLCAuLi5hRGVmYXVsdE9wZXJhdG9ycywgLi4uZXh0ZW5kZWRTZW1hbnRpY0RhdGVPcGVyYXRvcnNdO1xuXHRcdH1cblxuXHRcdGxldCByZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBJcyB0aGVyZSBhIEZpbHRlciBSZXN0cmljdGlvbiBkZWZpbmVkIGZvciB0aGlzIHByb3BlcnR5P1xuXHRcdGlmIChcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMgJiZcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zICYmXG5cdFx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldXG5cdFx0KSB7XG5cdFx0XHQvLyBFeHRlbmRpbmcgdGhlIGRlZmF1bHQgb3BlcmF0b3JzIGxpc3Qgd2l0aCBTZW1hbnRpYyBEYXRlIG9wdGlvbnMgREFURVJBTkdFLCBEQVRFLCBGUk9NIGFuZCBUT1xuXHRcdFx0Y29uc3Qgc0FsbG93ZWRFeHByZXNzaW9uID0gQ29tbW9uVXRpbHMuZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKTtcblx0XHRcdC8vIEluIGNhc2UgbW9yZSB0aGFuIG9uZSBBbGxvd2VkIEV4cHJlc3Npb25zIGhhcyBiZWVuIGRlZmluZWQgZm9yIGEgcHJvcGVydHlcblx0XHRcdC8vIGNob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBBbGxvd2VkIEV4cHJlc3Npb25cblxuXHRcdFx0Ly8gTXVsdGlWYWx1ZSBoYXMgc2FtZSBPcGVyYXRvciBhcyBTaW5nbGVWYWx1ZSwgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIChtYXhDb25kaXRpb25zKVxuXHRcdFx0c3dpdGNoIChzQWxsb3dlZEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRcdFx0Y29uc3Qgc2luZ2xlVmFsdWVEYXRlT3BzID0gRGVmYXVsdFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTaW5nbGVWYWx1ZURhdGVPcGVyYXRpb25zKCk7XG5cdFx0XHRcdFx0bGV0IGFTaW5nbGVWYWx1ZU9wczogc3RyaW5nW107XG5cdFx0XHRcdFx0aWYgKHNUeXBlID09PSBcIkVkbS5EYXRlXCIgJiYgYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRcdFx0XHRhU2luZ2xlVmFsdWVPcHMgPSBbLi4uc2luZ2xlVmFsdWVEYXRlT3BzLCAuLi5lbXB0eU9wc107XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVwiIHx8IHNUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0XHRhU2luZ2xlVmFsdWVPcHMgPSBbLi4uYUVxdWFsc09wcywgLi4uZW1wdHlPcHNdOyAvLyBbXCJFUVwiLCBcIkVtcHR5XCIsIFwiTm90RW1wdHlcIl1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YVNpbmdsZVZhbHVlT3BzID0gYUVxdWFsc09wczsgLy8gW1wiRVFcIl1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhzdXBwb3J0ZWRPcGVyYXRvcnMsIGFTaW5nbGVWYWx1ZU9wcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJNdWx0aVZhbHVlXCI6XG5cdFx0XHRcdFx0Y29uc3QgbXVsdGlWYWx1ZU9wZXJhdG9ycyA9IFsuLi5hRXF1YWxzT3BzLCBcIkVtcHR5XCIsIFwiTm90RW1wdHlcIl07XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhzdXBwb3J0ZWRPcGVyYXRvcnMsIG11bHRpVmFsdWVPcGVyYXRvcnMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRcdFx0XHRsZXQgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdO1xuXHRcdFx0XHRcdGlmIChiU2VtYW50aWNEYXRlUmFuZ2UgJiYgKHNUeXBlID09PSBcIkVkbS5EYXRlXCIgfHwgc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpKSB7XG5cdFx0XHRcdFx0XHQvLyBPbmx5IEVkbS5EYXRlIGFuZCBFZG0uRGF0ZVRpbWVPZmZzZXQgZ2V0IHNlbWFudGljIG9wZXJhdG9yc1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBbLi4uYVNlbWFudGljRGF0ZU9wcywgLi4uZW1wdHlPcHNdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gWy4uLmFTaW5nbGVSYW5nZURUQmFzaWNPcHMsIC4uLmVtcHR5T3BzXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNUeXBlID09PSBcIkVkbS5EYXRlXCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gWy4uLmFTaW5nbGVSYW5nZU9wcywgLi4uZW1wdHlPcHNdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhzdXBwb3J0ZWRPcGVyYXRvcnMsIGFFeHByZXNzaW9uT3BzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIk11bHRpUmFuZ2VcIjpcblx0XHRcdFx0XHRjb25zdCBtdWx0aVJhbmdlT3BzID1cblx0XHRcdFx0XHRcdHNUeXBlID09PSBcIkVkbS5EYXRlXCIgfHwgc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIgPyBbLi4uYU11bHRpUmFuZ2VPcHMsIC4uLmVtcHR5T3BzXSA6IGFNdWx0aVJhbmdlT3BzO1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoc3VwcG9ydGVkT3BlcmF0b3JzLCBtdWx0aVJhbmdlT3BzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKHN1cHBvcnRlZE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoc3VwcG9ydGVkT3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcy5jb25jYXQoYU11bHRpUmFuZ2VPcHMpKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCByZWNvZ25pc2VkLCB1bmRlZmluZWQgaW4gcmV0dXJuIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgc2V0IG9mXG5cdFx0XHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlLlxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdHJpY3Rpb25zO1xuXHR9LFxuXHRnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChwcm9wZXJ0eVR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcHJvdmlkZWQgZm9yIHR5cGUgRWRtLkRhdGUgdGhlbiBhbGwgdGhlIGRlZmF1bHRcblx0XHQvLyBvcGVyYXRvcnMgZm9yIHRoZSB0eXBlIHNob3VsZCBiZSByZXR1cm5lZCBleGNsdWRpbmcgc2VtYW50aWMgb3BlcmF0b3JzIGZyb20gdGhlIGxpc3QuXG5cdFx0Y29uc3QgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhwcm9wZXJ0eVR5cGUpO1xuXHRcdGNvbnN0IGFNdWx0aVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTkVcIiwgXCJOT1RCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCIsIFwiRW1wdHlcIiwgXCJOb3RFbXB0eVwiXTtcblx0XHRyZXR1cm4gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYU11bHRpUmFuZ2VPcHMpO1xuXHR9LFxuXHRnZXRBSUljb246IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhaUljb247XG5cdH1cbn07XG4oQ29tbW9uSGVscGVyLmdldFNvcnRDb25kaXRpb25zIGFzIHsgcmVxdWlyZXNJQ29udGV4dD86IGJvb2xlYW4gfSkucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1vbkhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0NBLFNBQVNBLGdCQUFnQkEsQ0FBQ0MsV0FBcUIsRUFBRUMsY0FBd0IsRUFBWTtJQUNwRjtJQUNBO0lBQ0EsT0FBT0QsV0FBVyxDQUFDRSxNQUFNLENBQUMsVUFBVUMsUUFBUSxFQUFFO01BQzdDLE9BQU9GLGNBQWMsQ0FBQ0csUUFBUSxDQUFDRCxRQUFRLENBQUM7SUFDekMsQ0FBQyxDQUFDO0VBQ0g7RUFFQSxTQUFTRSxvQkFBb0JBLENBQUNDLGFBQXNCLEVB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QkFBc0IsRUFBRSxHQUFHUyxRQUFRLENBQUM7WUFDMUQsQ0FBQyxNQUFNLElBQUlwUyxLQUFLLEtBQUssVUFBVSxFQUFFO2NBQ2hDdkIsY0FBYyxHQUFHLENBQUMsR0FBR2lULGVBQWUsRUFBRSxHQUFHVSxRQUFRLENBQUM7WUFDbkQsQ0FBQyxNQUFNO2NBQ04zVCxjQUFjLEdBQUdpVCxlQUFlO1lBQ2pDO1lBQ0FrQixZQUFZLEdBQUdyVSxnQkFBZ0IsQ0FBQ2tVLGtCQUFrQixFQUFFaFUsY0FBYyxDQUFDO1lBQ25FO1VBQ0QsS0FBSyxZQUFZO1lBQ2hCLE1BQU0yVSxhQUFhLEdBQ2xCcFQsS0FBSyxLQUFLLFVBQVUsSUFBSUEsS0FBSyxLQUFLLG9CQUFvQixHQUFHLENBQUMsR0FBRzRSLGNBQWMsRUFBRSxHQUFHUSxRQUFRLENBQUMsR0FBR1IsY0FBYztZQUMzR2dCLFlBQVksR0FBR3JVLGdCQUFnQixDQUFDa1Usa0JBQWtCLEVBQUVXLGFBQWEsQ0FBQztZQUNsRTtVQUNELEtBQUssa0JBQWtCO1lBQ3RCUixZQUFZLEdBQUdyVSxnQkFBZ0IsQ0FBQ2tVLGtCQUFrQixFQUFFWixvQkFBb0IsQ0FBQztZQUN6RTtVQUNELEtBQUssOEJBQThCO1lBQ2xDZSxZQUFZLEdBQUdyVSxnQkFBZ0IsQ0FBQ2tVLGtCQUFrQixFQUFFWixvQkFBb0IsQ0FBQ3dCLE1BQU0sQ0FBQ3pCLGNBQWMsQ0FBQyxDQUFDO1lBQ2hHO1VBQ0Q7WUFDQztRQUNGO1FBQ0E7UUFDQTtNQUNEO01BQ0EsT0FBT2dCLFlBQVk7SUFDcEIsQ0FBQztJQUNEVSwyQkFBMkIsRUFBRSxTQUFBQSxDQUFVQyxZQUFvQixFQUFZO01BQ3RFO01BQ0E7TUFDQSxNQUFNZixpQkFBaUIsR0FBRzNULG9CQUFvQixDQUFDMFUsWUFBWSxDQUFDO01BQzVELE1BQU0zQixjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO01BQ25JLE9BQU9yVCxnQkFBZ0IsQ0FBQ2lVLGlCQUFpQixFQUFFWixjQUFjLENBQUM7SUFDM0QsQ0FBQztJQUNENEIsU0FBUyxFQUFFLFNBQUFBLENBQUEsRUFBb0I7TUFDOUIsT0FBT0MsTUFBTTtJQUNkO0VBQ0QsQ0FBQztFQUNBbFQsWUFBWSxDQUFDd0ksaUJBQWlCLENBQW9DMkssZ0JBQWdCLEdBQUcsSUFBSTtFQUFDLE9BRTVFblQsWUFBWTtBQUFBIiwiaWdub3JlTGlzdCI6W119