@openui5/sap.ui.integration 1.96.2 → 1.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/.reuse/dep5 +26 -31
  2. package/THIRDPARTY.txt +15 -21
  3. package/package.json +3 -3
  4. package/src/sap/ui/integration/.library +16 -22
  5. package/src/sap/ui/integration/ActionDefinition.js +2 -2
  6. package/src/sap/ui/integration/Designtime.js +2 -2
  7. package/src/sap/ui/integration/Extension.js +2 -2
  8. package/src/sap/ui/integration/Host.js +38 -2
  9. package/src/sap/ui/integration/bindingFeatures/DateRange.js +1 -1
  10. package/src/sap/ui/integration/cards/AdaptiveContent.js +16 -50
  11. package/src/sap/ui/integration/cards/AnalyticalContent.js +8 -9
  12. package/src/sap/ui/integration/cards/AnalyticalContentRenderer.js +1 -1
  13. package/src/sap/ui/integration/cards/AnalyticsCloudContent.js +5 -3
  14. package/src/sap/ui/integration/cards/AnalyticsCloudContentRenderer.js +1 -1
  15. package/src/sap/ui/integration/cards/BaseContent.js +56 -6
  16. package/src/sap/ui/integration/cards/BaseContentRenderer.js +2 -2
  17. package/src/sap/ui/integration/cards/BaseListContent.js +39 -69
  18. package/src/sap/ui/integration/cards/CalendarContent.js +16 -12
  19. package/src/sap/ui/integration/cards/CalendarContentRenderer.js +2 -1
  20. package/src/sap/ui/integration/cards/ComponentContent.js +3 -2
  21. package/src/sap/ui/integration/cards/ComponentContentRenderer.js +1 -1
  22. package/src/sap/ui/integration/cards/Footer.js +2 -2
  23. package/src/sap/ui/integration/cards/Header.js +3 -3
  24. package/src/sap/ui/integration/cards/ListContent.js +67 -23
  25. package/src/sap/ui/integration/cards/ListContentRenderer.js +1 -1
  26. package/src/sap/ui/integration/cards/NumericHeader.js +3 -3
  27. package/src/sap/ui/integration/cards/ObjectContent.js +353 -228
  28. package/src/sap/ui/integration/cards/ObjectContentRenderer.js +28 -0
  29. package/src/sap/ui/integration/cards/TableContent.js +6 -10
  30. package/src/sap/ui/integration/cards/TableContentRenderer.js +1 -1
  31. package/src/sap/ui/integration/cards/TimelineContent.js +10 -14
  32. package/src/sap/ui/integration/cards/TimelineContentRenderer.js +1 -1
  33. package/src/sap/ui/integration/cards/WebPageContent.js +6 -2
  34. package/src/sap/ui/integration/cards/WebPageContentRenderer.js +1 -1
  35. package/src/sap/ui/integration/cards/actions/BaseAction.js +89 -0
  36. package/src/sap/ui/integration/cards/actions/CardActions.js +472 -0
  37. package/src/sap/ui/integration/cards/actions/CustomAction.js +31 -0
  38. package/src/sap/ui/integration/cards/actions/DateChangeAction.js +20 -0
  39. package/src/sap/ui/integration/cards/actions/MonthChangeAction.js +20 -0
  40. package/src/sap/ui/integration/cards/actions/NavigationAction.js +63 -0
  41. package/src/sap/ui/integration/cards/actions/SubmitAction.js +89 -0
  42. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputChoiceSet.js +10 -10
  43. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputDate.js +3 -3
  44. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputNumber.js +7 -12
  45. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputText.js +2 -2
  46. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputTime.js +2 -2
  47. package/src/sap/ui/integration/cards/adaptivecards/elements/UI5InputToggle.js +3 -3
  48. package/src/sap/ui/integration/cards/adaptivecards/elements/hostConfig.js +1 -1
  49. package/src/sap/ui/integration/cards/adaptivecards/overwrites/ActionRender.js +1 -1
  50. package/src/sap/ui/integration/cards/filters/BaseFilter.js +2 -2
  51. package/src/sap/ui/integration/cards/filters/DateRangeFilter.js +63 -58
  52. package/src/sap/ui/integration/cards/filters/FilterBar.js +91 -0
  53. package/src/sap/ui/integration/cards/filters/FilterBarFactory.js +34 -13
  54. package/src/sap/ui/integration/cards/filters/SearchFilter.js +95 -0
  55. package/src/sap/ui/integration/cards/filters/SelectFilter.js +34 -4
  56. package/src/sap/ui/integration/controls/ActionsStrip.js +3 -3
  57. package/src/sap/ui/integration/controls/ActionsToolbar.js +4 -5
  58. package/src/sap/ui/integration/controls/ActionsToolbarRenderer.js +1 -1
  59. package/src/sap/ui/integration/controls/ListContentItem.js +2 -2
  60. package/src/sap/ui/integration/controls/ListContentItemRenderer.js +1 -1
  61. package/src/sap/ui/integration/controls/Microchart.js +2 -2
  62. package/src/sap/ui/integration/controls/MicrochartLegend.js +2 -2
  63. package/src/sap/ui/integration/controls/MicrochartLegendRenderer.js +1 -1
  64. package/src/sap/ui/integration/customElements/CustomElementBase.js +1 -1
  65. package/src/sap/ui/integration/customElements/CustomElementCard.js +1 -1
  66. package/src/sap/ui/integration/customElements/CustomElementCardEditor.js +1 -1
  67. package/src/sap/ui/integration/customElements/CustomElementEditor.js +1 -1
  68. package/src/sap/ui/integration/designtime/baseEditor/BaseEditor.js +2 -2
  69. package/src/sap/ui/integration/designtime/baseEditor/PropertyEditor.js +2 -2
  70. package/src/sap/ui/integration/designtime/baseEditor/PropertyEditors.js +2 -2
  71. package/src/sap/ui/integration/designtime/baseEditor/i18n/i18n_en_US_sappsd.properties +15 -11
  72. package/src/sap/ui/integration/designtime/baseEditor/i18n/i18n_en_US_saprigi.properties +13 -19
  73. package/src/sap/ui/integration/designtime/baseEditor/i18n/i18n_en_US_saptrc.properties +16 -12
  74. package/src/sap/ui/integration/designtime/baseEditor/layout/Form.js +1 -1
  75. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/BasePropertyEditor.js +2 -2
  76. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/PropertyEditorFactory.js +2 -2
  77. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor.js +2 -2
  78. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/booleanEditor/BooleanEditor.js +2 -2
  79. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/dateEditor/DateEditor.js +2 -2
  80. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/dateTimeEditor/DateTimeEditor.js +2 -2
  81. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/enumStringEditor/EnumStringEditor.js +2 -2
  82. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/groupEditor/GroupEditor.js +2 -2
  83. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/iconEditor/IconEditor.js +2 -2
  84. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/iconEditor/IsInIconPool.validator.js +2 -2
  85. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/integerEditor/IntegerEditor.js +2 -2
  86. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/jsonEditor/JsonEditor.fragment.xml +1 -0
  87. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/jsonEditor/JsonEditor.js +7 -2
  88. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/listEditor/ListEditor.js +2 -2
  89. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/mapEditor/MapEditor.js +2 -2
  90. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/multiSelectEditor/MultiSelectEditor.fragment.xml +15 -0
  91. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/multiSelectEditor/MultiSelectEditor.js +116 -0
  92. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/numberEditor/NumberEditor.js +2 -2
  93. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/selectEditor/SelectEditor.js +2 -2
  94. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/separatorEditor/SeparatorEditor.js +2 -2
  95. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor.js +2 -2
  96. package/src/sap/ui/integration/designtime/baseEditor/propertyEditor/textAreaEditor/TextAreaEditor.js +2 -2
  97. package/src/sap/ui/integration/designtime/baseEditor/util/BaseDefaultValidatorModules.js +1 -1
  98. package/src/sap/ui/integration/designtime/baseEditor/util/StylesheetManager.js +1 -1
  99. package/src/sap/ui/integration/designtime/baseEditor/util/binding/ObjectBinding.js +2 -2
  100. package/src/sap/ui/integration/designtime/baseEditor/util/binding/resolveBinding.js +1 -1
  101. package/src/sap/ui/integration/designtime/baseEditor/util/cleanupDesigntimeMetadata.js +1 -1
  102. package/src/sap/ui/integration/designtime/baseEditor/util/createPromise.js +1 -1
  103. package/src/sap/ui/integration/designtime/baseEditor/util/escapeParameter.js +1 -1
  104. package/src/sap/ui/integration/designtime/baseEditor/util/findClosestInstance.js +1 -1
  105. package/src/sap/ui/integration/designtime/baseEditor/util/hasTag.js +1 -1
  106. package/src/sap/ui/integration/designtime/baseEditor/util/isTemplate.js +1 -1
  107. package/src/sap/ui/integration/designtime/baseEditor/util/isValidBindingString.js +1 -1
  108. package/src/sap/ui/integration/designtime/baseEditor/util/unset.js +2 -2
  109. package/src/sap/ui/integration/designtime/baseEditor/validator/IsBoolean.js +2 -2
  110. package/src/sap/ui/integration/designtime/baseEditor/validator/IsDate.js +2 -2
  111. package/src/sap/ui/integration/designtime/baseEditor/validator/IsInteger.js +2 -2
  112. package/src/sap/ui/integration/designtime/baseEditor/validator/IsNumber.js +2 -2
  113. package/src/sap/ui/integration/designtime/baseEditor/validator/IsPatternMatch.js +1 -1
  114. package/src/sap/ui/integration/designtime/baseEditor/validator/IsSelectedKey.js +18 -3
  115. package/src/sap/ui/integration/designtime/baseEditor/validator/IsStringList.js +2 -2
  116. package/src/sap/ui/integration/designtime/baseEditor/validator/IsUniqueKey.js +2 -2
  117. package/src/sap/ui/integration/designtime/baseEditor/validator/IsUniqueList.js +2 -2
  118. package/src/sap/ui/integration/designtime/baseEditor/validator/IsValidBinding.js +2 -2
  119. package/src/sap/ui/integration/designtime/baseEditor/validator/MaxLength.js +2 -2
  120. package/src/sap/ui/integration/designtime/baseEditor/validator/NotABinding.js +2 -2
  121. package/src/sap/ui/integration/designtime/baseEditor/validator/ValidatorRegistry.js +2 -2
  122. package/src/sap/ui/integration/designtime/cardEditor/BASEditor.js +1 -1
  123. package/src/sap/ui/integration/designtime/cardEditor/CardEditor.js +1 -1
  124. package/src/sap/ui/integration/designtime/cardEditor/PropertyEditor.js +1 -1
  125. package/src/sap/ui/integration/designtime/cardEditor/PropertyEditors.js +1 -1
  126. package/src/sap/ui/integration/designtime/cardEditor/config/AppConfig.js +1 -1
  127. package/src/sap/ui/integration/designtime/cardEditor/config/HeaderConfig.js +1 -1
  128. package/src/sap/ui/integration/designtime/cardEditor/config/ListCardConfig.js +1 -1
  129. package/src/sap/ui/integration/designtime/cardEditor/config/ObjectCardConfig.js +1 -1
  130. package/src/sap/ui/integration/designtime/cardEditor/config/TableCardConfig.js +1 -1
  131. package/src/sap/ui/integration/designtime/cardEditor/config/generateActionConfig.js +1 -1
  132. package/src/sap/ui/integration/designtime/cardEditor/config/generateDataConfig.js +1 -1
  133. package/src/sap/ui/integration/designtime/cardEditor/config/index.js +13 -2
  134. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n.properties +57 -0
  135. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ar.properties +40 -0
  136. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_bg.properties +40 -0
  137. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ca.properties +40 -0
  138. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_cs.properties +40 -0
  139. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_cy.properties +40 -0
  140. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_da.properties +40 -0
  141. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_de.properties +40 -0
  142. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_el.properties +40 -0
  143. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_en.properties +40 -0
  144. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_en_GB.properties +40 -0
  145. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_en_US_sappsd.properties +40 -0
  146. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_en_US_saprigi.properties +0 -4
  147. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_en_US_saptrc.properties +40 -0
  148. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_es.properties +40 -0
  149. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_es_MX.properties +40 -0
  150. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_et.properties +40 -0
  151. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_fi.properties +40 -0
  152. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_fr.properties +40 -0
  153. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_fr_CA.properties +40 -0
  154. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_hi.properties +40 -0
  155. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_hr.properties +40 -0
  156. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_hu.properties +40 -0
  157. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_id.properties +40 -0
  158. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_it.properties +40 -0
  159. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_iw.properties +40 -0
  160. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ja.properties +40 -0
  161. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_kk.properties +40 -0
  162. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ko.properties +40 -0
  163. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_lt.properties +40 -0
  164. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_lv.properties +40 -0
  165. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ms.properties +40 -0
  166. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_nl.properties +40 -0
  167. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_no.properties +40 -0
  168. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_pl.properties +40 -0
  169. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_pt.properties +40 -0
  170. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_pt_PT.properties +40 -0
  171. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ro.properties +40 -0
  172. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_ru.properties +40 -0
  173. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_sh.properties +40 -0
  174. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_sk.properties +40 -0
  175. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_sl.properties +40 -0
  176. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_sv.properties +40 -0
  177. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_th.properties +40 -0
  178. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_tr.properties +40 -0
  179. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_uk.properties +41 -1
  180. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_vi.properties +40 -0
  181. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_zh_CN.properties +40 -0
  182. package/src/sap/ui/integration/designtime/cardEditor/i18n/i18n_zh_TW.properties +40 -0
  183. package/src/sap/ui/integration/designtime/cardEditor/propertyEditor/complexMapEditor/ComplexMapEditor.js +62 -4
  184. package/src/sap/ui/integration/designtime/cardEditor/propertyEditor/destinationsEditor/DestinationsEditor.js +2 -2
  185. package/src/sap/ui/integration/designtime/cardEditor/propertyEditor/filtersEditor/FiltersEditor.js +218 -0
  186. package/src/sap/ui/integration/designtime/cardEditor/propertyEditor/iconEditor/IconEditor.js +2 -2
  187. package/src/sap/ui/integration/designtime/cardEditor/propertyEditor/parametersEditor/ParametersEditor.js +2 -2
  188. package/src/sap/ui/integration/designtime/cardEditor/util/CommonPatterns.js +1 -1
  189. package/src/sap/ui/integration/designtime/cardEditor/validator/IsPatternMatchList.js +1 -1
  190. package/src/sap/ui/integration/designtime/editor/CardEditor.js +53 -4
  191. package/src/sap/ui/integration/designtime/editor/CardPreview.js +31 -11
  192. package/src/sap/ui/integration/designtime/editor/css/CardPreview.css +18 -1
  193. package/src/sap/ui/integration/editor/Editor.js +219 -209
  194. package/src/sap/ui/integration/editor/EditorResourceBundles.js +43 -32
  195. package/src/sap/ui/integration/editor/Extension.js +2 -2
  196. package/src/sap/ui/integration/editor/Manifest.js +3 -3
  197. package/src/sap/ui/integration/editor/Merger.js +1 -19
  198. package/src/sap/ui/integration/editor/Settings.js +10 -6
  199. package/src/sap/ui/integration/editor/css/Editor.css +22 -0
  200. package/src/sap/ui/integration/editor/fields/BaseField.js +9 -12
  201. package/src/sap/ui/integration/editor/fields/BooleanField.js +4 -2
  202. package/src/sap/ui/integration/editor/fields/DateField.js +2 -2
  203. package/src/sap/ui/integration/editor/fields/DateTimeField.js +2 -2
  204. package/src/sap/ui/integration/editor/fields/DestinationField.js +2 -2
  205. package/src/sap/ui/integration/editor/fields/IntegerField.js +5 -2
  206. package/src/sap/ui/integration/editor/fields/ListField.js +274 -62
  207. package/src/sap/ui/integration/editor/fields/NumberField.js +2 -2
  208. package/src/sap/ui/integration/editor/fields/StringField.js +85 -53
  209. package/src/sap/ui/integration/editor/fields/viz/ColorSelect.js +10 -30
  210. package/src/sap/ui/integration/editor/fields/viz/IconSelect.js +2 -4
  211. package/src/sap/ui/integration/editor/fields/viz/ShapeSelect.js +2 -4
  212. package/src/sap/ui/integration/editor/languages.json +2 -2
  213. package/src/sap/ui/integration/formatters/DateTimeFormatter.js +1 -1
  214. package/src/sap/ui/integration/formatters/IconFormatter.js +1 -1
  215. package/src/sap/ui/integration/formatters/NumberFormatter.js +1 -1
  216. package/src/sap/ui/integration/formatters/TextFormatter.js +1 -1
  217. package/src/sap/ui/integration/library-bootstrap.js +1 -1
  218. package/src/sap/ui/integration/library.js +21 -4
  219. package/src/sap/ui/integration/messagebundle_ar.properties +4 -0
  220. package/src/sap/ui/integration/messagebundle_bg.properties +4 -0
  221. package/src/sap/ui/integration/messagebundle_ca.properties +4 -0
  222. package/src/sap/ui/integration/messagebundle_cs.properties +4 -0
  223. package/src/sap/ui/integration/messagebundle_cy.properties +4 -0
  224. package/src/sap/ui/integration/messagebundle_da.properties +4 -0
  225. package/src/sap/ui/integration/messagebundle_de.properties +4 -0
  226. package/src/sap/ui/integration/messagebundle_el.properties +4 -0
  227. package/src/sap/ui/integration/messagebundle_en.properties +4 -0
  228. package/src/sap/ui/integration/messagebundle_en_GB.properties +4 -0
  229. package/src/sap/ui/integration/messagebundle_en_US_sappsd.properties +4 -0
  230. package/src/sap/ui/integration/messagebundle_en_US_saprigi.properties +55 -81
  231. package/src/sap/ui/integration/messagebundle_en_US_saptrc.properties +4 -0
  232. package/src/sap/ui/integration/messagebundle_es.properties +4 -0
  233. package/src/sap/ui/integration/messagebundle_es_MX.properties +4 -0
  234. package/src/sap/ui/integration/messagebundle_et.properties +4 -0
  235. package/src/sap/ui/integration/messagebundle_fi.properties +4 -0
  236. package/src/sap/ui/integration/messagebundle_fr.properties +4 -0
  237. package/src/sap/ui/integration/messagebundle_fr_CA.properties +4 -0
  238. package/src/sap/ui/integration/messagebundle_hi.properties +4 -0
  239. package/src/sap/ui/integration/messagebundle_hr.properties +4 -0
  240. package/src/sap/ui/integration/messagebundle_hu.properties +4 -0
  241. package/src/sap/ui/integration/messagebundle_id.properties +4 -0
  242. package/src/sap/ui/integration/messagebundle_it.properties +4 -0
  243. package/src/sap/ui/integration/messagebundle_iw.properties +4 -0
  244. package/src/sap/ui/integration/messagebundle_ja.properties +4 -0
  245. package/src/sap/ui/integration/messagebundle_kk.properties +4 -0
  246. package/src/sap/ui/integration/messagebundle_ko.properties +4 -0
  247. package/src/sap/ui/integration/messagebundle_lt.properties +4 -0
  248. package/src/sap/ui/integration/messagebundle_lv.properties +4 -0
  249. package/src/sap/ui/integration/messagebundle_ms.properties +4 -0
  250. package/src/sap/ui/integration/messagebundle_nl.properties +4 -0
  251. package/src/sap/ui/integration/messagebundle_no.properties +4 -0
  252. package/src/sap/ui/integration/messagebundle_pl.properties +4 -0
  253. package/src/sap/ui/integration/messagebundle_pt.properties +4 -0
  254. package/src/sap/ui/integration/messagebundle_pt_PT.properties +4 -0
  255. package/src/sap/ui/integration/messagebundle_ro.properties +4 -0
  256. package/src/sap/ui/integration/messagebundle_ru.properties +4 -0
  257. package/src/sap/ui/integration/messagebundle_sh.properties +4 -0
  258. package/src/sap/ui/integration/messagebundle_sk.properties +4 -0
  259. package/src/sap/ui/integration/messagebundle_sl.properties +4 -0
  260. package/src/sap/ui/integration/messagebundle_sv.properties +4 -0
  261. package/src/sap/ui/integration/messagebundle_th.properties +4 -0
  262. package/src/sap/ui/integration/messagebundle_tr.properties +4 -0
  263. package/src/sap/ui/integration/messagebundle_uk.properties +4 -0
  264. package/src/sap/ui/integration/messagebundle_vi.properties +4 -0
  265. package/src/sap/ui/integration/messagebundle_zh_CN.properties +4 -0
  266. package/src/sap/ui/integration/messagebundle_zh_TW.properties +4 -0
  267. package/src/sap/ui/integration/model/ContextModel.js +3 -3
  268. package/src/sap/ui/integration/model/ObservableModel.js +2 -2
  269. package/src/sap/ui/integration/sap-ui-integration-config.js +1 -1
  270. package/src/sap/ui/integration/sap-ui-integration-define-nojQuery.js +1 -1
  271. package/src/sap/ui/integration/schemas/sap-card.json +195 -8
  272. package/src/sap/ui/integration/services/Data.js +1 -1
  273. package/src/sap/ui/integration/services/Navigation.js +1 -1
  274. package/src/sap/ui/integration/services/Service.js +1 -1
  275. package/src/sap/ui/integration/themes/base/CalendarContent.less +31 -4
  276. package/src/sap/ui/integration/themes/base/ObjectContent.less +57 -9
  277. package/src/sap/ui/integration/themes/base/library.source.less +1 -1
  278. package/src/sap/ui/integration/themes/sap_hcb/library.source.less +1 -1
  279. package/src/sap/ui/integration/thirdparty/adaptive-expressions.js +1 -0
  280. package/src/sap/ui/integration/thirdparty/adaptivecards-templating.js +660 -952
  281. package/src/sap/ui/integration/thirdparty/markdown-it.js +8340 -1
  282. package/src/sap/ui/integration/thirdparty/webcomponents/bundle.esm.js +27 -102
  283. package/src/sap/ui/integration/thirdparty/webcomponents/bundle.esm.js.map +1 -0
  284. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ar-8f9ad94e.js +2 -0
  285. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ar-8f9ad94e.js.map +1 -0
  286. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ar-f6792d81.js +2 -0
  287. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ar-f6792d81.js.map +1 -0
  288. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_bg-39f4bd50.js +2 -0
  289. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_bg-39f4bd50.js.map +1 -0
  290. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_bg-884d46bd.js +2 -0
  291. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_bg-884d46bd.js.map +1 -0
  292. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ca-5b6cc3e2.js +2 -0
  293. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ca-5b6cc3e2.js.map +1 -0
  294. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ca-d12c1ceb.js +2 -0
  295. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ca-d12c1ceb.js.map +1 -0
  296. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cs-307b7f69.js +2 -0
  297. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cs-307b7f69.js.map +1 -0
  298. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cs-c7ed5c29.js +2 -0
  299. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cs-c7ed5c29.js.map +1 -0
  300. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cy-0f578e7e.js +2 -0
  301. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cy-0f578e7e.js.map +1 -0
  302. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cy-9889d6f0.js +2 -0
  303. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cy-9889d6f0.js.map +1 -0
  304. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_da-53593542.js +2 -0
  305. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_da-53593542.js.map +1 -0
  306. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_da-6bb7d77b.js +2 -0
  307. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_da-6bb7d77b.js.map +1 -0
  308. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_de-0376c479.js +2 -0
  309. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_de-0376c479.js.map +1 -0
  310. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_de-eb501c07.js +2 -0
  311. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_de-eb501c07.js.map +1 -0
  312. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_el-45d1c326.js +2 -0
  313. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_el-45d1c326.js.map +1 -0
  314. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_el-e1955d32.js +2 -0
  315. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_el-e1955d32.js.map +1 -0
  316. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en-3bc10a88.js +2 -0
  317. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en-3bc10a88.js.map +1 -0
  318. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en-e41c44ec.js +2 -0
  319. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en-e41c44ec.js.map +1 -0
  320. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_GB-963f5beb.js +2 -0
  321. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_GB-963f5beb.js.map +1 -0
  322. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_GB-a4723c29.js +2 -0
  323. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_GB-a4723c29.js.map +1 -0
  324. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_sappsd-10d3b264.js +2 -0
  325. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_sappsd-10d3b264.js.map +1 -0
  326. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_sappsd-9cf5ba75.js +2 -0
  327. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_sappsd-9cf5ba75.js.map +1 -0
  328. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saprigi-00c865df.js +2 -0
  329. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saprigi-00c865df.js.map +1 -0
  330. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saprigi-8a51ede2.js +2 -0
  331. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saprigi-8a51ede2.js.map +1 -0
  332. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saptrc-ac48007a.js +2 -0
  333. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saptrc-ac48007a.js.map +1 -0
  334. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saptrc-ae1a6e4a.js +2 -0
  335. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_en_US_saptrc-ae1a6e4a.js.map +1 -0
  336. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es-1fe90167.js +2 -0
  337. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es-1fe90167.js.map +1 -0
  338. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es-288d5c23.js +2 -0
  339. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es-288d5c23.js.map +1 -0
  340. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es_MX-4f1305df.js +2 -0
  341. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es_MX-4f1305df.js.map +1 -0
  342. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es_MX-b984b6dc.js +2 -0
  343. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es_MX-b984b6dc.js.map +1 -0
  344. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_et-a0061a71.js +2 -0
  345. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_et-a0061a71.js.map +1 -0
  346. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_et-c96b504c.js +2 -0
  347. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_et-c96b504c.js.map +1 -0
  348. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fi-27edc9b8.js +2 -0
  349. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fi-27edc9b8.js.map +1 -0
  350. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fi-c943134b.js +2 -0
  351. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fi-c943134b.js.map +1 -0
  352. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr-16c1c577.js +2 -0
  353. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr-16c1c577.js.map +1 -0
  354. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr-6265990a.js +2 -0
  355. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr-6265990a.js.map +1 -0
  356. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr_CA-60f6fce4.js +2 -0
  357. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr_CA-60f6fce4.js.map +1 -0
  358. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr_CA-c0eae649.js +2 -0
  359. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr_CA-c0eae649.js.map +1 -0
  360. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hi-3c753818.js +2 -0
  361. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hi-3c753818.js.map +1 -0
  362. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hi-c4029409.js +2 -0
  363. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hi-c4029409.js.map +1 -0
  364. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hr-49952683.js +2 -0
  365. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hr-49952683.js.map +1 -0
  366. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hr-f5eadd90.js +2 -0
  367. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hr-f5eadd90.js.map +1 -0
  368. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hu-9eaeaf2e.js +2 -0
  369. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hu-9eaeaf2e.js.map +1 -0
  370. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hu-d57d2bfc.js +2 -0
  371. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hu-d57d2bfc.js.map +1 -0
  372. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_in-5f15c5a1.js +2 -0
  373. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_in-5f15c5a1.js.map +1 -0
  374. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_in-69efcc93.js +2 -0
  375. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_in-69efcc93.js.map +1 -0
  376. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_it-0b408aea.js +2 -0
  377. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_it-0b408aea.js.map +1 -0
  378. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_it-51d189db.js +2 -0
  379. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_it-51d189db.js.map +1 -0
  380. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_iw-6db571be.js +2 -0
  381. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_iw-6db571be.js.map +1 -0
  382. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_iw-71f66463.js +2 -0
  383. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_iw-71f66463.js.map +1 -0
  384. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ja-5b3dd502.js +2 -0
  385. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ja-5b3dd502.js.map +1 -0
  386. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ja-9c40042d.js +2 -0
  387. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ja-9c40042d.js.map +1 -0
  388. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_kk-b620a07a.js +2 -0
  389. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_kk-b620a07a.js.map +1 -0
  390. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_kk-c393c4a9.js +2 -0
  391. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_kk-c393c4a9.js.map +1 -0
  392. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ko-4be67a77.js +2 -0
  393. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ko-4be67a77.js.map +1 -0
  394. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ko-632e4f9f.js +2 -0
  395. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ko-632e4f9f.js.map +1 -0
  396. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lt-56b41ac8.js +2 -0
  397. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lt-56b41ac8.js.map +1 -0
  398. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lt-daa86622.js +2 -0
  399. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lt-daa86622.js.map +1 -0
  400. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lv-54381557.js +2 -0
  401. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lv-54381557.js.map +1 -0
  402. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lv-c58db769.js +2 -0
  403. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lv-c58db769.js.map +1 -0
  404. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ms-536227b5.js +2 -0
  405. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ms-536227b5.js.map +1 -0
  406. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ms-54fe878e.js +2 -0
  407. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ms-54fe878e.js.map +1 -0
  408. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_nl-56e48e33.js +2 -0
  409. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_nl-56e48e33.js.map +1 -0
  410. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_nl-71b1c190.js +2 -0
  411. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_nl-71b1c190.js.map +1 -0
  412. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_no-5ae816d9.js +2 -0
  413. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_no-5ae816d9.js.map +1 -0
  414. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_no-eecb1eec.js +2 -0
  415. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_no-eecb1eec.js.map +1 -0
  416. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pl-bd30a402.js +2 -0
  417. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pl-bd30a402.js.map +1 -0
  418. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pl-dd8107e1.js +2 -0
  419. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pl-dd8107e1.js.map +1 -0
  420. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt-026877c7.js +2 -0
  421. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt-026877c7.js.map +1 -0
  422. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt-9e9f924f.js +2 -0
  423. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt-9e9f924f.js.map +1 -0
  424. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt_PT-2c6cce63.js +2 -0
  425. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt_PT-2c6cce63.js.map +1 -0
  426. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt_PT-a24258d4.js +2 -0
  427. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt_PT-a24258d4.js.map +1 -0
  428. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ro-0dbe572d.js +2 -0
  429. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ro-0dbe572d.js.map +1 -0
  430. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ro-767b0e99.js +2 -0
  431. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ro-767b0e99.js.map +1 -0
  432. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ru-4291aa7d.js +2 -0
  433. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ru-4291aa7d.js.map +1 -0
  434. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ru-b3537542.js +2 -0
  435. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ru-b3537542.js.map +1 -0
  436. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sh-4047dcd1.js +2 -0
  437. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sh-4047dcd1.js.map +1 -0
  438. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sh-806e8ca0.js +2 -0
  439. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sh-806e8ca0.js.map +1 -0
  440. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sk-57daf6b1.js +2 -0
  441. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sk-57daf6b1.js.map +1 -0
  442. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sk-fd3049d8.js +2 -0
  443. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sk-fd3049d8.js.map +1 -0
  444. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sl-586b310b.js +2 -0
  445. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sl-586b310b.js.map +1 -0
  446. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sl-71a84189.js +2 -0
  447. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sl-71a84189.js.map +1 -0
  448. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sv-1796a5d2.js +2 -0
  449. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sv-1796a5d2.js.map +1 -0
  450. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sv-d6d000eb.js +2 -0
  451. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sv-d6d000eb.js.map +1 -0
  452. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_th-63398540.js +2 -0
  453. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_th-63398540.js.map +1 -0
  454. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_th-79715cf0.js +2 -0
  455. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_th-79715cf0.js.map +1 -0
  456. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_tr-c378e505.js +2 -0
  457. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_tr-c378e505.js.map +1 -0
  458. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_tr-f32e601b.js +2 -0
  459. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_tr-f32e601b.js.map +1 -0
  460. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_uk-70daf763.js +2 -0
  461. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_uk-70daf763.js.map +1 -0
  462. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_uk-99b5589a.js +2 -0
  463. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_uk-99b5589a.js.map +1 -0
  464. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_vi-3f36f453.js +2 -0
  465. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_vi-3f36f453.js.map +1 -0
  466. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_vi-c9a9277d.js +2 -0
  467. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_vi-c9a9277d.js.map +1 -0
  468. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_CN-2420a6e9.js +2 -0
  469. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_CN-2420a6e9.js.map +1 -0
  470. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_CN-748178a2.js +2 -0
  471. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_CN-748178a2.js.map +1 -0
  472. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_TW-91e89b06.js +2 -0
  473. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_TW-91e89b06.js.map +1 -0
  474. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_TW-ffef9f6e.js +2 -0
  475. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_TW-ffef9f6e.js.map +1 -0
  476. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-0c3377c5.js +2 -0
  477. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-0c3377c5.js.map +1 -0
  478. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-16ed5ab0.js +2 -0
  479. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-16ed5ab0.js.map +1 -0
  480. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-2b80e11c.js +2 -0
  481. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-2b80e11c.js.map +1 -0
  482. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-324b2fcc.js +2 -0
  483. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-324b2fcc.js.map +1 -0
  484. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-4809f843.js +2 -0
  485. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-4809f843.js.map +1 -0
  486. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-5338149e.js +2 -0
  487. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-5338149e.js.map +1 -0
  488. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-55dcf53d.js +2 -0
  489. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-55dcf53d.js.map +1 -0
  490. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-55e683ed.js +2 -0
  491. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-55e683ed.js.map +1 -0
  492. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-5bc2c0de.js +2 -0
  493. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-5bc2c0de.js.map +1 -0
  494. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-7bc1fa16.js +2 -0
  495. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-7bc1fa16.js.map +1 -0
  496. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-7f593c6e.js +2 -0
  497. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-7f593c6e.js.map +1 -0
  498. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-826107f5.js +2 -0
  499. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-826107f5.js.map +1 -0
  500. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-8b95ce95.js +2 -0
  501. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-8b95ce95.js.map +1 -0
  502. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-a003a2e2.js +2 -0
  503. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-a003a2e2.js.map +1 -0
  504. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-ab3e8649.js +2 -0
  505. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-ab3e8649.js.map +1 -0
  506. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-bfa33d93.js +2 -0
  507. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-bfa33d93.js.map +1 -0
  508. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-dec4feca.js +2 -0
  509. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-dec4feca.js.map +1 -0
  510. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-fb5a25ab.js +2 -0
  511. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css-fb5a25ab.js.map +1 -0
  512. package/src/sap/ui/integration/util/BaseFactory.js +2 -2
  513. package/src/sap/ui/integration/util/BindingHelper.js +6 -4
  514. package/src/sap/ui/integration/util/BindingResolver.js +6 -5
  515. package/src/sap/ui/integration/util/CacheAndRequestDataProvider.js +1 -1
  516. package/src/sap/ui/integration/util/CardMerger.js +7 -18
  517. package/src/sap/ui/integration/util/CardObserver.js +2 -2
  518. package/src/sap/ui/integration/util/ContentFactory.js +5 -9
  519. package/src/sap/ui/integration/util/CsrfTokenHandler.js +296 -0
  520. package/src/sap/ui/integration/util/DataProvider.js +11 -2
  521. package/src/sap/ui/integration/util/DataProviderFactory.js +49 -12
  522. package/src/sap/ui/integration/util/Destinations.js +2 -2
  523. package/src/sap/ui/integration/util/ExtensionDataProvider.js +2 -2
  524. package/src/sap/ui/integration/util/HeaderFactory.js +3 -3
  525. package/src/sap/ui/integration/util/JSONBindingHelper.js +3 -3
  526. package/src/sap/ui/integration/util/LoadingProvider.js +2 -2
  527. package/src/sap/ui/integration/util/Manifest.js +4 -4
  528. package/src/sap/ui/integration/util/ManifestResolver.js +99 -0
  529. package/src/sap/ui/integration/util/ParameterMap.js +1 -1
  530. package/src/sap/ui/integration/util/RequestDataProvider.js +88 -50
  531. package/src/sap/ui/integration/util/ServiceDataProvider.js +2 -2
  532. package/src/sap/ui/integration/util/ServiceManager.js +2 -2
  533. package/src/sap/ui/integration/util/SkeletonCard.js +50 -0
  534. package/src/sap/ui/integration/util/Utils.js +74 -2
  535. package/src/sap/ui/integration/util/loadCardEditor.js +1 -1
  536. package/src/sap/ui/integration/widgets/Card.js +67 -20
  537. package/src/sap/ui/integration/widgets/CardRenderer.js +1 -7
  538. package/src/sap-ui-integration-card-editor.js +1 -1
  539. package/src/sap-ui-integration-editor.js +1 -1
  540. package/src/sap-ui-integration.js +1 -1
  541. package/ui5.yaml +288 -1
  542. package/src/sap/ui/integration/thirdparty/webcomponents/Unicode-Data-Files-LICENSE.txt +0 -27
  543. package/src/sap/ui/integration/thirdparty/webcomponents/ar.43441c1da168c24d.json +0 -5906
  544. package/src/sap/ui/integration/thirdparty/webcomponents/ar_EG.2c9d7bc8c6cc480e.json +0 -5906
  545. package/src/sap/ui/integration/thirdparty/webcomponents/ar_SA.5a58dac7851f3491.json +0 -5906
  546. package/src/sap/ui/integration/thirdparty/webcomponents/bg.ed8d32010cf321a6.json +0 -4979
  547. package/src/sap/ui/integration/thirdparty/webcomponents/bundle.es5.js +0 -212
  548. package/src/sap/ui/integration/thirdparty/webcomponents/ca.e7ad42298985cd11.json +0 -4996
  549. package/src/sap/ui/integration/thirdparty/webcomponents/cs.9c679acdc4b03e38.json +0 -5498
  550. package/src/sap/ui/integration/thirdparty/webcomponents/da.ba9951ef39b201a6.json +0 -4888
  551. package/src/sap/ui/integration/thirdparty/webcomponents/de.6caccc36abcd1ecf.json +0 -4916
  552. package/src/sap/ui/integration/thirdparty/webcomponents/de_AT.0f4ffe37737725a0.json +0 -4917
  553. package/src/sap/ui/integration/thirdparty/webcomponents/de_CH.c148cbc7ceb1a7a5.json +0 -4915
  554. package/src/sap/ui/integration/thirdparty/webcomponents/el.11c4c67dcb9fadcc.json +0 -4883
  555. package/src/sap/ui/integration/thirdparty/webcomponents/el_CY.ed3bddd6e79dc343.json +0 -4883
  556. package/src/sap/ui/integration/thirdparty/webcomponents/en.c4465af466100b5b.json +0 -4970
  557. package/src/sap/ui/integration/thirdparty/webcomponents/en_AU.5cb9fccc9ce24663.json +0 -4962
  558. package/src/sap/ui/integration/thirdparty/webcomponents/en_GB.e31daeeb57c2f1d1.json +0 -4971
  559. package/src/sap/ui/integration/thirdparty/webcomponents/en_HK.0a22405bb092bec2.json +0 -4977
  560. package/src/sap/ui/integration/thirdparty/webcomponents/en_IE.6a062df10dabdb1c.json +0 -4971
  561. package/src/sap/ui/integration/thirdparty/webcomponents/en_IN.bfd20b07e9079267.json +0 -4972
  562. package/src/sap/ui/integration/thirdparty/webcomponents/en_NZ.18303e8298e4752a.json +0 -4971
  563. package/src/sap/ui/integration/thirdparty/webcomponents/en_PG.9f604c968f3ab77e.json +0 -4972
  564. package/src/sap/ui/integration/thirdparty/webcomponents/en_SG.cc59a6a409e1617e.json +0 -4973
  565. package/src/sap/ui/integration/thirdparty/webcomponents/en_ZA.198f9641a502d660.json +0 -4972
  566. package/src/sap/ui/integration/thirdparty/webcomponents/es.c10bf80f473caf30.json +0 -4912
  567. package/src/sap/ui/integration/thirdparty/webcomponents/es_AR.7708d7dd7a6d2a15.json +0 -4914
  568. package/src/sap/ui/integration/thirdparty/webcomponents/es_BO.4a1616d9f3425fba.json +0 -4913
  569. package/src/sap/ui/integration/thirdparty/webcomponents/es_CL.5637126713317a15.json +0 -4914
  570. package/src/sap/ui/integration/thirdparty/webcomponents/es_CO.c9436572ca8f4da8.json +0 -4913
  571. package/src/sap/ui/integration/thirdparty/webcomponents/es_MX.b4bce7dc951eb8f4.json +0 -4915
  572. package/src/sap/ui/integration/thirdparty/webcomponents/es_PE.65f448fde1f0de13.json +0 -4913
  573. package/src/sap/ui/integration/thirdparty/webcomponents/es_UY.9ec44031491e9b95.json +0 -4915
  574. package/src/sap/ui/integration/thirdparty/webcomponents/es_VE.152233c7f57ecdab.json +0 -4914
  575. package/src/sap/ui/integration/thirdparty/webcomponents/et.bbc93e8a17832e8f.json +0 -4967
  576. package/src/sap/ui/integration/thirdparty/webcomponents/fa.083b927b3586b3a3.json +0 -4883
  577. package/src/sap/ui/integration/thirdparty/webcomponents/fi.1b4c89f38783556e.json +0 -5008
  578. package/src/sap/ui/integration/thirdparty/webcomponents/fr.ddbb9df1e0bdb6ac.json +0 -4979
  579. package/src/sap/ui/integration/thirdparty/webcomponents/fr_BE.bf3609280b7b93ee.json +0 -4979
  580. package/src/sap/ui/integration/thirdparty/webcomponents/fr_CA.b64d0bcd23a5cd3e.json +0 -4973
  581. package/src/sap/ui/integration/thirdparty/webcomponents/fr_CH.349b221a02887244.json +0 -4997
  582. package/src/sap/ui/integration/thirdparty/webcomponents/fr_LU.ef7d7c8bb3328d28.json +0 -4979
  583. package/src/sap/ui/integration/thirdparty/webcomponents/he.d628e8bf13a8a2c8.json +0 -5378
  584. package/src/sap/ui/integration/thirdparty/webcomponents/hi.cc34df8229f656f5.json +0 -4829
  585. package/src/sap/ui/integration/thirdparty/webcomponents/hr.c920290f50173516.json +0 -4919
  586. package/src/sap/ui/integration/thirdparty/webcomponents/hu.2d9fa4a9163cd7c0.json +0 -4856
  587. package/src/sap/ui/integration/thirdparty/webcomponents/id.163fdd2a7dbd1dd3.json +0 -4658
  588. package/src/sap/ui/integration/thirdparty/webcomponents/it.b5acbefdd6794dfc.json +0 -4950
  589. package/src/sap/ui/integration/thirdparty/webcomponents/it_CH.ade4cbfb2e49424a.json +0 -4950
  590. package/src/sap/ui/integration/thirdparty/webcomponents/ja.d882fade5c3e04b5.json +0 -4830
  591. package/src/sap/ui/integration/thirdparty/webcomponents/kk.ab96b18c66676a99.json +0 -4725
  592. package/src/sap/ui/integration/thirdparty/webcomponents/ko.a0d63a1580dcbefd.json +0 -4738
  593. package/src/sap/ui/integration/thirdparty/webcomponents/lt.93bb00f91a74d613.json +0 -5481
  594. package/src/sap/ui/integration/thirdparty/webcomponents/lv.3c272216d7d4d61c.json +0 -5112
  595. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ar.d20c665dc46a6f9b.json +0 -1
  596. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_bg.38428028ff3b1869.json +0 -1
  597. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ca.c46423cc94896604.json +0 -1
  598. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cs.d9d68b2690954b4e.json +0 -1
  599. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_cy.facf33e921a1a902.json +0 -1
  600. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_da.1189e997523b89f6.json +0 -1
  601. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_de.1edf86f620dd657a.json +0 -1
  602. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_el.b0d02877b9366e9a.json +0 -1
  603. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es.43fc364a8be37449.json +0 -1
  604. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_es_MX.ebf2828c83c4821a.json +0 -1
  605. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_et.8f9abcfab5eb10c2.json +0 -1
  606. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fi.6fc14fd0d16cc223.json +0 -1
  607. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr.c686ab9036b91d78.json +0 -1
  608. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_fr_CA.fb1250c736f2ac8c.json +0 -1
  609. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hi.8b8cbc4fb282adf6.json +0 -1
  610. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hr.bb811aa76359724a.json +0 -1
  611. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_hu.18417ced7dce8cf7.json +0 -1
  612. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_in.e3c5681fc8917143.json +0 -1
  613. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_it.554f904c106ab069.json +0 -1
  614. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_iw.487febe0c5c504ff.json +0 -1
  615. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ja.68cf1fa9f03cd6c3.json +0 -1
  616. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_kk.36e63b8f9e1fd98f.json +0 -1
  617. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ko.fb000c7a35009d21.json +0 -1
  618. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lt.6acd357e3eb3f54e.json +0 -1
  619. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_lv.3ffdda1a20bc15ec.json +0 -1
  620. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ms.218aa30a3e8f58fa.json +0 -1
  621. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_nl.f753744c7e08b3a5.json +0 -1
  622. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_no.385f0fc9f2e49ab5.json +0 -1
  623. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pl.6c42672479ad9687.json +0 -1
  624. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt.ede162cbf79f7fca.json +0 -1
  625. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_pt_PT.dcaa871d6b8eec75.json +0 -1
  626. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ro.d3f32654c57588ea.json +0 -1
  627. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_ru.0ec083b64484a12d.json +0 -1
  628. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sh.98cd3e4299919a30.json +0 -1
  629. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sk.fddb8b9e7b70fc1d.json +0 -1
  630. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sl.c55d5f817482ea06.json +0 -1
  631. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_sv.6d855a11d20b4335.json +0 -1
  632. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_th.e791b9a81f16120c.json +0 -1
  633. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_tr.ce83741e39606b55.json +0 -1
  634. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_uk.e1ea822764025a5a.json +0 -1
  635. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_vi.7ee7339211750379.json +0 -1
  636. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_CN.0cfd71faba640211.json +0 -1
  637. package/src/sap/ui/integration/thirdparty/webcomponents/messagebundle_zh_TW.bc718e0187728a16.json +0 -1
  638. package/src/sap/ui/integration/thirdparty/webcomponents/ms.e26b54937e5d1516.json +0 -4515
  639. package/src/sap/ui/integration/thirdparty/webcomponents/nb.a6e9993590a73989.json +0 -4977
  640. package/src/sap/ui/integration/thirdparty/webcomponents/nl.cac914c3529b7b01.json +0 -4884
  641. package/src/sap/ui/integration/thirdparty/webcomponents/nl_BE.a3ac6f9f99feba7b.json +0 -4884
  642. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.34f9ef46a8f6a852.json +0 -1
  643. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.52d78e00faad9126.json +0 -1
  644. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.6c6e759e0d3534d0.json +0 -1
  645. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.8cc66e917327b7a4.json +0 -1
  646. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.966b2e43c0966351.json +0 -1
  647. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.97725b2cf4e77494.json +0 -1
  648. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.b1bf75f0b850363c.json +0 -1
  649. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.d164773ecb392b28.json +0 -1
  650. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.def3978aa5de7b11.json +0 -1
  651. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.dfd19a1252497415.json +0 -1
  652. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.e19065174fdd4592.json +0 -1
  653. package/src/sap/ui/integration/thirdparty/webcomponents/parameters-bundle.css.e2ac94de83159e1e.json +0 -1
  654. package/src/sap/ui/integration/thirdparty/webcomponents/pl.2cc1c94da23f8c37.json +0 -5176
  655. package/src/sap/ui/integration/thirdparty/webcomponents/pt.fc8dd9656bc363a4.json +0 -4805
  656. package/src/sap/ui/integration/thirdparty/webcomponents/pt_PT.be31b641eedfdb48.json +0 -4940
  657. package/src/sap/ui/integration/thirdparty/webcomponents/ro.fc6a48bc63cf435e.json +0 -5090
  658. package/src/sap/ui/integration/thirdparty/webcomponents/ru.77f0de46b3b490b1.json +0 -5407
  659. package/src/sap/ui/integration/thirdparty/webcomponents/ru_UA.4c4e0034fbd799c6.json +0 -5407
  660. package/src/sap/ui/integration/thirdparty/webcomponents/sk.0d62a8cca83c1dec.json +0 -5370
  661. package/src/sap/ui/integration/thirdparty/webcomponents/sl.7b303551cc238560.json +0 -5340
  662. package/src/sap/ui/integration/thirdparty/webcomponents/sr.7fb9ac6ed054ff7d.json +0 -5126
  663. package/src/sap/ui/integration/thirdparty/webcomponents/sv.6ea04dfd8d1c331b.json +0 -5011
  664. package/src/sap/ui/integration/thirdparty/webcomponents/th.8e8d734a66ed1c51.json +0 -4797
  665. package/src/sap/ui/integration/thirdparty/webcomponents/tr.dbb9aa836fc4e3f5.json +0 -4979
  666. package/src/sap/ui/integration/thirdparty/webcomponents/uk.4854089f0c12f77c.json +0 -5353
  667. package/src/sap/ui/integration/thirdparty/webcomponents/vi.e6ffbde0643d7d75.json +0 -4673
  668. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-ce.js +0 -73
  669. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  670. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -336
  671. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  672. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -221
  673. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  674. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd.js +0 -169
  675. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  676. package/src/sap/ui/integration/thirdparty/webcomponents/webcomponentsjs/webcomponents-loader.js +0 -185
  677. package/src/sap/ui/integration/thirdparty/webcomponents/zh_CN.6607a3e9e0901e53.json +0 -4632
  678. package/src/sap/ui/integration/thirdparty/webcomponents/zh_HK.1c2563d3e4dad56e.json +0 -4640
  679. package/src/sap/ui/integration/thirdparty/webcomponents/zh_SG.db7f1334eecf894d.json +0 -4640
  680. package/src/sap/ui/integration/thirdparty/webcomponents/zh_TW.a1d00dd87c58d8f0.json +0 -4728
  681. package/src/sap/ui/integration/util/CardActions.js +0 -551
@@ -1,749 +1,225 @@
1
1
  (function webpackUniversalModuleDefinition(root, factory) {
2
- if (typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if (typeof sap.ui.define === 'function')
5
- sap.ui.define([], factory);
6
- else if (typeof exports === 'object')
7
- exports["ACData"] = factory();
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory(require("./adaptive-expressions"));
4
+ else if(typeof sap.ui.define === 'function')
5
+ sap.ui.define(["sap/ui/integration/thirdparty/adaptive-expressions"], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["ACData"] = factory(require("./adaptive-expressions"));
8
8
  else
9
- root["ACData"] = factory();
10
- })(window, function() {
11
- return /******/ (function(modules) { // webpackBootstrap
12
- /******/ // The module cache
13
- /******/ var installedModules = {};
14
- /******/
15
- /******/ // The require function
16
- /******/ function __webpack_require__(moduleId) {
17
- /******/
18
- /******/ // Check if module is in cache
19
- /******/ if (installedModules[moduleId]) {
20
- /******/ return installedModules[moduleId].exports;
21
- /******/ }
22
- /******/ // Create a new module (and put it into the cache)
23
- /******/ var module = installedModules[moduleId] = {
24
- /******/ i: moduleId,
25
- /******/ l: false,
26
- /******/ exports: {}
27
- /******/ };
28
- /******/
29
- /******/ // Execute the module function
30
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31
- /******/
32
- /******/ // Flag the module as loaded
33
- /******/ module.l = true;
34
- /******/
35
- /******/ // Return the exports of the module
36
- /******/ return module.exports;
37
- /******/ }
38
- /******/
39
- /******/
40
- /******/ // expose the modules object (__webpack_modules__)
41
- /******/ __webpack_require__.m = modules;
42
- /******/
43
- /******/ // expose the module cache
44
- /******/ __webpack_require__.c = installedModules;
45
- /******/
46
- /******/ // define getter function for harmony exports
47
- /******/ __webpack_require__.d = function(exports, name, getter) {
48
- /******/ if (!__webpack_require__.o(exports, name)) {
49
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
50
- /******/ }
51
- /******/ };
52
- /******/
53
- /******/ // define __esModule on exports
54
- /******/ __webpack_require__.r = function(exports) {
55
- /******/ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
56
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
57
- /******/ }
58
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
59
- /******/ };
60
- /******/
61
- /******/ // create a fake namespace object
62
- /******/ // mode & 1: value is a module id, require it
63
- /******/ // mode & 2: merge all properties of value into the ns
64
- /******/ // mode & 4: return value when already ns object
65
- /******/ // mode & 8|1: behave like require
66
- /******/ __webpack_require__.t = function(value, mode) {
67
- /******/ if (mode & 1) value = __webpack_require__(value);
68
- /******/ if (mode & 8) return value;
69
- /******/ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
70
- /******/ var ns = Object.create(null);
71
- /******/ __webpack_require__.r(ns);
72
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
73
- /******/ if (mode & 2 && typeof value != 'string') for (var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
74
- /******/ return ns;
75
- /******/ };
76
- /******/
77
- /******/ // getDefaultExport function for compatibility with non-harmony modules
78
- /******/ __webpack_require__.n = function(module) {
79
- /******/ var getter = module && module.__esModule ?
80
- /******/ function getDefault() { return module['default']; } :
81
- /******/ function getModuleExports() { return module; };
82
- /******/ __webpack_require__.d(getter, 'a', getter);
83
- /******/ return getter;
84
- /******/ };
85
- /******/
86
- /******/ // Object.prototype.hasOwnProperty.call
87
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
88
- /******/
89
- /******/ // __webpack_public_path__
90
- /******/ __webpack_require__.p = "";
91
- /******/
92
- /******/
93
- /******/ // Load entry module and return exports
94
- /******/ return __webpack_require__(__webpack_require__.s = "./src/adaptivecards-templating.ts");
95
- /******/ })
96
- /************************************************************************/
97
- /******/ ({
9
+ root["ACData"] = factory(root["AEL"]);
10
+ })(this, function(__WEBPACK_EXTERNAL_MODULE_adaptive_expressions__) {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
98
14
 
99
15
  /***/ "./src/adaptivecards-templating.ts":
100
16
  /*!*****************************************!*\
101
17
  !*** ./src/adaptivecards-templating.ts ***!
102
18
  \*****************************************/
103
- /*! no static exports found */
104
- /***/ (function(module, exports, __webpack_require__) {
19
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
105
20
 
106
- "use strict";
107
21
 
108
- function __export(m) {
109
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
110
- }
111
- Object.defineProperty(exports, "__esModule", { value: true });
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
31
+ };
32
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
112
33
  // Copyright (c) Microsoft Corporation. All rights reserved.
113
34
  // Licensed under the MIT License.
114
- __export(__webpack_require__(/*! ./expression-parser */ "./src/expression-parser.ts"));
115
- __export(__webpack_require__(/*! ./template-engine */ "./src/template-engine.ts"));
35
+ __exportStar(__webpack_require__(/*! ./template-engine */ "./src/template-engine.ts"), exports);
36
+ __exportStar(__webpack_require__(/*! ./json-schema-card */ "./src/json-schema-card.ts"), exports);
116
37
 
117
38
 
118
39
  /***/ }),
119
40
 
120
- /***/ "./src/expression-parser.ts":
121
- /*!**********************************!*\
122
- !*** ./src/expression-parser.ts ***!
123
- \**********************************/
124
- /*! no static exports found */
125
- /***/ (function(module, exports, __webpack_require__) {
41
+ /***/ "./src/json-schema-card.ts":
42
+ /*!*********************************!*\
43
+ !*** ./src/json-schema-card.ts ***!
44
+ \*********************************/
45
+ /***/ (function(__unused_webpack_module, exports) {
126
46
 
127
- "use strict";
128
47
 
129
- var __extends = (this && this.__extends) || (function () {
130
- var extendStatics = function (d, b) {
131
- extendStatics = Object.setPrototypeOf ||
132
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
133
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
134
- return extendStatics(d, b);
135
- };
136
- return function (d, b) {
137
- extendStatics(d, b);
138
- function __() { this.constructor = d; }
139
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
140
- };
141
- })();
142
- Object.defineProperty(exports, "__esModule", { value: true });
143
- var orderedOperators = [
144
- "/",
145
- "*",
146
- "-",
147
- "+",
148
- "==",
149
- "!=",
150
- "<",
151
- "<=",
152
- ">",
153
- ">="
154
- ];
155
- var literals = [
156
- "identifier",
157
- "string",
158
- "number",
159
- "boolean"
160
- ];
161
- var Tokenizer = /** @class */ (function () {
162
- function Tokenizer() {
163
- }
164
- Tokenizer.init = function () {
165
- Tokenizer.rules.push({ tokenType: undefined, regEx: /^\s/ }, { tokenType: "{", regEx: /^{/ }, { tokenType: "?#", regEx: /^\?#/ }, { tokenType: "}", regEx: /^}/ }, { tokenType: "[", regEx: /^\[/ }, { tokenType: "]", regEx: /^\]/ }, { tokenType: "(", regEx: /^\(/ }, { tokenType: ")", regEx: /^\)/ }, { tokenType: "boolean", regEx: /^true|^false/ }, { tokenType: "identifier", regEx: /^[$a-z_]+/i }, { tokenType: ".", regEx: /^\./ }, { tokenType: ",", regEx: /^,/ }, { tokenType: "+", regEx: /^\+/ }, { tokenType: "-", regEx: /^-/ }, { tokenType: "*", regEx: /^\*/ }, { tokenType: "/", regEx: /^\// }, { tokenType: "==", regEx: /^==/ }, { tokenType: "!=", regEx: /^!=/ }, { tokenType: "<=", regEx: /^<=/ }, { tokenType: "<", regEx: /^</ }, { tokenType: ">=", regEx: /^>=/ }, { tokenType: ">", regEx: /^>/ }, { tokenType: "string", regEx: /^"([^"]*)"/ }, { tokenType: "string", regEx: /^'([^']*)'/ }, { tokenType: "number", regEx: /^\d*\.?\d+/ });
166
- };
167
- Tokenizer.parse = function (expression) {
168
- var result = [];
169
- var i = 0;
170
- while (i < expression.length) {
171
- var subExpression = expression.substring(i);
172
- var matchFound = false;
173
- for (var _i = 0, _a = Tokenizer.rules; _i < _a.length; _i++) {
174
- var rule = _a[_i];
175
- var matches = rule.regEx.exec(subExpression);
176
- if (matches) {
177
- if (matches.length > 2) {
178
- throw new Error("A tokenizer rule matched more than one group.");
179
- }
180
- if (rule.tokenType != undefined) {
181
- result.push({
182
- type: rule.tokenType,
183
- value: matches[matches.length == 1 ? 0 : 1],
184
- originalPosition: i
185
- });
186
- }
187
- i += matches[0].length;
188
- matchFound = true;
189
- break;
190
- }
191
- }
192
- if (!matchFound) {
193
- throw new Error("Unexpected character " + subExpression[0] + " at position " + i);
194
- }
195
- }
196
- return result;
197
- };
198
- Tokenizer.rules = [];
199
- return Tokenizer;
200
- }());
201
- Tokenizer.init();
202
- function ensureValueType(value) {
203
- if (typeof value === "number" || typeof value === "string" || typeof value === "boolean") {
204
- return value;
205
- }
206
- throw new Error("Invalid value type: " + typeof value);
48
+ // Copyright (c) Microsoft Corporation. All rights reserved.
49
+ // Licensed under the MIT License.
50
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
51
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
52
+ if (ar || !(i in from)) {
53
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
54
+ ar[i] = from[i];
55
+ }
56
+ }
57
+ return to.concat(ar || Array.prototype.slice.call(from));
58
+ };
59
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
60
+ exports.JSONSchemaCard = void 0;
61
+ // JSON Schema Card
62
+ // generates an Adaptive Card given a JSON schema
63
+ function JSONSchemaCard(schema) {
64
+ try {
65
+ return {
66
+ type: "AdaptiveCard",
67
+ body: [
68
+ JSONSchemaCardObject(schema, '', 0),
69
+ ],
70
+ };
71
+ }
72
+ catch (e) {
73
+ console.error(e);
74
+ return undefined;
75
+ }
76
+ }
77
+ exports.JSONSchemaCard = JSONSchemaCard;
78
+ // JSON Schema Elements
79
+ function JSONSchemaCardElement(schema, path, depth) {
80
+ if (typeof (schema) === "boolean")
81
+ return null;
82
+ switch (schema.type) {
83
+ case "array":
84
+ if (Array.isArray(schema.items)) {
85
+ return JSONSchemaCardTuple(schema, path, depth);
86
+ }
87
+ else {
88
+ return JSONSchemaCardList(schema, path, depth);
89
+ }
90
+ case "object":
91
+ return JSONSchemaCardObject(schema, path, depth);
92
+ case "boolean":
93
+ return JSONSchemaCardBoolean(schema, path);
94
+ case "integer":
95
+ case "number":
96
+ return JSONSchemaCardNumber(schema, path);
97
+ case "string":
98
+ if (schema.enum) {
99
+ return JSONSchemaCardChoiceSet(schema, path);
100
+ }
101
+ else {
102
+ return JSONSchemaCardText(schema, path);
103
+ }
104
+ case "date-time":
105
+ case "time":
106
+ case "date":
107
+ return JSONSchemaCardTime(schema, path);
108
+ default:
109
+ return null;
110
+ }
111
+ }
112
+ function encodeProperty(property) {
113
+ return encodeURIComponent(property).replace('.', '%2e');
114
+ }
115
+ function textSizeAtDepth(depth) {
116
+ switch (depth) {
117
+ case 0:
118
+ "large";
119
+ case 1:
120
+ "medium";
121
+ default:
122
+ "small";
123
+ }
124
+ }
125
+ function JSONSchemaFieldTitle(schema, path, depth) {
126
+ return [
127
+ schema.title ? {
128
+ type: "TextBlock",
129
+ size: textSizeAtDepth(depth),
130
+ text: schema.title,
131
+ } : null,
132
+ schema.description ? {
133
+ type: "TextBlock",
134
+ size: textSizeAtDepth(depth + 1),
135
+ isSubtle: true,
136
+ wrap: true,
137
+ text: schema.description,
138
+ } : null,
139
+ ];
140
+ }
141
+ function JSONSchemaCardTuple(schema, path, depth) {
142
+ var _a, _b;
143
+ if (!Array.isArray(schema.items))
144
+ return null;
145
+ return {
146
+ type: "Container",
147
+ items: __spreadArray(__spreadArray([], JSONSchemaFieldTitle(schema, path, depth), true), (_b = (_a = schema.items) === null || _a === void 0 ? void 0 : _a.map(function (item, idx) {
148
+ return JSONSchemaCardElement(item, path + "[" + idx + "]", depth + 1);
149
+ })) !== null && _b !== void 0 ? _b : [], true),
150
+ };
151
+ }
152
+ function JSONSchemaCardList(schema, path, depth) {
153
+ return {
154
+ type: "Container",
155
+ items: __spreadArray([], JSONSchemaFieldTitle(schema, path, depth), true),
156
+ };
157
+ }
158
+ function JSONSchemaCardObject(schema, path, depth) {
159
+ var _a, _b;
160
+ return {
161
+ type: "Container",
162
+ items: __spreadArray(__spreadArray([], JSONSchemaFieldTitle(schema, path, depth), true), (_b = (_a = schema.required) === null || _a === void 0 ? void 0 : _a.map(function (property) {
163
+ return JSONSchemaCardElement(schema.properties[property], path + "." + encodeProperty(property), depth + 1);
164
+ })) !== null && _b !== void 0 ? _b : [], true),
165
+ };
166
+ }
167
+ function JSONSchemaCardBoolean(schema, path) {
168
+ return {
169
+ type: "Input.Toggle",
170
+ id: path,
171
+ title: schema.title,
172
+ label: schema.description,
173
+ value: schema.default,
174
+ };
175
+ }
176
+ function JSONSchemaCardNumber(schema, path) {
177
+ var _a, _b;
178
+ return {
179
+ type: "Input.Number",
180
+ id: path,
181
+ title: schema.title,
182
+ placeholder: schema.description,
183
+ value: schema.default,
184
+ min: (_a = schema.exclusiveMinimum) !== null && _a !== void 0 ? _a : schema.minimum,
185
+ max: (_b = schema.exclusiveMaximum) !== null && _b !== void 0 ? _b : schema.maximum,
186
+ };
187
+ }
188
+ function JSONSchemaCardChoiceSet(schema, path) {
189
+ return {
190
+ type: "Input.ChoiceSet",
191
+ id: path,
192
+ title: schema.title,
193
+ choices: schema.enum.map(function (item) {
194
+ return {
195
+ title: item,
196
+ value: item,
197
+ };
198
+ }),
199
+ placeholder: schema.description,
200
+ value: schema.default,
201
+ };
202
+ }
203
+ function JSONSchemaCardText(schema, path) {
204
+ return {
205
+ type: "Input.Text",
206
+ id: path,
207
+ title: schema.title,
208
+ placeholder: schema.description,
209
+ value: schema.default,
210
+ maxLength: schema.maxLength,
211
+ regex: schema.pattern,
212
+ };
213
+ }
214
+ function JSONSchemaCardTime(schema, path) {
215
+ return {
216
+ type: "Input.Time",
217
+ id: path,
218
+ title: schema.title,
219
+ placeholder: schema.description,
220
+ value: schema.default,
221
+ };
207
222
  }
208
- var EvaluationContext = /** @class */ (function () {
209
- function EvaluationContext() {
210
- this._functions = {};
211
- this._stateStack = [];
212
- }
213
- EvaluationContext.init = function () {
214
- EvaluationContext._builtInFunctions["substr"] = function (s, index, count) {
215
- if (typeof s === "string" && typeof index === "number" && typeof count === "number") {
216
- return (s.substr(index, count));
217
- }
218
- else {
219
- return "";
220
- }
221
- };
222
- EvaluationContext._builtInFunctions["JSON.parse"] = function (input) {
223
- return JSON.parse(input);
224
- };
225
- EvaluationContext._builtInFunctions["if"] = function (condition, ifTrue, ifFalse) {
226
- return condition ? ifTrue : ifFalse;
227
- };
228
- EvaluationContext._builtInFunctions["toUpper"] = function (input) {
229
- return typeof input === "string" ? input.toUpperCase() : input;
230
- };
231
- EvaluationContext._builtInFunctions["toLower"] = function (input) {
232
- return typeof input === "string" ? input.toLowerCase() : input;
233
- };
234
- EvaluationContext._builtInFunctions["Date.format"] = function (input, format) {
235
- var acceptedFormats = ["long", "short", "compact"];
236
- var inputAsNumber;
237
- if (typeof input === "string") {
238
- inputAsNumber = Date.parse(input);
239
- }
240
- else if (typeof input === "number") {
241
- inputAsNumber = input;
242
- }
243
- else {
244
- return input;
245
- }
246
- var date = new Date(inputAsNumber);
247
- var effectiveFormat = "compact";
248
- if (typeof format === "string") {
249
- effectiveFormat = format.toLowerCase();
250
- if (acceptedFormats.indexOf(effectiveFormat) < 0) {
251
- effectiveFormat = "compact";
252
- }
253
- }
254
- return effectiveFormat === "compact" ? date.toLocaleDateString() : date.toLocaleDateString(undefined, { day: "numeric", weekday: effectiveFormat, month: effectiveFormat, year: "numeric" });
255
- };
256
- EvaluationContext._builtInFunctions["Time.format"] = function (input) {
257
- var inputAsNumber;
258
- if (typeof input === "string") {
259
- inputAsNumber = Date.parse(input);
260
- }
261
- else if (typeof input === "number") {
262
- inputAsNumber = input;
263
- }
264
- else {
265
- return input;
266
- }
267
- var date = new Date(inputAsNumber);
268
- return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
269
- };
270
- };
271
- EvaluationContext.prototype.registerFunction = function (name, callback) {
272
- this._functions[name] = callback;
273
- };
274
- EvaluationContext.prototype.unregisterFunction = function (name) {
275
- delete this._functions[name];
276
- };
277
- EvaluationContext.prototype.getFunction = function (name) {
278
- var result = this._functions[name];
279
- if (result == undefined) {
280
- result = EvaluationContext._builtInFunctions[name];
281
- }
282
- return result;
283
- };
284
- EvaluationContext.prototype.isReservedField = function (name) {
285
- return EvaluationContext._reservedFields.indexOf(name) >= 0;
286
- };
287
- EvaluationContext.prototype.saveState = function () {
288
- this._stateStack.push({ $data: this.$data, $index: this.$index });
289
- };
290
- EvaluationContext.prototype.restoreLastState = function () {
291
- if (this._stateStack.length == 0) {
292
- throw new Error("There is no evaluation context state to restore.");
293
- }
294
- var savedContext = this._stateStack.pop();
295
- this.$data = savedContext.$data;
296
- this.$index = savedContext.$index;
297
- };
298
- Object.defineProperty(EvaluationContext.prototype, "currentDataContext", {
299
- get: function () {
300
- return this.$data != undefined ? this.$data : this.$root;
301
- },
302
- enumerable: true,
303
- configurable: true
304
- });
305
- EvaluationContext._reservedFields = ["$data", "$root", "$index"];
306
- EvaluationContext._builtInFunctions = {};
307
- return EvaluationContext;
308
- }());
309
- exports.EvaluationContext = EvaluationContext;
310
- EvaluationContext.init();
311
- var EvaluationNode = /** @class */ (function () {
312
- function EvaluationNode() {
313
- }
314
- return EvaluationNode;
315
- }());
316
- var ExpressionNode = /** @class */ (function (_super) {
317
- __extends(ExpressionNode, _super);
318
- function ExpressionNode() {
319
- var _this = _super !== null && _super.apply(this, arguments) || this;
320
- _this.nodes = [];
321
- _this.allowNull = true;
322
- return _this;
323
- }
324
- ExpressionNode.prototype.evaluate = function (context) {
325
- var operatorPriorityGroups = [
326
- ["/", "*"],
327
- ["-", "+"],
328
- ["==", "!=", "<", "<=", ">", ">="]
329
- ];
330
- var nodesCopy = this.nodes;
331
- for (var _i = 0, operatorPriorityGroups_1 = operatorPriorityGroups; _i < operatorPriorityGroups_1.length; _i++) {
332
- var priorityGroup = operatorPriorityGroups_1[_i];
333
- var i = 0;
334
- while (i < nodesCopy.length) {
335
- var node = nodesCopy[i];
336
- if (node instanceof OperatorNode && priorityGroup.indexOf(node.operator) >= 0) {
337
- var left = ensureValueType(nodesCopy[i - 1].evaluate(context));
338
- var right = ensureValueType(nodesCopy[i + 1].evaluate(context));
339
- if (typeof left !== typeof right) {
340
- throw new Error("Incompatible operands " + left + " and " + right + " for operator " + node.operator);
341
- }
342
- var result = void 0;
343
- if (typeof left === "number" && typeof right === "number") {
344
- switch (node.operator) {
345
- case "/":
346
- result = left / right;
347
- break;
348
- case "*":
349
- result = left * right;
350
- break;
351
- case "-":
352
- result = left - right;
353
- break;
354
- case "+":
355
- result = left + right;
356
- break;
357
- }
358
- }
359
- if (typeof left === "string" && typeof right === "string") {
360
- switch (node.operator) {
361
- case "+":
362
- result = left + right;
363
- break;
364
- }
365
- }
366
- switch (node.operator) {
367
- case "==":
368
- result = left == right;
369
- break;
370
- case "!=":
371
- result = left != right;
372
- break;
373
- case "<":
374
- result = left < right;
375
- break;
376
- case "<=":
377
- result = left <= right;
378
- break;
379
- case ">":
380
- result = left > right;
381
- break;
382
- case ">=":
383
- result = left >= right;
384
- break;
385
- default:
386
- // This should never happen
387
- }
388
- nodesCopy.splice(i - 1, 3, new LiteralNode(result));
389
- i--;
390
- }
391
- i++;
392
- }
393
-
394
- }
395
- return nodesCopy[0].evaluate(context);
396
- };
397
- return ExpressionNode;
398
- }(EvaluationNode));
399
- var IdentifierNode = /** @class */ (function (_super) {
400
- __extends(IdentifierNode, _super);
401
- function IdentifierNode() {
402
- return _super !== null && _super.apply(this, arguments) || this;
403
- }
404
- IdentifierNode.prototype.evaluate = function (context) {
405
- return this.identifier;
406
- };
407
- return IdentifierNode;
408
- }(EvaluationNode));
409
- var IndexerNode = /** @class */ (function (_super) {
410
- __extends(IndexerNode, _super);
411
- function IndexerNode() {
412
- return _super !== null && _super.apply(this, arguments) || this;
413
- }
414
- IndexerNode.prototype.evaluate = function (context) {
415
- return this.index.evaluate(context);
416
- };
417
- return IndexerNode;
418
- }(EvaluationNode));
419
- var FunctionCallNode = /** @class */ (function (_super) {
420
- __extends(FunctionCallNode, _super);
421
- function FunctionCallNode() {
422
- var _this = _super !== null && _super.apply(this, arguments) || this;
423
- _this.functionName = null;
424
- _this.parameters = [];
425
- return _this;
426
- }
427
- FunctionCallNode.prototype.evaluate = function (context) {
428
- var callback = context.getFunction(this.functionName);
429
- if (callback != undefined) {
430
- var evaluatedParams = [];
431
- for (var _i = 0, _a = this.parameters; _i < _a.length; _i++) {
432
- var param = _a[_i];
433
- evaluatedParams.push(param.evaluate(context));
434
- }
435
- return callback.apply(void 0, evaluatedParams);
436
- }
437
- throw new Error("Undefined function: " + this.functionName);
438
- };
439
- return FunctionCallNode;
440
- }(EvaluationNode));
441
- var LiteralNode = /** @class */ (function (_super) {
442
- __extends(LiteralNode, _super);
443
- function LiteralNode(value) {
444
- var _this = _super.call(this) || this;
445
- _this.value = value;
446
- return _this;
447
- }
448
- LiteralNode.prototype.evaluate = function (context) {
449
- return this.value;
450
- };
451
- return LiteralNode;
452
- }(EvaluationNode));
453
- var OperatorNode = /** @class */ (function (_super) {
454
- __extends(OperatorNode, _super);
455
- function OperatorNode(operator) {
456
- var _this = _super.call(this) || this;
457
- _this.operator = operator;
458
- return _this;
459
- }
460
- OperatorNode.prototype.evaluate = function (context) {
461
- throw new Error("An operator cannot be evaluated on its own.");
462
- };
463
- return OperatorNode;
464
- }(EvaluationNode));
465
- var PathNode = /** @class */ (function (_super) {
466
- __extends(PathNode, _super);
467
- function PathNode() {
468
- var _this = _super !== null && _super.apply(this, arguments) || this;
469
- _this.parts = [];
470
- return _this;
471
- }
472
- PathNode.prototype.evaluate = function (context) {
473
- var result = undefined;
474
- var index = 0;
475
- while (index < this.parts.length) {
476
- var part = this.parts[index];
477
- try {
478
- if (part instanceof IdentifierNode && index == 0) {
479
- switch (part.identifier) {
480
- case "$root":
481
- result = context.$root;
482
- break;
483
- case "$data":
484
- result = context.currentDataContext;
485
- break;
486
- case "$index":
487
- result = context.$index;
488
- break;
489
- default:
490
- result = context.currentDataContext[part.identifier];
491
- break;
492
- }
493
- }
494
- else {
495
- var partValue = part.evaluate(context);
496
- if (index == 0) {
497
- result = partValue;
498
- }
499
- else {
500
- result = typeof partValue !== "boolean" ? result[partValue] : result[partValue.toString()];
501
- }
502
- }
503
- }
504
- catch (e) {
505
- return undefined;
506
- }
507
- index++;
508
- }
509
- return result;
510
- };
511
- return PathNode;
512
- }(EvaluationNode));
513
- var ExpressionParser = /** @class */ (function () {
514
- function ExpressionParser(tokens) {
515
- this._index = 0;
516
- this._tokens = tokens;
517
- }
518
- ExpressionParser.prototype.unexpectedToken = function () {
519
- throw new Error("Unexpected token " + this.current.value + " at position " + this.current.originalPosition + ".");
520
- };
521
- ExpressionParser.prototype.unexpectedEoe = function () {
522
- throw new Error("Unexpected end of expression.");
523
- };
524
- ExpressionParser.prototype.moveNext = function () {
525
- this._index++;
526
- };
527
- ExpressionParser.prototype.parseToken = function () {
528
- var expectedTokenTypes = [];
529
- for (var _i = 0; _i < arguments.length; _i++) {
530
- expectedTokenTypes[_i] = arguments[_i];
531
- }
532
- if (this.eoe) {
533
- this.unexpectedEoe();
534
- }
535
- var currentToken = this.current;
536
- if (expectedTokenTypes.indexOf(this.current.type) < 0) {
537
- this.unexpectedToken();
538
- }
539
- this.moveNext();
540
- return currentToken;
541
- };
542
- ExpressionParser.prototype.parseOptionalToken = function () {
543
- var expectedTokenTypes = [];
544
- for (var _i = 0; _i < arguments.length; _i++) {
545
- expectedTokenTypes[_i] = arguments[_i];
546
- }
547
- if (this.eoe) {
548
- this.unexpectedEoe();
549
- }
550
- else if (expectedTokenTypes.indexOf(this.current.type) < 0) {
551
- return false;
552
- }
553
- else {
554
- this.moveNext();
555
- return true;
556
- }
557
- };
558
- ExpressionParser.prototype.parseFunctionCall = function (functionName) {
559
- var result = new FunctionCallNode();
560
- result.functionName = functionName;
561
- this.parseToken("(");
562
- var firstParameter = this.parseExpression();
563
- var moreParameters = false;
564
- if (firstParameter) {
565
- result.parameters.push(firstParameter);
566
- do {
567
- moreParameters = this.parseOptionalToken(",");
568
- if (moreParameters) {
569
- var parameter = this.parseExpression();
570
- result.parameters.push(parameter);
571
- }
572
- } while (moreParameters);
573
- }
574
- this.parseToken(")");
575
- return result;
576
- };
577
- ExpressionParser.prototype.parseIdentifier = function () {
578
- var result = new IdentifierNode();
579
- result.identifier = this.current.value;
580
- this.moveNext();
581
- return result;
582
- };
583
- ExpressionParser.prototype.parseIndexer = function () {
584
- var result = new IndexerNode();
585
- this.parseToken("[");
586
- result.index = this.parseExpression();
587
- this.parseToken("]");
588
- return result;
589
- };
590
- ExpressionParser.prototype.parsePath = function () {
591
- var result = new PathNode();
592
- var expectedNextTokenTypes = ["identifier", "("];
593
- while (!this.eoe) {
594
- if (expectedNextTokenTypes.indexOf(this.current.type) < 0) {
595
- return result;
596
- }
597
- switch (this.current.type) {
598
- case "(":
599
- if (result.parts.length == 0) {
600
- this.moveNext();
601
- result.parts.push(this.parseExpression());
602
- this.parseToken(")");
603
- }
604
- else {
605
- var functionName = "";
606
- for (var _i = 0, _a = result.parts; _i < _a.length; _i++) {
607
- var part = _a[_i];
608
- if (!(part instanceof IdentifierNode)) {
609
- this.unexpectedToken();
610
- }
611
- if (functionName != "") {
612
- functionName += ".";
613
- }
614
- functionName += part.identifier;
615
- }
616
- result.parts = [];
617
- result.parts.push(this.parseFunctionCall(functionName));
618
- }
619
- expectedNextTokenTypes = [".", "["];
620
- break;
621
- case "[":
622
- result.parts.push(this.parseIndexer());
623
- expectedNextTokenTypes = [".", "(", "["];
624
- break;
625
- case "identifier":
626
- result.parts.push(this.parseIdentifier());
627
- expectedNextTokenTypes = [".", "(", "["];
628
- break;
629
- case ".":
630
- this.moveNext();
631
- expectedNextTokenTypes = ["identifier"];
632
- break;
633
- default:
634
- expectedNextTokenTypes = [];
635
- break;
636
- }
637
- }
638
- };
639
- ExpressionParser.prototype.parseExpression = function () {
640
- var result = new ExpressionNode();
641
- var expectedNextTokenTypes = literals.concat("(", "+", "-");
642
- while (!this.eoe) {
643
- if (expectedNextTokenTypes.indexOf(this.current.type) < 0) {
644
- if (result.nodes.length == 0) {
645
- this.unexpectedToken();
646
- }
647
- return result;
648
- }
649
- switch (this.current.type) {
650
- case "(":
651
- case "identifier":
652
- result.nodes.push(this.parsePath());
653
- expectedNextTokenTypes = orderedOperators;
654
- break;
655
- case "string":
656
- case "number":
657
- case "boolean":
658
- if (this.current.type == "string") {
659
- result.nodes.push(new LiteralNode(this.current.value));
660
- }
661
- else if (this.current.type == "number") {
662
- result.nodes.push(new LiteralNode(parseFloat(this.current.value)));
663
- }
664
- else {
665
- result.nodes.push(new LiteralNode(this.current.value === "true"));
666
- }
667
- this.moveNext();
668
- expectedNextTokenTypes = orderedOperators;
669
- break;
670
- case "-":
671
- if (result.nodes.length == 0) {
672
- result.nodes.push(new LiteralNode(-1));
673
- result.nodes.push(new OperatorNode("*"));
674
- expectedNextTokenTypes = ["identifier", "number", "("];
675
- }
676
- else {
677
- result.nodes.push(new OperatorNode(this.current.type));
678
- expectedNextTokenTypes = literals.concat("(");
679
- }
680
- this.moveNext();
681
- break;
682
- case "+":
683
- if (result.nodes.length == 0) {
684
- expectedNextTokenTypes = literals.concat("(");
685
- }
686
- else {
687
- result.nodes.push(new OperatorNode(this.current.type));
688
- expectedNextTokenTypes = literals.concat("(");
689
- }
690
- this.moveNext();
691
- break;
692
- case "*":
693
- case "/":
694
- case "==":
695
- case "!=":
696
- case "<":
697
- case "<=":
698
- case ">":
699
- case ">=":
700
- result.nodes.push(new OperatorNode(this.current.type));
701
- this.moveNext();
702
- expectedNextTokenTypes = literals.concat("(");
703
- break;
704
- default:
705
- expectedNextTokenTypes = [];
706
- break;
707
- }
708
- }
709
- };
710
- Object.defineProperty(ExpressionParser.prototype, "eoe", {
711
- get: function () {
712
- return this._index >= this._tokens.length;
713
- },
714
- enumerable: true,
715
- configurable: true
716
- });
717
- Object.defineProperty(ExpressionParser.prototype, "current", {
718
- get: function () {
719
- return this._tokens[this._index];
720
- },
721
- enumerable: true,
722
- configurable: true
723
- });
724
- ExpressionParser.parseBinding = function (bindingExpression) {
725
- var parser = new ExpressionParser(Tokenizer.parse(bindingExpression));
726
- parser.parseToken("{");
727
- var allowNull = !parser.parseOptionalToken("?#");
728
- var expression = parser.parseExpression();
729
- parser.parseToken("}");
730
- return new Binding(expression, allowNull);
731
- };
732
- return ExpressionParser;
733
- }());
734
- exports.ExpressionParser = ExpressionParser;
735
- var Binding = /** @class */ (function () {
736
- function Binding(expression, allowNull) {
737
- if (allowNull === void 0) { allowNull = true; }
738
- this.expression = expression;
739
- this.allowNull = allowNull;
740
- }
741
- Binding.prototype.evaluate = function (context) {
742
- return this.expression.evaluate(context);
743
- };
744
- return Binding;
745
- }());
746
- exports.Binding = Binding;
747
223
 
748
224
 
749
225
  /***/ }),
@@ -752,240 +228,472 @@ exports.Binding = Binding;
752
228
  /*!********************************!*\
753
229
  !*** ./src/template-engine.ts ***!
754
230
  \********************************/
755
- /*! no static exports found */
756
- /***/ (function(module, exports, __webpack_require__) {
231
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
757
232
 
758
- "use strict";
759
233
 
760
- Object.defineProperty(exports, "__esModule", { value: true });
234
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
235
+ exports.Template = exports.GlobalSettings = void 0;
761
236
  // Copyright (c) Microsoft Corporation. All rights reserved.
762
237
  // Licensed under the MIT License.
763
- var expression_parser_1 = __webpack_require__(/*! ./expression-parser */ "./src/expression-parser.ts");
764
- var TemplatizedString = /** @class */ (function () {
765
- function TemplatizedString() {
766
- this._parts = [];
767
- this._shouldDropOwner = false;
768
- }
769
- TemplatizedString.parse = function (s) {
770
- var result = new TemplatizedString();
771
- var i = 0;
772
- do {
773
- var expressionFound = false;
774
- var start = i;
775
- var loop = void 0;
776
- do {
777
- loop = false;
778
- start = s.indexOf("{", start);
779
- if (start >= 0) {
780
- if (start + 1 < s.length && s[start + 1] == "{") {
781
- start += 2;
782
- loop = true;
783
- }
784
- }
785
- } while (loop);
786
- if (start >= 0) {
787
- var end = s.indexOf("}", start);
788
- if (end >= 0) {
789
- expressionFound = true;
790
- if (start > i) {
791
- result._parts.push(s.substring(i, start));
792
- }
793
- var bindngExpression = s.substring(start, end + 1);
794
- var part = void 0;
795
- try {
796
- part = expression_parser_1.ExpressionParser.parseBinding(bindngExpression);
797
- }
798
- catch (e) {
799
- part = bindngExpression;
800
- }
801
- result._parts.push(part);
802
- i = end + 1;
803
- }
804
- }
805
- if (!expressionFound) {
806
- result._parts.push(s.substr(i));
807
- break;
808
- }
809
- } while (i < s.length);
810
- if (result._parts.length == 1 && typeof result._parts[0] === "string") {
811
- return result._parts[0];
812
- }
813
- else {
814
- return result;
815
- }
816
- };
817
- TemplatizedString.prototype.evalExpression = function (bindingExpression, context) {
818
- var result = bindingExpression.evaluate(context);
819
- if (result == undefined) {
820
- this._shouldDropOwner = this._shouldDropOwner || !bindingExpression.allowNull;
821
- }
822
- return result;
823
- };
824
- TemplatizedString.prototype.internalEvaluate = function (context) {
825
- if (this._parts.length == 0) {
826
- return undefined;
827
- }
828
- else if (this._parts.length == 1) {
829
- if (typeof this._parts[0] === "string") {
830
- return this._parts[0];
831
- }
832
- else {
833
- return this.evalExpression(this._parts[0], context);
834
- }
835
- }
836
- else {
837
- var s = "";
838
- for (var _i = 0, _a = this._parts; _i < _a.length; _i++) {
839
- var part = _a[_i];
840
- if (typeof part === "string") {
841
- s += part;
842
- }
843
- else {
844
- s += this.evalExpression(part, context);
845
- }
846
- }
847
- return s;
848
- }
849
- };
850
- TemplatizedString.prototype.evaluate = function (context) {
851
- this._shouldDropOwner = false;
852
- return this.internalEvaluate(context);
853
- };
854
- Object.defineProperty(TemplatizedString.prototype, "shouldDropOwner", {
855
- get: function () {
856
- return this._shouldDropOwner;
857
- },
858
- enumerable: true,
859
- configurable: true
860
- });
861
- return TemplatizedString;
238
+
239
+ var AEL = __webpack_require__(/*! adaptive-expressions */ "adaptive-expressions");
240
+ var EvaluationContext = /** @class */ (function () {
241
+ function EvaluationContext(context) {
242
+ this._stateStack = [];
243
+ if (context !== undefined) {
244
+ this.$root = context.$root;
245
+ }
246
+ }
247
+ EvaluationContext.prototype.isReservedField = function (name) {
248
+ return EvaluationContext._reservedFields.indexOf(name) >= 0;
249
+ };
250
+ EvaluationContext.prototype.saveState = function () {
251
+ this._stateStack.push({
252
+ $data: this.$data,
253
+ $index: this.$index
254
+ });
255
+ };
256
+ EvaluationContext.prototype.restoreLastState = function () {
257
+ if (this._stateStack.length === 0) {
258
+ throw new Error("There is no evaluation context state to restore.");
259
+ }
260
+ var savedContext = this._stateStack.pop();
261
+ this.$data = savedContext.$data;
262
+ this.$index = savedContext.$index;
263
+ };
264
+ Object.defineProperty(EvaluationContext.prototype, "$data", {
265
+ get: function () {
266
+ return this._$data !== undefined ? this._$data : this.$root;
267
+ },
268
+ set: function (value) {
269
+ this._$data = value;
270
+ },
271
+ enumerable: false,
272
+ configurable: true
273
+ });
274
+ EvaluationContext._reservedFields = ["$data", "$when", "$root", "$index"];
275
+ return EvaluationContext;
862
276
  }());
277
+ var TemplateObjectMemory = /** @class */ (function () {
278
+ function TemplateObjectMemory() {
279
+ this._memory = new AEL.SimpleObjectMemory(this);
280
+ }
281
+ TemplateObjectMemory.prototype.getValue = function (path) {
282
+ var actualPath = (path.length > 0 && path[0] !== "$") ? "$data." + path : path;
283
+ return this._memory.getValue(actualPath);
284
+ };
285
+ TemplateObjectMemory.prototype.setValue = function (path, input) {
286
+ this._memory.setValue(path, input);
287
+ };
288
+ TemplateObjectMemory.prototype.version = function () {
289
+ return this._memory.version();
290
+ };
291
+ return TemplateObjectMemory;
292
+ }());
293
+ /**
294
+ * Holds global settings that can be used to customize the way templates are expanded.
295
+ */
296
+ var GlobalSettings = /** @class */ (function () {
297
+ function GlobalSettings() {
298
+ }
299
+ /**
300
+ * Callback invoked when expression evaluation needs the value of a field in the source data object
301
+ * and that field is undefined or null. By default, expression evaluation will substitute an undefined
302
+ * field with its binding expression (e.g. `${field}`). This callback makes it possible to customize that
303
+ * behavior.
304
+ *
305
+ * **Example**
306
+ * Given this data object:
307
+ *
308
+ * ```json
309
+ * {
310
+ * firstName: "David"
311
+ * }
312
+ * ```
313
+ *
314
+ * The expression `${firstName} ${lastName}` will evaluate to "David ${lastName}" because the `lastName`
315
+ * field is undefined.
316
+ *
317
+ * Now let's set the callback:
318
+ * ```typescript
319
+ * GlobalSettings.getUndefinedFieldValueSubstitutionString = (path: string) => { return "<undefined value>"; }
320
+ * ```
321
+ *
322
+ * With that, the above expression will evaluate to "David &lt;undefined value&gt;"
323
+ */
324
+ GlobalSettings.getUndefinedFieldValueSubstitutionString = undefined;
325
+ return GlobalSettings;
326
+ }());
327
+ exports.GlobalSettings = GlobalSettings;
328
+ /**
329
+ * Represents a template that can be bound to data.
330
+ */
863
331
  var Template = /** @class */ (function () {
864
- function Template(payload) {
865
- this.preparedPayload = Template.prepare(payload);
866
- }
867
- Template.prepare = function (node) {
868
- if (typeof node === "string") {
869
- return TemplatizedString.parse(node);
870
- }
871
- else if (typeof node === "object" && node != null) {
872
- if (Array.isArray(node)) {
873
- var result = [];
874
- for (var _i = 0, node_1 = node; _i < node_1.length; _i++) {
875
- var item = node_1[_i];
876
- result.push(Template.prepare(item));
877
- }
878
- return result;
879
- }
880
- else {
881
- var keys = Object.keys(node);
882
- var result = {};
883
- for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
884
- var key = keys_1[_a];
885
- result[key] = Template.prepare(node[key]);
886
- }
887
- return result;
888
- }
889
- }
890
- else {
891
- return node;
892
- }
893
- };
894
- Template.prototype.expandSingleObject = function (node) {
895
- var result = {};
896
- var keys = Object.keys(node);
897
- for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {
898
- var key = keys_2[_i];
899
- if (!this._context.isReservedField(key)) {
900
- var value = this.internalExpand(node[key]);
901
- if (value != undefined) {
902
- result[key] = value;
903
- }
904
- }
905
- }
906
- return result;
907
- };
908
- Template.prototype.internalExpand = function (node) {
909
- var result;
910
- this._context.saveState();
911
- if (Array.isArray(node)) {
912
- var itemArray = [];
913
- for (var _i = 0, node_2 = node; _i < node_2.length; _i++) {
914
- var item = node_2[_i];
915
- var expandedItem = this.internalExpand(item);
916
- if (expandedItem != null) {
917
- if (Array.isArray(expandedItem)) {
918
- itemArray = itemArray.concat(expandedItem);
919
- }
920
- else {
921
- itemArray.push(expandedItem);
922
- }
923
- }
924
- }
925
- result = itemArray;
926
- }
927
- else if (node instanceof TemplatizedString) {
928
- result = node.evaluate(this._context);
929
- if (node.shouldDropOwner) {
930
- result = null;
931
- }
932
- }
933
- else if (typeof node === "object" && node != null) {
934
- var dropObject = false;
935
- var when = node["$when"];
936
- if (when instanceof TemplatizedString) {
937
- var whenValue = when.evaluate(this._context);
938
- if (typeof whenValue === "boolean") {
939
- dropObject = !whenValue;
940
- }
941
- }
942
- if (!dropObject) {
943
- var dataContext = node["$data"];
944
- if (dataContext != undefined) {
945
- if (dataContext instanceof TemplatizedString) {
946
- dataContext = dataContext.evaluate(this._context);
947
- }
948
- if (Array.isArray(dataContext)) {
949
- result = [];
950
- for (var i = 0; i < dataContext.length; i++) {
951
- this._context.$data = dataContext[i];
952
- this._context.$index = i;
953
- var expandedObject = this.expandSingleObject(node);
954
- if (expandedObject != null) {
955
- result.push(expandedObject);
956
- }
957
- }
958
- }
959
- else {
960
- this._context.$data = dataContext;
961
- result = this.expandSingleObject(node);
962
- }
963
- }
964
- else {
965
- result = this.expandSingleObject(node);
966
- }
967
- }
968
- else {
969
- result = null;
970
- }
971
- }
972
- else {
973
- result = node;
974
- }
975
- this._context.restoreLastState();
976
- return result;
977
- };
978
- Template.prototype.expand = function (context) {
979
- this._context = context;
980
- return this.internalExpand(this.preparedPayload);
981
- };
982
- return Template;
332
+ /**
333
+ * Initializes a new Template instance based on the provided payload.
334
+ * Once created, the instance can be bound to different data objects
335
+ * in a loop.
336
+ *
337
+ * @param payload The template payload.
338
+ */
339
+ function Template(payload) {
340
+ this._preparedPayload = Template.prepare(payload);
341
+ }
342
+ Template.prepare = function (node) {
343
+ if (typeof node === "string") {
344
+ return Template.parseInterpolatedString(node);
345
+ }
346
+ else if (typeof node === "object" && node !== null) {
347
+ if (Array.isArray(node)) {
348
+ var result = [];
349
+ for (var _i = 0, node_1 = node; _i < node_1.length; _i++) {
350
+ var item = node_1[_i];
351
+ result.push(Template.prepare(item));
352
+ }
353
+ return result;
354
+ }
355
+ else {
356
+ var keys = Object.keys(node);
357
+ var result = {};
358
+ for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
359
+ var key = keys_1[_a];
360
+ result[key] = Template.prepare(node[key]);
361
+ }
362
+ return result;
363
+ }
364
+ }
365
+ else {
366
+ return node;
367
+ }
368
+ };
369
+ Template.internalTryEvaluateExpression = function (expression, context, allowSubstitutions) {
370
+ var memory = new TemplateObjectMemory();
371
+ memory.$root = context.$root;
372
+ memory.$data = context.$data;
373
+ memory.$index = context.$index;
374
+ var options = undefined;
375
+ if (allowSubstitutions) {
376
+ options = new AEL.Options();
377
+ options.nullSubstitution = function (path) {
378
+ var substitutionValue = undefined;
379
+ if (GlobalSettings.getUndefinedFieldValueSubstitutionString) {
380
+ substitutionValue = GlobalSettings.getUndefinedFieldValueSubstitutionString(path);
381
+ }
382
+ return substitutionValue ? substitutionValue : "${" + path + "}";
383
+ };
384
+ }
385
+ // The root of an expression coming from an interpolated string is of type Concat.
386
+ // In that case, and if the caller allows it, we're doing our own concatenation
387
+ // in order to catch each individual expression evaluation error and substitute in
388
+ // the final string
389
+ if (expression.type === AEL.ExpressionType.Concat && allowSubstitutions) {
390
+ var result = "";
391
+ for (var _i = 0, _a = expression.children; _i < _a.length; _i++) {
392
+ var childExpression = _a[_i];
393
+ var evaluationResult = void 0;
394
+ try {
395
+ evaluationResult = childExpression.tryEvaluate(memory, options);
396
+ }
397
+ catch (ex) {
398
+ // We'll swallow all exceptions here
399
+ evaluationResult = {
400
+ value: undefined,
401
+ error: ex
402
+ };
403
+ }
404
+ if (evaluationResult.error) {
405
+ evaluationResult.value = "${" + childExpression.toString() + "}";
406
+ }
407
+ result += evaluationResult.value.toString();
408
+ }
409
+ return { value: result, error: undefined };
410
+ }
411
+ return expression.tryEvaluate(memory, options);
412
+ };
413
+ /**
414
+ * Parses an interpolated string into an Expression object ready to evaluate.
415
+ *
416
+ * @param interpolatedString The interpolated string to parse. Example: "Hello ${name}"
417
+ * @returns An Expression object if the provided interpolated string contained at least one expression (e.g. "${expression}"); the original string otherwise.
418
+ */
419
+ Template.parseInterpolatedString = function (interpolatedString) {
420
+ var lookup = function (type) {
421
+ var standardFunction = AEL.ExpressionFunctions.standardFunctions.get(type);
422
+ if (standardFunction) {
423
+ return standardFunction;
424
+ }
425
+ else {
426
+ return new AEL.ExpressionEvaluator(type, function (expression, state, options) { throw new Error("Unknown function " + type); }, AEL.ReturnType.String);
427
+ }
428
+ };
429
+ // If there is at least one expression start marker, let's attempt to convert into an expression
430
+ if (interpolatedString.indexOf("${") >= 0) {
431
+ var parsedExpression = AEL.Expression.parse("`" + interpolatedString + "`", lookup);
432
+ if (parsedExpression.type === "concat") {
433
+ if (parsedExpression.children.length === 1 && !(parsedExpression.children[0] instanceof AEL.Constant)) {
434
+ // The concat contains a single child that isn't a constant, thus the original
435
+ // string was a single expression. When evaluated, we want it to produce the type
436
+ // of that single expression
437
+ return parsedExpression.children[0];
438
+ }
439
+ else if (parsedExpression.children.length === 2) {
440
+ var firstChild = parsedExpression.children[0];
441
+ if (firstChild instanceof AEL.Constant && firstChild.value === "" && !(parsedExpression.children[1] instanceof AEL.Constant)) {
442
+ // The concat contains 2 children, and the first one is an empty string constant and the second isn't a constant.
443
+ // From version 4.10.3, AEL always inserts an empty string constant in all concat expression. Thus the original
444
+ // string was a single expression in this case as well. When evaluated, we want it to produce the type
445
+ // of that single expression.
446
+ return parsedExpression.children[1];
447
+ }
448
+ }
449
+ // Otherwise, we want the expression to produce a string
450
+ return parsedExpression;
451
+ }
452
+ }
453
+ // If the original string didn't contain any expression, return i as is
454
+ return interpolatedString;
455
+ };
456
+ /**
457
+ * Tries to evaluate the provided expression using the provided context.
458
+ *
459
+ * @param expression The expression to evaluate.
460
+ * @param context The context (data) used to evaluate the expression.
461
+ * @param allowSubstitutions Indicates if the expression evaluator should substitute undefined value with a default
462
+ * string or the value returned by the GlobalSettings.getUndefinedFieldValueSubstitutionString callback.
463
+ * @returns An object representing the result of the evaluation. If the evaluation succeeded, the value property
464
+ * contains the actual evaluation result, and the error property is undefined. If the evaluation fails, the error
465
+ * property contains a message detailing the error that occurred.
466
+ */
467
+ Template.tryEvaluateExpression = function (expression, context, allowSubstitutions) {
468
+ return Template.internalTryEvaluateExpression(expression, new EvaluationContext(context), allowSubstitutions);
469
+ };
470
+ Template.prototype.expandSingleObject = function (node) {
471
+ var result = {};
472
+ var keys = Object.keys(node);
473
+ for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {
474
+ var key = keys_2[_i];
475
+ if (!this._context.isReservedField(key)) {
476
+ var value = this.internalExpand(node[key]);
477
+ if (value !== undefined) {
478
+ result[key] = value;
479
+ }
480
+ }
481
+ }
482
+ return result;
483
+ };
484
+ Template.prototype.internalExpand = function (node) {
485
+ var result;
486
+ this._context.saveState();
487
+ if (Array.isArray(node)) {
488
+ var itemArray = [];
489
+ for (var _i = 0, node_2 = node; _i < node_2.length; _i++) {
490
+ var item = node_2[_i];
491
+ var expandedItem = this.internalExpand(item);
492
+ if (expandedItem !== null) {
493
+ if (Array.isArray(expandedItem)) {
494
+ itemArray = itemArray.concat(expandedItem);
495
+ }
496
+ else {
497
+ itemArray.push(expandedItem);
498
+ }
499
+ }
500
+ }
501
+ result = itemArray;
502
+ }
503
+ else if (node instanceof AEL.Expression) {
504
+ var evaluationResult = Template.internalTryEvaluateExpression(node, this._context, true);
505
+ if (!evaluationResult.error) {
506
+ result = evaluationResult.value;
507
+ }
508
+ else {
509
+ throw new Error(evaluationResult.error);
510
+ }
511
+ }
512
+ else if (typeof node === "object" && node !== null) {
513
+ var when = node["$when"];
514
+ var dataContext = node["$data"];
515
+ var dataContextIsArray = false;
516
+ var dataContexts = void 0;
517
+ if (dataContext === undefined) {
518
+ dataContexts = [undefined];
519
+ }
520
+ else {
521
+ if (dataContext instanceof AEL.Expression) {
522
+ var evaluationResult = Template.internalTryEvaluateExpression(dataContext, this._context, true);
523
+ if (!evaluationResult.error) {
524
+ dataContext = evaluationResult.value;
525
+ }
526
+ else {
527
+ throw new Error(evaluationResult.error);
528
+ }
529
+ }
530
+ if (Array.isArray(dataContext)) {
531
+ dataContexts = dataContext;
532
+ dataContextIsArray = true;
533
+ }
534
+ else {
535
+ dataContexts = [dataContext];
536
+ }
537
+ }
538
+ result = [];
539
+ for (var i = 0; i < dataContexts.length; i++) {
540
+ if (dataContextIsArray) {
541
+ this._context.$index = i;
542
+ }
543
+ if (dataContexts[i] !== undefined) {
544
+ this._context.$data = dataContexts[i];
545
+ }
546
+ var dropObject = false;
547
+ if (when instanceof AEL.Expression) {
548
+ var evaluationResult = Template.internalTryEvaluateExpression(when, this._context, false);
549
+ var whenValue = false;
550
+ // If $when fails to evaluate or evaluates to anything but a boolean, consider it is false
551
+ if (!evaluationResult.error) {
552
+ whenValue = typeof evaluationResult.value === "boolean" && evaluationResult.value;
553
+ }
554
+ dropObject = !whenValue;
555
+ }
556
+ if (!dropObject) {
557
+ var expandedObject = this.expandSingleObject(node);
558
+ if (expandedObject !== null) {
559
+ result.push(expandedObject);
560
+ }
561
+ }
562
+ }
563
+ if (result.length === 0) {
564
+ result = null;
565
+ }
566
+ else if (result.length === 1) {
567
+ result = result[0];
568
+ }
569
+ }
570
+ else {
571
+ result = node;
572
+ }
573
+ this._context.restoreLastState();
574
+ return result;
575
+ };
576
+ /**
577
+ * Expands the template using the provided context. Template expansion involves
578
+ * evaluating the expressions used in the original template payload, as well as
579
+ * repeating (expanding) parts of that payload that are bound to arrays.
580
+ *
581
+ * Example:
582
+ *
583
+ * ```typescript
584
+ * let context = {
585
+ * $root: {
586
+ * firstName: "John",
587
+ * lastName: "Doe",
588
+ * children: [
589
+ * { fullName: "Jane Doe", age: 9 },
590
+ * { fullName: "Alex Doe", age: 12 }
591
+ * ]
592
+ * }
593
+ * }
594
+ *
595
+ * let templatePayload = {
596
+ * type: "AdaptiveCard",
597
+ * version: "1.2",
598
+ * body: [
599
+ * {
600
+ * type: "TextBlock",
601
+ * text: "${firstName} ${lastName}"
602
+ * },
603
+ * {
604
+ * type: "TextBlock",
605
+ * $data: "${children}",
606
+ * text: "${fullName} (${age})"
607
+ * }
608
+ * ]
609
+ * }
610
+ *
611
+ * let template = new Template(templatePayload);
612
+ *
613
+ * let expandedTemplate = template.expand(context);
614
+ * ```
615
+ *
616
+ * With the above code, the value of `expandedTemplate` will be
617
+ *
618
+ * ```json
619
+ * {
620
+ * type: "AdaptiveCard",
621
+ * version: "1.2",
622
+ * body: [
623
+ * {
624
+ * type: "TextBlock",
625
+ * text: "John Doe"
626
+ * },
627
+ * {
628
+ * type: "TextBlock",
629
+ * text: "Jane Doe (9)"
630
+ * },
631
+ * {
632
+ * type: "TextBlock",
633
+ * text: "Alex Doe (12)"
634
+ * }
635
+ * ]
636
+ * }
637
+ * ```
638
+ *
639
+ * @param context The context to bind the template to.
640
+ * @returns A value representing the expanded template. The type of that value
641
+ * is dependent on the type of the original template payload passed to the constructor.
642
+ */
643
+ Template.prototype.expand = function (context) {
644
+ this._context = new EvaluationContext(context);
645
+ return this.internalExpand(this._preparedPayload);
646
+ };
647
+ return Template;
983
648
  }());
984
649
  exports.Template = Template;
650
+ /***/ }),
985
651
 
652
+ /***/ "adaptive-expressions":
653
+ /*!****************************************************************************************************!*\
654
+ !*** external {"commonjs2":"adaptive-expressions","commonjs":"adaptive-expressions","root":"AEL"} ***!
655
+ \****************************************************************************************************/
656
+ /***/ ((module) => {
657
+
658
+ module.exports = __WEBPACK_EXTERNAL_MODULE_adaptive_expressions__;
986
659
 
987
660
  /***/ })
988
661
 
989
- /******/ });
662
+ /******/ });
663
+ /************************************************************************/
664
+ /******/ // The module cache
665
+ /******/ var __webpack_module_cache__ = {};
666
+ /******/
667
+ /******/ // The require function
668
+ /******/ function __webpack_require__(moduleId) {
669
+ /******/ // Check if module is in cache
670
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
671
+ /******/ if (cachedModule !== undefined) {
672
+ /******/ return cachedModule.exports;
673
+ /******/ }
674
+ /******/ // Create a new module (and put it into the cache)
675
+ /******/ var module = __webpack_module_cache__[moduleId] = {
676
+ /******/ // no module.id needed
677
+ /******/ // no module.loaded needed
678
+ /******/ exports: {}
679
+ /******/ };
680
+ /******/
681
+ /******/ // Execute the module function
682
+ /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
683
+ /******/
684
+ /******/ // Return the exports of the module
685
+ /******/ return module.exports;
686
+ /******/ }
687
+ /******/
688
+ /************************************************************************/
689
+ /******/
690
+ /******/ // startup
691
+ /******/ // Load entry module and return exports
692
+ /******/ // This entry module is referenced by other modules so it can't be inlined
693
+ /******/ var __webpack_exports__ = __webpack_require__("./src/adaptivecards-templating.ts");
694
+ /******/
695
+ /******/ return __webpack_exports__;
696
+ /******/ })()
697
+ ;
990
698
  });
991
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BQ0RhdGEvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0FDRGF0YS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BQ0RhdGEvLi9zcmMvYWRhcHRpdmVjYXJkcy10ZW1wbGF0aW5nLnRzIiwid2VicGFjazovL0FDRGF0YS8uL3NyYy9leHByZXNzaW9uLXBhcnNlci50cyIsIndlYnBhY2s6Ly9BQ0RhdGEvLi9zcmMvdGVtcGxhdGUtZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsNERBQTREO0FBQzVELGtDQUFrQztBQUNsQyx1RkFBb0M7QUFDcEMsbUZBQWtDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDd0JsQyxJQUFNLGdCQUFnQixHQUFxQjtJQUN2QyxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsSUFBSTtJQUNKLElBQUk7SUFDSixHQUFHO0lBQ0gsSUFBSTtJQUNKLEdBQUc7SUFDSCxJQUFJO0NBQ1AsQ0FBQztBQUVGLElBQU0sUUFBUSxHQUFxQjtJQUMvQixZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0NBQ1osQ0FBQztBQWFGO0lBQUE7SUEwRUEsQ0FBQztJQXZFVSxjQUFJLEdBQVg7UUFDSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDaEIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDdEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFDbEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFDL0MsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFDaEQsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDaEMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDakMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDakMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDakMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDakMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDL0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFDNUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFDNUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FDL0M7SUFDTCxDQUFDO0lBRU0sZUFBSyxHQUFaLFVBQWEsVUFBa0I7UUFDM0IsSUFBSSxNQUFNLEdBQVksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVWLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDMUIsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFF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Q0FBQyxDQUFDO2lCQUMxQzthQUNKO2lCQUNJO2dCQUNELE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDakI7U0FDSjthQUNJO1lBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVqQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBUUQseUJBQU0sR0FBTixVQUFPLE9BQTBCO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXhCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQUFDO0FBcEpZLDRCQUFRIiwiZmlsZSI6ImFkYXB0aXZlY2FyZHMtdGVtcGxhdGluZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkFDRGF0YVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJBQ0RhdGFcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2FkYXB0aXZlY2FyZHMtdGVtcGxhdGluZy50c1wiKTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbmV4cG9ydCAqIGZyb20gXCIuL2V4cHJlc3Npb24tcGFyc2VyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlLWVuZ2luZVwiOyIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbnR5cGUgVG9rZW5UeXBlID1cclxuICAgIFwie1wiIHxcclxuICAgIFwiPyNcIiB8XHJcbiAgICBcIn1cIiB8XHJcbiAgICBcIltcIiB8XHJcbiAgICBcIl1cIiB8XHJcbiAgICBcIihcIiB8XHJcbiAgICBcIilcIiB8XHJcbiAgICBcImlkZW50aWZpZXJcIiB8XHJcbiAgICBcIi5cIiB8XHJcbiAgICBcIixcIiB8XHJcbiAgICBcIitcIiB8XHJcbiAgICBcIi1cIiB8XHJcbiAgICBcIipcIiB8XHJcbiAgICBcIi9cIiB8XHJcbiAgICBcIj09XCIgfFxyXG4gICAgXCIhPVwiIHxcclxuICAgIFwiPFwiIHxcclxuICAgIFwiPD1cIiB8XHJcbiAgICBcIj5cIiB8XHJcbiAgICBcIj49XCIgfFxyXG4gICAgXCJzdHJpbmdcIiB8XHJcbiAgICBcIm51bWJlclwiIHxcclxuICAgIFwiYm9vbGVhblwiO1xyXG5cclxuY29uc3Qgb3JkZXJlZE9wZXJhdG9yczogQXJyYXk8VG9rZW5UeXBlPiA9IFtcclxuICAgIFwiL1wiLFxyXG4gICAgXCIqXCIsXHJcbiAgICBcIi1cIixcclxuICAgIFwiK1wiLFxyXG4gICAgXCI9PVwiLFxyXG4gICAgXCIhPVwiLFxyXG4gICAgXCI8XCIsXHJcbiAgICBcIjw9XCIsXHJcbiAgICBcIj5cIixcclxuICAgIFwiPj1cIlxyXG5dO1xyXG5cclxuY29uc3QgbGl0ZXJhbHM6IEFycmF5PFRva2VuVHlwZT4gPSBbXHJcbiAgICBcImlkZW50aWZpZXJcIixcclxuICAgIFwic3RyaW5nXCIsXHJcbiAgICBcIm51bWJlclwiLFxyXG4gICAgXCJib29sZWFuXCJcclxuXTtcclxuXHJcbmludGVyZmFjZSBUb2tlbml6ZXJSdWxlIHtcclxuICAgIHRva2VuVHlwZTogVG9rZW5UeXBlO1xyXG4gICAgcmVnRXg6IFJlZ0V4cDtcclxufVxyXG5cclxuaW50ZXJmYWNlIFRva2VuIHtcclxuICAgIHR5cGU6IFRva2VuVHlwZTtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICBvcmlnaW5hbFBvc2l0aW9uOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIFRva2VuaXplciB7XHJcbiAgICBzdGF0aWMgcnVsZXM6IEFycmF5PFRva2VuaXplclJ1bGU+ID0gW107XHJcblxyXG4gICAgc3RhdGljIGluaXQoKSB7XHJcbiAgICAgICAgVG9rZW5pemVyLnJ1bGVzLnB1c2goXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiB1bmRlZmluZWQsIHJlZ0V4OiAvXlxccy8gfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwie1wiLCByZWdFeDogL157LyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCI/I1wiLCByZWdFeDogL15cXD8jLyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCJ9XCIsIHJlZ0V4OiAvXn0vIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIltcIiwgcmVnRXg6IC9eXFxbLyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCJdXCIsIHJlZ0V4OiAvXlxcXS8gfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwiKFwiLCByZWdFeDogL15cXCgvIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIilcIiwgcmVnRXg6IC9eXFwpLyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCJib29sZWFuXCIsIHJlZ0V4OiAvXnRydWV8XmZhbHNlLyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCJpZGVudGlmaWVyXCIsIHJlZ0V4OiAvXlskYS16X10rL2kgfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwiLlwiLCByZWdFeDogL15cXC4vIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIixcIiwgcmVnRXg6IC9eLC8gfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwiK1wiLCByZWdFeDogL15cXCsvIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIi1cIiwgcmVnRXg6IC9eLS8gfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwiKlwiLCByZWdFeDogL15cXCovIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIi9cIiwgcmVnRXg6IC9eXFwvLyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCI9PVwiLCByZWdFeDogL149PS8gfSxcclxuICAgICAgICAgICAgeyB0b2tlblR5cGU6IFwiIT1cIiwgcmVnRXg6IC9eIT0vIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIjw9XCIsIHJlZ0V4OiAvXjw9LyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCI8XCIsIHJlZ0V4OiAvXjwvIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIj49XCIsIHJlZ0V4OiAvXj49LyB9LFxyXG4gICAgICAgICAgICB7IHRva2VuVHlwZTogXCI+XCIsIHJlZ0V4OiAvXj4vIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcInN0cmluZ1wiLCByZWdFeDogL15cIihbXlwiXSopXCIvIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcInN0cmluZ1wiLCByZWdFeDogL14nKFteJ10qKScvIH0sXHJcbiAgICAgICAgICAgIHsgdG9rZW5UeXBlOiBcIm51bWJlclwiLCByZWdFeDogL15cXGQqXFwuP1xcZCsvIH1cclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHBhcnNlKGV4cHJlc3Npb246IHN0cmluZyk6IFRva2VuW10ge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IFRva2VuW10gPSBbXTtcclxuICAgICAgICBsZXQgaSA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChpIDwgZXhwcmVzc2lvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHN1YkV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZyhpKTtcclxuICAgICAgICAgICAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHJ1bGUgb2YgVG9rZW5pemVyLnJ1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IHJ1bGUucmVnRXguZXhlYyhzdWJFeHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB0b2tlbml6ZXIgcnVsZSBtYXRjaGVkIG1vcmUgdGhhbiBvbmUgZ3JvdXAuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudG9rZW5UeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBydWxlLnRva2VuVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCA9PSAxID8gMCA6IDFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb246IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaSArPSBtYXRjaGVzWzBdLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIFwiICsgc3ViRXhwcmVzc2lvblswXSArIFwiIGF0IHBvc2l0aW9uIFwiICsgaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcblRva2VuaXplci5pbml0KCk7XHJcblxyXG50eXBlIExpdGVyYWxWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XHJcblxyXG5mdW5jdGlvbiBlbnN1cmVWYWx1ZVR5cGUodmFsdWU6IGFueSk6IExpdGVyYWxWYWx1ZSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgdHlwZTogXCIgKyB0eXBlb2YgdmFsdWUpO1xyXG59XHJcblxyXG50eXBlIEZ1bmN0aW9uQ2FsbGJhY2sgPSAoLi4ucGFyYW1zOiBhbnlbXSkgPT4gYW55O1xyXG50eXBlIEZ1bmN0aW9uRGljdGlvbmFyeSA9IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb25DYWxsYmFjayB9O1xyXG5cclxuaW50ZXJmYWNlIEV2YWx1YXRpb25Db250ZXh0U3RhdGUge1xyXG4gICAgJGRhdGE6IGFueTtcclxuICAgICRpbmRleDogYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX3Jlc2VydmVkRmllbGRzID0gW1wiJGRhdGFcIiwgXCIkcm9vdFwiLCBcIiRpbmRleFwiXTtcclxuICAgIHByaXZhdGUgc3RhdGljIF9idWlsdEluRnVuY3Rpb25zOiBGdW5jdGlvbkRpY3Rpb25hcnkgPSB7fVxyXG5cclxuICAgIHN0YXRpYyBpbml0KCkge1xyXG4gICAgICAgIEV2YWx1YXRpb25Db250ZXh0Ll9idWlsdEluRnVuY3Rpb25zW1wic3Vic3RyXCJdID0gKHMsIGluZGV4LCBjb3VudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBjb3VudCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChzLnN1YnN0cihpbmRleCwgY291bnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBFdmFsdWF0aW9uQ29udGV4dC5fYnVpbHRJbkZ1bmN0aW9uc1tcIkpTT04ucGFyc2VcIl0gPSAoaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaW5wdXQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRXZhbHVhdGlvbkNvbnRleHQuX2J1aWx0SW5GdW5jdGlvbnNbXCJpZlwiXSA9IChjb25kaXRpb24sIGlmVHJ1ZSwgaWZGYWxzZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uID8gaWZUcnVlIDogaWZGYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIEV2YWx1YXRpb25Db250ZXh0Ll9idWlsdEluRnVuY3Rpb25zW1widG9VcHBlclwiXSA9IChpbnB1dCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gaW5wdXQudG9VcHBlckNhc2UoKSA6IGlucHV0O1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRXZhbHVhdGlvbkNvbnRleHQuX2J1aWx0SW5GdW5jdGlvbnNbXCJ0b0xvd2VyXCJdID0gKGlucHV0KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIgPyBpbnB1dC50b0xvd2VyQ2FzZSgpIDogaW5wdXQ7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBFdmFsdWF0aW9uQ29udGV4dC5fYnVpbHRJbkZ1bmN0aW9uc1tcIkRhdGUuZm9ybWF0XCJdID0gKGlucHV0LCBmb3JtYXQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRGb3JtYXRzID0gWyBcImxvbmdcIiwgXCJzaG9ydFwiLCBcImNvbXBhY3RcIiBdO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlucHV0QXNOdW1iZXI6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0QXNOdW1iZXIgPSBEYXRlLnBhcnNlKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0QXNOdW1iZXIgPSBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShpbnB1dEFzTnVtYmVyKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBlZmZlY3RpdmVGb3JtYXQ6IHN0cmluZyA9IFwiY29tcGFjdFwiO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhY2NlcHRlZEZvcm1hdHMuaW5kZXhPZihlZmZlY3RpdmVGb3JtYXQpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZvcm1hdCA9IFwiY29tcGFjdFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZWZmZWN0aXZlRm9ybWF0ID09PSBcImNvbXBhY3RcIiA/IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHsgZGF5OiBcIm51bWVyaWNcIiwgd2Vla2RheTogZWZmZWN0aXZlRm9ybWF0LCBtb250aDogZWZmZWN0aXZlRm9ybWF0LCB5ZWFyOiBcIm51bWVyaWNcIiB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIEV2YWx1YXRpb25Db250ZXh0Ll9idWlsdEluRnVuY3Rpb25zW1wiVGltZS5mb3JtYXRcIl0gPSAoaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlucHV0QXNOdW1iZXI6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0QXNOdW1iZXIgPSBEYXRlLnBhcnNlKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0QXNOdW1iZXIgPSBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShpbnB1dEFzTnVtYmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyh1bmRlZmluZWQsIHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Z1bmN0aW9ucyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBfc3RhdGVTdGFjazogRXZhbHVhdGlvbkNvbnRleHRTdGF0ZVtdID0gW107XHJcblxyXG4gICAgJHJvb3Q6IGFueTtcclxuICAgICRkYXRhOiBhbnk7XHJcbiAgICAkaW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICByZWdpc3RlckZ1bmN0aW9uKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uQ2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLl9mdW5jdGlvbnNbbmFtZV0gPSBjYWxsYmFjaztcclxuICAgIH1cclxuXHJcbiAgICB1bnJlZ2lzdGVyRnVuY3Rpb24obmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2Z1bmN0aW9uc1tuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGdW5jdGlvbihuYW1lOiBzdHJpbmcpOiBGdW5jdGlvbkNhbGxiYWNrIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fZnVuY3Rpb25zW25hbWVdO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBFdmFsdWF0aW9uQ29udGV4dC5fYnVpbHRJbkZ1bmN0aW9uc1tuYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaXNSZXNlcnZlZEZpZWxkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBFdmFsdWF0aW9uQ29udGV4dC5fcmVzZXJ2ZWRGaWVsZHMuaW5kZXhPZihuYW1lKSA+PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLl9zdGF0ZVN0YWNrLnB1c2goeyAkZGF0YTogdGhpcy4kZGF0YSwgJGluZGV4OiB0aGlzLiRpbmRleCB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlTGFzdFN0YXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZVN0YWNrLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIGV2YWx1YXRpb24gY29udGV4dCBzdGF0ZSB0byByZXN0b3JlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzYXZlZENvbnRleHQgPSB0aGlzLl9zdGF0ZVN0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICB0aGlzLiRkYXRhID0gc2F2ZWRDb250ZXh0LiRkYXRhO1xyXG4gICAgICAgIHRoaXMuJGluZGV4ID0gc2F2ZWRDb250ZXh0LiRpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudERhdGFDb250ZXh0KCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJGRhdGEgIT0gdW5kZWZpbmVkID8gdGhpcy4kZGF0YSA6IHRoaXMuJHJvb3Q7XHJcbiAgICB9XHJcbn1cclxuXHJcbkV2YWx1YXRpb25Db250ZXh0LmluaXQoKTtcclxuXHJcbmFic3RyYWN0IGNsYXNzIEV2YWx1YXRpb25Ob2RlIHtcclxuICAgIGFic3RyYWN0IGV2YWx1YXRlKGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0KTogTGl0ZXJhbFZhbHVlO1xyXG59XHJcblxyXG5jbGFzcyBFeHByZXNzaW9uTm9kZSBleHRlbmRzIEV2YWx1YXRpb25Ob2RlIHtcclxuICAgIG5vZGVzOiBBcnJheTxFdmFsdWF0aW9uTm9kZT4gPSBbXTtcclxuICAgIGFsbG93TnVsbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgZXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IG9wZXJhdG9yUHJpb3JpdHlHcm91cHMgPSBbXHJcbiAgICAgICAgICAgIFtcIi9cIiwgXCIqXCJdLFxyXG4gICAgICAgICAgICBbXCItXCIsIFwiK1wiXSxcclxuICAgICAgICAgICAgW1wiPT1cIiwgXCIhPVwiLCBcIjxcIiwgXCI8PVwiLCBcIj5cIiwgXCI+PVwiXVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCBub2Rlc0NvcHkgPSB0aGlzLm5vZGVzO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcmlvcml0eUdyb3VwIG9mIG9wZXJhdG9yUHJpb3JpdHlHcm91cHMpIHtcclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBub2Rlc0NvcHkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzQ29weVtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE9wZXJhdG9yTm9kZSAmJiBwcmlvcml0eUdyb3VwLmluZGV4T2Yobm9kZS5vcGVyYXRvcikgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gZW5zdXJlVmFsdWVUeXBlKG5vZGVzQ29weVtpIC0gMV0uZXZhbHVhdGUoY29udGV4dCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByaWdodCA9IGVuc3VyZVZhbHVlVHlwZShub2Rlc0NvcHlbaSArIDFdLmV2YWx1YXRlKGNvbnRleHQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ICE9PSB0eXBlb2YgcmlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb21wYXRpYmxlIG9wZXJhbmRzIFwiICsgbGVmdCArIFwiIGFuZCBcIiArIHJpZ2h0ICsgXCIgZm9yIG9wZXJhdG9yIFwiICsgbm9kZS5vcGVyYXRvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBMaXRlcmFsVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgcmlnaHQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wZXJhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiL1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlZnQgLyByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIqXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCAqIHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIi1cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsZWZ0IC0gcmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiK1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxlZnQgKyByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByaWdodCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIrXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCArIHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj09XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsZWZ0ID09IHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIhPVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCAhPSByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCA8IHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8PVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCA8PSByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCA+IHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+PVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVmdCA+PSByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2Rlc0NvcHkuc3BsaWNlKGkgLSAxLCAzLCBuZXcgTGl0ZXJhbE5vZGUocmVzdWx0KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm9kZXNDb3B5WzBdLmV2YWx1YXRlKGNvbnRleHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBJZGVudGlmaWVyTm9kZSBleHRlbmRzIEV2YWx1YXRpb25Ob2RlIHtcclxuICAgIGlkZW50aWZpZXI6IHN0cmluZztcclxuXHJcbiAgICBldmFsdWF0ZShjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dCk6IExpdGVyYWxWYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllcjtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgSW5kZXhlck5vZGUgZXh0ZW5kcyBFdmFsdWF0aW9uTm9kZSB7XHJcbiAgICBpbmRleDogRXhwcmVzc2lvbk5vZGU7XHJcblxyXG4gICAgZXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBMaXRlcmFsVmFsdWUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LmV2YWx1YXRlKGNvbnRleHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBGdW5jdGlvbkNhbGxOb2RlIGV4dGVuZHMgRXZhbHVhdGlvbk5vZGUge1xyXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcGFyYW1ldGVyczogQXJyYXk8RXhwcmVzc2lvbk5vZGU+ID0gW107XHJcblxyXG4gICAgZXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBMaXRlcmFsVmFsdWUge1xyXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGNvbnRleHQuZ2V0RnVuY3Rpb24odGhpcy5mdW5jdGlvbk5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoY2FsbGJhY2sgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBldmFsdWF0ZWRQYXJhbXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xyXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVkUGFyYW1zLnB1c2gocGFyYW0uZXZhbHVhdGUoY29udGV4dCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soLi4uZXZhbHVhdGVkUGFyYW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZGVmaW5lZCBmdW5jdGlvbjogXCIgKyB0aGlzLmZ1bmN0aW9uTmFtZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIExpdGVyYWxOb2RlIGV4dGVuZHMgRXZhbHVhdGlvbk5vZGUge1xyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgdmFsdWU6IExpdGVyYWxWYWx1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBMaXRlcmFsVmFsdWUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBPcGVyYXRvck5vZGUgZXh0ZW5kcyBFdmFsdWF0aW9uTm9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBvcGVyYXRvcjogVG9rZW5UeXBlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBldmFsdWF0ZShjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dCk6IExpdGVyYWxWYWx1ZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gb3BlcmF0b3IgY2Fubm90IGJlIGV2YWx1YXRlZCBvbiBpdHMgb3duLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxudHlwZSBQYXRoUGFydCA9IEV4cHJlc3Npb25Ob2RlIHwgSWRlbnRpZmllck5vZGUgfCBJbmRleGVyTm9kZSB8IEZ1bmN0aW9uQ2FsbE5vZGU7XHJcblxyXG5jbGFzcyBQYXRoTm9kZSBleHRlbmRzIEV2YWx1YXRpb25Ob2RlIHtcclxuICAgIHBhcnRzOiBQYXRoUGFydFtdID0gW107XHJcblxyXG4gICAgZXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBMaXRlcmFsVmFsdWUge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG5cclxuICAgICAgICB3aGlsZSAoaW5kZXggPCB0aGlzLnBhcnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgcGFydCA9IHRoaXMucGFydHNbaW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSWRlbnRpZmllck5vZGUgJiYgaW5kZXggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGFydC5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIkcm9vdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGV4dC4kcm9vdDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiRkYXRhXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250ZXh0LmN1cnJlbnREYXRhQ29udGV4dDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiRpbmRleFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGV4dC4kaW5kZXg7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250ZXh0LmN1cnJlbnREYXRhQ29udGV4dFtwYXJ0LmlkZW50aWZpZXJdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0VmFsdWUgPSBwYXJ0LmV2YWx1YXRlKGNvbnRleHQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJ0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0eXBlb2YgcGFydFZhbHVlICE9PSBcImJvb2xlYW5cIiA/IHJlc3VsdFtwYXJ0VmFsdWVdIDogcmVzdWx0W3BhcnRWYWx1ZS50b1N0cmluZygpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblBhcnNlciB7XHJcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX3Rva2VuczogVG9rZW5bXTtcclxuXHJcbiAgICBwcml2YXRlIHVuZXhwZWN0ZWRUb2tlbigpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuIFwiICsgdGhpcy5jdXJyZW50LnZhbHVlICsgXCIgYXQgcG9zaXRpb24gXCIgKyB0aGlzLmN1cnJlbnQub3JpZ2luYWxQb3NpdGlvbiArIFwiLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuZXhwZWN0ZWRFb2UoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3ZlTmV4dCgpIHtcclxuICAgICAgICB0aGlzLl9pbmRleCsrO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VUb2tlbiguLi5leHBlY3RlZFRva2VuVHlwZXM6IFRva2VuVHlwZVtdKTogVG9rZW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmVvZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFb2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50VG9rZW4gPSB0aGlzLmN1cnJlbnQ7XHJcblxyXG4gICAgICAgIGlmIChleHBlY3RlZFRva2VuVHlwZXMuaW5kZXhPZih0aGlzLmN1cnJlbnQudHlwZSkgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZFRva2VuKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVOZXh0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50VG9rZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXJzZU9wdGlvbmFsVG9rZW4oLi4uZXhwZWN0ZWRUb2tlblR5cGVzOiBUb2tlblR5cGVbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmVvZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFb2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXhwZWN0ZWRUb2tlblR5cGVzLmluZGV4T2YodGhpcy5jdXJyZW50LnR5cGUpIDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVOZXh0KCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXJzZUZ1bmN0aW9uQ2FsbChmdW5jdGlvbk5hbWU6IHN0cmluZyk6IEZ1bmN0aW9uQ2FsbE5vZGUge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgRnVuY3Rpb25DYWxsTm9kZSgpO1xyXG4gICAgICAgIHJlc3VsdC5mdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMucGFyc2VUb2tlbihcIihcIik7XHJcblxyXG4gICAgICAgIGxldCBmaXJzdFBhcmFtZXRlciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XHJcbiAgICAgICAgbGV0IG1vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChmaXJzdFBhcmFtZXRlcikge1xyXG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycy5wdXNoKGZpcnN0UGFyYW1ldGVyKTtcclxuXHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIG1vcmVQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZU9wdGlvbmFsVG9rZW4oXCIsXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtb3JlUGFyYW1ldGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKG1vcmVQYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyc2VUb2tlbihcIilcIik7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXJzZUlkZW50aWZpZXIoKTogSWRlbnRpZmllck5vZGUge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgSWRlbnRpZmllck5vZGUoKTtcclxuXHJcbiAgICAgICAgcmVzdWx0LmlkZW50aWZpZXIgPSB0aGlzLmN1cnJlbnQudmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhcnNlSW5kZXhlcigpOiBJbmRleGVyTm9kZSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJbmRleGVyTm9kZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcnNlVG9rZW4oXCJbXCIpO1xyXG5cclxuICAgICAgICByZXN1bHQuaW5kZXggPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcnNlVG9rZW4oXCJdXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VQYXRoKCk6IFBhdGhOb2RlIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFBhdGhOb2RlKCk7XHJcblxyXG4gICAgICAgIGxldCBleHBlY3RlZE5leHRUb2tlblR5cGVzOiBUb2tlblR5cGVbXSA9IFtcImlkZW50aWZpZXJcIiwgXCIoXCJdO1xyXG5cclxuICAgICAgICB3aGlsZSAoIXRoaXMuZW9lKSB7XHJcbiAgICAgICAgICAgIGlmIChleHBlY3RlZE5leHRUb2tlblR5cGVzLmluZGV4T2YodGhpcy5jdXJyZW50LnR5cGUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIihcIjpcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnBhcnRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFydHMucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlVG9rZW4oXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcmVzdWx0LnBhcnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwYXJ0IGluc3RhbmNlb2YgSWRlbnRpZmllck5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUgKz0gXCIuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lICs9ICg8SWRlbnRpZmllck5vZGU+cGFydCkuaWRlbnRpZmllcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcnRzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFydHMucHVzaCh0aGlzLnBhcnNlRnVuY3Rpb25DYWxsKGZ1bmN0aW9uTmFtZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IFtcIi5cIiwgXCJbXCJdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJbXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcnRzLnB1c2godGhpcy5wYXJzZUluZGV4ZXIoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTmV4dFRva2VuVHlwZXMgPSBbXCIuXCIsIFwiKFwiLCBcIltcIl07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImlkZW50aWZpZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFydHMucHVzaCh0aGlzLnBhcnNlSWRlbnRpZmllcigpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IFtcIi5cIiwgXCIoXCIsIFwiW1wiXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiLlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IFtcImlkZW50aWZpZXJcIl07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5leHRUb2tlblR5cGVzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VFeHByZXNzaW9uKCk6IEV4cHJlc3Npb25Ob2RlIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBFeHByZXNzaW9uTm9kZSA9IG5ldyBFeHByZXNzaW9uTm9kZSgpO1xyXG5cclxuICAgICAgICBsZXQgZXhwZWN0ZWROZXh0VG9rZW5UeXBlczogVG9rZW5UeXBlW10gPSBsaXRlcmFscy5jb25jYXQoXCIoXCIsIFwiK1wiLCBcIi1cIik7XHJcblxyXG4gICAgICAgIHdoaWxlICghdGhpcy5lb2UpIHtcclxuICAgICAgICAgICAgaWYgKGV4cGVjdGVkTmV4dFRva2VuVHlwZXMuaW5kZXhPZih0aGlzLmN1cnJlbnQudHlwZSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm5vZGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY3VycmVudC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiKFwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImlkZW50aWZpZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQubm9kZXMucHVzaCh0aGlzLnBhcnNlUGF0aCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IG9yZGVyZWRPcGVyYXRvcnM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50LnR5cGUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubm9kZXMucHVzaChuZXcgTGl0ZXJhbE5vZGUodGhpcy5jdXJyZW50LnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudC50eXBlID09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5vZGVzLnB1c2gobmV3IExpdGVyYWxOb2RlKHBhcnNlRmxvYXQodGhpcy5jdXJyZW50LnZhbHVlKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5vZGVzLnB1c2gobmV3IExpdGVyYWxOb2RlKHRoaXMuY3VycmVudC52YWx1ZSA9PT0gXCJ0cnVlXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IG9yZGVyZWRPcGVyYXRvcnM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIi1cIjpcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm5vZGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ub2Rlcy5wdXNoKG5ldyBMaXRlcmFsTm9kZSgtMSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubm9kZXMucHVzaChuZXcgT3BlcmF0b3JOb2RlKFwiKlwiKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5leHRUb2tlblR5cGVzID0gW1wiaWRlbnRpZmllclwiLCBcIm51bWJlclwiLCBcIihcIl07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubm9kZXMucHVzaChuZXcgT3BlcmF0b3JOb2RlKHRoaXMuY3VycmVudC50eXBlKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5leHRUb2tlblR5cGVzID0gbGl0ZXJhbHMuY29uY2F0KFwiKFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiK1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubm9kZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IGxpdGVyYWxzLmNvbmNhdChcIihcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubm9kZXMucHVzaChuZXcgT3BlcmF0b3JOb2RlKHRoaXMuY3VycmVudC50eXBlKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5leHRUb2tlblR5cGVzID0gbGl0ZXJhbHMuY29uY2F0KFwiKFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZU5leHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiKlwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIi9cIjpcclxuICAgICAgICAgICAgICAgIGNhc2UgXCI9PVwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIiE9XCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiPFwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIjw9XCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiPlwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIj49XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm5vZGVzLnB1c2gobmV3IE9wZXJhdG9yTm9kZSh0aGlzLmN1cnJlbnQudHlwZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVOZXh0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTmV4dFRva2VuVHlwZXMgPSBsaXRlcmFscy5jb25jYXQoXCIoXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROZXh0VG9rZW5UeXBlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldCBlb2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4ID49IHRoaXMuX3Rva2Vucy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgY3VycmVudCgpOiBUb2tlbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2Vuc1t0aGlzLl9pbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHBhcnNlQmluZGluZyhiaW5kaW5nRXhwcmVzc2lvbjogc3RyaW5nKTogQmluZGluZyB7XHJcbiAgICAgICAgbGV0IHBhcnNlciA9IG5ldyBFeHByZXNzaW9uUGFyc2VyKFRva2VuaXplci5wYXJzZShiaW5kaW5nRXhwcmVzc2lvbikpO1xyXG4gICAgICAgIHBhcnNlci5wYXJzZVRva2VuKFwie1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGFsbG93TnVsbCA9ICFwYXJzZXIucGFyc2VPcHRpb25hbFRva2VuKFwiPyNcIik7XHJcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICAgIHBhcnNlci5wYXJzZVRva2VuKFwifVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nKGV4cHJlc3Npb24sIGFsbG93TnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IodG9rZW5zOiBUb2tlbltdKSB7XHJcbiAgICAgICAgdGhpcy5fdG9rZW5zID0gdG9rZW5zO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQmluZGluZyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV4cHJlc3Npb246IEV2YWx1YXRpb25Ob2RlLCByZWFkb25seSBhbGxvd051bGw6IGJvb2xlYW4gPSB0cnVlKSB7fVxyXG5cclxuICAgIGV2YWx1YXRlKGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0KTogTGl0ZXJhbFZhbHVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpO1xyXG4gICAgfVxyXG59IiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuaW1wb3J0IHsgQmluZGluZywgRXhwcmVzc2lvblBhcnNlciwgRXZhbHVhdGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leHByZXNzaW9uLXBhcnNlclwiO1xyXG5cclxuY2xhc3MgVGVtcGxhdGl6ZWRTdHJpbmcge1xyXG4gICAgcHJpdmF0ZSBfcGFydHM6IEFycmF5PHN0cmluZyB8IEJpbmRpbmc+ID0gW107XHJcblxyXG4gICAgc3RhdGljIHBhcnNlKHM6IHN0cmluZyk6IHN0cmluZyB8IFRlbXBsYXRpemVkU3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRlbXBsYXRpemVkU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG5cclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIGxldCBleHByZXNzaW9uRm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgbGV0IGxvb3A7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBsb29wID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzLmluZGV4T2YoXCJ7XCIsIHN0YXJ0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCArIDEgPCBzLmxlbmd0aCAmJiBzW3N0YXJ0ICsgMV0gPT0gXCJ7XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSB3aGlsZSAobG9vcCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IHMuaW5kZXhPZihcIn1cIiwgc3RhcnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Gb3VuZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9wYXJ0cy5wdXNoKHMuc3Vic3RyaW5nKGksIHN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmluZG5nRXhwcmVzc2lvbiA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBlbmQgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFydDogc3RyaW5nIHwgQmluZGluZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IEV4cHJlc3Npb25QYXJzZXIucGFyc2VCaW5kaW5nKGJpbmRuZ0V4cHJlc3Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gYmluZG5nRXhwcmVzc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5fcGFydHMucHVzaChwYXJ0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaSA9IGVuZCArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbkZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuX3BhcnRzLnB1c2gocy5zdWJzdHIoaSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSB3aGlsZSAoaSA8IHMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5fcGFydHMubGVuZ3RoID09IDEgJiYgdHlwZW9mIHJlc3VsdC5fcGFydHNbMF0gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDxzdHJpbmc+cmVzdWx0Ll9wYXJ0c1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3VsZERyb3BPd25lcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgZXZhbEV4cHJlc3Npb24oYmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmcsIGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0KTogYW55IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYmluZGluZ0V4cHJlc3Npb24uZXZhbHVhdGUoY29udGV4dCk7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZERyb3BPd25lciA9IHRoaXMuX3Nob3VsZERyb3BPd25lciB8fCAhYmluZGluZ0V4cHJlc3Npb24uYWxsb3dOdWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGludGVybmFsRXZhbHVhdGUoY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXJ0cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9wYXJ0cy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3BhcnRzWzBdID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFydHNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsRXhwcmVzc2lvbig8QmluZGluZz50aGlzLl9wYXJ0c1swXSwgY29udGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgdGhpcy5fcGFydHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHMgKz0gcGFydDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHMgKz0gdGhpcy5ldmFsRXhwcmVzc2lvbig8QmluZGluZz5wYXJ0LCBjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV2YWx1YXRlKGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0KTogYW55IHtcclxuICAgICAgICB0aGlzLl9zaG91bGREcm9wT3duZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmFsdWF0ZShjb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkRHJvcE93bmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaG91bGREcm9wT3duZXI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0aXplZFN0cmluZy5wYXJzZShub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2Ygbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFRlbXBsYXRlLnByZXBhcmUoaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBUZW1wbGF0ZS5wcmVwYXJlKG5vZGVba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0O1xyXG5cclxuICAgIHByaXZhdGUgZXhwYW5kU2luZ2xlT2JqZWN0KG5vZGU6IG9iamVjdCk6IGFueSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobm9kZSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY29udGV4dC5pc1Jlc2VydmVkRmllbGQoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5pbnRlcm5hbEV4cGFuZChub2RlW2tleV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW50ZXJuYWxFeHBhbmQobm9kZTogYW55KTogYW55IHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRleHQuc2F2ZVN0YXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtQXJyYXk6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBleHBhbmRlZEl0ZW0gPSB0aGlzLmludGVybmFsRXhwYW5kKGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZEl0ZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGFuZGVkSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUFycmF5ID0gaXRlbUFycmF5LmNvbmNhdChleHBhbmRlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUFycmF5LnB1c2goZXhwYW5kZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW1BcnJheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRlbXBsYXRpemVkU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUuZXZhbHVhdGUodGhpcy5fY29udGV4dCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5zaG91bGREcm9wT3duZXIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBkcm9wT2JqZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCB3aGVuID0gbm9kZVtcIiR3aGVuXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHdoZW4gaW5zdGFuY2VvZiBUZW1wbGF0aXplZFN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHdoZW5WYWx1ZSA9IHdoZW4uZXZhbHVhdGUodGhpcy5fY29udGV4dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVuVmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcE9iamVjdCA9ICF3aGVuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZHJvcE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFDb250ZXh0ID0gbm9kZVtcIiRkYXRhXCJdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhQ29udGV4dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YUNvbnRleHQgaW5zdGFuY2VvZiBUZW1wbGF0aXplZFN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ29udGV4dCA9IGRhdGFDb250ZXh0LmV2YWx1YXRlKHRoaXMuX2NvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUNvbnRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQ29udGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC4kZGF0YSA9IGRhdGFDb250ZXh0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC4kaW5kZXggPSBpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRlZE9iamVjdCA9IHRoaXMuZXhwYW5kU2luZ2xlT2JqZWN0KG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZE9iamVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwYW5kZWRPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LiRkYXRhID0gZGF0YUNvbnRleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmV4cGFuZFNpbmdsZU9iamVjdChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmV4cGFuZFNpbmdsZU9iamVjdChub2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb250ZXh0LnJlc3RvcmVMYXN0U3RhdGUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlZFBheWxvYWQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnByZXBhcmVkUGF5bG9hZCA9IFRlbXBsYXRlLnByZXBhcmUocGF5bG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwYW5kKGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0KTogYW55IHtcclxuICAgICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFeHBhbmQodGhpcy5wcmVwYXJlZFBheWxvYWQpO1xyXG4gICAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==
699
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxFQUFFO2dCQUMxQixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RCO1NBQ0o7YUFDSTtZQUNELE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDakI7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFakMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQWFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrRUc7SUFDSCx5QkFBTSxHQUFOLFVBQU8sT0FBMkI7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0wsZUFBQztBQUFELENBbFhBLElBa1hDO0FBbFhZLDRCQUFROzs7Ozs7Ozs7OztBQzNIckIsa0U7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7VUV0QkE7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BQ0RhdGEvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0FDRGF0YS8uL3NyYy9hZGFwdGl2ZWNhcmRzLXRlbXBsYXRpbmcudHMiLCJ3ZWJwYWNrOi8vQUNEYXRhLy4vc3JjL2pzb24tc2NoZW1hLWNhcmQudHMiLCJ3ZWJwYWNrOi8vQUNEYXRhLy4vc3JjL3RlbXBsYXRlLWVuZ2luZS50cyIsIndlYnBhY2s6Ly9BQ0RhdGEvZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJhZGFwdGl2ZS1leHByZXNzaW9uc1wiLFwiY29tbW9uanNcIjpcImFkYXB0aXZlLWV4cHJlc3Npb25zXCIsXCJyb290XCI6XCJBRUxcIn0iLCJ3ZWJwYWNrOi8vQUNEYXRhL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0FDRGF0YS93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL0FDRGF0YS93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vQUNEYXRhL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJhZGFwdGl2ZS1leHByZXNzaW9uc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJBQ0RhdGFcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJhZGFwdGl2ZS1leHByZXNzaW9uc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiQUNEYXRhXCJdID0gZmFjdG9yeShyb290W1wiQUVMXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYWRhcHRpdmVfZXhwcmVzc2lvbnNfXykge1xucmV0dXJuICIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuZXhwb3J0ICogZnJvbSBcIi4vdGVtcGxhdGUtZW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9qc29uLXNjaGVtYS1jYXJkXCI7IiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5cbmltcG9ydCB7IElBZGFwdGl2ZUNhcmQsIElDYXJkRWxlbWVudCwgSUNob2ljZVNldElucHV0LCBJQ29udGFpbmVyLCBJTnVtYmVySW5wdXQsIElUZXh0SW5wdXQsIElUaW1lSW5wdXQsIElUb2dnbGVJbnB1dCB9IGZyb20gJ2FkYXB0aXZlY2FyZHMvc3JjL3NjaGVtYSc7XG5pbXBvcnQgeyBKU09OU2NoZW1hNywgSlNPTlNjaGVtYTdEZWZpbml0aW9uLCBKU09OU2NoZW1hN1R5cGUgfSBmcm9tICdqc29uLXNjaGVtYSc7XG5cblxuLy8gSlNPTiBTY2hlbWEgQ2FyZFxuLy8gZ2VuZXJhdGVzIGFuIEFkYXB0aXZlIENhcmQgZ2l2ZW4gYSBKU09OIHNjaGVtYVxuZXhwb3J0IGZ1bmN0aW9uIEpTT05TY2hlbWFDYXJkKHNjaGVtYTogSlNPTlNjaGVtYTcpOiBJQWRhcHRpdmVDYXJkIHwgdW5kZWZpbmVkIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogXCJBZGFwdGl2ZUNhcmRcIixcblx0XHRcdGJvZHk6IFtcblx0XHRcdFx0SlNPTlNjaGVtYUNhcmRPYmplY3Qoc2NoZW1hLCAnJywgMCksXG5cdFx0XHRdLFxuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5cbi8vIEpTT04gU2NoZW1hIEVsZW1lbnRzXG5cbmZ1bmN0aW9uIEpTT05TY2hlbWFDYXJkRWxlbWVudChzY2hlbWE6IEpTT05TY2hlbWE3RGVmaW5pdGlvbiwgcGF0aDogc3RyaW5nLCBkZXB0aDogbnVtYmVyKTogSUNhcmRFbGVtZW50IHtcbiAgICBpZiAodHlwZW9mIChzY2hlbWEpID09PSBcImJvb2xlYW5cIikgcmV0dXJuIG51bGw7XG4gICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xuICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTlNjaGVtYUNhcmRUdXBsZShzY2hlbWEsIHBhdGgsIGRlcHRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT05TY2hlbWFDYXJkTGlzdChzY2hlbWEsIHBhdGgsIGRlcHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgcmV0dXJuIEpTT05TY2hlbWFDYXJkT2JqZWN0KHNjaGVtYSwgcGF0aCwgZGVwdGgpO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIEpTT05TY2hlbWFDYXJkQm9vbGVhbihzY2hlbWEsIHBhdGgpXG4gICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBKU09OU2NoZW1hQ2FyZE51bWJlcihzY2hlbWEsIHBhdGgpXG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGlmIChzY2hlbWEuZW51bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OU2NoZW1hQ2FyZENob2ljZVNldChzY2hlbWEsIHBhdGgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OU2NoZW1hQ2FyZFRleHQoc2NoZW1hLCBwYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZGF0ZS10aW1lXCI6XG4gICAgICAgIGNhc2UgXCJ0aW1lXCI6XG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgICByZXR1cm4gSlNPTlNjaGVtYUNhcmRUaW1lKHNjaGVtYSwgcGF0aClcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlUHJvcGVydHkocHJvcGVydHk6IHN0cmluZykge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocHJvcGVydHkpLnJlcGxhY2UoJy4nLCAnJTJlJylcbn1cblxuZnVuY3Rpb24gdGV4dFNpemVBdERlcHRoKGRlcHRoOiBudW1iZXIpIHtcbiAgICBzd2l0Y2ggKGRlcHRoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIFwibGFyZ2VcIlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBcIm1lZGl1bVwiXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBcInNtYWxsXCJcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEpTT05TY2hlbWFGaWVsZFRpdGxlKHNjaGVtYTogSlNPTlNjaGVtYTcsIHBhdGg6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IElDYXJkRWxlbWVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzY2hlbWEudGl0bGUgPyB7XG4gICAgICAgICAgICB0eXBlOiBcIlRleHRCbG9ja1wiLFxuICAgICAgICAgICAgc2l6ZTogdGV4dFNpemVBdERlcHRoKGRlcHRoKSxcbiAgICAgICAgICAgIHRleHQ6IHNjaGVtYS50aXRsZSxcbiAgICAgICAgfSA6IG51bGwsXG4gICAgICAgIHNjaGVtYS5kZXNjcmlwdGlvbiA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwiVGV4dEJsb2NrXCIsXG4gICAgICAgICAgICBzaXplOiB0ZXh0U2l6ZUF0RGVwdGgoZGVwdGggKyAxKSxcbiAgICAgICAgICAgIGlzU3VidGxlOiB0cnVlLFxuICAgICAgICAgICAgd3JhcDogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHNjaGVtYS5kZXNjcmlwdGlvbixcbiAgICAgICAgfSA6IG51bGwsXG4gICAgXVxufVxuXG5mdW5jdGlvbiBKU09OU2NoZW1hQ2FyZFR1cGxlKHNjaGVtYTogSlNPTlNjaGVtYTcsIHBhdGg6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IElDb250YWluZXIge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkNvbnRhaW5lclwiLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgLi4uSlNPTlNjaGVtYUZpZWxkVGl0bGUoc2NoZW1hLCBwYXRoLCBkZXB0aCksXG4gICAgICAgICAgICAuLi5zY2hlbWEuaXRlbXM/Lm1hcCgoaXRlbTogSlNPTlNjaGVtYTdEZWZpbml0aW9uLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OU2NoZW1hQ2FyZEVsZW1lbnQoaXRlbSwgYCR7cGF0aH1bJHtpZHh9XWAsIGRlcHRoICsgMSlcbiAgICAgICAgICAgIH0pID8/IFtdLFxuICAgICAgICBdLFxuICAgIH1cbn1cblxuZnVuY3Rpb24gSlNPTlNjaGVtYUNhcmRMaXN0KHNjaGVtYTogSlNPTlNjaGVtYTcsIHBhdGg6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IElDb250YWluZXIge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiQ29udGFpbmVyXCIsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAuLi5KU09OU2NoZW1hRmllbGRUaXRsZShzY2hlbWEsIHBhdGgsIGRlcHRoKSxcbiAgICAgICAgICAgIC8vIFRPRE8gbm90IGltcGxlbWVudGVkXG4gICAgICAgIF0sXG4gICAgfVxufVxuXG5mdW5jdGlvbiBKU09OU2NoZW1hQ2FyZE9iamVjdChzY2hlbWE6IEpTT05TY2hlbWE3LCBwYXRoOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIpOiBJQ29udGFpbmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkNvbnRhaW5lclwiLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgLi4uSlNPTlNjaGVtYUZpZWxkVGl0bGUoc2NoZW1hLCBwYXRoLCBkZXB0aCksXG4gICAgICAgICAgICAuLi5zY2hlbWEucmVxdWlyZWQ/Lm1hcCgocHJvcGVydHk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OU2NoZW1hQ2FyZEVsZW1lbnQoc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldLCBgJHtwYXRofS4ke2VuY29kZVByb3BlcnR5KHByb3BlcnR5KX1gLCBkZXB0aCArIDEpXG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgXSxcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEpTT05TY2hlbWFDYXJkQm9vbGVhbihzY2hlbWE6IEpTT05TY2hlbWE3LCBwYXRoOiBzdHJpbmcpOiBJVG9nZ2xlSW5wdXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiSW5wdXQuVG9nZ2xlXCIsXG4gICAgICAgIGlkOiBwYXRoLFxuICAgICAgICB0aXRsZTogc2NoZW1hLnRpdGxlLFxuICAgICAgICBsYWJlbDogc2NoZW1hLmRlc2NyaXB0aW9uLFxuICAgICAgICB2YWx1ZTogc2NoZW1hLmRlZmF1bHQgYXMgc3RyaW5nLFxuICAgIH1cbn1cblxuZnVuY3Rpb24gSlNPTlNjaGVtYUNhcmROdW1iZXIoc2NoZW1hOiBKU09OU2NoZW1hNywgcGF0aDogc3RyaW5nKTogSU51bWJlcklucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIklucHV0Lk51bWJlclwiLFxuICAgICAgICBpZDogcGF0aCxcbiAgICAgICAgdGl0bGU6IHNjaGVtYS50aXRsZSxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHNjaGVtYS5kZXNjcmlwdGlvbixcbiAgICAgICAgdmFsdWU6IHNjaGVtYS5kZWZhdWx0IGFzIHN0cmluZyxcbiAgICAgICAgbWluOiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA/PyBzY2hlbWEubWluaW11bSxcbiAgICAgICAgbWF4OiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA/PyBzY2hlbWEubWF4aW11bSxcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEpTT05TY2hlbWFDYXJkQ2hvaWNlU2V0KHNjaGVtYTogSlNPTlNjaGVtYTcsIHBhdGg6IHN0cmluZyk6IElDaG9pY2VTZXRJbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJJbnB1dC5DaG9pY2VTZXRcIixcbiAgICAgICAgaWQ6IHBhdGgsXG4gICAgICAgIHRpdGxlOiBzY2hlbWEudGl0bGUsXG4gICAgICAgIGNob2ljZXM6IHNjaGVtYS5lbnVtLm1hcCgoaXRlbTogSlNPTlNjaGVtYTdUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBwbGFjZWhvbGRlcjogc2NoZW1hLmRlc2NyaXB0aW9uLFxuICAgICAgICB2YWx1ZTogc2NoZW1hLmRlZmF1bHQgYXMgc3RyaW5nLFxuICAgIH1cbn1cblxuZnVuY3Rpb24gSlNPTlNjaGVtYUNhcmRUZXh0KHNjaGVtYTogSlNPTlNjaGVtYTcsIHBhdGg6IHN0cmluZyk6IElUZXh0SW5wdXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiSW5wdXQuVGV4dFwiLFxuICAgICAgICBpZDogcGF0aCxcbiAgICAgICAgdGl0bGU6IHNjaGVtYS50aXRsZSxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHNjaGVtYS5kZXNjcmlwdGlvbixcbiAgICAgICAgdmFsdWU6IHNjaGVtYS5kZWZhdWx0IGFzIHN0cmluZyxcbiAgICAgICAgbWF4TGVuZ3RoOiBzY2hlbWEubWF4TGVuZ3RoLFxuICAgICAgICByZWdleDogc2NoZW1hLnBhdHRlcm4sXG4gICAgfVxufVxuXG5mdW5jdGlvbiBKU09OU2NoZW1hQ2FyZFRpbWUoc2NoZW1hOiBKU09OU2NoZW1hNywgcGF0aDogc3RyaW5nKTogSVRpbWVJbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJJbnB1dC5UaW1lXCIsXG4gICAgICAgIGlkOiBwYXRoLFxuICAgICAgICB0aXRsZTogc2NoZW1hLnRpdGxlLFxuICAgICAgICBwbGFjZWhvbGRlcjogc2NoZW1hLmRlc2NyaXB0aW9uLFxuICAgICAgICB2YWx1ZTogc2NoZW1hLmRlZmF1bHQgYXMgc3RyaW5nLFxuICAgIH1cbn1cbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuaW1wb3J0ICogYXMgQUVMIGZyb20gXCJhZGFwdGl2ZS1leHByZXNzaW9uc1wiO1xuXG5jbGFzcyBFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX3Jlc2VydmVkRmllbGRzID0gW1wiJGRhdGFcIiwgXCIkd2hlblwiLCBcIiRyb290XCIsIFwiJGluZGV4XCJdO1xuXG4gICAgcHJpdmF0ZSBfc3RhdGVTdGFjazogQXJyYXk8eyAkZGF0YTogYW55LCAkaW5kZXg6IGFueSB9PiA9IFtdO1xuICAgIHByaXZhdGUgXyRkYXRhOiBhbnk7XG5cbiAgICAkcm9vdDogYW55O1xuICAgICRpbmRleDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dD86IElFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLiRyb290ID0gY29udGV4dC4kcm9vdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzUmVzZXJ2ZWRGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEV2YWx1YXRpb25Db250ZXh0Ll9yZXNlcnZlZEZpZWxkcy5pbmRleE9mKG5hbWUpID49IDA7XG4gICAgfVxuXG4gICAgc2F2ZVN0YXRlKCkge1xuICAgICAgICB0aGlzLl9zdGF0ZVN0YWNrLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJGRhdGE6IHRoaXMuJGRhdGEsXG4gICAgICAgICAgICAgICAgJGluZGV4OiB0aGlzLiRpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzdG9yZUxhc3RTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBldmFsdWF0aW9uIGNvbnRleHQgc3RhdGUgdG8gcmVzdG9yZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2F2ZWRDb250ZXh0ID0gdGhpcy5fc3RhdGVTdGFjay5wb3AoKTtcblxuICAgICAgICB0aGlzLiRkYXRhID0gc2F2ZWRDb250ZXh0LiRkYXRhO1xuICAgICAgICB0aGlzLiRpbmRleCA9IHNhdmVkQ29udGV4dC4kaW5kZXg7XG4gICAgfVxuXG4gICAgZ2V0ICRkYXRhKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kZGF0YSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fJGRhdGEgOiB0aGlzLiRyb290O1xuICAgIH1cblxuICAgIHNldCAkZGF0YSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuXyRkYXRhID0gdmFsdWU7XG4gICAgfVxufVxuXG5jbGFzcyBUZW1wbGF0ZU9iamVjdE1lbW9yeSBpbXBsZW1lbnRzIEFFTC5NZW1vcnlJbnRlcmZhY2Uge1xuICAgIHByaXZhdGUgX21lbW9yeTogQUVMLk1lbW9yeUludGVyZmFjZTtcblxuICAgICRyb290OiBhbnk7XG4gICAgJGRhdGE6IGFueTtcbiAgICAkaW5kZXg6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9tZW1vcnkgPSBuZXcgQUVMLlNpbXBsZU9iamVjdE1lbW9yeSh0aGlzKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZShwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBsZXQgYWN0dWFsUGF0aCA9IChwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aFswXSAhPT0gXCIkXCIpID8gXCIkZGF0YS5cIiArIHBhdGggOiBwYXRoO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZW1vcnkuZ2V0VmFsdWUoYWN0dWFsUGF0aCk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWUocGF0aDogc3RyaW5nLCBpbnB1dDogYW55KSB7XG4gICAgICAgIHRoaXMuX21lbW9yeS5zZXRWYWx1ZShwYXRoLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVtb3J5LnZlcnNpb24oKTtcbiAgICB9XG59XG5cbi8qKlxuICogSG9sZHMgZ2xvYmFsIHNldHRpbmdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSB3YXkgdGVtcGxhdGVzIGFyZSBleHBhbmRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdsb2JhbFNldHRpbmdzIHtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gZXhwcmVzc2lvbiBldmFsdWF0aW9uIG5lZWRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2UgZGF0YSBvYmplY3RcbiAgICAgKiBhbmQgdGhhdCBmaWVsZCBpcyB1bmRlZmluZWQgb3IgbnVsbC4gQnkgZGVmYXVsdCwgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHdpbGwgc3Vic3RpdHV0ZSBhbiB1bmRlZmluZWRcbiAgICAgKiBmaWVsZCB3aXRoIGl0cyBiaW5kaW5nIGV4cHJlc3Npb24gKGUuZy4gYCR7ZmllbGR9YCkuIFRoaXMgY2FsbGJhY2sgbWFrZXMgaXQgcG9zc2libGUgdG8gY3VzdG9taXplIHRoYXRcbiAgICAgKiBiZWhhdmlvci5cbiAgICAgKiBcbiAgICAgKiAqKkV4YW1wbGUqKlxuICAgICAqIEdpdmVuIHRoaXMgZGF0YSBvYmplY3Q6XG4gICAgICogXG4gICAgICogYGBganNvblxuICAgICAqIHtcbiAgICAgKiAgICAgZmlyc3ROYW1lOiBcIkRhdmlkXCJcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogVGhlIGV4cHJlc3Npb24gYCR7Zmlyc3ROYW1lfSAke2xhc3ROYW1lfWAgd2lsbCBldmFsdWF0ZSB0byBcIkRhdmlkICR7bGFzdE5hbWV9XCIgYmVjYXVzZSB0aGUgYGxhc3ROYW1lYFxuICAgICAqIGZpZWxkIGlzIHVuZGVmaW5lZC5cbiAgICAgKiBcbiAgICAgKiBOb3cgbGV0J3Mgc2V0IHRoZSBjYWxsYmFjazpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogR2xvYmFsU2V0dGluZ3MuZ2V0VW5kZWZpbmVkRmllbGRWYWx1ZVN1YnN0aXR1dGlvblN0cmluZyA9IChwYXRoOiBzdHJpbmcpID0+IHsgcmV0dXJuIFwiPHVuZGVmaW5lZCB2YWx1ZT5cIjsgfVxuICAgICAqIGBgYFxuICAgICAqIFxuICAgICAqIFdpdGggdGhhdCwgdGhlIGFib3ZlIGV4cHJlc3Npb24gd2lsbCBldmFsdWF0ZSB0byBcIkRhdmlkICZsdDt1bmRlZmluZWQgdmFsdWUmZ3Q7XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VW5kZWZpbmVkRmllbGRWYWx1ZVN1YnN0aXR1dGlvblN0cmluZz86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIb2xkcyB0aGUgY29udGV4dCB1c2VkIHRvIGV4cGFuZCBhIHRlbXBsYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvb3QgZGF0YSBvYmplY3QgdGhlIHRlbXBsYXRlIHdpbGwgYmluZCB0by4gRXhwcmVzc2lvbnMgdGhhdCByZWZlciB0byAkcm9vdCBpbiB0aGUgdGVtcGxhdGUgcGF5bG9hZFxuICAgICAqIG1hcCB0byB0aGlzIGZpZWxkLiBJbml0aWFsbHksICRkYXRhIGFsc28gbWFwcyB0byAkcm9vdC5cbiAgICAgKi9cbiAgICAkcm9vdDogYW55XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRlbXBsYXRlIHRoYXQgY2FuIGJlIGJvdW5kIHRvIGRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZShub2RlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZS5wYXJzZUludGVycG9sYXRlZFN0cmluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goVGVtcGxhdGUucHJlcGFyZShpdGVtKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobm9kZSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBUZW1wbGF0ZS5wcmVwYXJlKG5vZGVba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJuYWxUcnlFdmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogQUVMLkV4cHJlc3Npb24sIGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0LCBhbGxvd1N1YnN0aXR1dGlvbnM6IGJvb2xlYW4pOiB7IHZhbHVlOiBhbnk7IGVycm9yOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCBtZW1vcnkgPSBuZXcgVGVtcGxhdGVPYmplY3RNZW1vcnkoKTtcbiAgICAgICAgbWVtb3J5LiRyb290ID0gY29udGV4dC4kcm9vdDtcbiAgICAgICAgbWVtb3J5LiRkYXRhID0gY29udGV4dC4kZGF0YTtcbiAgICAgICAgbWVtb3J5LiRpbmRleCA9IGNvbnRleHQuJGluZGV4O1xuXG4gICAgICAgIGxldCBvcHRpb25zOiBBRUwuT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoYWxsb3dTdWJzdGl0dXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gbmV3IEFFTC5PcHRpb25zKCk7XG4gICAgICAgICAgICBvcHRpb25zLm51bGxTdWJzdGl0dXRpb24gPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGlvblZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoR2xvYmFsU2V0dGluZ3MuZ2V0VW5kZWZpbmVkRmllbGRWYWx1ZVN1YnN0aXR1dGlvblN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25WYWx1ZSA9IEdsb2JhbFNldHRpbmdzLmdldFVuZGVmaW5lZEZpZWxkVmFsdWVTdWJzdGl0dXRpb25TdHJpbmcocGF0aCk7ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvblZhbHVlID8gc3Vic3RpdHV0aW9uVmFsdWUgOiBcIiR7XCIgKyBwYXRoICsgXCJ9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcm9vdCBvZiBhbiBleHByZXNzaW9uIGNvbWluZyBmcm9tIGFuIGludGVycG9sYXRlZCBzdHJpbmcgaXMgb2YgdHlwZSBDb25jYXQuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgYW5kIGlmIHRoZSBjYWxsZXIgYWxsb3dzIGl0LCB3ZSdyZSBkb2luZyBvdXIgb3duIGNvbmNhdGVuYXRpb25cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gY2F0Y2ggZWFjaCBpbmRpdmlkdWFsIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBlcnJvciBhbmQgc3Vic3RpdHV0ZSBpblxuICAgICAgICAvLyB0aGUgZmluYWwgc3RyaW5nXG4gICAgICAgIGlmIChleHByZXNzaW9uLnR5cGUgPT09IEFFTC5FeHByZXNzaW9uVHlwZS5Db25jYXQgJiYgYWxsb3dTdWJzdGl0dXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcblxuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGRFeHByZXNzaW9uIG9mIGV4cHJlc3Npb24uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgZXZhbHVhdGlvblJlc3VsdDogeyB2YWx1ZTogYW55OyBlcnJvcjogc3RyaW5nIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvblJlc3VsdCA9IGNoaWxkRXhwcmVzc2lvbi50cnlFdmFsdWF0ZShtZW1vcnksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgc3dhbGxvdyBhbGwgZXhjZXB0aW9ucyBoZXJlXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb25SZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGV4XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV2YWx1YXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvblJlc3VsdC52YWx1ZSA9IFwiJHtcIiArIGNoaWxkRXhwcmVzc2lvbi50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGV2YWx1YXRpb25SZXN1bHQudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZXJyb3I6IHVuZGVmaW5lZCB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi50cnlFdmFsdWF0ZShtZW1vcnksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbiBpbnRlcnBvbGF0ZWQgc3RyaW5nIGludG8gYW4gRXhwcmVzc2lvbiBvYmplY3QgcmVhZHkgdG8gZXZhbHVhdGUuXG4gICAgICogXG4gICAgICogQHBhcmFtIGludGVycG9sYXRlZFN0cmluZyBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyB0byBwYXJzZS4gRXhhbXBsZTogXCJIZWxsbyAke25hbWV9XCJcbiAgICAgKiBAcmV0dXJucyBBbiBFeHByZXNzaW9uIG9iamVjdCBpZiB0aGUgcHJvdmlkZWQgaW50ZXJwb2xhdGVkIHN0cmluZyBjb250YWluZWQgYXQgbGVhc3Qgb25lIGV4cHJlc3Npb24gKGUuZy4gXCIke2V4cHJlc3Npb259XCIpOyB0aGUgb3JpZ2luYWwgc3RyaW5nIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlSW50ZXJwb2xhdGVkU3RyaW5nKGludGVycG9sYXRlZFN0cmluZzogc3RyaW5nKTogQUVMLkV4cHJlc3Npb24gfCBzdHJpbmcge1xuICAgICAgICBsZXQgbG9va3VwOiBBRUwuRXZhbHVhdG9yTG9va3VwID0gKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YW5kYXJkRnVuY3Rpb24gPSBBRUwuRXhwcmVzc2lvbkZ1bmN0aW9ucy5zdGFuZGFyZEZ1bmN0aW9ucy5nZXQodHlwZSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YW5kYXJkRnVuY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFFTC5FeHByZXNzaW9uRXZhbHVhdG9yKFxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbjogQUVMLkV4cHJlc3Npb24sIHN0YXRlOiBBRUwuTWVtb3J5SW50ZXJmYWNlLCBvcHRpb25zOiBBRUwuT3B0aW9ucykgPT4geyB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGZ1bmN0aW9uIFwiICsgdHlwZSk7IH0sXG4gICAgICAgICAgICAgICAgICAgIEFFTC5SZXR1cm5UeXBlLlN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZXhwcmVzc2lvbiBzdGFydCBtYXJrZXIsIGxldCdzIGF0dGVtcHQgdG8gY29udmVydCBpbnRvIGFuIGV4cHJlc3Npb25cbiAgICAgICAgaWYgKGludGVycG9sYXRlZFN0cmluZy5pbmRleE9mKFwiJHtcIikgPj0gMCkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZEV4cHJlc3Npb24gPSBBRUwuRXhwcmVzc2lvbi5wYXJzZShcImBcIiArIGludGVycG9sYXRlZFN0cmluZyArIFwiYFwiLCBsb29rdXApO1xuXG4gICAgICAgICAgICBpZiAocGFyc2VkRXhwcmVzc2lvbi50eXBlID09PSBcImNvbmNhdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZEV4cHJlc3Npb24uY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmICEocGFyc2VkRXhwcmVzc2lvbi5jaGlsZHJlblswXSBpbnN0YW5jZW9mIEFFTC5Db25zdGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbmNhdCBjb250YWlucyBhIHNpbmdsZSBjaGlsZCB0aGF0IGlzbid0IGEgY29uc3RhbnQsIHRodXMgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB3YXMgYSBzaW5nbGUgZXhwcmVzc2lvbi4gV2hlbiBldmFsdWF0ZWQsIHdlIHdhbnQgaXQgdG8gcHJvZHVjZSB0aGUgdHlwZVxuICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGF0IHNpbmdsZSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRFeHByZXNzaW9uLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZWRFeHByZXNzaW9uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RDaGlsZCA9IHBhcnNlZEV4cHJlc3Npb24uY2hpbGRyZW5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgaW5zdGFuY2VvZiBBRUwuQ29uc3RhbnQgJiYgZmlyc3RDaGlsZC52YWx1ZSA9PT0gXCJcIiAmJiAhKHBhcnNlZEV4cHJlc3Npb24uY2hpbGRyZW5bMV0gaW5zdGFuY2VvZiBBRUwuQ29uc3RhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29uY2F0IGNvbnRhaW5zIDIgY2hpbGRyZW4sIGFuZCB0aGUgZmlyc3Qgb25lIGlzIGFuIGVtcHR5IHN0cmluZyBjb25zdGFudCBhbmQgdGhlIHNlY29uZCBpc24ndCBhIGNvbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSB2ZXJzaW9uIDQuMTAuMywgQUVMIGFsd2F5cyBpbnNlcnRzIGFuIGVtcHR5IHN0cmluZyBjb25zdGFudCBpbiBhbGwgY29uY2F0IGV4cHJlc3Npb24uIFRodXMgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgd2FzIGEgc2luZ2xlIGV4cHJlc3Npb24gaW4gdGhpcyBjYXNlIGFzIHdlbGwuIFdoZW4gZXZhbHVhdGVkLCB3ZSB3YW50IGl0IHRvIHByb2R1Y2UgdGhlIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoYXQgc2luZ2xlIGV4cHJlc3Npb24uXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbi5jaGlsZHJlblsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2Ugd2FudCB0aGUgZXhwcmVzc2lvbiB0byBwcm9kdWNlIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZEV4cHJlc3Npb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgc3RyaW5nIGRpZG4ndCBjb250YWluIGFueSBleHByZXNzaW9uLCByZXR1cm4gaSBhcyBpc1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVkU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGV2YWx1YXRlIHRoZSBwcm92aWRlZCBleHByZXNzaW9uIHVzaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IChkYXRhKSB1c2VkIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uLlxuICAgICAqIEBwYXJhbSBhbGxvd1N1YnN0aXR1dGlvbnMgSW5kaWNhdGVzIGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRvciBzaG91bGQgc3Vic3RpdHV0ZSB1bmRlZmluZWQgdmFsdWUgd2l0aCBhIGRlZmF1bHRcbiAgICAgKiAgIHN0cmluZyBvciB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIEdsb2JhbFNldHRpbmdzLmdldFVuZGVmaW5lZEZpZWxkVmFsdWVTdWJzdGl0dXRpb25TdHJpbmcgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uLiBJZiB0aGUgZXZhbHVhdGlvbiBzdWNjZWVkZWQsIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAqICAgY29udGFpbnMgdGhlIGFjdHVhbCBldmFsdWF0aW9uIHJlc3VsdCwgYW5kIHRoZSBlcnJvciBwcm9wZXJ0eSBpcyB1bmRlZmluZWQuIElmIHRoZSBldmFsdWF0aW9uIGZhaWxzLCB0aGUgZXJyb3JcbiAgICAgKiAgIHByb3BlcnR5IGNvbnRhaW5zIGEgbWVzc2FnZSBkZXRhaWxpbmcgdGhlIGVycm9yIHRoYXQgb2NjdXJyZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB0cnlFdmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogQUVMLkV4cHJlc3Npb24sIGNvbnRleHQ6IElFdmFsdWF0aW9uQ29udGV4dCwgYWxsb3dTdWJzdGl0dXRpb25zOiBib29sZWFuKTogeyB2YWx1ZTogYW55OyBlcnJvcjogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4gVGVtcGxhdGUuaW50ZXJuYWxUcnlFdmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgbmV3IEV2YWx1YXRpb25Db250ZXh0KGNvbnRleHQpLCBhbGxvd1N1YnN0aXR1dGlvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0O1xuICAgIHByaXZhdGUgX3ByZXBhcmVkUGF5bG9hZDogYW55O1xuXG4gICAgcHJpdmF0ZSBleHBhbmRTaW5nbGVPYmplY3Qobm9kZTogb2JqZWN0KTogYW55IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRleHQuaXNSZXNlcnZlZEZpZWxkKGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmludGVybmFsRXhwYW5kKG5vZGVba2V5XSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEV4cGFuZChub2RlOiBhbnkpOiBhbnkge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnk7XG5cbiAgICAgICAgdGhpcy5fY29udGV4dC5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgbGV0IGl0ZW1BcnJheTogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBub2RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4cGFuZGVkSXRlbSA9IHRoaXMuaW50ZXJuYWxFeHBhbmQoaXRlbSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kZWRJdGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGFuZGVkSXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1BcnJheSA9IGl0ZW1BcnJheS5jb25jYXQoZXhwYW5kZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1BcnJheS5wdXNoKGV4cGFuZGVkSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW1BcnJheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQUVMLkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGxldCBldmFsdWF0aW9uUmVzdWx0ID0gVGVtcGxhdGUuaW50ZXJuYWxUcnlFdmFsdWF0ZUV4cHJlc3Npb24obm9kZSwgdGhpcy5fY29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICghZXZhbHVhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRpb25SZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXZhbHVhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHdoZW4gPSBub2RlW1wiJHdoZW5cIl07XG4gICAgICAgICAgICBsZXQgZGF0YUNvbnRleHQgPSBub2RlW1wiJGRhdGFcIl07XG4gICAgICAgICAgICBsZXQgZGF0YUNvbnRleHRJc0FycmF5OiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZGF0YUNvbnRleHRzOiBhbnlbXTtcblxuICAgICAgICAgICAgaWYgKGRhdGFDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkYXRhQ29udGV4dHMgPSBbIHVuZGVmaW5lZCBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFDb250ZXh0IGluc3RhbmNlb2YgQUVMLkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2YWx1YXRpb25SZXN1bHQgPSBUZW1wbGF0ZS5pbnRlcm5hbFRyeUV2YWx1YXRlRXhwcmVzc2lvbihkYXRhQ29udGV4dCwgdGhpcy5fY29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFldmFsdWF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ29udGV4dCA9IGV2YWx1YXRpb25SZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXZhbHVhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUNvbnRleHRzID0gZGF0YUNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFDb250ZXh0SXNBcnJheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhQ29udGV4dHMgPSBbIGRhdGFDb250ZXh0IF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUNvbnRleHRJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuJGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YUNvbnRleHRzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC4kZGF0YSA9IGRhdGFDb250ZXh0c1tpXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZHJvcE9iamVjdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdoZW4gaW5zdGFuY2VvZiBBRUwuRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXZhbHVhdGlvblJlc3VsdCA9IFRlbXBsYXRlLmludGVybmFsVHJ5RXZhbHVhdGVFeHByZXNzaW9uKHdoZW4sIHRoaXMuX2NvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdoZW5WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgJHdoZW4gZmFpbHMgdG8gZXZhbHVhdGUgb3IgZXZhbHVhdGVzIHRvIGFueXRoaW5nIGJ1dCBhIGJvb2xlYW4sIGNvbnNpZGVyIGl0IGlzIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXZhbHVhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hlblZhbHVlID0gdHlwZW9mIGV2YWx1YXRpb25SZXN1bHQudmFsdWUgPT09IFwiYm9vbGVhblwiICYmIGV2YWx1YXRpb25SZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkcm9wT2JqZWN0ID0gIXdoZW5WYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRyb3BPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGFuZGVkT2JqZWN0ID0gdGhpcy5leHBhbmRTaW5nbGVPYmplY3Qobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkT2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChleHBhbmRlZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGV4dC5yZXN0b3JlTGFzdFN0YXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cbiAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSBpbnN0YW5jZSBjYW4gYmUgYm91bmQgdG8gZGlmZmVyZW50IGRhdGEgb2JqZWN0c1xuICAgICAqIGluIGEgbG9vcC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgdGVtcGxhdGUgcGF5bG9hZC4gIFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQ6IGFueSkge1xuICAgICAgICB0aGlzLl9wcmVwYXJlZFBheWxvYWQgPSBUZW1wbGF0ZS5wcmVwYXJlKHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHRlbXBsYXRlIHVzaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0LiBUZW1wbGF0ZSBleHBhbnNpb24gaW52b2x2ZXNcbiAgICAgKiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBwYXlsb2FkLCBhcyB3ZWxsIGFzXG4gICAgICogcmVwZWF0aW5nIChleHBhbmRpbmcpIHBhcnRzIG9mIHRoYXQgcGF5bG9hZCB0aGF0IGFyZSBib3VuZCB0byBhcnJheXMuXG4gICAgICogXG4gICAgICogRXhhbXBsZTpcbiAgICAgKiBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbnRleHQgPSB7XG4gICAgICogICAgICRyb290OiB7XG4gICAgICogICAgICAgICBmaXJzdE5hbWU6IFwiSm9oblwiLFxuICAgICAqICAgICAgICAgbGFzdE5hbWU6IFwiRG9lXCIsXG4gICAgICogICAgICAgICBjaGlsZHJlbjogW1xuICAgICAqICAgICAgICAgICAgIHsgZnVsbE5hbWU6IFwiSmFuZSBEb2VcIiwgYWdlOiA5IH0sXG4gICAgICogICAgICAgICAgICAgeyBmdWxsTmFtZTogXCJBbGV4IERvZVwiLCBhZ2U6IDEyIH1cbiAgICAgKiAgICAgICAgIF1cbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBcbiAgICAgKiBsZXQgdGVtcGxhdGVQYXlsb2FkID0ge1xuICAgICAqICAgICB0eXBlOiBcIkFkYXB0aXZlQ2FyZFwiLFxuICAgICAqICAgICB2ZXJzaW9uOiBcIjEuMlwiLFxuICAgICAqICAgICBib2R5OiBbXG4gICAgICogICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgdHlwZTogXCJUZXh0QmxvY2tcIixcbiAgICAgKiAgICAgICAgICAgICB0ZXh0OiBcIiR7Zmlyc3ROYW1lfSAke2xhc3ROYW1lfVwiXG4gICAgICogICAgICAgICB9LFxuICAgICAqICAgICAgICAge1xuICAgICAqICAgICAgICAgICAgIHR5cGU6IFwiVGV4dEJsb2NrXCIsXG4gICAgICogICAgICAgICAgICAgJGRhdGE6IFwiJHtjaGlsZHJlbn1cIixcbiAgICAgKiAgICAgICAgICAgICB0ZXh0OiBcIiR7ZnVsbE5hbWV9ICgke2FnZX0pXCJcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgXVxuICAgICAqIH1cbiAgICAgKiBcbiAgICAgKiBsZXQgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUodGVtcGxhdGVQYXlsb2FkKTtcbiAgICAgKiBcbiAgICAgKiBsZXQgZXhwYW5kZWRUZW1wbGF0ZSA9IHRlbXBsYXRlLmV4cGFuZChjb250ZXh0KTtcbiAgICAgKiBgYGBcbiAgICAgKiBcbiAgICAgKiBXaXRoIHRoZSBhYm92ZSBjb2RlLCB0aGUgdmFsdWUgb2YgYGV4cGFuZGVkVGVtcGxhdGVgIHdpbGwgYmVcbiAgICAgKiBcbiAgICAgKiBgYGBqc29uXG4gICAgICoge1xuICAgICAqICAgICB0eXBlOiBcIkFkYXB0aXZlQ2FyZFwiLFxuICAgICAqICAgICB2ZXJzaW9uOiBcIjEuMlwiLFxuICAgICAqICAgICBib2R5OiBbXG4gICAgICogICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgdHlwZTogXCJUZXh0QmxvY2tcIixcbiAgICAgKiAgICAgICAgICAgICB0ZXh0OiBcIkpvaG4gRG9lXCJcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgdHlwZTogXCJUZXh0QmxvY2tcIixcbiAgICAgKiAgICAgICAgICAgICB0ZXh0OiBcIkphbmUgRG9lICg5KVwiXG4gICAgICogICAgICAgICB9LFxuICAgICAqICAgICAgICAge1xuICAgICAqICAgICAgICAgICAgIHR5cGU6IFwiVGV4dEJsb2NrXCIsXG4gICAgICogICAgICAgICAgICAgdGV4dDogXCJBbGV4IERvZSAoMTIpXCJcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgXVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiaW5kIHRoZSB0ZW1wbGF0ZSB0by5cbiAgICAgKiBAcmV0dXJucyBBIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZXhwYW5kZWQgdGVtcGxhdGUuIFRoZSB0eXBlIG9mIHRoYXQgdmFsdWVcbiAgICAgKiAgIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgcGF5bG9hZCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGV4cGFuZChjb250ZXh0OiBJRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KGNvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsRXhwYW5kKHRoaXMuX3ByZXBhcmVkUGF5bG9hZCk7XG4gICAgfVxufSIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9hZGFwdGl2ZV9leHByZXNzaW9uc19fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL3NyYy9hZGFwdGl2ZWNhcmRzLXRlbXBsYXRpbmcudHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=